diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2015-05-07 14:30:14 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2015-05-07 14:30:14 +0000 |
commit | 44bfda12f86507f7f234de9c0587cc595d003d2d (patch) | |
tree | c8b31b5373f4432c4922f2ac8cb5a09dcfde3427 /main/linux-grsec | |
parent | 8cdc1d2e3584bff8dae843d263fea4d0927f848e (diff) | |
download | aports-44bfda12f86507f7f234de9c0587cc595d003d2d.tar.bz2 aports-44bfda12f86507f7f234de9c0587cc595d003d2d.tar.xz |
main/linuc-grsec: upgrade to 3.18.13
Diffstat (limited to 'main/linux-grsec')
-rw-r--r-- | main/linux-grsec/APKBUILD | 18 | ||||
-rw-r--r-- | main/linux-grsec/grsecurity-3.1-3.18.13-201505021013-alpine.patch | 149809 |
2 files changed, 149818 insertions, 9 deletions
diff --git a/main/linux-grsec/APKBUILD b/main/linux-grsec/APKBUILD index 5e17fe4d6e..3d3f2248fb 100644 --- a/main/linux-grsec/APKBUILD +++ b/main/linux-grsec/APKBUILD @@ -2,12 +2,12 @@ _mainflavor=grsec pkgname=linux-$_mainflavor -pkgver=3.18.12 +pkgver=3.18.13 case $pkgver in *.*.*) _kernver=${pkgver%.*};; *.*) _kernver=${pkgver};; esac -pkgrel=1 +pkgrel=0 pkgdesc="Linux kernel with grsecurity" url=http://grsecurity.net depends="mkinitfs linux-firmware" @@ -16,7 +16,7 @@ options="!strip" install= source="http://ftp.kernel.org/pub/linux/kernel/v3.x/linux-$_kernver.tar.xz http://ftp.kernel.org/pub/linux/kernel/v3.x/patch-$pkgver.xz - http://dev.alpinelinux.org/~tteras/grsec/grsecurity-3.1-3.18.11-201504190814-alpine.patch + http://dev.alpinelinux.org/~tteras/grsec/grsecurity-3.1-3.18.13-201505021013-alpine.patch fix-memory-map-for-PIE-applications.patch fix-spi-nor-namespace-clash.patch @@ -199,8 +199,8 @@ dev() { } md5sums="9e854df51ca3fef8bfe566dbd7b89241 linux-3.18.tar.xz -84d1fb9f072df226e920f6a0a3e7d10a patch-3.18.12.xz -276ada8c66fa29524cceebbb75bb532a grsecurity-3.1-3.18.11-201504190814-alpine.patch +1fab44780052ccc19f103468d7c23284 patch-3.18.13.xz +b8f2be8eae2da28c076f68d6dcf98186 grsecurity-3.1-3.18.13-201505021013-alpine.patch c6a4ae7e8ca6159e1631545515805216 fix-memory-map-for-PIE-applications.patch b0337a2a9abed17c37eae5db332522d2 fix-spi-nor-namespace-clash.patch 1a307fc1d63231bf01d22493a4f14378 imx6q-no-unclocked-sleep.patch @@ -210,8 +210,8 @@ b0337a2a9abed17c37eae5db332522d2 fix-spi-nor-namespace-clash.patch 18cb4521f9a8847637292f9f4c9e8256 config-virtgrsec.x86 2408367e7833084385bff42995dfcd3a config-virtgrsec.x86_64" sha256sums="becc413cc9e6d7f5cc52a3ce66d65c3725bc1d1cc1001f4ce6c32b69eb188cbd linux-3.18.tar.xz -53245c0a5b172575867afe88c91fc46468ae06ed7bf4fa6d2150072e27f7209e patch-3.18.12.xz -b224907d9e621ebd476d1f4af5f745d0251308a0482c5e96d441d04e4f7c57fc grsecurity-3.1-3.18.11-201504190814-alpine.patch +d9191eb7fa47e95c81945e561cdf35bb12fcdd2bbf12f37f60533cbf57be429c patch-3.18.13.xz +0cc009d6a2eb2a348268c28269f675160a23068d2306d6b9ff97495b2cf4ab4e grsecurity-3.1-3.18.13-201505021013-alpine.patch 500f3577310be52e87b9fecdc2e9c4ca43210fd97d69089f9005d484563f74c7 fix-memory-map-for-PIE-applications.patch 01279cfb93273d99670c56e2465957ecde3d03693beeb929a743f03afa0b7bdc fix-spi-nor-namespace-clash.patch 21179fbb22a5b74af0a609350ae1a170e232908572b201d02e791d2ce0a685d3 imx6q-no-unclocked-sleep.patch @@ -221,8 +221,8 @@ c796c15a32c848cfd6b67c2f22273fb3e26872f9325a6564f316b17b947eeaaf config-grsec.a 47048993111506ab74db24c92d39b536cf5e684975844907d5cb6198c1dfd87f config-virtgrsec.x86 0ebd5cf41a8c22fb8fe0c19d38833dc3e2b0b5e58b098e31315fcb766a18570e config-virtgrsec.x86_64" sha512sums="2f0b72466e9bc538a675738aa416573d41bbbd7e3e2ffd5b5b127afde609ebc278cec5a3c37e73479607e957c13f1b4ed9782a3795e0dcc2cf8e550228594009 linux-3.18.tar.xz -285322919b8638d821414bb494709008710ac55c0bc33d477b28013d51e9791a8487e9671cfdaaf0fa937fab119f40180c4577caac95263d1bb0c6e821069908 patch-3.18.12.xz -5b37c3b73a6c567128964c44bc474021df00d4ac575e53adf801a561726b0cc70f8e721363141d5f89df9e6b4e1e5e42a6521f5e969bcbd04a4567379b1cdef4 grsecurity-3.1-3.18.11-201504190814-alpine.patch +4d85a6a64b2d07b94b817fd4c3e0406910dd7d2028e58cfb13cf04d9ebb3bfe0f99148742489e2d5a72d93018c85adbf0e37bd068c01084d305574a9c49f9dff patch-3.18.13.xz +7ff5f078d8288f98ac501e80b3c05ec537f0a2a0b40f98ffaa226bb301c85eee11c81f744388951b7126396029207cc43666daa80827ef4d339d8ddb3b90e7b1 grsecurity-3.1-3.18.13-201505021013-alpine.patch 4665c56ae1bbac311f9205d64918e84ee8b01d47d6e2396ff6b8adfb10aada7f7254531ce62e31edbb65c2a54a830f09ad05d314dfcd75d6272f4068945ad7c7 fix-memory-map-for-PIE-applications.patch 4e3aeb70712f9838afea75fe9e6c1389414d833a89286ea55441d6a8d54ce74b0e39b565721e3153443af0a614bff57c767251b7e5b81faa5e0784eddfcd2164 fix-spi-nor-namespace-clash.patch 87d1ad59732f265a5b0db54490dc1762c14ea4b868e7eb1aedc3ce57b48046de7bbc08cf5cfcf6f1380fa84063b0edb16ba3d5e3c5670be9bbb229275c88b221 imx6q-no-unclocked-sleep.patch diff --git a/main/linux-grsec/grsecurity-3.1-3.18.13-201505021013-alpine.patch b/main/linux-grsec/grsecurity-3.1-3.18.13-201505021013-alpine.patch new file mode 100644 index 0000000000..269db283c4 --- /dev/null +++ b/main/linux-grsec/grsecurity-3.1-3.18.13-201505021013-alpine.patch @@ -0,0 +1,149809 @@ +diff --git a/Documentation/dontdiff b/Documentation/dontdiff +index 9de9813..1462492 100644 +--- a/Documentation/dontdiff ++++ b/Documentation/dontdiff +@@ -3,9 +3,11 @@ + *.bc + *.bin + *.bz2 ++*.c.[012]*.* + *.cis + *.cpio + *.csp ++*.dbg + *.dsp + *.dvi + *.elf +@@ -15,6 +17,7 @@ + *.gcov + *.gen.S + *.gif ++*.gmo + *.grep + *.grp + *.gz +@@ -51,14 +54,17 @@ + *.tab.h + *.tex + *.ver ++*.vim + *.xml + *.xz + *_MODULES ++*_reg_safe.h + *_vga16.c + *~ + \#*# + *.9 +-.* ++.[^g]* ++.gen* + .*.d + .mm + 53c700_d.h +@@ -72,9 +78,11 @@ Image + Module.markers + Module.symvers + PENDING ++PERF* + SCCS + System.map* + TAGS ++TRACEEVENT-CFLAGS + aconf + af_names.h + aic7*reg.h* +@@ -83,6 +91,7 @@ aic7*seq.h* + aicasm + aicdb.h* + altivec*.c ++ashldi3.S + asm-offsets.h + asm_offsets.h + autoconf.h* +@@ -95,32 +104,40 @@ bounds.h + bsetup + btfixupprep + build ++builtin-policy.h + bvmlinux + bzImage* + capability_names.h + capflags.c + classlist.h* ++clut_vga16.c ++common-cmds.h + comp*.log + compile.h* + conf + config + config-* + config_data.h* ++config.c + config.mak + config.mak.autogen ++config.tmp + conmakehash + consolemap_deftbl.c* + cpustr.h + crc32table.h* + cscope.* + defkeymap.c ++devicetable-offsets.h + devlist.h* + dnotify_test + docproc + dslm ++dtc-lexer.lex.c + elf2ecoff + elfconfig.h* + evergreen_reg_safe.h ++exception_policy.conf + fixdep + flask.h + fore200e_mkfirm +@@ -128,12 +145,15 @@ fore200e_pca_fw.c* + gconf + gconf.glade.h + gen-devlist ++gen-kdb_cmds.c + gen_crc32table + gen_init_cpio + generated + genheaders + genksyms + *_gray256.c ++hash ++hid-example + hpet_example + hugepage-mmap + hugepage-shm +@@ -148,14 +168,14 @@ int32.c + int4.c + int8.c + kallsyms +-kconfig ++kern_constants.h + keywords.c + ksym.c* + ksym.h* + kxgettext + lex.c + lex.*.c +-linux ++lib1funcs.S + logo_*.c + logo_*_clut224.c + logo_*_mono.c +@@ -165,14 +185,15 @@ mach-types.h + machtypes.h + map + map_hugetlb +-media + mconf ++mdp + miboot* + mk_elfconfig + mkboot + mkbugboot + mkcpustr + mkdep ++mkpiggy + mkprep + mkregtable + mktables +@@ -188,6 +209,8 @@ oui.c* + page-types + parse.c + parse.h ++parse-events* ++pasyms.h + patches* + pca200e.bin + pca200e_ecd.bin2 +@@ -197,6 +220,7 @@ perf-archive + piggyback + piggy.gzip + piggy.S ++pmu-* + pnmtologo + ppc_defs.h* + pss_boot.h +@@ -206,7 +230,12 @@ r200_reg_safe.h + r300_reg_safe.h + r420_reg_safe.h + r600_reg_safe.h ++randomize_layout_hash.h ++randomize_layout_seed.h ++realmode.lds ++realmode.relocs + recordmcount ++regdb.c + relocs + rlim_names.h + rn50_reg_safe.h +@@ -216,8 +245,12 @@ series + setup + setup.bin + setup.elf ++signing_key* ++size_overflow_hash.h + sImage ++slabinfo + sm_tbl* ++sortextable + split-include + syscalltab.h + tables.c +@@ -227,6 +260,7 @@ tftpboot.img + timeconst.h + times.h* + trix_boot.h ++user_constants.h + utsrelease.h* + vdso-syms.lds + vdso.lds +@@ -238,13 +272,17 @@ vdso32.lds + vdso32.so.dbg + vdso64.lds + vdso64.so.dbg ++vdsox32.lds ++vdsox32-syms.lds + version.h* + vmImage + vmlinux + vmlinux-* + vmlinux.aout + vmlinux.bin.all ++vmlinux.bin.bz2 + vmlinux.lds ++vmlinux.relocs + vmlinuz + voffset.h + vsyscall.lds +@@ -252,9 +290,12 @@ vsyscall_32.lds + wanxlfw.inc + uImage + unifdef ++utsrelease.h + wakeup.bin + wakeup.elf + wakeup.lds ++x509* + zImage* + zconf.hash.c ++zconf.lex.c + zoffset.h +diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt +index a311db8..415b28c 100644 +--- a/Documentation/kbuild/makefiles.txt ++++ b/Documentation/kbuild/makefiles.txt +@@ -23,10 +23,11 @@ This document describes the Linux kernel Makefiles. + === 4 Host Program support + --- 4.1 Simple Host Program + --- 4.2 Composite Host Programs +- --- 4.3 Using C++ for host programs +- --- 4.4 Controlling compiler options for host programs +- --- 4.5 When host programs are actually built +- --- 4.6 Using hostprogs-$(CONFIG_FOO) ++ --- 4.3 Defining shared libraries ++ --- 4.4 Using C++ for host programs ++ --- 4.5 Controlling compiler options for host programs ++ --- 4.6 When host programs are actually built ++ --- 4.7 Using hostprogs-$(CONFIG_FOO) + + === 5 Kbuild clean infrastructure + +@@ -642,7 +643,29 @@ Both possibilities are described in the following. + Finally, the two .o files are linked to the executable, lxdialog. + Note: The syntax <executable>-y is not permitted for host-programs. + +---- 4.3 Using C++ for host programs ++--- 4.3 Defining shared libraries ++ ++ Objects with extension .so are considered shared libraries, and ++ will be compiled as position independent objects. ++ Kbuild provides support for shared libraries, but the usage ++ shall be restricted. ++ In the following example the libkconfig.so shared library is used ++ to link the executable conf. ++ ++ Example: ++ #scripts/kconfig/Makefile ++ hostprogs-y := conf ++ conf-objs := conf.o libkconfig.so ++ libkconfig-objs := expr.o type.o ++ ++ Shared libraries always require a corresponding -objs line, and ++ in the example above the shared library libkconfig is composed by ++ the two objects expr.o and type.o. ++ expr.o and type.o will be built as position independent code and ++ linked as a shared library libkconfig.so. C++ is not supported for ++ shared libraries. ++ ++--- 4.4 Using C++ for host programs + + kbuild offers support for host programs written in C++. This was + introduced solely to support kconfig, and is not recommended +@@ -665,7 +688,7 @@ Both possibilities are described in the following. + qconf-cxxobjs := qconf.o + qconf-objs := check.o + +---- 4.4 Controlling compiler options for host programs ++--- 4.5 Controlling compiler options for host programs + + When compiling host programs, it is possible to set specific flags. + The programs will always be compiled utilising $(HOSTCC) passed +@@ -693,7 +716,7 @@ Both possibilities are described in the following. + When linking qconf, it will be passed the extra option + "-L$(QTDIR)/lib". + +---- 4.5 When host programs are actually built ++--- 4.6 When host programs are actually built + + Kbuild will only build host-programs when they are referenced + as a prerequisite. +@@ -724,7 +747,7 @@ Both possibilities are described in the following. + This will tell kbuild to build lxdialog even if not referenced in + any rule. + +---- 4.6 Using hostprogs-$(CONFIG_FOO) ++--- 4.7 Using hostprogs-$(CONFIG_FOO) + + A typical pattern in a Kbuild file looks like this: + +diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt +index f4c71d4..69aa301 100644 +--- a/Documentation/kernel-parameters.txt ++++ b/Documentation/kernel-parameters.txt +@@ -1182,6 +1182,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted. + Format: <unsigned int> such that (rxsize & ~0x1fffc0) == 0. + Default: 1024 + ++ grsec_proc_gid= [GRKERNSEC_PROC_USERGROUP] Chooses GID to ++ ignore grsecurity's /proc restrictions ++ ++ grsec_sysfs_restrict= Format: 0 | 1 ++ Default: 1 ++ Disables GRKERNSEC_SYSFS_RESTRICT if enabled in config ++ + hashdist= [KNL,NUMA] Large hashes allocated during boot + are distributed across NUMA nodes. Defaults on + for 64-bit NUMA, off otherwise. +@@ -2260,6 +2267,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted. + noexec=on: enable non-executable mappings (default) + noexec=off: disable non-executable mappings + ++ nopcid [X86-64] ++ Disable PCID (Process-Context IDentifier) even if it ++ is supported by the processor. ++ + nosmap [X86] + Disable SMAP (Supervisor Mode Access Prevention) + even if it is supported by processor. +@@ -2552,6 +2563,30 @@ bytes respectively. Such letter suffixes can also be entirely omitted. + the specified number of seconds. This is to be used if + your oopses keep scrolling off the screen. + ++ pax_nouderef [X86] disables UDEREF. Most likely needed under certain ++ virtualization environments that don't cope well with the ++ expand down segment used by UDEREF on X86-32 or the frequent ++ page table updates on X86-64. ++ ++ pax_sanitize_slab= ++ Format: { 0 | 1 | off | fast | full } ++ Options '0' and '1' are only provided for backward ++ compatibility, 'off' or 'fast' should be used instead. ++ 0|off : disable slab object sanitization ++ 1|fast: enable slab object sanitization excluding ++ whitelisted slabs (default) ++ full : sanitize all slabs, even the whitelisted ones ++ ++ pax_softmode= 0/1 to disable/enable PaX softmode on boot already. ++ ++ pax_extra_latent_entropy ++ Enable a very simple form of latent entropy extraction ++ from the first 4GB of memory as the bootmem allocator ++ passes the memory pages to the buddy allocator. ++ ++ pax_weakuderef [X86-64] enables the weaker but faster form of UDEREF ++ when the processor supports PCID. ++ + pcbit= [HW,ISDN] + + pcd. [PARIDE] +diff --git a/Makefile b/Makefile +index 9cd08d5..89cedce 100644 +--- a/Makefile ++++ b/Makefile +@@ -298,7 +298,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ + HOSTCC = gcc + HOSTCXX = g++ + HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89 +-HOSTCXXFLAGS = -O2 ++HOSTCFLAGS = -Wall -W -Wmissing-prototypes -Wstrict-prototypes -Wno-unused-parameter -Wno-missing-field-initializers -O2 -fomit-frame-pointer -std=gnu89 -fno-delete-null-pointer-checks ++HOSTCFLAGS += $(call cc-option, -Wno-empty-body) ++HOSTCXXFLAGS = -O2 -Wall -W -Wno-array-bounds + + ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1) + HOSTCFLAGS += -Wno-unused-value -Wno-unused-parameter \ +@@ -445,8 +447,8 @@ export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \ + # Rules shared between *config targets and build targets + + # Basic helpers built in scripts/ +-PHONY += scripts_basic +-scripts_basic: ++PHONY += scripts_basic gcc-plugins ++scripts_basic: gcc-plugins + $(Q)$(MAKE) $(build)=scripts/basic + $(Q)rm -f .tmp_quiet_recordmcount + +@@ -620,6 +622,72 @@ endif + # Tell gcc to never replace conditional load with a non-conditional one + KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0) + ++ifndef DISABLE_PAX_PLUGINS ++ifeq ($(call cc-ifversion, -ge, 0408, y), y) ++PLUGINCC := $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-plugin.sh "$(HOSTCXX)" "$(HOSTCXX)" "$(CC)") ++else ++PLUGINCC := $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-plugin.sh "$(HOSTCC)" "$(HOSTCXX)" "$(CC)") ++endif ++ifneq ($(PLUGINCC),) ++ifdef CONFIG_PAX_CONSTIFY_PLUGIN ++CONSTIFY_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/constify_plugin.so -DCONSTIFY_PLUGIN ++endif ++ifdef CONFIG_PAX_MEMORY_STACKLEAK ++STACKLEAK_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/stackleak_plugin.so -DSTACKLEAK_PLUGIN ++STACKLEAK_PLUGIN_CFLAGS += -fplugin-arg-stackleak_plugin-track-lowest-sp=100 ++endif ++ifdef CONFIG_KALLOCSTAT_PLUGIN ++KALLOCSTAT_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/kallocstat_plugin.so ++endif ++ifdef CONFIG_PAX_KERNEXEC_PLUGIN ++KERNEXEC_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/kernexec_plugin.so ++KERNEXEC_PLUGIN_CFLAGS += -fplugin-arg-kernexec_plugin-method=$(CONFIG_PAX_KERNEXEC_PLUGIN_METHOD) -DKERNEXEC_PLUGIN ++KERNEXEC_PLUGIN_AFLAGS := -DKERNEXEC_PLUGIN ++endif ++ifdef CONFIG_GRKERNSEC_RANDSTRUCT ++RANDSTRUCT_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/randomize_layout_plugin.so -DRANDSTRUCT_PLUGIN ++ifdef CONFIG_GRKERNSEC_RANDSTRUCT_PERFORMANCE ++RANDSTRUCT_PLUGIN_CFLAGS += -fplugin-arg-randomize_layout_plugin-performance-mode ++endif ++endif ++ifdef CONFIG_CHECKER_PLUGIN ++ifeq ($(call cc-ifversion, -ge, 0406, y), y) ++CHECKER_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/checker_plugin.so -DCHECKER_PLUGIN ++endif ++endif ++COLORIZE_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/colorize_plugin.so ++ifdef CONFIG_PAX_SIZE_OVERFLOW ++SIZE_OVERFLOW_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/size_overflow_plugin/size_overflow_plugin.so -DSIZE_OVERFLOW_PLUGIN ++endif ++ifdef CONFIG_PAX_LATENT_ENTROPY ++LATENT_ENTROPY_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/latent_entropy_plugin.so -DLATENT_ENTROPY_PLUGIN ++endif ++ifdef CONFIG_PAX_MEMORY_STRUCTLEAK ++STRUCTLEAK_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/structleak_plugin.so -DSTRUCTLEAK_PLUGIN ++endif ++GCC_PLUGINS_CFLAGS := $(CONSTIFY_PLUGIN_CFLAGS) $(STACKLEAK_PLUGIN_CFLAGS) $(KALLOCSTAT_PLUGIN_CFLAGS) ++GCC_PLUGINS_CFLAGS += $(KERNEXEC_PLUGIN_CFLAGS) $(CHECKER_PLUGIN_CFLAGS) $(COLORIZE_PLUGIN_CFLAGS) ++GCC_PLUGINS_CFLAGS += $(SIZE_OVERFLOW_PLUGIN_CFLAGS) $(LATENT_ENTROPY_PLUGIN_CFLAGS) $(STRUCTLEAK_PLUGIN_CFLAGS) ++GCC_PLUGINS_CFLAGS += $(RANDSTRUCT_PLUGIN_CFLAGS) ++GCC_PLUGINS_AFLAGS := $(KERNEXEC_PLUGIN_AFLAGS) ++export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGINS_AFLAGS CONSTIFY_PLUGIN LATENT_ENTROPY_PLUGIN_CFLAGS ++ifeq ($(KBUILD_EXTMOD),) ++gcc-plugins: ++ $(Q)$(MAKE) $(build)=tools/gcc ++else ++gcc-plugins: ; ++endif ++else ++gcc-plugins: ++ifeq ($(call cc-ifversion, -ge, 0405, y), y) ++ $(error Your gcc installation does not support plugins. If the necessary headers for plugin support are missing, they should be installed. On Debian, apt-get install gcc-<ver>-plugin-dev. If you choose to ignore this error and lessen the improvements provided by this patch, re-run make with the DISABLE_PAX_PLUGINS=y argument.)) ++else ++ $(Q)echo "warning, your gcc version does not support plugins, you should upgrade it to gcc 4.5 at least" ++endif ++ $(Q)echo "PAX_MEMORY_STACKLEAK, constification, PAX_LATENT_ENTROPY and other features will be less secure. PAX_SIZE_OVERFLOW will not be active." ++endif ++endif ++ + ifdef CONFIG_READABLE_ASM + # Disable optimizations that make assembler listings hard to read. + # reorder blocks reorders the control in the function +@@ -712,7 +780,7 @@ KBUILD_CFLAGS += $(call cc-option, -gsplit-dwarf, -g) + else + KBUILD_CFLAGS += -g + endif +-KBUILD_AFLAGS += -Wa,-gdwarf-2 ++KBUILD_AFLAGS += -Wa,--gdwarf-2 + endif + ifdef CONFIG_DEBUG_INFO_DWARF4 + KBUILD_CFLAGS += $(call cc-option, -gdwarf-4,) +@@ -877,7 +945,7 @@ export mod_sign_cmd + + + ifeq ($(KBUILD_EXTMOD),) +-core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ ++core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ grsecurity/ + + vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ + $(core-y) $(core-m) $(drivers-y) $(drivers-m) \ +@@ -924,6 +992,8 @@ endif + + # The actual objects are generated when descending, + # make sure no implicit rule kicks in ++$(filter-out $(init-y),$(vmlinux-deps)): KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) ++$(filter-out $(init-y),$(vmlinux-deps)): KBUILD_AFLAGS += $(GCC_PLUGINS_AFLAGS) + $(sort $(vmlinux-deps)): $(vmlinux-dirs) ; + + # Handle descending into subdirectories listed in $(vmlinux-dirs) +@@ -933,7 +1003,7 @@ $(sort $(vmlinux-deps)): $(vmlinux-dirs) ; + # Error messages still appears in the original language + + PHONY += $(vmlinux-dirs) +-$(vmlinux-dirs): prepare scripts ++$(vmlinux-dirs): gcc-plugins prepare scripts + $(Q)$(MAKE) $(build)=$@ + + define filechk_kernel.release +@@ -976,10 +1046,13 @@ prepare1: prepare2 $(version_h) include/generated/utsrelease.h \ + + archprepare: archheaders archscripts prepare1 scripts_basic + ++prepare0: KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) ++prepare0: KBUILD_AFLAGS += $(GCC_PLUGINS_AFLAGS) + prepare0: archprepare FORCE + $(Q)$(MAKE) $(build)=. + + # All the preparing.. ++prepare: KBUILD_CFLAGS := $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS)) + prepare: prepare0 + + # Generate some files +@@ -1094,6 +1167,8 @@ all: modules + # using awk while concatenating to the final file. + + PHONY += modules ++modules: KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) ++modules: KBUILD_AFLAGS += $(GCC_PLUGINS_AFLAGS) + modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin + $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order + @$(kecho) ' Building modules, stage 2.'; +@@ -1109,7 +1184,7 @@ modules.builtin: $(vmlinux-dirs:%=%/modules.builtin) + + # Target to prepare building external modules + PHONY += modules_prepare +-modules_prepare: prepare scripts ++modules_prepare: gcc-plugins prepare scripts + + # Target to install modules + PHONY += modules_install +@@ -1175,7 +1250,10 @@ MRPROPER_FILES += .config .config.old .version .old_version $(version_h) \ + Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \ + signing_key.priv signing_key.x509 x509.genkey \ + extra_certificates signing_key.x509.keyid \ +- signing_key.x509.signer include/linux/version.h ++ signing_key.x509.signer include/linux/version.h \ ++ tools/gcc/size_overflow_plugin/size_overflow_hash_aux.h \ ++ tools/gcc/size_overflow_plugin/size_overflow_hash.h \ ++ tools/gcc/randomize_layout_seed.h + + # clean - Delete most, but leave enough to build external modules + # +@@ -1214,7 +1292,7 @@ distclean: mrproper + @find $(srctree) $(RCS_FIND_IGNORE) \ + \( -name '*.orig' -o -name '*.rej' -o -name '*~' \ + -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \ +- -o -name '.*.rej' -o -name '*%' -o -name 'core' \) \ ++ -o -name '.*.rej' -o -name '*.so' -o -name '*%' -o -name 'core' \) \ + -type f -print | xargs rm -f + + +@@ -1380,6 +1458,8 @@ PHONY += $(module-dirs) modules + $(module-dirs): crmodverdir $(objtree)/Module.symvers + $(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@) + ++modules: KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) ++modules: KBUILD_AFLAGS += $(GCC_PLUGINS_AFLAGS) + modules: $(module-dirs) + @$(kecho) ' Building modules, stage 2.'; + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost +@@ -1520,17 +1600,21 @@ else + target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@)) + endif + +-%.s: %.c prepare scripts FORCE ++%.s: KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) ++%.s: KBUILD_AFLAGS += $(GCC_PLUGINS_AFLAGS) ++%.s: %.c gcc-plugins prepare scripts FORCE + $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) + %.i: %.c prepare scripts FORCE + $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) +-%.o: %.c prepare scripts FORCE ++%.o: KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) ++%.o: KBUILD_AFLAGS += $(GCC_PLUGINS_AFLAGS) ++%.o: %.c gcc-plugins prepare scripts FORCE + $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) + %.lst: %.c prepare scripts FORCE + $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) +-%.s: %.S prepare scripts FORCE ++%.s: %.S gcc-plugins prepare scripts FORCE + $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) +-%.o: %.S prepare scripts FORCE ++%.o: %.S gcc-plugins prepare scripts FORCE + $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) + %.symtypes: %.c prepare scripts FORCE + $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) +@@ -1542,11 +1626,15 @@ endif + $(build)=$(build-dir) + # Make sure the latest headers are built for Documentation + Documentation/: headers_install +-%/: prepare scripts FORCE ++%/: KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) ++%/: KBUILD_AFLAGS += $(GCC_PLUGINS_AFLAGS) ++%/: gcc-plugins prepare scripts FORCE + $(cmd_crmodverdir) + $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ + $(build)=$(build-dir) +-%.ko: prepare scripts FORCE ++%.ko: KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) ++%.ko: KBUILD_AFLAGS += $(GCC_PLUGINS_AFLAGS) ++%.ko: gcc-plugins prepare scripts FORCE + $(cmd_crmodverdir) + $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ + $(build)=$(build-dir) $(@:.ko=.o) +diff --git a/arch/alpha/include/asm/atomic.h b/arch/alpha/include/asm/atomic.h +index 8f8eafb..3405f46 100644 +--- a/arch/alpha/include/asm/atomic.h ++++ b/arch/alpha/include/asm/atomic.h +@@ -239,4 +239,14 @@ static inline long atomic64_dec_if_positive(atomic64_t *v) + #define atomic_dec(v) atomic_sub(1,(v)) + #define atomic64_dec(v) atomic64_sub(1,(v)) + ++#define atomic64_read_unchecked(v) atomic64_read(v) ++#define atomic64_set_unchecked(v, i) atomic64_set((v), (i)) ++#define atomic64_add_unchecked(a, v) atomic64_add((a), (v)) ++#define atomic64_add_return_unchecked(a, v) atomic64_add_return((a), (v)) ++#define atomic64_sub_unchecked(a, v) atomic64_sub((a), (v)) ++#define atomic64_inc_unchecked(v) atomic64_inc(v) ++#define atomic64_inc_return_unchecked(v) atomic64_inc_return(v) ++#define atomic64_dec_unchecked(v) atomic64_dec(v) ++#define atomic64_cmpxchg_unchecked(v, o, n) atomic64_cmpxchg((v), (o), (n)) ++ + #endif /* _ALPHA_ATOMIC_H */ +diff --git a/arch/alpha/include/asm/cache.h b/arch/alpha/include/asm/cache.h +index ad368a9..fbe0f25 100644 +--- a/arch/alpha/include/asm/cache.h ++++ b/arch/alpha/include/asm/cache.h +@@ -4,19 +4,19 @@ + #ifndef __ARCH_ALPHA_CACHE_H + #define __ARCH_ALPHA_CACHE_H + ++#include <linux/const.h> + + /* Bytes per L1 (data) cache line. */ + #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_EV6) +-# define L1_CACHE_BYTES 64 + # define L1_CACHE_SHIFT 6 + #else + /* Both EV4 and EV5 are write-through, read-allocate, + direct-mapped, physical. + */ +-# define L1_CACHE_BYTES 32 + # define L1_CACHE_SHIFT 5 + #endif + ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + #define SMP_CACHE_BYTES L1_CACHE_BYTES + + #endif +diff --git a/arch/alpha/include/asm/elf.h b/arch/alpha/include/asm/elf.h +index 968d999..d36b2df 100644 +--- a/arch/alpha/include/asm/elf.h ++++ b/arch/alpha/include/asm/elf.h +@@ -91,6 +91,13 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; + + #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) + ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE (current->personality & ADDR_LIMIT_32BIT ? 0x10000 : 0x120000000UL) ++ ++#define PAX_DELTA_MMAP_LEN (current->personality & ADDR_LIMIT_32BIT ? 14 : 28) ++#define PAX_DELTA_STACK_LEN (current->personality & ADDR_LIMIT_32BIT ? 14 : 19) ++#endif ++ + /* $0 is set by ld.so to a pointer to a function which might be + registered using atexit. This provides a mean for the dynamic + linker to call DT_FINI functions for shared libraries that have +diff --git a/arch/alpha/include/asm/pgalloc.h b/arch/alpha/include/asm/pgalloc.h +index aab14a0..b4fa3e7 100644 +--- a/arch/alpha/include/asm/pgalloc.h ++++ b/arch/alpha/include/asm/pgalloc.h +@@ -29,6 +29,12 @@ pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd) + pgd_set(pgd, pmd); + } + ++static inline void ++pgd_populate_kernel(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd) ++{ ++ pgd_populate(mm, pgd, pmd); ++} ++ + extern pgd_t *pgd_alloc(struct mm_struct *mm); + + static inline void +diff --git a/arch/alpha/include/asm/pgtable.h b/arch/alpha/include/asm/pgtable.h +index d8f9b7e..f6222fa 100644 +--- a/arch/alpha/include/asm/pgtable.h ++++ b/arch/alpha/include/asm/pgtable.h +@@ -102,6 +102,17 @@ struct vm_area_struct; + #define PAGE_SHARED __pgprot(_PAGE_VALID | __ACCESS_BITS) + #define PAGE_COPY __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOW) + #define PAGE_READONLY __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOW) ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++# define PAGE_SHARED_NOEXEC __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOE) ++# define PAGE_COPY_NOEXEC __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOW | _PAGE_FOE) ++# define PAGE_READONLY_NOEXEC __pgprot(_PAGE_VALID | __ACCESS_BITS | _PAGE_FOW | _PAGE_FOE) ++#else ++# define PAGE_SHARED_NOEXEC PAGE_SHARED ++# define PAGE_COPY_NOEXEC PAGE_COPY ++# define PAGE_READONLY_NOEXEC PAGE_READONLY ++#endif ++ + #define PAGE_KERNEL __pgprot(_PAGE_VALID | _PAGE_ASM | _PAGE_KRE | _PAGE_KWE) + + #define _PAGE_NORMAL(x) __pgprot(_PAGE_VALID | __ACCESS_BITS | (x)) +diff --git a/arch/alpha/kernel/module.c b/arch/alpha/kernel/module.c +index 2fd00b7..cfd5069 100644 +--- a/arch/alpha/kernel/module.c ++++ b/arch/alpha/kernel/module.c +@@ -160,7 +160,7 @@ apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab, + + /* The small sections were sorted to the end of the segment. + The following should definitely cover them. */ +- gp = (u64)me->module_core + me->core_size - 0x8000; ++ gp = (u64)me->module_core_rw + me->core_size_rw - 0x8000; + got = sechdrs[me->arch.gotsecindex].sh_addr; + + for (i = 0; i < n; i++) { +diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c +index f9c732e..78fbb0f 100644 +--- a/arch/alpha/kernel/osf_sys.c ++++ b/arch/alpha/kernel/osf_sys.c +@@ -1295,10 +1295,11 @@ SYSCALL_DEFINE1(old_adjtimex, struct timex32 __user *, txc_p) + generic version except that we know how to honor ADDR_LIMIT_32BIT. */ + + static unsigned long +-arch_get_unmapped_area_1(unsigned long addr, unsigned long len, +- unsigned long limit) ++arch_get_unmapped_area_1(struct file *filp, unsigned long addr, unsigned long len, ++ unsigned long limit, unsigned long flags) + { + struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(current->mm, filp, flags); + + info.flags = 0; + info.length = len; +@@ -1306,6 +1307,7 @@ arch_get_unmapped_area_1(unsigned long addr, unsigned long len, + info.high_limit = limit; + info.align_mask = 0; + info.align_offset = 0; ++ info.threadstack_offset = offset; + return vm_unmapped_area(&info); + } + +@@ -1338,20 +1340,24 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + merely specific addresses, but regions of memory -- perhaps + this feature should be incorporated into all ports? */ + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(current->mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { +- addr = arch_get_unmapped_area_1 (PAGE_ALIGN(addr), len, limit); ++ addr = arch_get_unmapped_area_1 (filp, PAGE_ALIGN(addr), len, limit, flags); + if (addr != (unsigned long) -ENOMEM) + return addr; + } + + /* Next, try allocating at TASK_UNMAPPED_BASE. */ +- addr = arch_get_unmapped_area_1 (PAGE_ALIGN(TASK_UNMAPPED_BASE), +- len, limit); ++ addr = arch_get_unmapped_area_1 (filp, PAGE_ALIGN(current->mm->mmap_base), len, limit, flags); ++ + if (addr != (unsigned long) -ENOMEM) + return addr; + + /* Finally, try allocating in low memory. */ +- addr = arch_get_unmapped_area_1 (PAGE_SIZE, len, limit); ++ addr = arch_get_unmapped_area_1 (filp, PAGE_SIZE, len, limit, flags); + + return addr; + } +diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c +index 9d0ac09..479a962 100644 +--- a/arch/alpha/mm/fault.c ++++ b/arch/alpha/mm/fault.c +@@ -53,6 +53,124 @@ __load_new_mm_context(struct mm_struct *next_mm) + __reload_thread(pcb); + } + ++#ifdef CONFIG_PAX_PAGEEXEC ++/* ++ * PaX: decide what to do with offenders (regs->pc = fault address) ++ * ++ * returns 1 when task should be killed ++ * 2 when patched PLT trampoline was detected ++ * 3 when unpatched PLT trampoline was detected ++ */ ++static int pax_handle_fetch_fault(struct pt_regs *regs) ++{ ++ ++#ifdef CONFIG_PAX_EMUPLT ++ int err; ++ ++ do { /* PaX: patched PLT emulation #1 */ ++ unsigned int ldah, ldq, jmp; ++ ++ err = get_user(ldah, (unsigned int *)regs->pc); ++ err |= get_user(ldq, (unsigned int *)(regs->pc+4)); ++ err |= get_user(jmp, (unsigned int *)(regs->pc+8)); ++ ++ if (err) ++ break; ++ ++ if ((ldah & 0xFFFF0000U) == 0x277B0000U && ++ (ldq & 0xFFFF0000U) == 0xA77B0000U && ++ jmp == 0x6BFB0000U) ++ { ++ unsigned long r27, addr; ++ unsigned long addrh = (ldah | 0xFFFFFFFFFFFF0000UL) << 16; ++ unsigned long addrl = ldq | 0xFFFFFFFFFFFF0000UL; ++ ++ addr = regs->r27 + ((addrh ^ 0x80000000UL) + 0x80000000UL) + ((addrl ^ 0x8000UL) + 0x8000UL); ++ err = get_user(r27, (unsigned long *)addr); ++ if (err) ++ break; ++ ++ regs->r27 = r27; ++ regs->pc = r27; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: patched PLT emulation #2 */ ++ unsigned int ldah, lda, br; ++ ++ err = get_user(ldah, (unsigned int *)regs->pc); ++ err |= get_user(lda, (unsigned int *)(regs->pc+4)); ++ err |= get_user(br, (unsigned int *)(regs->pc+8)); ++ ++ if (err) ++ break; ++ ++ if ((ldah & 0xFFFF0000U) == 0x277B0000U && ++ (lda & 0xFFFF0000U) == 0xA77B0000U && ++ (br & 0xFFE00000U) == 0xC3E00000U) ++ { ++ unsigned long addr = br | 0xFFFFFFFFFFE00000UL; ++ unsigned long addrh = (ldah | 0xFFFFFFFFFFFF0000UL) << 16; ++ unsigned long addrl = lda | 0xFFFFFFFFFFFF0000UL; ++ ++ regs->r27 += ((addrh ^ 0x80000000UL) + 0x80000000UL) + ((addrl ^ 0x8000UL) + 0x8000UL); ++ regs->pc += 12 + (((addr ^ 0x00100000UL) + 0x00100000UL) << 2); ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: unpatched PLT emulation */ ++ unsigned int br; ++ ++ err = get_user(br, (unsigned int *)regs->pc); ++ ++ if (!err && (br & 0xFFE00000U) == 0xC3800000U) { ++ unsigned int br2, ldq, nop, jmp; ++ unsigned long addr = br | 0xFFFFFFFFFFE00000UL, resolver; ++ ++ addr = regs->pc + 4 + (((addr ^ 0x00100000UL) + 0x00100000UL) << 2); ++ err = get_user(br2, (unsigned int *)addr); ++ err |= get_user(ldq, (unsigned int *)(addr+4)); ++ err |= get_user(nop, (unsigned int *)(addr+8)); ++ err |= get_user(jmp, (unsigned int *)(addr+12)); ++ err |= get_user(resolver, (unsigned long *)(addr+16)); ++ ++ if (err) ++ break; ++ ++ if (br2 == 0xC3600000U && ++ ldq == 0xA77B000CU && ++ nop == 0x47FF041FU && ++ jmp == 0x6B7B0000U) ++ { ++ regs->r28 = regs->pc+4; ++ regs->r27 = addr+16; ++ regs->pc = resolver; ++ return 3; ++ } ++ } ++ } while (0); ++#endif ++ ++ return 1; ++} ++ ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ unsigned long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 5; i++) { ++ unsigned int c; ++ if (get_user(c, (unsigned int *)pc+i)) ++ printk(KERN_CONT "???????? "); ++ else ++ printk(KERN_CONT "%08x ", c); ++ } ++ printk("\n"); ++} ++#endif + + /* + * This routine handles page faults. It determines the address, +@@ -133,8 +251,29 @@ retry: + good_area: + si_code = SEGV_ACCERR; + if (cause < 0) { +- if (!(vma->vm_flags & VM_EXEC)) ++ if (!(vma->vm_flags & VM_EXEC)) { ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!(mm->pax_flags & MF_PAX_PAGEEXEC) || address != regs->pc) ++ goto bad_area; ++ ++ up_read(&mm->mmap_sem); ++ switch (pax_handle_fetch_fault(regs)) { ++ ++#ifdef CONFIG_PAX_EMUPLT ++ case 2: ++ case 3: ++ return; ++#endif ++ ++ } ++ pax_report_fault(regs, (void *)regs->pc, (void *)rdusp()); ++ do_group_exit(SIGKILL); ++#else + goto bad_area; ++#endif ++ ++ } + } else if (!cause) { + /* Allow reads even for write-only mappings */ + if (!(vma->vm_flags & (VM_READ | VM_WRITE))) +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 89c4b5c..847a7be 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -1740,7 +1740,7 @@ config ALIGNMENT_TRAP + + config UACCESS_WITH_MEMCPY + bool "Use kernel mem{cpy,set}() for {copy_to,clear}_user()" +- depends on MMU ++ depends on MMU && !PAX_MEMORY_UDEREF + default y if CPU_FEROCEON + help + Implement faster copy_to_user and clear_user methods for CPU +@@ -2004,6 +2004,7 @@ config XIP_PHYS_ADDR + config KEXEC + bool "Kexec system call (EXPERIMENTAL)" + depends on (!SMP || PM_SLEEP_SMP) ++ depends on !GRKERNSEC_KMEM + help + kexec is a system call that implements the ability to shutdown your + current kernel, and to start another kernel. It is like a reboot +diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h +index e22c119..abe7041 100644 +--- a/arch/arm/include/asm/atomic.h ++++ b/arch/arm/include/asm/atomic.h +@@ -18,17 +18,41 @@ + #include <asm/barrier.h> + #include <asm/cmpxchg.h> + ++#ifdef CONFIG_GENERIC_ATOMIC64 ++#include <asm-generic/atomic64.h> ++#endif ++ + #define ATOMIC_INIT(i) { (i) } + + #ifdef __KERNEL__ + ++#ifdef CONFIG_THUMB2_KERNEL ++#define REFCOUNT_TRAP_INSN "bkpt 0xf1" ++#else ++#define REFCOUNT_TRAP_INSN "bkpt 0xf103" ++#endif ++ ++#define _ASM_EXTABLE(from, to) \ ++" .pushsection __ex_table,\"a\"\n"\ ++" .align 3\n" \ ++" .long " #from ", " #to"\n" \ ++" .popsection" ++ + /* + * On ARM, ordinary assignment (str instruction) doesn't clear the local + * strex/ldrex monitor on some implementations. The reason we can use it for + * atomic_set() is the clrex or dummy strex done on every exception return. + */ + #define atomic_read(v) ACCESS_ONCE((v)->counter) ++static inline int atomic_read_unchecked(const atomic_unchecked_t *v) ++{ ++ return ACCESS_ONCE(v->counter); ++} + #define atomic_set(v,i) (((v)->counter) = (i)) ++static inline void atomic_set_unchecked(atomic_unchecked_t *v, int i) ++{ ++ v->counter = i; ++} + + #if __LINUX_ARM_ARCH__ >= 6 + +@@ -38,26 +62,50 @@ + * to ensure that the update happens. + */ + +-#define ATOMIC_OP(op, c_op, asm_op) \ +-static inline void atomic_##op(int i, atomic_t *v) \ ++#ifdef CONFIG_PAX_REFCOUNT ++#define __OVERFLOW_POST \ ++ " bvc 3f\n" \ ++ "2: " REFCOUNT_TRAP_INSN "\n"\ ++ "3:\n" ++#define __OVERFLOW_POST_RETURN \ ++ " bvc 3f\n" \ ++" mov %0, %1\n" \ ++ "2: " REFCOUNT_TRAP_INSN "\n"\ ++ "3:\n" ++#define __OVERFLOW_EXTABLE \ ++ "4:\n" \ ++ _ASM_EXTABLE(2b, 4b) ++#else ++#define __OVERFLOW_POST ++#define __OVERFLOW_POST_RETURN ++#define __OVERFLOW_EXTABLE ++#endif ++ ++#define __ATOMIC_OP(op, suffix, c_op, asm_op, post_op, extable) \ ++static inline void atomic_##op##suffix(int i, atomic##suffix##_t *v) \ + { \ + unsigned long tmp; \ + int result; \ + \ + prefetchw(&v->counter); \ +- __asm__ __volatile__("@ atomic_" #op "\n" \ ++ __asm__ __volatile__("@ atomic_" #op #suffix "\n" \ + "1: ldrex %0, [%3]\n" \ + " " #asm_op " %0, %0, %4\n" \ ++ post_op \ + " strex %1, %0, [%3]\n" \ + " teq %1, #0\n" \ +-" bne 1b" \ ++" bne 1b\n" \ ++ extable \ + : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) \ + : "r" (&v->counter), "Ir" (i) \ + : "cc"); \ + } \ + +-#define ATOMIC_OP_RETURN(op, c_op, asm_op) \ +-static inline int atomic_##op##_return(int i, atomic_t *v) \ ++#define ATOMIC_OP(op, c_op, asm_op) __ATOMIC_OP(op, _unchecked, c_op, asm_op, , )\ ++ __ATOMIC_OP(op, , c_op, asm_op##s, __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++ ++#define __ATOMIC_OP_RETURN(op, suffix, c_op, asm_op, post_op, extable) \ ++static inline int atomic_##op##_return##suffix(int i, atomic##suffix##_t *v)\ + { \ + unsigned long tmp; \ + int result; \ +@@ -65,12 +113,14 @@ static inline int atomic_##op##_return(int i, atomic_t *v) \ + smp_mb(); \ + prefetchw(&v->counter); \ + \ +- __asm__ __volatile__("@ atomic_" #op "_return\n" \ ++ __asm__ __volatile__("@ atomic_" #op "_return" #suffix "\n" \ + "1: ldrex %0, [%3]\n" \ + " " #asm_op " %0, %0, %4\n" \ ++ post_op \ + " strex %1, %0, [%3]\n" \ + " teq %1, #0\n" \ +-" bne 1b" \ ++" bne 1b\n" \ ++ extable \ + : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) \ + : "r" (&v->counter), "Ir" (i) \ + : "cc"); \ +@@ -80,6 +130,9 @@ static inline int atomic_##op##_return(int i, atomic_t *v) \ + return result; \ + } + ++#define ATOMIC_OP_RETURN(op, c_op, asm_op) __ATOMIC_OP_RETURN(op, _unchecked, c_op, asm_op, , )\ ++ __ATOMIC_OP_RETURN(op, , c_op, asm_op##s, __OVERFLOW_POST_RETURN, __OVERFLOW_EXTABLE) ++ + static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) + { + int oldval; +@@ -115,12 +168,24 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u) + __asm__ __volatile__ ("@ atomic_add_unless\n" + "1: ldrex %0, [%4]\n" + " teq %0, %5\n" +-" beq 2f\n" +-" add %1, %0, %6\n" ++" beq 4f\n" ++" adds %1, %0, %6\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" bvc 3f\n" ++"2: " REFCOUNT_TRAP_INSN "\n" ++"3:\n" ++#endif ++ + " strex %2, %1, [%4]\n" + " teq %2, #0\n" + " bne 1b\n" +-"2:" ++"4:" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ _ASM_EXTABLE(2b, 4b) ++#endif ++ + : "=&r" (oldval), "=&r" (newval), "=&r" (tmp), "+Qo" (v->counter) + : "r" (&v->counter), "r" (u), "r" (a) + : "cc"); +@@ -131,14 +196,36 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u) + return oldval; + } + ++static inline int atomic_cmpxchg_unchecked(atomic_unchecked_t *ptr, int old, int new) ++{ ++ unsigned long oldval, res; ++ ++ smp_mb(); ++ ++ do { ++ __asm__ __volatile__("@ atomic_cmpxchg_unchecked\n" ++ "ldrex %1, [%3]\n" ++ "mov %0, #0\n" ++ "teq %1, %4\n" ++ "strexeq %0, %5, [%3]\n" ++ : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter) ++ : "r" (&ptr->counter), "Ir" (old), "r" (new) ++ : "cc"); ++ } while (res); ++ ++ smp_mb(); ++ ++ return oldval; ++} ++ + #else /* ARM_ARCH_6 */ + + #ifdef CONFIG_SMP + #error SMP not supported on pre-ARMv6 CPUs + #endif + +-#define ATOMIC_OP(op, c_op, asm_op) \ +-static inline void atomic_##op(int i, atomic_t *v) \ ++#define __ATOMIC_OP(op, suffix, c_op, asm_op) \ ++static inline void atomic_##op##suffix(int i, atomic##suffix##_t *v) \ + { \ + unsigned long flags; \ + \ +@@ -147,8 +234,11 @@ static inline void atomic_##op(int i, atomic_t *v) \ + raw_local_irq_restore(flags); \ + } \ + +-#define ATOMIC_OP_RETURN(op, c_op, asm_op) \ +-static inline int atomic_##op##_return(int i, atomic_t *v) \ ++#define ATOMIC_OP(op, c_op, asm_op) __ATOMIC_OP(op, , c_op, asm_op) \ ++ __ATOMIC_OP(op, _unchecked, c_op, asm_op) ++ ++#define __ATOMIC_OP_RETURN(op, suffix, c_op, asm_op) \ ++static inline int atomic_##op##_return##suffix(int i, atomic##suffix##_t *v)\ + { \ + unsigned long flags; \ + int val; \ +@@ -161,6 +251,9 @@ static inline int atomic_##op##_return(int i, atomic_t *v) \ + return val; \ + } + ++#define ATOMIC_OP_RETURN(op, c_op, asm_op) __ATOMIC_OP_RETURN(op, , c_op, asm_op)\ ++ __ATOMIC_OP_RETURN(op, _unchecked, c_op, asm_op) ++ + static inline int atomic_cmpxchg(atomic_t *v, int old, int new) + { + int ret; +@@ -175,6 +268,11 @@ static inline int atomic_cmpxchg(atomic_t *v, int old, int new) + return ret; + } + ++static inline int atomic_cmpxchg_unchecked(atomic_unchecked_t *v, int old, int new) ++{ ++ return atomic_cmpxchg((atomic_t *)v, old, new); ++} ++ + static inline int __atomic_add_unless(atomic_t *v, int a, int u) + { + int c, old; +@@ -196,16 +294,38 @@ ATOMIC_OPS(sub, -=, sub) + + #undef ATOMIC_OPS + #undef ATOMIC_OP_RETURN ++#undef __ATOMIC_OP_RETURN + #undef ATOMIC_OP ++#undef __ATOMIC_OP + + #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) ++static inline int atomic_xchg_unchecked(atomic_unchecked_t *v, int new) ++{ ++ return xchg(&v->counter, new); ++} + + #define atomic_inc(v) atomic_add(1, v) ++static inline void atomic_inc_unchecked(atomic_unchecked_t *v) ++{ ++ atomic_add_unchecked(1, v); ++} + #define atomic_dec(v) atomic_sub(1, v) ++static inline void atomic_dec_unchecked(atomic_unchecked_t *v) ++{ ++ atomic_sub_unchecked(1, v); ++} + + #define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0) ++static inline int atomic_inc_and_test_unchecked(atomic_unchecked_t *v) ++{ ++ return atomic_add_return_unchecked(1, v) == 0; ++} + #define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0) + #define atomic_inc_return(v) (atomic_add_return(1, v)) ++static inline int atomic_inc_return_unchecked(atomic_unchecked_t *v) ++{ ++ return atomic_add_return_unchecked(1, v); ++} + #define atomic_dec_return(v) (atomic_sub_return(1, v)) + #define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0) + +@@ -216,6 +336,14 @@ typedef struct { + long long counter; + } atomic64_t; + ++#ifdef CONFIG_PAX_REFCOUNT ++typedef struct { ++ long long counter; ++} atomic64_unchecked_t; ++#else ++typedef atomic64_t atomic64_unchecked_t; ++#endif ++ + #define ATOMIC64_INIT(i) { (i) } + + #ifdef CONFIG_ARM_LPAE +@@ -232,6 +360,19 @@ static inline long long atomic64_read(const atomic64_t *v) + return result; + } + ++static inline long long atomic64_read_unchecked(const atomic64_unchecked_t *v) ++{ ++ long long result; ++ ++ __asm__ __volatile__("@ atomic64_read_unchecked\n" ++" ldrd %0, %H0, [%1]" ++ : "=&r" (result) ++ : "r" (&v->counter), "Qo" (v->counter) ++ ); ++ ++ return result; ++} ++ + static inline void atomic64_set(atomic64_t *v, long long i) + { + __asm__ __volatile__("@ atomic64_set\n" +@@ -240,6 +381,15 @@ static inline void atomic64_set(atomic64_t *v, long long i) + : "r" (&v->counter), "r" (i) + ); + } ++ ++static inline void atomic64_set_unchecked(atomic64_unchecked_t *v, long long i) ++{ ++ __asm__ __volatile__("@ atomic64_set_unchecked\n" ++" strd %2, %H2, [%1]" ++ : "=Qo" (v->counter) ++ : "r" (&v->counter), "r" (i) ++ ); ++} + #else + static inline long long atomic64_read(const atomic64_t *v) + { +@@ -254,6 +404,19 @@ static inline long long atomic64_read(const atomic64_t *v) + return result; + } + ++static inline long long atomic64_read_unchecked(const atomic64_unchecked_t *v) ++{ ++ long long result; ++ ++ __asm__ __volatile__("@ atomic64_read_unchecked\n" ++" ldrexd %0, %H0, [%1]" ++ : "=&r" (result) ++ : "r" (&v->counter), "Qo" (v->counter) ++ ); ++ ++ return result; ++} ++ + static inline void atomic64_set(atomic64_t *v, long long i) + { + long long tmp; +@@ -268,29 +431,57 @@ static inline void atomic64_set(atomic64_t *v, long long i) + : "r" (&v->counter), "r" (i) + : "cc"); + } ++ ++static inline void atomic64_set_unchecked(atomic64_unchecked_t *v, long long i) ++{ ++ long long tmp; ++ ++ prefetchw(&v->counter); ++ __asm__ __volatile__("@ atomic64_set_unchecked\n" ++"1: ldrexd %0, %H0, [%2]\n" ++" strexd %0, %3, %H3, [%2]\n" ++" teq %0, #0\n" ++" bne 1b" ++ : "=&r" (tmp), "=Qo" (v->counter) ++ : "r" (&v->counter), "r" (i) ++ : "cc"); ++} + #endif + +-#define ATOMIC64_OP(op, op1, op2) \ +-static inline void atomic64_##op(long long i, atomic64_t *v) \ ++#undef __OVERFLOW_POST_RETURN ++#define __OVERFLOW_POST_RETURN \ ++ " bvc 3f\n" \ ++" mov %0, %1\n" \ ++" mov %H0, %H1\n" \ ++ "2: " REFCOUNT_TRAP_INSN "\n"\ ++ "3:\n" ++ ++#define __ATOMIC64_OP(op, suffix, op1, op2, post_op, extable) \ ++static inline void atomic64_##op##suffix(long long i, atomic64##suffix##_t *v)\ + { \ + long long result; \ + unsigned long tmp; \ + \ + prefetchw(&v->counter); \ +- __asm__ __volatile__("@ atomic64_" #op "\n" \ ++ __asm__ __volatile__("@ atomic64_" #op #suffix "\n" \ + "1: ldrexd %0, %H0, [%3]\n" \ + " " #op1 " %Q0, %Q0, %Q4\n" \ + " " #op2 " %R0, %R0, %R4\n" \ ++ post_op \ + " strexd %1, %0, %H0, [%3]\n" \ + " teq %1, #0\n" \ +-" bne 1b" \ ++" bne 1b\n" \ ++ extable \ + : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) \ + : "r" (&v->counter), "r" (i) \ + : "cc"); \ + } \ + +-#define ATOMIC64_OP_RETURN(op, op1, op2) \ +-static inline long long atomic64_##op##_return(long long i, atomic64_t *v) \ ++#define ATOMIC64_OP(op, op1, op2) __ATOMIC64_OP(op, _unchecked, op1, op2, , ) \ ++ __ATOMIC64_OP(op, , op1, op2##s, __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++ ++#define __ATOMIC64_OP_RETURN(op, suffix, op1, op2, post_op, extable) \ ++static inline long long atomic64_##op##_return##suffix(long long i, atomic64##suffix##_t *v) \ + { \ + long long result; \ + unsigned long tmp; \ +@@ -298,13 +489,15 @@ static inline long long atomic64_##op##_return(long long i, atomic64_t *v) \ + smp_mb(); \ + prefetchw(&v->counter); \ + \ +- __asm__ __volatile__("@ atomic64_" #op "_return\n" \ ++ __asm__ __volatile__("@ atomic64_" #op "_return" #suffix "\n" \ + "1: ldrexd %0, %H0, [%3]\n" \ + " " #op1 " %Q0, %Q0, %Q4\n" \ + " " #op2 " %R0, %R0, %R4\n" \ ++ post_op \ + " strexd %1, %0, %H0, [%3]\n" \ + " teq %1, #0\n" \ +-" bne 1b" \ ++" bne 1b\n" \ ++ extable \ + : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) \ + : "r" (&v->counter), "r" (i) \ + : "cc"); \ +@@ -314,6 +507,9 @@ static inline long long atomic64_##op##_return(long long i, atomic64_t *v) \ + return result; \ + } + ++#define ATOMIC64_OP_RETURN(op, op1, op2) __ATOMIC64_OP_RETURN(op, _unchecked, op1, op2, , ) \ ++ __ATOMIC64_OP_RETURN(op, , op1, op2##s, __OVERFLOW_POST_RETURN, __OVERFLOW_EXTABLE) ++ + #define ATOMIC64_OPS(op, op1, op2) \ + ATOMIC64_OP(op, op1, op2) \ + ATOMIC64_OP_RETURN(op, op1, op2) +@@ -323,7 +519,12 @@ ATOMIC64_OPS(sub, subs, sbc) + + #undef ATOMIC64_OPS + #undef ATOMIC64_OP_RETURN ++#undef __ATOMIC64_OP_RETURN + #undef ATOMIC64_OP ++#undef __ATOMIC64_OP ++#undef __OVERFLOW_EXTABLE ++#undef __OVERFLOW_POST_RETURN ++#undef __OVERFLOW_POST + + static inline long long atomic64_cmpxchg(atomic64_t *ptr, long long old, + long long new) +@@ -351,6 +552,31 @@ static inline long long atomic64_cmpxchg(atomic64_t *ptr, long long old, + return oldval; + } + ++static inline long long atomic64_cmpxchg_unchecked(atomic64_unchecked_t *ptr, long long old, ++ long long new) ++{ ++ long long oldval; ++ unsigned long res; ++ ++ smp_mb(); ++ ++ do { ++ __asm__ __volatile__("@ atomic64_cmpxchg_unchecked\n" ++ "ldrexd %1, %H1, [%3]\n" ++ "mov %0, #0\n" ++ "teq %1, %4\n" ++ "teqeq %H1, %H4\n" ++ "strexdeq %0, %5, %H5, [%3]" ++ : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter) ++ : "r" (&ptr->counter), "r" (old), "r" (new) ++ : "cc"); ++ } while (res); ++ ++ smp_mb(); ++ ++ return oldval; ++} ++ + static inline long long atomic64_xchg(atomic64_t *ptr, long long new) + { + long long result; +@@ -376,21 +602,35 @@ static inline long long atomic64_xchg(atomic64_t *ptr, long long new) + static inline long long atomic64_dec_if_positive(atomic64_t *v) + { + long long result; +- unsigned long tmp; ++ u64 tmp; + + smp_mb(); + prefetchw(&v->counter); + + __asm__ __volatile__("@ atomic64_dec_if_positive\n" +-"1: ldrexd %0, %H0, [%3]\n" +-" subs %Q0, %Q0, #1\n" +-" sbc %R0, %R0, #0\n" ++"1: ldrexd %1, %H1, [%3]\n" ++" subs %Q0, %Q1, #1\n" ++" sbcs %R0, %R1, #0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" bvc 3f\n" ++" mov %Q0, %Q1\n" ++" mov %R0, %R1\n" ++"2: " REFCOUNT_TRAP_INSN "\n" ++"3:\n" ++#endif ++ + " teq %R0, #0\n" +-" bmi 2f\n" ++" bmi 4f\n" + " strexd %1, %0, %H0, [%3]\n" + " teq %1, #0\n" + " bne 1b\n" +-"2:" ++"4:\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ _ASM_EXTABLE(2b, 4b) ++#endif ++ + : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) + : "r" (&v->counter) + : "cc"); +@@ -414,13 +654,25 @@ static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) + " teq %0, %5\n" + " teqeq %H0, %H5\n" + " moveq %1, #0\n" +-" beq 2f\n" ++" beq 4f\n" + " adds %Q0, %Q0, %Q6\n" +-" adc %R0, %R0, %R6\n" ++" adcs %R0, %R0, %R6\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" bvc 3f\n" ++"2: " REFCOUNT_TRAP_INSN "\n" ++"3:\n" ++#endif ++ + " strexd %2, %0, %H0, [%4]\n" + " teq %2, #0\n" + " bne 1b\n" +-"2:" ++"4:\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ _ASM_EXTABLE(2b, 4b) ++#endif ++ + : "=&r" (val), "+r" (ret), "=&r" (tmp), "+Qo" (v->counter) + : "r" (&v->counter), "r" (u), "r" (a) + : "cc"); +@@ -433,10 +685,13 @@ static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) + + #define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0) + #define atomic64_inc(v) atomic64_add(1LL, (v)) ++#define atomic64_inc_unchecked(v) atomic64_add_unchecked(1LL, (v)) + #define atomic64_inc_return(v) atomic64_add_return(1LL, (v)) ++#define atomic64_inc_return_unchecked(v) atomic64_add_return_unchecked(1LL, (v)) + #define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0) + #define atomic64_sub_and_test(a, v) (atomic64_sub_return((a), (v)) == 0) + #define atomic64_dec(v) atomic64_sub(1LL, (v)) ++#define atomic64_dec_unchecked(v) atomic64_sub_unchecked(1LL, (v)) + #define atomic64_dec_return(v) atomic64_sub_return(1LL, (v)) + #define atomic64_dec_and_test(v) (atomic64_dec_return((v)) == 0) + #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1LL, 0LL) +diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h +index c6a3e73..35cca85 100644 +--- a/arch/arm/include/asm/barrier.h ++++ b/arch/arm/include/asm/barrier.h +@@ -63,7 +63,7 @@ + do { \ + compiletime_assert_atomic_type(*p); \ + smp_mb(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/arch/arm/include/asm/cache.h b/arch/arm/include/asm/cache.h +index 75fe66b..ba3dee4 100644 +--- a/arch/arm/include/asm/cache.h ++++ b/arch/arm/include/asm/cache.h +@@ -4,8 +4,10 @@ + #ifndef __ASMARM_CACHE_H + #define __ASMARM_CACHE_H + ++#include <linux/const.h> ++ + #define L1_CACHE_SHIFT CONFIG_ARM_L1_CACHE_SHIFT +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + /* + * Memory returned by kmalloc() may be used for DMA, so we must make +@@ -24,5 +26,6 @@ + #endif + + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) ++#define __read_only __attribute__ ((__section__(".data..read_only"))) + + #endif +diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h +index 10e78d0..dc8505d 100644 +--- a/arch/arm/include/asm/cacheflush.h ++++ b/arch/arm/include/asm/cacheflush.h +@@ -116,7 +116,7 @@ struct cpu_cache_fns { + void (*dma_unmap_area)(const void *, size_t, int); + + void (*dma_flush_range)(const void *, const void *); +-}; ++} __no_const; + + /* + * Select the calling method +diff --git a/arch/arm/include/asm/checksum.h b/arch/arm/include/asm/checksum.h +index 5233151..87a71fa 100644 +--- a/arch/arm/include/asm/checksum.h ++++ b/arch/arm/include/asm/checksum.h +@@ -37,7 +37,19 @@ __wsum + csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum); + + __wsum +-csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *err_ptr); ++__csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *err_ptr); ++ ++static inline __wsum ++csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum sum, int *err_ptr) ++{ ++ __wsum ret; ++ pax_open_userland(); ++ ret = __csum_partial_copy_from_user(src, dst, len, sum, err_ptr); ++ pax_close_userland(); ++ return ret; ++} ++ ++ + + /* + * Fold a partial checksum without adding pseudo headers +diff --git a/arch/arm/include/asm/cmpxchg.h b/arch/arm/include/asm/cmpxchg.h +index abb2c37..96db950 100644 +--- a/arch/arm/include/asm/cmpxchg.h ++++ b/arch/arm/include/asm/cmpxchg.h +@@ -104,6 +104,8 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size + + #define xchg(ptr,x) \ + ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) ++#define xchg_unchecked(ptr,x) \ ++ ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) + + #include <asm-generic/cmpxchg-local.h> + +diff --git a/arch/arm/include/asm/domain.h b/arch/arm/include/asm/domain.h +index 6ddbe44..b5e38b1a 100644 +--- a/arch/arm/include/asm/domain.h ++++ b/arch/arm/include/asm/domain.h +@@ -48,18 +48,37 @@ + * Domain types + */ + #define DOMAIN_NOACCESS 0 +-#define DOMAIN_CLIENT 1 + #ifdef CONFIG_CPU_USE_DOMAINS ++#define DOMAIN_USERCLIENT 1 ++#define DOMAIN_KERNELCLIENT 1 + #define DOMAIN_MANAGER 3 ++#define DOMAIN_VECTORS DOMAIN_USER ++#else ++ ++#ifdef CONFIG_PAX_KERNEXEC ++#define DOMAIN_MANAGER 1 ++#define DOMAIN_KERNEXEC 3 + #else + #define DOMAIN_MANAGER 1 + #endif + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++#define DOMAIN_USERCLIENT 0 ++#define DOMAIN_UDEREF 1 ++#define DOMAIN_VECTORS DOMAIN_KERNEL ++#else ++#define DOMAIN_USERCLIENT 1 ++#define DOMAIN_VECTORS DOMAIN_USER ++#endif ++#define DOMAIN_KERNELCLIENT 1 ++ ++#endif ++ + #define domain_val(dom,type) ((type) << (2*(dom))) + + #ifndef __ASSEMBLY__ + +-#ifdef CONFIG_CPU_USE_DOMAINS ++#if defined(CONFIG_CPU_USE_DOMAINS) || defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) + static inline void set_domain(unsigned val) + { + asm volatile( +@@ -68,15 +87,7 @@ static inline void set_domain(unsigned val) + isb(); + } + +-#define modify_domain(dom,type) \ +- do { \ +- struct thread_info *thread = current_thread_info(); \ +- unsigned int domain = thread->cpu_domain; \ +- domain &= ~domain_val(dom, DOMAIN_MANAGER); \ +- thread->cpu_domain = domain | domain_val(dom, type); \ +- set_domain(thread->cpu_domain); \ +- } while (0) +- ++extern void modify_domain(unsigned int dom, unsigned int type); + #else + static inline void set_domain(unsigned val) { } + static inline void modify_domain(unsigned dom, unsigned type) { } +diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h +index afb9caf..9a0bac0 100644 +--- a/arch/arm/include/asm/elf.h ++++ b/arch/arm/include/asm/elf.h +@@ -115,7 +115,14 @@ int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs); + the loader. We need to make sure that it is out of the way of the program + that it will "exec", and that there is sufficient room for the brk. */ + +-#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) ++#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2) ++ ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE 0x00008000UL ++ ++#define PAX_DELTA_MMAP_LEN ((current->personality == PER_LINUX_32BIT) ? 16 : 10) ++#define PAX_DELTA_STACK_LEN ((current->personality == PER_LINUX_32BIT) ? 16 : 10) ++#endif + + /* When the program starts, a1 contains a pointer to a function to be + registered with atexit, as per the SVR4 ABI. A value of 0 means we +@@ -125,10 +132,6 @@ int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs); + extern void elf_set_personality(const struct elf32_hdr *); + #define SET_PERSONALITY(ex) elf_set_personality(&(ex)) + +-struct mm_struct; +-extern unsigned long arch_randomize_brk(struct mm_struct *mm); +-#define arch_randomize_brk arch_randomize_brk +- + #ifdef CONFIG_MMU + #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 + struct linux_binprm; +diff --git a/arch/arm/include/asm/fncpy.h b/arch/arm/include/asm/fncpy.h +index de53547..52b9a28 100644 +--- a/arch/arm/include/asm/fncpy.h ++++ b/arch/arm/include/asm/fncpy.h +@@ -81,7 +81,9 @@ + BUG_ON((uintptr_t)(dest_buf) & (FNCPY_ALIGN - 1) || \ + (__funcp_address & ~(uintptr_t)1 & (FNCPY_ALIGN - 1))); \ + \ ++ pax_open_kernel(); \ + memcpy(dest_buf, (void const *)(__funcp_address & ~1), size); \ ++ pax_close_kernel(); \ + flush_icache_range((unsigned long)(dest_buf), \ + (unsigned long)(dest_buf) + (size)); \ + \ +diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h +index 53e69da..3fdc896 100644 +--- a/arch/arm/include/asm/futex.h ++++ b/arch/arm/include/asm/futex.h +@@ -46,6 +46,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, + if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) + return -EFAULT; + ++ pax_open_userland(); ++ + smp_mb(); + /* Prefetching cannot fault */ + prefetchw(uaddr); +@@ -63,6 +65,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, + : "cc", "memory"); + smp_mb(); + ++ pax_close_userland(); ++ + *uval = val; + return ret; + } +@@ -93,6 +97,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, + if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) + return -EFAULT; + ++ pax_open_userland(); ++ + __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" + "1: " TUSER(ldr) " %1, [%4]\n" + " teq %1, %2\n" +@@ -103,6 +109,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, + : "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT) + : "cc", "memory"); + ++ pax_close_userland(); ++ + *uval = val; + return ret; + } +@@ -125,6 +133,7 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) + return -EFAULT; + + pagefault_disable(); /* implies preempt_disable() */ ++ pax_open_userland(); + + switch (op) { + case FUTEX_OP_SET: +@@ -146,6 +155,7 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) + ret = -ENOSYS; + } + ++ pax_close_userland(); + pagefault_enable(); /* subsumes preempt_enable() */ + + if (!ret) { +diff --git a/arch/arm/include/asm/kmap_types.h b/arch/arm/include/asm/kmap_types.h +index 83eb2f7..ed77159 100644 +--- a/arch/arm/include/asm/kmap_types.h ++++ b/arch/arm/include/asm/kmap_types.h +@@ -4,6 +4,6 @@ + /* + * This is the "bare minimum". AIO seems to require this. + */ +-#define KM_TYPE_NR 16 ++#define KM_TYPE_NR 17 + + #endif +diff --git a/arch/arm/include/asm/mach/dma.h b/arch/arm/include/asm/mach/dma.h +index 9e614a1..3302cca 100644 +--- a/arch/arm/include/asm/mach/dma.h ++++ b/arch/arm/include/asm/mach/dma.h +@@ -22,7 +22,7 @@ struct dma_ops { + int (*residue)(unsigned int, dma_t *); /* optional */ + int (*setspeed)(unsigned int, dma_t *, int); /* optional */ + const char *type; +-}; ++} __do_const; + + struct dma_struct { + void *addr; /* single DMA address */ +diff --git a/arch/arm/include/asm/mach/map.h b/arch/arm/include/asm/mach/map.h +index f98c7f3..e5c626d 100644 +--- a/arch/arm/include/asm/mach/map.h ++++ b/arch/arm/include/asm/mach/map.h +@@ -23,17 +23,19 @@ struct map_desc { + + /* types 0-3 are defined in asm/io.h */ + enum { +- MT_UNCACHED = 4, +- MT_CACHECLEAN, +- MT_MINICLEAN, ++ MT_UNCACHED_RW = 4, ++ MT_CACHECLEAN_RO, ++ MT_MINICLEAN_RO, + MT_LOW_VECTORS, + MT_HIGH_VECTORS, +- MT_MEMORY_RWX, ++ __MT_MEMORY_RWX, + MT_MEMORY_RW, +- MT_ROM, +- MT_MEMORY_RWX_NONCACHED, ++ MT_MEMORY_RX, ++ MT_ROM_RX, ++ MT_MEMORY_RW_NONCACHED, ++ MT_MEMORY_RX_NONCACHED, + MT_MEMORY_RW_DTCM, +- MT_MEMORY_RWX_ITCM, ++ MT_MEMORY_RX_ITCM, + MT_MEMORY_RW_SO, + MT_MEMORY_DMA_READY, + }; +diff --git a/arch/arm/include/asm/outercache.h b/arch/arm/include/asm/outercache.h +index 891a56b..48f337e 100644 +--- a/arch/arm/include/asm/outercache.h ++++ b/arch/arm/include/asm/outercache.h +@@ -36,7 +36,7 @@ struct outer_cache_fns { + + /* This is an ARM L2C thing */ + void (*write_sec)(unsigned long, unsigned); +-}; ++} __no_const; + + extern struct outer_cache_fns outer_cache; + +diff --git a/arch/arm/include/asm/page.h b/arch/arm/include/asm/page.h +index 4355f0e..cd9168e 100644 +--- a/arch/arm/include/asm/page.h ++++ b/arch/arm/include/asm/page.h +@@ -23,6 +23,7 @@ + + #else + ++#include <linux/compiler.h> + #include <asm/glue.h> + + /* +@@ -114,7 +115,7 @@ struct cpu_user_fns { + void (*cpu_clear_user_highpage)(struct page *page, unsigned long vaddr); + void (*cpu_copy_user_highpage)(struct page *to, struct page *from, + unsigned long vaddr, struct vm_area_struct *vma); +-}; ++} __no_const; + + #ifdef MULTI_USER + extern struct cpu_user_fns cpu_user; +diff --git a/arch/arm/include/asm/pgalloc.h b/arch/arm/include/asm/pgalloc.h +index 78a7793..e3dc06c 100644 +--- a/arch/arm/include/asm/pgalloc.h ++++ b/arch/arm/include/asm/pgalloc.h +@@ -17,6 +17,7 @@ + #include <asm/processor.h> + #include <asm/cacheflush.h> + #include <asm/tlbflush.h> ++#include <asm/system_info.h> + + #define check_pgt_cache() do { } while (0) + +@@ -43,6 +44,11 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) + set_pud(pud, __pud(__pa(pmd) | PMD_TYPE_TABLE)); + } + ++static inline void pud_populate_kernel(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) ++{ ++ pud_populate(mm, pud, pmd); ++} ++ + #else /* !CONFIG_ARM_LPAE */ + + /* +@@ -51,6 +57,7 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) + #define pmd_alloc_one(mm,addr) ({ BUG(); ((pmd_t *)2); }) + #define pmd_free(mm, pmd) do { } while (0) + #define pud_populate(mm,pmd,pte) BUG() ++#define pud_populate_kernel(mm,pmd,pte) BUG() + + #endif /* CONFIG_ARM_LPAE */ + +@@ -128,6 +135,19 @@ static inline void pte_free(struct mm_struct *mm, pgtable_t pte) + __free_page(pte); + } + ++static inline void __section_update(pmd_t *pmdp, unsigned long addr, pmdval_t prot) ++{ ++#ifdef CONFIG_ARM_LPAE ++ pmdp[0] = __pmd(pmd_val(pmdp[0]) | prot); ++#else ++ if (addr & SECTION_SIZE) ++ pmdp[1] = __pmd(pmd_val(pmdp[1]) | prot); ++ else ++ pmdp[0] = __pmd(pmd_val(pmdp[0]) | prot); ++#endif ++ flush_pmd_entry(pmdp); ++} ++ + static inline void __pmd_populate(pmd_t *pmdp, phys_addr_t pte, + pmdval_t prot) + { +@@ -157,7 +177,7 @@ pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep) + static inline void + pmd_populate(struct mm_struct *mm, pmd_t *pmdp, pgtable_t ptep) + { +- __pmd_populate(pmdp, page_to_phys(ptep), _PAGE_USER_TABLE); ++ __pmd_populate(pmdp, page_to_phys(ptep), _PAGE_USER_TABLE | __supported_pmd_mask); + } + #define pmd_pgtable(pmd) pmd_page(pmd) + +diff --git a/arch/arm/include/asm/pgtable-2level-hwdef.h b/arch/arm/include/asm/pgtable-2level-hwdef.h +index 5cfba15..f415e1a 100644 +--- a/arch/arm/include/asm/pgtable-2level-hwdef.h ++++ b/arch/arm/include/asm/pgtable-2level-hwdef.h +@@ -20,12 +20,15 @@ + #define PMD_TYPE_FAULT (_AT(pmdval_t, 0) << 0) + #define PMD_TYPE_TABLE (_AT(pmdval_t, 1) << 0) + #define PMD_TYPE_SECT (_AT(pmdval_t, 2) << 0) ++#define PMD_PXNTABLE (_AT(pmdval_t, 1) << 2) /* v7 */ + #define PMD_BIT4 (_AT(pmdval_t, 1) << 4) + #define PMD_DOMAIN(x) (_AT(pmdval_t, (x)) << 5) + #define PMD_PROTECTION (_AT(pmdval_t, 1) << 9) /* v5 */ ++ + /* + * - section + */ ++#define PMD_SECT_PXN (_AT(pmdval_t, 1) << 0) /* v7 */ + #define PMD_SECT_BUFFERABLE (_AT(pmdval_t, 1) << 2) + #define PMD_SECT_CACHEABLE (_AT(pmdval_t, 1) << 3) + #define PMD_SECT_XN (_AT(pmdval_t, 1) << 4) /* v6 */ +@@ -37,6 +40,7 @@ + #define PMD_SECT_nG (_AT(pmdval_t, 1) << 17) /* v6 */ + #define PMD_SECT_SUPER (_AT(pmdval_t, 1) << 18) /* v6 */ + #define PMD_SECT_AF (_AT(pmdval_t, 0)) ++#define PMD_SECT_RDONLY (_AT(pmdval_t, 0)) + + #define PMD_SECT_UNCACHED (_AT(pmdval_t, 0)) + #define PMD_SECT_BUFFERED (PMD_SECT_BUFFERABLE) +@@ -66,6 +70,7 @@ + * - extended small page/tiny page + */ + #define PTE_EXT_XN (_AT(pteval_t, 1) << 0) /* v6 */ ++#define PTE_EXT_PXN (_AT(pteval_t, 1) << 2) /* v7 */ + #define PTE_EXT_AP_MASK (_AT(pteval_t, 3) << 4) + #define PTE_EXT_AP0 (_AT(pteval_t, 1) << 4) + #define PTE_EXT_AP1 (_AT(pteval_t, 2) << 4) +diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h +index f027941..f36ce30 100644 +--- a/arch/arm/include/asm/pgtable-2level.h ++++ b/arch/arm/include/asm/pgtable-2level.h +@@ -126,6 +126,9 @@ + #define L_PTE_SHARED (_AT(pteval_t, 1) << 10) /* shared(v6), coherent(xsc3) */ + #define L_PTE_NONE (_AT(pteval_t, 1) << 11) + ++/* Two-level page tables only have PXN in the PGD, not in the PTE. */ ++#define L_PTE_PXN (_AT(pteval_t, 0)) ++ + /* + * These are the memory types, defined to be compatible with + * pre-ARMv6 CPUs cacheable and bufferable bits: XXCB +diff --git a/arch/arm/include/asm/pgtable-3level-hwdef.h b/arch/arm/include/asm/pgtable-3level-hwdef.h +index 9fd61c7..f8f1cff 100644 +--- a/arch/arm/include/asm/pgtable-3level-hwdef.h ++++ b/arch/arm/include/asm/pgtable-3level-hwdef.h +@@ -76,6 +76,7 @@ + #define PTE_EXT_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ + #define PTE_EXT_AF (_AT(pteval_t, 1) << 10) /* Access Flag */ + #define PTE_EXT_NG (_AT(pteval_t, 1) << 11) /* nG */ ++#define PTE_EXT_PXN (_AT(pteval_t, 1) << 53) /* PXN */ + #define PTE_EXT_XN (_AT(pteval_t, 1) << 54) /* XN */ + + /* +diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h +index a31ecdad..95e98d4 100644 +--- a/arch/arm/include/asm/pgtable-3level.h ++++ b/arch/arm/include/asm/pgtable-3level.h +@@ -81,6 +81,7 @@ + #define L_PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */ + #define L_PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ + #define L_PTE_YOUNG (_AT(pteval_t, 1) << 10) /* AF */ ++#define L_PTE_PXN (_AT(pteval_t, 1) << 53) /* PXN */ + #define L_PTE_XN (_AT(pteval_t, 1) << 54) /* XN */ + #define L_PTE_DIRTY (_AT(pteval_t, 1) << 55) + #define L_PTE_SPECIAL (_AT(pteval_t, 1) << 56) +@@ -92,10 +93,12 @@ + #define L_PMD_SECT_SPLITTING (_AT(pmdval_t, 1) << 56) + #define L_PMD_SECT_NONE (_AT(pmdval_t, 1) << 57) + #define L_PMD_SECT_RDONLY (_AT(pteval_t, 1) << 58) ++#define PMD_SECT_RDONLY PMD_SECT_AP2 + + /* + * To be used in assembly code with the upper page attributes. + */ ++#define L_PTE_PXN_HIGH (1 << (53 - 32)) + #define L_PTE_XN_HIGH (1 << (54 - 32)) + #define L_PTE_DIRTY_HIGH (1 << (55 - 32)) + +diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h +index 3b30062..01a5f9d 100644 +--- a/arch/arm/include/asm/pgtable.h ++++ b/arch/arm/include/asm/pgtable.h +@@ -33,6 +33,9 @@ + #include <asm/pgtable-2level.h> + #endif + ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) ++ + /* + * Just any arbitrary offset to the start of the vmalloc VM area: the + * current 8MB value just means that there will be a 8MB "hole" after the +@@ -48,6 +51,9 @@ + #define LIBRARY_TEXT_START 0x0c000000 + + #ifndef __ASSEMBLY__ ++extern pteval_t __supported_pte_mask; ++extern pmdval_t __supported_pmd_mask; ++ + extern void __pte_error(const char *file, int line, pte_t); + extern void __pmd_error(const char *file, int line, pmd_t); + extern void __pgd_error(const char *file, int line, pgd_t); +@@ -56,6 +62,48 @@ extern void __pgd_error(const char *file, int line, pgd_t); + #define pmd_ERROR(pmd) __pmd_error(__FILE__, __LINE__, pmd) + #define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd) + ++#define __HAVE_ARCH_PAX_OPEN_KERNEL ++#define __HAVE_ARCH_PAX_CLOSE_KERNEL ++ ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++#include <asm/domain.h> ++#include <linux/thread_info.h> ++#include <linux/preempt.h> ++ ++static inline int test_domain(int domain, int domaintype) ++{ ++ return ((current_thread_info()->cpu_domain) & domain_val(domain, 3)) == domain_val(domain, domaintype); ++} ++#endif ++ ++#ifdef CONFIG_PAX_KERNEXEC ++static inline unsigned long pax_open_kernel(void) { ++#ifdef CONFIG_ARM_LPAE ++ /* TODO */ ++#else ++ preempt_disable(); ++ BUG_ON(test_domain(DOMAIN_KERNEL, DOMAIN_KERNEXEC)); ++ modify_domain(DOMAIN_KERNEL, DOMAIN_KERNEXEC); ++#endif ++ return 0; ++} ++ ++static inline unsigned long pax_close_kernel(void) { ++#ifdef CONFIG_ARM_LPAE ++ /* TODO */ ++#else ++ BUG_ON(test_domain(DOMAIN_KERNEL, DOMAIN_MANAGER)); ++ /* DOMAIN_MANAGER = "client" under KERNEXEC */ ++ modify_domain(DOMAIN_KERNEL, DOMAIN_MANAGER); ++ preempt_enable_no_resched(); ++#endif ++ return 0; ++} ++#else ++static inline unsigned long pax_open_kernel(void) { return 0; } ++static inline unsigned long pax_close_kernel(void) { return 0; } ++#endif ++ + /* + * This is the lowest virtual address we can permit any user space + * mapping to be mapped at. This is particularly important for +@@ -75,8 +123,8 @@ extern void __pgd_error(const char *file, int line, pgd_t); + /* + * The pgprot_* and protection_map entries will be fixed up in runtime + * to include the cachable and bufferable bits based on memory policy, +- * as well as any architecture dependent bits like global/ASID and SMP +- * shared mapping bits. ++ * as well as any architecture dependent bits like global/ASID, PXN, ++ * and SMP shared mapping bits. + */ + #define _L_PTE_DEFAULT L_PTE_PRESENT | L_PTE_YOUNG + +@@ -267,7 +315,7 @@ PTE_BIT_FUNC(mknexec, |= L_PTE_XN); + static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) + { + const pteval_t mask = L_PTE_XN | L_PTE_RDONLY | L_PTE_USER | +- L_PTE_NONE | L_PTE_VALID; ++ L_PTE_NONE | L_PTE_VALID | __supported_pte_mask; + pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); + return pte; + } +diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h +index c25ef3e..735f14b 100644 +--- a/arch/arm/include/asm/psci.h ++++ b/arch/arm/include/asm/psci.h +@@ -32,7 +32,7 @@ struct psci_operations { + int (*affinity_info)(unsigned long target_affinity, + unsigned long lowest_affinity_level); + int (*migrate_info_type)(void); +-}; ++} __no_const; + + extern struct psci_operations psci_ops; + extern struct smp_operations psci_smp_ops; +diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h +index 18f5a55..5072a40 100644 +--- a/arch/arm/include/asm/smp.h ++++ b/arch/arm/include/asm/smp.h +@@ -107,7 +107,7 @@ struct smp_operations { + int (*cpu_disable)(unsigned int cpu); + #endif + #endif +-}; ++} __no_const; + + struct of_cpu_method { + const char *method; +diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h +index ce73ab6..7310f8a 100644 +--- a/arch/arm/include/asm/thread_info.h ++++ b/arch/arm/include/asm/thread_info.h +@@ -78,9 +78,9 @@ struct thread_info { + .flags = 0, \ + .preempt_count = INIT_PREEMPT_COUNT, \ + .addr_limit = KERNEL_DS, \ +- .cpu_domain = domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \ +- domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ +- domain_val(DOMAIN_IO, DOMAIN_CLIENT), \ ++ .cpu_domain = domain_val(DOMAIN_USER, DOMAIN_USERCLIENT) | \ ++ domain_val(DOMAIN_KERNEL, DOMAIN_KERNELCLIENT) | \ ++ domain_val(DOMAIN_IO, DOMAIN_KERNELCLIENT), \ + .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ +@@ -154,7 +154,11 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, + #define TIF_SYSCALL_AUDIT 9 + #define TIF_SYSCALL_TRACEPOINT 10 + #define TIF_SECCOMP 11 /* seccomp syscall filtering active */ +-#define TIF_NOHZ 12 /* in adaptive nohz mode */ ++/* within 8 bits of TIF_SYSCALL_TRACE ++ * to meet flexible second operand requirements ++ */ ++#define TIF_GRSEC_SETXID 12 ++#define TIF_NOHZ 13 /* in adaptive nohz mode */ + #define TIF_USING_IWMMXT 17 + #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ + #define TIF_RESTORE_SIGMASK 20 +@@ -168,10 +172,11 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *, + #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) + #define _TIF_SECCOMP (1 << TIF_SECCOMP) + #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) ++#define _TIF_GRSEC_SETXID (1 << TIF_GRSEC_SETXID) + + /* Checks for any syscall work in entry-common.S */ + #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ +- _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP) ++ _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | _TIF_GRSEC_SETXID) + + /* + * Change these and you break ASM code in entry-common.S +diff --git a/arch/arm/include/asm/tls.h b/arch/arm/include/asm/tls.h +index 5f833f7..76e6644 100644 +--- a/arch/arm/include/asm/tls.h ++++ b/arch/arm/include/asm/tls.h +@@ -3,6 +3,7 @@ + + #include <linux/compiler.h> + #include <asm/thread_info.h> ++#include <asm/pgtable.h> + + #ifdef __ASSEMBLY__ + #include <asm/asm-offsets.h> +@@ -89,7 +90,9 @@ static inline void set_tls(unsigned long val) + * at 0xffff0fe0 must be used instead. (see + * entry-armv.S for details) + */ ++ pax_open_kernel(); + *((unsigned int *)0xffff0ff0) = val; ++ pax_close_kernel(); + #endif + } + +diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h +index 4767eb9..bf00668 100644 +--- a/arch/arm/include/asm/uaccess.h ++++ b/arch/arm/include/asm/uaccess.h +@@ -18,6 +18,7 @@ + #include <asm/domain.h> + #include <asm/unified.h> + #include <asm/compiler.h> ++#include <asm/pgtable.h> + + #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS + #include <asm-generic/uaccess-unaligned.h> +@@ -70,11 +71,38 @@ extern int __put_user_bad(void); + static inline void set_fs(mm_segment_t fs) + { + current_thread_info()->addr_limit = fs; +- modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER); ++ modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_KERNELCLIENT : DOMAIN_MANAGER); + } + + #define segment_eq(a,b) ((a) == (b)) + ++#define __HAVE_ARCH_PAX_OPEN_USERLAND ++#define __HAVE_ARCH_PAX_CLOSE_USERLAND ++ ++static inline void pax_open_userland(void) ++{ ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (segment_eq(get_fs(), USER_DS)) { ++ BUG_ON(test_domain(DOMAIN_USER, DOMAIN_UDEREF)); ++ modify_domain(DOMAIN_USER, DOMAIN_UDEREF); ++ } ++#endif ++ ++} ++ ++static inline void pax_close_userland(void) ++{ ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (segment_eq(get_fs(), USER_DS)) { ++ BUG_ON(test_domain(DOMAIN_USER, DOMAIN_NOACCESS)); ++ modify_domain(DOMAIN_USER, DOMAIN_NOACCESS); ++ } ++#endif ++ ++} ++ + #define __addr_ok(addr) ({ \ + unsigned long flag; \ + __asm__("cmp %2, %0; movlo %0, #0" \ +@@ -198,8 +226,12 @@ extern int __get_user_64t_4(void *); + + #define get_user(x,p) \ + ({ \ ++ int __e; \ + might_fault(); \ +- __get_user_check(x,p); \ ++ pax_open_userland(); \ ++ __e = __get_user_check(x,p); \ ++ pax_close_userland(); \ ++ __e; \ + }) + + extern int __put_user_1(void *, unsigned int); +@@ -244,8 +276,12 @@ extern int __put_user_8(void *, unsigned long long); + + #define put_user(x,p) \ + ({ \ ++ int __e; \ + might_fault(); \ +- __put_user_check(x,p); \ ++ pax_open_userland(); \ ++ __e = __put_user_check(x,p); \ ++ pax_close_userland(); \ ++ __e; \ + }) + + #else /* CONFIG_MMU */ +@@ -269,6 +305,7 @@ static inline void set_fs(mm_segment_t fs) + + #endif /* CONFIG_MMU */ + ++#define access_ok_noprefault(type,addr,size) access_ok((type),(addr),(size)) + #define access_ok(type,addr,size) (__range_ok(addr,size) == 0) + + #define user_addr_max() \ +@@ -286,13 +323,17 @@ static inline void set_fs(mm_segment_t fs) + #define __get_user(x,ptr) \ + ({ \ + long __gu_err = 0; \ ++ pax_open_userland(); \ + __get_user_err((x),(ptr),__gu_err); \ ++ pax_close_userland(); \ + __gu_err; \ + }) + + #define __get_user_error(x,ptr,err) \ + ({ \ ++ pax_open_userland(); \ + __get_user_err((x),(ptr),err); \ ++ pax_close_userland(); \ + (void) 0; \ + }) + +@@ -368,13 +409,17 @@ do { \ + #define __put_user(x,ptr) \ + ({ \ + long __pu_err = 0; \ ++ pax_open_userland(); \ + __put_user_err((x),(ptr),__pu_err); \ ++ pax_close_userland(); \ + __pu_err; \ + }) + + #define __put_user_error(x,ptr,err) \ + ({ \ ++ pax_open_userland(); \ + __put_user_err((x),(ptr),err); \ ++ pax_close_userland(); \ + (void) 0; \ + }) + +@@ -474,11 +519,44 @@ do { \ + + + #ifdef CONFIG_MMU +-extern unsigned long __must_check __copy_from_user(void *to, const void __user *from, unsigned long n); +-extern unsigned long __must_check __copy_to_user(void __user *to, const void *from, unsigned long n); ++extern unsigned long __must_check ___copy_from_user(void *to, const void __user *from, unsigned long n); ++extern unsigned long __must_check ___copy_to_user(void __user *to, const void *from, unsigned long n); ++ ++static inline unsigned long __must_check __copy_from_user(void *to, const void __user *from, unsigned long n) ++{ ++ unsigned long ret; ++ ++ check_object_size(to, n, false); ++ pax_open_userland(); ++ ret = ___copy_from_user(to, from, n); ++ pax_close_userland(); ++ return ret; ++} ++ ++static inline unsigned long __must_check __copy_to_user(void __user *to, const void *from, unsigned long n) ++{ ++ unsigned long ret; ++ ++ check_object_size(from, n, true); ++ pax_open_userland(); ++ ret = ___copy_to_user(to, from, n); ++ pax_close_userland(); ++ return ret; ++} ++ + extern unsigned long __must_check __copy_to_user_std(void __user *to, const void *from, unsigned long n); +-extern unsigned long __must_check __clear_user(void __user *addr, unsigned long n); ++extern unsigned long __must_check ___clear_user(void __user *addr, unsigned long n); + extern unsigned long __must_check __clear_user_std(void __user *addr, unsigned long n); ++ ++static inline unsigned long __must_check __clear_user(void __user *addr, unsigned long n) ++{ ++ unsigned long ret; ++ pax_open_userland(); ++ ret = ___clear_user(addr, n); ++ pax_close_userland(); ++ return ret; ++} ++ + #else + #define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0) + #define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0) +@@ -487,6 +565,9 @@ extern unsigned long __must_check __clear_user_std(void __user *addr, unsigned l + + static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) + { ++ if ((long)n < 0) ++ return n; ++ + if (access_ok(VERIFY_READ, from, n)) + n = __copy_from_user(to, from, n); + else /* security hole - plug it */ +@@ -496,6 +577,9 @@ static inline unsigned long __must_check copy_from_user(void *to, const void __u + + static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n) + { ++ if ((long)n < 0) ++ return n; ++ + if (access_ok(VERIFY_WRITE, to, n)) + n = __copy_to_user(to, from, n); + return n; +diff --git a/arch/arm/include/uapi/asm/ptrace.h b/arch/arm/include/uapi/asm/ptrace.h +index 5af0ed1..cea83883 100644 +--- a/arch/arm/include/uapi/asm/ptrace.h ++++ b/arch/arm/include/uapi/asm/ptrace.h +@@ -92,7 +92,7 @@ + * ARMv7 groups of PSR bits + */ + #define APSR_MASK 0xf80f0000 /* N, Z, C, V, Q and GE flags */ +-#define PSR_ISET_MASK 0x01000010 /* ISA state (J, T) mask */ ++#define PSR_ISET_MASK 0x01000020 /* ISA state (J, T) mask */ + #define PSR_IT_MASK 0x0600fc00 /* If-Then execution state mask */ + #define PSR_ENDIAN_MASK 0x00000200 /* Endianness state mask */ + +diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c +index a88671c..1cc895e 100644 +--- a/arch/arm/kernel/armksyms.c ++++ b/arch/arm/kernel/armksyms.c +@@ -55,7 +55,7 @@ EXPORT_SYMBOL(arm_delay_ops); + + /* networking */ + EXPORT_SYMBOL(csum_partial); +-EXPORT_SYMBOL(csum_partial_copy_from_user); ++EXPORT_SYMBOL(__csum_partial_copy_from_user); + EXPORT_SYMBOL(csum_partial_copy_nocheck); + EXPORT_SYMBOL(__csum_ipv6_magic); + +@@ -91,9 +91,9 @@ EXPORT_SYMBOL(__memzero); + #ifdef CONFIG_MMU + EXPORT_SYMBOL(copy_page); + +-EXPORT_SYMBOL(__copy_from_user); +-EXPORT_SYMBOL(__copy_to_user); +-EXPORT_SYMBOL(__clear_user); ++EXPORT_SYMBOL(___copy_from_user); ++EXPORT_SYMBOL(___copy_to_user); ++EXPORT_SYMBOL(___clear_user); + + EXPORT_SYMBOL(__get_user_1); + EXPORT_SYMBOL(__get_user_2); +diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S +index 2f5555d..d493c91 100644 +--- a/arch/arm/kernel/entry-armv.S ++++ b/arch/arm/kernel/entry-armv.S +@@ -47,6 +47,87 @@ + 9997: + .endm + ++ .macro pax_enter_kernel ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ @ make aligned space for saved DACR ++ sub sp, sp, #8 ++ @ save regs ++ stmdb sp!, {r1, r2} ++ @ read DACR from cpu_domain into r1 ++ mov r2, sp ++ @ assume 8K pages, since we have to split the immediate in two ++ bic r2, r2, #(0x1fc0) ++ bic r2, r2, #(0x3f) ++ ldr r1, [r2, #TI_CPU_DOMAIN] ++ @ store old DACR on stack ++ str r1, [sp, #8] ++#ifdef CONFIG_PAX_KERNEXEC ++ @ set type of DOMAIN_KERNEL to DOMAIN_KERNELCLIENT ++ bic r1, r1, #(domain_val(DOMAIN_KERNEL, 3)) ++ orr r1, r1, #(domain_val(DOMAIN_KERNEL, DOMAIN_KERNELCLIENT)) ++#endif ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ @ set current DOMAIN_USER to DOMAIN_NOACCESS ++ bic r1, r1, #(domain_val(DOMAIN_USER, 3)) ++#endif ++ @ write r1 to current_thread_info()->cpu_domain ++ str r1, [r2, #TI_CPU_DOMAIN] ++ @ write r1 to DACR ++ mcr p15, 0, r1, c3, c0, 0 ++ @ instruction sync ++ instr_sync ++ @ restore regs ++ ldmia sp!, {r1, r2} ++#endif ++ .endm ++ ++ .macro pax_open_userland ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ @ save regs ++ stmdb sp!, {r0, r1} ++ @ read DACR from cpu_domain into r1 ++ mov r0, sp ++ @ assume 8K pages, since we have to split the immediate in two ++ bic r0, r0, #(0x1fc0) ++ bic r0, r0, #(0x3f) ++ ldr r1, [r0, #TI_CPU_DOMAIN] ++ @ set current DOMAIN_USER to DOMAIN_CLIENT ++ bic r1, r1, #(domain_val(DOMAIN_USER, 3)) ++ orr r1, r1, #(domain_val(DOMAIN_USER, DOMAIN_UDEREF)) ++ @ write r1 to current_thread_info()->cpu_domain ++ str r1, [r0, #TI_CPU_DOMAIN] ++ @ write r1 to DACR ++ mcr p15, 0, r1, c3, c0, 0 ++ @ instruction sync ++ instr_sync ++ @ restore regs ++ ldmia sp!, {r0, r1} ++#endif ++ .endm ++ ++ .macro pax_close_userland ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ @ save regs ++ stmdb sp!, {r0, r1} ++ @ read DACR from cpu_domain into r1 ++ mov r0, sp ++ @ assume 8K pages, since we have to split the immediate in two ++ bic r0, r0, #(0x1fc0) ++ bic r0, r0, #(0x3f) ++ ldr r1, [r0, #TI_CPU_DOMAIN] ++ @ set current DOMAIN_USER to DOMAIN_NOACCESS ++ bic r1, r1, #(domain_val(DOMAIN_USER, 3)) ++ @ write r1 to current_thread_info()->cpu_domain ++ str r1, [r0, #TI_CPU_DOMAIN] ++ @ write r1 to DACR ++ mcr p15, 0, r1, c3, c0, 0 ++ @ instruction sync ++ instr_sync ++ @ restore regs ++ ldmia sp!, {r0, r1} ++#endif ++ .endm ++ + .macro pabt_helper + @ PABORT handler takes pt_regs in r2, fault address in r4 and psr in r5 + #ifdef MULTI_PABORT +@@ -89,11 +170,15 @@ + * Invalid mode handlers + */ + .macro inv_entry, reason ++ ++ pax_enter_kernel ++ + sub sp, sp, #S_FRAME_SIZE + ARM( stmib sp, {r1 - lr} ) + THUMB( stmia sp, {r0 - r12} ) + THUMB( str sp, [sp, #S_SP] ) + THUMB( str lr, [sp, #S_LR] ) ++ + mov r1, #\reason + .endm + +@@ -149,7 +234,11 @@ ENDPROC(__und_invalid) + .macro svc_entry, stack_hole=0, trace=1 + UNWIND(.fnstart ) + UNWIND(.save {r0 - pc} ) ++ ++ pax_enter_kernel ++ + sub sp, sp, #(S_FRAME_SIZE + \stack_hole - 4) ++ + #ifdef CONFIG_THUMB2_KERNEL + SPFIX( str r0, [sp] ) @ temporarily saved + SPFIX( mov r0, sp ) +@@ -164,7 +253,12 @@ ENDPROC(__und_invalid) + ldmia r0, {r3 - r5} + add r7, sp, #S_SP - 4 @ here for interlock avoidance + mov r6, #-1 @ "" "" "" "" ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ @ offset sp by 8 as done in pax_enter_kernel ++ add r2, sp, #(S_FRAME_SIZE + \stack_hole + 4) ++#else + add r2, sp, #(S_FRAME_SIZE + \stack_hole - 4) ++#endif + SPFIX( addeq r2, r2, #4 ) + str r3, [sp, #-4]! @ save the "real" r0 copied + @ from the exception stack +@@ -368,6 +462,9 @@ ENDPROC(__fiq_abt) + .macro usr_entry, trace=1 + UNWIND(.fnstart ) + UNWIND(.cantunwind ) @ don't unwind the user space ++ ++ pax_enter_kernel_user ++ + sub sp, sp, #S_FRAME_SIZE + ARM( stmib sp, {r1 - r12} ) + THUMB( stmia sp, {r0 - r12} ) +@@ -478,7 +575,9 @@ __und_usr: + tst r3, #PSR_T_BIT @ Thumb mode? + bne __und_usr_thumb + sub r4, r2, #4 @ ARM instr at LR - 4 ++ pax_open_userland + 1: ldrt r0, [r4] ++ pax_close_userland + ARM_BE8(rev r0, r0) @ little endian instruction + + @ r0 = 32-bit ARM instruction which caused the exception +@@ -512,11 +611,15 @@ __und_usr_thumb: + */ + .arch armv6t2 + #endif ++ pax_open_userland + 2: ldrht r5, [r4] ++ pax_close_userland + ARM_BE8(rev16 r5, r5) @ little endian instruction + cmp r5, #0xe800 @ 32bit instruction if xx != 0 + blo __und_usr_fault_16 @ 16bit undefined instruction ++ pax_open_userland + 3: ldrht r0, [r2] ++ pax_close_userland + ARM_BE8(rev16 r0, r0) @ little endian instruction + add r2, r2, #2 @ r2 is PC + 2, make it PC + 4 + str r2, [sp, #S_PC] @ it's a 2x16bit instr, update +@@ -546,7 +649,8 @@ ENDPROC(__und_usr) + */ + .pushsection .fixup, "ax" + .align 2 +-4: str r4, [sp, #S_PC] @ retry current instruction ++4: pax_close_userland ++ str r4, [sp, #S_PC] @ retry current instruction + ret r9 + .popsection + .pushsection __ex_table,"a" +@@ -766,7 +870,7 @@ ENTRY(__switch_to) + THUMB( str lr, [ip], #4 ) + ldr r4, [r2, #TI_TP_VALUE] + ldr r5, [r2, #TI_TP_VALUE + 4] +-#ifdef CONFIG_CPU_USE_DOMAINS ++#if defined(CONFIG_CPU_USE_DOMAINS) || defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) + ldr r6, [r2, #TI_CPU_DOMAIN] + #endif + switch_tls r1, r4, r5, r3, r7 +@@ -775,7 +879,7 @@ ENTRY(__switch_to) + ldr r8, =__stack_chk_guard + ldr r7, [r7, #TSK_STACK_CANARY] + #endif +-#ifdef CONFIG_CPU_USE_DOMAINS ++#if defined(CONFIG_CPU_USE_DOMAINS) || defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) + mcr p15, 0, r6, c3, c0, 0 @ Set domain register + #endif + mov r5, r0 +diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S +index 6bb09d4..113e875 100644 +--- a/arch/arm/kernel/entry-common.S ++++ b/arch/arm/kernel/entry-common.S +@@ -11,18 +11,46 @@ + #include <asm/assembler.h> + #include <asm/unistd.h> + #include <asm/ftrace.h> ++#include <asm/domain.h> + #include <asm/unwind.h> + ++#include "entry-header.S" ++ + #ifdef CONFIG_NEED_RET_TO_USER + #include <mach/entry-macro.S> + #else + .macro arch_ret_to_user, tmp1, tmp2 ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ @ save regs ++ stmdb sp!, {r1, r2} ++ @ read DACR from cpu_domain into r1 ++ mov r2, sp ++ @ assume 8K pages, since we have to split the immediate in two ++ bic r2, r2, #(0x1fc0) ++ bic r2, r2, #(0x3f) ++ ldr r1, [r2, #TI_CPU_DOMAIN] ++#ifdef CONFIG_PAX_KERNEXEC ++ @ set type of DOMAIN_KERNEL to DOMAIN_KERNELCLIENT ++ bic r1, r1, #(domain_val(DOMAIN_KERNEL, 3)) ++ orr r1, r1, #(domain_val(DOMAIN_KERNEL, DOMAIN_KERNELCLIENT)) ++#endif ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ @ set current DOMAIN_USER to DOMAIN_UDEREF ++ bic r1, r1, #(domain_val(DOMAIN_USER, 3)) ++ orr r1, r1, #(domain_val(DOMAIN_USER, DOMAIN_UDEREF)) ++#endif ++ @ write r1 to current_thread_info()->cpu_domain ++ str r1, [r2, #TI_CPU_DOMAIN] ++ @ write r1 to DACR ++ mcr p15, 0, r1, c3, c0, 0 ++ @ instruction sync ++ instr_sync ++ @ restore regs ++ ldmia sp!, {r1, r2} ++#endif + .endm + #endif + +-#include "entry-header.S" +- +- + .align 5 + /* + * This is the fast syscall return path. We do as little as +@@ -406,6 +434,12 @@ ENTRY(vector_swi) + USER( ldr scno, [lr, #-4] ) @ get SWI instruction + #endif + ++ /* ++ * do this here to avoid a performance hit of wrapping the code above ++ * that directly dereferences userland to parse the SWI instruction ++ */ ++ pax_enter_kernel_user ++ + adr tbl, sys_call_table @ load syscall table pointer + + #if defined(CONFIG_OABI_COMPAT) +diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S +index 4176df7..a901f8d 100644 +--- a/arch/arm/kernel/entry-header.S ++++ b/arch/arm/kernel/entry-header.S +@@ -196,6 +196,60 @@ + msr cpsr_c, \rtemp @ switch back to the SVC mode + .endm + ++ .macro pax_enter_kernel_user ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ @ save regs ++ stmdb sp!, {r0, r1} ++ @ read DACR from cpu_domain into r1 ++ mov r0, sp ++ @ assume 8K pages, since we have to split the immediate in two ++ bic r0, r0, #(0x1fc0) ++ bic r0, r0, #(0x3f) ++ ldr r1, [r0, #TI_CPU_DOMAIN] ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ @ set current DOMAIN_USER to DOMAIN_NOACCESS ++ bic r1, r1, #(domain_val(DOMAIN_USER, 3)) ++#endif ++#ifdef CONFIG_PAX_KERNEXEC ++ @ set current DOMAIN_KERNEL to DOMAIN_KERNELCLIENT ++ bic r1, r1, #(domain_val(DOMAIN_KERNEL, 3)) ++ orr r1, r1, #(domain_val(DOMAIN_KERNEL, DOMAIN_KERNELCLIENT)) ++#endif ++ @ write r1 to current_thread_info()->cpu_domain ++ str r1, [r0, #TI_CPU_DOMAIN] ++ @ write r1 to DACR ++ mcr p15, 0, r1, c3, c0, 0 ++ @ instruction sync ++ instr_sync ++ @ restore regs ++ ldmia sp!, {r0, r1} ++#endif ++ .endm ++ ++ .macro pax_exit_kernel ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ @ save regs ++ stmdb sp!, {r0, r1} ++ @ read old DACR from stack into r1 ++ ldr r1, [sp, #(8 + S_SP)] ++ sub r1, r1, #8 ++ ldr r1, [r1] ++ ++ @ write r1 to current_thread_info()->cpu_domain ++ mov r0, sp ++ @ assume 8K pages, since we have to split the immediate in two ++ bic r0, r0, #(0x1fc0) ++ bic r0, r0, #(0x3f) ++ str r1, [r0, #TI_CPU_DOMAIN] ++ @ write r1 to DACR ++ mcr p15, 0, r1, c3, c0, 0 ++ @ instruction sync ++ instr_sync ++ @ restore regs ++ ldmia sp!, {r0, r1} ++#endif ++ .endm ++ + #ifndef CONFIG_THUMB2_KERNEL + .macro svc_exit, rpsr, irq = 0 + .if \irq != 0 +@@ -215,6 +269,9 @@ + blne trace_hardirqs_off + #endif + .endif ++ ++ pax_exit_kernel ++ + msr spsr_cxsf, \rpsr + #if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K) + @ We must avoid clrex due to Cortex-A15 erratum #830321 +@@ -290,6 +347,9 @@ + blne trace_hardirqs_off + #endif + .endif ++ ++ pax_exit_kernel ++ + ldr lr, [sp, #S_SP] @ top of the stack + ldrd r0, r1, [sp, #S_LR] @ calling lr and pc + +diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c +index b37752a..ff5cb72 100644 +--- a/arch/arm/kernel/fiq.c ++++ b/arch/arm/kernel/fiq.c +@@ -95,7 +95,10 @@ void set_fiq_handler(void *start, unsigned int length) + void *base = vectors_page; + unsigned offset = FIQ_OFFSET; + ++ pax_open_kernel(); + memcpy(base + offset, start, length); ++ pax_close_kernel(); ++ + if (!cache_is_vipt_nonaliasing()) + flush_icache_range((unsigned long)base + offset, offset + + length); +diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S +index 664eee8..f470938 100644 +--- a/arch/arm/kernel/head.S ++++ b/arch/arm/kernel/head.S +@@ -437,7 +437,7 @@ __enable_mmu: + mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \ + domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ + domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \ +- domain_val(DOMAIN_IO, DOMAIN_CLIENT)) ++ domain_val(DOMAIN_IO, DOMAIN_KERNELCLIENT)) + mcr p15, 0, r5, c3, c0, 0 @ load domain access register + mcr p15, 0, r4, c2, c0, 0 @ load page table pointer + #endif +diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c +index 6a4dffe..4a86a70 100644 +--- a/arch/arm/kernel/module.c ++++ b/arch/arm/kernel/module.c +@@ -38,12 +38,39 @@ + #endif + + #ifdef CONFIG_MMU +-void *module_alloc(unsigned long size) ++static inline void *__module_alloc(unsigned long size, pgprot_t prot) + { ++ if (!size || PAGE_ALIGN(size) > MODULES_END - MODULES_VADDR) ++ return NULL; + return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, +- GFP_KERNEL, PAGE_KERNEL_EXEC, NUMA_NO_NODE, ++ GFP_KERNEL, prot, NUMA_NO_NODE, + __builtin_return_address(0)); + } ++ ++void *module_alloc(unsigned long size) ++{ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ return __module_alloc(size, PAGE_KERNEL); ++#else ++ return __module_alloc(size, PAGE_KERNEL_EXEC); ++#endif ++ ++} ++ ++#ifdef CONFIG_PAX_KERNEXEC ++void module_free_exec(struct module *mod, void *module_region) ++{ ++ module_free(mod, module_region); ++} ++EXPORT_SYMBOL(module_free_exec); ++ ++void *module_alloc_exec(unsigned long size) ++{ ++ return __module_alloc(size, PAGE_KERNEL_EXEC); ++} ++EXPORT_SYMBOL(module_alloc_exec); ++#endif + #endif + + int +diff --git a/arch/arm/kernel/patch.c b/arch/arm/kernel/patch.c +index 07314af..c46655c 100644 +--- a/arch/arm/kernel/patch.c ++++ b/arch/arm/kernel/patch.c +@@ -18,6 +18,7 @@ void __kprobes __patch_text(void *addr, unsigned int insn) + bool thumb2 = IS_ENABLED(CONFIG_THUMB2_KERNEL); + int size; + ++ pax_open_kernel(); + if (thumb2 && __opcode_is_thumb16(insn)) { + *(u16 *)addr = __opcode_to_mem_thumb16(insn); + size = sizeof(u16); +@@ -39,6 +40,7 @@ void __kprobes __patch_text(void *addr, unsigned int insn) + *(u32 *)addr = insn; + size = sizeof(u32); + } ++ pax_close_kernel(); + + flush_icache_range((uintptr_t)(addr), + (uintptr_t)(addr) + size); +diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c +index fe972a2..a772d83 100644 +--- a/arch/arm/kernel/process.c ++++ b/arch/arm/kernel/process.c +@@ -207,6 +207,7 @@ void machine_power_off(void) + + if (pm_power_off) + pm_power_off(); ++ BUG(); + } + + /* +@@ -220,7 +221,7 @@ void machine_power_off(void) + * executing pre-reset code, and using RAM that the primary CPU's code wishes + * to use. Implementing such co-ordination would be essentially impossible. + */ +-void machine_restart(char *cmd) ++__noreturn void machine_restart(char *cmd) + { + local_irq_disable(); + smp_send_stop(); +@@ -246,8 +247,8 @@ void __show_regs(struct pt_regs *regs) + + show_regs_print_info(KERN_DEFAULT); + +- print_symbol("PC is at %s\n", instruction_pointer(regs)); +- print_symbol("LR is at %s\n", regs->ARM_lr); ++ printk("PC is at %pA\n", (void *)instruction_pointer(regs)); ++ printk("LR is at %pA\n", (void *)regs->ARM_lr); + printk("pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n" + "sp : %08lx ip : %08lx fp : %08lx\n", + regs->ARM_pc, regs->ARM_lr, regs->ARM_cpsr, +@@ -424,12 +425,6 @@ unsigned long get_wchan(struct task_struct *p) + return 0; + } + +-unsigned long arch_randomize_brk(struct mm_struct *mm) +-{ +- unsigned long range_end = mm->brk + 0x02000000; +- return randomize_range(mm->brk, range_end, 0) ? : mm->brk; +-} +- + #ifdef CONFIG_MMU + #ifdef CONFIG_KUSER_HELPERS + /* +@@ -445,7 +440,7 @@ static struct vm_area_struct gate_vma = { + + static int __init gate_vma_init(void) + { +- gate_vma.vm_page_prot = PAGE_READONLY_EXEC; ++ gate_vma.vm_page_prot = vm_get_page_prot(gate_vma.vm_flags); + return 0; + } + arch_initcall(gate_vma_init); +@@ -474,81 +469,13 @@ const char *arch_vma_name(struct vm_area_struct *vma) + return is_gate_vma(vma) ? "[vectors]" : NULL; + } + +-/* If possible, provide a placement hint at a random offset from the +- * stack for the signal page. +- */ +-static unsigned long sigpage_addr(const struct mm_struct *mm, +- unsigned int npages) +-{ +- unsigned long offset; +- unsigned long first; +- unsigned long last; +- unsigned long addr; +- unsigned int slots; +- +- first = PAGE_ALIGN(mm->start_stack); +- +- last = TASK_SIZE - (npages << PAGE_SHIFT); +- +- /* No room after stack? */ +- if (first > last) +- return 0; +- +- /* Just enough room? */ +- if (first == last) +- return first; +- +- slots = ((last - first) >> PAGE_SHIFT) + 1; +- +- offset = get_random_int() % slots; +- +- addr = first + (offset << PAGE_SHIFT); +- +- return addr; +-} +- +-static struct page *signal_page; +-extern struct page *get_signal_page(void); +- +-static const struct vm_special_mapping sigpage_mapping = { +- .name = "[sigpage]", +- .pages = &signal_page, +-}; +- + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) + { + struct mm_struct *mm = current->mm; +- struct vm_area_struct *vma; +- unsigned long addr; +- unsigned long hint; +- int ret = 0; +- +- if (!signal_page) +- signal_page = get_signal_page(); +- if (!signal_page) +- return -ENOMEM; + + down_write(&mm->mmap_sem); +- hint = sigpage_addr(mm, 1); +- addr = get_unmapped_area(NULL, hint, PAGE_SIZE, 0, 0); +- if (IS_ERR_VALUE(addr)) { +- ret = addr; +- goto up_fail; +- } +- +- vma = _install_special_mapping(mm, addr, PAGE_SIZE, +- VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, +- &sigpage_mapping); +- +- if (IS_ERR(vma)) { +- ret = PTR_ERR(vma); +- goto up_fail; +- } +- +- mm->context.sigpage = addr; +- +- up_fail: ++ mm->context.sigpage = (PAGE_OFFSET + (get_random_int() % 0x3FFEFFE0)) & 0xFFFFFFFC; + up_write(&mm->mmap_sem); +- return ret; ++ return 0; + } + #endif +diff --git a/arch/arm/kernel/psci.c b/arch/arm/kernel/psci.c +index f73891b..cf3004e 100644 +--- a/arch/arm/kernel/psci.c ++++ b/arch/arm/kernel/psci.c +@@ -28,7 +28,7 @@ + #include <asm/psci.h> + #include <asm/system_misc.h> + +-struct psci_operations psci_ops; ++struct psci_operations psci_ops __read_only; + + static int (*invoke_psci_fn)(u32, u32, u32, u32); + typedef int (*psci_initcall_t)(const struct device_node *); +diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c +index ef9119f..31995a3 100644 +--- a/arch/arm/kernel/ptrace.c ++++ b/arch/arm/kernel/ptrace.c +@@ -928,10 +928,19 @@ static void tracehook_report_syscall(struct pt_regs *regs, + regs->ARM_ip = ip; + } + ++#ifdef CONFIG_GRKERNSEC_SETXID ++extern void gr_delayed_cred_worker(void); ++#endif ++ + asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) + { + current_thread_info()->syscall = scno; + ++#ifdef CONFIG_GRKERNSEC_SETXID ++ if (unlikely(test_and_clear_thread_flag(TIF_GRSEC_SETXID))) ++ gr_delayed_cred_worker(); ++#endif ++ + /* Do the secure computing check first; failures should be fast. */ + #ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER + if (secure_computing() == -1) +diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c +index 306e1ac..1b477ed 100644 +--- a/arch/arm/kernel/setup.c ++++ b/arch/arm/kernel/setup.c +@@ -104,21 +104,23 @@ EXPORT_SYMBOL(elf_hwcap); + unsigned int elf_hwcap2 __read_mostly; + EXPORT_SYMBOL(elf_hwcap2); + ++pteval_t __supported_pte_mask __read_only; ++pmdval_t __supported_pmd_mask __read_only; + + #ifdef MULTI_CPU +-struct processor processor __read_mostly; ++struct processor processor __read_only; + #endif + #ifdef MULTI_TLB +-struct cpu_tlb_fns cpu_tlb __read_mostly; ++struct cpu_tlb_fns cpu_tlb __read_only; + #endif + #ifdef MULTI_USER +-struct cpu_user_fns cpu_user __read_mostly; ++struct cpu_user_fns cpu_user __read_only; + #endif + #ifdef MULTI_CACHE +-struct cpu_cache_fns cpu_cache __read_mostly; ++struct cpu_cache_fns cpu_cache __read_only; + #endif + #ifdef CONFIG_OUTER_CACHE +-struct outer_cache_fns outer_cache __read_mostly; ++struct outer_cache_fns outer_cache __read_only; + EXPORT_SYMBOL(outer_cache); + #endif + +@@ -252,9 +254,13 @@ static int __get_cpu_architecture(void) + asm("mrc p15, 0, %0, c0, c1, 4" + : "=r" (mmfr0)); + if ((mmfr0 & 0x0000000f) >= 0x00000003 || +- (mmfr0 & 0x000000f0) >= 0x00000030) ++ (mmfr0 & 0x000000f0) >= 0x00000030) { + cpu_arch = CPU_ARCH_ARMv7; +- else if ((mmfr0 & 0x0000000f) == 0x00000002 || ++ if ((mmfr0 & 0x0000000f) == 0x00000005 || (mmfr0 & 0x0000000f) == 0x00000004) { ++ __supported_pte_mask |= L_PTE_PXN; ++ __supported_pmd_mask |= PMD_PXNTABLE; ++ } ++ } else if ((mmfr0 & 0x0000000f) == 0x00000002 || + (mmfr0 & 0x000000f0) == 0x00000020) + cpu_arch = CPU_ARCH_ARMv6; + else +diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c +index bd19834..e4d8c66 100644 +--- a/arch/arm/kernel/signal.c ++++ b/arch/arm/kernel/signal.c +@@ -24,8 +24,6 @@ + + extern const unsigned long sigreturn_codes[7]; + +-static unsigned long signal_return_offset; +- + #ifdef CONFIG_CRUNCH + static int preserve_crunch_context(struct crunch_sigframe __user *frame) + { +@@ -396,8 +394,7 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig, + * except when the MPU has protected the vectors + * page from PL0 + */ +- retcode = mm->context.sigpage + signal_return_offset + +- (idx << 2) + thumb; ++ retcode = mm->context.sigpage + (idx << 2) + thumb; + } else + #endif + { +@@ -604,33 +601,3 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) + } while (thread_flags & _TIF_WORK_MASK); + return 0; + } +- +-struct page *get_signal_page(void) +-{ +- unsigned long ptr; +- unsigned offset; +- struct page *page; +- void *addr; +- +- page = alloc_pages(GFP_KERNEL, 0); +- +- if (!page) +- return NULL; +- +- addr = page_address(page); +- +- /* Give the signal return code some randomness */ +- offset = 0x200 + (get_random_int() & 0x7fc); +- signal_return_offset = offset; +- +- /* +- * Copy signal return handlers into the vector page, and +- * set sigreturn to be a pointer to these. +- */ +- memcpy(addr + offset, sigreturn_codes, sizeof(sigreturn_codes)); +- +- ptr = (unsigned long)addr + offset; +- flush_icache_range(ptr, ptr + sizeof(sigreturn_codes)); +- +- return page; +-} +diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c +index a8e32aa..b2f7198 100644 +--- a/arch/arm/kernel/smp.c ++++ b/arch/arm/kernel/smp.c +@@ -76,7 +76,7 @@ enum ipi_msg_type { + + static DECLARE_COMPLETION(cpu_running); + +-static struct smp_operations smp_ops; ++static struct smp_operations smp_ops __read_only; + + void __init smp_set_ops(struct smp_operations *ops) + { +diff --git a/arch/arm/kernel/tcm.c b/arch/arm/kernel/tcm.c +index 7a3be1d..b00c7de 100644 +--- a/arch/arm/kernel/tcm.c ++++ b/arch/arm/kernel/tcm.c +@@ -61,7 +61,7 @@ static struct map_desc itcm_iomap[] __initdata = { + .virtual = ITCM_OFFSET, + .pfn = __phys_to_pfn(ITCM_OFFSET), + .length = 0, +- .type = MT_MEMORY_RWX_ITCM, ++ .type = MT_MEMORY_RX_ITCM, + } + }; + +@@ -267,7 +267,9 @@ no_dtcm: + start = &__sitcm_text; + end = &__eitcm_text; + ram = &__itcm_start; ++ pax_open_kernel(); + memcpy(start, ram, itcm_code_sz); ++ pax_close_kernel(); + pr_debug("CPU ITCM: copied code from %p - %p\n", + start, end); + itcm_present = true; +diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c +index 9f5d818..e013427 100644 +--- a/arch/arm/kernel/traps.c ++++ b/arch/arm/kernel/traps.c +@@ -65,7 +65,7 @@ static void dump_mem(const char *, const char *, unsigned long, unsigned long); + void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame) + { + #ifdef CONFIG_KALLSYMS +- printk("[<%08lx>] (%ps) from [<%08lx>] (%pS)\n", where, (void *)where, from, (void *)from); ++ printk("[<%08lx>] (%pA) from [<%08lx>] (%pA)\n", where, (void *)where, from, (void *)from); + #else + printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from); + #endif +@@ -267,6 +267,8 @@ static arch_spinlock_t die_lock = __ARCH_SPIN_LOCK_UNLOCKED; + static int die_owner = -1; + static unsigned int die_nest_count; + ++extern void gr_handle_kernel_exploit(void); ++ + static unsigned long oops_begin(void) + { + int cpu; +@@ -309,6 +311,9 @@ static void oops_end(unsigned long flags, struct pt_regs *regs, int signr) + panic("Fatal exception in interrupt"); + if (panic_on_oops) + panic("Fatal exception"); ++ ++ gr_handle_kernel_exploit(); ++ + if (signr) + do_exit(signr); + } +@@ -880,7 +885,11 @@ void __init early_trap_init(void *vectors_base) + kuser_init(vectors_base); + + flush_icache_range(vectors, vectors + PAGE_SIZE * 2); +- modify_domain(DOMAIN_USER, DOMAIN_CLIENT); ++ ++#ifndef CONFIG_PAX_MEMORY_UDEREF ++ modify_domain(DOMAIN_USER, DOMAIN_USERCLIENT); ++#endif ++ + #else /* ifndef CONFIG_CPU_V7M */ + /* + * on V7-M there is no need to copy the vector table to a dedicated +diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S +index 8e95aa4..595dfc8 100644 +--- a/arch/arm/kernel/vmlinux.lds.S ++++ b/arch/arm/kernel/vmlinux.lds.S +@@ -8,7 +8,11 @@ + #include <asm/thread_info.h> + #include <asm/memory.h> + #include <asm/page.h> +- ++ ++#ifdef CONFIG_PAX_KERNEXEC ++#include <asm/pgtable.h> ++#endif ++ + #define PROC_INFO \ + . = ALIGN(4); \ + VMLINUX_SYMBOL(__proc_info_begin) = .; \ +@@ -34,7 +38,7 @@ + #endif + + #if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \ +- defined(CONFIG_GENERIC_BUG) ++ defined(CONFIG_GENERIC_BUG) || defined(CONFIG_PAX_REFCOUNT) + #define ARM_EXIT_KEEP(x) x + #define ARM_EXIT_DISCARD(x) + #else +@@ -90,6 +94,11 @@ SECTIONS + _text = .; + HEAD_TEXT + } ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ . = ALIGN(1<<SECTION_SHIFT); ++#endif ++ + .text : { /* Real text segment */ + _stext = .; /* Text and read-only data */ + __exception_text_start = .; +@@ -112,6 +121,8 @@ SECTIONS + ARM_CPU_KEEP(PROC_INFO) + } + ++ _etext = .; /* End of text section */ ++ + RO_DATA(PAGE_SIZE) + + . = ALIGN(4); +@@ -142,7 +153,9 @@ SECTIONS + + NOTES + +- _etext = .; /* End of text and rodata section */ ++#ifdef CONFIG_PAX_KERNEXEC ++ . = ALIGN(1<<SECTION_SHIFT); ++#endif + + #ifndef CONFIG_XIP_KERNEL + . = ALIGN(PAGE_SIZE); +@@ -221,6 +234,11 @@ SECTIONS + #else + . = ALIGN(THREAD_SIZE); + __init_end = .; ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ . = ALIGN(1<<SECTION_SHIFT); ++#endif ++ + __data_loc = .; + #endif + +diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c +index 9e193c8..3560fe6 100644 +--- a/arch/arm/kvm/arm.c ++++ b/arch/arm/kvm/arm.c +@@ -57,7 +57,7 @@ static unsigned long hyp_default_vectors; + static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu); + + /* The VMID used in the VTTBR */ +-static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1); ++static atomic64_unchecked_t kvm_vmid_gen = ATOMIC64_INIT(1); + static u8 kvm_next_vmid; + static DEFINE_SPINLOCK(kvm_vmid_lock); + +@@ -354,7 +354,7 @@ void force_vm_exit(const cpumask_t *mask) + */ + static bool need_new_vmid_gen(struct kvm *kvm) + { +- return unlikely(kvm->arch.vmid_gen != atomic64_read(&kvm_vmid_gen)); ++ return unlikely(kvm->arch.vmid_gen != atomic64_read_unchecked(&kvm_vmid_gen)); + } + + /** +@@ -387,7 +387,7 @@ static void update_vttbr(struct kvm *kvm) + + /* First user of a new VMID generation? */ + if (unlikely(kvm_next_vmid == 0)) { +- atomic64_inc(&kvm_vmid_gen); ++ atomic64_inc_unchecked(&kvm_vmid_gen); + kvm_next_vmid = 1; + + /* +@@ -404,7 +404,7 @@ static void update_vttbr(struct kvm *kvm) + kvm_call_hyp(__kvm_flush_vm_context); + } + +- kvm->arch.vmid_gen = atomic64_read(&kvm_vmid_gen); ++ kvm->arch.vmid_gen = atomic64_read_unchecked(&kvm_vmid_gen); + kvm->arch.vmid = kvm_next_vmid; + kvm_next_vmid++; + +@@ -980,7 +980,7 @@ static void check_kvm_target_cpu(void *ret) + /** + * Initialize Hyp-mode and memory mappings on all CPUs. + */ +-int kvm_arch_init(void *opaque) ++int kvm_arch_init(const void *opaque) + { + int err; + int ret, cpu; +diff --git a/arch/arm/lib/clear_user.S b/arch/arm/lib/clear_user.S +index 14a0d98..7771a7d 100644 +--- a/arch/arm/lib/clear_user.S ++++ b/arch/arm/lib/clear_user.S +@@ -12,14 +12,14 @@ + + .text + +-/* Prototype: int __clear_user(void *addr, size_t sz) ++/* Prototype: int ___clear_user(void *addr, size_t sz) + * Purpose : clear some user memory + * Params : addr - user memory address to clear + * : sz - number of bytes to clear + * Returns : number of bytes NOT cleared + */ + ENTRY(__clear_user_std) +-WEAK(__clear_user) ++WEAK(___clear_user) + stmfd sp!, {r1, lr} + mov r2, #0 + cmp r1, #4 +@@ -44,7 +44,7 @@ WEAK(__clear_user) + USER( strnebt r2, [r0]) + mov r0, #0 + ldmfd sp!, {r1, pc} +-ENDPROC(__clear_user) ++ENDPROC(___clear_user) + ENDPROC(__clear_user_std) + + .pushsection .fixup,"ax" +diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S +index 66a477a..bee61d3 100644 +--- a/arch/arm/lib/copy_from_user.S ++++ b/arch/arm/lib/copy_from_user.S +@@ -16,7 +16,7 @@ + /* + * Prototype: + * +- * size_t __copy_from_user(void *to, const void *from, size_t n) ++ * size_t ___copy_from_user(void *to, const void *from, size_t n) + * + * Purpose: + * +@@ -84,11 +84,11 @@ + + .text + +-ENTRY(__copy_from_user) ++ENTRY(___copy_from_user) + + #include "copy_template.S" + +-ENDPROC(__copy_from_user) ++ENDPROC(___copy_from_user) + + .pushsection .fixup,"ax" + .align 0 +diff --git a/arch/arm/lib/copy_page.S b/arch/arm/lib/copy_page.S +index 6ee2f67..d1cce76 100644 +--- a/arch/arm/lib/copy_page.S ++++ b/arch/arm/lib/copy_page.S +@@ -10,6 +10,7 @@ + * ASM optimised string functions + */ + #include <linux/linkage.h> ++#include <linux/const.h> + #include <asm/assembler.h> + #include <asm/asm-offsets.h> + #include <asm/cache.h> +diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S +index d066df6..df28194 100644 +--- a/arch/arm/lib/copy_to_user.S ++++ b/arch/arm/lib/copy_to_user.S +@@ -16,7 +16,7 @@ + /* + * Prototype: + * +- * size_t __copy_to_user(void *to, const void *from, size_t n) ++ * size_t ___copy_to_user(void *to, const void *from, size_t n) + * + * Purpose: + * +@@ -88,11 +88,11 @@ + .text + + ENTRY(__copy_to_user_std) +-WEAK(__copy_to_user) ++WEAK(___copy_to_user) + + #include "copy_template.S" + +-ENDPROC(__copy_to_user) ++ENDPROC(___copy_to_user) + ENDPROC(__copy_to_user_std) + + .pushsection .fixup,"ax" +diff --git a/arch/arm/lib/csumpartialcopyuser.S b/arch/arm/lib/csumpartialcopyuser.S +index 7d08b43..f7ca7ea 100644 +--- a/arch/arm/lib/csumpartialcopyuser.S ++++ b/arch/arm/lib/csumpartialcopyuser.S +@@ -57,8 +57,8 @@ + * Returns : r0 = checksum, [[sp, #0], #0] = 0 or -EFAULT + */ + +-#define FN_ENTRY ENTRY(csum_partial_copy_from_user) +-#define FN_EXIT ENDPROC(csum_partial_copy_from_user) ++#define FN_ENTRY ENTRY(__csum_partial_copy_from_user) ++#define FN_EXIT ENDPROC(__csum_partial_copy_from_user) + + #include "csumpartialcopygeneric.S" + +diff --git a/arch/arm/lib/delay.c b/arch/arm/lib/delay.c +index 312d43e..21d2322 100644 +--- a/arch/arm/lib/delay.c ++++ b/arch/arm/lib/delay.c +@@ -29,7 +29,7 @@ + /* + * Default to the loop-based delay implementation. + */ +-struct arm_delay_ops arm_delay_ops = { ++struct arm_delay_ops arm_delay_ops __read_only = { + .delay = __loop_delay, + .const_udelay = __loop_const_udelay, + .udelay = __loop_udelay, +diff --git a/arch/arm/lib/uaccess_with_memcpy.c b/arch/arm/lib/uaccess_with_memcpy.c +index 3e58d71..029817c 100644 +--- a/arch/arm/lib/uaccess_with_memcpy.c ++++ b/arch/arm/lib/uaccess_with_memcpy.c +@@ -136,7 +136,7 @@ out: + } + + unsigned long +-__copy_to_user(void __user *to, const void *from, unsigned long n) ++___copy_to_user(void __user *to, const void *from, unsigned long n) + { + /* + * This test is stubbed out of the main function above to keep +@@ -190,7 +190,7 @@ out: + return n; + } + +-unsigned long __clear_user(void __user *addr, unsigned long n) ++unsigned long ___clear_user(void __user *addr, unsigned long n) + { + /* See rational for this in __copy_to_user() above. */ + if (n < 64) +diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c +index 9610792..4dfb851 100644 +--- a/arch/arm/mach-at91/setup.c ++++ b/arch/arm/mach-at91/setup.c +@@ -83,7 +83,7 @@ void __init at91_init_sram(int bank, unsigned long base, unsigned int length) + + desc->pfn = __phys_to_pfn(base); + desc->length = length; +- desc->type = MT_MEMORY_RWX_NONCACHED; ++ desc->type = MT_MEMORY_RW_NONCACHED; + + pr_info("sram at 0x%lx of 0x%x mapped at 0x%lx\n", + base, length, desc->virtual); +diff --git a/arch/arm/mach-keystone/keystone.c b/arch/arm/mach-keystone/keystone.c +index 7f352de..6dc0929 100644 +--- a/arch/arm/mach-keystone/keystone.c ++++ b/arch/arm/mach-keystone/keystone.c +@@ -27,7 +27,7 @@ + + #include "keystone.h" + +-static struct notifier_block platform_nb; ++static notifier_block_no_const platform_nb; + static unsigned long keystone_dma_pfn_offset __read_mostly; + + static int keystone_platform_notifier(struct notifier_block *nb, +diff --git a/arch/arm/mach-mvebu/coherency.c b/arch/arm/mach-mvebu/coherency.c +index 2ffccd4..69ffe115 100644 +--- a/arch/arm/mach-mvebu/coherency.c ++++ b/arch/arm/mach-mvebu/coherency.c +@@ -316,7 +316,7 @@ static void __init armada_370_coherency_init(struct device_node *np) + + /* + * This ioremap hook is used on Armada 375/38x to ensure that PCIe +- * memory areas are mapped as MT_UNCACHED instead of MT_DEVICE. This ++ * memory areas are mapped as MT_UNCACHED_RW instead of MT_DEVICE. This + * is needed as a workaround for a deadlock issue between the PCIe + * interface and the cache controller. + */ +@@ -329,7 +329,7 @@ armada_pcie_wa_ioremap_caller(phys_addr_t phys_addr, size_t size, + mvebu_mbus_get_pcie_mem_aperture(&pcie_mem); + + if (pcie_mem.start <= phys_addr && (phys_addr + size) <= pcie_mem.end) +- mtype = MT_UNCACHED; ++ mtype = MT_UNCACHED_RW; + + return __arm_ioremap_caller(phys_addr, size, mtype, caller); + } +diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c +index 97767a2..9233746 100644 +--- a/arch/arm/mach-omap2/board-n8x0.c ++++ b/arch/arm/mach-omap2/board-n8x0.c +@@ -569,7 +569,7 @@ static int n8x0_menelaus_late_init(struct device *dev) + } + #endif + +-struct menelaus_platform_data n8x0_menelaus_platform_data __initdata = { ++struct menelaus_platform_data n8x0_menelaus_platform_data __initconst = { + .late_init = n8x0_menelaus_late_init, + }; + +diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c +index 5fa3755..1e8c247 100644 +--- a/arch/arm/mach-omap2/gpmc.c ++++ b/arch/arm/mach-omap2/gpmc.c +@@ -151,7 +151,6 @@ struct omap3_gpmc_regs { + }; + + static struct gpmc_client_irq gpmc_client_irq[GPMC_NR_IRQ]; +-static struct irq_chip gpmc_irq_chip; + static int gpmc_irq_start; + + static struct resource gpmc_mem_root; +@@ -736,6 +735,18 @@ static void gpmc_irq_noop(struct irq_data *data) { } + + static unsigned int gpmc_irq_noop_ret(struct irq_data *data) { return 0; } + ++static struct irq_chip gpmc_irq_chip = { ++ .name = "gpmc", ++ .irq_startup = gpmc_irq_noop_ret, ++ .irq_enable = gpmc_irq_enable, ++ .irq_disable = gpmc_irq_disable, ++ .irq_shutdown = gpmc_irq_noop, ++ .irq_ack = gpmc_irq_noop, ++ .irq_mask = gpmc_irq_noop, ++ .irq_unmask = gpmc_irq_noop, ++ ++}; ++ + static int gpmc_setup_irq(void) + { + int i; +@@ -750,15 +761,6 @@ static int gpmc_setup_irq(void) + return gpmc_irq_start; + } + +- gpmc_irq_chip.name = "gpmc"; +- gpmc_irq_chip.irq_startup = gpmc_irq_noop_ret; +- gpmc_irq_chip.irq_enable = gpmc_irq_enable; +- gpmc_irq_chip.irq_disable = gpmc_irq_disable; +- gpmc_irq_chip.irq_shutdown = gpmc_irq_noop; +- gpmc_irq_chip.irq_ack = gpmc_irq_noop; +- gpmc_irq_chip.irq_mask = gpmc_irq_noop; +- gpmc_irq_chip.irq_unmask = gpmc_irq_noop; +- + gpmc_client_irq[0].bitmask = GPMC_IRQ_FIFOEVENTENABLE; + gpmc_client_irq[1].bitmask = GPMC_IRQ_COUNT_EVENT; + +diff --git a/arch/arm/mach-omap2/omap-mpuss-lowpower.c b/arch/arm/mach-omap2/omap-mpuss-lowpower.c +index 6944ae3..bc587ca 100644 +--- a/arch/arm/mach-omap2/omap-mpuss-lowpower.c ++++ b/arch/arm/mach-omap2/omap-mpuss-lowpower.c +@@ -86,7 +86,7 @@ struct cpu_pm_ops { + void (*resume)(void); + void (*scu_prepare)(unsigned int cpu_id, unsigned int cpu_state); + void (*hotplug_restart)(void); +-}; ++} __no_const; + + static DEFINE_PER_CPU(struct omap4_cpu_pm_info, omap4_pm_info); + static struct powerdomain *mpuss_pd; +@@ -105,7 +105,7 @@ static void dummy_cpu_resume(void) + static void dummy_scu_prepare(unsigned int cpu_id, unsigned int cpu_state) + {} + +-struct cpu_pm_ops omap_pm_ops = { ++static struct cpu_pm_ops omap_pm_ops __read_only = { + .finish_suspend = default_finish_suspend, + .resume = dummy_cpu_resume, + .scu_prepare = dummy_scu_prepare, +diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c +index 5305ec7..6d74045 100644 +--- a/arch/arm/mach-omap2/omap-smp.c ++++ b/arch/arm/mach-omap2/omap-smp.c +@@ -19,6 +19,7 @@ + #include <linux/device.h> + #include <linux/smp.h> + #include <linux/io.h> ++#include <linux/irq.h> + #include <linux/irqchip/arm-gic.h> + + #include <asm/smp_scu.h> +diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c +index f961c46..4a453dc 100644 +--- a/arch/arm/mach-omap2/omap-wakeupgen.c ++++ b/arch/arm/mach-omap2/omap-wakeupgen.c +@@ -344,7 +344,7 @@ static int irq_cpu_hotplug_notify(struct notifier_block *self, + return NOTIFY_OK; + } + +-static struct notifier_block __refdata irq_hotplug_notifier = { ++static struct notifier_block irq_hotplug_notifier = { + .notifier_call = irq_cpu_hotplug_notify, + }; + +diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c +index 8c58b71..95b655f 100644 +--- a/arch/arm/mach-omap2/omap_device.c ++++ b/arch/arm/mach-omap2/omap_device.c +@@ -510,7 +510,7 @@ void omap_device_delete(struct omap_device *od) + struct platform_device __init *omap_device_build(const char *pdev_name, + int pdev_id, + struct omap_hwmod *oh, +- void *pdata, int pdata_len) ++ const void *pdata, int pdata_len) + { + struct omap_hwmod *ohs[] = { oh }; + +@@ -538,7 +538,7 @@ struct platform_device __init *omap_device_build(const char *pdev_name, + struct platform_device __init *omap_device_build_ss(const char *pdev_name, + int pdev_id, + struct omap_hwmod **ohs, +- int oh_cnt, void *pdata, ++ int oh_cnt, const void *pdata, + int pdata_len) + { + int ret = -ENOMEM; +diff --git a/arch/arm/mach-omap2/omap_device.h b/arch/arm/mach-omap2/omap_device.h +index 78c02b3..c94109a 100644 +--- a/arch/arm/mach-omap2/omap_device.h ++++ b/arch/arm/mach-omap2/omap_device.h +@@ -72,12 +72,12 @@ int omap_device_idle(struct platform_device *pdev); + /* Core code interface */ + + struct platform_device *omap_device_build(const char *pdev_name, int pdev_id, +- struct omap_hwmod *oh, void *pdata, ++ struct omap_hwmod *oh, const void *pdata, + int pdata_len); + + struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id, + struct omap_hwmod **oh, int oh_cnt, +- void *pdata, int pdata_len); ++ const void *pdata, int pdata_len); + + struct omap_device *omap_device_alloc(struct platform_device *pdev, + struct omap_hwmod **ohs, int oh_cnt); +diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c +index 716247e..8df346d 100644 +--- a/arch/arm/mach-omap2/omap_hwmod.c ++++ b/arch/arm/mach-omap2/omap_hwmod.c +@@ -194,10 +194,10 @@ struct omap_hwmod_soc_ops { + int (*init_clkdm)(struct omap_hwmod *oh); + void (*update_context_lost)(struct omap_hwmod *oh); + int (*get_context_lost)(struct omap_hwmod *oh); +-}; ++} __no_const; + + /* soc_ops: adapts the omap_hwmod code to the currently-booted SoC */ +-static struct omap_hwmod_soc_ops soc_ops; ++static struct omap_hwmod_soc_ops soc_ops __read_only; + + /* omap_hwmod_list contains all registered struct omap_hwmods */ + static LIST_HEAD(omap_hwmod_list); +diff --git a/arch/arm/mach-omap2/powerdomains43xx_data.c b/arch/arm/mach-omap2/powerdomains43xx_data.c +index 95fee54..cfa9cf1 100644 +--- a/arch/arm/mach-omap2/powerdomains43xx_data.c ++++ b/arch/arm/mach-omap2/powerdomains43xx_data.c +@@ -10,6 +10,7 @@ + + #include <linux/kernel.h> + #include <linux/init.h> ++#include <asm/pgtable.h> + + #include "powerdomain.h" + +@@ -129,7 +130,9 @@ static int am43xx_check_vcvp(void) + + void __init am43xx_powerdomains_init(void) + { +- omap4_pwrdm_operations.pwrdm_has_voltdm = am43xx_check_vcvp; ++ pax_open_kernel(); ++ *(void **)&omap4_pwrdm_operations.pwrdm_has_voltdm = am43xx_check_vcvp; ++ pax_close_kernel(); + pwrdm_register_platform_funcs(&omap4_pwrdm_operations); + pwrdm_register_pwrdms(powerdomains_am43xx); + pwrdm_complete_init(); +diff --git a/arch/arm/mach-omap2/wd_timer.c b/arch/arm/mach-omap2/wd_timer.c +index ff0a68c..b312aa0 100644 +--- a/arch/arm/mach-omap2/wd_timer.c ++++ b/arch/arm/mach-omap2/wd_timer.c +@@ -110,7 +110,9 @@ static int __init omap_init_wdt(void) + struct omap_hwmod *oh; + char *oh_name = "wd_timer2"; + char *dev_name = "omap_wdt"; +- struct omap_wd_timer_platform_data pdata; ++ static struct omap_wd_timer_platform_data pdata = { ++ .read_reset_sources = prm_read_reset_sources ++ }; + + if (!cpu_class_is_omap2() || of_have_populated_dt()) + return 0; +@@ -121,8 +123,6 @@ static int __init omap_init_wdt(void) + return -EINVAL; + } + +- pdata.read_reset_sources = prm_read_reset_sources; +- + pdev = omap_device_build(dev_name, id, oh, &pdata, + sizeof(struct omap_wd_timer_platform_data)); + WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", +diff --git a/arch/arm/mach-tegra/cpuidle-tegra20.c b/arch/arm/mach-tegra/cpuidle-tegra20.c +index b30bf5c..d0825bf 100644 +--- a/arch/arm/mach-tegra/cpuidle-tegra20.c ++++ b/arch/arm/mach-tegra/cpuidle-tegra20.c +@@ -180,7 +180,7 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev, + bool entered_lp2 = false; + + if (tegra_pending_sgi()) +- ACCESS_ONCE(abort_flag) = true; ++ ACCESS_ONCE_RW(abort_flag) = true; + + cpuidle_coupled_parallel_barrier(dev, &abort_barrier); + +diff --git a/arch/arm/mach-tegra/irq.c b/arch/arm/mach-tegra/irq.c +index ab95f53..4b977a7 100644 +--- a/arch/arm/mach-tegra/irq.c ++++ b/arch/arm/mach-tegra/irq.c +@@ -20,6 +20,7 @@ + #include <linux/cpu_pm.h> + #include <linux/interrupt.h> + #include <linux/io.h> ++#include <linux/irq.h> + #include <linux/irqchip/arm-gic.h> + #include <linux/irq.h> + #include <linux/kernel.h> +diff --git a/arch/arm/mach-ux500/pm.c b/arch/arm/mach-ux500/pm.c +index b80a9a2..f43beeb 100644 +--- a/arch/arm/mach-ux500/pm.c ++++ b/arch/arm/mach-ux500/pm.c +@@ -10,6 +10,7 @@ + */ + + #include <linux/kernel.h> ++#include <linux/irq.h> + #include <linux/irqchip/arm-gic.h> + #include <linux/delay.h> + #include <linux/io.h> +diff --git a/arch/arm/mach-ux500/setup.h b/arch/arm/mach-ux500/setup.h +index 2dea8b5..6499da2 100644 +--- a/arch/arm/mach-ux500/setup.h ++++ b/arch/arm/mach-ux500/setup.h +@@ -33,13 +33,6 @@ extern void ux500_timer_init(void); + .type = MT_DEVICE, \ + } + +-#define __MEM_DEV_DESC(x, sz) { \ +- .virtual = IO_ADDRESS(x), \ +- .pfn = __phys_to_pfn(x), \ +- .length = sz, \ +- .type = MT_MEMORY_RWX, \ +-} +- + extern struct smp_operations ux500_smp_ops; + extern void ux500_cpu_die(unsigned int cpu); + +diff --git a/arch/arm/mach-zynq/platsmp.c b/arch/arm/mach-zynq/platsmp.c +index 52d768f..5f93180 100644 +--- a/arch/arm/mach-zynq/platsmp.c ++++ b/arch/arm/mach-zynq/platsmp.c +@@ -24,6 +24,7 @@ + #include <linux/io.h> + #include <asm/cacheflush.h> + #include <asm/smp_scu.h> ++#include <linux/irq.h> + #include <linux/irqchip/arm-gic.h> + #include "common.h" + +diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig +index 7eb94e6..799ad3e 100644 +--- a/arch/arm/mm/Kconfig ++++ b/arch/arm/mm/Kconfig +@@ -446,6 +446,7 @@ config CPU_32v5 + + config CPU_32v6 + bool ++ select CPU_USE_DOMAINS if CPU_V6 && MMU && !PAX_KERNEXEC && !PAX_MEMORY_UDEREF + select TLS_REG_EMUL if !CPU_32v6K && !MMU + + config CPU_32v6K +@@ -600,6 +601,7 @@ config CPU_CP15_MPU + + config CPU_USE_DOMAINS + bool ++ depends on !ARM_LPAE && !PAX_KERNEXEC && !PAX_MEMORY_UDEREF + help + This option enables or disables the use of domain switching + via the set_fs() function. +@@ -798,7 +800,7 @@ config NEED_KUSER_HELPERS + + config KUSER_HELPERS + bool "Enable kuser helpers in vector page" if !NEED_KUSER_HELPERS +- depends on MMU ++ depends on MMU && (!(CPU_V6 || CPU_V6K || CPU_V7) || GRKERNSEC_OLD_ARM_USERLAND) + default y + help + Warning: disabling this option may break user programs. +@@ -812,7 +814,7 @@ config KUSER_HELPERS + See Documentation/arm/kernel_user_helpers.txt for details. + + However, the fixed address nature of these helpers can be used +- by ROP (return orientated programming) authors when creating ++ by ROP (Return Oriented Programming) authors when creating + exploits. + + If all of the binaries and libraries which run on your platform +diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c +index 83792f4..c25d36b 100644 +--- a/arch/arm/mm/alignment.c ++++ b/arch/arm/mm/alignment.c +@@ -216,10 +216,12 @@ union offset_union { + #define __get16_unaligned_check(ins,val,addr) \ + do { \ + unsigned int err = 0, v, a = addr; \ ++ pax_open_userland(); \ + __get8_unaligned_check(ins,v,a,err); \ + val = v << ((BE) ? 8 : 0); \ + __get8_unaligned_check(ins,v,a,err); \ + val |= v << ((BE) ? 0 : 8); \ ++ pax_close_userland(); \ + if (err) \ + goto fault; \ + } while (0) +@@ -233,6 +235,7 @@ union offset_union { + #define __get32_unaligned_check(ins,val,addr) \ + do { \ + unsigned int err = 0, v, a = addr; \ ++ pax_open_userland(); \ + __get8_unaligned_check(ins,v,a,err); \ + val = v << ((BE) ? 24 : 0); \ + __get8_unaligned_check(ins,v,a,err); \ +@@ -241,6 +244,7 @@ union offset_union { + val |= v << ((BE) ? 8 : 16); \ + __get8_unaligned_check(ins,v,a,err); \ + val |= v << ((BE) ? 0 : 24); \ ++ pax_close_userland(); \ + if (err) \ + goto fault; \ + } while (0) +@@ -254,6 +258,7 @@ union offset_union { + #define __put16_unaligned_check(ins,val,addr) \ + do { \ + unsigned int err = 0, v = val, a = addr; \ ++ pax_open_userland(); \ + __asm__( FIRST_BYTE_16 \ + ARM( "1: "ins" %1, [%2], #1\n" ) \ + THUMB( "1: "ins" %1, [%2]\n" ) \ +@@ -273,6 +278,7 @@ union offset_union { + " .popsection\n" \ + : "=r" (err), "=&r" (v), "=&r" (a) \ + : "0" (err), "1" (v), "2" (a)); \ ++ pax_close_userland(); \ + if (err) \ + goto fault; \ + } while (0) +@@ -286,6 +292,7 @@ union offset_union { + #define __put32_unaligned_check(ins,val,addr) \ + do { \ + unsigned int err = 0, v = val, a = addr; \ ++ pax_open_userland(); \ + __asm__( FIRST_BYTE_32 \ + ARM( "1: "ins" %1, [%2], #1\n" ) \ + THUMB( "1: "ins" %1, [%2]\n" ) \ +@@ -315,6 +322,7 @@ union offset_union { + " .popsection\n" \ + : "=r" (err), "=&r" (v), "=&r" (a) \ + : "0" (err), "1" (v), "2" (a)); \ ++ pax_close_userland(); \ + if (err) \ + goto fault; \ + } while (0) +diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c +index 5e65ca8..879e7b3 100644 +--- a/arch/arm/mm/cache-l2x0.c ++++ b/arch/arm/mm/cache-l2x0.c +@@ -42,7 +42,7 @@ struct l2c_init_data { + void (*fixup)(void __iomem *, u32, struct outer_cache_fns *); + void (*save)(void __iomem *); + struct outer_cache_fns outer_cache; +-}; ++} __do_const; + + #define CACHE_LINE_SIZE 32 + +diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c +index 4370933..e77848e 100644 +--- a/arch/arm/mm/context.c ++++ b/arch/arm/mm/context.c +@@ -43,7 +43,7 @@ + #define NUM_USER_ASIDS ASID_FIRST_VERSION + + static DEFINE_RAW_SPINLOCK(cpu_asid_lock); +-static atomic64_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION); ++static atomic64_unchecked_t asid_generation = ATOMIC64_INIT(ASID_FIRST_VERSION); + static DECLARE_BITMAP(asid_map, NUM_USER_ASIDS); + + static DEFINE_PER_CPU(atomic64_t, active_asids); +@@ -178,7 +178,7 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu) + { + static u32 cur_idx = 1; + u64 asid = atomic64_read(&mm->context.id); +- u64 generation = atomic64_read(&asid_generation); ++ u64 generation = atomic64_read_unchecked(&asid_generation); + + if (asid != 0 && is_reserved_asid(asid)) { + /* +@@ -199,7 +199,7 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu) + */ + asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, cur_idx); + if (asid == NUM_USER_ASIDS) { +- generation = atomic64_add_return(ASID_FIRST_VERSION, ++ generation = atomic64_add_return_unchecked(ASID_FIRST_VERSION, + &asid_generation); + flush_context(cpu); + asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, 1); +@@ -230,14 +230,14 @@ void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk) + cpu_set_reserved_ttbr0(); + + asid = atomic64_read(&mm->context.id); +- if (!((asid ^ atomic64_read(&asid_generation)) >> ASID_BITS) ++ if (!((asid ^ atomic64_read_unchecked(&asid_generation)) >> ASID_BITS) + && atomic64_xchg(&per_cpu(active_asids, cpu), asid)) + goto switch_mm_fastpath; + + raw_spin_lock_irqsave(&cpu_asid_lock, flags); + /* Check that our ASID belongs to the current generation. */ + asid = atomic64_read(&mm->context.id); +- if ((asid ^ atomic64_read(&asid_generation)) >> ASID_BITS) { ++ if ((asid ^ atomic64_read_unchecked(&asid_generation)) >> ASID_BITS) { + asid = new_context(mm, cpu); + atomic64_set(&mm->context.id, asid); + } +diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c +index eb8830a..e8ff52e 100644 +--- a/arch/arm/mm/fault.c ++++ b/arch/arm/mm/fault.c +@@ -25,6 +25,7 @@ + #include <asm/system_misc.h> + #include <asm/system_info.h> + #include <asm/tlbflush.h> ++#include <asm/sections.h> + + #include "fault.h" + +@@ -138,6 +139,31 @@ __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr, + if (fixup_exception(regs)) + return; + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (addr < TASK_SIZE) { ++ if (current->signal->curr_ip) ++ printk(KERN_ERR "PAX: From %pI4: %s:%d, uid/euid: %u/%u, attempted to access userland memory at %08lx\n", ¤t->signal->curr_ip, current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid()), addr); ++ else ++ printk(KERN_ERR "PAX: %s:%d, uid/euid: %u/%u, attempted to access userland memory at %08lx\n", current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid()), addr); ++ } ++#endif ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ if ((fsr & FSR_WRITE) && ++ (((unsigned long)_stext <= addr && addr < init_mm.end_code) || ++ (MODULES_VADDR <= addr && addr < MODULES_END))) ++ { ++ if (current->signal->curr_ip) ++ printk(KERN_ERR "PAX: From %pI4: %s:%d, uid/euid: %u/%u, attempted to modify kernel code\n", ¤t->signal->curr_ip, current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid())); ++ else ++ printk(KERN_ERR "PAX: %s:%d, uid/euid: %u/%u, attempted to modify kernel code\n", current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid())); ++ } ++#endif ++ + /* + * No handler, we'll have to terminate things with extreme prejudice. + */ +@@ -174,6 +200,13 @@ __do_user_fault(struct task_struct *tsk, unsigned long addr, + } + #endif + ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (fsr & FSR_LNX_PF) { ++ pax_report_fault(regs, (void *)regs->ARM_pc, (void *)regs->ARM_sp); ++ do_group_exit(SIGKILL); ++ } ++#endif ++ + tsk->thread.address = addr; + tsk->thread.error_code = fsr; + tsk->thread.trap_no = 14; +@@ -401,6 +434,33 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) + } + #endif /* CONFIG_MMU */ + ++#ifdef CONFIG_PAX_PAGEEXEC ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 20; i++) { ++ unsigned char c; ++ if (get_user(c, (__force unsigned char __user *)pc+i)) ++ printk(KERN_CONT "?? "); ++ else ++ printk(KERN_CONT "%02x ", c); ++ } ++ printk("\n"); ++ ++ printk(KERN_ERR "PAX: bytes at SP-4: "); ++ for (i = -1; i < 20; i++) { ++ unsigned long c; ++ if (get_user(c, (__force unsigned long __user *)sp+i)) ++ printk(KERN_CONT "???????? "); ++ else ++ printk(KERN_CONT "%08lx ", c); ++ } ++ printk("\n"); ++} ++#endif ++ + /* + * First Level Translation Fault Handler + * +@@ -548,9 +608,22 @@ do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs) + const struct fsr_info *inf = fsr_info + fsr_fs(fsr); + struct siginfo info; + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (addr < TASK_SIZE && is_domain_fault(fsr)) { ++ if (current->signal->curr_ip) ++ printk(KERN_ERR "PAX: From %pI4: %s:%d, uid/euid: %u/%u, attempted to access userland memory at %08lx\n", ¤t->signal->curr_ip, current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid()), addr); ++ else ++ printk(KERN_ERR "PAX: %s:%d, uid/euid: %u/%u, attempted to access userland memory at %08lx\n", current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid()), addr); ++ goto die; ++ } ++#endif ++ + if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs)) + return; + ++die: + printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n", + inf->name, fsr, addr); + +@@ -574,15 +647,104 @@ hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs * + ifsr_info[nr].name = name; + } + ++asmlinkage int sys_sigreturn(struct pt_regs *regs); ++asmlinkage int sys_rt_sigreturn(struct pt_regs *regs); ++ + asmlinkage void __exception + do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs) + { + const struct fsr_info *inf = ifsr_info + fsr_fs(ifsr); + struct siginfo info; ++ unsigned long pc = instruction_pointer(regs); ++ ++ if (user_mode(regs)) { ++ unsigned long sigpage = current->mm->context.sigpage; ++ ++ if (sigpage <= pc && pc < sigpage + 7*4) { ++ if (pc < sigpage + 3*4) ++ sys_sigreturn(regs); ++ else ++ sys_rt_sigreturn(regs); ++ return; ++ } ++ if (pc == 0xffff0f60UL) { ++ /* ++ * PaX: __kuser_cmpxchg64 emulation ++ */ ++ // TODO ++ //regs->ARM_pc = regs->ARM_lr; ++ //return; ++ } ++ if (pc == 0xffff0fa0UL) { ++ /* ++ * PaX: __kuser_memory_barrier emulation ++ */ ++ // dmb(); implied by the exception ++ regs->ARM_pc = regs->ARM_lr; ++ return; ++ } ++ if (pc == 0xffff0fc0UL) { ++ /* ++ * PaX: __kuser_cmpxchg emulation ++ */ ++ // TODO ++ //long new; ++ //int op; ++ ++ //op = FUTEX_OP_SET << 28; ++ //new = futex_atomic_op_inuser(op, regs->ARM_r2); ++ //regs->ARM_r0 = old != new; ++ //regs->ARM_pc = regs->ARM_lr; ++ //return; ++ } ++ if (pc == 0xffff0fe0UL) { ++ /* ++ * PaX: __kuser_get_tls emulation ++ */ ++ regs->ARM_r0 = current_thread_info()->tp_value[0]; ++ regs->ARM_pc = regs->ARM_lr; ++ return; ++ } ++ } ++ ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ else if (is_domain_fault(ifsr) || is_xn_fault(ifsr)) { ++ if (current->signal->curr_ip) ++ printk(KERN_ERR "PAX: From %pI4: %s:%d, uid/euid: %u/%u, attempted to execute %s memory at %08lx\n", ¤t->signal->curr_ip, current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid()), ++ pc >= TASK_SIZE ? "non-executable kernel" : "userland", pc); ++ else ++ printk(KERN_ERR "PAX: %s:%d, uid/euid: %u/%u, attempted to execute %s memory at %08lx\n", current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid()), ++ pc >= TASK_SIZE ? "non-executable kernel" : "userland", pc); ++ goto die; ++ } ++#endif ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ if (fsr_fs(ifsr) == FAULT_CODE_DEBUG) { ++#ifdef CONFIG_THUMB2_KERNEL ++ unsigned short bkpt; ++ ++ if (!probe_kernel_address(pc, bkpt) && cpu_to_le16(bkpt) == 0xbef1) { ++#else ++ unsigned int bkpt; ++ ++ if (!probe_kernel_address(pc, bkpt) && cpu_to_le32(bkpt) == 0xe12f1073) { ++#endif ++ current->thread.error_code = ifsr; ++ current->thread.trap_no = 0; ++ pax_report_refcount_overflow(regs); ++ fixup_exception(regs); ++ return; ++ } ++ } ++#endif + + if (!inf->fn(addr, ifsr | FSR_LNX_PF, regs)) + return; + ++die: + printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", + inf->name, ifsr, addr); + +diff --git a/arch/arm/mm/fault.h b/arch/arm/mm/fault.h +index cf08bdf..772656c 100644 +--- a/arch/arm/mm/fault.h ++++ b/arch/arm/mm/fault.h +@@ -3,6 +3,7 @@ + + /* + * Fault status register encodings. We steal bit 31 for our own purposes. ++ * Set when the FSR value is from an instruction fault. + */ + #define FSR_LNX_PF (1 << 31) + #define FSR_WRITE (1 << 11) +@@ -22,6 +23,17 @@ static inline int fsr_fs(unsigned int fsr) + } + #endif + ++/* valid for LPAE and !LPAE */ ++static inline int is_xn_fault(unsigned int fsr) ++{ ++ return ((fsr_fs(fsr) & 0x3c) == 0xc); ++} ++ ++static inline int is_domain_fault(unsigned int fsr) ++{ ++ return ((fsr_fs(fsr) & 0xD) == 0x9); ++} ++ + void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs); + unsigned long search_exception_table(unsigned long addr); + +diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c +index 9481f85..6dae261 100644 +--- a/arch/arm/mm/init.c ++++ b/arch/arm/mm/init.c +@@ -31,6 +31,8 @@ + #include <asm/setup.h> + #include <asm/tlb.h> + #include <asm/fixmap.h> ++#include <asm/system_info.h> ++#include <asm/cp15.h> + + #include <asm/mach/arch.h> + #include <asm/mach/map.h> +@@ -619,7 +621,46 @@ void free_initmem(void) + { + #ifdef CONFIG_HAVE_TCM + extern char __tcm_start, __tcm_end; ++#endif + ++#ifdef CONFIG_PAX_KERNEXEC ++ unsigned long addr; ++ pgd_t *pgd; ++ pud_t *pud; ++ pmd_t *pmd; ++ int cpu_arch = cpu_architecture(); ++ unsigned int cr = get_cr(); ++ ++ if (cpu_arch >= CPU_ARCH_ARMv6 && (cr & CR_XP)) { ++ /* make pages tables, etc before .text NX */ ++ for (addr = PAGE_OFFSET; addr < (unsigned long)_stext; addr += SECTION_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ __section_update(pmd, addr, PMD_SECT_XN); ++ } ++ /* make init NX */ ++ for (addr = (unsigned long)__init_begin; addr < (unsigned long)_sdata; addr += SECTION_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ __section_update(pmd, addr, PMD_SECT_XN); ++ } ++ /* make kernel code/rodata RX */ ++ for (addr = (unsigned long)_stext; addr < (unsigned long)__init_begin; addr += SECTION_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++#ifdef CONFIG_ARM_LPAE ++ __section_update(pmd, addr, PMD_SECT_RDONLY); ++#else ++ __section_update(pmd, addr, PMD_SECT_APX|PMD_SECT_AP_WRITE); ++#endif ++ } ++ } ++#endif ++ ++#ifdef CONFIG_HAVE_TCM + poison_init_mem(&__tcm_start, &__tcm_end - &__tcm_start); + free_reserved_area(&__tcm_start, &__tcm_end, -1, "TCM link"); + #endif +diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c +index d1e5ad7..84dcbf2 100644 +--- a/arch/arm/mm/ioremap.c ++++ b/arch/arm/mm/ioremap.c +@@ -392,9 +392,9 @@ __arm_ioremap_exec(phys_addr_t phys_addr, size_t size, bool cached) + unsigned int mtype; + + if (cached) +- mtype = MT_MEMORY_RWX; ++ mtype = MT_MEMORY_RX; + else +- mtype = MT_MEMORY_RWX_NONCACHED; ++ mtype = MT_MEMORY_RX_NONCACHED; + + return __arm_ioremap_caller(phys_addr, size, mtype, + __builtin_return_address(0)); +diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c +index 5e85ed3..b10a7ed 100644 +--- a/arch/arm/mm/mmap.c ++++ b/arch/arm/mm/mmap.c +@@ -59,6 +59,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + struct vm_area_struct *vma; + int do_align = 0; + int aliasing = cache_is_vipt_aliasing(); ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + struct vm_unmapped_area_info info; + + /* +@@ -81,6 +82,10 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + if (len > TASK_SIZE) + return -ENOMEM; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + if (do_align) + addr = COLOUR_ALIGN(addr, pgoff); +@@ -88,8 +93,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + +@@ -99,6 +103,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + info.high_limit = TASK_SIZE; + info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; + info.align_offset = pgoff << PAGE_SHIFT; ++ info.threadstack_offset = offset; + return vm_unmapped_area(&info); + } + +@@ -112,6 +117,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + unsigned long addr = addr0; + int do_align = 0; + int aliasing = cache_is_vipt_aliasing(); ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + struct vm_unmapped_area_info info; + + /* +@@ -132,6 +138,10 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + return addr; + } + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + /* requesting a specific address */ + if (addr) { + if (do_align) +@@ -139,8 +149,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + else + addr = PAGE_ALIGN(addr); + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + +@@ -150,6 +159,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + info.high_limit = mm->mmap_base; + info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; + info.align_offset = pgoff << PAGE_SHIFT; ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + + /* +@@ -173,6 +183,10 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + { + unsigned long random_factor = 0UL; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + /* 8 bits of randomness in 20 address space bits */ + if ((current->flags & PF_RANDOMIZE) && + !(current->personality & ADDR_NO_RANDOMIZE)) +@@ -180,9 +194,21 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + + if (mmap_is_legacy()) { + mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base += mm->delta_mmap; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area; + } else { + mm->mmap_base = mmap_base(random_factor); ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base -= mm->delta_mmap + mm->delta_stack; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area_topdown; + } + } +diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c +index 9f98cec..115fcb6 100644 +--- a/arch/arm/mm/mmu.c ++++ b/arch/arm/mm/mmu.c +@@ -40,6 +40,22 @@ + #include "mm.h" + #include "tcm.h" + ++#if defined(CONFIG_CPU_USE_DOMAINS) || defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++void modify_domain(unsigned int dom, unsigned int type) ++{ ++ struct thread_info *thread = current_thread_info(); ++ unsigned int domain = thread->cpu_domain; ++ /* ++ * DOMAIN_MANAGER might be defined to some other value, ++ * use the arch-defined constant ++ */ ++ domain &= ~domain_val(dom, 3); ++ thread->cpu_domain = domain | domain_val(dom, type); ++ set_domain(thread->cpu_domain); ++} ++EXPORT_SYMBOL(modify_domain); ++#endif ++ + /* + * empty_zero_page is a special page that is used for + * zero-initialized data and COW. +@@ -239,7 +255,15 @@ __setup("noalign", noalign_setup); + #define PROT_PTE_S2_DEVICE PROT_PTE_DEVICE + #define PROT_SECT_DEVICE PMD_TYPE_SECT|PMD_SECT_AP_WRITE + +-static struct mem_type mem_types[] = { ++#ifdef CONFIG_PAX_KERNEXEC ++#define L_PTE_KERNEXEC L_PTE_RDONLY ++#define PMD_SECT_KERNEXEC PMD_SECT_RDONLY ++#else ++#define L_PTE_KERNEXEC L_PTE_DIRTY ++#define PMD_SECT_KERNEXEC PMD_SECT_AP_WRITE ++#endif ++ ++static struct mem_type mem_types[] __read_only = { + [MT_DEVICE] = { /* Strongly ordered / ARMv6 shared device */ + .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED | + L_PTE_SHARED, +@@ -268,19 +292,19 @@ static struct mem_type mem_types[] = { + .prot_sect = PROT_SECT_DEVICE, + .domain = DOMAIN_IO, + }, +- [MT_UNCACHED] = { ++ [MT_UNCACHED_RW] = { + .prot_pte = PROT_PTE_DEVICE, + .prot_l1 = PMD_TYPE_TABLE, + .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, + .domain = DOMAIN_IO, + }, +- [MT_CACHECLEAN] = { +- .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, ++ [MT_CACHECLEAN_RO] = { ++ .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_RDONLY, + .domain = DOMAIN_KERNEL, + }, + #ifndef CONFIG_ARM_LPAE +- [MT_MINICLEAN] = { +- .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_MINICACHE, ++ [MT_MINICLEAN_RO] = { ++ .prot_sect = PMD_TYPE_SECT | PMD_SECT_MINICACHE | PMD_SECT_XN | PMD_SECT_RDONLY, + .domain = DOMAIN_KERNEL, + }, + #endif +@@ -288,15 +312,15 @@ static struct mem_type mem_types[] = { + .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | + L_PTE_RDONLY, + .prot_l1 = PMD_TYPE_TABLE, +- .domain = DOMAIN_USER, ++ .domain = DOMAIN_VECTORS, + }, + [MT_HIGH_VECTORS] = { + .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | + L_PTE_USER | L_PTE_RDONLY, + .prot_l1 = PMD_TYPE_TABLE, +- .domain = DOMAIN_USER, ++ .domain = DOMAIN_VECTORS, + }, +- [MT_MEMORY_RWX] = { ++ [__MT_MEMORY_RWX] = { + .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY, + .prot_l1 = PMD_TYPE_TABLE, + .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, +@@ -309,17 +333,30 @@ static struct mem_type mem_types[] = { + .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, + .domain = DOMAIN_KERNEL, + }, +- [MT_ROM] = { +- .prot_sect = PMD_TYPE_SECT, ++ [MT_MEMORY_RX] = { ++ .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_KERNEXEC, ++ .prot_l1 = PMD_TYPE_TABLE, ++ .prot_sect = PMD_TYPE_SECT | PMD_SECT_KERNEXEC, ++ .domain = DOMAIN_KERNEL, ++ }, ++ [MT_ROM_RX] = { ++ .prot_sect = PMD_TYPE_SECT | PMD_SECT_RDONLY, + .domain = DOMAIN_KERNEL, + }, +- [MT_MEMORY_RWX_NONCACHED] = { ++ [MT_MEMORY_RW_NONCACHED] = { + .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | + L_PTE_MT_BUFFERABLE, + .prot_l1 = PMD_TYPE_TABLE, + .prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE, + .domain = DOMAIN_KERNEL, + }, ++ [MT_MEMORY_RX_NONCACHED] = { ++ .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_KERNEXEC | ++ L_PTE_MT_BUFFERABLE, ++ .prot_l1 = PMD_TYPE_TABLE, ++ .prot_sect = PMD_TYPE_SECT | PMD_SECT_KERNEXEC, ++ .domain = DOMAIN_KERNEL, ++ }, + [MT_MEMORY_RW_DTCM] = { + .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | + L_PTE_XN, +@@ -327,9 +364,10 @@ static struct mem_type mem_types[] = { + .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, + .domain = DOMAIN_KERNEL, + }, +- [MT_MEMORY_RWX_ITCM] = { +- .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY, ++ [MT_MEMORY_RX_ITCM] = { ++ .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_KERNEXEC, + .prot_l1 = PMD_TYPE_TABLE, ++ .prot_sect = PMD_TYPE_SECT | PMD_SECT_KERNEXEC, + .domain = DOMAIN_KERNEL, + }, + [MT_MEMORY_RW_SO] = { +@@ -547,9 +585,14 @@ static void __init build_mem_type_table(void) + * Mark cache clean areas and XIP ROM read only + * from SVC mode and no access from userspace. + */ +- mem_types[MT_ROM].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; +- mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; +- mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; ++ mem_types[MT_ROM_RX].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; ++#ifdef CONFIG_PAX_KERNEXEC ++ mem_types[MT_MEMORY_RX].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; ++ mem_types[MT_MEMORY_RX_NONCACHED].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; ++ mem_types[MT_MEMORY_RX_ITCM].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; ++#endif ++ mem_types[MT_MINICLEAN_RO].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; ++ mem_types[MT_CACHECLEAN_RO].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; + #endif + + /* +@@ -566,13 +609,17 @@ static void __init build_mem_type_table(void) + mem_types[MT_DEVICE_WC].prot_pte |= L_PTE_SHARED; + mem_types[MT_DEVICE_CACHED].prot_sect |= PMD_SECT_S; + mem_types[MT_DEVICE_CACHED].prot_pte |= L_PTE_SHARED; +- mem_types[MT_MEMORY_RWX].prot_sect |= PMD_SECT_S; +- mem_types[MT_MEMORY_RWX].prot_pte |= L_PTE_SHARED; ++ mem_types[__MT_MEMORY_RWX].prot_sect |= PMD_SECT_S; ++ mem_types[__MT_MEMORY_RWX].prot_pte |= L_PTE_SHARED; + mem_types[MT_MEMORY_RW].prot_sect |= PMD_SECT_S; + mem_types[MT_MEMORY_RW].prot_pte |= L_PTE_SHARED; ++ mem_types[MT_MEMORY_RX].prot_sect |= PMD_SECT_S; ++ mem_types[MT_MEMORY_RX].prot_pte |= L_PTE_SHARED; + mem_types[MT_MEMORY_DMA_READY].prot_pte |= L_PTE_SHARED; +- mem_types[MT_MEMORY_RWX_NONCACHED].prot_sect |= PMD_SECT_S; +- mem_types[MT_MEMORY_RWX_NONCACHED].prot_pte |= L_PTE_SHARED; ++ mem_types[MT_MEMORY_RW_NONCACHED].prot_sect |= PMD_SECT_S; ++ mem_types[MT_MEMORY_RW_NONCACHED].prot_pte |= L_PTE_SHARED; ++ mem_types[MT_MEMORY_RX_NONCACHED].prot_sect |= PMD_SECT_S; ++ mem_types[MT_MEMORY_RX_NONCACHED].prot_pte |= L_PTE_SHARED; + } + } + +@@ -583,15 +630,20 @@ static void __init build_mem_type_table(void) + if (cpu_arch >= CPU_ARCH_ARMv6) { + if (cpu_arch >= CPU_ARCH_ARMv7 && (cr & CR_TRE)) { + /* Non-cacheable Normal is XCB = 001 */ +- mem_types[MT_MEMORY_RWX_NONCACHED].prot_sect |= ++ mem_types[MT_MEMORY_RW_NONCACHED].prot_sect |= ++ PMD_SECT_BUFFERED; ++ mem_types[MT_MEMORY_RX_NONCACHED].prot_sect |= + PMD_SECT_BUFFERED; + } else { + /* For both ARMv6 and non-TEX-remapping ARMv7 */ +- mem_types[MT_MEMORY_RWX_NONCACHED].prot_sect |= ++ mem_types[MT_MEMORY_RW_NONCACHED].prot_sect |= ++ PMD_SECT_TEX(1); ++ mem_types[MT_MEMORY_RX_NONCACHED].prot_sect |= + PMD_SECT_TEX(1); + } + } else { +- mem_types[MT_MEMORY_RWX_NONCACHED].prot_sect |= PMD_SECT_BUFFERABLE; ++ mem_types[MT_MEMORY_RW_NONCACHED].prot_sect |= PMD_SECT_BUFFERABLE; ++ mem_types[MT_MEMORY_RX_NONCACHED].prot_sect |= PMD_SECT_BUFFERABLE; + } + + #ifdef CONFIG_ARM_LPAE +@@ -607,6 +659,8 @@ static void __init build_mem_type_table(void) + vecs_pgprot |= PTE_EXT_AF; + #endif + ++ user_pgprot |= __supported_pte_mask; ++ + for (i = 0; i < 16; i++) { + pteval_t v = pgprot_val(protection_map[i]); + protection_map[i] = __pgprot(v | user_pgprot); +@@ -624,21 +678,24 @@ static void __init build_mem_type_table(void) + + mem_types[MT_LOW_VECTORS].prot_l1 |= ecc_mask; + mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask; +- mem_types[MT_MEMORY_RWX].prot_sect |= ecc_mask | cp->pmd; +- mem_types[MT_MEMORY_RWX].prot_pte |= kern_pgprot; ++ mem_types[__MT_MEMORY_RWX].prot_sect |= ecc_mask | cp->pmd; ++ mem_types[__MT_MEMORY_RWX].prot_pte |= kern_pgprot; + mem_types[MT_MEMORY_RW].prot_sect |= ecc_mask | cp->pmd; + mem_types[MT_MEMORY_RW].prot_pte |= kern_pgprot; ++ mem_types[MT_MEMORY_RX].prot_sect |= ecc_mask | cp->pmd; ++ mem_types[MT_MEMORY_RX].prot_pte |= kern_pgprot; + mem_types[MT_MEMORY_DMA_READY].prot_pte |= kern_pgprot; +- mem_types[MT_MEMORY_RWX_NONCACHED].prot_sect |= ecc_mask; +- mem_types[MT_ROM].prot_sect |= cp->pmd; ++ mem_types[MT_MEMORY_RW_NONCACHED].prot_sect |= ecc_mask; ++ mem_types[MT_MEMORY_RX_NONCACHED].prot_sect |= ecc_mask; ++ mem_types[MT_ROM_RX].prot_sect |= cp->pmd; + + switch (cp->pmd) { + case PMD_SECT_WT: +- mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_WT; ++ mem_types[MT_CACHECLEAN_RO].prot_sect |= PMD_SECT_WT; + break; + case PMD_SECT_WB: + case PMD_SECT_WBWA: +- mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_WB; ++ mem_types[MT_CACHECLEAN_RO].prot_sect |= PMD_SECT_WB; + break; + } + pr_info("Memory policy: %sData cache %s\n", +@@ -856,7 +913,7 @@ static void __init create_mapping(struct map_desc *md) + return; + } + +- if ((md->type == MT_DEVICE || md->type == MT_ROM) && ++ if ((md->type == MT_DEVICE || md->type == MT_ROM_RX) && + md->virtual >= PAGE_OFFSET && + (md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) { + printk(KERN_WARNING "BUG: mapping for 0x%08llx" +@@ -1224,18 +1281,15 @@ void __init arm_mm_memblock_reserve(void) + * called function. This means you can't use any function or debugging + * method which may touch any device, otherwise the kernel _will_ crash. + */ ++ ++static char vectors[PAGE_SIZE * 2] __read_only __aligned(PAGE_SIZE); ++ + static void __init devicemaps_init(const struct machine_desc *mdesc) + { + struct map_desc map; + unsigned long addr; +- void *vectors; + +- /* +- * Allocate the vector page early. +- */ +- vectors = early_alloc(PAGE_SIZE * 2); +- +- early_trap_init(vectors); ++ early_trap_init(&vectors); + + for (addr = VMALLOC_START; addr; addr += PMD_SIZE) + pmd_clear(pmd_off_k(addr)); +@@ -1248,7 +1302,7 @@ static void __init devicemaps_init(const struct machine_desc *mdesc) + map.pfn = __phys_to_pfn(CONFIG_XIP_PHYS_ADDR & SECTION_MASK); + map.virtual = MODULES_VADDR; + map.length = ((unsigned long)_etext - map.virtual + ~SECTION_MASK) & SECTION_MASK; +- map.type = MT_ROM; ++ map.type = MT_ROM_RX; + create_mapping(&map); + #endif + +@@ -1259,14 +1313,14 @@ static void __init devicemaps_init(const struct machine_desc *mdesc) + map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS); + map.virtual = FLUSH_BASE; + map.length = SZ_1M; +- map.type = MT_CACHECLEAN; ++ map.type = MT_CACHECLEAN_RO; + create_mapping(&map); + #endif + #ifdef FLUSH_BASE_MINICACHE + map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS + SZ_1M); + map.virtual = FLUSH_BASE_MINICACHE; + map.length = SZ_1M; +- map.type = MT_MINICLEAN; ++ map.type = MT_MINICLEAN_RO; + create_mapping(&map); + #endif + +@@ -1275,7 +1329,7 @@ static void __init devicemaps_init(const struct machine_desc *mdesc) + * location (0xffff0000). If we aren't using high-vectors, also + * create a mapping at the low-vectors virtual address. + */ +- map.pfn = __phys_to_pfn(virt_to_phys(vectors)); ++ map.pfn = __phys_to_pfn(virt_to_phys(&vectors)); + map.virtual = 0xffff0000; + map.length = PAGE_SIZE; + #ifdef CONFIG_KUSER_HELPERS +@@ -1335,8 +1389,10 @@ static void __init kmap_init(void) + static void __init map_lowmem(void) + { + struct memblock_region *reg; ++#ifndef CONFIG_PAX_KERNEXEC + unsigned long kernel_x_start = round_down(__pa(_stext), SECTION_SIZE); + unsigned long kernel_x_end = round_up(__pa(__init_end), SECTION_SIZE); ++#endif + + /* Map all the lowmem memory banks. */ + for_each_memblock(memory, reg) { +@@ -1349,11 +1405,48 @@ static void __init map_lowmem(void) + if (start >= end) + break; + ++#ifdef CONFIG_PAX_KERNEXEC ++ map.pfn = __phys_to_pfn(start); ++ map.virtual = __phys_to_virt(start); ++ map.length = end - start; ++ ++ if (map.virtual <= (unsigned long)_stext && ((unsigned long)_end < (map.virtual + map.length))) { ++ struct map_desc kernel; ++ struct map_desc initmap; ++ ++ /* when freeing initmem we will make this RW */ ++ initmap.pfn = __phys_to_pfn(__pa(__init_begin)); ++ initmap.virtual = (unsigned long)__init_begin; ++ initmap.length = _sdata - __init_begin; ++ initmap.type = __MT_MEMORY_RWX; ++ create_mapping(&initmap); ++ ++ /* when freeing initmem we will make this RX */ ++ kernel.pfn = __phys_to_pfn(__pa(_stext)); ++ kernel.virtual = (unsigned long)_stext; ++ kernel.length = __init_begin - _stext; ++ kernel.type = __MT_MEMORY_RWX; ++ create_mapping(&kernel); ++ ++ if (map.virtual < (unsigned long)_stext) { ++ map.length = (unsigned long)_stext - map.virtual; ++ map.type = __MT_MEMORY_RWX; ++ create_mapping(&map); ++ } ++ ++ map.pfn = __phys_to_pfn(__pa(_sdata)); ++ map.virtual = (unsigned long)_sdata; ++ map.length = end - __pa(_sdata); ++ } ++ ++ map.type = MT_MEMORY_RW; ++ create_mapping(&map); ++#else + if (end < kernel_x_start || start >= kernel_x_end) { + map.pfn = __phys_to_pfn(start); + map.virtual = __phys_to_virt(start); + map.length = end - start; +- map.type = MT_MEMORY_RWX; ++ map.type = __MT_MEMORY_RWX; + + create_mapping(&map); + } else { +@@ -1370,7 +1463,7 @@ static void __init map_lowmem(void) + map.pfn = __phys_to_pfn(kernel_x_start); + map.virtual = __phys_to_virt(kernel_x_start); + map.length = kernel_x_end - kernel_x_start; +- map.type = MT_MEMORY_RWX; ++ map.type = __MT_MEMORY_RWX; + + create_mapping(&map); + +@@ -1383,6 +1476,7 @@ static void __init map_lowmem(void) + create_mapping(&map); + } + } ++#endif + } + } + +diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c +index e1268f9..a9755a7 100644 +--- a/arch/arm/net/bpf_jit_32.c ++++ b/arch/arm/net/bpf_jit_32.c +@@ -20,6 +20,7 @@ + #include <asm/cacheflush.h> + #include <asm/hwcap.h> + #include <asm/opcodes.h> ++#include <asm/pgtable.h> + + #include "bpf_jit_32.h" + +@@ -71,7 +72,11 @@ struct jit_ctx { + #endif + }; + ++#ifdef CONFIG_GRKERNSEC_BPF_HARDEN ++int bpf_jit_enable __read_only; ++#else + int bpf_jit_enable __read_mostly; ++#endif + + static u64 jit_get_skb_b(struct sk_buff *skb, unsigned offset) + { +@@ -178,8 +183,10 @@ static void jit_fill_hole(void *area, unsigned int size) + { + u32 *ptr; + /* We are guaranteed to have aligned memory. */ ++ pax_open_kernel(); + for (ptr = area; size >= sizeof(u32); size -= sizeof(u32)) + *ptr++ = __opcode_to_mem_arm(ARM_INST_UDF); ++ pax_close_kernel(); + } + + static void build_prologue(struct jit_ctx *ctx) +diff --git a/arch/arm/plat-iop/setup.c b/arch/arm/plat-iop/setup.c +index 5b217f4..c23f40e 100644 +--- a/arch/arm/plat-iop/setup.c ++++ b/arch/arm/plat-iop/setup.c +@@ -24,7 +24,7 @@ static struct map_desc iop3xx_std_desc[] __initdata = { + .virtual = IOP3XX_PERIPHERAL_VIRT_BASE, + .pfn = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE), + .length = IOP3XX_PERIPHERAL_SIZE, +- .type = MT_UNCACHED, ++ .type = MT_UNCACHED_RW, + }, + }; + +diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c +index a5bc92d..0bb4730 100644 +--- a/arch/arm/plat-omap/sram.c ++++ b/arch/arm/plat-omap/sram.c +@@ -93,6 +93,8 @@ void __init omap_map_sram(unsigned long start, unsigned long size, + * Looks like we need to preserve some bootloader code at the + * beginning of SRAM for jumping to flash for reboot to work... + */ ++ pax_open_kernel(); + memset_io(omap_sram_base + omap_sram_skip, 0, + omap_sram_size - omap_sram_skip); ++ pax_close_kernel(); + } +diff --git a/arch/arm/plat-samsung/include/plat/dma-ops.h b/arch/arm/plat-samsung/include/plat/dma-ops.h +index ce6d763..cfea917 100644 +--- a/arch/arm/plat-samsung/include/plat/dma-ops.h ++++ b/arch/arm/plat-samsung/include/plat/dma-ops.h +@@ -47,7 +47,7 @@ struct samsung_dma_ops { + int (*started)(unsigned ch); + int (*flush)(unsigned ch); + int (*stop)(unsigned ch); +-}; ++} __no_const; + + extern void *samsung_dmadev_get_ops(void); + extern void *s3c_dma_get_ops(void); +diff --git a/arch/arm64/include/asm/atomic.h b/arch/arm64/include/asm/atomic.h +index 7047051..44e8675 100644 +--- a/arch/arm64/include/asm/atomic.h ++++ b/arch/arm64/include/asm/atomic.h +@@ -252,5 +252,15 @@ static inline int atomic64_add_unless(atomic64_t *v, long a, long u) + #define atomic64_dec_and_test(v) (atomic64_dec_return((v)) == 0) + #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1LL, 0LL) + ++#define atomic64_read_unchecked(v) atomic64_read(v) ++#define atomic64_set_unchecked(v, i) atomic64_set((v), (i)) ++#define atomic64_add_unchecked(a, v) atomic64_add((a), (v)) ++#define atomic64_add_return_unchecked(a, v) atomic64_add_return((a), (v)) ++#define atomic64_sub_unchecked(a, v) atomic64_sub((a), (v)) ++#define atomic64_inc_unchecked(v) atomic64_inc(v) ++#define atomic64_inc_return_unchecked(v) atomic64_inc_return(v) ++#define atomic64_dec_unchecked(v) atomic64_dec(v) ++#define atomic64_cmpxchg_unchecked(v, o, n) atomic64_cmpxchg((v), (o), (n)) ++ + #endif + #endif +diff --git a/arch/arm64/include/asm/barrier.h b/arch/arm64/include/asm/barrier.h +index 6389d60..b5d3bdd 100644 +--- a/arch/arm64/include/asm/barrier.h ++++ b/arch/arm64/include/asm/barrier.h +@@ -41,7 +41,7 @@ + do { \ + compiletime_assert_atomic_type(*p); \ + barrier(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/arch/arm64/include/asm/pgalloc.h b/arch/arm64/include/asm/pgalloc.h +index d5bed02..778221a 100644 +--- a/arch/arm64/include/asm/pgalloc.h ++++ b/arch/arm64/include/asm/pgalloc.h +@@ -44,6 +44,11 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) + set_pud(pud, __pud(__pa(pmd) | PMD_TYPE_TABLE)); + } + ++static inline void pud_populate_kernel(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) ++{ ++ pud_populate(mm, pud, pmd); ++} ++ + #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 2 */ + + #if CONFIG_ARM64_PGTABLE_LEVELS > 3 +diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h +index 3bf8f4e..5dd5491 100644 +--- a/arch/arm64/include/asm/uaccess.h ++++ b/arch/arm64/include/asm/uaccess.h +@@ -99,6 +99,7 @@ static inline void set_fs(mm_segment_t fs) + flag; \ + }) + ++#define access_ok_noprefault(type, addr, size) access_ok((type), (addr), (size)) + #define access_ok(type, addr, size) __range_ok(addr, size) + #define user_addr_max get_fs + +diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c +index df34a70..5727a75 100644 +--- a/arch/arm64/mm/dma-mapping.c ++++ b/arch/arm64/mm/dma-mapping.c +@@ -137,7 +137,7 @@ static void __dma_free_coherent(struct device *dev, size_t size, + phys_to_page(paddr), + size >> PAGE_SHIFT); + if (!freed) +- swiotlb_free_coherent(dev, size, vaddr, dma_handle); ++ swiotlb_free_coherent(dev, size, vaddr, dma_handle, attrs); + } + + static void *__dma_alloc_noncoherent(struct device *dev, size_t size, +diff --git a/arch/avr32/include/asm/cache.h b/arch/avr32/include/asm/cache.h +index c3a58a1..78fbf54 100644 +--- a/arch/avr32/include/asm/cache.h ++++ b/arch/avr32/include/asm/cache.h +@@ -1,8 +1,10 @@ + #ifndef __ASM_AVR32_CACHE_H + #define __ASM_AVR32_CACHE_H + ++#include <linux/const.h> ++ + #define L1_CACHE_SHIFT 5 +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + /* + * Memory returned by kmalloc() may be used for DMA, so we must make +diff --git a/arch/avr32/include/asm/elf.h b/arch/avr32/include/asm/elf.h +index d232888..87c8df1 100644 +--- a/arch/avr32/include/asm/elf.h ++++ b/arch/avr32/include/asm/elf.h +@@ -84,8 +84,14 @@ typedef struct user_fpu_struct elf_fpregset_t; + the loader. We need to make sure that it is out of the way of the program + that it will "exec", and that there is sufficient room for the brk. */ + +-#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) ++#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2) + ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE 0x00001000UL ++ ++#define PAX_DELTA_MMAP_LEN 15 ++#define PAX_DELTA_STACK_LEN 15 ++#endif + + /* This yields a mask that user programs can use to figure out what + instruction set this CPU supports. This could be done in user space, +diff --git a/arch/avr32/include/asm/kmap_types.h b/arch/avr32/include/asm/kmap_types.h +index 479330b..53717a8 100644 +--- a/arch/avr32/include/asm/kmap_types.h ++++ b/arch/avr32/include/asm/kmap_types.h +@@ -2,9 +2,9 @@ + #define __ASM_AVR32_KMAP_TYPES_H + + #ifdef CONFIG_DEBUG_HIGHMEM +-# define KM_TYPE_NR 29 ++# define KM_TYPE_NR 30 + #else +-# define KM_TYPE_NR 14 ++# define KM_TYPE_NR 15 + #endif + + #endif /* __ASM_AVR32_KMAP_TYPES_H */ +diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c +index d223a8b..69c5210 100644 +--- a/arch/avr32/mm/fault.c ++++ b/arch/avr32/mm/fault.c +@@ -41,6 +41,23 @@ static inline int notify_page_fault(struct pt_regs *regs, int trap) + + int exception_trace = 1; + ++#ifdef CONFIG_PAX_PAGEEXEC ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ unsigned long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 20; i++) { ++ unsigned char c; ++ if (get_user(c, (unsigned char *)pc+i)) ++ printk(KERN_CONT "???????? "); ++ else ++ printk(KERN_CONT "%02x ", c); ++ } ++ printk("\n"); ++} ++#endif ++ + /* + * This routine handles page faults. It determines the address and the + * problem, and then passes it off to one of the appropriate routines. +@@ -178,6 +195,16 @@ bad_area: + up_read(&mm->mmap_sem); + + if (user_mode(regs)) { ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (mm->pax_flags & MF_PAX_PAGEEXEC) { ++ if (ecr == ECR_PROTECTION_X || ecr == ECR_TLB_MISS_X) { ++ pax_report_fault(regs, (void *)regs->pc, (void *)regs->sp); ++ do_group_exit(SIGKILL); ++ } ++ } ++#endif ++ + if (exception_trace && printk_ratelimit()) + printk("%s%s[%d]: segfault at %08lx pc %08lx " + "sp %08lx ecr %lu\n", +diff --git a/arch/blackfin/include/asm/cache.h b/arch/blackfin/include/asm/cache.h +index 568885a..f8008df 100644 +--- a/arch/blackfin/include/asm/cache.h ++++ b/arch/blackfin/include/asm/cache.h +@@ -7,6 +7,7 @@ + #ifndef __ARCH_BLACKFIN_CACHE_H + #define __ARCH_BLACKFIN_CACHE_H + ++#include <linux/const.h> + #include <linux/linkage.h> /* for asmlinkage */ + + /* +@@ -14,7 +15,7 @@ + * Blackfin loads 32 bytes for cache + */ + #define L1_CACHE_SHIFT 5 +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + #define SMP_CACHE_BYTES L1_CACHE_BYTES + + #define ARCH_DMA_MINALIGN L1_CACHE_BYTES +diff --git a/arch/cris/include/arch-v10/arch/cache.h b/arch/cris/include/arch-v10/arch/cache.h +index aea2718..3639a60 100644 +--- a/arch/cris/include/arch-v10/arch/cache.h ++++ b/arch/cris/include/arch-v10/arch/cache.h +@@ -1,8 +1,9 @@ + #ifndef _ASM_ARCH_CACHE_H + #define _ASM_ARCH_CACHE_H + ++#include <linux/const.h> + /* Etrax 100LX have 32-byte cache-lines. */ +-#define L1_CACHE_BYTES 32 + #define L1_CACHE_SHIFT 5 ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #endif /* _ASM_ARCH_CACHE_H */ +diff --git a/arch/cris/include/arch-v32/arch/cache.h b/arch/cris/include/arch-v32/arch/cache.h +index 7caf25d..ee65ac5 100644 +--- a/arch/cris/include/arch-v32/arch/cache.h ++++ b/arch/cris/include/arch-v32/arch/cache.h +@@ -1,11 +1,12 @@ + #ifndef _ASM_CRIS_ARCH_CACHE_H + #define _ASM_CRIS_ARCH_CACHE_H + ++#include <linux/const.h> + #include <arch/hwregs/dma.h> + + /* A cache-line is 32 bytes. */ +-#define L1_CACHE_BYTES 32 + #define L1_CACHE_SHIFT 5 ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) + +diff --git a/arch/frv/include/asm/atomic.h b/arch/frv/include/asm/atomic.h +index 102190a..5334cea 100644 +--- a/arch/frv/include/asm/atomic.h ++++ b/arch/frv/include/asm/atomic.h +@@ -181,6 +181,16 @@ static inline void atomic64_dec(atomic64_t *v) + #define atomic64_cmpxchg(v, old, new) (__cmpxchg_64(old, new, &(v)->counter)) + #define atomic64_xchg(v, new) (__xchg_64(new, &(v)->counter)) + ++#define atomic64_read_unchecked(v) atomic64_read(v) ++#define atomic64_set_unchecked(v, i) atomic64_set((v), (i)) ++#define atomic64_add_unchecked(a, v) atomic64_add((a), (v)) ++#define atomic64_add_return_unchecked(a, v) atomic64_add_return((a), (v)) ++#define atomic64_sub_unchecked(a, v) atomic64_sub((a), (v)) ++#define atomic64_inc_unchecked(v) atomic64_inc(v) ++#define atomic64_inc_return_unchecked(v) atomic64_inc_return(v) ++#define atomic64_dec_unchecked(v) atomic64_dec(v) ++#define atomic64_cmpxchg_unchecked(v, o, n) atomic64_cmpxchg((v), (o), (n)) ++ + static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) + { + int c, old; +diff --git a/arch/frv/include/asm/cache.h b/arch/frv/include/asm/cache.h +index 2797163..c2a401df9 100644 +--- a/arch/frv/include/asm/cache.h ++++ b/arch/frv/include/asm/cache.h +@@ -12,10 +12,11 @@ + #ifndef __ASM_CACHE_H + #define __ASM_CACHE_H + ++#include <linux/const.h> + + /* bytes per L1 cache line */ + #define L1_CACHE_SHIFT (CONFIG_FRV_L1_CACHE_SHIFT) +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #define __cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES))) + #define ____cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES))) +diff --git a/arch/frv/include/asm/kmap_types.h b/arch/frv/include/asm/kmap_types.h +index 43901f2..0d8b865 100644 +--- a/arch/frv/include/asm/kmap_types.h ++++ b/arch/frv/include/asm/kmap_types.h +@@ -2,6 +2,6 @@ + #ifndef _ASM_KMAP_TYPES_H + #define _ASM_KMAP_TYPES_H + +-#define KM_TYPE_NR 17 ++#define KM_TYPE_NR 18 + + #endif +diff --git a/arch/frv/mm/elf-fdpic.c b/arch/frv/mm/elf-fdpic.c +index 836f147..4cf23f5 100644 +--- a/arch/frv/mm/elf-fdpic.c ++++ b/arch/frv/mm/elf-fdpic.c +@@ -61,6 +61,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi + { + struct vm_area_struct *vma; + struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(current->mm, filp, flags); + + if (len > TASK_SIZE) + return -ENOMEM; +@@ -73,8 +74,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi + if (addr) { + addr = PAGE_ALIGN(addr); + vma = find_vma(current->mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + goto success; + } + +@@ -85,6 +85,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi + info.high_limit = (current->mm->start_stack - 0x00200000); + info.align_mask = 0; + info.align_offset = 0; ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + if (!(addr & ~PAGE_MASK)) + goto success; +diff --git a/arch/hexagon/include/asm/cache.h b/arch/hexagon/include/asm/cache.h +index 2635117..fa223cb 100644 +--- a/arch/hexagon/include/asm/cache.h ++++ b/arch/hexagon/include/asm/cache.h +@@ -21,9 +21,11 @@ + #ifndef __ASM_CACHE_H + #define __ASM_CACHE_H + ++#include <linux/const.h> ++ + /* Bytes per L1 cache line */ +-#define L1_CACHE_SHIFT (5) +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_SHIFT 5 ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #define __cacheline_aligned __aligned(L1_CACHE_BYTES) + #define ____cacheline_aligned __aligned(L1_CACHE_BYTES) +diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig +index c84c88b..2a6e1ba 100644 +--- a/arch/ia64/Kconfig ++++ b/arch/ia64/Kconfig +@@ -549,6 +549,7 @@ source "drivers/sn/Kconfig" + config KEXEC + bool "kexec system call" + depends on !IA64_HP_SIM && (!SMP || HOTPLUG_CPU) ++ depends on !GRKERNSEC_KMEM + help + kexec is a system call that implements the ability to shutdown your + current kernel, and to start another kernel. It is like a reboot +diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile +index 5441b14..039a446 100644 +--- a/arch/ia64/Makefile ++++ b/arch/ia64/Makefile +@@ -99,5 +99,6 @@ endef + archprepare: make_nr_irqs_h FORCE + PHONY += make_nr_irqs_h FORCE + ++make_nr_irqs_h: KBUILD_CFLAGS := $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS)) + make_nr_irqs_h: FORCE + $(Q)$(MAKE) $(build)=arch/ia64/kernel include/generated/nr-irqs.h +diff --git a/arch/ia64/include/asm/atomic.h b/arch/ia64/include/asm/atomic.h +index 0bf0350..2ad1957 100644 +--- a/arch/ia64/include/asm/atomic.h ++++ b/arch/ia64/include/asm/atomic.h +@@ -193,4 +193,14 @@ atomic64_add_negative (__s64 i, atomic64_t *v) + #define atomic64_inc(v) atomic64_add(1, (v)) + #define atomic64_dec(v) atomic64_sub(1, (v)) + ++#define atomic64_read_unchecked(v) atomic64_read(v) ++#define atomic64_set_unchecked(v, i) atomic64_set((v), (i)) ++#define atomic64_add_unchecked(a, v) atomic64_add((a), (v)) ++#define atomic64_add_return_unchecked(a, v) atomic64_add_return((a), (v)) ++#define atomic64_sub_unchecked(a, v) atomic64_sub((a), (v)) ++#define atomic64_inc_unchecked(v) atomic64_inc(v) ++#define atomic64_inc_return_unchecked(v) atomic64_inc_return(v) ++#define atomic64_dec_unchecked(v) atomic64_dec(v) ++#define atomic64_cmpxchg_unchecked(v, o, n) atomic64_cmpxchg((v), (o), (n)) ++ + #endif /* _ASM_IA64_ATOMIC_H */ +diff --git a/arch/ia64/include/asm/barrier.h b/arch/ia64/include/asm/barrier.h +index a48957c..e097b56 100644 +--- a/arch/ia64/include/asm/barrier.h ++++ b/arch/ia64/include/asm/barrier.h +@@ -67,7 +67,7 @@ + do { \ + compiletime_assert_atomic_type(*p); \ + barrier(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/arch/ia64/include/asm/cache.h b/arch/ia64/include/asm/cache.h +index 988254a..e1ee885 100644 +--- a/arch/ia64/include/asm/cache.h ++++ b/arch/ia64/include/asm/cache.h +@@ -1,6 +1,7 @@ + #ifndef _ASM_IA64_CACHE_H + #define _ASM_IA64_CACHE_H + ++#include <linux/const.h> + + /* + * Copyright (C) 1998-2000 Hewlett-Packard Co +@@ -9,7 +10,7 @@ + + /* Bytes per L1 (data) cache line. */ + #define L1_CACHE_SHIFT CONFIG_IA64_L1_CACHE_SHIFT +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #ifdef CONFIG_SMP + # define SMP_CACHE_SHIFT L1_CACHE_SHIFT +diff --git a/arch/ia64/include/asm/elf.h b/arch/ia64/include/asm/elf.h +index 5a83c5c..4d7f553 100644 +--- a/arch/ia64/include/asm/elf.h ++++ b/arch/ia64/include/asm/elf.h +@@ -42,6 +42,13 @@ + */ + #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x800000000UL) + ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE (current->personality == PER_LINUX32 ? 0x08048000UL : 0x4000000000000000UL) ++ ++#define PAX_DELTA_MMAP_LEN (current->personality == PER_LINUX32 ? 16 : 3*PAGE_SHIFT - 13) ++#define PAX_DELTA_STACK_LEN (current->personality == PER_LINUX32 ? 16 : 3*PAGE_SHIFT - 13) ++#endif ++ + #define PT_IA_64_UNWIND 0x70000001 + + /* IA-64 relocations: */ +diff --git a/arch/ia64/include/asm/pgalloc.h b/arch/ia64/include/asm/pgalloc.h +index 5767cdf..7462574 100644 +--- a/arch/ia64/include/asm/pgalloc.h ++++ b/arch/ia64/include/asm/pgalloc.h +@@ -39,6 +39,12 @@ pgd_populate(struct mm_struct *mm, pgd_t * pgd_entry, pud_t * pud) + pgd_val(*pgd_entry) = __pa(pud); + } + ++static inline void ++pgd_populate_kernel(struct mm_struct *mm, pgd_t * pgd_entry, pud_t * pud) ++{ ++ pgd_populate(mm, pgd_entry, pud); ++} ++ + static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) + { + return quicklist_alloc(0, GFP_KERNEL, NULL); +@@ -57,6 +63,12 @@ pud_populate(struct mm_struct *mm, pud_t * pud_entry, pmd_t * pmd) + pud_val(*pud_entry) = __pa(pmd); + } + ++static inline void ++pud_populate_kernel(struct mm_struct *mm, pud_t * pud_entry, pmd_t * pmd) ++{ ++ pud_populate(mm, pud_entry, pmd); ++} ++ + static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) + { + return quicklist_alloc(0, GFP_KERNEL, NULL); +diff --git a/arch/ia64/include/asm/pgtable.h b/arch/ia64/include/asm/pgtable.h +index 7935115..c0eca6a 100644 +--- a/arch/ia64/include/asm/pgtable.h ++++ b/arch/ia64/include/asm/pgtable.h +@@ -12,7 +12,7 @@ + * David Mosberger-Tang <davidm@hpl.hp.com> + */ + +- ++#include <linux/const.h> + #include <asm/mman.h> + #include <asm/page.h> + #include <asm/processor.h> +@@ -142,6 +142,17 @@ + #define PAGE_READONLY __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R) + #define PAGE_COPY __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R) + #define PAGE_COPY_EXEC __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_RX) ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++# define PAGE_SHARED_NOEXEC __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_RW) ++# define PAGE_READONLY_NOEXEC __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R) ++# define PAGE_COPY_NOEXEC __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R) ++#else ++# define PAGE_SHARED_NOEXEC PAGE_SHARED ++# define PAGE_READONLY_NOEXEC PAGE_READONLY ++# define PAGE_COPY_NOEXEC PAGE_COPY ++#endif ++ + #define PAGE_GATE __pgprot(__ACCESS_BITS | _PAGE_PL_0 | _PAGE_AR_X_RX) + #define PAGE_KERNEL __pgprot(__DIRTY_BITS | _PAGE_PL_0 | _PAGE_AR_RWX) + #define PAGE_KERNELRX __pgprot(__ACCESS_BITS | _PAGE_PL_0 | _PAGE_AR_RX) +diff --git a/arch/ia64/include/asm/spinlock.h b/arch/ia64/include/asm/spinlock.h +index 45698cd..e8e2dbc 100644 +--- a/arch/ia64/include/asm/spinlock.h ++++ b/arch/ia64/include/asm/spinlock.h +@@ -71,7 +71,7 @@ static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock) + unsigned short *p = (unsigned short *)&lock->lock + 1, tmp; + + asm volatile ("ld2.bias %0=[%1]" : "=r"(tmp) : "r"(p)); +- ACCESS_ONCE(*p) = (tmp + 2) & ~1; ++ ACCESS_ONCE_RW(*p) = (tmp + 2) & ~1; + } + + static __always_inline void __ticket_spin_unlock_wait(arch_spinlock_t *lock) +diff --git a/arch/ia64/include/asm/uaccess.h b/arch/ia64/include/asm/uaccess.h +index 449c8c0..3d4b1e9 100644 +--- a/arch/ia64/include/asm/uaccess.h ++++ b/arch/ia64/include/asm/uaccess.h +@@ -70,6 +70,7 @@ + && ((segment).seg == KERNEL_DS.seg \ + || likely(REGION_OFFSET((unsigned long) (addr)) < RGN_MAP_LIMIT))); \ + }) ++#define access_ok_noprefault(type, addr, size) access_ok((type), (addr), (size)) + #define access_ok(type, addr, size) __access_ok((addr), (size), get_fs()) + + /* +@@ -240,12 +241,24 @@ extern unsigned long __must_check __copy_user (void __user *to, const void __use + static inline unsigned long + __copy_to_user (void __user *to, const void *from, unsigned long count) + { ++ if (count > INT_MAX) ++ return count; ++ ++ if (!__builtin_constant_p(count)) ++ check_object_size(from, count, true); ++ + return __copy_user(to, (__force void __user *) from, count); + } + + static inline unsigned long + __copy_from_user (void *to, const void __user *from, unsigned long count) + { ++ if (count > INT_MAX) ++ return count; ++ ++ if (!__builtin_constant_p(count)) ++ check_object_size(to, count, false); ++ + return __copy_user((__force void __user *) to, from, count); + } + +@@ -255,10 +268,13 @@ __copy_from_user (void *to, const void __user *from, unsigned long count) + ({ \ + void __user *__cu_to = (to); \ + const void *__cu_from = (from); \ +- long __cu_len = (n); \ ++ unsigned long __cu_len = (n); \ + \ +- if (__access_ok(__cu_to, __cu_len, get_fs())) \ ++ if (__cu_len <= INT_MAX && __access_ok(__cu_to, __cu_len, get_fs())) { \ ++ if (!__builtin_constant_p(n)) \ ++ check_object_size(__cu_from, __cu_len, true); \ + __cu_len = __copy_user(__cu_to, (__force void __user *) __cu_from, __cu_len); \ ++ } \ + __cu_len; \ + }) + +@@ -266,11 +282,14 @@ __copy_from_user (void *to, const void __user *from, unsigned long count) + ({ \ + void *__cu_to = (to); \ + const void __user *__cu_from = (from); \ +- long __cu_len = (n); \ ++ unsigned long __cu_len = (n); \ + \ + __chk_user_ptr(__cu_from); \ +- if (__access_ok(__cu_from, __cu_len, get_fs())) \ ++ if (__cu_len <= INT_MAX && __access_ok(__cu_from, __cu_len, get_fs())) { \ ++ if (!__builtin_constant_p(n)) \ ++ check_object_size(__cu_to, __cu_len, false); \ + __cu_len = __copy_user((__force void __user *) __cu_to, __cu_from, __cu_len); \ ++ } \ + __cu_len; \ + }) + +diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c +index 24603be..948052d 100644 +--- a/arch/ia64/kernel/module.c ++++ b/arch/ia64/kernel/module.c +@@ -307,8 +307,7 @@ plt_target (struct plt_entry *plt) + void + module_free (struct module *mod, void *module_region) + { +- if (mod && mod->arch.init_unw_table && +- module_region == mod->module_init) { ++ if (mod && mod->arch.init_unw_table && module_region == mod->module_init_rx) { + unw_remove_unwind_table(mod->arch.init_unw_table); + mod->arch.init_unw_table = NULL; + } +@@ -494,15 +493,39 @@ module_frob_arch_sections (Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings, + } + + static inline int ++in_init_rx (const struct module *mod, uint64_t addr) ++{ ++ return addr - (uint64_t) mod->module_init_rx < mod->init_size_rx; ++} ++ ++static inline int ++in_init_rw (const struct module *mod, uint64_t addr) ++{ ++ return addr - (uint64_t) mod->module_init_rw < mod->init_size_rw; ++} ++ ++static inline int + in_init (const struct module *mod, uint64_t addr) + { +- return addr - (uint64_t) mod->module_init < mod->init_size; ++ return in_init_rx(mod, addr) || in_init_rw(mod, addr); ++} ++ ++static inline int ++in_core_rx (const struct module *mod, uint64_t addr) ++{ ++ return addr - (uint64_t) mod->module_core_rx < mod->core_size_rx; ++} ++ ++static inline int ++in_core_rw (const struct module *mod, uint64_t addr) ++{ ++ return addr - (uint64_t) mod->module_core_rw < mod->core_size_rw; + } + + static inline int + in_core (const struct module *mod, uint64_t addr) + { +- return addr - (uint64_t) mod->module_core < mod->core_size; ++ return in_core_rx(mod, addr) || in_core_rw(mod, addr); + } + + static inline int +@@ -685,7 +708,14 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend, + break; + + case RV_BDREL: +- val -= (uint64_t) (in_init(mod, val) ? mod->module_init : mod->module_core); ++ if (in_init_rx(mod, val)) ++ val -= (uint64_t) mod->module_init_rx; ++ else if (in_init_rw(mod, val)) ++ val -= (uint64_t) mod->module_init_rw; ++ else if (in_core_rx(mod, val)) ++ val -= (uint64_t) mod->module_core_rx; ++ else if (in_core_rw(mod, val)) ++ val -= (uint64_t) mod->module_core_rw; + break; + + case RV_LTV: +@@ -820,15 +850,15 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind + * addresses have been selected... + */ + uint64_t gp; +- if (mod->core_size > MAX_LTOFF) ++ if (mod->core_size_rx + mod->core_size_rw > MAX_LTOFF) + /* + * This takes advantage of fact that SHF_ARCH_SMALL gets allocated + * at the end of the module. + */ +- gp = mod->core_size - MAX_LTOFF / 2; ++ gp = mod->core_size_rx + mod->core_size_rw - MAX_LTOFF / 2; + else +- gp = mod->core_size / 2; +- gp = (uint64_t) mod->module_core + ((gp + 7) & -8); ++ gp = (mod->core_size_rx + mod->core_size_rw) / 2; ++ gp = (uint64_t) mod->module_core_rx + ((gp + 7) & -8); + mod->arch.gp = gp; + DEBUGP("%s: placing gp at 0x%lx\n", __func__, gp); + } +diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c +index c39c3cd..3c77738 100644 +--- a/arch/ia64/kernel/palinfo.c ++++ b/arch/ia64/kernel/palinfo.c +@@ -980,7 +980,7 @@ static int palinfo_cpu_callback(struct notifier_block *nfb, + return NOTIFY_OK; + } + +-static struct notifier_block __refdata palinfo_cpu_notifier = ++static struct notifier_block palinfo_cpu_notifier = + { + .notifier_call = palinfo_cpu_callback, + .priority = 0, +diff --git a/arch/ia64/kernel/sys_ia64.c b/arch/ia64/kernel/sys_ia64.c +index 41e33f8..65180b2a 100644 +--- a/arch/ia64/kernel/sys_ia64.c ++++ b/arch/ia64/kernel/sys_ia64.c +@@ -28,6 +28,7 @@ arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len + unsigned long align_mask = 0; + struct mm_struct *mm = current->mm; + struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + + if (len > RGN_MAP_LIMIT) + return -ENOMEM; +@@ -43,6 +44,13 @@ arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len + if (REGION_NUMBER(addr) == RGN_HPAGE) + addr = 0; + #endif ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ addr = mm->free_area_cache; ++ else ++#endif ++ + if (!addr) + addr = TASK_UNMAPPED_BASE; + +@@ -61,6 +69,7 @@ arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len + info.high_limit = TASK_SIZE; + info.align_mask = align_mask; + info.align_offset = 0; ++ info.threadstack_offset = offset; + return vm_unmapped_area(&info); + } + +diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S +index 84f8a52..7c76178 100644 +--- a/arch/ia64/kernel/vmlinux.lds.S ++++ b/arch/ia64/kernel/vmlinux.lds.S +@@ -192,7 +192,7 @@ SECTIONS { + /* Per-cpu data: */ + . = ALIGN(PERCPU_PAGE_SIZE); + PERCPU_VADDR(SMP_CACHE_BYTES, PERCPU_ADDR, :percpu) +- __phys_per_cpu_start = __per_cpu_load; ++ __phys_per_cpu_start = per_cpu_load; + /* + * ensure percpu data fits + * into percpu page size +diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c +index ba5ba7a..36e9d3a 100644 +--- a/arch/ia64/mm/fault.c ++++ b/arch/ia64/mm/fault.c +@@ -72,6 +72,23 @@ mapped_kernel_page_is_present (unsigned long address) + return pte_present(pte); + } + ++#ifdef CONFIG_PAX_PAGEEXEC ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ unsigned long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 8; i++) { ++ unsigned int c; ++ if (get_user(c, (unsigned int *)pc+i)) ++ printk(KERN_CONT "???????? "); ++ else ++ printk(KERN_CONT "%08x ", c); ++ } ++ printk("\n"); ++} ++#endif ++ + # define VM_READ_BIT 0 + # define VM_WRITE_BIT 1 + # define VM_EXEC_BIT 2 +@@ -151,8 +168,21 @@ retry: + if (((isr >> IA64_ISR_R_BIT) & 1UL) && (!(vma->vm_flags & (VM_READ | VM_WRITE)))) + goto bad_area; + +- if ((vma->vm_flags & mask) != mask) ++ if ((vma->vm_flags & mask) != mask) { ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!(vma->vm_flags & VM_EXEC) && (mask & VM_EXEC)) { ++ if (!(mm->pax_flags & MF_PAX_PAGEEXEC) || address != regs->cr_iip) ++ goto bad_area; ++ ++ up_read(&mm->mmap_sem); ++ pax_report_fault(regs, (void *)regs->cr_iip, (void *)regs->r12); ++ do_group_exit(SIGKILL); ++ } ++#endif ++ + goto bad_area; ++ } + + /* + * If for any reason at all we couldn't handle the fault, make +diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c +index 76069c1..c2aa816 100644 +--- a/arch/ia64/mm/hugetlbpage.c ++++ b/arch/ia64/mm/hugetlbpage.c +@@ -149,6 +149,7 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, u + unsigned long pgoff, unsigned long flags) + { + struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(current->mm, file, flags); + + if (len > RGN_MAP_LIMIT) + return -ENOMEM; +@@ -172,6 +173,7 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, u + info.high_limit = HPAGE_REGION_BASE + RGN_MAP_LIMIT; + info.align_mask = PAGE_MASK & (HPAGE_SIZE - 1); + info.align_offset = 0; ++ info.threadstack_offset = offset; + return vm_unmapped_area(&info); + } + +diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c +index 6b33457..88b5124 100644 +--- a/arch/ia64/mm/init.c ++++ b/arch/ia64/mm/init.c +@@ -120,6 +120,19 @@ ia64_init_addr_space (void) + vma->vm_start = current->thread.rbs_bot & PAGE_MASK; + vma->vm_end = vma->vm_start + PAGE_SIZE; + vma->vm_flags = VM_DATA_DEFAULT_FLAGS|VM_GROWSUP|VM_ACCOUNT; ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (current->mm->pax_flags & MF_PAX_PAGEEXEC) { ++ vma->vm_flags &= ~VM_EXEC; ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (current->mm->pax_flags & MF_PAX_MPROTECT) ++ vma->vm_flags &= ~VM_MAYEXEC; ++#endif ++ ++ } ++#endif ++ + vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); + down_write(¤t->mm->mmap_sem); + if (insert_vm_struct(current->mm, vma)) { +@@ -286,7 +299,7 @@ static int __init gate_vma_init(void) + gate_vma.vm_start = FIXADDR_USER_START; + gate_vma.vm_end = FIXADDR_USER_END; + gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC; +- gate_vma.vm_page_prot = __P101; ++ gate_vma.vm_page_prot = vm_get_page_prot(gate_vma.vm_flags); + + return 0; + } +diff --git a/arch/m32r/include/asm/cache.h b/arch/m32r/include/asm/cache.h +index 40b3ee98..8c2c112 100644 +--- a/arch/m32r/include/asm/cache.h ++++ b/arch/m32r/include/asm/cache.h +@@ -1,8 +1,10 @@ + #ifndef _ASM_M32R_CACHE_H + #define _ASM_M32R_CACHE_H + ++#include <linux/const.h> ++ + /* L1 cache line size */ + #define L1_CACHE_SHIFT 4 +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #endif /* _ASM_M32R_CACHE_H */ +diff --git a/arch/m32r/lib/usercopy.c b/arch/m32r/lib/usercopy.c +index 82abd15..d95ae5d 100644 +--- a/arch/m32r/lib/usercopy.c ++++ b/arch/m32r/lib/usercopy.c +@@ -14,6 +14,9 @@ + unsigned long + __generic_copy_to_user(void __user *to, const void *from, unsigned long n) + { ++ if ((long)n < 0) ++ return n; ++ + prefetch(from); + if (access_ok(VERIFY_WRITE, to, n)) + __copy_user(to,from,n); +@@ -23,6 +26,9 @@ __generic_copy_to_user(void __user *to, const void *from, unsigned long n) + unsigned long + __generic_copy_from_user(void *to, const void __user *from, unsigned long n) + { ++ if ((long)n < 0) ++ return n; ++ + prefetchw(to); + if (access_ok(VERIFY_READ, from, n)) + __copy_user_zeroing(to,from,n); +diff --git a/arch/m68k/include/asm/cache.h b/arch/m68k/include/asm/cache.h +index 0395c51..5f26031 100644 +--- a/arch/m68k/include/asm/cache.h ++++ b/arch/m68k/include/asm/cache.h +@@ -4,9 +4,11 @@ + #ifndef __ARCH_M68K_CACHE_H + #define __ARCH_M68K_CACHE_H + ++#include <linux/const.h> ++ + /* bytes per L1 cache line */ + #define L1_CACHE_SHIFT 4 +-#define L1_CACHE_BYTES (1<< L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #define ARCH_DMA_MINALIGN L1_CACHE_BYTES + +diff --git a/arch/metag/include/asm/barrier.h b/arch/metag/include/asm/barrier.h +index c7591e8..ecef036 100644 +--- a/arch/metag/include/asm/barrier.h ++++ b/arch/metag/include/asm/barrier.h +@@ -89,7 +89,7 @@ static inline void fence(void) + do { \ + compiletime_assert_atomic_type(*p); \ + smp_mb(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/arch/metag/mm/hugetlbpage.c b/arch/metag/mm/hugetlbpage.c +index 3c32075..ae0ae75 100644 +--- a/arch/metag/mm/hugetlbpage.c ++++ b/arch/metag/mm/hugetlbpage.c +@@ -200,6 +200,7 @@ hugetlb_get_unmapped_area_new_pmd(unsigned long len) + info.high_limit = TASK_SIZE; + info.align_mask = PAGE_MASK & HUGEPT_MASK; + info.align_offset = 0; ++ info.threadstack_offset = 0; + return vm_unmapped_area(&info); + } + +diff --git a/arch/microblaze/include/asm/cache.h b/arch/microblaze/include/asm/cache.h +index 4efe96a..60e8699 100644 +--- a/arch/microblaze/include/asm/cache.h ++++ b/arch/microblaze/include/asm/cache.h +@@ -13,11 +13,12 @@ + #ifndef _ASM_MICROBLAZE_CACHE_H + #define _ASM_MICROBLAZE_CACHE_H + ++#include <linux/const.h> + #include <asm/registers.h> + + #define L1_CACHE_SHIFT 5 + /* word-granular cache in microblaze */ +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #define SMP_CACHE_BYTES L1_CACHE_BYTES + +diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig +index 9536ef9..9333776 100644 +--- a/arch/mips/Kconfig ++++ b/arch/mips/Kconfig +@@ -2413,6 +2413,7 @@ source "kernel/Kconfig.preempt" + + config KEXEC + bool "Kexec system call" ++ depends on !GRKERNSEC_KMEM + help + kexec is a system call that implements the ability to shutdown your + current kernel, and to start another kernel. It is like a reboot +diff --git a/arch/mips/cavium-octeon/dma-octeon.c b/arch/mips/cavium-octeon/dma-octeon.c +index 02f2444..506969c 100644 +--- a/arch/mips/cavium-octeon/dma-octeon.c ++++ b/arch/mips/cavium-octeon/dma-octeon.c +@@ -199,7 +199,7 @@ static void octeon_dma_free_coherent(struct device *dev, size_t size, + if (dma_release_from_coherent(dev, order, vaddr)) + return; + +- swiotlb_free_coherent(dev, size, vaddr, dma_handle); ++ swiotlb_free_coherent(dev, size, vaddr, dma_handle, attrs); + } + + static dma_addr_t octeon_unity_phys_to_dma(struct device *dev, phys_addr_t paddr) +diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h +index 6dd6bfc..d033459 100644 +--- a/arch/mips/include/asm/atomic.h ++++ b/arch/mips/include/asm/atomic.h +@@ -21,15 +21,39 @@ + #include <asm/cmpxchg.h> + #include <asm/war.h> + ++#ifdef CONFIG_GENERIC_ATOMIC64 ++#include <asm-generic/atomic64.h> ++#endif ++ + #define ATOMIC_INIT(i) { (i) } + ++#ifdef CONFIG_64BIT ++#define _ASM_EXTABLE(from, to) \ ++" .section __ex_table,\"a\"\n" \ ++" .dword " #from ", " #to"\n" \ ++" .previous\n" ++#else ++#define _ASM_EXTABLE(from, to) \ ++" .section __ex_table,\"a\"\n" \ ++" .word " #from ", " #to"\n" \ ++" .previous\n" ++#endif ++ + /* + * atomic_read - read atomic variable + * @v: pointer of type atomic_t + * + * Atomically reads the value of @v. + */ +-#define atomic_read(v) ACCESS_ONCE((v)->counter) ++static inline int atomic_read(const atomic_t *v) ++{ ++ return ACCESS_ONCE(v->counter); ++} ++ ++static inline int atomic_read_unchecked(const atomic_unchecked_t *v) ++{ ++ return ACCESS_ONCE(v->counter); ++} + + /* + * atomic_set - set atomic variable +@@ -38,47 +62,77 @@ + * + * Atomically sets the value of @v to @i. + */ +-#define atomic_set(v, i) ((v)->counter = (i)) ++static inline void atomic_set(atomic_t *v, int i) ++{ ++ v->counter = i; ++} + +-#define ATOMIC_OP(op, c_op, asm_op) \ +-static __inline__ void atomic_##op(int i, atomic_t * v) \ ++static inline void atomic_set_unchecked(atomic_unchecked_t *v, int i) ++{ ++ v->counter = i; ++} ++ ++#ifdef CONFIG_PAX_REFCOUNT ++#define __OVERFLOW_POST \ ++ " b 4f \n" \ ++ " .set noreorder \n" \ ++ "3: b 5f \n" \ ++ " move %0, %1 \n" \ ++ " .set reorder \n" ++#define __OVERFLOW_EXTABLE \ ++ "3:\n" \ ++ _ASM_EXTABLE(2b, 3b) ++#else ++#define __OVERFLOW_POST ++#define __OVERFLOW_EXTABLE ++#endif ++ ++#define __ATOMIC_OP(op, suffix, asm_op, extable) \ ++static inline void atomic_##op##suffix(int i, atomic##suffix##_t * v) \ + { \ + if (kernel_uses_llsc && R10000_LLSC_WAR) { \ + int temp; \ + \ + __asm__ __volatile__( \ +- " .set arch=r4000 \n" \ +- "1: ll %0, %1 # atomic_" #op " \n" \ +- " " #asm_op " %0, %2 \n" \ ++ " .set mips3 \n" \ ++ "1: ll %0, %1 # atomic_" #op #suffix "\n" \ ++ "2: " #asm_op " %0, %2 \n" \ + " sc %0, %1 \n" \ + " beqzl %0, 1b \n" \ ++ extable \ + " .set mips0 \n" \ + : "=&r" (temp), "+m" (v->counter) \ + : "Ir" (i)); \ + } else if (kernel_uses_llsc) { \ + int temp; \ + \ +- do { \ +- __asm__ __volatile__( \ +- " .set arch=r4000 \n" \ +- " ll %0, %1 # atomic_" #op "\n" \ +- " " #asm_op " %0, %2 \n" \ +- " sc %0, %1 \n" \ +- " .set mips0 \n" \ +- : "=&r" (temp), "+m" (v->counter) \ +- : "Ir" (i)); \ +- } while (unlikely(!temp)); \ ++ __asm__ __volatile__( \ ++ " .set mips3 \n" \ ++ " ll %0, %1 # atomic_" #op #suffix "\n" \ ++ "2: " #asm_op " %0, %2 \n" \ ++ " sc %0, %1 \n" \ ++ " beqz %0, 1b \n" \ ++ extable \ ++ " .set mips0 \n" \ ++ : "=&r" (temp), "+m" (v->counter) \ ++ : "Ir" (i)); \ + } else { \ + unsigned long flags; \ + \ + raw_local_irq_save(flags); \ +- v->counter c_op i; \ ++ __asm__ __volatile__( \ ++ "2: " #asm_op " %0, %1 \n" \ ++ extable \ ++ : "+r" (v->counter) : "Ir" (i)); \ + raw_local_irq_restore(flags); \ + } \ + } \ + +-#define ATOMIC_OP_RETURN(op, c_op, asm_op) \ +-static __inline__ int atomic_##op##_return(int i, atomic_t * v) \ ++#define ATOMIC_OP(op, asm_op) __ATOMIC_OP(op, , asm_op##u) \ ++ __ATOMIC_OP(op, _unchecked, asm_op) ++ ++#define __ATOMIC_OP_RETURN(op, suffix, asm_op, post_op, extable) \ ++static inline int atomic_##op##_return##suffix(int i, atomic##suffix##_t * v) \ + { \ + int result; \ + \ +@@ -88,37 +142,47 @@ static __inline__ int atomic_##op##_return(int i, atomic_t * v) \ + int temp; \ + \ + __asm__ __volatile__( \ +- " .set arch=r4000 \n" \ +- "1: ll %1, %2 # atomic_" #op "_return \n" \ +- " " #asm_op " %0, %1, %3 \n" \ ++ " .set mips3 \n" \ ++ "1: ll %1, %2 # atomic_" #op "_return" #suffix "\n" \ ++ "2: " #asm_op " %0, %1, %3 \n" \ + " sc %0, %2 \n" \ + " beqzl %0, 1b \n" \ +- " " #asm_op " %0, %1, %3 \n" \ ++ post_op \ ++ extable \ ++ "4: " #asm_op " %0, %1, %3 \n" \ ++ "5: \n" \ + " .set mips0 \n" \ + : "=&r" (result), "=&r" (temp), "+m" (v->counter) \ + : "Ir" (i)); \ + } else if (kernel_uses_llsc) { \ + int temp; \ + \ +- do { \ +- __asm__ __volatile__( \ +- " .set arch=r4000 \n" \ +- " ll %1, %2 # atomic_" #op "_return \n" \ +- " " #asm_op " %0, %1, %3 \n" \ +- " sc %0, %2 \n" \ +- " .set mips0 \n" \ +- : "=&r" (result), "=&r" (temp), "+m" (v->counter) \ +- : "Ir" (i)); \ +- } while (unlikely(!result)); \ ++ __asm__ __volatile__( \ ++ " .set mips3 \n" \ ++ "1: ll %1, %2 # atomic_" #op "_return" #suffix "\n" \ ++ "2: " #asm_op " %0, %1, %3 \n" \ ++ " sc %0, %2 \n" \ ++ " beqz %0, 1b \n" \ ++ post_op \ ++ extable \ ++ "4: " #asm_op " %0, %1, %3 \n" \ ++ "5: \n" \ ++ " .set mips0 \n" \ ++ : "=&r" (result), "=&r" (temp), "+m" (v->counter) \ ++ : "Ir" (i)); \ + \ + result = temp; result c_op i; \ + } else { \ + unsigned long flags; \ + \ + raw_local_irq_save(flags); \ +- result = v->counter; \ +- result c_op i; \ +- v->counter = result; \ ++ __asm__ __volatile__( \ ++ " lw %0, %1 \n" \ ++ "2: " #asm_op " %0, %1, %2 \n" \ ++ " sw %0, %1 \n" \ ++ "3: \n" \ ++ extable \ ++ : "=&r" (result), "+m" (v->counter) : "Ir" (i)); \ + raw_local_irq_restore(flags); \ + } \ + \ +@@ -127,16 +191,21 @@ static __inline__ int atomic_##op##_return(int i, atomic_t * v) \ + return result; \ + } + +-#define ATOMIC_OPS(op, c_op, asm_op) \ +- ATOMIC_OP(op, c_op, asm_op) \ +- ATOMIC_OP_RETURN(op, c_op, asm_op) ++#define ATOMIC_OP_RETURN(op, asm_op) __ATOMIC_OP_RETURN(op, _unchecked, asm_op##u, , ) \ ++ __ATOMIC_OP_RETURN(op, , asm_op, __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++ ++#define ATOMIC_OPS(op, asm_op) \ ++ ATOMIC_OP(op, asm_op) \ ++ ATOMIC_OP_RETURN(op, asm_op) + +-ATOMIC_OPS(add, +=, addu) +-ATOMIC_OPS(sub, -=, subu) ++ATOMIC_OPS(add, add) ++ATOMIC_OPS(sub, sub) + + #undef ATOMIC_OPS + #undef ATOMIC_OP_RETURN ++#undef __ATOMIC_OP_RETURN + #undef ATOMIC_OP ++#undef __ATOMIC_OP + + /* + * atomic_sub_if_positive - conditionally subtract integer from atomic variable +@@ -146,7 +215,7 @@ ATOMIC_OPS(sub, -=, subu) + * Atomically test @v and subtract @i if @v is greater or equal than @i. + * The function returns the old value of @v minus @i. + */ +-static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) ++static __inline__ int atomic_sub_if_positive(int i, atomic_t *v) + { + int result; + +@@ -203,8 +272,26 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) + return result; + } + +-#define atomic_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) +-#define atomic_xchg(v, new) (xchg(&((v)->counter), (new))) ++static inline int atomic_cmpxchg(atomic_t *v, int old, int new) ++{ ++ return cmpxchg(&v->counter, old, new); ++} ++ ++static inline int atomic_cmpxchg_unchecked(atomic_unchecked_t *v, int old, ++ int new) ++{ ++ return cmpxchg(&(v->counter), old, new); ++} ++ ++static inline int atomic_xchg(atomic_t *v, int new) ++{ ++ return xchg(&v->counter, new); ++} ++ ++static inline int atomic_xchg_unchecked(atomic_unchecked_t *v, int new) ++{ ++ return xchg(&(v->counter), new); ++} + + /** + * __atomic_add_unless - add unless the number is a given value +@@ -232,6 +319,10 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) + + #define atomic_dec_return(v) atomic_sub_return(1, (v)) + #define atomic_inc_return(v) atomic_add_return(1, (v)) ++static __inline__ int atomic_inc_return_unchecked(atomic_unchecked_t *v) ++{ ++ return atomic_add_return_unchecked(1, v); ++} + + /* + * atomic_sub_and_test - subtract value from variable and test result +@@ -253,6 +344,10 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) + * other cases. + */ + #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0) ++static __inline__ int atomic_inc_and_test_unchecked(atomic_unchecked_t *v) ++{ ++ return atomic_add_return_unchecked(1, v) == 0; ++} + + /* + * atomic_dec_and_test - decrement by 1 and test +@@ -277,6 +372,10 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) + * Atomically increments @v by 1. + */ + #define atomic_inc(v) atomic_add(1, (v)) ++static __inline__ void atomic_inc_unchecked(atomic_unchecked_t *v) ++{ ++ atomic_add_unchecked(1, v); ++} + + /* + * atomic_dec - decrement and test +@@ -285,6 +384,10 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) + * Atomically decrements @v by 1. + */ + #define atomic_dec(v) atomic_sub(1, (v)) ++static __inline__ void atomic_dec_unchecked(atomic_unchecked_t *v) ++{ ++ atomic_sub_unchecked(1, v); ++} + + /* + * atomic_add_negative - add and test if negative +@@ -306,54 +409,77 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) + * @v: pointer of type atomic64_t + * + */ +-#define atomic64_read(v) ACCESS_ONCE((v)->counter) ++static inline long atomic64_read(const atomic64_t *v) ++{ ++ return ACCESS_ONCE(v->counter); ++} ++ ++static inline long atomic64_read_unchecked(const atomic64_unchecked_t *v) ++{ ++ return ACCESS_ONCE(v->counter); ++} + + /* + * atomic64_set - set atomic variable + * @v: pointer of type atomic64_t + * @i: required value + */ +-#define atomic64_set(v, i) ((v)->counter = (i)) ++static inline void atomic64_set(atomic64_t *v, long i) ++{ ++ v->counter = i; ++} ++ ++static inline void atomic64_set_unchecked(atomic64_unchecked_t *v, long i) ++{ ++ v->counter = i; ++} + +-#define ATOMIC64_OP(op, c_op, asm_op) \ +-static __inline__ void atomic64_##op(long i, atomic64_t * v) \ ++#define __ATOMIC64_OP(op, suffix, asm_op, extable) \ ++static inline void atomic64_##op##suffix(long i, atomic64##suffix##_t * v) \ + { \ + if (kernel_uses_llsc && R10000_LLSC_WAR) { \ + long temp; \ + \ + __asm__ __volatile__( \ +- " .set arch=r4000 \n" \ +- "1: lld %0, %1 # atomic64_" #op " \n" \ +- " " #asm_op " %0, %2 \n" \ ++ " .set mips3 \n" \ ++ "1: lld %0, %1 # atomic64_" #op #suffix "\n" \ ++ "2: " #asm_op " %0, %2 \n" \ + " scd %0, %1 \n" \ + " beqzl %0, 1b \n" \ ++ extable \ + " .set mips0 \n" \ + : "=&r" (temp), "+m" (v->counter) \ + : "Ir" (i)); \ + } else if (kernel_uses_llsc) { \ + long temp; \ + \ +- do { \ +- __asm__ __volatile__( \ +- " .set arch=r4000 \n" \ +- " lld %0, %1 # atomic64_" #op "\n" \ +- " " #asm_op " %0, %2 \n" \ +- " scd %0, %1 \n" \ +- " .set mips0 \n" \ +- : "=&r" (temp), "+m" (v->counter) \ +- : "Ir" (i)); \ +- } while (unlikely(!temp)); \ ++ __asm__ __volatile__( \ ++ " .set mips3 \n" \ ++ " lld %0, %1 # atomic64_" #op #suffix "\n" \ ++ "2: " #asm_op " %0, %2 \n" \ ++ " scd %0, %1 \n" \ ++ " beqz %0, 1b \n" \ ++ extable \ ++ " .set mips0 \n" \ ++ : "=&r" (temp), "+m" (v->counter) \ ++ : "Ir" (i)); \ + } else { \ + unsigned long flags; \ + \ + raw_local_irq_save(flags); \ +- v->counter c_op i; \ ++ __asm__ __volatile__( \ ++ "2: " #asm_op " %0, %1 \n" \ ++ extable \ ++ : "+r" (v->counter) : "Ir" (i)); \ + raw_local_irq_restore(flags); \ + } \ + } \ + +-#define ATOMIC64_OP_RETURN(op, c_op, asm_op) \ +-static __inline__ long atomic64_##op##_return(long i, atomic64_t * v) \ ++#define ATOMIC64_OP(op, asm_op) __ATOMIC64_OP(op, , asm_op##u) \ ++ __ATOMIC64_OP(op, _unchecked, asm_op) ++ ++#define __ATOMIC64_OP_RETURN(op, suffix, asm_op, post_op, extable) \ ++static inline long atomic64_##op##_return##suffix(long i, atomic64##suffix##_t * v)\ + { \ + long result; \ + \ +@@ -363,38 +489,48 @@ static __inline__ long atomic64_##op##_return(long i, atomic64_t * v) \ + long temp; \ + \ + __asm__ __volatile__( \ +- " .set arch=r4000 \n" \ ++ " .set mips3 \n" \ + "1: lld %1, %2 # atomic64_" #op "_return\n" \ +- " " #asm_op " %0, %1, %3 \n" \ ++ "2: " #asm_op " %0, %1, %3 \n" \ + " scd %0, %2 \n" \ + " beqzl %0, 1b \n" \ +- " " #asm_op " %0, %1, %3 \n" \ ++ post_op \ ++ extable \ ++ "4: " #asm_op " %0, %1, %3 \n" \ ++ "5: \n" \ + " .set mips0 \n" \ + : "=&r" (result), "=&r" (temp), "+m" (v->counter) \ + : "Ir" (i)); \ + } else if (kernel_uses_llsc) { \ + long temp; \ + \ +- do { \ +- __asm__ __volatile__( \ +- " .set arch=r4000 \n" \ +- " lld %1, %2 # atomic64_" #op "_return\n" \ +- " " #asm_op " %0, %1, %3 \n" \ +- " scd %0, %2 \n" \ +- " .set mips0 \n" \ +- : "=&r" (result), "=&r" (temp), "=m" (v->counter) \ +- : "Ir" (i), "m" (v->counter) \ +- : "memory"); \ +- } while (unlikely(!result)); \ ++ __asm__ __volatile__( \ ++ " .set mips3 \n" \ ++ "1: lld %1, %2 # atomic64_" #op "_return" #suffix "\n" \ ++ "2: " #asm_op " %0, %1, %3 \n" \ ++ " scd %0, %2 \n" \ ++ " beqz %0, 1b \n" \ ++ post_op \ ++ extable \ ++ "4: " #asm_op " %0, %1, %3 \n" \ ++ "5: \n" \ ++ " .set mips0 \n" \ ++ : "=&r" (result), "=&r" (temp), "=m" (v->counter) \ ++ : "Ir" (i), "m" (v->counter) \ ++ : "memory"); \ + \ + result = temp; result c_op i; \ + } else { \ + unsigned long flags; \ + \ + raw_local_irq_save(flags); \ +- result = v->counter; \ +- result c_op i; \ +- v->counter = result; \ ++ __asm__ __volatile__( \ ++ " ld %0, %1 \n" \ ++ "2: " #asm_op " %0, %1, %2 \n" \ ++ " sd %0, %1 \n" \ ++ "3: \n" \ ++ extable \ ++ : "=&r" (result), "+m" (v->counter) : "Ir" (i)); \ + raw_local_irq_restore(flags); \ + } \ + \ +@@ -403,16 +539,23 @@ static __inline__ long atomic64_##op##_return(long i, atomic64_t * v) \ + return result; \ + } + +-#define ATOMIC64_OPS(op, c_op, asm_op) \ +- ATOMIC64_OP(op, c_op, asm_op) \ +- ATOMIC64_OP_RETURN(op, c_op, asm_op) ++#define ATOMIC64_OP_RETURN(op, asm_op) __ATOMIC64_OP_RETURN(op, _unchecked, asm_op##u, , ) \ ++ __ATOMIC64_OP_RETURN(op, , asm_op, __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++ ++#define ATOMIC64_OPS(op, asm_op) \ ++ ATOMIC64_OP(op, asm_op) \ ++ ATOMIC64_OP_RETURN(op, asm_op) + +-ATOMIC64_OPS(add, +=, daddu) +-ATOMIC64_OPS(sub, -=, dsubu) ++ATOMIC64_OPS(add, dadd) ++ATOMIC64_OPS(sub, dsub) + + #undef ATOMIC64_OPS + #undef ATOMIC64_OP_RETURN ++#undef __ATOMIC64_OP_RETURN + #undef ATOMIC64_OP ++#undef __ATOMIC64_OP ++#undef __OVERFLOW_EXTABLE ++#undef __OVERFLOW_POST + + /* + * atomic64_sub_if_positive - conditionally subtract integer from atomic variable +@@ -422,7 +565,7 @@ ATOMIC64_OPS(sub, -=, dsubu) + * Atomically test @v and subtract @i if @v is greater or equal than @i. + * The function returns the old value of @v minus @i. + */ +-static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) ++static __inline__ long atomic64_sub_if_positive(long i, atomic64_t *v) + { + long result; + +@@ -479,9 +622,26 @@ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) + return result; + } + +-#define atomic64_cmpxchg(v, o, n) \ +- ((__typeof__((v)->counter))cmpxchg(&((v)->counter), (o), (n))) +-#define atomic64_xchg(v, new) (xchg(&((v)->counter), (new))) ++static inline long atomic64_cmpxchg(atomic64_t *v, long old, long new) ++{ ++ return cmpxchg(&v->counter, old, new); ++} ++ ++static inline long atomic64_cmpxchg_unchecked(atomic64_unchecked_t *v, long old, ++ long new) ++{ ++ return cmpxchg(&(v->counter), old, new); ++} ++ ++static inline long atomic64_xchg(atomic64_t *v, long new) ++{ ++ return xchg(&v->counter, new); ++} ++ ++static inline long atomic64_xchg_unchecked(atomic64_unchecked_t *v, long new) ++{ ++ return xchg(&(v->counter), new); ++} + + /** + * atomic64_add_unless - add unless the number is a given value +@@ -511,6 +671,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) + + #define atomic64_dec_return(v) atomic64_sub_return(1, (v)) + #define atomic64_inc_return(v) atomic64_add_return(1, (v)) ++#define atomic64_inc_return_unchecked(v) atomic64_add_return_unchecked(1, (v)) + + /* + * atomic64_sub_and_test - subtract value from variable and test result +@@ -532,6 +693,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) + * other cases. + */ + #define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0) ++#define atomic64_inc_and_test_unchecked(v) atomic64_add_return_unchecked(1, (v)) == 0) + + /* + * atomic64_dec_and_test - decrement by 1 and test +@@ -556,6 +718,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) + * Atomically increments @v by 1. + */ + #define atomic64_inc(v) atomic64_add(1, (v)) ++#define atomic64_inc_unchecked(v) atomic64_add_unchecked(1, (v)) + + /* + * atomic64_dec - decrement and test +@@ -564,6 +727,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) + * Atomically decrements @v by 1. + */ + #define atomic64_dec(v) atomic64_sub(1, (v)) ++#define atomic64_dec_unchecked(v) atomic64_sub_unchecked(1, (v)) + + /* + * atomic64_add_negative - add and test if negative +diff --git a/arch/mips/include/asm/barrier.h b/arch/mips/include/asm/barrier.h +index d0101dd..266982c 100644 +--- a/arch/mips/include/asm/barrier.h ++++ b/arch/mips/include/asm/barrier.h +@@ -184,7 +184,7 @@ + do { \ + compiletime_assert_atomic_type(*p); \ + smp_mb(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/arch/mips/include/asm/cache.h b/arch/mips/include/asm/cache.h +index b4db69f..8f3b093 100644 +--- a/arch/mips/include/asm/cache.h ++++ b/arch/mips/include/asm/cache.h +@@ -9,10 +9,11 @@ + #ifndef _ASM_CACHE_H + #define _ASM_CACHE_H + ++#include <linux/const.h> + #include <kmalloc.h> + + #define L1_CACHE_SHIFT CONFIG_MIPS_L1_CACHE_SHIFT +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #define SMP_CACHE_SHIFT L1_CACHE_SHIFT + #define SMP_CACHE_BYTES L1_CACHE_BYTES +diff --git a/arch/mips/include/asm/elf.h b/arch/mips/include/asm/elf.h +index 1d38fe0..9beabc9d 100644 +--- a/arch/mips/include/asm/elf.h ++++ b/arch/mips/include/asm/elf.h +@@ -381,13 +381,16 @@ extern const char *__elf_platform; + #define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2) + #endif + ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE (TASK_IS_32BIT_ADDR ? 0x00400000UL : 0x00400000UL) ++ ++#define PAX_DELTA_MMAP_LEN (TASK_IS_32BIT_ADDR ? 27-PAGE_SHIFT : 36-PAGE_SHIFT) ++#define PAX_DELTA_STACK_LEN (TASK_IS_32BIT_ADDR ? 27-PAGE_SHIFT : 36-PAGE_SHIFT) ++#endif ++ + #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 + struct linux_binprm; + extern int arch_setup_additional_pages(struct linux_binprm *bprm, + int uses_interp); + +-struct mm_struct; +-extern unsigned long arch_randomize_brk(struct mm_struct *mm); +-#define arch_randomize_brk arch_randomize_brk +- + #endif /* _ASM_ELF_H */ +diff --git a/arch/mips/include/asm/exec.h b/arch/mips/include/asm/exec.h +index c1f6afa..38cc6e9 100644 +--- a/arch/mips/include/asm/exec.h ++++ b/arch/mips/include/asm/exec.h +@@ -12,6 +12,6 @@ + #ifndef _ASM_EXEC_H + #define _ASM_EXEC_H + +-extern unsigned long arch_align_stack(unsigned long sp); ++#define arch_align_stack(x) ((x) & ~0xfUL) + + #endif /* _ASM_EXEC_H */ +diff --git a/arch/mips/include/asm/hw_irq.h b/arch/mips/include/asm/hw_irq.h +index 9e8ef59..1139d6b 100644 +--- a/arch/mips/include/asm/hw_irq.h ++++ b/arch/mips/include/asm/hw_irq.h +@@ -10,7 +10,7 @@ + + #include <linux/atomic.h> + +-extern atomic_t irq_err_count; ++extern atomic_unchecked_t irq_err_count; + + /* + * interrupt-retrigger: NOP for now. This may not be appropriate for all +diff --git a/arch/mips/include/asm/local.h b/arch/mips/include/asm/local.h +index 46dfc3c..a16b13a 100644 +--- a/arch/mips/include/asm/local.h ++++ b/arch/mips/include/asm/local.h +@@ -12,15 +12,25 @@ typedef struct + atomic_long_t a; + } local_t; + ++typedef struct { ++ atomic_long_unchecked_t a; ++} local_unchecked_t; ++ + #define LOCAL_INIT(i) { ATOMIC_LONG_INIT(i) } + + #define local_read(l) atomic_long_read(&(l)->a) ++#define local_read_unchecked(l) atomic_long_read_unchecked(&(l)->a) + #define local_set(l, i) atomic_long_set(&(l)->a, (i)) ++#define local_set_unchecked(l, i) atomic_long_set_unchecked(&(l)->a, (i)) + + #define local_add(i, l) atomic_long_add((i), (&(l)->a)) ++#define local_add_unchecked(i, l) atomic_long_add_unchecked((i), (&(l)->a)) + #define local_sub(i, l) atomic_long_sub((i), (&(l)->a)) ++#define local_sub_unchecked(i, l) atomic_long_sub_unchecked((i), (&(l)->a)) + #define local_inc(l) atomic_long_inc(&(l)->a) ++#define local_inc_unchecked(l) atomic_long_inc_unchecked(&(l)->a) + #define local_dec(l) atomic_long_dec(&(l)->a) ++#define local_dec_unchecked(l) atomic_long_dec_unchecked(&(l)->a) + + /* + * Same as above, but return the result value +@@ -70,6 +80,51 @@ static __inline__ long local_add_return(long i, local_t * l) + return result; + } + ++static __inline__ long local_add_return_unchecked(long i, local_unchecked_t * l) ++{ ++ unsigned long result; ++ ++ if (kernel_uses_llsc && R10000_LLSC_WAR) { ++ unsigned long temp; ++ ++ __asm__ __volatile__( ++ " .set mips3 \n" ++ "1:" __LL "%1, %2 # local_add_return \n" ++ " addu %0, %1, %3 \n" ++ __SC "%0, %2 \n" ++ " beqzl %0, 1b \n" ++ " addu %0, %1, %3 \n" ++ " .set mips0 \n" ++ : "=&r" (result), "=&r" (temp), "=m" (l->a.counter) ++ : "Ir" (i), "m" (l->a.counter) ++ : "memory"); ++ } else if (kernel_uses_llsc) { ++ unsigned long temp; ++ ++ __asm__ __volatile__( ++ " .set mips3 \n" ++ "1:" __LL "%1, %2 # local_add_return \n" ++ " addu %0, %1, %3 \n" ++ __SC "%0, %2 \n" ++ " beqz %0, 1b \n" ++ " addu %0, %1, %3 \n" ++ " .set mips0 \n" ++ : "=&r" (result), "=&r" (temp), "=m" (l->a.counter) ++ : "Ir" (i), "m" (l->a.counter) ++ : "memory"); ++ } else { ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ result = l->a.counter; ++ result += i; ++ l->a.counter = result; ++ local_irq_restore(flags); ++ } ++ ++ return result; ++} ++ + static __inline__ long local_sub_return(long i, local_t * l) + { + unsigned long result; +@@ -117,6 +172,8 @@ static __inline__ long local_sub_return(long i, local_t * l) + + #define local_cmpxchg(l, o, n) \ + ((long)cmpxchg_local(&((l)->a.counter), (o), (n))) ++#define local_cmpxchg_unchecked(l, o, n) \ ++ ((long)cmpxchg_local(&((l)->a.counter), (o), (n))) + #define local_xchg(l, n) (atomic_long_xchg((&(l)->a), (n))) + + /** +diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h +index 3be8180..c4798d5 100644 +--- a/arch/mips/include/asm/page.h ++++ b/arch/mips/include/asm/page.h +@@ -120,7 +120,7 @@ extern void copy_user_highpage(struct page *to, struct page *from, + #ifdef CONFIG_CPU_MIPS32 + typedef struct { unsigned long pte_low, pte_high; } pte_t; + #define pte_val(x) ((x).pte_low | ((unsigned long long)(x).pte_high << 32)) +- #define __pte(x) ({ pte_t __pte = {(x), ((unsigned long long)(x)) >> 32}; __pte; }) ++ #define __pte(x) ({ pte_t __pte = {(x), (x) >> 32}; __pte; }) + #else + typedef struct { unsigned long long pte; } pte_t; + #define pte_val(x) ((x).pte) +diff --git a/arch/mips/include/asm/pgalloc.h b/arch/mips/include/asm/pgalloc.h +index b336037..5b874cc 100644 +--- a/arch/mips/include/asm/pgalloc.h ++++ b/arch/mips/include/asm/pgalloc.h +@@ -37,6 +37,11 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) + { + set_pud(pud, __pud((unsigned long)pmd)); + } ++ ++static inline void pud_populate_kernel(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) ++{ ++ pud_populate(mm, pud, pmd); ++} + #endif + + /* +diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h +index bc3fc4f..e2483f0 100644 +--- a/arch/mips/include/asm/pgtable.h ++++ b/arch/mips/include/asm/pgtable.h +@@ -20,6 +20,9 @@ + #include <asm/io.h> + #include <asm/pgtable-bits.h> + ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) ++ + struct mm_struct; + struct vm_area_struct; + +diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h +index 7de8658..c109224 100644 +--- a/arch/mips/include/asm/thread_info.h ++++ b/arch/mips/include/asm/thread_info.h +@@ -105,6 +105,9 @@ static inline struct thread_info *current_thread_info(void) + #define TIF_SECCOMP 4 /* secure computing */ + #define TIF_NOTIFY_RESUME 5 /* callback before returning to user */ + #define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ ++/* li takes a 32bit immediate */ ++#define TIF_GRSEC_SETXID 10 /* update credentials on syscall entry/exit */ ++ + #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ + #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ + #define TIF_NOHZ 19 /* in adaptive nohz mode */ +@@ -138,14 +141,16 @@ static inline struct thread_info *current_thread_info(void) + #define _TIF_USEDMSA (1<<TIF_USEDMSA) + #define _TIF_MSA_CTX_LIVE (1<<TIF_MSA_CTX_LIVE) + #define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) ++#define _TIF_GRSEC_SETXID (1<<TIF_GRSEC_SETXID) + + #define _TIF_WORK_SYSCALL_ENTRY (_TIF_NOHZ | _TIF_SYSCALL_TRACE | \ + _TIF_SYSCALL_AUDIT | \ +- _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP) ++ _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \ ++ _TIF_GRSEC_SETXID) + + /* work to do in syscall_trace_leave() */ + #define _TIF_WORK_SYSCALL_EXIT (_TIF_NOHZ | _TIF_SYSCALL_TRACE | \ +- _TIF_SYSCALL_AUDIT | _TIF_SYSCALL_TRACEPOINT) ++ _TIF_SYSCALL_AUDIT | _TIF_SYSCALL_TRACEPOINT | _TIF_GRSEC_SETXID) + + /* work to do on interrupt/exception return */ + #define _TIF_WORK_MASK \ +@@ -153,7 +158,7 @@ static inline struct thread_info *current_thread_info(void) + /* work to do on any return to u-space */ + #define _TIF_ALLWORK_MASK (_TIF_NOHZ | _TIF_WORK_MASK | \ + _TIF_WORK_SYSCALL_EXIT | \ +- _TIF_SYSCALL_TRACEPOINT) ++ _TIF_SYSCALL_TRACEPOINT | _TIF_GRSEC_SETXID) + + /* + * We stash processor id into a COP0 register to retrieve it fast +diff --git a/arch/mips/include/asm/uaccess.h b/arch/mips/include/asm/uaccess.h +index 22a5624..7c96295 100644 +--- a/arch/mips/include/asm/uaccess.h ++++ b/arch/mips/include/asm/uaccess.h +@@ -130,6 +130,7 @@ extern u64 __ua_limit; + __ok == 0; \ + }) + ++#define access_ok_noprefault(type, addr, size) access_ok((type), (addr), (size)) + #define access_ok(type, addr, size) \ + likely(__access_ok((addr), (size), __access_mask)) + +diff --git a/arch/mips/kernel/binfmt_elfn32.c b/arch/mips/kernel/binfmt_elfn32.c +index 1188e00..41cf144 100644 +--- a/arch/mips/kernel/binfmt_elfn32.c ++++ b/arch/mips/kernel/binfmt_elfn32.c +@@ -50,6 +50,13 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; + #undef ELF_ET_DYN_BASE + #define ELF_ET_DYN_BASE (TASK32_SIZE / 3 * 2) + ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE (TASK_IS_32BIT_ADDR ? 0x00400000UL : 0x00400000UL) ++ ++#define PAX_DELTA_MMAP_LEN (TASK_IS_32BIT_ADDR ? 27-PAGE_SHIFT : 36-PAGE_SHIFT) ++#define PAX_DELTA_STACK_LEN (TASK_IS_32BIT_ADDR ? 27-PAGE_SHIFT : 36-PAGE_SHIFT) ++#endif ++ + #include <asm/processor.h> + #include <linux/module.h> + #include <linux/elfcore.h> +diff --git a/arch/mips/kernel/binfmt_elfo32.c b/arch/mips/kernel/binfmt_elfo32.c +index 9287678..f870e47 100644 +--- a/arch/mips/kernel/binfmt_elfo32.c ++++ b/arch/mips/kernel/binfmt_elfo32.c +@@ -70,6 +70,13 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; + #undef ELF_ET_DYN_BASE + #define ELF_ET_DYN_BASE (TASK32_SIZE / 3 * 2) + ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE (TASK_IS_32BIT_ADDR ? 0x00400000UL : 0x00400000UL) ++ ++#define PAX_DELTA_MMAP_LEN (TASK_IS_32BIT_ADDR ? 27-PAGE_SHIFT : 36-PAGE_SHIFT) ++#define PAX_DELTA_STACK_LEN (TASK_IS_32BIT_ADDR ? 27-PAGE_SHIFT : 36-PAGE_SHIFT) ++#endif ++ + #include <asm/processor.h> + + #include <linux/module.h> +diff --git a/arch/mips/kernel/i8259.c b/arch/mips/kernel/i8259.c +index 50b3648..c2f3cec 100644 +--- a/arch/mips/kernel/i8259.c ++++ b/arch/mips/kernel/i8259.c +@@ -201,7 +201,7 @@ spurious_8259A_irq: + printk(KERN_DEBUG "spurious 8259A interrupt: IRQ%d.\n", irq); + spurious_irq_mask |= irqmask; + } +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + /* + * Theoretically we do not have to handle this IRQ, + * but in Linux this does not cause problems and is +diff --git a/arch/mips/kernel/irq-gt641xx.c b/arch/mips/kernel/irq-gt641xx.c +index 44a1f79..2bd6aa3 100644 +--- a/arch/mips/kernel/irq-gt641xx.c ++++ b/arch/mips/kernel/irq-gt641xx.c +@@ -110,7 +110,7 @@ void gt641xx_irq_dispatch(void) + } + } + +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + } + + void __init gt641xx_irq_init(void) +diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c +index d2bfbc2..a8eacd2 100644 +--- a/arch/mips/kernel/irq.c ++++ b/arch/mips/kernel/irq.c +@@ -76,17 +76,17 @@ void ack_bad_irq(unsigned int irq) + printk("unexpected IRQ # %d\n", irq); + } + +-atomic_t irq_err_count; ++atomic_unchecked_t irq_err_count; + + int arch_show_interrupts(struct seq_file *p, int prec) + { +- seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read(&irq_err_count)); ++ seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read_unchecked(&irq_err_count)); + return 0; + } + + asmlinkage void spurious_interrupt(void) + { +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + } + + void __init init_IRQ(void) +@@ -109,7 +109,10 @@ void __init init_IRQ(void) + #endif + } + ++ + #ifdef DEBUG_STACKOVERFLOW ++extern void gr_handle_kernel_exploit(void); ++ + static inline void check_stack_overflow(void) + { + unsigned long sp; +@@ -125,6 +128,7 @@ static inline void check_stack_overflow(void) + printk("do_IRQ: stack overflow: %ld\n", + sp - sizeof(struct thread_info)); + dump_stack(); ++ gr_handle_kernel_exploit(); + } + } + #else +diff --git a/arch/mips/kernel/pm-cps.c b/arch/mips/kernel/pm-cps.c +index 0614717..002fa43 100644 +--- a/arch/mips/kernel/pm-cps.c ++++ b/arch/mips/kernel/pm-cps.c +@@ -172,7 +172,7 @@ int cps_pm_enter_state(enum cps_pm_state state) + nc_core_ready_count = nc_addr; + + /* Ensure ready_count is zero-initialised before the assembly runs */ +- ACCESS_ONCE(*nc_core_ready_count) = 0; ++ ACCESS_ONCE_RW(*nc_core_ready_count) = 0; + coupled_barrier(&per_cpu(pm_barrier, core), online); + + /* Run the generated entry code */ +diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c +index 636b074..8fbb91f 100644 +--- a/arch/mips/kernel/process.c ++++ b/arch/mips/kernel/process.c +@@ -520,15 +520,3 @@ unsigned long get_wchan(struct task_struct *task) + out: + return pc; + } +- +-/* +- * Don't forget that the stack pointer must be aligned on a 8 bytes +- * boundary for 32-bits ABI and 16 bytes for 64-bits ABI. +- */ +-unsigned long arch_align_stack(unsigned long sp) +-{ +- if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space) +- sp -= get_random_int() & ~PAGE_MASK; +- +- return sp & ALMASK; +-} +diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c +index 9d1487d..10c5da5 100644 +--- a/arch/mips/kernel/ptrace.c ++++ b/arch/mips/kernel/ptrace.c +@@ -761,6 +761,10 @@ long arch_ptrace(struct task_struct *child, long request, + return ret; + } + ++#ifdef CONFIG_GRKERNSEC_SETXID ++extern void gr_delayed_cred_worker(void); ++#endif ++ + /* + * Notification of system call entry/exit + * - triggered by current->work.syscall_trace +@@ -777,6 +781,11 @@ asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall) + tracehook_report_syscall_entry(regs)) + ret = -1; + ++#ifdef CONFIG_GRKERNSEC_SETXID ++ if (unlikely(test_and_clear_thread_flag(TIF_GRSEC_SETXID))) ++ gr_delayed_cred_worker(); ++#endif ++ + if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) + trace_sys_enter(regs, regs->regs[2]); + +diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c +index 07fc524..b9d7f28 100644 +--- a/arch/mips/kernel/reset.c ++++ b/arch/mips/kernel/reset.c +@@ -13,6 +13,7 @@ + #include <linux/reboot.h> + + #include <asm/reboot.h> ++#include <asm/bug.h> + + /* + * Urgs ... Too many MIPS machines to handle this in a generic way. +@@ -29,16 +30,19 @@ void machine_restart(char *command) + { + if (_machine_restart) + _machine_restart(command); ++ BUG(); + } + + void machine_halt(void) + { + if (_machine_halt) + _machine_halt(); ++ BUG(); + } + + void machine_power_off(void) + { + if (pm_power_off) + pm_power_off(); ++ BUG(); + } +diff --git a/arch/mips/kernel/sync-r4k.c b/arch/mips/kernel/sync-r4k.c +index 2242bdd..b284048 100644 +--- a/arch/mips/kernel/sync-r4k.c ++++ b/arch/mips/kernel/sync-r4k.c +@@ -18,8 +18,8 @@ + #include <asm/mipsregs.h> + + static atomic_t count_start_flag = ATOMIC_INIT(0); +-static atomic_t count_count_start = ATOMIC_INIT(0); +-static atomic_t count_count_stop = ATOMIC_INIT(0); ++static atomic_unchecked_t count_count_start = ATOMIC_INIT(0); ++static atomic_unchecked_t count_count_stop = ATOMIC_INIT(0); + static atomic_t count_reference = ATOMIC_INIT(0); + + #define COUNTON 100 +@@ -58,13 +58,13 @@ void synchronise_count_master(int cpu) + + for (i = 0; i < NR_LOOPS; i++) { + /* slaves loop on '!= 2' */ +- while (atomic_read(&count_count_start) != 1) ++ while (atomic_read_unchecked(&count_count_start) != 1) + mb(); +- atomic_set(&count_count_stop, 0); ++ atomic_set_unchecked(&count_count_stop, 0); + smp_wmb(); + + /* this lets the slaves write their count register */ +- atomic_inc(&count_count_start); ++ atomic_inc_unchecked(&count_count_start); + + /* + * Everyone initialises count in the last loop: +@@ -75,11 +75,11 @@ void synchronise_count_master(int cpu) + /* + * Wait for all slaves to leave the synchronization point: + */ +- while (atomic_read(&count_count_stop) != 1) ++ while (atomic_read_unchecked(&count_count_stop) != 1) + mb(); +- atomic_set(&count_count_start, 0); ++ atomic_set_unchecked(&count_count_start, 0); + smp_wmb(); +- atomic_inc(&count_count_stop); ++ atomic_inc_unchecked(&count_count_stop); + } + /* Arrange for an interrupt in a short while */ + write_c0_compare(read_c0_count() + COUNTON); +@@ -112,8 +112,8 @@ void synchronise_count_slave(int cpu) + initcount = atomic_read(&count_reference); + + for (i = 0; i < NR_LOOPS; i++) { +- atomic_inc(&count_count_start); +- while (atomic_read(&count_count_start) != 2) ++ atomic_inc_unchecked(&count_count_start); ++ while (atomic_read_unchecked(&count_count_start) != 2) + mb(); + + /* +@@ -122,8 +122,8 @@ void synchronise_count_slave(int cpu) + if (i == NR_LOOPS-1) + write_c0_count(initcount); + +- atomic_inc(&count_count_stop); +- while (atomic_read(&count_count_stop) != 2) ++ atomic_inc_unchecked(&count_count_stop); ++ while (atomic_read_unchecked(&count_count_stop) != 2) + mb(); + } + /* Arrange for an interrupt in a short while */ +diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c +index d255a2a..916271c 100644 +--- a/arch/mips/kernel/traps.c ++++ b/arch/mips/kernel/traps.c +@@ -688,7 +688,18 @@ asmlinkage void do_ov(struct pt_regs *regs) + siginfo_t info; + + prev_state = exception_enter(); +- die_if_kernel("Integer overflow", regs); ++ if (unlikely(!user_mode(regs))) { ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ if (fixup_exception(regs)) { ++ pax_report_refcount_overflow(regs); ++ exception_exit(prev_state); ++ return; ++ } ++#endif ++ ++ die("Integer overflow", regs); ++ } + + info.si_code = FPE_INTOVF; + info.si_signo = SIGFPE; +diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c +index 270bbd4..c01932a 100644 +--- a/arch/mips/kvm/mips.c ++++ b/arch/mips/kvm/mips.c +@@ -815,7 +815,7 @@ long kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) + return r; + } + +-int kvm_arch_init(void *opaque) ++int kvm_arch_init(const void *opaque) + { + if (kvm_mips_callbacks) { + kvm_err("kvm: module already exists\n"); +diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c +index 70ab5d6..62940fe 100644 +--- a/arch/mips/mm/fault.c ++++ b/arch/mips/mm/fault.c +@@ -28,6 +28,23 @@ + #include <asm/highmem.h> /* For VMALLOC_END */ + #include <linux/kdebug.h> + ++#ifdef CONFIG_PAX_PAGEEXEC ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ unsigned long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 5; i++) { ++ unsigned int c; ++ if (get_user(c, (unsigned int *)pc+i)) ++ printk(KERN_CONT "???????? "); ++ else ++ printk(KERN_CONT "%08x ", c); ++ } ++ printk("\n"); ++} ++#endif ++ + /* + * This routine handles page faults. It determines the address, + * and the problem, and then passes it off to one of the appropriate +@@ -201,6 +218,14 @@ bad_area: + bad_area_nosemaphore: + /* User mode accesses just cause a SIGSEGV */ + if (user_mode(regs)) { ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (cpu_has_rixi && (mm->pax_flags & MF_PAX_PAGEEXEC) && !write && address == instruction_pointer(regs)) { ++ pax_report_fault(regs, (void *)address, (void *)user_stack_pointer(regs)); ++ do_group_exit(SIGKILL); ++ } ++#endif ++ + tsk->thread.cp0_badvaddr = address; + tsk->thread.error_code = write; + #if 0 +diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c +index f1baadd..5472dca 100644 +--- a/arch/mips/mm/mmap.c ++++ b/arch/mips/mm/mmap.c +@@ -59,6 +59,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, + struct vm_area_struct *vma; + unsigned long addr = addr0; + int do_color_align; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + struct vm_unmapped_area_info info; + + if (unlikely(len > TASK_SIZE)) +@@ -84,6 +85,11 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, + do_color_align = 1; + + /* requesting a specific address */ ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(current->mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + if (do_color_align) + addr = COLOUR_ALIGN(addr, pgoff); +@@ -91,14 +97,14 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp, + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + + info.length = len; + info.align_mask = do_color_align ? (PAGE_MASK & shm_align_mask) : 0; + info.align_offset = pgoff << PAGE_SHIFT; ++ info.threadstack_offset = offset; + + if (dir == DOWN) { + info.flags = VM_UNMAPPED_AREA_TOPDOWN; +@@ -146,6 +152,10 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + { + unsigned long random_factor = 0UL; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (current->flags & PF_RANDOMIZE) { + random_factor = get_random_int(); + random_factor = random_factor << PAGE_SHIFT; +@@ -157,38 +167,23 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + + if (mmap_is_legacy()) { + mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base += mm->delta_mmap; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area; + } else { + mm->mmap_base = mmap_base(random_factor); +- mm->get_unmapped_area = arch_get_unmapped_area_topdown; +- } +-} +- +-static inline unsigned long brk_rnd(void) +-{ +- unsigned long rnd = get_random_int(); +- +- rnd = rnd << PAGE_SHIFT; +- /* 8MB for 32bit, 256MB for 64bit */ +- if (TASK_IS_32BIT_ADDR) +- rnd = rnd & 0x7ffffful; +- else +- rnd = rnd & 0xffffffful; + +- return rnd; +-} +- +-unsigned long arch_randomize_brk(struct mm_struct *mm) +-{ +- unsigned long base = mm->brk; +- unsigned long ret; ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base -= mm->delta_mmap + mm->delta_stack; ++#endif + +- ret = PAGE_ALIGN(base + brk_rnd()); +- +- if (ret < mm->brk) +- return mm->brk; +- +- return ret; ++ mm->get_unmapped_area = arch_get_unmapped_area_topdown; ++ } + } + + int __virt_addr_valid(const volatile void *kaddr) +diff --git a/arch/mips/pci/pci-octeon.c b/arch/mips/pci/pci-octeon.c +index 59cccd9..f39ac2f 100644 +--- a/arch/mips/pci/pci-octeon.c ++++ b/arch/mips/pci/pci-octeon.c +@@ -327,8 +327,8 @@ static int octeon_write_config(struct pci_bus *bus, unsigned int devfn, + + + static struct pci_ops octeon_pci_ops = { +- octeon_read_config, +- octeon_write_config, ++ .read = octeon_read_config, ++ .write = octeon_write_config, + }; + + static struct resource octeon_pci_mem_resource = { +diff --git a/arch/mips/pci/pcie-octeon.c b/arch/mips/pci/pcie-octeon.c +index 5e36c33..eb4a17b 100644 +--- a/arch/mips/pci/pcie-octeon.c ++++ b/arch/mips/pci/pcie-octeon.c +@@ -1792,8 +1792,8 @@ static int octeon_dummy_write_config(struct pci_bus *bus, unsigned int devfn, + } + + static struct pci_ops octeon_pcie0_ops = { +- octeon_pcie0_read_config, +- octeon_pcie0_write_config, ++ .read = octeon_pcie0_read_config, ++ .write = octeon_pcie0_write_config, + }; + + static struct resource octeon_pcie0_mem_resource = { +@@ -1813,8 +1813,8 @@ static struct pci_controller octeon_pcie0_controller = { + }; + + static struct pci_ops octeon_pcie1_ops = { +- octeon_pcie1_read_config, +- octeon_pcie1_write_config, ++ .read = octeon_pcie1_read_config, ++ .write = octeon_pcie1_write_config, + }; + + static struct resource octeon_pcie1_mem_resource = { +@@ -1834,8 +1834,8 @@ static struct pci_controller octeon_pcie1_controller = { + }; + + static struct pci_ops octeon_dummy_ops = { +- octeon_dummy_read_config, +- octeon_dummy_write_config, ++ .read = octeon_dummy_read_config, ++ .write = octeon_dummy_write_config, + }; + + static struct resource octeon_dummy_mem_resource = { +diff --git a/arch/mips/sgi-ip27/ip27-nmi.c b/arch/mips/sgi-ip27/ip27-nmi.c +index a2358b4..7cead4f 100644 +--- a/arch/mips/sgi-ip27/ip27-nmi.c ++++ b/arch/mips/sgi-ip27/ip27-nmi.c +@@ -187,9 +187,9 @@ void + cont_nmi_dump(void) + { + #ifndef REAL_NMI_SIGNAL +- static atomic_t nmied_cpus = ATOMIC_INIT(0); ++ static atomic_unchecked_t nmied_cpus = ATOMIC_INIT(0); + +- atomic_inc(&nmied_cpus); ++ atomic_inc_unchecked(&nmied_cpus); + #endif + /* + * Only allow 1 cpu to proceed +@@ -233,7 +233,7 @@ cont_nmi_dump(void) + udelay(10000); + } + #else +- while (atomic_read(&nmied_cpus) != num_online_cpus()); ++ while (atomic_read_unchecked(&nmied_cpus) != num_online_cpus()); + #endif + + /* +diff --git a/arch/mips/sni/rm200.c b/arch/mips/sni/rm200.c +index a046b30..6799527 100644 +--- a/arch/mips/sni/rm200.c ++++ b/arch/mips/sni/rm200.c +@@ -270,7 +270,7 @@ spurious_8259A_irq: + "spurious RM200 8259A interrupt: IRQ%d.\n", irq); + spurious_irq_mask |= irqmask; + } +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + /* + * Theoretically we do not have to handle this IRQ, + * but in Linux this does not cause problems and is +diff --git a/arch/mips/vr41xx/common/icu.c b/arch/mips/vr41xx/common/icu.c +index 41e873b..34d33a7 100644 +--- a/arch/mips/vr41xx/common/icu.c ++++ b/arch/mips/vr41xx/common/icu.c +@@ -653,7 +653,7 @@ static int icu_get_irq(unsigned int irq) + + printk(KERN_ERR "spurious ICU interrupt: %04x,%04x\n", pend1, pend2); + +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + + return -1; + } +diff --git a/arch/mips/vr41xx/common/irq.c b/arch/mips/vr41xx/common/irq.c +index ae0e4ee..e8f0692 100644 +--- a/arch/mips/vr41xx/common/irq.c ++++ b/arch/mips/vr41xx/common/irq.c +@@ -64,7 +64,7 @@ static void irq_dispatch(unsigned int irq) + irq_cascade_t *cascade; + + if (irq >= NR_IRQS) { +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + return; + } + +@@ -84,7 +84,7 @@ static void irq_dispatch(unsigned int irq) + ret = cascade->get_irq(irq); + irq = ret; + if (ret < 0) +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + else + irq_dispatch(irq); + if (!irqd_irq_disabled(idata) && chip->irq_unmask) +diff --git a/arch/mn10300/proc-mn103e010/include/proc/cache.h b/arch/mn10300/proc-mn103e010/include/proc/cache.h +index 967d144..db12197 100644 +--- a/arch/mn10300/proc-mn103e010/include/proc/cache.h ++++ b/arch/mn10300/proc-mn103e010/include/proc/cache.h +@@ -11,12 +11,14 @@ + #ifndef _ASM_PROC_CACHE_H + #define _ASM_PROC_CACHE_H + ++#include <linux/const.h> ++ + /* L1 cache */ + + #define L1_CACHE_NWAYS 4 /* number of ways in caches */ + #define L1_CACHE_NENTRIES 256 /* number of entries in each way */ +-#define L1_CACHE_BYTES 16 /* bytes per entry */ + #define L1_CACHE_SHIFT 4 /* shift for bytes per entry */ ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) /* bytes per entry */ + #define L1_CACHE_WAYDISP 0x1000 /* displacement of one way from the next */ + + #define L1_CACHE_TAG_VALID 0x00000001 /* cache tag valid bit */ +diff --git a/arch/mn10300/proc-mn2ws0050/include/proc/cache.h b/arch/mn10300/proc-mn2ws0050/include/proc/cache.h +index bcb5df2..84fabd2 100644 +--- a/arch/mn10300/proc-mn2ws0050/include/proc/cache.h ++++ b/arch/mn10300/proc-mn2ws0050/include/proc/cache.h +@@ -16,13 +16,15 @@ + #ifndef _ASM_PROC_CACHE_H + #define _ASM_PROC_CACHE_H + ++#include <linux/const.h> ++ + /* + * L1 cache + */ + #define L1_CACHE_NWAYS 4 /* number of ways in caches */ + #define L1_CACHE_NENTRIES 128 /* number of entries in each way */ +-#define L1_CACHE_BYTES 32 /* bytes per entry */ + #define L1_CACHE_SHIFT 5 /* shift for bytes per entry */ ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) /* bytes per entry */ + #define L1_CACHE_WAYDISP 0x1000 /* distance from one way to the next */ + + #define L1_CACHE_TAG_VALID 0x00000001 /* cache tag valid bit */ +diff --git a/arch/openrisc/include/asm/cache.h b/arch/openrisc/include/asm/cache.h +index 4ce7a01..449202a 100644 +--- a/arch/openrisc/include/asm/cache.h ++++ b/arch/openrisc/include/asm/cache.h +@@ -19,11 +19,13 @@ + #ifndef __ASM_OPENRISC_CACHE_H + #define __ASM_OPENRISC_CACHE_H + ++#include <linux/const.h> ++ + /* FIXME: How can we replace these with values from the CPU... + * they shouldn't be hard-coded! + */ + +-#define L1_CACHE_BYTES 16 + #define L1_CACHE_SHIFT 4 ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #endif /* __ASM_OPENRISC_CACHE_H */ +diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h +index 226f8ca..9d9b87d 100644 +--- a/arch/parisc/include/asm/atomic.h ++++ b/arch/parisc/include/asm/atomic.h +@@ -273,6 +273,16 @@ static inline long atomic64_dec_if_positive(atomic64_t *v) + return dec; + } + ++#define atomic64_read_unchecked(v) atomic64_read(v) ++#define atomic64_set_unchecked(v, i) atomic64_set((v), (i)) ++#define atomic64_add_unchecked(a, v) atomic64_add((a), (v)) ++#define atomic64_add_return_unchecked(a, v) atomic64_add_return((a), (v)) ++#define atomic64_sub_unchecked(a, v) atomic64_sub((a), (v)) ++#define atomic64_inc_unchecked(v) atomic64_inc(v) ++#define atomic64_inc_return_unchecked(v) atomic64_inc_return(v) ++#define atomic64_dec_unchecked(v) atomic64_dec(v) ++#define atomic64_cmpxchg_unchecked(v, o, n) atomic64_cmpxchg((v), (o), (n)) ++ + #endif /* !CONFIG_64BIT */ + + +diff --git a/arch/parisc/include/asm/cache.h b/arch/parisc/include/asm/cache.h +index 47f11c7..3420df2 100644 +--- a/arch/parisc/include/asm/cache.h ++++ b/arch/parisc/include/asm/cache.h +@@ -5,6 +5,7 @@ + #ifndef __ARCH_PARISC_CACHE_H + #define __ARCH_PARISC_CACHE_H + ++#include <linux/const.h> + + /* + * PA 2.0 processors have 64-byte cachelines; PA 1.1 processors have +@@ -15,13 +16,13 @@ + * just ruin performance. + */ + #ifdef CONFIG_PA20 +-#define L1_CACHE_BYTES 64 + #define L1_CACHE_SHIFT 6 + #else +-#define L1_CACHE_BYTES 32 + #define L1_CACHE_SHIFT 5 + #endif + ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) ++ + #ifndef __ASSEMBLY__ + + #define SMP_CACHE_BYTES L1_CACHE_BYTES +diff --git a/arch/parisc/include/asm/elf.h b/arch/parisc/include/asm/elf.h +index 3391d06..c23a2cc 100644 +--- a/arch/parisc/include/asm/elf.h ++++ b/arch/parisc/include/asm/elf.h +@@ -342,6 +342,13 @@ struct pt_regs; /* forward declaration... */ + + #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x01000000) + ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE 0x10000UL ++ ++#define PAX_DELTA_MMAP_LEN 16 ++#define PAX_DELTA_STACK_LEN 16 ++#endif ++ + /* This yields a mask that user programs can use to figure out what + instruction set this CPU supports. This could be done in user space, + but it's not easy, and we've already done it here. */ +diff --git a/arch/parisc/include/asm/pgalloc.h b/arch/parisc/include/asm/pgalloc.h +index f213f5b..0af3e8e 100644 +--- a/arch/parisc/include/asm/pgalloc.h ++++ b/arch/parisc/include/asm/pgalloc.h +@@ -61,6 +61,11 @@ static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd) + (__u32)(__pa((unsigned long)pmd) >> PxD_VALUE_SHIFT)); + } + ++static inline void pgd_populate_kernel(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd) ++{ ++ pgd_populate(mm, pgd, pmd); ++} ++ + static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) + { + pmd_t *pmd = (pmd_t *)__get_free_pages(GFP_KERNEL|__GFP_REPEAT, +@@ -93,6 +98,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) + #define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *)2); }) + #define pmd_free(mm, x) do { } while (0) + #define pgd_populate(mm, pmd, pte) BUG() ++#define pgd_populate_kernel(mm, pmd, pte) BUG() + + #endif + +diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h +index 22b89d1..ce34230 100644 +--- a/arch/parisc/include/asm/pgtable.h ++++ b/arch/parisc/include/asm/pgtable.h +@@ -223,6 +223,17 @@ extern void purge_tlb_entries(struct mm_struct *, unsigned long); + #define PAGE_EXECREAD __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | _PAGE_EXEC |_PAGE_ACCESSED) + #define PAGE_COPY PAGE_EXECREAD + #define PAGE_RWX __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | _PAGE_WRITE | _PAGE_EXEC |_PAGE_ACCESSED) ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++# define PAGE_SHARED_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | _PAGE_WRITE | _PAGE_ACCESSED) ++# define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | _PAGE_ACCESSED) ++# define PAGE_READONLY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | _PAGE_ACCESSED) ++#else ++# define PAGE_SHARED_NOEXEC PAGE_SHARED ++# define PAGE_COPY_NOEXEC PAGE_COPY ++# define PAGE_READONLY_NOEXEC PAGE_READONLY ++#endif ++ + #define PAGE_KERNEL __pgprot(_PAGE_KERNEL) + #define PAGE_KERNEL_EXEC __pgprot(_PAGE_KERNEL_EXEC) + #define PAGE_KERNEL_RWX __pgprot(_PAGE_KERNEL_RWX) +diff --git a/arch/parisc/include/asm/uaccess.h b/arch/parisc/include/asm/uaccess.h +index a5cb070..8604ddc 100644 +--- a/arch/parisc/include/asm/uaccess.h ++++ b/arch/parisc/include/asm/uaccess.h +@@ -243,10 +243,10 @@ static inline unsigned long __must_check copy_from_user(void *to, + const void __user *from, + unsigned long n) + { +- int sz = __compiletime_object_size(to); ++ size_t sz = __compiletime_object_size(to); + int ret = -EFAULT; + +- if (likely(sz == -1 || !__builtin_constant_p(n) || sz >= n)) ++ if (likely(sz == (size_t)-1 || !__builtin_constant_p(n) || sz >= n)) + ret = __copy_from_user(to, from, n); + else + copy_from_user_overflow(); +diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c +index 50dfafc..b9fc230 100644 +--- a/arch/parisc/kernel/module.c ++++ b/arch/parisc/kernel/module.c +@@ -98,16 +98,38 @@ + + /* three functions to determine where in the module core + * or init pieces the location is */ ++static inline int in_init_rx(struct module *me, void *loc) ++{ ++ return (loc >= me->module_init_rx && ++ loc < (me->module_init_rx + me->init_size_rx)); ++} ++ ++static inline int in_init_rw(struct module *me, void *loc) ++{ ++ return (loc >= me->module_init_rw && ++ loc < (me->module_init_rw + me->init_size_rw)); ++} ++ + static inline int in_init(struct module *me, void *loc) + { +- return (loc >= me->module_init && +- loc <= (me->module_init + me->init_size)); ++ return in_init_rx(me, loc) || in_init_rw(me, loc); ++} ++ ++static inline int in_core_rx(struct module *me, void *loc) ++{ ++ return (loc >= me->module_core_rx && ++ loc < (me->module_core_rx + me->core_size_rx)); ++} ++ ++static inline int in_core_rw(struct module *me, void *loc) ++{ ++ return (loc >= me->module_core_rw && ++ loc < (me->module_core_rw + me->core_size_rw)); + } + + static inline int in_core(struct module *me, void *loc) + { +- return (loc >= me->module_core && +- loc <= (me->module_core + me->core_size)); ++ return in_core_rx(me, loc) || in_core_rw(me, loc); + } + + static inline int in_local(struct module *me, void *loc) +@@ -371,13 +393,13 @@ int module_frob_arch_sections(CONST Elf_Ehdr *hdr, + } + + /* align things a bit */ +- me->core_size = ALIGN(me->core_size, 16); +- me->arch.got_offset = me->core_size; +- me->core_size += gots * sizeof(struct got_entry); ++ me->core_size_rw = ALIGN(me->core_size_rw, 16); ++ me->arch.got_offset = me->core_size_rw; ++ me->core_size_rw += gots * sizeof(struct got_entry); + +- me->core_size = ALIGN(me->core_size, 16); +- me->arch.fdesc_offset = me->core_size; +- me->core_size += fdescs * sizeof(Elf_Fdesc); ++ me->core_size_rw = ALIGN(me->core_size_rw, 16); ++ me->arch.fdesc_offset = me->core_size_rw; ++ me->core_size_rw += fdescs * sizeof(Elf_Fdesc); + + me->arch.got_max = gots; + me->arch.fdesc_max = fdescs; +@@ -395,7 +417,7 @@ static Elf64_Word get_got(struct module *me, unsigned long value, long addend) + + BUG_ON(value == 0); + +- got = me->module_core + me->arch.got_offset; ++ got = me->module_core_rw + me->arch.got_offset; + for (i = 0; got[i].addr; i++) + if (got[i].addr == value) + goto out; +@@ -413,7 +435,7 @@ static Elf64_Word get_got(struct module *me, unsigned long value, long addend) + #ifdef CONFIG_64BIT + static Elf_Addr get_fdesc(struct module *me, unsigned long value) + { +- Elf_Fdesc *fdesc = me->module_core + me->arch.fdesc_offset; ++ Elf_Fdesc *fdesc = me->module_core_rw + me->arch.fdesc_offset; + + if (!value) { + printk(KERN_ERR "%s: zero OPD requested!\n", me->name); +@@ -431,7 +453,7 @@ static Elf_Addr get_fdesc(struct module *me, unsigned long value) + + /* Create new one */ + fdesc->addr = value; +- fdesc->gp = (Elf_Addr)me->module_core + me->arch.got_offset; ++ fdesc->gp = (Elf_Addr)me->module_core_rw + me->arch.got_offset; + return (Elf_Addr)fdesc; + } + #endif /* CONFIG_64BIT */ +@@ -843,7 +865,7 @@ register_unwind_table(struct module *me, + + table = (unsigned char *)sechdrs[me->arch.unwind_section].sh_addr; + end = table + sechdrs[me->arch.unwind_section].sh_size; +- gp = (Elf_Addr)me->module_core + me->arch.got_offset; ++ gp = (Elf_Addr)me->module_core_rw + me->arch.got_offset; + + DEBUGP("register_unwind_table(), sect = %d at 0x%p - 0x%p (gp=0x%lx)\n", + me->arch.unwind_section, table, end, gp); +diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c +index e1ffea2..46ed66e 100644 +--- a/arch/parisc/kernel/sys_parisc.c ++++ b/arch/parisc/kernel/sys_parisc.c +@@ -89,6 +89,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, + unsigned long task_size = TASK_SIZE; + int do_color_align, last_mmap; + struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(current->mm, filp, flags); + + if (len > task_size) + return -ENOMEM; +@@ -106,6 +107,10 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, + goto found_addr; + } + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + if (do_color_align && last_mmap) + addr = COLOR_ALIGN(addr, last_mmap, pgoff); +@@ -124,6 +129,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, + info.high_limit = mmap_upper_limit(); + info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR - 1)) : 0; + info.align_offset = shared_align_offset(last_mmap, pgoff); ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + + found_addr: +@@ -143,6 +149,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + unsigned long addr = addr0; + int do_color_align, last_mmap; + struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(current->mm, filp, flags); + + #ifdef CONFIG_64BIT + /* This should only ever run for 32-bit processes. */ +@@ -167,6 +174,10 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + } + + /* requesting a specific address */ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + if (do_color_align && last_mmap) + addr = COLOR_ALIGN(addr, last_mmap, pgoff); +@@ -184,6 +195,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + info.high_limit = mm->mmap_base; + info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR - 1)) : 0; + info.align_offset = shared_align_offset(last_mmap, pgoff); ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + if (!(addr & ~PAGE_MASK)) + goto found_addr; +@@ -249,6 +261,13 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + mm->mmap_legacy_base = mmap_legacy_base(); + mm->mmap_base = mmap_upper_limit(); + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) { ++ mm->mmap_legacy_base += mm->delta_mmap; ++ mm->mmap_base -= mm->delta_mmap + mm->delta_stack; ++ } ++#endif ++ + if (mmap_is_legacy()) { + mm->mmap_base = mm->mmap_legacy_base; + mm->get_unmapped_area = arch_get_unmapped_area; +diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c +index 47ee620..1107387 100644 +--- a/arch/parisc/kernel/traps.c ++++ b/arch/parisc/kernel/traps.c +@@ -726,9 +726,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs) + + down_read(¤t->mm->mmap_sem); + vma = find_vma(current->mm,regs->iaoq[0]); +- if (vma && (regs->iaoq[0] >= vma->vm_start) +- && (vma->vm_flags & VM_EXEC)) { +- ++ if (vma && (regs->iaoq[0] >= vma->vm_start)) { + fault_address = regs->iaoq[0]; + fault_space = regs->iasq[0]; + +diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c +index e5120e6..8ddb5cc 100644 +--- a/arch/parisc/mm/fault.c ++++ b/arch/parisc/mm/fault.c +@@ -15,6 +15,7 @@ + #include <linux/sched.h> + #include <linux/interrupt.h> + #include <linux/module.h> ++#include <linux/unistd.h> + + #include <asm/uaccess.h> + #include <asm/traps.h> +@@ -50,7 +51,7 @@ int show_unhandled_signals = 1; + static unsigned long + parisc_acctyp(unsigned long code, unsigned int inst) + { +- if (code == 6 || code == 16) ++ if (code == 6 || code == 7 || code == 16) + return VM_EXEC; + + switch (inst & 0xf0000000) { +@@ -136,6 +137,116 @@ parisc_acctyp(unsigned long code, unsigned int inst) + } + #endif + ++#ifdef CONFIG_PAX_PAGEEXEC ++/* ++ * PaX: decide what to do with offenders (instruction_pointer(regs) = fault address) ++ * ++ * returns 1 when task should be killed ++ * 2 when rt_sigreturn trampoline was detected ++ * 3 when unpatched PLT trampoline was detected ++ */ ++static int pax_handle_fetch_fault(struct pt_regs *regs) ++{ ++ ++#ifdef CONFIG_PAX_EMUPLT ++ int err; ++ ++ do { /* PaX: unpatched PLT emulation */ ++ unsigned int bl, depwi; ++ ++ err = get_user(bl, (unsigned int *)instruction_pointer(regs)); ++ err |= get_user(depwi, (unsigned int *)(instruction_pointer(regs)+4)); ++ ++ if (err) ++ break; ++ ++ if (bl == 0xEA9F1FDDU && depwi == 0xD6801C1EU) { ++ unsigned int ldw, bv, ldw2, addr = instruction_pointer(regs)-12; ++ ++ err = get_user(ldw, (unsigned int *)addr); ++ err |= get_user(bv, (unsigned int *)(addr+4)); ++ err |= get_user(ldw2, (unsigned int *)(addr+8)); ++ ++ if (err) ++ break; ++ ++ if (ldw == 0x0E801096U && ++ bv == 0xEAC0C000U && ++ ldw2 == 0x0E881095U) ++ { ++ unsigned int resolver, map; ++ ++ err = get_user(resolver, (unsigned int *)(instruction_pointer(regs)+8)); ++ err |= get_user(map, (unsigned int *)(instruction_pointer(regs)+12)); ++ if (err) ++ break; ++ ++ regs->gr[20] = instruction_pointer(regs)+8; ++ regs->gr[21] = map; ++ regs->gr[22] = resolver; ++ regs->iaoq[0] = resolver | 3UL; ++ regs->iaoq[1] = regs->iaoq[0] + 4; ++ return 3; ++ } ++ } ++ } while (0); ++#endif ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ ++#ifndef CONFIG_PAX_EMUSIGRT ++ if (!(current->mm->pax_flags & MF_PAX_EMUTRAMP)) ++ return 1; ++#endif ++ ++ do { /* PaX: rt_sigreturn emulation */ ++ unsigned int ldi1, ldi2, bel, nop; ++ ++ err = get_user(ldi1, (unsigned int *)instruction_pointer(regs)); ++ err |= get_user(ldi2, (unsigned int *)(instruction_pointer(regs)+4)); ++ err |= get_user(bel, (unsigned int *)(instruction_pointer(regs)+8)); ++ err |= get_user(nop, (unsigned int *)(instruction_pointer(regs)+12)); ++ ++ if (err) ++ break; ++ ++ if ((ldi1 == 0x34190000U || ldi1 == 0x34190002U) && ++ ldi2 == 0x3414015AU && ++ bel == 0xE4008200U && ++ nop == 0x08000240U) ++ { ++ regs->gr[25] = (ldi1 & 2) >> 1; ++ regs->gr[20] = __NR_rt_sigreturn; ++ regs->gr[31] = regs->iaoq[1] + 16; ++ regs->sr[0] = regs->iasq[1]; ++ regs->iaoq[0] = 0x100UL; ++ regs->iaoq[1] = regs->iaoq[0] + 4; ++ regs->iasq[0] = regs->sr[2]; ++ regs->iasq[1] = regs->sr[2]; ++ return 2; ++ } ++ } while (0); ++#endif ++ ++ return 1; ++} ++ ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ unsigned long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 5; i++) { ++ unsigned int c; ++ if (get_user(c, (unsigned int *)pc+i)) ++ printk(KERN_CONT "???????? "); ++ else ++ printk(KERN_CONT "%08x ", c); ++ } ++ printk("\n"); ++} ++#endif ++ + int fixup_exception(struct pt_regs *regs) + { + const struct exception_table_entry *fix; +@@ -234,8 +345,33 @@ retry: + + good_area: + +- if ((vma->vm_flags & acc_type) != acc_type) ++ if ((vma->vm_flags & acc_type) != acc_type) { ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if ((mm->pax_flags & MF_PAX_PAGEEXEC) && (acc_type & VM_EXEC) && ++ (address & ~3UL) == instruction_pointer(regs)) ++ { ++ up_read(&mm->mmap_sem); ++ switch (pax_handle_fetch_fault(regs)) { ++ ++#ifdef CONFIG_PAX_EMUPLT ++ case 3: ++ return; ++#endif ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ case 2: ++ return; ++#endif ++ ++ } ++ pax_report_fault(regs, (void *)instruction_pointer(regs), (void *)regs->gr[30]); ++ do_group_exit(SIGKILL); ++ } ++#endif ++ + goto bad_area; ++ } + + /* + * If for any reason at all we couldn't handle the fault, make +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 88eace4..4ba2591 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -404,6 +404,7 @@ config PPC64_SUPPORTS_MEMORY_FAILURE + config KEXEC + bool "kexec system call" + depends on (PPC_BOOK3S || FSL_BOOKE || (44x && !SMP)) ++ depends on !GRKERNSEC_KMEM + help + kexec is a system call that implements the ability to shutdown your + current kernel, and to start another kernel. It is like a reboot +diff --git a/arch/powerpc/include/asm/atomic.h b/arch/powerpc/include/asm/atomic.h +index 512d278..d31fadd 100644 +--- a/arch/powerpc/include/asm/atomic.h ++++ b/arch/powerpc/include/asm/atomic.h +@@ -12,6 +12,11 @@ + + #define ATOMIC_INIT(i) { (i) } + ++#define _ASM_EXTABLE(from, to) \ ++" .section __ex_table,\"a\"\n" \ ++ PPC_LONG" " #from ", " #to"\n" \ ++" .previous\n" ++ + static __inline__ int atomic_read(const atomic_t *v) + { + int t; +@@ -21,39 +26,80 @@ static __inline__ int atomic_read(const atomic_t *v) + return t; + } + ++static __inline__ int atomic_read_unchecked(const atomic_unchecked_t *v) ++{ ++ int t; ++ ++ __asm__ __volatile__("lwz%U1%X1 %0,%1" : "=r"(t) : "m"(v->counter)); ++ ++ return t; ++} ++ + static __inline__ void atomic_set(atomic_t *v, int i) + { + __asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i)); + } + +-#define ATOMIC_OP(op, asm_op) \ +-static __inline__ void atomic_##op(int a, atomic_t *v) \ ++static __inline__ void atomic_set_unchecked(atomic_unchecked_t *v, int i) ++{ ++ __asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i)); ++} ++ ++#ifdef CONFIG_PAX_REFCOUNT ++#define __REFCOUNT_OP(op) op##o. ++#define __OVERFLOW_PRE \ ++ " mcrxr cr0\n" ++#define __OVERFLOW_POST \ ++ " bf 4*cr0+so, 3f\n" \ ++ "2: .long 0x00c00b00\n" \ ++ "3:\n" ++#define __OVERFLOW_EXTABLE \ ++ "\n4:\n" ++ _ASM_EXTABLE(2b, 4b) ++#else ++#define __REFCOUNT_OP(op) op ++#define __OVERFLOW_PRE ++#define __OVERFLOW_POST ++#define __OVERFLOW_EXTABLE ++#endif ++ ++#define __ATOMIC_OP(op, suffix, pre_op, asm_op, post_op, extable) \ ++static inline void atomic_##op##suffix(int a, atomic##suffix##_t *v) \ + { \ + int t; \ + \ + __asm__ __volatile__( \ +-"1: lwarx %0,0,%3 # atomic_" #op "\n" \ ++"1: lwarx %0,0,%3 # atomic_" #op #suffix "\n" \ ++ pre_op \ + #asm_op " %0,%2,%0\n" \ ++ post_op \ + PPC405_ERR77(0,%3) \ + " stwcx. %0,0,%3 \n" \ + " bne- 1b\n" \ ++ extable \ + : "=&r" (t), "+m" (v->counter) \ + : "r" (a), "r" (&v->counter) \ + : "cc"); \ + } \ + +-#define ATOMIC_OP_RETURN(op, asm_op) \ +-static __inline__ int atomic_##op##_return(int a, atomic_t *v) \ ++#define ATOMIC_OP(op, asm_op) __ATOMIC_OP(op, , , asm_op, , ) \ ++ __ATOMIC_OP(op, _unchecked, __OVERFLOW_PRE, __REFCOUNT_OP(asm_op), __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++ ++#define __ATOMIC_OP_RETURN(op, suffix, pre_op, asm_op, post_op, extable)\ ++static inline int atomic_##op##_return##suffix(int a, atomic##suffix##_t *v)\ + { \ + int t; \ + \ + __asm__ __volatile__( \ + PPC_ATOMIC_ENTRY_BARRIER \ +-"1: lwarx %0,0,%2 # atomic_" #op "_return\n" \ ++"1: lwarx %0,0,%2 # atomic_" #op "_return" #suffix "\n" \ ++ pre_op \ + #asm_op " %0,%1,%0\n" \ ++ post_op \ + PPC405_ERR77(0,%2) \ + " stwcx. %0,0,%2 \n" \ + " bne- 1b\n" \ ++ extable \ + PPC_ATOMIC_EXIT_BARRIER \ + : "=&r" (t) \ + : "r" (a), "r" (&v->counter) \ +@@ -62,6 +108,9 @@ static __inline__ int atomic_##op##_return(int a, atomic_t *v) \ + return t; \ + } + ++#define ATOMIC_OP_RETURN(op, asm_op) __ATOMIC_OP_RETURN(op, , , asm_op, , )\ ++ __ATOMIC_OP_RETURN(op, _unchecked, __OVERFLOW_PRE, __REFCOUNT_OP(asm_op), __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++ + #define ATOMIC_OPS(op, asm_op) ATOMIC_OP(op, asm_op) ATOMIC_OP_RETURN(op, asm_op) + + ATOMIC_OPS(add, add) +@@ -69,42 +118,29 @@ ATOMIC_OPS(sub, subf) + + #undef ATOMIC_OPS + #undef ATOMIC_OP_RETURN ++#undef __ATOMIC_OP_RETURN + #undef ATOMIC_OP ++#undef __ATOMIC_OP + + #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) + +-static __inline__ void atomic_inc(atomic_t *v) +-{ +- int t; ++/* ++ * atomic_inc - increment atomic variable ++ * @v: pointer of type atomic_t ++ * ++ * Automatically increments @v by 1 ++ */ ++#define atomic_inc(v) atomic_add(1, (v)) ++#define atomic_inc_return(v) atomic_add_return(1, (v)) + +- __asm__ __volatile__( +-"1: lwarx %0,0,%2 # atomic_inc\n\ +- addic %0,%0,1\n" +- PPC405_ERR77(0,%2) +-" stwcx. %0,0,%2 \n\ +- bne- 1b" +- : "=&r" (t), "+m" (v->counter) +- : "r" (&v->counter) +- : "cc", "xer"); ++static inline void atomic_inc_unchecked(atomic_unchecked_t *v) ++{ ++ atomic_add_unchecked(1, v); + } + +-static __inline__ int atomic_inc_return(atomic_t *v) ++static inline int atomic_inc_return_unchecked(atomic_unchecked_t *v) + { +- int t; +- +- __asm__ __volatile__( +- PPC_ATOMIC_ENTRY_BARRIER +-"1: lwarx %0,0,%1 # atomic_inc_return\n\ +- addic %0,%0,1\n" +- PPC405_ERR77(0,%1) +-" stwcx. %0,0,%1 \n\ +- bne- 1b" +- PPC_ATOMIC_EXIT_BARRIER +- : "=&r" (t) +- : "r" (&v->counter) +- : "cc", "xer", "memory"); +- +- return t; ++ return atomic_add_return_unchecked(1, v); + } + + /* +@@ -117,43 +153,38 @@ static __inline__ int atomic_inc_return(atomic_t *v) + */ + #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0) + +-static __inline__ void atomic_dec(atomic_t *v) ++static __inline__ int atomic_inc_and_test_unchecked(atomic_unchecked_t *v) + { +- int t; +- +- __asm__ __volatile__( +-"1: lwarx %0,0,%2 # atomic_dec\n\ +- addic %0,%0,-1\n" +- PPC405_ERR77(0,%2)\ +-" stwcx. %0,0,%2\n\ +- bne- 1b" +- : "=&r" (t), "+m" (v->counter) +- : "r" (&v->counter) +- : "cc", "xer"); ++ return atomic_add_return_unchecked(1, v) == 0; + } + +-static __inline__ int atomic_dec_return(atomic_t *v) +-{ +- int t; +- +- __asm__ __volatile__( +- PPC_ATOMIC_ENTRY_BARRIER +-"1: lwarx %0,0,%1 # atomic_dec_return\n\ +- addic %0,%0,-1\n" +- PPC405_ERR77(0,%1) +-" stwcx. %0,0,%1\n\ +- bne- 1b" +- PPC_ATOMIC_EXIT_BARRIER +- : "=&r" (t) +- : "r" (&v->counter) +- : "cc", "xer", "memory"); ++/* ++ * atomic_dec - decrement atomic variable ++ * @v: pointer of type atomic_t ++ * ++ * Atomically decrements @v by 1 ++ */ ++#define atomic_dec(v) atomic_sub(1, (v)) ++#define atomic_dec_return(v) atomic_sub_return(1, (v)) + +- return t; ++static __inline__ void atomic_dec_unchecked(atomic_unchecked_t *v) ++{ ++ atomic_sub_unchecked(1, v); + } + + #define atomic_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) + #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) + ++static inline int atomic_cmpxchg_unchecked(atomic_unchecked_t *v, int old, int new) ++{ ++ return cmpxchg(&(v->counter), old, new); ++} ++ ++static inline int atomic_xchg_unchecked(atomic_unchecked_t *v, int new) ++{ ++ return xchg(&(v->counter), new); ++} ++ + /** + * __atomic_add_unless - add unless the number is a given value + * @v: pointer of type atomic_t +@@ -171,11 +202,27 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) + PPC_ATOMIC_ENTRY_BARRIER + "1: lwarx %0,0,%1 # __atomic_add_unless\n\ + cmpw 0,%0,%3 \n\ +- beq- 2f \n\ +- add %0,%2,%0 \n" ++ beq- 2f \n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" mcrxr cr0\n" ++" addo. %0,%2,%0\n" ++" bf 4*cr0+so, 4f\n" ++"3:.long " "0x00c00b00""\n" ++"4:\n" ++#else ++ "add %0,%2,%0 \n" ++#endif ++ + PPC405_ERR77(0,%2) + " stwcx. %0,0,%1 \n\ + bne- 1b \n" ++"5:" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ _ASM_EXTABLE(3b, 5b) ++#endif ++ + PPC_ATOMIC_EXIT_BARRIER + " subf %0,%2,%0 \n\ + 2:" +@@ -248,6 +295,11 @@ static __inline__ int atomic_dec_if_positive(atomic_t *v) + } + #define atomic_dec_if_positive atomic_dec_if_positive + ++#define smp_mb__before_atomic_dec() smp_mb() ++#define smp_mb__after_atomic_dec() smp_mb() ++#define smp_mb__before_atomic_inc() smp_mb() ++#define smp_mb__after_atomic_inc() smp_mb() ++ + #ifdef __powerpc64__ + + #define ATOMIC64_INIT(i) { (i) } +@@ -261,37 +313,60 @@ static __inline__ long atomic64_read(const atomic64_t *v) + return t; + } + ++static __inline__ long atomic64_read_unchecked(const atomic64_unchecked_t *v) ++{ ++ long t; ++ ++ __asm__ __volatile__("ld%U1%X1 %0,%1" : "=r"(t) : "m"(v->counter)); ++ ++ return t; ++} ++ + static __inline__ void atomic64_set(atomic64_t *v, long i) + { + __asm__ __volatile__("std%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i)); + } + +-#define ATOMIC64_OP(op, asm_op) \ +-static __inline__ void atomic64_##op(long a, atomic64_t *v) \ ++static __inline__ void atomic64_set_unchecked(atomic64_unchecked_t *v, long i) ++{ ++ __asm__ __volatile__("std%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i)); ++} ++ ++#define __ATOMIC64_OP(op, suffix, pre_op, asm_op, post_op, extable) \ ++static inline void atomic64_##op##suffix(long a, atomic64##suffix##_t *v)\ + { \ + long t; \ + \ + __asm__ __volatile__( \ + "1: ldarx %0,0,%3 # atomic64_" #op "\n" \ ++ pre_op \ + #asm_op " %0,%2,%0\n" \ ++ post_op \ + " stdcx. %0,0,%3 \n" \ + " bne- 1b\n" \ ++ extable \ + : "=&r" (t), "+m" (v->counter) \ + : "r" (a), "r" (&v->counter) \ + : "cc"); \ + } + +-#define ATOMIC64_OP_RETURN(op, asm_op) \ +-static __inline__ long atomic64_##op##_return(long a, atomic64_t *v) \ ++#define ATOMIC64_OP(op, asm_op) __ATOMIC64_OP(op, , , asm_op, , ) \ ++ __ATOMIC64_OP(op, _unchecked, __OVERFLOW_PRE, __REFCOUNT_OP(asm_op), __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++ ++#define __ATOMIC64_OP_RETURN(op, suffix, pre_op, asm_op, post_op, extable)\ ++static inline long atomic64_##op##_return##suffix(long a, atomic64##suffix##_t *v)\ + { \ + long t; \ + \ + __asm__ __volatile__( \ + PPC_ATOMIC_ENTRY_BARRIER \ + "1: ldarx %0,0,%2 # atomic64_" #op "_return\n" \ ++ pre_op \ + #asm_op " %0,%1,%0\n" \ ++ post_op \ + " stdcx. %0,0,%2 \n" \ + " bne- 1b\n" \ ++ extable \ + PPC_ATOMIC_EXIT_BARRIER \ + : "=&r" (t) \ + : "r" (a), "r" (&v->counter) \ +@@ -300,6 +375,9 @@ static __inline__ long atomic64_##op##_return(long a, atomic64_t *v) \ + return t; \ + } + ++#define ATOMIC64_OP_RETURN(op, asm_op) __ATOMIC64_OP_RETURN(op, , , asm_op, , )\ ++ __ATOMIC64_OP_RETURN(op, _unchecked, __OVERFLOW_PRE, __REFCOUNT_OP(asm_op), __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++ + #define ATOMIC64_OPS(op, asm_op) ATOMIC64_OP(op, asm_op) ATOMIC64_OP_RETURN(op, asm_op) + + ATOMIC64_OPS(add, add) +@@ -307,40 +385,33 @@ ATOMIC64_OPS(sub, subf) + + #undef ATOMIC64_OPS + #undef ATOMIC64_OP_RETURN ++#undef __ATOMIC64_OP_RETURN + #undef ATOMIC64_OP ++#undef __ATOMIC64_OP ++#undef __OVERFLOW_EXTABLE ++#undef __OVERFLOW_POST ++#undef __OVERFLOW_PRE ++#undef __REFCOUNT_OP + + #define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0) + +-static __inline__ void atomic64_inc(atomic64_t *v) +-{ +- long t; ++/* ++ * atomic64_inc - increment atomic variable ++ * @v: pointer of type atomic64_t ++ * ++ * Automatically increments @v by 1 ++ */ ++#define atomic64_inc(v) atomic64_add(1, (v)) ++#define atomic64_inc_return(v) atomic64_add_return(1, (v)) + +- __asm__ __volatile__( +-"1: ldarx %0,0,%2 # atomic64_inc\n\ +- addic %0,%0,1\n\ +- stdcx. %0,0,%2 \n\ +- bne- 1b" +- : "=&r" (t), "+m" (v->counter) +- : "r" (&v->counter) +- : "cc", "xer"); ++static inline void atomic64_inc_unchecked(atomic64_unchecked_t *v) ++{ ++ atomic64_add_unchecked(1, v); + } + +-static __inline__ long atomic64_inc_return(atomic64_t *v) ++static inline long atomic64_inc_return_unchecked(atomic64_unchecked_t *v) + { +- long t; +- +- __asm__ __volatile__( +- PPC_ATOMIC_ENTRY_BARRIER +-"1: ldarx %0,0,%1 # atomic64_inc_return\n\ +- addic %0,%0,1\n\ +- stdcx. %0,0,%1 \n\ +- bne- 1b" +- PPC_ATOMIC_EXIT_BARRIER +- : "=&r" (t) +- : "r" (&v->counter) +- : "cc", "xer", "memory"); +- +- return t; ++ return atomic64_add_return_unchecked(1, v); + } + + /* +@@ -353,36 +424,18 @@ static __inline__ long atomic64_inc_return(atomic64_t *v) + */ + #define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0) + +-static __inline__ void atomic64_dec(atomic64_t *v) +-{ +- long t; +- +- __asm__ __volatile__( +-"1: ldarx %0,0,%2 # atomic64_dec\n\ +- addic %0,%0,-1\n\ +- stdcx. %0,0,%2\n\ +- bne- 1b" +- : "=&r" (t), "+m" (v->counter) +- : "r" (&v->counter) +- : "cc", "xer"); +-} ++/* ++ * atomic64_dec - decrement atomic variable ++ * @v: pointer of type atomic64_t ++ * ++ * Atomically decrements @v by 1 ++ */ ++#define atomic64_dec(v) atomic64_sub(1, (v)) ++#define atomic64_dec_return(v) atomic64_sub_return(1, (v)) + +-static __inline__ long atomic64_dec_return(atomic64_t *v) ++static __inline__ void atomic64_dec_unchecked(atomic64_unchecked_t *v) + { +- long t; +- +- __asm__ __volatile__( +- PPC_ATOMIC_ENTRY_BARRIER +-"1: ldarx %0,0,%1 # atomic64_dec_return\n\ +- addic %0,%0,-1\n\ +- stdcx. %0,0,%1\n\ +- bne- 1b" +- PPC_ATOMIC_EXIT_BARRIER +- : "=&r" (t) +- : "r" (&v->counter) +- : "cc", "xer", "memory"); +- +- return t; ++ atomic64_sub_unchecked(1, v); + } + + #define atomic64_sub_and_test(a, v) (atomic64_sub_return((a), (v)) == 0) +@@ -415,6 +468,16 @@ static __inline__ long atomic64_dec_if_positive(atomic64_t *v) + #define atomic64_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) + #define atomic64_xchg(v, new) (xchg(&((v)->counter), new)) + ++static inline long atomic64_cmpxchg_unchecked(atomic64_unchecked_t *v, long old, long new) ++{ ++ return cmpxchg(&(v->counter), old, new); ++} ++ ++static inline long atomic64_xchg_unchecked(atomic64_unchecked_t *v, long new) ++{ ++ return xchg(&(v->counter), new); ++} ++ + /** + * atomic64_add_unless - add unless the number is a given value + * @v: pointer of type atomic64_t +@@ -430,13 +493,29 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) + + __asm__ __volatile__ ( + PPC_ATOMIC_ENTRY_BARRIER +-"1: ldarx %0,0,%1 # __atomic_add_unless\n\ ++"1: ldarx %0,0,%1 # atomic64_add_unless\n\ + cmpd 0,%0,%3 \n\ +- beq- 2f \n\ +- add %0,%2,%0 \n" ++ beq- 2f \n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" mcrxr cr0\n" ++" addo. %0,%2,%0\n" ++" bf 4*cr0+so, 4f\n" ++"3:.long " "0x00c00b00""\n" ++"4:\n" ++#else ++ "add %0,%2,%0 \n" ++#endif ++ + " stdcx. %0,0,%1 \n\ + bne- 1b \n" + PPC_ATOMIC_EXIT_BARRIER ++"5:" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ _ASM_EXTABLE(3b, 5b) ++#endif ++ + " subf %0,%2,%0 \n\ + 2:" + : "=&r" (t) +diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h +index bab79a1..4a3eabc 100644 +--- a/arch/powerpc/include/asm/barrier.h ++++ b/arch/powerpc/include/asm/barrier.h +@@ -73,7 +73,7 @@ + do { \ + compiletime_assert_atomic_type(*p); \ + __lwsync(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/arch/powerpc/include/asm/cache.h b/arch/powerpc/include/asm/cache.h +index 34a05a1..a1f2c67 100644 +--- a/arch/powerpc/include/asm/cache.h ++++ b/arch/powerpc/include/asm/cache.h +@@ -4,6 +4,7 @@ + #ifdef __KERNEL__ + + #include <asm/reg.h> ++#include <linux/const.h> + + /* bytes per L1 cache line */ + #if defined(CONFIG_8xx) || defined(CONFIG_403GCX) +@@ -23,7 +24,7 @@ + #define L1_CACHE_SHIFT 7 + #endif + +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #define SMP_CACHE_BYTES L1_CACHE_BYTES + +diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h +index 888d8f3..66f581c 100644 +--- a/arch/powerpc/include/asm/elf.h ++++ b/arch/powerpc/include/asm/elf.h +@@ -28,8 +28,19 @@ + the loader. We need to make sure that it is out of the way of the program + that it will "exec", and that there is sufficient room for the brk. */ + +-extern unsigned long randomize_et_dyn(unsigned long base); +-#define ELF_ET_DYN_BASE (randomize_et_dyn(0x20000000)) ++#define ELF_ET_DYN_BASE (0x20000000) ++ ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE (0x10000000UL) ++ ++#ifdef __powerpc64__ ++#define PAX_DELTA_MMAP_LEN (is_32bit_task() ? 16 : 28) ++#define PAX_DELTA_STACK_LEN (is_32bit_task() ? 16 : 28) ++#else ++#define PAX_DELTA_MMAP_LEN 15 ++#define PAX_DELTA_STACK_LEN 15 ++#endif ++#endif + + #define ELF_CORE_EFLAGS (is_elf2_task() ? 2 : 0) + +@@ -129,10 +140,6 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm, + (0x7ff >> (PAGE_SHIFT - 12)) : \ + (0x3ffff >> (PAGE_SHIFT - 12))) + +-extern unsigned long arch_randomize_brk(struct mm_struct *mm); +-#define arch_randomize_brk arch_randomize_brk +- +- + #ifdef CONFIG_SPU_BASE + /* Notes used in ET_CORE. Note name is "SPU/<fd>/<filename>". */ + #define NT_SPU 1 +diff --git a/arch/powerpc/include/asm/exec.h b/arch/powerpc/include/asm/exec.h +index 8196e9c..d83a9f3 100644 +--- a/arch/powerpc/include/asm/exec.h ++++ b/arch/powerpc/include/asm/exec.h +@@ -4,6 +4,6 @@ + #ifndef _ASM_POWERPC_EXEC_H + #define _ASM_POWERPC_EXEC_H + +-extern unsigned long arch_align_stack(unsigned long sp); ++#define arch_align_stack(x) ((x) & ~0xfUL) + + #endif /* _ASM_POWERPC_EXEC_H */ +diff --git a/arch/powerpc/include/asm/kmap_types.h b/arch/powerpc/include/asm/kmap_types.h +index 5acabbd..7ea14fa 100644 +--- a/arch/powerpc/include/asm/kmap_types.h ++++ b/arch/powerpc/include/asm/kmap_types.h +@@ -10,7 +10,7 @@ + * 2 of the License, or (at your option) any later version. + */ + +-#define KM_TYPE_NR 16 ++#define KM_TYPE_NR 17 + + #endif /* __KERNEL__ */ + #endif /* _ASM_POWERPC_KMAP_TYPES_H */ +diff --git a/arch/powerpc/include/asm/local.h b/arch/powerpc/include/asm/local.h +index b8da913..c02b593 100644 +--- a/arch/powerpc/include/asm/local.h ++++ b/arch/powerpc/include/asm/local.h +@@ -9,21 +9,65 @@ typedef struct + atomic_long_t a; + } local_t; + ++typedef struct ++{ ++ atomic_long_unchecked_t a; ++} local_unchecked_t; ++ + #define LOCAL_INIT(i) { ATOMIC_LONG_INIT(i) } + + #define local_read(l) atomic_long_read(&(l)->a) ++#define local_read_unchecked(l) atomic_long_read_unchecked(&(l)->a) + #define local_set(l,i) atomic_long_set(&(l)->a, (i)) ++#define local_set_unchecked(l,i) atomic_long_set_unchecked(&(l)->a, (i)) + + #define local_add(i,l) atomic_long_add((i),(&(l)->a)) ++#define local_add_unchecked(i,l) atomic_long_add_unchecked((i),(&(l)->a)) + #define local_sub(i,l) atomic_long_sub((i),(&(l)->a)) ++#define local_sub_unchecked(i,l) atomic_long_sub_unchecked((i),(&(l)->a)) + #define local_inc(l) atomic_long_inc(&(l)->a) ++#define local_inc_unchecked(l) atomic_long_inc_unchecked(&(l)->a) + #define local_dec(l) atomic_long_dec(&(l)->a) ++#define local_dec_unchecked(l) atomic_long_dec_unchecked(&(l)->a) + + static __inline__ long local_add_return(long a, local_t *l) + { + long t; + + __asm__ __volatile__( ++"1:" PPC_LLARX(%0,0,%2,0) " # local_add_return\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" mcrxr cr0\n" ++" addo. %0,%1,%0\n" ++" bf 4*cr0+so, 3f\n" ++"2:.long " "0x00c00b00""\n" ++#else ++" add %0,%1,%0\n" ++#endif ++ ++"3:\n" ++ PPC405_ERR77(0,%2) ++ PPC_STLCX "%0,0,%2 \n\ ++ bne- 1b" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++"\n4:\n" ++ _ASM_EXTABLE(2b, 4b) ++#endif ++ ++ : "=&r" (t) ++ : "r" (a), "r" (&(l->a.counter)) ++ : "cc", "memory"); ++ ++ return t; ++} ++ ++static __inline__ long local_add_return_unchecked(long a, local_unchecked_t *l) ++{ ++ long t; ++ ++ __asm__ __volatile__( + "1:" PPC_LLARX(%0,0,%2,0) " # local_add_return\n\ + add %0,%1,%0\n" + PPC405_ERR77(0,%2) +@@ -101,6 +145,8 @@ static __inline__ long local_dec_return(local_t *l) + + #define local_cmpxchg(l, o, n) \ + (cmpxchg_local(&((l)->a.counter), (o), (n))) ++#define local_cmpxchg_unchecked(l, o, n) \ ++ (cmpxchg_local(&((l)->a.counter), (o), (n))) + #define local_xchg(l, n) (xchg_local(&((l)->a.counter), (n))) + + /** +diff --git a/arch/powerpc/include/asm/mman.h b/arch/powerpc/include/asm/mman.h +index 8565c25..2865190 100644 +--- a/arch/powerpc/include/asm/mman.h ++++ b/arch/powerpc/include/asm/mman.h +@@ -24,7 +24,7 @@ static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot) + } + #define arch_calc_vm_prot_bits(prot) arch_calc_vm_prot_bits(prot) + +-static inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags) ++static inline pgprot_t arch_vm_get_page_prot(vm_flags_t vm_flags) + { + return (vm_flags & VM_SAO) ? __pgprot(_PAGE_SAO) : __pgprot(0); + } +diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h +index 26fe1ae..987ffc5 100644 +--- a/arch/powerpc/include/asm/page.h ++++ b/arch/powerpc/include/asm/page.h +@@ -227,8 +227,9 @@ extern long long virt_phys_offset; + * and needs to be executable. This means the whole heap ends + * up being executable. + */ +-#define VM_DATA_DEFAULT_FLAGS32 (VM_READ | VM_WRITE | VM_EXEC | \ +- VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) ++#define VM_DATA_DEFAULT_FLAGS32 \ ++ (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ ++ VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + + #define VM_DATA_DEFAULT_FLAGS64 (VM_READ | VM_WRITE | \ + VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) +@@ -256,6 +257,9 @@ extern long long virt_phys_offset; + #define is_kernel_addr(x) ((x) >= PAGE_OFFSET) + #endif + ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) ++ + #ifndef CONFIG_PPC_BOOK3S_64 + /* + * Use the top bit of the higher-level page table entries to indicate whether +diff --git a/arch/powerpc/include/asm/page_64.h b/arch/powerpc/include/asm/page_64.h +index d908a46..3753f71 100644 +--- a/arch/powerpc/include/asm/page_64.h ++++ b/arch/powerpc/include/asm/page_64.h +@@ -172,15 +172,18 @@ do { \ + * stack by default, so in the absence of a PT_GNU_STACK program header + * we turn execute permission off. + */ +-#define VM_STACK_DEFAULT_FLAGS32 (VM_READ | VM_WRITE | VM_EXEC | \ +- VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) ++#define VM_STACK_DEFAULT_FLAGS32 \ ++ (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ ++ VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + + #define VM_STACK_DEFAULT_FLAGS64 (VM_READ | VM_WRITE | \ + VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + ++#ifndef CONFIG_PAX_PAGEEXEC + #define VM_STACK_DEFAULT_FLAGS \ + (is_32bit_task() ? \ + VM_STACK_DEFAULT_FLAGS32 : VM_STACK_DEFAULT_FLAGS64) ++#endif + + #include <asm-generic/getorder.h> + +diff --git a/arch/powerpc/include/asm/pgalloc-64.h b/arch/powerpc/include/asm/pgalloc-64.h +index 4b0be20..c15a27d 100644 +--- a/arch/powerpc/include/asm/pgalloc-64.h ++++ b/arch/powerpc/include/asm/pgalloc-64.h +@@ -54,6 +54,7 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) + #ifndef CONFIG_PPC_64K_PAGES + + #define pgd_populate(MM, PGD, PUD) pgd_set(PGD, PUD) ++#define pgd_populate_kernel(MM, PGD, PUD) pgd_populate((MM), (PGD), (PUD)) + + static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) + { +@@ -71,6 +72,11 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) + pud_set(pud, (unsigned long)pmd); + } + ++static inline void pud_populate_kernel(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) ++{ ++ pud_populate(mm, pud, pmd); ++} ++ + #define pmd_populate(mm, pmd, pte_page) \ + pmd_populate_kernel(mm, pmd, page_address(pte_page)) + #define pmd_populate_kernel(mm, pmd, pte) pmd_set(pmd, (unsigned long)(pte)) +@@ -173,6 +179,7 @@ extern void __tlb_remove_table(void *_table); + #endif + + #define pud_populate(mm, pud, pmd) pud_set(pud, (unsigned long)pmd) ++#define pud_populate_kernel(mm, pud, pmd) pud_populate((mm), (pud), (pmd)) + + static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, + pte_t *pte) +diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h +index 316f9a5..ba05c77 100644 +--- a/arch/powerpc/include/asm/pgtable.h ++++ b/arch/powerpc/include/asm/pgtable.h +@@ -2,6 +2,7 @@ + #define _ASM_POWERPC_PGTABLE_H + #ifdef __KERNEL__ + ++#include <linux/const.h> + #ifndef __ASSEMBLY__ + #include <linux/mmdebug.h> + #include <linux/mmzone.h> +diff --git a/arch/powerpc/include/asm/pte-hash32.h b/arch/powerpc/include/asm/pte-hash32.h +index 4aad413..85d86bf 100644 +--- a/arch/powerpc/include/asm/pte-hash32.h ++++ b/arch/powerpc/include/asm/pte-hash32.h +@@ -21,6 +21,7 @@ + #define _PAGE_FILE 0x004 /* when !present: nonlinear file mapping */ + #define _PAGE_USER 0x004 /* usermode access allowed */ + #define _PAGE_GUARDED 0x008 /* G: prohibit speculative access */ ++#define _PAGE_EXEC _PAGE_GUARDED + #define _PAGE_COHERENT 0x010 /* M: enforce memory coherence (SMP systems) */ + #define _PAGE_NO_CACHE 0x020 /* I: cache inhibit */ + #define _PAGE_WRITETHRU 0x040 /* W: cache write-through */ +diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h +index a68ee15..552d213 100644 +--- a/arch/powerpc/include/asm/reg.h ++++ b/arch/powerpc/include/asm/reg.h +@@ -253,6 +253,7 @@ + #define SPRN_DBCR 0x136 /* e300 Data Breakpoint Control Reg */ + #define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */ + #define DSISR_NOHPTE 0x40000000 /* no translation found */ ++#define DSISR_GUARDED 0x10000000 /* fetch from guarded storage */ + #define DSISR_PROTFAULT 0x08000000 /* protection fault */ + #define DSISR_ISSTORE 0x02000000 /* access was a store */ + #define DSISR_DABRMATCH 0x00400000 /* hit data breakpoint */ +diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h +index 5a6614a..d89995d1 100644 +--- a/arch/powerpc/include/asm/smp.h ++++ b/arch/powerpc/include/asm/smp.h +@@ -51,7 +51,7 @@ struct smp_ops_t { + int (*cpu_disable)(void); + void (*cpu_die)(unsigned int nr); + int (*cpu_bootable)(unsigned int nr); +-}; ++} __no_const; + + extern void smp_send_debugger_break(void); + extern void start_secondary_resume(void); +diff --git a/arch/powerpc/include/asm/spinlock.h b/arch/powerpc/include/asm/spinlock.h +index 4dbe072..b803275 100644 +--- a/arch/powerpc/include/asm/spinlock.h ++++ b/arch/powerpc/include/asm/spinlock.h +@@ -204,13 +204,29 @@ static inline long __arch_read_trylock(arch_rwlock_t *rw) + __asm__ __volatile__( + "1: " PPC_LWARX(%0,0,%1,1) "\n" + __DO_SIGN_EXTEND +-" addic. %0,%0,1\n\ +- ble- 2f\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" mcrxr cr0\n" ++" addico. %0,%0,1\n" ++" bf 4*cr0+so, 3f\n" ++"2:.long " "0x00c00b00""\n" ++#else ++" addic. %0,%0,1\n" ++#endif ++ ++"3:\n" ++ "ble- 4f\n" + PPC405_ERR77(0,%1) + " stwcx. %0,0,%1\n\ + bne- 1b\n" + PPC_ACQUIRE_BARRIER +-"2:" : "=&r" (tmp) ++"4:" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ _ASM_EXTABLE(2b,4b) ++#endif ++ ++ : "=&r" (tmp) + : "r" (&rw->lock) + : "cr0", "xer", "memory"); + +@@ -286,11 +302,27 @@ static inline void arch_read_unlock(arch_rwlock_t *rw) + __asm__ __volatile__( + "# read_unlock\n\t" + PPC_RELEASE_BARRIER +-"1: lwarx %0,0,%1\n\ +- addic %0,%0,-1\n" ++"1: lwarx %0,0,%1\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" mcrxr cr0\n" ++" addico. %0,%0,-1\n" ++" bf 4*cr0+so, 3f\n" ++"2:.long " "0x00c00b00""\n" ++#else ++" addic. %0,%0,-1\n" ++#endif ++ ++"3:\n" + PPC405_ERR77(0,%1) + " stwcx. %0,0,%1\n\ + bne- 1b" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++"\n4:\n" ++ _ASM_EXTABLE(2b, 4b) ++#endif ++ + : "=&r"(tmp) + : "r"(&rw->lock) + : "cr0", "xer", "memory"); +diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h +index b034ecd..af7e31f 100644 +--- a/arch/powerpc/include/asm/thread_info.h ++++ b/arch/powerpc/include/asm/thread_info.h +@@ -107,6 +107,8 @@ static inline struct thread_info *current_thread_info(void) + #if defined(CONFIG_PPC64) + #define TIF_ELF2ABI 18 /* function descriptors must die! */ + #endif ++/* mask must be expressable within 16 bits to satisfy 'andi' instruction reqs */ ++#define TIF_GRSEC_SETXID 6 /* update credentials on syscall entry/exit */ + + /* as above, but as bit values */ + #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) +@@ -125,9 +127,10 @@ static inline struct thread_info *current_thread_info(void) + #define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) + #define _TIF_EMULATE_STACK_STORE (1<<TIF_EMULATE_STACK_STORE) + #define _TIF_NOHZ (1<<TIF_NOHZ) ++#define _TIF_GRSEC_SETXID (1<<TIF_GRSEC_SETXID) + #define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ + _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT | \ +- _TIF_NOHZ) ++ _TIF_NOHZ | _TIF_GRSEC_SETXID) + + #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ + _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ +diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h +index 9485b43..3bd3c16 100644 +--- a/arch/powerpc/include/asm/uaccess.h ++++ b/arch/powerpc/include/asm/uaccess.h +@@ -58,6 +58,7 @@ + + #endif + ++#define access_ok_noprefault(type, addr, size) access_ok((type), (addr), (size)) + #define access_ok(type, addr, size) \ + (__chk_user_ptr(addr), \ + __access_ok((__force unsigned long)(addr), (size), get_fs())) +@@ -318,52 +319,6 @@ do { \ + extern unsigned long __copy_tofrom_user(void __user *to, + const void __user *from, unsigned long size); + +-#ifndef __powerpc64__ +- +-static inline unsigned long copy_from_user(void *to, +- const void __user *from, unsigned long n) +-{ +- unsigned long over; +- +- if (access_ok(VERIFY_READ, from, n)) +- return __copy_tofrom_user((__force void __user *)to, from, n); +- if ((unsigned long)from < TASK_SIZE) { +- over = (unsigned long)from + n - TASK_SIZE; +- return __copy_tofrom_user((__force void __user *)to, from, +- n - over) + over; +- } +- return n; +-} +- +-static inline unsigned long copy_to_user(void __user *to, +- const void *from, unsigned long n) +-{ +- unsigned long over; +- +- if (access_ok(VERIFY_WRITE, to, n)) +- return __copy_tofrom_user(to, (__force void __user *)from, n); +- if ((unsigned long)to < TASK_SIZE) { +- over = (unsigned long)to + n - TASK_SIZE; +- return __copy_tofrom_user(to, (__force void __user *)from, +- n - over) + over; +- } +- return n; +-} +- +-#else /* __powerpc64__ */ +- +-#define __copy_in_user(to, from, size) \ +- __copy_tofrom_user((to), (from), (size)) +- +-extern unsigned long copy_from_user(void *to, const void __user *from, +- unsigned long n); +-extern unsigned long copy_to_user(void __user *to, const void *from, +- unsigned long n); +-extern unsigned long copy_in_user(void __user *to, const void __user *from, +- unsigned long n); +- +-#endif /* __powerpc64__ */ +- + static inline unsigned long __copy_from_user_inatomic(void *to, + const void __user *from, unsigned long n) + { +@@ -387,6 +342,10 @@ static inline unsigned long __copy_from_user_inatomic(void *to, + if (ret == 0) + return 0; + } ++ ++ if (!__builtin_constant_p(n)) ++ check_object_size(to, n, false); ++ + return __copy_tofrom_user((__force void __user *)to, from, n); + } + +@@ -413,6 +372,10 @@ static inline unsigned long __copy_to_user_inatomic(void __user *to, + if (ret == 0) + return 0; + } ++ ++ if (!__builtin_constant_p(n)) ++ check_object_size(from, n, true); ++ + return __copy_tofrom_user(to, (__force const void __user *)from, n); + } + +@@ -430,6 +393,92 @@ static inline unsigned long __copy_to_user(void __user *to, + return __copy_to_user_inatomic(to, from, size); + } + ++#ifndef __powerpc64__ ++ ++static inline unsigned long __must_check copy_from_user(void *to, ++ const void __user *from, unsigned long n) ++{ ++ unsigned long over; ++ ++ if ((long)n < 0) ++ return n; ++ ++ if (access_ok(VERIFY_READ, from, n)) { ++ if (!__builtin_constant_p(n)) ++ check_object_size(to, n, false); ++ return __copy_tofrom_user((__force void __user *)to, from, n); ++ } ++ if ((unsigned long)from < TASK_SIZE) { ++ over = (unsigned long)from + n - TASK_SIZE; ++ if (!__builtin_constant_p(n - over)) ++ check_object_size(to, n - over, false); ++ return __copy_tofrom_user((__force void __user *)to, from, ++ n - over) + over; ++ } ++ return n; ++} ++ ++static inline unsigned long __must_check copy_to_user(void __user *to, ++ const void *from, unsigned long n) ++{ ++ unsigned long over; ++ ++ if ((long)n < 0) ++ return n; ++ ++ if (access_ok(VERIFY_WRITE, to, n)) { ++ if (!__builtin_constant_p(n)) ++ check_object_size(from, n, true); ++ return __copy_tofrom_user(to, (__force void __user *)from, n); ++ } ++ if ((unsigned long)to < TASK_SIZE) { ++ over = (unsigned long)to + n - TASK_SIZE; ++ if (!__builtin_constant_p(n)) ++ check_object_size(from, n - over, true); ++ return __copy_tofrom_user(to, (__force void __user *)from, ++ n - over) + over; ++ } ++ return n; ++} ++ ++#else /* __powerpc64__ */ ++ ++#define __copy_in_user(to, from, size) \ ++ __copy_tofrom_user((to), (from), (size)) ++ ++static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) ++{ ++ if ((long)n < 0 || n > INT_MAX) ++ return n; ++ ++ if (!__builtin_constant_p(n)) ++ check_object_size(to, n, false); ++ ++ if (likely(access_ok(VERIFY_READ, from, n))) ++ n = __copy_from_user(to, from, n); ++ else ++ memset(to, 0, n); ++ return n; ++} ++ ++static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n) ++{ ++ if ((long)n < 0 || n > INT_MAX) ++ return n; ++ ++ if (likely(access_ok(VERIFY_WRITE, to, n))) { ++ if (!__builtin_constant_p(n)) ++ check_object_size(from, n, true); ++ n = __copy_to_user(to, from, n); ++ } ++ return n; ++} ++ ++extern unsigned long copy_in_user(void __user *to, const void __user *from, ++ unsigned long n); ++ ++#endif /* __powerpc64__ */ ++ + extern unsigned long __clear_user(void __user *addr, unsigned long size); + + static inline unsigned long clear_user(void __user *addr, unsigned long size) +diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile +index 502cf69..53936a1 100644 +--- a/arch/powerpc/kernel/Makefile ++++ b/arch/powerpc/kernel/Makefile +@@ -15,6 +15,11 @@ CFLAGS_prom_init.o += -fPIC + CFLAGS_btext.o += -fPIC + endif + ++CFLAGS_REMOVE_cputable.o = $(LATENT_ENTROPY_PLUGIN_CFLAGS) ++CFLAGS_REMOVE_prom_init.o = $(LATENT_ENTROPY_PLUGIN_CFLAGS) ++CFLAGS_REMOVE_btext.o = $(LATENT_ENTROPY_PLUGIN_CFLAGS) ++CFLAGS_REMOVE_prom.o = $(LATENT_ENTROPY_PLUGIN_CFLAGS) ++ + ifdef CONFIG_FUNCTION_TRACER + # Do not trace early boot code + CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog +@@ -27,6 +32,8 @@ CFLAGS_REMOVE_ftrace.o = -pg -mno-sched-epilog + CFLAGS_REMOVE_time.o = -pg -mno-sched-epilog + endif + ++CFLAGS_REMOVE_prom_init.o += $(LATENT_ENTROPY_PLUGIN_CFLAGS) ++ + obj-y := cputable.o ptrace.o syscalls.o \ + irq.o align.o signal_32.o pmc.o vdso.o \ + process.o systbl.o idle.o \ +diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S +index 3e68d1c..72a5ee6 100644 +--- a/arch/powerpc/kernel/exceptions-64e.S ++++ b/arch/powerpc/kernel/exceptions-64e.S +@@ -1010,6 +1010,7 @@ storage_fault_common: + std r14,_DAR(r1) + std r15,_DSISR(r1) + addi r3,r1,STACK_FRAME_OVERHEAD ++ bl save_nvgprs + mr r4,r14 + mr r5,r15 + ld r14,PACA_EXGEN+EX_R14(r13) +@@ -1018,8 +1019,7 @@ storage_fault_common: + cmpdi r3,0 + bne- 1f + b ret_from_except_lite +-1: bl save_nvgprs +- mr r5,r3 ++1: mr r5,r3 + addi r3,r1,STACK_FRAME_OVERHEAD + ld r4,_DAR(r1) + bl bad_page_fault +diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S +index 5e01984..365a069 100644 +--- a/arch/powerpc/kernel/exceptions-64s.S ++++ b/arch/powerpc/kernel/exceptions-64s.S +@@ -1588,10 +1588,10 @@ handle_page_fault: + 11: ld r4,_DAR(r1) + ld r5,_DSISR(r1) + addi r3,r1,STACK_FRAME_OVERHEAD ++ bl save_nvgprs + bl do_page_fault + cmpdi r3,0 + beq+ 12f +- bl save_nvgprs + mr r5,r3 + addi r3,r1,STACK_FRAME_OVERHEAD + lwz r4,_DAR(r1) +diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c +index c143835..5a9697f 100644 +--- a/arch/powerpc/kernel/irq.c ++++ b/arch/powerpc/kernel/irq.c +@@ -461,6 +461,8 @@ void migrate_irqs(void) + } + #endif + ++extern void gr_handle_kernel_exploit(void); ++ + static inline void check_stack_overflow(void) + { + #ifdef CONFIG_DEBUG_STACKOVERFLOW +@@ -473,6 +475,7 @@ static inline void check_stack_overflow(void) + pr_err("do_IRQ: stack overflow: %ld\n", + sp - sizeof(struct thread_info)); + dump_stack(); ++ gr_handle_kernel_exploit(); + } + #endif + } +diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c +index c94d2e0..992a9ce 100644 +--- a/arch/powerpc/kernel/module_32.c ++++ b/arch/powerpc/kernel/module_32.c +@@ -158,7 +158,7 @@ int module_frob_arch_sections(Elf32_Ehdr *hdr, + me->arch.core_plt_section = i; + } + if (!me->arch.core_plt_section || !me->arch.init_plt_section) { +- pr_err("Module doesn't contain .plt or .init.plt sections.\n"); ++ pr_err("Module $s doesn't contain .plt or .init.plt sections.\n", me->name); + return -ENOEXEC; + } + +@@ -188,11 +188,16 @@ static uint32_t do_plt_call(void *location, + + pr_debug("Doing plt for call to 0x%x at 0x%x\n", val, (unsigned int)location); + /* Init, or core PLT? */ +- if (location >= mod->module_core +- && location < mod->module_core + mod->core_size) ++ if ((location >= mod->module_core_rx && location < mod->module_core_rx + mod->core_size_rx) || ++ (location >= mod->module_core_rw && location < mod->module_core_rw + mod->core_size_rw)) + entry = (void *)sechdrs[mod->arch.core_plt_section].sh_addr; +- else ++ else if ((location >= mod->module_init_rx && location < mod->module_init_rx + mod->init_size_rx) || ++ (location >= mod->module_init_rw && location < mod->module_init_rw + mod->init_size_rw)) + entry = (void *)sechdrs[mod->arch.init_plt_section].sh_addr; ++ else { ++ printk(KERN_ERR "%s: invalid R_PPC_REL24 entry found\n", mod->name); ++ return ~0UL; ++ } + + /* Find this entry, or if that fails, the next avail. entry */ + while (entry->jump[0]) { +@@ -296,7 +301,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, + } + #ifdef CONFIG_DYNAMIC_FTRACE + module->arch.tramp = +- do_plt_call(module->module_core, ++ do_plt_call(module->module_core_rx, + (unsigned long)ftrace_caller, + sechdrs, module); + #endif +diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c +index 923cd2d..ae782a9 100644 +--- a/arch/powerpc/kernel/process.c ++++ b/arch/powerpc/kernel/process.c +@@ -1040,8 +1040,8 @@ void show_regs(struct pt_regs * regs) + * Lookup NIP late so we have the best change of getting the + * above info out without failing + */ +- printk("NIP ["REG"] %pS\n", regs->nip, (void *)regs->nip); +- printk("LR ["REG"] %pS\n", regs->link, (void *)regs->link); ++ printk("NIP ["REG"] %pA\n", regs->nip, (void *)regs->nip); ++ printk("LR ["REG"] %pA\n", regs->link, (void *)regs->link); + #endif + show_stack(current, (unsigned long *) regs->gpr[1]); + if (!user_mode(regs)) +@@ -1560,10 +1560,10 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) + newsp = stack[0]; + ip = stack[STACK_FRAME_LR_SAVE]; + if (!firstframe || ip != lr) { +- printk("["REG"] ["REG"] %pS", sp, ip, (void *)ip); ++ printk("["REG"] ["REG"] %pA", sp, ip, (void *)ip); + #ifdef CONFIG_FUNCTION_GRAPH_TRACER + if ((ip == rth || ip == mrth) && curr_frame >= 0) { +- printk(" (%pS)", ++ printk(" (%pA)", + (void *)current->ret_stack[curr_frame].ret); + curr_frame--; + } +@@ -1583,7 +1583,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) + struct pt_regs *regs = (struct pt_regs *) + (sp + STACK_FRAME_OVERHEAD); + lr = regs->link; +- printk("--- interrupt: %lx at %pS\n LR = %pS\n", ++ printk("--- interrupt: %lx at %pA\n LR = %pA\n", + regs->trap, (void *)regs->nip, (void *)lr); + firstframe = 1; + } +@@ -1619,58 +1619,3 @@ void notrace __ppc64_runlatch_off(void) + mtspr(SPRN_CTRLT, ctrl); + } + #endif /* CONFIG_PPC64 */ +- +-unsigned long arch_align_stack(unsigned long sp) +-{ +- if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space) +- sp -= get_random_int() & ~PAGE_MASK; +- return sp & ~0xf; +-} +- +-static inline unsigned long brk_rnd(void) +-{ +- unsigned long rnd = 0; +- +- /* 8MB for 32bit, 1GB for 64bit */ +- if (is_32bit_task()) +- rnd = (long)(get_random_int() % (1<<(23-PAGE_SHIFT))); +- else +- rnd = (long)(get_random_int() % (1<<(30-PAGE_SHIFT))); +- +- return rnd << PAGE_SHIFT; +-} +- +-unsigned long arch_randomize_brk(struct mm_struct *mm) +-{ +- unsigned long base = mm->brk; +- unsigned long ret; +- +-#ifdef CONFIG_PPC_STD_MMU_64 +- /* +- * If we are using 1TB segments and we are allowed to randomise +- * the heap, we can put it above 1TB so it is backed by a 1TB +- * segment. Otherwise the heap will be in the bottom 1TB +- * which always uses 256MB segments and this may result in a +- * performance penalty. +- */ +- if (!is_32bit_task() && (mmu_highuser_ssize == MMU_SEGSIZE_1T)) +- base = max_t(unsigned long, mm->brk, 1UL << SID_SHIFT_1T); +-#endif +- +- ret = PAGE_ALIGN(base + brk_rnd()); +- +- if (ret < mm->brk) +- return mm->brk; +- +- return ret; +-} +- +-unsigned long randomize_et_dyn(unsigned long base) +-{ +- unsigned long ret = PAGE_ALIGN(base + brk_rnd()); +- +- if (ret < base) +- return base; +- +- return ret; +-} +diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c +index f21897b..28c0428 100644 +--- a/arch/powerpc/kernel/ptrace.c ++++ b/arch/powerpc/kernel/ptrace.c +@@ -1762,6 +1762,10 @@ long arch_ptrace(struct task_struct *child, long request, + return ret; + } + ++#ifdef CONFIG_GRKERNSEC_SETXID ++extern void gr_delayed_cred_worker(void); ++#endif ++ + /* + * We must return the syscall number to actually look up in the table. + * This can be -1L to skip running any syscall at all. +@@ -1774,6 +1778,11 @@ long do_syscall_trace_enter(struct pt_regs *regs) + + secure_computing_strict(regs->gpr[0]); + ++#ifdef CONFIG_GRKERNSEC_SETXID ++ if (unlikely(test_and_clear_thread_flag(TIF_GRSEC_SETXID))) ++ gr_delayed_cred_worker(); ++#endif ++ + if (test_thread_flag(TIF_SYSCALL_TRACE) && + tracehook_report_syscall_entry(regs)) + /* +@@ -1805,6 +1814,11 @@ void do_syscall_trace_leave(struct pt_regs *regs) + { + int step; + ++#ifdef CONFIG_GRKERNSEC_SETXID ++ if (unlikely(test_and_clear_thread_flag(TIF_GRSEC_SETXID))) ++ gr_delayed_cred_worker(); ++#endif ++ + audit_syscall_exit(regs); + + if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) +diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c +index b171001..4ac7ac5 100644 +--- a/arch/powerpc/kernel/signal_32.c ++++ b/arch/powerpc/kernel/signal_32.c +@@ -1011,7 +1011,7 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, + /* Save user registers on the stack */ + frame = &rt_sf->uc.uc_mcontext; + addr = frame; +- if (vdso32_rt_sigtramp && current->mm->context.vdso_base) { ++ if (vdso32_rt_sigtramp && current->mm->context.vdso_base != ~0UL) { + sigret = 0; + tramp = current->mm->context.vdso_base + vdso32_rt_sigtramp; + } else { +diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c +index 2cb0c94..c0c0bc9 100644 +--- a/arch/powerpc/kernel/signal_64.c ++++ b/arch/powerpc/kernel/signal_64.c +@@ -754,7 +754,7 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs + current->thread.fp_state.fpscr = 0; + + /* Set up to return from userspace. */ +- if (vdso64_rt_sigtramp && current->mm->context.vdso_base) { ++ if (vdso64_rt_sigtramp && current->mm->context.vdso_base != ~0UL) { + regs->link = current->mm->context.vdso_base + vdso64_rt_sigtramp; + } else { + err |= setup_trampoline(__NR_rt_sigreturn, &frame->tramp[0]); +diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c +index 0dc43f9..a885d33 100644 +--- a/arch/powerpc/kernel/traps.c ++++ b/arch/powerpc/kernel/traps.c +@@ -36,6 +36,7 @@ + #include <linux/debugfs.h> + #include <linux/ratelimit.h> + #include <linux/context_tracking.h> ++#include <linux/uaccess.h> + + #include <asm/emulated_ops.h> + #include <asm/pgtable.h> +@@ -142,6 +143,8 @@ static unsigned __kprobes long oops_begin(struct pt_regs *regs) + return flags; + } + ++extern void gr_handle_kernel_exploit(void); ++ + static void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, + int signr) + { +@@ -191,6 +194,9 @@ static void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, + panic("Fatal exception in interrupt"); + if (panic_on_oops) + panic("Fatal exception"); ++ ++ gr_handle_kernel_exploit(); ++ + do_exit(signr); + } + +@@ -1137,6 +1143,26 @@ void __kprobes program_check_exception(struct pt_regs *regs) + enum ctx_state prev_state = exception_enter(); + unsigned int reason = get_reason(regs); + ++#ifdef CONFIG_PAX_REFCOUNT ++ unsigned int bkpt; ++ const struct exception_table_entry *entry; ++ ++ if (reason & REASON_ILLEGAL) { ++ /* Check if PaX bad instruction */ ++ if (!probe_kernel_address(regs->nip, bkpt) && bkpt == 0xc00b00) { ++ current->thread.trap_nr = 0; ++ pax_report_refcount_overflow(regs); ++ /* fixup_exception() for PowerPC does not exist, simulate its job */ ++ if ((entry = search_exception_tables(regs->nip)) != NULL) { ++ regs->nip = entry->fixup; ++ return; ++ } ++ /* fixup_exception() could not handle */ ++ goto bail; ++ } ++ } ++#endif ++ + /* We can now get here via a FP Unavailable exception if the core + * has no FPU, in that case the reason flags will be 0 */ + +diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c +index f174351..5722009 100644 +--- a/arch/powerpc/kernel/vdso.c ++++ b/arch/powerpc/kernel/vdso.c +@@ -35,6 +35,7 @@ + #include <asm/vdso.h> + #include <asm/vdso_datapage.h> + #include <asm/setup.h> ++#include <asm/mman.h> + + #undef DEBUG + +@@ -221,7 +222,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) + vdso_base = VDSO32_MBASE; + #endif + +- current->mm->context.vdso_base = 0; ++ current->mm->context.vdso_base = ~0UL; + + /* vDSO has a problem and was disabled, just don't "enable" it for the + * process +@@ -241,7 +242,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) + vdso_base = get_unmapped_area(NULL, vdso_base, + (vdso_pages << PAGE_SHIFT) + + ((VDSO_ALIGNMENT - 1) & PAGE_MASK), +- 0, 0); ++ 0, MAP_PRIVATE | MAP_EXECUTABLE); + if (IS_ERR_VALUE(vdso_base)) { + rc = vdso_base; + goto fail_mmapsem; +diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c +index c1f8f53..71a3b96 100644 +--- a/arch/powerpc/kvm/powerpc.c ++++ b/arch/powerpc/kvm/powerpc.c +@@ -1409,7 +1409,7 @@ void kvmppc_init_lpid(unsigned long nr_lpids_param) + } + EXPORT_SYMBOL_GPL(kvmppc_init_lpid); + +-int kvm_arch_init(void *opaque) ++int kvm_arch_init(const void *opaque) + { + return 0; + } +diff --git a/arch/powerpc/lib/usercopy_64.c b/arch/powerpc/lib/usercopy_64.c +index 5eea6f3..5d10396 100644 +--- a/arch/powerpc/lib/usercopy_64.c ++++ b/arch/powerpc/lib/usercopy_64.c +@@ -9,22 +9,6 @@ + #include <linux/module.h> + #include <asm/uaccess.h> + +-unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) +-{ +- if (likely(access_ok(VERIFY_READ, from, n))) +- n = __copy_from_user(to, from, n); +- else +- memset(to, 0, n); +- return n; +-} +- +-unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) +-{ +- if (likely(access_ok(VERIFY_WRITE, to, n))) +- n = __copy_to_user(to, from, n); +- return n; +-} +- + unsigned long copy_in_user(void __user *to, const void __user *from, + unsigned long n) + { +@@ -35,7 +19,5 @@ unsigned long copy_in_user(void __user *to, const void __user *from, + return n; + } + +-EXPORT_SYMBOL(copy_from_user); +-EXPORT_SYMBOL(copy_to_user); + EXPORT_SYMBOL(copy_in_user); + +diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c +index f06b56b..ffb2fb4 100644 +--- a/arch/powerpc/mm/fault.c ++++ b/arch/powerpc/mm/fault.c +@@ -33,6 +33,10 @@ + #include <linux/ratelimit.h> + #include <linux/context_tracking.h> + #include <linux/hugetlb.h> ++#include <linux/slab.h> ++#include <linux/pagemap.h> ++#include <linux/compiler.h> ++#include <linux/unistd.h> + + #include <asm/firmware.h> + #include <asm/page.h> +@@ -69,6 +73,33 @@ static inline int notify_page_fault(struct pt_regs *regs) + } + #endif + ++#ifdef CONFIG_PAX_PAGEEXEC ++/* ++ * PaX: decide what to do with offenders (regs->nip = fault address) ++ * ++ * returns 1 when task should be killed ++ */ ++static int pax_handle_fetch_fault(struct pt_regs *regs) ++{ ++ return 1; ++} ++ ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ unsigned long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 5; i++) { ++ unsigned int c; ++ if (get_user(c, (unsigned int __user *)pc+i)) ++ printk(KERN_CONT "???????? "); ++ else ++ printk(KERN_CONT "%08x ", c); ++ } ++ printk("\n"); ++} ++#endif ++ + /* + * Check whether the instruction at regs->nip is a store using + * an update addressing form which will update r1. +@@ -228,7 +259,7 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address, + * indicate errors in DSISR but can validly be set in SRR1. + */ + if (trap == 0x400) +- error_code &= 0x48200000; ++ error_code &= 0x58200000; + else + is_write = error_code & DSISR_ISSTORE; + #else +@@ -390,7 +421,7 @@ good_area: + * "undefined". Of those that can be set, this is the only + * one which seems bad. + */ +- if (error_code & 0x10000000) ++ if (error_code & DSISR_GUARDED) + /* Guarded storage error. */ + goto bad_area; + #endif /* CONFIG_8xx */ +@@ -405,7 +436,7 @@ good_area: + * processors use the same I/D cache coherency mechanism + * as embedded. + */ +- if (error_code & DSISR_PROTFAULT) ++ if (error_code & (DSISR_PROTFAULT | DSISR_GUARDED)) + goto bad_area; + #endif /* CONFIG_PPC_STD_MMU */ + +@@ -497,6 +528,23 @@ bad_area: + bad_area_nosemaphore: + /* User mode accesses cause a SIGSEGV */ + if (user_mode(regs)) { ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (mm->pax_flags & MF_PAX_PAGEEXEC) { ++#ifdef CONFIG_PPC_STD_MMU ++ if (is_exec && (error_code & (DSISR_PROTFAULT | DSISR_GUARDED))) { ++#else ++ if (is_exec && regs->nip == address) { ++#endif ++ switch (pax_handle_fetch_fault(regs)) { ++ } ++ ++ pax_report_fault(regs, (void *)regs->nip, (void *)regs->gpr[PT_R1]); ++ do_group_exit(SIGKILL); ++ } ++ } ++#endif ++ + _exception(SIGSEGV, regs, code, address); + goto bail; + } +diff --git a/arch/powerpc/mm/mmap.c b/arch/powerpc/mm/mmap.c +index cb8bdbe..cde4bc7 100644 +--- a/arch/powerpc/mm/mmap.c ++++ b/arch/powerpc/mm/mmap.c +@@ -53,10 +53,14 @@ static inline int mmap_is_legacy(void) + return sysctl_legacy_va_layout; + } + +-static unsigned long mmap_rnd(void) ++static unsigned long mmap_rnd(struct mm_struct *mm) + { + unsigned long rnd = 0; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (current->flags & PF_RANDOMIZE) { + /* 8MB for 32bit, 1GB for 64bit */ + if (is_32bit_task()) +@@ -67,7 +71,7 @@ static unsigned long mmap_rnd(void) + return rnd << PAGE_SHIFT; + } + +-static inline unsigned long mmap_base(void) ++static inline unsigned long mmap_base(struct mm_struct *mm) + { + unsigned long gap = rlimit(RLIMIT_STACK); + +@@ -76,7 +80,7 @@ static inline unsigned long mmap_base(void) + else if (gap > MAX_GAP) + gap = MAX_GAP; + +- return PAGE_ALIGN(TASK_SIZE - gap - mmap_rnd()); ++ return PAGE_ALIGN(TASK_SIZE - gap - mmap_rnd(mm)); + } + + /* +@@ -91,9 +95,21 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + */ + if (mmap_is_legacy()) { + mm->mmap_base = TASK_UNMAPPED_BASE; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base += mm->delta_mmap; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area; + } else { +- mm->mmap_base = mmap_base(); ++ mm->mmap_base = mmap_base(mm); ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base -= mm->delta_mmap + mm->delta_stack; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area_topdown; + } + } +diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c +index ded0ea1..f213a9b 100644 +--- a/arch/powerpc/mm/slice.c ++++ b/arch/powerpc/mm/slice.c +@@ -105,7 +105,7 @@ static int slice_area_is_free(struct mm_struct *mm, unsigned long addr, + if ((mm->task_size - len) < addr) + return 0; + vma = find_vma(mm, addr); +- return (!vma || (addr + len) <= vma->vm_start); ++ return check_heap_stack_gap(vma, addr, len, 0); + } + + static int slice_low_has_vma(struct mm_struct *mm, unsigned long slice) +@@ -277,6 +277,12 @@ static unsigned long slice_find_area_bottomup(struct mm_struct *mm, + info.align_offset = 0; + + addr = TASK_UNMAPPED_BASE; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ addr += mm->delta_mmap; ++#endif ++ + while (addr < TASK_SIZE) { + info.low_limit = addr; + if (!slice_scan_available(addr, available, 1, &addr)) +@@ -410,6 +416,11 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len, + if (fixed && addr > (mm->task_size - len)) + return -ENOMEM; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!fixed && (mm->pax_flags & MF_PAX_RANDMMAP)) ++ addr = 0; ++#endif ++ + /* If hint, make sure it matches our alignment restrictions */ + if (!fixed && addr) { + addr = _ALIGN_UP(addr, 1ul << pshift); +diff --git a/arch/powerpc/platforms/cell/celleb_scc_pciex.c b/arch/powerpc/platforms/cell/celleb_scc_pciex.c +index 4278acf..67fd0e6 100644 +--- a/arch/powerpc/platforms/cell/celleb_scc_pciex.c ++++ b/arch/powerpc/platforms/cell/celleb_scc_pciex.c +@@ -400,8 +400,8 @@ static int scc_pciex_write_config(struct pci_bus *bus, unsigned int devfn, + } + + static struct pci_ops scc_pciex_pci_ops = { +- scc_pciex_read_config, +- scc_pciex_write_config, ++ .read = scc_pciex_read_config, ++ .write = scc_pciex_write_config, + }; + + static void pciex_clear_intr_all(unsigned int __iomem *base) +diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c +index d966bbe..372124a 100644 +--- a/arch/powerpc/platforms/cell/spufs/file.c ++++ b/arch/powerpc/platforms/cell/spufs/file.c +@@ -280,9 +280,9 @@ spufs_mem_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) + return VM_FAULT_NOPAGE; + } + +-static int spufs_mem_mmap_access(struct vm_area_struct *vma, ++static ssize_t spufs_mem_mmap_access(struct vm_area_struct *vma, + unsigned long address, +- void *buf, int len, int write) ++ void *buf, size_t len, int write) + { + struct spu_context *ctx = vma->vm_file->private_data; + unsigned long offset = address - vma->vm_start; +diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h +index fa934fe..c296056 100644 +--- a/arch/s390/include/asm/atomic.h ++++ b/arch/s390/include/asm/atomic.h +@@ -412,4 +412,14 @@ static inline long long atomic64_dec_if_positive(atomic64_t *v) + #define atomic64_dec_and_test(_v) (atomic64_sub_return(1, _v) == 0) + #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) + ++#define atomic64_read_unchecked(v) atomic64_read(v) ++#define atomic64_set_unchecked(v, i) atomic64_set((v), (i)) ++#define atomic64_add_unchecked(a, v) atomic64_add((a), (v)) ++#define atomic64_add_return_unchecked(a, v) atomic64_add_return((a), (v)) ++#define atomic64_sub_unchecked(a, v) atomic64_sub((a), (v)) ++#define atomic64_inc_unchecked(v) atomic64_inc(v) ++#define atomic64_inc_return_unchecked(v) atomic64_inc_return(v) ++#define atomic64_dec_unchecked(v) atomic64_dec(v) ++#define atomic64_cmpxchg_unchecked(v, o, n) atomic64_cmpxchg((v), (o), (n)) ++ + #endif /* __ARCH_S390_ATOMIC__ */ +diff --git a/arch/s390/include/asm/barrier.h b/arch/s390/include/asm/barrier.h +index b5dce65..8aca09a 100644 +--- a/arch/s390/include/asm/barrier.h ++++ b/arch/s390/include/asm/barrier.h +@@ -39,7 +39,7 @@ + do { \ + compiletime_assert_atomic_type(*p); \ + barrier(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/arch/s390/include/asm/cache.h b/arch/s390/include/asm/cache.h +index 4d7ccac..d03d0ad 100644 +--- a/arch/s390/include/asm/cache.h ++++ b/arch/s390/include/asm/cache.h +@@ -9,8 +9,10 @@ + #ifndef __ARCH_S390_CACHE_H + #define __ARCH_S390_CACHE_H + +-#define L1_CACHE_BYTES 256 ++#include <linux/const.h> ++ + #define L1_CACHE_SHIFT 8 ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + #define NET_SKB_PAD 32 + + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) +diff --git a/arch/s390/include/asm/elf.h b/arch/s390/include/asm/elf.h +index f6e43d3..5f57681 100644 +--- a/arch/s390/include/asm/elf.h ++++ b/arch/s390/include/asm/elf.h +@@ -163,8 +163,14 @@ extern unsigned int vdso_enabled; + the loader. We need to make sure that it is out of the way of the program + that it will "exec", and that there is sufficient room for the brk. */ + +-extern unsigned long randomize_et_dyn(unsigned long base); +-#define ELF_ET_DYN_BASE (randomize_et_dyn(STACK_TOP / 3 * 2)) ++#define ELF_ET_DYN_BASE (STACK_TOP / 3 * 2) ++ ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE (test_thread_flag(TIF_31BIT) ? 0x10000UL : 0x80000000UL) ++ ++#define PAX_DELTA_MMAP_LEN (test_thread_flag(TIF_31BIT) ? 15 : 26) ++#define PAX_DELTA_STACK_LEN (test_thread_flag(TIF_31BIT) ? 15 : 26) ++#endif + + /* This yields a mask that user programs can use to figure out what + instruction set this CPU supports. */ +@@ -223,9 +229,6 @@ struct linux_binprm; + #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 + int arch_setup_additional_pages(struct linux_binprm *, int); + +-extern unsigned long arch_randomize_brk(struct mm_struct *mm); +-#define arch_randomize_brk arch_randomize_brk +- + void *fill_cpu_elf_notes(void *ptr, struct save_area *sa, __vector128 *vxrs); + + #endif +diff --git a/arch/s390/include/asm/exec.h b/arch/s390/include/asm/exec.h +index c4a93d6..4d2a9b4 100644 +--- a/arch/s390/include/asm/exec.h ++++ b/arch/s390/include/asm/exec.h +@@ -7,6 +7,6 @@ + #ifndef __ASM_EXEC_H + #define __ASM_EXEC_H + +-extern unsigned long arch_align_stack(unsigned long sp); ++#define arch_align_stack(x) ((x) & ~0xfUL) + + #endif /* __ASM_EXEC_H */ +diff --git a/arch/s390/include/asm/uaccess.h b/arch/s390/include/asm/uaccess.h +index cd4c68e..6764641 100644 +--- a/arch/s390/include/asm/uaccess.h ++++ b/arch/s390/include/asm/uaccess.h +@@ -59,6 +59,7 @@ static inline int __range_ok(unsigned long addr, unsigned long size) + __range_ok((unsigned long)(addr), (size)); \ + }) + ++#define access_ok_noprefault(type, addr, size) access_ok((type), (addr), (size)) + #define access_ok(type, addr, size) __access_ok(addr, size) + + /* +@@ -275,6 +276,10 @@ static inline unsigned long __must_check + copy_to_user(void __user *to, const void *from, unsigned long n) + { + might_fault(); ++ ++ if ((long)n < 0) ++ return n; ++ + return __copy_to_user(to, from, n); + } + +@@ -303,10 +308,14 @@ __compiletime_warning("copy_from_user() buffer size is not provably correct") + static inline unsigned long __must_check + copy_from_user(void *to, const void __user *from, unsigned long n) + { +- unsigned int sz = __compiletime_object_size(to); ++ size_t sz = __compiletime_object_size(to); + + might_fault(); +- if (unlikely(sz != -1 && sz < n)) { ++ ++ if ((long)n < 0) ++ return n; ++ ++ if (unlikely(sz != (size_t)-1 && sz < n)) { + copy_from_user_overflow(); + return n; + } +diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c +index b89b591..fd9609d 100644 +--- a/arch/s390/kernel/module.c ++++ b/arch/s390/kernel/module.c +@@ -169,11 +169,11 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, + + /* Increase core size by size of got & plt and set start + offsets for got and plt. */ +- me->core_size = ALIGN(me->core_size, 4); +- me->arch.got_offset = me->core_size; +- me->core_size += me->arch.got_size; +- me->arch.plt_offset = me->core_size; +- me->core_size += me->arch.plt_size; ++ me->core_size_rw = ALIGN(me->core_size_rw, 4); ++ me->arch.got_offset = me->core_size_rw; ++ me->core_size_rw += me->arch.got_size; ++ me->arch.plt_offset = me->core_size_rx; ++ me->core_size_rx += me->arch.plt_size; + return 0; + } + +@@ -289,7 +289,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, + if (info->got_initialized == 0) { + Elf_Addr *gotent; + +- gotent = me->module_core + me->arch.got_offset + ++ gotent = me->module_core_rw + me->arch.got_offset + + info->got_offset; + *gotent = val; + info->got_initialized = 1; +@@ -312,7 +312,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, + rc = apply_rela_bits(loc, val, 0, 64, 0); + else if (r_type == R_390_GOTENT || + r_type == R_390_GOTPLTENT) { +- val += (Elf_Addr) me->module_core - loc; ++ val += (Elf_Addr) me->module_core_rw - loc; + rc = apply_rela_bits(loc, val, 1, 32, 1); + } + break; +@@ -325,7 +325,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, + case R_390_PLTOFF64: /* 16 bit offset from GOT to PLT. */ + if (info->plt_initialized == 0) { + unsigned int *ip; +- ip = me->module_core + me->arch.plt_offset + ++ ip = me->module_core_rx + me->arch.plt_offset + + info->plt_offset; + #ifndef CONFIG_64BIT + ip[0] = 0x0d105810; /* basr 1,0; l 1,6(1); br 1 */ +@@ -350,7 +350,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, + val - loc + 0xffffUL < 0x1ffffeUL) || + (r_type == R_390_PLT32DBL && + val - loc + 0xffffffffULL < 0x1fffffffeULL))) +- val = (Elf_Addr) me->module_core + ++ val = (Elf_Addr) me->module_core_rx + + me->arch.plt_offset + + info->plt_offset; + val += rela->r_addend - loc; +@@ -372,7 +372,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, + case R_390_GOTOFF32: /* 32 bit offset to GOT. */ + case R_390_GOTOFF64: /* 64 bit offset to GOT. */ + val = val + rela->r_addend - +- ((Elf_Addr) me->module_core + me->arch.got_offset); ++ ((Elf_Addr) me->module_core_rw + me->arch.got_offset); + if (r_type == R_390_GOTOFF16) + rc = apply_rela_bits(loc, val, 0, 16, 0); + else if (r_type == R_390_GOTOFF32) +@@ -382,7 +382,7 @@ static int apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, + break; + case R_390_GOTPC: /* 32 bit PC relative offset to GOT. */ + case R_390_GOTPCDBL: /* 32 bit PC rel. off. to GOT shifted by 1. */ +- val = (Elf_Addr) me->module_core + me->arch.got_offset + ++ val = (Elf_Addr) me->module_core_rw + me->arch.got_offset + + rela->r_addend - loc; + if (r_type == R_390_GOTPC) + rc = apply_rela_bits(loc, val, 1, 32, 0); +diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c +index ed84cc2..c05a9d2 100644 +--- a/arch/s390/kernel/process.c ++++ b/arch/s390/kernel/process.c +@@ -218,37 +218,3 @@ unsigned long get_wchan(struct task_struct *p) + } + return 0; + } +- +-unsigned long arch_align_stack(unsigned long sp) +-{ +- if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space) +- sp -= get_random_int() & ~PAGE_MASK; +- return sp & ~0xf; +-} +- +-static inline unsigned long brk_rnd(void) +-{ +- /* 8MB for 32bit, 1GB for 64bit */ +- if (is_32bit_task()) +- return (get_random_int() & 0x7ffUL) << PAGE_SHIFT; +- else +- return (get_random_int() & 0x3ffffUL) << PAGE_SHIFT; +-} +- +-unsigned long arch_randomize_brk(struct mm_struct *mm) +-{ +- unsigned long ret; +- +- ret = PAGE_ALIGN(mm->brk + brk_rnd()); +- return (ret > mm->brk) ? ret : mm->brk; +-} +- +-unsigned long randomize_et_dyn(unsigned long base) +-{ +- unsigned long ret; +- +- if (!(current->flags & PF_RANDOMIZE)) +- return base; +- ret = PAGE_ALIGN(base + brk_rnd()); +- return (ret > base) ? ret : base; +-} +diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c +index 9b436c2..54fbf0a 100644 +--- a/arch/s390/mm/mmap.c ++++ b/arch/s390/mm/mmap.c +@@ -95,9 +95,21 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + */ + if (mmap_is_legacy()) { + mm->mmap_base = mmap_base_legacy(); ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base += mm->delta_mmap; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area; + } else { + mm->mmap_base = mmap_base(); ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base -= mm->delta_mmap + mm->delta_stack; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area_topdown; + } + } +@@ -170,9 +182,21 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + */ + if (mmap_is_legacy()) { + mm->mmap_base = mmap_base_legacy(); ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base += mm->delta_mmap; ++#endif ++ + mm->get_unmapped_area = s390_get_unmapped_area; + } else { + mm->mmap_base = mmap_base(); ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base -= mm->delta_mmap + mm->delta_stack; ++#endif ++ + mm->get_unmapped_area = s390_get_unmapped_area_topdown; + } + } +diff --git a/arch/score/include/asm/cache.h b/arch/score/include/asm/cache.h +index ae3d59f..f65f075 100644 +--- a/arch/score/include/asm/cache.h ++++ b/arch/score/include/asm/cache.h +@@ -1,7 +1,9 @@ + #ifndef _ASM_SCORE_CACHE_H + #define _ASM_SCORE_CACHE_H + ++#include <linux/const.h> ++ + #define L1_CACHE_SHIFT 4 +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #endif /* _ASM_SCORE_CACHE_H */ +diff --git a/arch/score/include/asm/exec.h b/arch/score/include/asm/exec.h +index f9f3cd5..58ff438 100644 +--- a/arch/score/include/asm/exec.h ++++ b/arch/score/include/asm/exec.h +@@ -1,6 +1,6 @@ + #ifndef _ASM_SCORE_EXEC_H + #define _ASM_SCORE_EXEC_H + +-extern unsigned long arch_align_stack(unsigned long sp); ++#define arch_align_stack(x) (x) + + #endif /* _ASM_SCORE_EXEC_H */ +diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c +index a1519ad3..e8ac1ff 100644 +--- a/arch/score/kernel/process.c ++++ b/arch/score/kernel/process.c +@@ -116,8 +116,3 @@ unsigned long get_wchan(struct task_struct *task) + + return task_pt_regs(task)->cp0_epc; + } +- +-unsigned long arch_align_stack(unsigned long sp) +-{ +- return sp; +-} +diff --git a/arch/sh/include/asm/cache.h b/arch/sh/include/asm/cache.h +index ef9e555..331bd29 100644 +--- a/arch/sh/include/asm/cache.h ++++ b/arch/sh/include/asm/cache.h +@@ -9,10 +9,11 @@ + #define __ASM_SH_CACHE_H + #ifdef __KERNEL__ + ++#include <linux/const.h> + #include <linux/init.h> + #include <cpu/cache.h> + +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) + +diff --git a/arch/sh/mm/mmap.c b/arch/sh/mm/mmap.c +index 6777177..cb5e44f 100644 +--- a/arch/sh/mm/mmap.c ++++ b/arch/sh/mm/mmap.c +@@ -36,6 +36,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + int do_colour_align; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + struct vm_unmapped_area_info info; + + if (flags & MAP_FIXED) { +@@ -55,6 +56,10 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, + if (filp || (flags & MAP_SHARED)) + do_colour_align = 1; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + if (do_colour_align) + addr = COLOUR_ALIGN(addr, pgoff); +@@ -62,14 +67,13 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + + info.flags = 0; + info.length = len; +- info.low_limit = TASK_UNMAPPED_BASE; ++ info.low_limit = mm->mmap_base; + info.high_limit = TASK_SIZE; + info.align_mask = do_colour_align ? (PAGE_MASK & shm_align_mask) : 0; + info.align_offset = pgoff << PAGE_SHIFT; +@@ -85,6 +89,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + struct mm_struct *mm = current->mm; + unsigned long addr = addr0; + int do_colour_align; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + struct vm_unmapped_area_info info; + + if (flags & MAP_FIXED) { +@@ -104,6 +109,10 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + if (filp || (flags & MAP_SHARED)) + do_colour_align = 1; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + /* requesting a specific address */ + if (addr) { + if (do_colour_align) +@@ -112,8 +121,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + +@@ -135,6 +143,12 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + VM_BUG_ON(addr != -ENOMEM); + info.flags = 0; + info.low_limit = TASK_UNMAPPED_BASE; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ info.low_limit += mm->delta_mmap; ++#endif ++ + info.high_limit = TASK_SIZE; + addr = vm_unmapped_area(&info); + } +diff --git a/arch/sparc/include/asm/atomic_64.h b/arch/sparc/include/asm/atomic_64.h +index 4082749..fd97781 100644 +--- a/arch/sparc/include/asm/atomic_64.h ++++ b/arch/sparc/include/asm/atomic_64.h +@@ -15,18 +15,38 @@ + #define ATOMIC64_INIT(i) { (i) } + + #define atomic_read(v) ACCESS_ONCE((v)->counter) ++static inline int atomic_read_unchecked(const atomic_unchecked_t *v) ++{ ++ return ACCESS_ONCE(v->counter); ++} + #define atomic64_read(v) ACCESS_ONCE((v)->counter) ++static inline long atomic64_read_unchecked(const atomic64_unchecked_t *v) ++{ ++ return ACCESS_ONCE(v->counter); ++} + + #define atomic_set(v, i) (((v)->counter) = i) ++static inline void atomic_set_unchecked(atomic_unchecked_t *v, int i) ++{ ++ v->counter = i; ++} + #define atomic64_set(v, i) (((v)->counter) = i) ++static inline void atomic64_set_unchecked(atomic64_unchecked_t *v, long i) ++{ ++ v->counter = i; ++} ++ ++#define __ATOMIC_OP(op, suffix) \ ++void atomic_##op##suffix(int, atomic##suffix##_t *); \ ++void atomic64_##op##suffix(long, atomic64##suffix##_t *); ++ ++#define ATOMIC_OP(op) __ATOMIC_OP(op, ) __ATOMIC_OP(op, _unchecked) + +-#define ATOMIC_OP(op) \ +-void atomic_##op(int, atomic_t *); \ +-void atomic64_##op(long, atomic64_t *); ++#define __ATOMIC_OP_RETURN(op, suffix) \ ++int atomic_##op##_return##suffix(int, atomic##suffix##_t *); \ ++long atomic64_##op##_return##suffix(long, atomic64##suffix##_t *); + +-#define ATOMIC_OP_RETURN(op) \ +-int atomic_##op##_return(int, atomic_t *); \ +-long atomic64_##op##_return(long, atomic64_t *); ++#define ATOMIC_OP_RETURN(op) __ATOMIC_OP_RETURN(op, ) __ATOMIC_OP_RETURN(op, _unchecked) + + #define ATOMIC_OPS(op) ATOMIC_OP(op) ATOMIC_OP_RETURN(op) + +@@ -35,13 +55,23 @@ ATOMIC_OPS(sub) + + #undef ATOMIC_OPS + #undef ATOMIC_OP_RETURN ++#undef __ATOMIC_OP_RETURN + #undef ATOMIC_OP ++#undef __ATOMIC_OP + + #define atomic_dec_return(v) atomic_sub_return(1, v) + #define atomic64_dec_return(v) atomic64_sub_return(1, v) + + #define atomic_inc_return(v) atomic_add_return(1, v) ++static inline int atomic_inc_return_unchecked(atomic_unchecked_t *v) ++{ ++ return atomic_add_return_unchecked(1, v); ++} + #define atomic64_inc_return(v) atomic64_add_return(1, v) ++static inline long atomic64_inc_return_unchecked(atomic64_unchecked_t *v) ++{ ++ return atomic64_add_return_unchecked(1, v); ++} + + /* + * atomic_inc_and_test - increment and test +@@ -52,6 +82,10 @@ ATOMIC_OPS(sub) + * other cases. + */ + #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0) ++static inline int atomic_inc_and_test_unchecked(atomic_unchecked_t *v) ++{ ++ return atomic_inc_return_unchecked(v) == 0; ++} + #define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0) + + #define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0) +@@ -61,25 +95,60 @@ ATOMIC_OPS(sub) + #define atomic64_dec_and_test(v) (atomic64_sub_return(1, v) == 0) + + #define atomic_inc(v) atomic_add(1, v) ++static inline void atomic_inc_unchecked(atomic_unchecked_t *v) ++{ ++ atomic_add_unchecked(1, v); ++} + #define atomic64_inc(v) atomic64_add(1, v) ++static inline void atomic64_inc_unchecked(atomic64_unchecked_t *v) ++{ ++ atomic64_add_unchecked(1, v); ++} + + #define atomic_dec(v) atomic_sub(1, v) ++static inline void atomic_dec_unchecked(atomic_unchecked_t *v) ++{ ++ atomic_sub_unchecked(1, v); ++} + #define atomic64_dec(v) atomic64_sub(1, v) ++static inline void atomic64_dec_unchecked(atomic64_unchecked_t *v) ++{ ++ atomic64_sub_unchecked(1, v); ++} + + #define atomic_add_negative(i, v) (atomic_add_return(i, v) < 0) + #define atomic64_add_negative(i, v) (atomic64_add_return(i, v) < 0) + + #define atomic_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) ++static inline int atomic_cmpxchg_unchecked(atomic_unchecked_t *v, int old, int new) ++{ ++ return cmpxchg(&v->counter, old, new); ++} + #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) ++static inline int atomic_xchg_unchecked(atomic_unchecked_t *v, int new) ++{ ++ return xchg(&v->counter, new); ++} + + static inline int __atomic_add_unless(atomic_t *v, int a, int u) + { +- int c, old; ++ int c, old, new; + c = atomic_read(v); + for (;;) { +- if (unlikely(c == (u))) ++ if (unlikely(c == u)) + break; +- old = atomic_cmpxchg((v), c, c + (a)); ++ ++ asm volatile("addcc %2, %0, %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "tvs %%icc, 6\n" ++#endif ++ ++ : "=r" (new) ++ : "0" (c), "ir" (a) ++ : "cc"); ++ ++ old = atomic_cmpxchg(v, c, new); + if (likely(old == c)) + break; + c = old; +@@ -90,20 +159,35 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u) + #define atomic64_cmpxchg(v, o, n) \ + ((__typeof__((v)->counter))cmpxchg(&((v)->counter), (o), (n))) + #define atomic64_xchg(v, new) (xchg(&((v)->counter), new)) ++static inline long atomic64_xchg_unchecked(atomic64_unchecked_t *v, long new) ++{ ++ return xchg(&v->counter, new); ++} + + static inline long atomic64_add_unless(atomic64_t *v, long a, long u) + { +- long c, old; ++ long c, old, new; + c = atomic64_read(v); + for (;;) { +- if (unlikely(c == (u))) ++ if (unlikely(c == u)) + break; +- old = atomic64_cmpxchg((v), c, c + (a)); ++ ++ asm volatile("addcc %2, %0, %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "tvs %%xcc, 6\n" ++#endif ++ ++ : "=r" (new) ++ : "0" (c), "ir" (a) ++ : "cc"); ++ ++ old = atomic64_cmpxchg(v, c, new); + if (likely(old == c)) + break; + c = old; + } +- return c != (u); ++ return c != u; + } + + #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) +diff --git a/arch/sparc/include/asm/barrier_64.h b/arch/sparc/include/asm/barrier_64.h +index 305dcc3..7835030 100644 +--- a/arch/sparc/include/asm/barrier_64.h ++++ b/arch/sparc/include/asm/barrier_64.h +@@ -57,7 +57,7 @@ do { __asm__ __volatile__("ba,pt %%xcc, 1f\n\t" \ + do { \ + compiletime_assert_atomic_type(*p); \ + barrier(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/arch/sparc/include/asm/cache.h b/arch/sparc/include/asm/cache.h +index 5bb6991..5c2132e 100644 +--- a/arch/sparc/include/asm/cache.h ++++ b/arch/sparc/include/asm/cache.h +@@ -7,10 +7,12 @@ + #ifndef _SPARC_CACHE_H + #define _SPARC_CACHE_H + ++#include <linux/const.h> ++ + #define ARCH_SLAB_MINALIGN __alignof__(unsigned long long) + + #define L1_CACHE_SHIFT 5 +-#define L1_CACHE_BYTES 32 ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #ifdef CONFIG_SPARC32 + #define SMP_CACHE_BYTES_SHIFT 5 +diff --git a/arch/sparc/include/asm/elf_32.h b/arch/sparc/include/asm/elf_32.h +index a24e41f..47677ff 100644 +--- a/arch/sparc/include/asm/elf_32.h ++++ b/arch/sparc/include/asm/elf_32.h +@@ -114,6 +114,13 @@ typedef struct { + + #define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE) + ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE 0x10000UL ++ ++#define PAX_DELTA_MMAP_LEN 16 ++#define PAX_DELTA_STACK_LEN 16 ++#endif ++ + /* This yields a mask that user programs can use to figure out what + instruction set this cpu supports. This can NOT be done in userspace + on Sparc. */ +diff --git a/arch/sparc/include/asm/elf_64.h b/arch/sparc/include/asm/elf_64.h +index 370ca1e..d4f4a98 100644 +--- a/arch/sparc/include/asm/elf_64.h ++++ b/arch/sparc/include/asm/elf_64.h +@@ -189,6 +189,13 @@ typedef struct { + #define ELF_ET_DYN_BASE 0x0000010000000000UL + #define COMPAT_ELF_ET_DYN_BASE 0x0000000070000000UL + ++#ifdef CONFIG_PAX_ASLR ++#define PAX_ELF_ET_DYN_BASE (test_thread_flag(TIF_32BIT) ? 0x10000UL : 0x100000UL) ++ ++#define PAX_DELTA_MMAP_LEN (test_thread_flag(TIF_32BIT) ? 14 : 28) ++#define PAX_DELTA_STACK_LEN (test_thread_flag(TIF_32BIT) ? 15 : 29) ++#endif ++ + extern unsigned long sparc64_elf_hwcap; + #define ELF_HWCAP sparc64_elf_hwcap + +diff --git a/arch/sparc/include/asm/pgalloc_32.h b/arch/sparc/include/asm/pgalloc_32.h +index a3890da..f6a408e 100644 +--- a/arch/sparc/include/asm/pgalloc_32.h ++++ b/arch/sparc/include/asm/pgalloc_32.h +@@ -35,6 +35,7 @@ static inline void pgd_set(pgd_t * pgdp, pmd_t * pmdp) + } + + #define pgd_populate(MM, PGD, PMD) pgd_set(PGD, PMD) ++#define pgd_populate_kernel(MM, PGD, PMD) pgd_populate((MM), (PGD), (PMD)) + + static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, + unsigned long address) +diff --git a/arch/sparc/include/asm/pgalloc_64.h b/arch/sparc/include/asm/pgalloc_64.h +index 5e31871..13469c6 100644 +--- a/arch/sparc/include/asm/pgalloc_64.h ++++ b/arch/sparc/include/asm/pgalloc_64.h +@@ -21,6 +21,7 @@ static inline void __pgd_populate(pgd_t *pgd, pud_t *pud) + } + + #define pgd_populate(MM, PGD, PUD) __pgd_populate(PGD, PUD) ++#define pgd_populate_kernel(MM, PGD, PMD) pgd_populate((MM), (PGD), (PMD)) + + static inline pgd_t *pgd_alloc(struct mm_struct *mm) + { +@@ -38,6 +39,7 @@ static inline void __pud_populate(pud_t *pud, pmd_t *pmd) + } + + #define pud_populate(MM, PUD, PMD) __pud_populate(PUD, PMD) ++#define pud_populate_kernel(MM, PUD, PMD) pud_populate((MM), (PUD), (PMD)) + + static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) + { +diff --git a/arch/sparc/include/asm/pgtable.h b/arch/sparc/include/asm/pgtable.h +index 59ba6f6..4518128 100644 +--- a/arch/sparc/include/asm/pgtable.h ++++ b/arch/sparc/include/asm/pgtable.h +@@ -5,4 +5,8 @@ + #else + #include <asm/pgtable_32.h> + #endif ++ ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) ++ + #endif +diff --git a/arch/sparc/include/asm/pgtable_32.h b/arch/sparc/include/asm/pgtable_32.h +index b9b91ae..950b91e 100644 +--- a/arch/sparc/include/asm/pgtable_32.h ++++ b/arch/sparc/include/asm/pgtable_32.h +@@ -51,6 +51,9 @@ unsigned long __init bootmem_init(unsigned long *pages_avail); + #define PAGE_SHARED SRMMU_PAGE_SHARED + #define PAGE_COPY SRMMU_PAGE_COPY + #define PAGE_READONLY SRMMU_PAGE_RDONLY ++#define PAGE_SHARED_NOEXEC SRMMU_PAGE_SHARED_NOEXEC ++#define PAGE_COPY_NOEXEC SRMMU_PAGE_COPY_NOEXEC ++#define PAGE_READONLY_NOEXEC SRMMU_PAGE_RDONLY_NOEXEC + #define PAGE_KERNEL SRMMU_PAGE_KERNEL + + /* Top-level page directory - dummy used by init-mm. +@@ -63,18 +66,18 @@ extern unsigned long ptr_in_current_pgd; + + /* xwr */ + #define __P000 PAGE_NONE +-#define __P001 PAGE_READONLY +-#define __P010 PAGE_COPY +-#define __P011 PAGE_COPY ++#define __P001 PAGE_READONLY_NOEXEC ++#define __P010 PAGE_COPY_NOEXEC ++#define __P011 PAGE_COPY_NOEXEC + #define __P100 PAGE_READONLY + #define __P101 PAGE_READONLY + #define __P110 PAGE_COPY + #define __P111 PAGE_COPY + + #define __S000 PAGE_NONE +-#define __S001 PAGE_READONLY +-#define __S010 PAGE_SHARED +-#define __S011 PAGE_SHARED ++#define __S001 PAGE_READONLY_NOEXEC ++#define __S010 PAGE_SHARED_NOEXEC ++#define __S011 PAGE_SHARED_NOEXEC + #define __S100 PAGE_READONLY + #define __S101 PAGE_READONLY + #define __S110 PAGE_SHARED +diff --git a/arch/sparc/include/asm/pgtsrmmu.h b/arch/sparc/include/asm/pgtsrmmu.h +index 79da178..c2eede8 100644 +--- a/arch/sparc/include/asm/pgtsrmmu.h ++++ b/arch/sparc/include/asm/pgtsrmmu.h +@@ -115,6 +115,11 @@ + SRMMU_EXEC | SRMMU_REF) + #define SRMMU_PAGE_RDONLY __pgprot(SRMMU_VALID | SRMMU_CACHE | \ + SRMMU_EXEC | SRMMU_REF) ++ ++#define SRMMU_PAGE_SHARED_NOEXEC __pgprot(SRMMU_VALID | SRMMU_CACHE | SRMMU_WRITE | SRMMU_REF) ++#define SRMMU_PAGE_COPY_NOEXEC __pgprot(SRMMU_VALID | SRMMU_CACHE | SRMMU_REF) ++#define SRMMU_PAGE_RDONLY_NOEXEC __pgprot(SRMMU_VALID | SRMMU_CACHE | SRMMU_REF) ++ + #define SRMMU_PAGE_KERNEL __pgprot(SRMMU_VALID | SRMMU_CACHE | SRMMU_PRIV | \ + SRMMU_DIRTY | SRMMU_REF) + +diff --git a/arch/sparc/include/asm/setup.h b/arch/sparc/include/asm/setup.h +index 29d64b1..4272fe8 100644 +--- a/arch/sparc/include/asm/setup.h ++++ b/arch/sparc/include/asm/setup.h +@@ -55,8 +55,8 @@ int handle_ldf_stq(u32 insn, struct pt_regs *regs); + void handle_ld_nf(u32 insn, struct pt_regs *regs); + + /* init_64.c */ +-extern atomic_t dcpage_flushes; +-extern atomic_t dcpage_flushes_xcall; ++extern atomic_unchecked_t dcpage_flushes; ++extern atomic_unchecked_t dcpage_flushes_xcall; + + extern int sysctl_tsb_ratio; + #endif +diff --git a/arch/sparc/include/asm/spinlock_64.h b/arch/sparc/include/asm/spinlock_64.h +index 9689176..63c18ea 100644 +--- a/arch/sparc/include/asm/spinlock_64.h ++++ b/arch/sparc/include/asm/spinlock_64.h +@@ -92,14 +92,19 @@ static inline void arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long fla + + /* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */ + +-static void inline arch_read_lock(arch_rwlock_t *lock) ++static inline void arch_read_lock(arch_rwlock_t *lock) + { + unsigned long tmp1, tmp2; + + __asm__ __volatile__ ( + "1: ldsw [%2], %0\n" + " brlz,pn %0, 2f\n" +-"4: add %0, 1, %1\n" ++"4: addcc %0, 1, %1\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" tvs %%icc, 6\n" ++#endif ++ + " cas [%2], %0, %1\n" + " cmp %0, %1\n" + " bne,pn %%icc, 1b\n" +@@ -112,10 +117,10 @@ static void inline arch_read_lock(arch_rwlock_t *lock) + " .previous" + : "=&r" (tmp1), "=&r" (tmp2) + : "r" (lock) +- : "memory"); ++ : "memory", "cc"); + } + +-static int inline arch_read_trylock(arch_rwlock_t *lock) ++static inline int arch_read_trylock(arch_rwlock_t *lock) + { + int tmp1, tmp2; + +@@ -123,7 +128,12 @@ static int inline arch_read_trylock(arch_rwlock_t *lock) + "1: ldsw [%2], %0\n" + " brlz,a,pn %0, 2f\n" + " mov 0, %0\n" +-" add %0, 1, %1\n" ++" addcc %0, 1, %1\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" tvs %%icc, 6\n" ++#endif ++ + " cas [%2], %0, %1\n" + " cmp %0, %1\n" + " bne,pn %%icc, 1b\n" +@@ -136,13 +146,18 @@ static int inline arch_read_trylock(arch_rwlock_t *lock) + return tmp1; + } + +-static void inline arch_read_unlock(arch_rwlock_t *lock) ++static inline void arch_read_unlock(arch_rwlock_t *lock) + { + unsigned long tmp1, tmp2; + + __asm__ __volatile__( + "1: lduw [%2], %0\n" +-" sub %0, 1, %1\n" ++" subcc %0, 1, %1\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++" tvs %%icc, 6\n" ++#endif ++ + " cas [%2], %0, %1\n" + " cmp %0, %1\n" + " bne,pn %%xcc, 1b\n" +@@ -152,7 +167,7 @@ static void inline arch_read_unlock(arch_rwlock_t *lock) + : "memory"); + } + +-static void inline arch_write_lock(arch_rwlock_t *lock) ++static inline void arch_write_lock(arch_rwlock_t *lock) + { + unsigned long mask, tmp1, tmp2; + +@@ -177,7 +192,7 @@ static void inline arch_write_lock(arch_rwlock_t *lock) + : "memory"); + } + +-static void inline arch_write_unlock(arch_rwlock_t *lock) ++static inline void arch_write_unlock(arch_rwlock_t *lock) + { + __asm__ __volatile__( + " stw %%g0, [%0]" +@@ -186,7 +201,7 @@ static void inline arch_write_unlock(arch_rwlock_t *lock) + : "memory"); + } + +-static int inline arch_write_trylock(arch_rwlock_t *lock) ++static inline int arch_write_trylock(arch_rwlock_t *lock) + { + unsigned long mask, tmp1, tmp2, result; + +diff --git a/arch/sparc/include/asm/thread_info_32.h b/arch/sparc/include/asm/thread_info_32.h +index 025c984..a216504 100644 +--- a/arch/sparc/include/asm/thread_info_32.h ++++ b/arch/sparc/include/asm/thread_info_32.h +@@ -49,6 +49,8 @@ struct thread_info { + unsigned long w_saved; + + struct restart_block restart_block; ++ ++ unsigned long lowest_stack; + }; + + /* +diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h +index 798f027..b009941 100644 +--- a/arch/sparc/include/asm/thread_info_64.h ++++ b/arch/sparc/include/asm/thread_info_64.h +@@ -63,6 +63,8 @@ struct thread_info { + struct pt_regs *kern_una_regs; + unsigned int kern_una_insn; + ++ unsigned long lowest_stack; ++ + unsigned long fpregs[(7 * 256) / sizeof(unsigned long)] + __attribute__ ((aligned(64))); + }; +@@ -190,12 +192,13 @@ register struct thread_info *current_thread_info_reg asm("g6"); + #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ + /* flag bit 4 is available */ + #define TIF_UNALIGNED 5 /* allowed to do unaligned accesses */ +-/* flag bit 6 is available */ ++#define TIF_GRSEC_SETXID 6 /* update credentials on syscall entry/exit */ + #define TIF_32BIT 7 /* 32-bit binary */ + #define TIF_NOHZ 8 /* in adaptive nohz mode */ + #define TIF_SECCOMP 9 /* secure computing */ + #define TIF_SYSCALL_AUDIT 10 /* syscall auditing active */ + #define TIF_SYSCALL_TRACEPOINT 11 /* syscall tracepoint instrumentation */ ++ + /* NOTE: Thread flags >= 12 should be ones we have no interest + * in using in assembly, else we can't use the mask as + * an immediate value in instructions such as andcc. +@@ -215,12 +218,17 @@ register struct thread_info *current_thread_info_reg asm("g6"); + #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) + #define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) + #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) ++#define _TIF_GRSEC_SETXID (1<<TIF_GRSEC_SETXID) + + #define _TIF_USER_WORK_MASK ((0xff << TI_FLAG_WSAVED_SHIFT) | \ + _TIF_DO_NOTIFY_RESUME_MASK | \ + _TIF_NEED_RESCHED) + #define _TIF_DO_NOTIFY_RESUME_MASK (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING) + ++#define _TIF_WORK_SYSCALL \ ++ (_TIF_SYSCALL_TRACE | _TIF_SECCOMP | _TIF_SYSCALL_AUDIT | \ ++ _TIF_SYSCALL_TRACEPOINT | _TIF_NOHZ | _TIF_GRSEC_SETXID) ++ + #define is_32bit_task() (test_thread_flag(TIF_32BIT)) + + /* +diff --git a/arch/sparc/include/asm/uaccess.h b/arch/sparc/include/asm/uaccess.h +index bd56c28..4b63d83 100644 +--- a/arch/sparc/include/asm/uaccess.h ++++ b/arch/sparc/include/asm/uaccess.h +@@ -1,5 +1,6 @@ + #ifndef ___ASM_SPARC_UACCESS_H + #define ___ASM_SPARC_UACCESS_H ++ + #if defined(__sparc__) && defined(__arch64__) + #include <asm/uaccess_64.h> + #else +diff --git a/arch/sparc/include/asm/uaccess_32.h b/arch/sparc/include/asm/uaccess_32.h +index 9634d08..020b2dc 100644 +--- a/arch/sparc/include/asm/uaccess_32.h ++++ b/arch/sparc/include/asm/uaccess_32.h +@@ -47,6 +47,7 @@ + #define __user_ok(addr, size) ({ (void)(size); (addr) < STACK_TOP; }) + #define __kernel_ok (segment_eq(get_fs(), KERNEL_DS)) + #define __access_ok(addr,size) (__user_ok((addr) & get_fs().seg,(size))) ++#define access_ok_noprefault(type, addr, size) access_ok((type), (addr), (size)) + #define access_ok(type, addr, size) \ + ({ (void)(type); __access_ok((unsigned long)(addr), size); }) + +@@ -250,27 +251,46 @@ unsigned long __copy_user(void __user *to, const void __user *from, unsigned lon + + static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) + { +- if (n && __access_ok((unsigned long) to, n)) ++ if ((long)n < 0) ++ return n; ++ ++ if (n && __access_ok((unsigned long) to, n)) { ++ if (!__builtin_constant_p(n)) ++ check_object_size(from, n, true); + return __copy_user(to, (__force void __user *) from, n); +- else ++ } else + return n; + } + + static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n) + { ++ if ((long)n < 0) ++ return n; ++ ++ if (!__builtin_constant_p(n)) ++ check_object_size(from, n, true); ++ + return __copy_user(to, (__force void __user *) from, n); + } + + static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) + { +- if (n && __access_ok((unsigned long) from, n)) ++ if ((long)n < 0) ++ return n; ++ ++ if (n && __access_ok((unsigned long) from, n)) { ++ if (!__builtin_constant_p(n)) ++ check_object_size(to, n, false); + return __copy_user((__force void __user *) to, from, n); +- else ++ } else + return n; + } + + static inline unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n) + { ++ if ((long)n < 0) ++ return n; ++ + return __copy_user((__force void __user *) to, from, n); + } + +diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h +index c990a5e..7384856 100644 +--- a/arch/sparc/include/asm/uaccess_64.h ++++ b/arch/sparc/include/asm/uaccess_64.h +@@ -10,6 +10,7 @@ + #include <linux/compiler.h> + #include <linux/string.h> + #include <linux/thread_info.h> ++#include <linux/kernel.h> + #include <asm/asi.h> + #include <asm/spitfire.h> + #include <asm-generic/uaccess-unaligned.h> +@@ -54,6 +55,11 @@ static inline int __access_ok(const void __user * addr, unsigned long size) + return 1; + } + ++static inline int access_ok_noprefault(int type, const void __user * addr, unsigned long size) ++{ ++ return 1; ++} ++ + static inline int access_ok(int type, const void __user * addr, unsigned long size) + { + return 1; +@@ -214,8 +220,15 @@ unsigned long copy_from_user_fixup(void *to, const void __user *from, + static inline unsigned long __must_check + copy_from_user(void *to, const void __user *from, unsigned long size) + { +- unsigned long ret = ___copy_from_user(to, from, size); ++ unsigned long ret; + ++ if ((long)size < 0 || size > INT_MAX) ++ return size; ++ ++ if (!__builtin_constant_p(size)) ++ check_object_size(to, size, false); ++ ++ ret = ___copy_from_user(to, from, size); + if (unlikely(ret)) + ret = copy_from_user_fixup(to, from, size); + +@@ -231,8 +244,15 @@ unsigned long copy_to_user_fixup(void __user *to, const void *from, + static inline unsigned long __must_check + copy_to_user(void __user *to, const void *from, unsigned long size) + { +- unsigned long ret = ___copy_to_user(to, from, size); ++ unsigned long ret; ++ ++ if ((long)size < 0 || size > INT_MAX) ++ return size; ++ ++ if (!__builtin_constant_p(size)) ++ check_object_size(from, size, true); + ++ ret = ___copy_to_user(to, from, size); + if (unlikely(ret)) + ret = copy_to_user_fixup(to, from, size); + return ret; +diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile +index 7cf9c6e..6206648 100644 +--- a/arch/sparc/kernel/Makefile ++++ b/arch/sparc/kernel/Makefile +@@ -4,7 +4,7 @@ + # + + asflags-y := -ansi +-ccflags-y := -Werror ++#ccflags-y := -Werror + + extra-y := head_$(BITS).o + +diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c +index 50e7b62..79fae35 100644 +--- a/arch/sparc/kernel/process_32.c ++++ b/arch/sparc/kernel/process_32.c +@@ -123,14 +123,14 @@ void show_regs(struct pt_regs *r) + + printk("PSR: %08lx PC: %08lx NPC: %08lx Y: %08lx %s\n", + r->psr, r->pc, r->npc, r->y, print_tainted()); +- printk("PC: <%pS>\n", (void *) r->pc); ++ printk("PC: <%pA>\n", (void *) r->pc); + printk("%%G: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", + r->u_regs[0], r->u_regs[1], r->u_regs[2], r->u_regs[3], + r->u_regs[4], r->u_regs[5], r->u_regs[6], r->u_regs[7]); + printk("%%O: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", + r->u_regs[8], r->u_regs[9], r->u_regs[10], r->u_regs[11], + r->u_regs[12], r->u_regs[13], r->u_regs[14], r->u_regs[15]); +- printk("RPC: <%pS>\n", (void *) r->u_regs[15]); ++ printk("RPC: <%pA>\n", (void *) r->u_regs[15]); + + printk("%%L: %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", + rw->locals[0], rw->locals[1], rw->locals[2], rw->locals[3], +@@ -167,7 +167,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) + rw = (struct reg_window32 *) fp; + pc = rw->ins[7]; + printk("[%08lx : ", pc); +- printk("%pS ] ", (void *) pc); ++ printk("%pA ] ", (void *) pc); + fp = rw->ins[6]; + } while (++count < 16); + printk("\n"); +diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c +index 46a5964..a35c62c 100644 +--- a/arch/sparc/kernel/process_64.c ++++ b/arch/sparc/kernel/process_64.c +@@ -161,7 +161,7 @@ static void show_regwindow(struct pt_regs *regs) + printk("i4: %016lx i5: %016lx i6: %016lx i7: %016lx\n", + rwk->ins[4], rwk->ins[5], rwk->ins[6], rwk->ins[7]); + if (regs->tstate & TSTATE_PRIV) +- printk("I7: <%pS>\n", (void *) rwk->ins[7]); ++ printk("I7: <%pA>\n", (void *) rwk->ins[7]); + } + + void show_regs(struct pt_regs *regs) +@@ -170,7 +170,7 @@ void show_regs(struct pt_regs *regs) + + printk("TSTATE: %016lx TPC: %016lx TNPC: %016lx Y: %08x %s\n", regs->tstate, + regs->tpc, regs->tnpc, regs->y, print_tainted()); +- printk("TPC: <%pS>\n", (void *) regs->tpc); ++ printk("TPC: <%pA>\n", (void *) regs->tpc); + printk("g0: %016lx g1: %016lx g2: %016lx g3: %016lx\n", + regs->u_regs[0], regs->u_regs[1], regs->u_regs[2], + regs->u_regs[3]); +@@ -183,7 +183,7 @@ void show_regs(struct pt_regs *regs) + printk("o4: %016lx o5: %016lx sp: %016lx ret_pc: %016lx\n", + regs->u_regs[12], regs->u_regs[13], regs->u_regs[14], + regs->u_regs[15]); +- printk("RPC: <%pS>\n", (void *) regs->u_regs[15]); ++ printk("RPC: <%pA>\n", (void *) regs->u_regs[15]); + show_regwindow(regs); + show_stack(current, (unsigned long *) regs->u_regs[UREG_FP]); + } +@@ -278,7 +278,7 @@ void arch_trigger_all_cpu_backtrace(bool include_self) + ((tp && tp->task) ? tp->task->pid : -1)); + + if (gp->tstate & TSTATE_PRIV) { +- printk(" TPC[%pS] O7[%pS] I7[%pS] RPC[%pS]\n", ++ printk(" TPC[%pA] O7[%pA] I7[%pA] RPC[%pA]\n", + (void *) gp->tpc, + (void *) gp->o7, + (void *) gp->i7, +diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c +index 79cc0d1..ec62734 100644 +--- a/arch/sparc/kernel/prom_common.c ++++ b/arch/sparc/kernel/prom_common.c +@@ -144,7 +144,7 @@ static int __init prom_common_nextprop(phandle node, char *prev, char *buf) + + unsigned int prom_early_allocated __initdata; + +-static struct of_pdt_ops prom_sparc_ops __initdata = { ++static struct of_pdt_ops prom_sparc_ops __initconst = { + .nextprop = prom_common_nextprop, + .getproplen = prom_getproplen, + .getproperty = prom_getproperty, +diff --git a/arch/sparc/kernel/ptrace_64.c b/arch/sparc/kernel/ptrace_64.c +index 9ddc492..27a5619 100644 +--- a/arch/sparc/kernel/ptrace_64.c ++++ b/arch/sparc/kernel/ptrace_64.c +@@ -1060,6 +1060,10 @@ long arch_ptrace(struct task_struct *child, long request, + return ret; + } + ++#ifdef CONFIG_GRKERNSEC_SETXID ++extern void gr_delayed_cred_worker(void); ++#endif ++ + asmlinkage int syscall_trace_enter(struct pt_regs *regs) + { + int ret = 0; +@@ -1070,6 +1074,11 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs) + if (test_thread_flag(TIF_NOHZ)) + user_exit(); + ++#ifdef CONFIG_GRKERNSEC_SETXID ++ if (unlikely(test_and_clear_thread_flag(TIF_GRSEC_SETXID))) ++ gr_delayed_cred_worker(); ++#endif ++ + if (test_thread_flag(TIF_SYSCALL_TRACE)) + ret = tracehook_report_syscall_entry(regs); + +@@ -1088,6 +1097,11 @@ asmlinkage void syscall_trace_leave(struct pt_regs *regs) + if (test_thread_flag(TIF_NOHZ)) + user_exit(); + ++#ifdef CONFIG_GRKERNSEC_SETXID ++ if (unlikely(test_and_clear_thread_flag(TIF_GRSEC_SETXID))) ++ gr_delayed_cred_worker(); ++#endif ++ + audit_syscall_exit(regs); + + if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) +diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c +index da6f1a7..e5dea8f 100644 +--- a/arch/sparc/kernel/smp_64.c ++++ b/arch/sparc/kernel/smp_64.c +@@ -887,7 +887,7 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu) + return; + + #ifdef CONFIG_DEBUG_DCFLUSH +- atomic_inc(&dcpage_flushes); ++ atomic_inc_unchecked(&dcpage_flushes); + #endif + + this_cpu = get_cpu(); +@@ -911,7 +911,7 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu) + xcall_deliver(data0, __pa(pg_addr), + (u64) pg_addr, cpumask_of(cpu)); + #ifdef CONFIG_DEBUG_DCFLUSH +- atomic_inc(&dcpage_flushes_xcall); ++ atomic_inc_unchecked(&dcpage_flushes_xcall); + #endif + } + } +@@ -930,7 +930,7 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page) + preempt_disable(); + + #ifdef CONFIG_DEBUG_DCFLUSH +- atomic_inc(&dcpage_flushes); ++ atomic_inc_unchecked(&dcpage_flushes); + #endif + data0 = 0; + pg_addr = page_address(page); +@@ -947,7 +947,7 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page) + xcall_deliver(data0, __pa(pg_addr), + (u64) pg_addr, cpu_online_mask); + #ifdef CONFIG_DEBUG_DCFLUSH +- atomic_inc(&dcpage_flushes_xcall); ++ atomic_inc_unchecked(&dcpage_flushes_xcall); + #endif + } + __local_flush_dcache_page(page); +diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c +index 646988d..b88905f 100644 +--- a/arch/sparc/kernel/sys_sparc_32.c ++++ b/arch/sparc/kernel/sys_sparc_32.c +@@ -54,7 +54,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi + if (len > TASK_SIZE - PAGE_SIZE) + return -ENOMEM; + if (!addr) +- addr = TASK_UNMAPPED_BASE; ++ addr = current->mm->mmap_base; + + info.flags = 0; + info.length = len; +diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c +index 30e7ddb..266a3b0 100644 +--- a/arch/sparc/kernel/sys_sparc_64.c ++++ b/arch/sparc/kernel/sys_sparc_64.c +@@ -89,13 +89,14 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi + struct vm_area_struct * vma; + unsigned long task_size = TASK_SIZE; + int do_color_align; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + struct vm_unmapped_area_info info; + + if (flags & MAP_FIXED) { + /* We do not accept a shared mapping if it would violate + * cache aliasing constraints. + */ +- if ((flags & MAP_SHARED) && ++ if ((filp || (flags & MAP_SHARED)) && + ((addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1))) + return -EINVAL; + return addr; +@@ -110,6 +111,10 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi + if (filp || (flags & MAP_SHARED)) + do_color_align = 1; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + if (do_color_align) + addr = COLOR_ALIGN(addr, pgoff); +@@ -117,22 +122,28 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (task_size - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (task_size - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + + info.flags = 0; + info.length = len; +- info.low_limit = TASK_UNMAPPED_BASE; ++ info.low_limit = mm->mmap_base; + info.high_limit = min(task_size, VA_EXCLUDE_START); + info.align_mask = do_color_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; + info.align_offset = pgoff << PAGE_SHIFT; ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + + if ((addr & ~PAGE_MASK) && task_size > VA_EXCLUDE_END) { + VM_BUG_ON(addr != -ENOMEM); + info.low_limit = VA_EXCLUDE_END; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ info.low_limit += mm->delta_mmap; ++#endif ++ + info.high_limit = task_size; + addr = vm_unmapped_area(&info); + } +@@ -150,6 +161,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + unsigned long task_size = STACK_TOP32; + unsigned long addr = addr0; + int do_color_align; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + struct vm_unmapped_area_info info; + + /* This should only ever run for 32-bit processes. */ +@@ -159,7 +171,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + /* We do not accept a shared mapping if it would violate + * cache aliasing constraints. + */ +- if ((flags & MAP_SHARED) && ++ if ((filp || (flags & MAP_SHARED)) && + ((addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1))) + return -EINVAL; + return addr; +@@ -172,6 +184,10 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + if (filp || (flags & MAP_SHARED)) + do_color_align = 1; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + /* requesting a specific address */ + if (addr) { + if (do_color_align) +@@ -180,8 +196,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + addr = PAGE_ALIGN(addr); + + vma = find_vma(mm, addr); +- if (task_size - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (task_size - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + +@@ -191,6 +206,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + info.high_limit = mm->mmap_base; + info.align_mask = do_color_align ? (PAGE_MASK & (SHMLBA - 1)) : 0; + info.align_offset = pgoff << PAGE_SHIFT; ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + + /* +@@ -203,6 +219,12 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + VM_BUG_ON(addr != -ENOMEM); + info.flags = 0; + info.low_limit = TASK_UNMAPPED_BASE; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ info.low_limit += mm->delta_mmap; ++#endif ++ + info.high_limit = STACK_TOP32; + addr = vm_unmapped_area(&info); + } +@@ -259,10 +281,14 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u + EXPORT_SYMBOL(get_fb_unmapped_area); + + /* Essentially the same as PowerPC. */ +-static unsigned long mmap_rnd(void) ++static unsigned long mmap_rnd(struct mm_struct *mm) + { + unsigned long rnd = 0UL; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (current->flags & PF_RANDOMIZE) { + unsigned long val = get_random_int(); + if (test_thread_flag(TIF_32BIT)) +@@ -275,7 +301,7 @@ static unsigned long mmap_rnd(void) + + void arch_pick_mmap_layout(struct mm_struct *mm) + { +- unsigned long random_factor = mmap_rnd(); ++ unsigned long random_factor = mmap_rnd(mm); + unsigned long gap; + + /* +@@ -288,6 +314,12 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + gap == RLIM_INFINITY || + sysctl_legacy_va_layout) { + mm->mmap_base = TASK_UNMAPPED_BASE + random_factor; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base += mm->delta_mmap; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area; + } else { + /* We know it's 32-bit */ +@@ -299,6 +331,12 @@ void arch_pick_mmap_layout(struct mm_struct *mm) + gap = (task_size / 6 * 5); + + mm->mmap_base = PAGE_ALIGN(task_size - gap - random_factor); ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base -= mm->delta_mmap + mm->delta_stack; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area_topdown; + } + } +diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S +index 33a17e7..d87fb1f 100644 +--- a/arch/sparc/kernel/syscalls.S ++++ b/arch/sparc/kernel/syscalls.S +@@ -52,7 +52,7 @@ sys32_rt_sigreturn: + #endif + .align 32 + 1: ldx [%g6 + TI_FLAGS], %l5 +- andcc %l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0 ++ andcc %l5, _TIF_WORK_SYSCALL, %g0 + be,pt %icc, rtrap + nop + call syscall_trace_leave +@@ -184,7 +184,7 @@ linux_sparc_syscall32: + + srl %i3, 0, %o3 ! IEU0 + srl %i2, 0, %o2 ! IEU0 Group +- andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0 ++ andcc %l0, _TIF_WORK_SYSCALL, %g0 + bne,pn %icc, linux_syscall_trace32 ! CTI + mov %i0, %l5 ! IEU1 + 5: call %l7 ! CTI Group brk forced +@@ -208,7 +208,7 @@ linux_sparc_syscall: + + mov %i3, %o3 ! IEU1 + mov %i4, %o4 ! IEU0 Group +- andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0 ++ andcc %l0, _TIF_WORK_SYSCALL, %g0 + bne,pn %icc, linux_syscall_trace ! CTI Group + mov %i0, %l5 ! IEU0 + 2: call %l7 ! CTI Group brk forced +@@ -223,7 +223,7 @@ ret_sys_call: + + cmp %o0, -ERESTART_RESTARTBLOCK + bgeu,pn %xcc, 1f +- andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0 ++ andcc %l0, _TIF_WORK_SYSCALL, %g0 + ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc + + 2: +diff --git a/arch/sparc/kernel/traps_32.c b/arch/sparc/kernel/traps_32.c +index 6fd386c5..6907d81 100644 +--- a/arch/sparc/kernel/traps_32.c ++++ b/arch/sparc/kernel/traps_32.c +@@ -44,6 +44,8 @@ static void instruction_dump(unsigned long *pc) + #define __SAVE __asm__ __volatile__("save %sp, -0x40, %sp\n\t") + #define __RESTORE __asm__ __volatile__("restore %g0, %g0, %g0\n\t") + ++extern void gr_handle_kernel_exploit(void); ++ + void __noreturn die_if_kernel(char *str, struct pt_regs *regs) + { + static int die_counter; +@@ -76,15 +78,17 @@ void __noreturn die_if_kernel(char *str, struct pt_regs *regs) + count++ < 30 && + (((unsigned long) rw) >= PAGE_OFFSET) && + !(((unsigned long) rw) & 0x7)) { +- printk("Caller[%08lx]: %pS\n", rw->ins[7], ++ printk("Caller[%08lx]: %pA\n", rw->ins[7], + (void *) rw->ins[7]); + rw = (struct reg_window32 *)rw->ins[6]; + } + } + printk("Instruction DUMP:"); + instruction_dump ((unsigned long *) regs->pc); +- if(regs->psr & PSR_PS) ++ if(regs->psr & PSR_PS) { ++ gr_handle_kernel_exploit(); + do_exit(SIGKILL); ++ } + do_exit(SIGSEGV); + } + +diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c +index 981a769..d906eda 100644 +--- a/arch/sparc/kernel/traps_64.c ++++ b/arch/sparc/kernel/traps_64.c +@@ -79,7 +79,7 @@ static void dump_tl1_traplog(struct tl1_traplog *p) + i + 1, + p->trapstack[i].tstate, p->trapstack[i].tpc, + p->trapstack[i].tnpc, p->trapstack[i].tt); +- printk("TRAPLOG: TPC<%pS>\n", (void *) p->trapstack[i].tpc); ++ printk("TRAPLOG: TPC<%pA>\n", (void *) p->trapstack[i].tpc); + } + } + +@@ -99,6 +99,12 @@ void bad_trap(struct pt_regs *regs, long lvl) + + lvl -= 0x100; + if (regs->tstate & TSTATE_PRIV) { ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ if (lvl == 6) ++ pax_report_refcount_overflow(regs); ++#endif ++ + sprintf(buffer, "Kernel bad sw trap %lx", lvl); + die_if_kernel(buffer, regs); + } +@@ -117,11 +123,16 @@ void bad_trap(struct pt_regs *regs, long lvl) + void bad_trap_tl1(struct pt_regs *regs, long lvl) + { + char buffer[32]; +- ++ + if (notify_die(DIE_TRAP_TL1, "bad trap tl1", regs, + 0, lvl, SIGTRAP) == NOTIFY_STOP) + return; + ++#ifdef CONFIG_PAX_REFCOUNT ++ if (lvl == 6) ++ pax_report_refcount_overflow(regs); ++#endif ++ + dump_tl1_traplog((struct tl1_traplog *)(regs + 1)); + + sprintf (buffer, "Bad trap %lx at tl>0", lvl); +@@ -1151,7 +1162,7 @@ static void cheetah_log_errors(struct pt_regs *regs, struct cheetah_err_info *in + regs->tpc, regs->tnpc, regs->u_regs[UREG_I7], regs->tstate); + printk("%s" "ERROR(%d): ", + (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id()); +- printk("TPC<%pS>\n", (void *) regs->tpc); ++ printk("TPC<%pA>\n", (void *) regs->tpc); + printk("%s" "ERROR(%d): M_SYND(%lx), E_SYND(%lx)%s%s\n", + (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(), + (afsr & CHAFSR_M_SYNDROME) >> CHAFSR_M_SYNDROME_SHIFT, +@@ -1758,7 +1769,7 @@ void cheetah_plus_parity_error(int type, struct pt_regs *regs) + smp_processor_id(), + (type & 0x1) ? 'I' : 'D', + regs->tpc); +- printk(KERN_EMERG "TPC<%pS>\n", (void *) regs->tpc); ++ printk(KERN_EMERG "TPC<%pA>\n", (void *) regs->tpc); + panic("Irrecoverable Cheetah+ parity error."); + } + +@@ -1766,7 +1777,7 @@ void cheetah_plus_parity_error(int type, struct pt_regs *regs) + smp_processor_id(), + (type & 0x1) ? 'I' : 'D', + regs->tpc); +- printk(KERN_WARNING "TPC<%pS>\n", (void *) regs->tpc); ++ printk(KERN_WARNING "TPC<%pA>\n", (void *) regs->tpc); + } + + struct sun4v_error_entry { +@@ -1839,8 +1850,8 @@ struct sun4v_error_entry { + /*0x38*/u64 reserved_5; + }; + +-static atomic_t sun4v_resum_oflow_cnt = ATOMIC_INIT(0); +-static atomic_t sun4v_nonresum_oflow_cnt = ATOMIC_INIT(0); ++static atomic_unchecked_t sun4v_resum_oflow_cnt = ATOMIC_INIT(0); ++static atomic_unchecked_t sun4v_nonresum_oflow_cnt = ATOMIC_INIT(0); + + static const char *sun4v_err_type_to_str(u8 type) + { +@@ -1932,7 +1943,7 @@ static void sun4v_report_real_raddr(const char *pfx, struct pt_regs *regs) + } + + static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, +- int cpu, const char *pfx, atomic_t *ocnt) ++ int cpu, const char *pfx, atomic_unchecked_t *ocnt) + { + u64 *raw_ptr = (u64 *) ent; + u32 attrs; +@@ -1990,8 +2001,8 @@ static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, + + show_regs(regs); + +- if ((cnt = atomic_read(ocnt)) != 0) { +- atomic_set(ocnt, 0); ++ if ((cnt = atomic_read_unchecked(ocnt)) != 0) { ++ atomic_set_unchecked(ocnt, 0); + wmb(); + printk("%s: Queue overflowed %d times.\n", + pfx, cnt); +@@ -2048,7 +2059,7 @@ out: + */ + void sun4v_resum_overflow(struct pt_regs *regs) + { +- atomic_inc(&sun4v_resum_oflow_cnt); ++ atomic_inc_unchecked(&sun4v_resum_oflow_cnt); + } + + /* We run with %pil set to PIL_NORMAL_MAX and PSTATE_IE enabled in %pstate. +@@ -2101,7 +2112,7 @@ void sun4v_nonresum_overflow(struct pt_regs *regs) + /* XXX Actually even this can make not that much sense. Perhaps + * XXX we should just pull the plug and panic directly from here? + */ +- atomic_inc(&sun4v_nonresum_oflow_cnt); ++ atomic_inc_unchecked(&sun4v_nonresum_oflow_cnt); + } + + static void sun4v_tlb_error(struct pt_regs *regs) +@@ -2120,9 +2131,9 @@ void sun4v_itlb_error_report(struct pt_regs *regs, int tl) + + printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n", + regs->tpc, tl); +- printk(KERN_EMERG "SUN4V-ITLB: TPC<%pS>\n", (void *) regs->tpc); ++ printk(KERN_EMERG "SUN4V-ITLB: TPC<%pA>\n", (void *) regs->tpc); + printk(KERN_EMERG "SUN4V-ITLB: O7[%lx]\n", regs->u_regs[UREG_I7]); +- printk(KERN_EMERG "SUN4V-ITLB: O7<%pS>\n", ++ printk(KERN_EMERG "SUN4V-ITLB: O7<%pA>\n", + (void *) regs->u_regs[UREG_I7]); + printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] " + "pte[%lx] error[%lx]\n", +@@ -2143,9 +2154,9 @@ void sun4v_dtlb_error_report(struct pt_regs *regs, int tl) + + printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n", + regs->tpc, tl); +- printk(KERN_EMERG "SUN4V-DTLB: TPC<%pS>\n", (void *) regs->tpc); ++ printk(KERN_EMERG "SUN4V-DTLB: TPC<%pA>\n", (void *) regs->tpc); + printk(KERN_EMERG "SUN4V-DTLB: O7[%lx]\n", regs->u_regs[UREG_I7]); +- printk(KERN_EMERG "SUN4V-DTLB: O7<%pS>\n", ++ printk(KERN_EMERG "SUN4V-DTLB: O7<%pA>\n", + (void *) regs->u_regs[UREG_I7]); + printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] " + "pte[%lx] error[%lx]\n", +@@ -2362,13 +2373,13 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) + fp = (unsigned long)sf->fp + STACK_BIAS; + } + +- printk(" [%016lx] %pS\n", pc, (void *) pc); ++ printk(" [%016lx] %pA\n", pc, (void *) pc); + #ifdef CONFIG_FUNCTION_GRAPH_TRACER + if ((pc + 8UL) == (unsigned long) &return_to_handler) { + int index = tsk->curr_ret_stack; + if (tsk->ret_stack && index >= graph) { + pc = tsk->ret_stack[index - graph].ret; +- printk(" [%016lx] %pS\n", pc, (void *) pc); ++ printk(" [%016lx] %pA\n", pc, (void *) pc); + graph++; + } + } +@@ -2386,6 +2397,8 @@ static inline struct reg_window *kernel_stack_up(struct reg_window *rw) + return (struct reg_window *) (fp + STACK_BIAS); + } + ++extern void gr_handle_kernel_exploit(void); ++ + void __noreturn die_if_kernel(char *str, struct pt_regs *regs) + { + static int die_counter; +@@ -2414,7 +2427,7 @@ void __noreturn die_if_kernel(char *str, struct pt_regs *regs) + while (rw && + count++ < 30 && + kstack_valid(tp, (unsigned long) rw)) { +- printk("Caller[%016lx]: %pS\n", rw->ins[7], ++ printk("Caller[%016lx]: %pA\n", rw->ins[7], + (void *) rw->ins[7]); + + rw = kernel_stack_up(rw); +@@ -2427,8 +2440,10 @@ void __noreturn die_if_kernel(char *str, struct pt_regs *regs) + } + user_instruction_dump ((unsigned int __user *) regs->tpc); + } +- if (regs->tstate & TSTATE_PRIV) ++ if (regs->tstate & TSTATE_PRIV) { ++ gr_handle_kernel_exploit(); + do_exit(SIGKILL); ++ } + do_exit(SIGSEGV); + } + EXPORT_SYMBOL(die_if_kernel); +diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c +index 62098a8..547ab2c 100644 +--- a/arch/sparc/kernel/unaligned_64.c ++++ b/arch/sparc/kernel/unaligned_64.c +@@ -297,7 +297,7 @@ static void log_unaligned(struct pt_regs *regs) + static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5); + + if (__ratelimit(&ratelimit)) { +- printk("Kernel unaligned access at TPC[%lx] %pS\n", ++ printk("Kernel unaligned access at TPC[%lx] %pA\n", + regs->tpc, (void *) regs->tpc); + } + } +diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile +index 3269b02..64f5231 100644 +--- a/arch/sparc/lib/Makefile ++++ b/arch/sparc/lib/Makefile +@@ -2,7 +2,7 @@ + # + + asflags-y := -ansi -DST_DIV0=0x02 +-ccflags-y := -Werror ++#ccflags-y := -Werror + + lib-$(CONFIG_SPARC32) += ashrdi3.o + lib-$(CONFIG_SPARC32) += memcpy.o memset.o +diff --git a/arch/sparc/lib/atomic_64.S b/arch/sparc/lib/atomic_64.S +index 05dac43..76f8ed4 100644 +--- a/arch/sparc/lib/atomic_64.S ++++ b/arch/sparc/lib/atomic_64.S +@@ -15,11 +15,22 @@ + * a value and does the barriers. + */ + +-#define ATOMIC_OP(op) \ +-ENTRY(atomic_##op) /* %o0 = increment, %o1 = atomic_ptr */ \ ++#ifdef CONFIG_PAX_REFCOUNT ++#define __REFCOUNT_OP(op) op##cc ++#define __OVERFLOW_IOP tvs %icc, 6; ++#define __OVERFLOW_XOP tvs %xcc, 6; ++#else ++#define __REFCOUNT_OP(op) op ++#define __OVERFLOW_IOP ++#define __OVERFLOW_XOP ++#endif ++ ++#define __ATOMIC_OP(op, suffix, asm_op, post_op) \ ++ENTRY(atomic_##op##suffix) /* %o0 = increment, %o1 = atomic_ptr */ \ + BACKOFF_SETUP(%o2); \ + 1: lduw [%o1], %g1; \ +- op %g1, %o0, %g7; \ ++ asm_op %g1, %o0, %g7; \ ++ post_op \ + cas [%o1], %g1, %g7; \ + cmp %g1, %g7; \ + bne,pn %icc, BACKOFF_LABEL(2f, 1b); \ +@@ -29,11 +40,15 @@ ENTRY(atomic_##op) /* %o0 = increment, %o1 = atomic_ptr */ \ + 2: BACKOFF_SPIN(%o2, %o3, 1b); \ + ENDPROC(atomic_##op); \ + +-#define ATOMIC_OP_RETURN(op) \ +-ENTRY(atomic_##op##_return) /* %o0 = increment, %o1 = atomic_ptr */ \ ++#define ATOMIC_OP(op) __ATOMIC_OP(op, , op, ) \ ++ __ATOMIC_OP(op, _unchecked, __REFCOUNT_OP(op), __OVERFLOW_IOP) ++ ++#define __ATOMIC_OP_RETURN(op, suffix, asm_op, post_op) \ ++ENTRY(atomic_##op##_return##suffix) /* %o0 = increment, %o1 = atomic_ptr */\ + BACKOFF_SETUP(%o2); \ + 1: lduw [%o1], %g1; \ +- op %g1, %o0, %g7; \ ++ asm_op %g1, %o0, %g7; \ ++ post_op \ + cas [%o1], %g1, %g7; \ + cmp %g1, %g7; \ + bne,pn %icc, BACKOFF_LABEL(2f, 1b); \ +@@ -43,6 +58,9 @@ ENTRY(atomic_##op##_return) /* %o0 = increment, %o1 = atomic_ptr */ \ + 2: BACKOFF_SPIN(%o2, %o3, 1b); \ + ENDPROC(atomic_##op##_return); + ++#define ATOMIC_OP_RETURN(op) __ATOMIC_OP_RETURN(op, , op, ) \ ++ __ATOMIC_OP_RETURN(op, _unchecked, __REFCOUNT_OP(op), __OVERFLOW_IOP) ++ + #define ATOMIC_OPS(op) ATOMIC_OP(op) ATOMIC_OP_RETURN(op) + + ATOMIC_OPS(add) +@@ -50,13 +68,16 @@ ATOMIC_OPS(sub) + + #undef ATOMIC_OPS + #undef ATOMIC_OP_RETURN ++#undef __ATOMIC_OP_RETURN + #undef ATOMIC_OP ++#undef __ATOMIC_OP + +-#define ATOMIC64_OP(op) \ +-ENTRY(atomic64_##op) /* %o0 = increment, %o1 = atomic_ptr */ \ ++#define __ATOMIC64_OP(op, suffix, asm_op, post_op) \ ++ENTRY(atomic64_##op##suffix) /* %o0 = increment, %o1 = atomic_ptr */ \ + BACKOFF_SETUP(%o2); \ + 1: ldx [%o1], %g1; \ +- op %g1, %o0, %g7; \ ++ asm_op %g1, %o0, %g7; \ ++ post_op \ + casx [%o1], %g1, %g7; \ + cmp %g1, %g7; \ + bne,pn %xcc, BACKOFF_LABEL(2f, 1b); \ +@@ -66,11 +87,15 @@ ENTRY(atomic64_##op) /* %o0 = increment, %o1 = atomic_ptr */ \ + 2: BACKOFF_SPIN(%o2, %o3, 1b); \ + ENDPROC(atomic64_##op); \ + +-#define ATOMIC64_OP_RETURN(op) \ +-ENTRY(atomic64_##op##_return) /* %o0 = increment, %o1 = atomic_ptr */ \ ++#define ATOMIC64_OP(op) __ATOMIC64_OP(op, , op, ) \ ++ __ATOMIC64_OP(op, _unchecked, __REFCOUNT_OP(op), __OVERFLOW_XOP) ++ ++#define __ATOMIC64_OP_RETURN(op, suffix, asm_op, post_op) \ ++ENTRY(atomic64_##op##_return##suffix) /* %o0 = increment, %o1 = atomic_ptr */\ + BACKOFF_SETUP(%o2); \ + 1: ldx [%o1], %g1; \ +- op %g1, %o0, %g7; \ ++ asm_op %g1, %o0, %g7; \ ++ post_op \ + casx [%o1], %g1, %g7; \ + cmp %g1, %g7; \ + bne,pn %xcc, BACKOFF_LABEL(2f, 1b); \ +@@ -80,6 +105,9 @@ ENTRY(atomic64_##op##_return) /* %o0 = increment, %o1 = atomic_ptr */ \ + 2: BACKOFF_SPIN(%o2, %o3, 1b); \ + ENDPROC(atomic64_##op##_return); + ++#define ATOMIC64_OP_RETURN(op) __ATOMIC64_OP_RETURN(op, , op, ) \ ++i __ATOMIC64_OP_RETURN(op, _unchecked, __REFCOUNT_OP(op), __OVERFLOW_XOP) ++ + #define ATOMIC64_OPS(op) ATOMIC64_OP(op) ATOMIC64_OP_RETURN(op) + + ATOMIC64_OPS(add) +@@ -87,7 +115,12 @@ ATOMIC64_OPS(sub) + + #undef ATOMIC64_OPS + #undef ATOMIC64_OP_RETURN ++#undef __ATOMIC64_OP_RETURN + #undef ATOMIC64_OP ++#undef __ATOMIC64_OP ++#undef __OVERFLOW_XOP ++#undef __OVERFLOW_IOP ++#undef __REFCOUNT_OP + + ENTRY(atomic64_dec_if_positive) /* %o0 = atomic_ptr */ + BACKOFF_SETUP(%o2) +diff --git a/arch/sparc/lib/ksyms.c b/arch/sparc/lib/ksyms.c +index 1d649a9..fbc5bfc 100644 +--- a/arch/sparc/lib/ksyms.c ++++ b/arch/sparc/lib/ksyms.c +@@ -101,7 +101,9 @@ EXPORT_SYMBOL(__clear_user); + /* Atomic counter implementation. */ + #define ATOMIC_OP(op) \ + EXPORT_SYMBOL(atomic_##op); \ +-EXPORT_SYMBOL(atomic64_##op); ++EXPORT_SYMBOL(atomic_##op##_unchecked); \ ++EXPORT_SYMBOL(atomic64_##op); \ ++EXPORT_SYMBOL(atomic64_##op##_unchecked); + + #define ATOMIC_OP_RETURN(op) \ + EXPORT_SYMBOL(atomic_##op##_return); \ +@@ -110,6 +112,8 @@ EXPORT_SYMBOL(atomic64_##op##_return); + #define ATOMIC_OPS(op) ATOMIC_OP(op) ATOMIC_OP_RETURN(op) + + ATOMIC_OPS(add) ++EXPORT_SYMBOL(atomic_add_ret_unchecked); ++EXPORT_SYMBOL(atomic64_add_ret_unchecked); + ATOMIC_OPS(sub) + + #undef ATOMIC_OPS +diff --git a/arch/sparc/mm/Makefile b/arch/sparc/mm/Makefile +index 30c3ecc..736f015 100644 +--- a/arch/sparc/mm/Makefile ++++ b/arch/sparc/mm/Makefile +@@ -2,7 +2,7 @@ + # + + asflags-y := -ansi +-ccflags-y := -Werror ++#ccflags-y := -Werror + + obj-$(CONFIG_SPARC64) += ultra.o tlb.o tsb.o gup.o + obj-y += fault_$(BITS).o +diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c +index 70d8171..274c6c0 100644 +--- a/arch/sparc/mm/fault_32.c ++++ b/arch/sparc/mm/fault_32.c +@@ -21,6 +21,9 @@ + #include <linux/perf_event.h> + #include <linux/interrupt.h> + #include <linux/kdebug.h> ++#include <linux/slab.h> ++#include <linux/pagemap.h> ++#include <linux/compiler.h> + + #include <asm/page.h> + #include <asm/pgtable.h> +@@ -156,6 +159,277 @@ static unsigned long compute_si_addr(struct pt_regs *regs, int text_fault) + return safe_compute_effective_address(regs, insn); + } + ++#ifdef CONFIG_PAX_PAGEEXEC ++#ifdef CONFIG_PAX_DLRESOLVE ++static void pax_emuplt_close(struct vm_area_struct *vma) ++{ ++ vma->vm_mm->call_dl_resolve = 0UL; ++} ++ ++static int pax_emuplt_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ++{ ++ unsigned int *kaddr; ++ ++ vmf->page = alloc_page(GFP_HIGHUSER); ++ if (!vmf->page) ++ return VM_FAULT_OOM; ++ ++ kaddr = kmap(vmf->page); ++ memset(kaddr, 0, PAGE_SIZE); ++ kaddr[0] = 0x9DE3BFA8U; /* save */ ++ flush_dcache_page(vmf->page); ++ kunmap(vmf->page); ++ return VM_FAULT_MAJOR; ++} ++ ++static const struct vm_operations_struct pax_vm_ops = { ++ .close = pax_emuplt_close, ++ .fault = pax_emuplt_fault ++}; ++ ++static int pax_insert_vma(struct vm_area_struct *vma, unsigned long addr) ++{ ++ int ret; ++ ++ INIT_LIST_HEAD(&vma->anon_vma_chain); ++ vma->vm_mm = current->mm; ++ vma->vm_start = addr; ++ vma->vm_end = addr + PAGE_SIZE; ++ vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYEXEC; ++ vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); ++ vma->vm_ops = &pax_vm_ops; ++ ++ ret = insert_vm_struct(current->mm, vma); ++ if (ret) ++ return ret; ++ ++ ++current->mm->total_vm; ++ return 0; ++} ++#endif ++ ++/* ++ * PaX: decide what to do with offenders (regs->pc = fault address) ++ * ++ * returns 1 when task should be killed ++ * 2 when patched PLT trampoline was detected ++ * 3 when unpatched PLT trampoline was detected ++ */ ++static int pax_handle_fetch_fault(struct pt_regs *regs) ++{ ++ ++#ifdef CONFIG_PAX_EMUPLT ++ int err; ++ ++ do { /* PaX: patched PLT emulation #1 */ ++ unsigned int sethi1, sethi2, jmpl; ++ ++ err = get_user(sethi1, (unsigned int *)regs->pc); ++ err |= get_user(sethi2, (unsigned int *)(regs->pc+4)); ++ err |= get_user(jmpl, (unsigned int *)(regs->pc+8)); ++ ++ if (err) ++ break; ++ ++ if ((sethi1 & 0xFFC00000U) == 0x03000000U && ++ (sethi2 & 0xFFC00000U) == 0x03000000U && ++ (jmpl & 0xFFFFE000U) == 0x81C06000U) ++ { ++ unsigned int addr; ++ ++ regs->u_regs[UREG_G1] = (sethi2 & 0x003FFFFFU) << 10; ++ addr = regs->u_regs[UREG_G1]; ++ addr += (((jmpl | 0xFFFFE000U) ^ 0x00001000U) + 0x00001000U); ++ regs->pc = addr; ++ regs->npc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: patched PLT emulation #2 */ ++ unsigned int ba; ++ ++ err = get_user(ba, (unsigned int *)regs->pc); ++ ++ if (err) ++ break; ++ ++ if ((ba & 0xFFC00000U) == 0x30800000U || (ba & 0xFFF80000U) == 0x30480000U) { ++ unsigned int addr; ++ ++ if ((ba & 0xFFC00000U) == 0x30800000U) ++ addr = regs->pc + ((((ba | 0xFFC00000U) ^ 0x00200000U) + 0x00200000U) << 2); ++ else ++ addr = regs->pc + ((((ba | 0xFFF80000U) ^ 0x00040000U) + 0x00040000U) << 2); ++ regs->pc = addr; ++ regs->npc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: patched PLT emulation #3 */ ++ unsigned int sethi, bajmpl, nop; ++ ++ err = get_user(sethi, (unsigned int *)regs->pc); ++ err |= get_user(bajmpl, (unsigned int *)(regs->pc+4)); ++ err |= get_user(nop, (unsigned int *)(regs->pc+8)); ++ ++ if (err) ++ break; ++ ++ if ((sethi & 0xFFC00000U) == 0x03000000U && ++ ((bajmpl & 0xFFFFE000U) == 0x81C06000U || (bajmpl & 0xFFF80000U) == 0x30480000U) && ++ nop == 0x01000000U) ++ { ++ unsigned int addr; ++ ++ addr = (sethi & 0x003FFFFFU) << 10; ++ regs->u_regs[UREG_G1] = addr; ++ if ((bajmpl & 0xFFFFE000U) == 0x81C06000U) ++ addr += (((bajmpl | 0xFFFFE000U) ^ 0x00001000U) + 0x00001000U); ++ else ++ addr = regs->pc + ((((bajmpl | 0xFFF80000U) ^ 0x00040000U) + 0x00040000U) << 2); ++ regs->pc = addr; ++ regs->npc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: unpatched PLT emulation step 1 */ ++ unsigned int sethi, ba, nop; ++ ++ err = get_user(sethi, (unsigned int *)regs->pc); ++ err |= get_user(ba, (unsigned int *)(regs->pc+4)); ++ err |= get_user(nop, (unsigned int *)(regs->pc+8)); ++ ++ if (err) ++ break; ++ ++ if ((sethi & 0xFFC00000U) == 0x03000000U && ++ ((ba & 0xFFC00000U) == 0x30800000U || (ba & 0xFFF80000U) == 0x30680000U) && ++ nop == 0x01000000U) ++ { ++ unsigned int addr, save, call; ++ ++ if ((ba & 0xFFC00000U) == 0x30800000U) ++ addr = regs->pc + 4 + ((((ba | 0xFFC00000U) ^ 0x00200000U) + 0x00200000U) << 2); ++ else ++ addr = regs->pc + 4 + ((((ba | 0xFFF80000U) ^ 0x00040000U) + 0x00040000U) << 2); ++ ++ err = get_user(save, (unsigned int *)addr); ++ err |= get_user(call, (unsigned int *)(addr+4)); ++ err |= get_user(nop, (unsigned int *)(addr+8)); ++ if (err) ++ break; ++ ++#ifdef CONFIG_PAX_DLRESOLVE ++ if (save == 0x9DE3BFA8U && ++ (call & 0xC0000000U) == 0x40000000U && ++ nop == 0x01000000U) ++ { ++ struct vm_area_struct *vma; ++ unsigned long call_dl_resolve; ++ ++ down_read(¤t->mm->mmap_sem); ++ call_dl_resolve = current->mm->call_dl_resolve; ++ up_read(¤t->mm->mmap_sem); ++ if (likely(call_dl_resolve)) ++ goto emulate; ++ ++ vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); ++ ++ down_write(¤t->mm->mmap_sem); ++ if (current->mm->call_dl_resolve) { ++ call_dl_resolve = current->mm->call_dl_resolve; ++ up_write(¤t->mm->mmap_sem); ++ if (vma) ++ kmem_cache_free(vm_area_cachep, vma); ++ goto emulate; ++ } ++ ++ call_dl_resolve = get_unmapped_area(NULL, 0UL, PAGE_SIZE, 0UL, MAP_PRIVATE); ++ if (!vma || (call_dl_resolve & ~PAGE_MASK)) { ++ up_write(¤t->mm->mmap_sem); ++ if (vma) ++ kmem_cache_free(vm_area_cachep, vma); ++ return 1; ++ } ++ ++ if (pax_insert_vma(vma, call_dl_resolve)) { ++ up_write(¤t->mm->mmap_sem); ++ kmem_cache_free(vm_area_cachep, vma); ++ return 1; ++ } ++ ++ current->mm->call_dl_resolve = call_dl_resolve; ++ up_write(¤t->mm->mmap_sem); ++ ++emulate: ++ regs->u_regs[UREG_G1] = (sethi & 0x003FFFFFU) << 10; ++ regs->pc = call_dl_resolve; ++ regs->npc = addr+4; ++ return 3; ++ } ++#endif ++ ++ /* PaX: glibc 2.4+ generates sethi/jmpl instead of save/call */ ++ if ((save & 0xFFC00000U) == 0x05000000U && ++ (call & 0xFFFFE000U) == 0x85C0A000U && ++ nop == 0x01000000U) ++ { ++ regs->u_regs[UREG_G1] = (sethi & 0x003FFFFFU) << 10; ++ regs->u_regs[UREG_G2] = addr + 4; ++ addr = (save & 0x003FFFFFU) << 10; ++ addr += (((call | 0xFFFFE000U) ^ 0x00001000U) + 0x00001000U); ++ regs->pc = addr; ++ regs->npc = addr+4; ++ return 3; ++ } ++ } ++ } while (0); ++ ++ do { /* PaX: unpatched PLT emulation step 2 */ ++ unsigned int save, call, nop; ++ ++ err = get_user(save, (unsigned int *)(regs->pc-4)); ++ err |= get_user(call, (unsigned int *)regs->pc); ++ err |= get_user(nop, (unsigned int *)(regs->pc+4)); ++ if (err) ++ break; ++ ++ if (save == 0x9DE3BFA8U && ++ (call & 0xC0000000U) == 0x40000000U && ++ nop == 0x01000000U) ++ { ++ unsigned int dl_resolve = regs->pc + ((((call | 0xC0000000U) ^ 0x20000000U) + 0x20000000U) << 2); ++ ++ regs->u_regs[UREG_RETPC] = regs->pc; ++ regs->pc = dl_resolve; ++ regs->npc = dl_resolve+4; ++ return 3; ++ } ++ } while (0); ++#endif ++ ++ return 1; ++} ++ ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ unsigned long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 8; i++) { ++ unsigned int c; ++ if (get_user(c, (unsigned int *)pc+i)) ++ printk(KERN_CONT "???????? "); ++ else ++ printk(KERN_CONT "%08x ", c); ++ } ++ printk("\n"); ++} ++#endif ++ + static noinline void do_fault_siginfo(int code, int sig, struct pt_regs *regs, + int text_fault) + { +@@ -226,6 +500,24 @@ good_area: + if (!(vma->vm_flags & VM_WRITE)) + goto bad_area; + } else { ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if ((mm->pax_flags & MF_PAX_PAGEEXEC) && text_fault && !(vma->vm_flags & VM_EXEC)) { ++ up_read(&mm->mmap_sem); ++ switch (pax_handle_fetch_fault(regs)) { ++ ++#ifdef CONFIG_PAX_EMUPLT ++ case 2: ++ case 3: ++ return; ++#endif ++ ++ } ++ pax_report_fault(regs, (void *)regs->pc, (void *)regs->u_regs[UREG_FP]); ++ do_group_exit(SIGKILL); ++ } ++#endif ++ + /* Allow reads even for write-only mappings */ + if (!(vma->vm_flags & (VM_READ | VM_EXEC))) + goto bad_area; +diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c +index 4798232..f76e3aa 100644 +--- a/arch/sparc/mm/fault_64.c ++++ b/arch/sparc/mm/fault_64.c +@@ -22,6 +22,9 @@ + #include <linux/kdebug.h> + #include <linux/percpu.h> + #include <linux/context_tracking.h> ++#include <linux/slab.h> ++#include <linux/pagemap.h> ++#include <linux/compiler.h> + + #include <asm/page.h> + #include <asm/pgtable.h> +@@ -76,7 +79,7 @@ static void __kprobes bad_kernel_pc(struct pt_regs *regs, unsigned long vaddr) + printk(KERN_CRIT "OOPS: Bogus kernel PC [%016lx] in fault handler\n", + regs->tpc); + printk(KERN_CRIT "OOPS: RPC [%016lx]\n", regs->u_regs[15]); +- printk("OOPS: RPC <%pS>\n", (void *) regs->u_regs[15]); ++ printk("OOPS: RPC <%pA>\n", (void *) regs->u_regs[15]); + printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr); + dump_stack(); + unhandled_fault(regs->tpc, current, regs); +@@ -279,6 +282,466 @@ static void noinline __kprobes bogus_32bit_fault_tpc(struct pt_regs *regs) + show_regs(regs); + } + ++#ifdef CONFIG_PAX_PAGEEXEC ++#ifdef CONFIG_PAX_DLRESOLVE ++static void pax_emuplt_close(struct vm_area_struct *vma) ++{ ++ vma->vm_mm->call_dl_resolve = 0UL; ++} ++ ++static int pax_emuplt_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ++{ ++ unsigned int *kaddr; ++ ++ vmf->page = alloc_page(GFP_HIGHUSER); ++ if (!vmf->page) ++ return VM_FAULT_OOM; ++ ++ kaddr = kmap(vmf->page); ++ memset(kaddr, 0, PAGE_SIZE); ++ kaddr[0] = 0x9DE3BFA8U; /* save */ ++ flush_dcache_page(vmf->page); ++ kunmap(vmf->page); ++ return VM_FAULT_MAJOR; ++} ++ ++static const struct vm_operations_struct pax_vm_ops = { ++ .close = pax_emuplt_close, ++ .fault = pax_emuplt_fault ++}; ++ ++static int pax_insert_vma(struct vm_area_struct *vma, unsigned long addr) ++{ ++ int ret; ++ ++ INIT_LIST_HEAD(&vma->anon_vma_chain); ++ vma->vm_mm = current->mm; ++ vma->vm_start = addr; ++ vma->vm_end = addr + PAGE_SIZE; ++ vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYEXEC; ++ vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); ++ vma->vm_ops = &pax_vm_ops; ++ ++ ret = insert_vm_struct(current->mm, vma); ++ if (ret) ++ return ret; ++ ++ ++current->mm->total_vm; ++ return 0; ++} ++#endif ++ ++/* ++ * PaX: decide what to do with offenders (regs->tpc = fault address) ++ * ++ * returns 1 when task should be killed ++ * 2 when patched PLT trampoline was detected ++ * 3 when unpatched PLT trampoline was detected ++ */ ++static int pax_handle_fetch_fault(struct pt_regs *regs) ++{ ++ ++#ifdef CONFIG_PAX_EMUPLT ++ int err; ++ ++ do { /* PaX: patched PLT emulation #1 */ ++ unsigned int sethi1, sethi2, jmpl; ++ ++ err = get_user(sethi1, (unsigned int *)regs->tpc); ++ err |= get_user(sethi2, (unsigned int *)(regs->tpc+4)); ++ err |= get_user(jmpl, (unsigned int *)(regs->tpc+8)); ++ ++ if (err) ++ break; ++ ++ if ((sethi1 & 0xFFC00000U) == 0x03000000U && ++ (sethi2 & 0xFFC00000U) == 0x03000000U && ++ (jmpl & 0xFFFFE000U) == 0x81C06000U) ++ { ++ unsigned long addr; ++ ++ regs->u_regs[UREG_G1] = (sethi2 & 0x003FFFFFU) << 10; ++ addr = regs->u_regs[UREG_G1]; ++ addr += (((jmpl | 0xFFFFFFFFFFFFE000UL) ^ 0x00001000UL) + 0x00001000UL); ++ ++ if (test_thread_flag(TIF_32BIT)) ++ addr &= 0xFFFFFFFFUL; ++ ++ regs->tpc = addr; ++ regs->tnpc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: patched PLT emulation #2 */ ++ unsigned int ba; ++ ++ err = get_user(ba, (unsigned int *)regs->tpc); ++ ++ if (err) ++ break; ++ ++ if ((ba & 0xFFC00000U) == 0x30800000U || (ba & 0xFFF80000U) == 0x30480000U) { ++ unsigned long addr; ++ ++ if ((ba & 0xFFC00000U) == 0x30800000U) ++ addr = regs->tpc + ((((ba | 0xFFFFFFFFFFC00000UL) ^ 0x00200000UL) + 0x00200000UL) << 2); ++ else ++ addr = regs->tpc + ((((ba | 0xFFFFFFFFFFF80000UL) ^ 0x00040000UL) + 0x00040000UL) << 2); ++ ++ if (test_thread_flag(TIF_32BIT)) ++ addr &= 0xFFFFFFFFUL; ++ ++ regs->tpc = addr; ++ regs->tnpc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: patched PLT emulation #3 */ ++ unsigned int sethi, bajmpl, nop; ++ ++ err = get_user(sethi, (unsigned int *)regs->tpc); ++ err |= get_user(bajmpl, (unsigned int *)(regs->tpc+4)); ++ err |= get_user(nop, (unsigned int *)(regs->tpc+8)); ++ ++ if (err) ++ break; ++ ++ if ((sethi & 0xFFC00000U) == 0x03000000U && ++ ((bajmpl & 0xFFFFE000U) == 0x81C06000U || (bajmpl & 0xFFF80000U) == 0x30480000U) && ++ nop == 0x01000000U) ++ { ++ unsigned long addr; ++ ++ addr = (sethi & 0x003FFFFFU) << 10; ++ regs->u_regs[UREG_G1] = addr; ++ if ((bajmpl & 0xFFFFE000U) == 0x81C06000U) ++ addr += (((bajmpl | 0xFFFFFFFFFFFFE000UL) ^ 0x00001000UL) + 0x00001000UL); ++ else ++ addr = regs->tpc + ((((bajmpl | 0xFFFFFFFFFFF80000UL) ^ 0x00040000UL) + 0x00040000UL) << 2); ++ ++ if (test_thread_flag(TIF_32BIT)) ++ addr &= 0xFFFFFFFFUL; ++ ++ regs->tpc = addr; ++ regs->tnpc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: patched PLT emulation #4 */ ++ unsigned int sethi, mov1, call, mov2; ++ ++ err = get_user(sethi, (unsigned int *)regs->tpc); ++ err |= get_user(mov1, (unsigned int *)(regs->tpc+4)); ++ err |= get_user(call, (unsigned int *)(regs->tpc+8)); ++ err |= get_user(mov2, (unsigned int *)(regs->tpc+12)); ++ ++ if (err) ++ break; ++ ++ if ((sethi & 0xFFC00000U) == 0x03000000U && ++ mov1 == 0x8210000FU && ++ (call & 0xC0000000U) == 0x40000000U && ++ mov2 == 0x9E100001U) ++ { ++ unsigned long addr; ++ ++ regs->u_regs[UREG_G1] = regs->u_regs[UREG_RETPC]; ++ addr = regs->tpc + 4 + ((((call | 0xFFFFFFFFC0000000UL) ^ 0x20000000UL) + 0x20000000UL) << 2); ++ ++ if (test_thread_flag(TIF_32BIT)) ++ addr &= 0xFFFFFFFFUL; ++ ++ regs->tpc = addr; ++ regs->tnpc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: patched PLT emulation #5 */ ++ unsigned int sethi, sethi1, sethi2, or1, or2, sllx, jmpl, nop; ++ ++ err = get_user(sethi, (unsigned int *)regs->tpc); ++ err |= get_user(sethi1, (unsigned int *)(regs->tpc+4)); ++ err |= get_user(sethi2, (unsigned int *)(regs->tpc+8)); ++ err |= get_user(or1, (unsigned int *)(regs->tpc+12)); ++ err |= get_user(or2, (unsigned int *)(regs->tpc+16)); ++ err |= get_user(sllx, (unsigned int *)(regs->tpc+20)); ++ err |= get_user(jmpl, (unsigned int *)(regs->tpc+24)); ++ err |= get_user(nop, (unsigned int *)(regs->tpc+28)); ++ ++ if (err) ++ break; ++ ++ if ((sethi & 0xFFC00000U) == 0x03000000U && ++ (sethi1 & 0xFFC00000U) == 0x03000000U && ++ (sethi2 & 0xFFC00000U) == 0x0B000000U && ++ (or1 & 0xFFFFE000U) == 0x82106000U && ++ (or2 & 0xFFFFE000U) == 0x8A116000U && ++ sllx == 0x83287020U && ++ jmpl == 0x81C04005U && ++ nop == 0x01000000U) ++ { ++ unsigned long addr; ++ ++ regs->u_regs[UREG_G1] = ((sethi1 & 0x003FFFFFU) << 10) | (or1 & 0x000003FFU); ++ regs->u_regs[UREG_G1] <<= 32; ++ regs->u_regs[UREG_G5] = ((sethi2 & 0x003FFFFFU) << 10) | (or2 & 0x000003FFU); ++ addr = regs->u_regs[UREG_G1] + regs->u_regs[UREG_G5]; ++ regs->tpc = addr; ++ regs->tnpc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: patched PLT emulation #6 */ ++ unsigned int sethi, sethi1, sethi2, sllx, or, jmpl, nop; ++ ++ err = get_user(sethi, (unsigned int *)regs->tpc); ++ err |= get_user(sethi1, (unsigned int *)(regs->tpc+4)); ++ err |= get_user(sethi2, (unsigned int *)(regs->tpc+8)); ++ err |= get_user(sllx, (unsigned int *)(regs->tpc+12)); ++ err |= get_user(or, (unsigned int *)(regs->tpc+16)); ++ err |= get_user(jmpl, (unsigned int *)(regs->tpc+20)); ++ err |= get_user(nop, (unsigned int *)(regs->tpc+24)); ++ ++ if (err) ++ break; ++ ++ if ((sethi & 0xFFC00000U) == 0x03000000U && ++ (sethi1 & 0xFFC00000U) == 0x03000000U && ++ (sethi2 & 0xFFC00000U) == 0x0B000000U && ++ sllx == 0x83287020U && ++ (or & 0xFFFFE000U) == 0x8A116000U && ++ jmpl == 0x81C04005U && ++ nop == 0x01000000U) ++ { ++ unsigned long addr; ++ ++ regs->u_regs[UREG_G1] = (sethi1 & 0x003FFFFFU) << 10; ++ regs->u_regs[UREG_G1] <<= 32; ++ regs->u_regs[UREG_G5] = ((sethi2 & 0x003FFFFFU) << 10) | (or & 0x3FFU); ++ addr = regs->u_regs[UREG_G1] + regs->u_regs[UREG_G5]; ++ regs->tpc = addr; ++ regs->tnpc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: unpatched PLT emulation step 1 */ ++ unsigned int sethi, ba, nop; ++ ++ err = get_user(sethi, (unsigned int *)regs->tpc); ++ err |= get_user(ba, (unsigned int *)(regs->tpc+4)); ++ err |= get_user(nop, (unsigned int *)(regs->tpc+8)); ++ ++ if (err) ++ break; ++ ++ if ((sethi & 0xFFC00000U) == 0x03000000U && ++ ((ba & 0xFFC00000U) == 0x30800000U || (ba & 0xFFF80000U) == 0x30680000U) && ++ nop == 0x01000000U) ++ { ++ unsigned long addr; ++ unsigned int save, call; ++ unsigned int sethi1, sethi2, or1, or2, sllx, add, jmpl; ++ ++ if ((ba & 0xFFC00000U) == 0x30800000U) ++ addr = regs->tpc + 4 + ((((ba | 0xFFFFFFFFFFC00000UL) ^ 0x00200000UL) + 0x00200000UL) << 2); ++ else ++ addr = regs->tpc + 4 + ((((ba | 0xFFFFFFFFFFF80000UL) ^ 0x00040000UL) + 0x00040000UL) << 2); ++ ++ if (test_thread_flag(TIF_32BIT)) ++ addr &= 0xFFFFFFFFUL; ++ ++ err = get_user(save, (unsigned int *)addr); ++ err |= get_user(call, (unsigned int *)(addr+4)); ++ err |= get_user(nop, (unsigned int *)(addr+8)); ++ if (err) ++ break; ++ ++#ifdef CONFIG_PAX_DLRESOLVE ++ if (save == 0x9DE3BFA8U && ++ (call & 0xC0000000U) == 0x40000000U && ++ nop == 0x01000000U) ++ { ++ struct vm_area_struct *vma; ++ unsigned long call_dl_resolve; ++ ++ down_read(¤t->mm->mmap_sem); ++ call_dl_resolve = current->mm->call_dl_resolve; ++ up_read(¤t->mm->mmap_sem); ++ if (likely(call_dl_resolve)) ++ goto emulate; ++ ++ vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); ++ ++ down_write(¤t->mm->mmap_sem); ++ if (current->mm->call_dl_resolve) { ++ call_dl_resolve = current->mm->call_dl_resolve; ++ up_write(¤t->mm->mmap_sem); ++ if (vma) ++ kmem_cache_free(vm_area_cachep, vma); ++ goto emulate; ++ } ++ ++ call_dl_resolve = get_unmapped_area(NULL, 0UL, PAGE_SIZE, 0UL, MAP_PRIVATE); ++ if (!vma || (call_dl_resolve & ~PAGE_MASK)) { ++ up_write(¤t->mm->mmap_sem); ++ if (vma) ++ kmem_cache_free(vm_area_cachep, vma); ++ return 1; ++ } ++ ++ if (pax_insert_vma(vma, call_dl_resolve)) { ++ up_write(¤t->mm->mmap_sem); ++ kmem_cache_free(vm_area_cachep, vma); ++ return 1; ++ } ++ ++ current->mm->call_dl_resolve = call_dl_resolve; ++ up_write(¤t->mm->mmap_sem); ++ ++emulate: ++ regs->u_regs[UREG_G1] = (sethi & 0x003FFFFFU) << 10; ++ regs->tpc = call_dl_resolve; ++ regs->tnpc = addr+4; ++ return 3; ++ } ++#endif ++ ++ /* PaX: glibc 2.4+ generates sethi/jmpl instead of save/call */ ++ if ((save & 0xFFC00000U) == 0x05000000U && ++ (call & 0xFFFFE000U) == 0x85C0A000U && ++ nop == 0x01000000U) ++ { ++ regs->u_regs[UREG_G1] = (sethi & 0x003FFFFFU) << 10; ++ regs->u_regs[UREG_G2] = addr + 4; ++ addr = (save & 0x003FFFFFU) << 10; ++ addr += (((call | 0xFFFFFFFFFFFFE000UL) ^ 0x00001000UL) + 0x00001000UL); ++ ++ if (test_thread_flag(TIF_32BIT)) ++ addr &= 0xFFFFFFFFUL; ++ ++ regs->tpc = addr; ++ regs->tnpc = addr+4; ++ return 3; ++ } ++ ++ /* PaX: 64-bit PLT stub */ ++ err = get_user(sethi1, (unsigned int *)addr); ++ err |= get_user(sethi2, (unsigned int *)(addr+4)); ++ err |= get_user(or1, (unsigned int *)(addr+8)); ++ err |= get_user(or2, (unsigned int *)(addr+12)); ++ err |= get_user(sllx, (unsigned int *)(addr+16)); ++ err |= get_user(add, (unsigned int *)(addr+20)); ++ err |= get_user(jmpl, (unsigned int *)(addr+24)); ++ err |= get_user(nop, (unsigned int *)(addr+28)); ++ if (err) ++ break; ++ ++ if ((sethi1 & 0xFFC00000U) == 0x09000000U && ++ (sethi2 & 0xFFC00000U) == 0x0B000000U && ++ (or1 & 0xFFFFE000U) == 0x88112000U && ++ (or2 & 0xFFFFE000U) == 0x8A116000U && ++ sllx == 0x89293020U && ++ add == 0x8A010005U && ++ jmpl == 0x89C14000U && ++ nop == 0x01000000U) ++ { ++ regs->u_regs[UREG_G1] = (sethi & 0x003FFFFFU) << 10; ++ regs->u_regs[UREG_G4] = ((sethi1 & 0x003FFFFFU) << 10) | (or1 & 0x000003FFU); ++ regs->u_regs[UREG_G4] <<= 32; ++ regs->u_regs[UREG_G5] = ((sethi2 & 0x003FFFFFU) << 10) | (or2 & 0x000003FFU); ++ regs->u_regs[UREG_G5] += regs->u_regs[UREG_G4]; ++ regs->u_regs[UREG_G4] = addr + 24; ++ addr = regs->u_regs[UREG_G5]; ++ regs->tpc = addr; ++ regs->tnpc = addr+4; ++ return 3; ++ } ++ } ++ } while (0); ++ ++#ifdef CONFIG_PAX_DLRESOLVE ++ do { /* PaX: unpatched PLT emulation step 2 */ ++ unsigned int save, call, nop; ++ ++ err = get_user(save, (unsigned int *)(regs->tpc-4)); ++ err |= get_user(call, (unsigned int *)regs->tpc); ++ err |= get_user(nop, (unsigned int *)(regs->tpc+4)); ++ if (err) ++ break; ++ ++ if (save == 0x9DE3BFA8U && ++ (call & 0xC0000000U) == 0x40000000U && ++ nop == 0x01000000U) ++ { ++ unsigned long dl_resolve = regs->tpc + ((((call | 0xFFFFFFFFC0000000UL) ^ 0x20000000UL) + 0x20000000UL) << 2); ++ ++ if (test_thread_flag(TIF_32BIT)) ++ dl_resolve &= 0xFFFFFFFFUL; ++ ++ regs->u_regs[UREG_RETPC] = regs->tpc; ++ regs->tpc = dl_resolve; ++ regs->tnpc = dl_resolve+4; ++ return 3; ++ } ++ } while (0); ++#endif ++ ++ do { /* PaX: patched PLT emulation #7, must be AFTER the unpatched PLT emulation */ ++ unsigned int sethi, ba, nop; ++ ++ err = get_user(sethi, (unsigned int *)regs->tpc); ++ err |= get_user(ba, (unsigned int *)(regs->tpc+4)); ++ err |= get_user(nop, (unsigned int *)(regs->tpc+8)); ++ ++ if (err) ++ break; ++ ++ if ((sethi & 0xFFC00000U) == 0x03000000U && ++ (ba & 0xFFF00000U) == 0x30600000U && ++ nop == 0x01000000U) ++ { ++ unsigned long addr; ++ ++ addr = (sethi & 0x003FFFFFU) << 10; ++ regs->u_regs[UREG_G1] = addr; ++ addr = regs->tpc + ((((ba | 0xFFFFFFFFFFF80000UL) ^ 0x00040000UL) + 0x00040000UL) << 2); ++ ++ if (test_thread_flag(TIF_32BIT)) ++ addr &= 0xFFFFFFFFUL; ++ ++ regs->tpc = addr; ++ regs->tnpc = addr+4; ++ return 2; ++ } ++ } while (0); ++ ++#endif ++ ++ return 1; ++} ++ ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ unsigned long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 8; i++) { ++ unsigned int c; ++ if (get_user(c, (unsigned int *)pc+i)) ++ printk(KERN_CONT "???????? "); ++ else ++ printk(KERN_CONT "%08x ", c); ++ } ++ printk("\n"); ++} ++#endif ++ + asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) + { + enum ctx_state prev_state = exception_enter(); +@@ -353,6 +816,29 @@ retry: + if (!vma) + goto bad_area; + ++#ifdef CONFIG_PAX_PAGEEXEC ++ /* PaX: detect ITLB misses on non-exec pages */ ++ if ((mm->pax_flags & MF_PAX_PAGEEXEC) && vma->vm_start <= address && ++ !(vma->vm_flags & VM_EXEC) && (fault_code & FAULT_CODE_ITLB)) ++ { ++ if (address != regs->tpc) ++ goto good_area; ++ ++ up_read(&mm->mmap_sem); ++ switch (pax_handle_fetch_fault(regs)) { ++ ++#ifdef CONFIG_PAX_EMUPLT ++ case 2: ++ case 3: ++ return; ++#endif ++ ++ } ++ pax_report_fault(regs, (void *)regs->tpc, (void *)(regs->u_regs[UREG_FP] + STACK_BIAS)); ++ do_group_exit(SIGKILL); ++ } ++#endif ++ + /* Pure DTLB misses do not tell us whether the fault causing + * load/store/atomic was a write or not, it only says that there + * was no match. So in such a case we (carefully) read the +diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c +index d329537..2c3746a 100644 +--- a/arch/sparc/mm/hugetlbpage.c ++++ b/arch/sparc/mm/hugetlbpage.c +@@ -25,8 +25,10 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *filp, + unsigned long addr, + unsigned long len, + unsigned long pgoff, +- unsigned long flags) ++ unsigned long flags, ++ unsigned long offset) + { ++ struct mm_struct *mm = current->mm; + unsigned long task_size = TASK_SIZE; + struct vm_unmapped_area_info info; + +@@ -35,15 +37,22 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *filp, + + info.flags = 0; + info.length = len; +- info.low_limit = TASK_UNMAPPED_BASE; ++ info.low_limit = mm->mmap_base; + info.high_limit = min(task_size, VA_EXCLUDE_START); + info.align_mask = PAGE_MASK & ~HPAGE_MASK; + info.align_offset = 0; ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + + if ((addr & ~PAGE_MASK) && task_size > VA_EXCLUDE_END) { + VM_BUG_ON(addr != -ENOMEM); + info.low_limit = VA_EXCLUDE_END; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ info.low_limit += mm->delta_mmap; ++#endif ++ + info.high_limit = task_size; + addr = vm_unmapped_area(&info); + } +@@ -55,7 +64,8 @@ static unsigned long + hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + const unsigned long len, + const unsigned long pgoff, +- const unsigned long flags) ++ const unsigned long flags, ++ const unsigned long offset) + { + struct mm_struct *mm = current->mm; + unsigned long addr = addr0; +@@ -70,6 +80,7 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + info.high_limit = mm->mmap_base; + info.align_mask = PAGE_MASK & ~HPAGE_MASK; + info.align_offset = 0; ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + + /* +@@ -82,6 +93,12 @@ hugetlb_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + VM_BUG_ON(addr != -ENOMEM); + info.flags = 0; + info.low_limit = TASK_UNMAPPED_BASE; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ info.low_limit += mm->delta_mmap; ++#endif ++ + info.high_limit = STACK_TOP32; + addr = vm_unmapped_area(&info); + } +@@ -96,6 +113,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + unsigned long task_size = TASK_SIZE; ++ unsigned long offset = gr_rand_threadstack_offset(mm, file, flags); + + if (test_thread_flag(TIF_32BIT)) + task_size = STACK_TOP32; +@@ -111,19 +129,22 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, + return addr; + } + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + addr = ALIGN(addr, HPAGE_SIZE); + vma = find_vma(mm, addr); +- if (task_size - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (task_size - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + if (mm->get_unmapped_area == arch_get_unmapped_area) + return hugetlb_get_unmapped_area_bottomup(file, addr, len, +- pgoff, flags); ++ pgoff, flags, offset); + else + return hugetlb_get_unmapped_area_topdown(file, addr, len, +- pgoff, flags); ++ pgoff, flags, offset); + } + + pte_t *huge_pte_alloc(struct mm_struct *mm, +diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c +index 2d91c62..17a8fff 100644 +--- a/arch/sparc/mm/init_64.c ++++ b/arch/sparc/mm/init_64.c +@@ -186,9 +186,9 @@ unsigned long sparc64_kern_sec_context __read_mostly; + int num_kernel_image_mappings; + + #ifdef CONFIG_DEBUG_DCFLUSH +-atomic_t dcpage_flushes = ATOMIC_INIT(0); ++atomic_unchecked_t dcpage_flushes = ATOMIC_INIT(0); + #ifdef CONFIG_SMP +-atomic_t dcpage_flushes_xcall = ATOMIC_INIT(0); ++atomic_unchecked_t dcpage_flushes_xcall = ATOMIC_INIT(0); + #endif + #endif + +@@ -196,7 +196,7 @@ inline void flush_dcache_page_impl(struct page *page) + { + BUG_ON(tlb_type == hypervisor); + #ifdef CONFIG_DEBUG_DCFLUSH +- atomic_inc(&dcpage_flushes); ++ atomic_inc_unchecked(&dcpage_flushes); + #endif + + #ifdef DCACHE_ALIASING_POSSIBLE +@@ -468,10 +468,10 @@ void mmu_info(struct seq_file *m) + + #ifdef CONFIG_DEBUG_DCFLUSH + seq_printf(m, "DCPageFlushes\t: %d\n", +- atomic_read(&dcpage_flushes)); ++ atomic_read_unchecked(&dcpage_flushes)); + #ifdef CONFIG_SMP + seq_printf(m, "DCPageFlushesXC\t: %d\n", +- atomic_read(&dcpage_flushes_xcall)); ++ atomic_read_unchecked(&dcpage_flushes_xcall)); + #endif /* CONFIG_SMP */ + #endif /* CONFIG_DEBUG_DCFLUSH */ + } +diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig +index 7cca418..53fc030 100644 +--- a/arch/tile/Kconfig ++++ b/arch/tile/Kconfig +@@ -192,6 +192,7 @@ source "kernel/Kconfig.hz" + + config KEXEC + bool "kexec system call" ++ depends on !GRKERNSEC_KMEM + ---help--- + kexec is a system call that implements the ability to shutdown your + current kernel, and to start another kernel. It is like a reboot +diff --git a/arch/tile/include/asm/atomic_64.h b/arch/tile/include/asm/atomic_64.h +index 7b11c5f..755a026 100644 +--- a/arch/tile/include/asm/atomic_64.h ++++ b/arch/tile/include/asm/atomic_64.h +@@ -105,6 +105,16 @@ static inline long atomic64_add_unless(atomic64_t *v, long a, long u) + + #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) + ++#define atomic64_read_unchecked(v) atomic64_read(v) ++#define atomic64_set_unchecked(v, i) atomic64_set((v), (i)) ++#define atomic64_add_unchecked(a, v) atomic64_add((a), (v)) ++#define atomic64_add_return_unchecked(a, v) atomic64_add_return((a), (v)) ++#define atomic64_sub_unchecked(a, v) atomic64_sub((a), (v)) ++#define atomic64_inc_unchecked(v) atomic64_inc(v) ++#define atomic64_inc_return_unchecked(v) atomic64_inc_return(v) ++#define atomic64_dec_unchecked(v) atomic64_dec(v) ++#define atomic64_cmpxchg_unchecked(v, o, n) atomic64_cmpxchg((v), (o), (n)) ++ + /* Define this to indicate that cmpxchg is an efficient operation. */ + #define __HAVE_ARCH_CMPXCHG + +diff --git a/arch/tile/include/asm/cache.h b/arch/tile/include/asm/cache.h +index 6160761..00cac88 100644 +--- a/arch/tile/include/asm/cache.h ++++ b/arch/tile/include/asm/cache.h +@@ -15,11 +15,12 @@ + #ifndef _ASM_TILE_CACHE_H + #define _ASM_TILE_CACHE_H + ++#include <linux/const.h> + #include <arch/chip.h> + + /* bytes per L1 data cache line */ + #define L1_CACHE_SHIFT CHIP_L1D_LOG_LINE_SIZE() +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + /* bytes per L2 cache line */ + #define L2_CACHE_SHIFT CHIP_L2_LOG_LINE_SIZE() +diff --git a/arch/tile/include/asm/uaccess.h b/arch/tile/include/asm/uaccess.h +index b6cde32..c0cb736 100644 +--- a/arch/tile/include/asm/uaccess.h ++++ b/arch/tile/include/asm/uaccess.h +@@ -414,9 +414,9 @@ static inline unsigned long __must_check copy_from_user(void *to, + const void __user *from, + unsigned long n) + { +- int sz = __compiletime_object_size(to); ++ size_t sz = __compiletime_object_size(to); + +- if (likely(sz == -1 || sz >= n)) ++ if (likely(sz == (size_t)-1 || sz >= n)) + n = _copy_from_user(to, from, n); + else + copy_from_user_overflow(); +diff --git a/arch/tile/mm/hugetlbpage.c b/arch/tile/mm/hugetlbpage.c +index e514899..f8743c4 100644 +--- a/arch/tile/mm/hugetlbpage.c ++++ b/arch/tile/mm/hugetlbpage.c +@@ -207,6 +207,7 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, + info.high_limit = TASK_SIZE; + info.align_mask = PAGE_MASK & ~huge_page_mask(h); + info.align_offset = 0; ++ info.threadstack_offset = 0; + return vm_unmapped_area(&info); + } + +@@ -224,6 +225,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, + info.high_limit = current->mm->mmap_base; + info.align_mask = PAGE_MASK & ~huge_page_mask(h); + info.align_offset = 0; ++ info.threadstack_offset = 0; + addr = vm_unmapped_area(&info); + + /* +diff --git a/arch/um/Makefile b/arch/um/Makefile +index e4b1a96..16162f8 100644 +--- a/arch/um/Makefile ++++ b/arch/um/Makefile +@@ -72,6 +72,10 @@ USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -D__KERNEL__,,\ + $(patsubst -I%,,$(KBUILD_CFLAGS)))) $(ARCH_INCLUDE) $(MODE_INCLUDE) \ + $(filter -I%,$(CFLAGS)) -D_FILE_OFFSET_BITS=64 -idirafter include + ++ifdef CONSTIFY_PLUGIN ++USER_CFLAGS += -fplugin-arg-constify_plugin-no-constify ++endif ++ + #This will adjust *FLAGS accordingly to the platform. + include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS) + +diff --git a/arch/um/include/asm/cache.h b/arch/um/include/asm/cache.h +index 19e1bdd..3665b77 100644 +--- a/arch/um/include/asm/cache.h ++++ b/arch/um/include/asm/cache.h +@@ -1,6 +1,7 @@ + #ifndef __UM_CACHE_H + #define __UM_CACHE_H + ++#include <linux/const.h> + + #if defined(CONFIG_UML_X86) && !defined(CONFIG_64BIT) + # define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) +@@ -12,6 +13,6 @@ + # define L1_CACHE_SHIFT 5 + #endif + +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #endif +diff --git a/arch/um/include/asm/kmap_types.h b/arch/um/include/asm/kmap_types.h +index 2e0a6b1..a64d0f5 100644 +--- a/arch/um/include/asm/kmap_types.h ++++ b/arch/um/include/asm/kmap_types.h +@@ -8,6 +8,6 @@ + + /* No more #include "asm/arch/kmap_types.h" ! */ + +-#define KM_TYPE_NR 14 ++#define KM_TYPE_NR 15 + + #endif +diff --git a/arch/um/include/asm/page.h b/arch/um/include/asm/page.h +index 71c5d13..4c7b9f1 100644 +--- a/arch/um/include/asm/page.h ++++ b/arch/um/include/asm/page.h +@@ -14,6 +14,9 @@ + #define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) + #define PAGE_MASK (~(PAGE_SIZE-1)) + ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) ++ + #ifndef __ASSEMBLY__ + + struct page; +diff --git a/arch/um/include/asm/pgtable-3level.h b/arch/um/include/asm/pgtable-3level.h +index 0032f92..cd151e0 100644 +--- a/arch/um/include/asm/pgtable-3level.h ++++ b/arch/um/include/asm/pgtable-3level.h +@@ -58,6 +58,7 @@ + #define pud_present(x) (pud_val(x) & _PAGE_PRESENT) + #define pud_populate(mm, pud, pmd) \ + set_pud(pud, __pud(_PAGE_TABLE + __pa(pmd))) ++#define pud_populate_kernel(mm, pud, pmd) pud_populate((mm), (pud), (pmd)) + + #ifdef CONFIG_64BIT + #define set_pud(pudptr, pudval) set_64bit((u64 *) (pudptr), pud_val(pudval)) +diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c +index f17bca8..48adb87 100644 +--- a/arch/um/kernel/process.c ++++ b/arch/um/kernel/process.c +@@ -356,22 +356,6 @@ int singlestepping(void * t) + return 2; + } + +-/* +- * Only x86 and x86_64 have an arch_align_stack(). +- * All other arches have "#define arch_align_stack(x) (x)" +- * in their asm/exec.h +- * As this is included in UML from asm-um/system-generic.h, +- * we can use it to behave as the subarch does. +- */ +-#ifndef arch_align_stack +-unsigned long arch_align_stack(unsigned long sp) +-{ +- if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space) +- sp -= get_random_int() % 8192; +- return sp & ~0xf; +-} +-#endif +- + unsigned long get_wchan(struct task_struct *p) + { + unsigned long stack_page, sp, ip; +diff --git a/arch/unicore32/include/asm/cache.h b/arch/unicore32/include/asm/cache.h +index ad8f795..2c7eec6 100644 +--- a/arch/unicore32/include/asm/cache.h ++++ b/arch/unicore32/include/asm/cache.h +@@ -12,8 +12,10 @@ + #ifndef __UNICORE_CACHE_H__ + #define __UNICORE_CACHE_H__ + +-#define L1_CACHE_SHIFT (5) +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#include <linux/const.h> ++ ++#define L1_CACHE_SHIFT 5 ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + /* + * Memory returned by kmalloc() may be used for DMA, so we must make +diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig +index 3635fff..c1f9fab 100644 +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -129,7 +129,7 @@ config X86 + select RTC_LIB + select HAVE_DEBUG_STACKOVERFLOW + select HAVE_IRQ_EXIT_ON_IRQ_STACK if X86_64 +- select HAVE_CC_STACKPROTECTOR ++ select HAVE_CC_STACKPROTECTOR if X86_64 || !PAX_MEMORY_UDEREF + select GENERIC_CPU_AUTOPROBE + select HAVE_ARCH_AUDITSYSCALL + select ARCH_SUPPORTS_ATOMIC_RMW +@@ -262,7 +262,7 @@ config X86_HT + + config X86_32_LAZY_GS + def_bool y +- depends on X86_32 && !CC_STACKPROTECTOR ++ depends on X86_32 && !CC_STACKPROTECTOR && !PAX_MEMORY_UDEREF + + config ARCH_HWEIGHT_CFLAGS + string +@@ -600,6 +600,7 @@ config SCHED_OMIT_FRAME_POINTER + + menuconfig HYPERVISOR_GUEST + bool "Linux guest support" ++ depends on !GRKERNSEC_CONFIG_AUTO || GRKERNSEC_CONFIG_VIRT_GUEST || (GRKERNSEC_CONFIG_VIRT_HOST && GRKERNSEC_CONFIG_VIRT_XEN) + ---help--- + Say Y here to enable options for running Linux under various hyper- + visors. This option enables basic hypervisor detection and platform +@@ -977,6 +978,7 @@ config VM86 + + config X86_16BIT + bool "Enable support for 16-bit segments" if EXPERT ++ depends on !GRKERNSEC + default y + ---help--- + This option is required by programs like Wine to run 16-bit +@@ -1132,6 +1134,7 @@ choice + + config NOHIGHMEM + bool "off" ++ depends on !(PAX_PAGEEXEC && PAX_ENABLE_PAE) + ---help--- + Linux can use up to 64 Gigabytes of physical memory on x86 systems. + However, the address space of 32-bit x86 processors is only 4 +@@ -1168,6 +1171,7 @@ config NOHIGHMEM + + config HIGHMEM4G + bool "4GB" ++ depends on !(PAX_PAGEEXEC && PAX_ENABLE_PAE) + ---help--- + Select this if you have a 32-bit processor and between 1 and 4 + gigabytes of physical RAM. +@@ -1220,7 +1224,7 @@ config PAGE_OFFSET + hex + default 0xB0000000 if VMSPLIT_3G_OPT + default 0x80000000 if VMSPLIT_2G +- default 0x78000000 if VMSPLIT_2G_OPT ++ default 0x70000000 if VMSPLIT_2G_OPT + default 0x40000000 if VMSPLIT_1G + default 0xC0000000 + depends on X86_32 +@@ -1635,6 +1639,7 @@ source kernel/Kconfig.hz + + config KEXEC + bool "kexec system call" ++ depends on !GRKERNSEC_KMEM + ---help--- + kexec is a system call that implements the ability to shutdown your + current kernel, and to start another kernel. It is like a reboot +@@ -1820,7 +1825,9 @@ config X86_NEED_RELOCS + + config PHYSICAL_ALIGN + hex "Alignment value to which kernel should be aligned" +- default "0x200000" ++ default "0x1000000" ++ range 0x200000 0x1000000 if PAX_KERNEXEC && X86_PAE ++ range 0x400000 0x1000000 if PAX_KERNEXEC && !X86_PAE + range 0x2000 0x1000000 if X86_32 + range 0x200000 0x1000000 if X86_64 + ---help--- +@@ -1903,6 +1910,7 @@ config COMPAT_VDSO + def_bool n + prompt "Disable the 32-bit vDSO (needed for glibc 2.3.3)" + depends on X86_32 || IA32_EMULATION ++ depends on !PAX_PAGEEXEC && !PAX_SEGMEXEC && !PAX_KERNEXEC && !PAX_MEMORY_UDEREF + ---help--- + Certain buggy versions of glibc will crash if they are + presented with a 32-bit vDSO that is not mapped at the address +diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu +index 6983314..54ad7e8 100644 +--- a/arch/x86/Kconfig.cpu ++++ b/arch/x86/Kconfig.cpu +@@ -319,7 +319,7 @@ config X86_PPRO_FENCE + + config X86_F00F_BUG + def_bool y +- depends on M586MMX || M586TSC || M586 || M486 ++ depends on (M586MMX || M586TSC || M586 || M486) && !PAX_KERNEXEC + + config X86_INVD_BUG + def_bool y +@@ -327,7 +327,7 @@ config X86_INVD_BUG + + config X86_ALIGNMENT_16 + def_bool y +- depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1 ++ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK8 || MK7 || MK6 || MCORE2 || MPENTIUM4 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1 + + config X86_INTEL_USERCOPY + def_bool y +@@ -369,7 +369,7 @@ config X86_CMPXCHG64 + # generates cmov. + config X86_CMOV + def_bool y +- depends on (MK8 || MK7 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX) ++ depends on (MK8 || MK7 || MCORE2 || MPSC || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX) + + config X86_MINIMUM_CPU_FAMILY + int +diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug +index 61bd2ad..50b625d 100644 +--- a/arch/x86/Kconfig.debug ++++ b/arch/x86/Kconfig.debug +@@ -93,7 +93,7 @@ config EFI_PGT_DUMP + config DEBUG_RODATA + bool "Write protect kernel read-only data structures" + default y +- depends on DEBUG_KERNEL ++ depends on DEBUG_KERNEL && BROKEN + ---help--- + Mark the kernel read-only data as write-protected in the pagetables, + in order to catch accidental (and incorrect) writes to such const +@@ -111,7 +111,7 @@ config DEBUG_RODATA_TEST + + config DEBUG_SET_MODULE_RONX + bool "Set loadable kernel module data as NX and text as RO" +- depends on MODULES ++ depends on MODULES && BROKEN + ---help--- + This option helps catch unintended modifications to loadable + kernel module's text and read-only data. It also prevents execution +diff --git a/arch/x86/Makefile b/arch/x86/Makefile +index 920e616..ac3d4df 100644 +--- a/arch/x86/Makefile ++++ b/arch/x86/Makefile +@@ -65,9 +65,6 @@ ifeq ($(CONFIG_X86_32),y) + # CPU-specific tuning. Anything which can be shared with UML should go here. + include $(srctree)/arch/x86/Makefile_32.cpu + KBUILD_CFLAGS += $(cflags-y) +- +- # temporary until string.h is fixed +- KBUILD_CFLAGS += -ffreestanding + else + BITS := 64 + UTS_MACHINE := x86_64 +@@ -107,6 +104,9 @@ else + KBUILD_CFLAGS += $(call cc-option,-maccumulate-outgoing-args) + endif + ++# temporary until string.h is fixed ++KBUILD_CFLAGS += -ffreestanding ++ + # Make sure compiler does not have buggy stack-protector support. + ifdef CONFIG_CC_STACKPROTECTOR + cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh +@@ -180,6 +180,7 @@ archheaders: + $(Q)$(MAKE) $(build)=arch/x86/syscalls all + + archprepare: ++ $(if $(LDFLAGS_BUILD_ID),,$(error $(OLD_LD))) + ifeq ($(CONFIG_KEXEC_FILE),y) + $(Q)$(MAKE) $(build)=arch/x86/purgatory arch/x86/purgatory/kexec-purgatory.c + endif +@@ -263,3 +264,9 @@ define archhelp + echo ' FDARGS="..." arguments for the booted kernel' + echo ' FDINITRD=file initrd for the booted kernel' + endef ++ ++define OLD_LD ++ ++*** ${VERSION}.${PATCHLEVEL} PaX kernels no longer build correctly with old versions of binutils. ++*** Please upgrade your binutils to 2.18 or newer ++endef +diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile +index 3db07f3..9d81d0f 100644 +--- a/arch/x86/boot/Makefile ++++ b/arch/x86/boot/Makefile +@@ -56,6 +56,9 @@ clean-files += cpustr.h + # --------------------------------------------------------------------------- + + KBUILD_CFLAGS := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP ++ifdef CONSTIFY_PLUGIN ++KBUILD_CFLAGS += -fplugin-arg-constify_plugin-no-constify ++endif + KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ + GCOV_PROFILE := n + +diff --git a/arch/x86/boot/bitops.h b/arch/x86/boot/bitops.h +index 878e4b9..20537ab 100644 +--- a/arch/x86/boot/bitops.h ++++ b/arch/x86/boot/bitops.h +@@ -26,7 +26,7 @@ static inline int variable_test_bit(int nr, const void *addr) + u8 v; + const u32 *p = (const u32 *)addr; + +- asm("btl %2,%1; setc %0" : "=qm" (v) : "m" (*p), "Ir" (nr)); ++ asm volatile("btl %2,%1; setc %0" : "=qm" (v) : "m" (*p), "Ir" (nr)); + return v; + } + +@@ -37,7 +37,7 @@ static inline int variable_test_bit(int nr, const void *addr) + + static inline void set_bit(int nr, void *addr) + { +- asm("btsl %1,%0" : "+m" (*(u32 *)addr) : "Ir" (nr)); ++ asm volatile("btsl %1,%0" : "+m" (*(u32 *)addr) : "Ir" (nr)); + } + + #endif /* BOOT_BITOPS_H */ +diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h +index bd49ec6..94c7f58 100644 +--- a/arch/x86/boot/boot.h ++++ b/arch/x86/boot/boot.h +@@ -84,7 +84,7 @@ static inline void io_delay(void) + static inline u16 ds(void) + { + u16 seg; +- asm("movw %%ds,%0" : "=rm" (seg)); ++ asm volatile("movw %%ds,%0" : "=rm" (seg)); + return seg; + } + +diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile +index 30c0acf..48c3a77 100644 +--- a/arch/x86/boot/compressed/Makefile ++++ b/arch/x86/boot/compressed/Makefile +@@ -16,6 +16,9 @@ KBUILD_CFLAGS += $(cflags-y) + KBUILD_CFLAGS += -mno-mmx -mno-sse + KBUILD_CFLAGS += $(call cc-option,-ffreestanding) + KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector) ++ifdef CONSTIFY_PLUGIN ++KBUILD_CFLAGS += -fplugin-arg-constify_plugin-no-constify ++endif + + KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ + GCOV_PROFILE := n +diff --git a/arch/x86/boot/compressed/efi_stub_32.S b/arch/x86/boot/compressed/efi_stub_32.S +index a53440e..c3dbf1e 100644 +--- a/arch/x86/boot/compressed/efi_stub_32.S ++++ b/arch/x86/boot/compressed/efi_stub_32.S +@@ -46,16 +46,13 @@ ENTRY(efi_call_phys) + * parameter 2, ..., param n. To make things easy, we save the return + * address of efi_call_phys in a global variable. + */ +- popl %ecx +- movl %ecx, saved_return_addr(%edx) +- /* get the function pointer into ECX*/ +- popl %ecx +- movl %ecx, efi_rt_function_ptr(%edx) ++ popl saved_return_addr(%edx) ++ popl efi_rt_function_ptr(%edx) + + /* + * 3. Call the physical function. + */ +- call *%ecx ++ call *efi_rt_function_ptr(%edx) + + /* + * 4. Balance the stack. And because EAX contain the return value, +@@ -67,15 +64,12 @@ ENTRY(efi_call_phys) + 1: popl %edx + subl $1b, %edx + +- movl efi_rt_function_ptr(%edx), %ecx +- pushl %ecx ++ pushl efi_rt_function_ptr(%edx) + + /* + * 10. Push the saved return address onto the stack and return. + */ +- movl saved_return_addr(%edx), %ecx +- pushl %ecx +- ret ++ jmpl *saved_return_addr(%edx) + ENDPROC(efi_call_phys) + .previous + +diff --git a/arch/x86/boot/compressed/efi_thunk_64.S b/arch/x86/boot/compressed/efi_thunk_64.S +index 630384a..278e788 100644 +--- a/arch/x86/boot/compressed/efi_thunk_64.S ++++ b/arch/x86/boot/compressed/efi_thunk_64.S +@@ -189,8 +189,8 @@ efi_gdt64: + .long 0 /* Filled out by user */ + .word 0 + .quad 0x0000000000000000 /* NULL descriptor */ +- .quad 0x00af9a000000ffff /* __KERNEL_CS */ +- .quad 0x00cf92000000ffff /* __KERNEL_DS */ ++ .quad 0x00af9b000000ffff /* __KERNEL_CS */ ++ .quad 0x00cf93000000ffff /* __KERNEL_DS */ + .quad 0x0080890000000000 /* TS descriptor */ + .quad 0x0000000000000000 /* TS continued */ + efi_gdt64_end: +diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S +index 1d7fbbc..36ecd58 100644 +--- a/arch/x86/boot/compressed/head_32.S ++++ b/arch/x86/boot/compressed/head_32.S +@@ -140,10 +140,10 @@ preferred_addr: + addl %eax, %ebx + notl %eax + andl %eax, %ebx +- cmpl $LOAD_PHYSICAL_ADDR, %ebx ++ cmpl $____LOAD_PHYSICAL_ADDR, %ebx + jge 1f + #endif +- movl $LOAD_PHYSICAL_ADDR, %ebx ++ movl $____LOAD_PHYSICAL_ADDR, %ebx + 1: + + /* Target address to relocate to for decompression */ +diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S +index 6b1766c..ad465c9 100644 +--- a/arch/x86/boot/compressed/head_64.S ++++ b/arch/x86/boot/compressed/head_64.S +@@ -94,10 +94,10 @@ ENTRY(startup_32) + addl %eax, %ebx + notl %eax + andl %eax, %ebx +- cmpl $LOAD_PHYSICAL_ADDR, %ebx ++ cmpl $____LOAD_PHYSICAL_ADDR, %ebx + jge 1f + #endif +- movl $LOAD_PHYSICAL_ADDR, %ebx ++ movl $____LOAD_PHYSICAL_ADDR, %ebx + 1: + + /* Target address to relocate to for decompression */ +@@ -322,10 +322,10 @@ preferred_addr: + addq %rax, %rbp + notq %rax + andq %rax, %rbp +- cmpq $LOAD_PHYSICAL_ADDR, %rbp ++ cmpq $____LOAD_PHYSICAL_ADDR, %rbp + jge 1f + #endif +- movq $LOAD_PHYSICAL_ADDR, %rbp ++ movq $____LOAD_PHYSICAL_ADDR, %rbp + 1: + + /* Target address to relocate to for decompression */ +@@ -434,8 +434,8 @@ gdt: + .long gdt + .word 0 + .quad 0x0000000000000000 /* NULL descriptor */ +- .quad 0x00af9a000000ffff /* __KERNEL_CS */ +- .quad 0x00cf92000000ffff /* __KERNEL_DS */ ++ .quad 0x00af9b000000ffff /* __KERNEL_CS */ ++ .quad 0x00cf93000000ffff /* __KERNEL_DS */ + .quad 0x0080890000000000 /* TS descriptor */ + .quad 0x0000000000000000 /* TS continued */ + gdt_end: +diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c +index 0c33a7c..be226ed 100644 +--- a/arch/x86/boot/compressed/misc.c ++++ b/arch/x86/boot/compressed/misc.c +@@ -242,7 +242,7 @@ static void handle_relocations(void *output, unsigned long output_len) + * Calculate the delta between where vmlinux was linked to load + * and where it was actually loaded. + */ +- delta = min_addr - LOAD_PHYSICAL_ADDR; ++ delta = min_addr - ____LOAD_PHYSICAL_ADDR; + if (!delta) { + debug_putstr("No relocation needed... "); + return; +@@ -312,7 +312,7 @@ static void parse_elf(void *output) + Elf32_Ehdr ehdr; + Elf32_Phdr *phdrs, *phdr; + #endif +- void *dest; ++ void *dest, *prev; + int i; + + memcpy(&ehdr, output, sizeof(ehdr)); +@@ -339,13 +339,16 @@ static void parse_elf(void *output) + case PT_LOAD: + #ifdef CONFIG_RELOCATABLE + dest = output; +- dest += (phdr->p_paddr - LOAD_PHYSICAL_ADDR); ++ dest += (phdr->p_paddr - ____LOAD_PHYSICAL_ADDR); + #else + dest = (void *)(phdr->p_paddr); + #endif + memcpy(dest, + output + phdr->p_offset, + phdr->p_filesz); ++ if (i) ++ memset(prev, 0xff, dest - prev); ++ prev = dest + phdr->p_filesz; + break; + default: /* Ignore other PT_* */ break; + } +@@ -404,7 +407,7 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap, + error("Destination address too large"); + #endif + #ifndef CONFIG_RELOCATABLE +- if ((unsigned long)output != LOAD_PHYSICAL_ADDR) ++ if ((unsigned long)output != ____LOAD_PHYSICAL_ADDR) + error("Wrong destination address"); + #endif + +diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c +index 1fd7d57..0f7d096 100644 +--- a/arch/x86/boot/cpucheck.c ++++ b/arch/x86/boot/cpucheck.c +@@ -125,9 +125,9 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr) + u32 ecx = MSR_K7_HWCR; + u32 eax, edx; + +- asm("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx)); ++ asm volatile("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx)); + eax &= ~(1 << 15); +- asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); ++ asm volatile("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); + + get_cpuflags(); /* Make sure it really did something */ + err = check_cpuflags(); +@@ -140,9 +140,9 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr) + u32 ecx = MSR_VIA_FCR; + u32 eax, edx; + +- asm("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx)); ++ asm volatile("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx)); + eax |= (1<<1)|(1<<7); +- asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); ++ asm volatile("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); + + set_bit(X86_FEATURE_CX8, cpu.flags); + err = check_cpuflags(); +@@ -153,12 +153,12 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr) + u32 eax, edx; + u32 level = 1; + +- asm("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx)); +- asm("wrmsr" : : "a" (~0), "d" (edx), "c" (ecx)); +- asm("cpuid" ++ asm volatile("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx)); ++ asm volatile("wrmsr" : : "a" (~0), "d" (edx), "c" (ecx)); ++ asm volatile("cpuid" + : "+a" (level), "=d" (cpu.flags[0]) + : : "ecx", "ebx"); +- asm("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); ++ asm volatile("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx)); + + err = check_cpuflags(); + } else if (err == 0x01 && +diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S +index 16ef025..91e033b 100644 +--- a/arch/x86/boot/header.S ++++ b/arch/x86/boot/header.S +@@ -438,10 +438,14 @@ setup_data: .quad 0 # 64-bit physical pointer to + # single linked list of + # struct setup_data + +-pref_address: .quad LOAD_PHYSICAL_ADDR # preferred load addr ++pref_address: .quad ____LOAD_PHYSICAL_ADDR # preferred load addr + + #define ZO_INIT_SIZE (ZO__end - ZO_startup_32 + ZO_z_extract_offset) ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++#define VO_INIT_SIZE (VO__end - VO__text - __PAGE_OFFSET - ____LOAD_PHYSICAL_ADDR) ++#else + #define VO_INIT_SIZE (VO__end - VO__text) ++#endif + #if ZO_INIT_SIZE > VO_INIT_SIZE + #define INIT_SIZE ZO_INIT_SIZE + #else +diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c +index db75d07..8e6d0af 100644 +--- a/arch/x86/boot/memory.c ++++ b/arch/x86/boot/memory.c +@@ -19,7 +19,7 @@ + + static int detect_memory_e820(void) + { +- int count = 0; ++ unsigned int count = 0; + struct biosregs ireg, oreg; + struct e820entry *desc = boot_params.e820_map; + static struct e820entry buf; /* static so it is zeroed */ +diff --git a/arch/x86/boot/video-vesa.c b/arch/x86/boot/video-vesa.c +index ba3e100..6501b8f 100644 +--- a/arch/x86/boot/video-vesa.c ++++ b/arch/x86/boot/video-vesa.c +@@ -201,6 +201,7 @@ static void vesa_store_pm_info(void) + + boot_params.screen_info.vesapm_seg = oreg.es; + boot_params.screen_info.vesapm_off = oreg.di; ++ boot_params.screen_info.vesapm_size = oreg.cx; + } + + /* +diff --git a/arch/x86/boot/video.c b/arch/x86/boot/video.c +index 43eda28..5ab5fdb 100644 +--- a/arch/x86/boot/video.c ++++ b/arch/x86/boot/video.c +@@ -96,7 +96,7 @@ static void store_mode_params(void) + static unsigned int get_entry(void) + { + char entry_buf[4]; +- int i, len = 0; ++ unsigned int i, len = 0; + int key; + unsigned int v; + +diff --git a/arch/x86/crypto/aes-x86_64-asm_64.S b/arch/x86/crypto/aes-x86_64-asm_64.S +index 9105655..41779c1 100644 +--- a/arch/x86/crypto/aes-x86_64-asm_64.S ++++ b/arch/x86/crypto/aes-x86_64-asm_64.S +@@ -8,6 +8,8 @@ + * including this sentence is retained in full. + */ + ++#include <asm/alternative-asm.h> ++ + .extern crypto_ft_tab + .extern crypto_it_tab + .extern crypto_fl_tab +@@ -70,6 +72,8 @@ + je B192; \ + leaq 32(r9),r9; + ++#define ret pax_force_retaddr; ret ++ + #define epilogue(FUNC,r1,r2,r3,r4,r5,r6,r7,r8,r9) \ + movq r1,r2; \ + movq r3,r4; \ +diff --git a/arch/x86/crypto/aesni-intel_asm.S b/arch/x86/crypto/aesni-intel_asm.S +index 477e9d7..c92c7d8 100644 +--- a/arch/x86/crypto/aesni-intel_asm.S ++++ b/arch/x86/crypto/aesni-intel_asm.S +@@ -31,6 +31,7 @@ + + #include <linux/linkage.h> + #include <asm/inst.h> ++#include <asm/alternative-asm.h> + + #ifdef __x86_64__ + .data +@@ -205,7 +206,7 @@ enc: .octa 0x2 + * num_initial_blocks = b mod 4 + * encrypt the initial num_initial_blocks blocks and apply ghash on + * the ciphertext +-* %r10, %r11, %r12, %rax, %xmm5, %xmm6, %xmm7, %xmm8, %xmm9 registers ++* %r10, %r11, %r15, %rax, %xmm5, %xmm6, %xmm7, %xmm8, %xmm9 registers + * are clobbered + * arg1, %arg2, %arg3, %r14 are used as a pointer only, not modified + */ +@@ -214,8 +215,8 @@ enc: .octa 0x2 + .macro INITIAL_BLOCKS_DEC num_initial_blocks TMP1 TMP2 TMP3 TMP4 TMP5 XMM0 XMM1 \ + XMM2 XMM3 XMM4 XMMDst TMP6 TMP7 i i_seq operation + mov arg7, %r10 # %r10 = AAD +- mov arg8, %r12 # %r12 = aadLen +- mov %r12, %r11 ++ mov arg8, %r15 # %r15 = aadLen ++ mov %r15, %r11 + pxor %xmm\i, %xmm\i + _get_AAD_loop\num_initial_blocks\operation: + movd (%r10), \TMP1 +@@ -223,15 +224,15 @@ _get_AAD_loop\num_initial_blocks\operation: + psrldq $4, %xmm\i + pxor \TMP1, %xmm\i + add $4, %r10 +- sub $4, %r12 ++ sub $4, %r15 + jne _get_AAD_loop\num_initial_blocks\operation + cmp $16, %r11 + je _get_AAD_loop2_done\num_initial_blocks\operation +- mov $16, %r12 ++ mov $16, %r15 + _get_AAD_loop2\num_initial_blocks\operation: + psrldq $4, %xmm\i +- sub $4, %r12 +- cmp %r11, %r12 ++ sub $4, %r15 ++ cmp %r11, %r15 + jne _get_AAD_loop2\num_initial_blocks\operation + _get_AAD_loop2_done\num_initial_blocks\operation: + movdqa SHUF_MASK(%rip), %xmm14 +@@ -443,7 +444,7 @@ _initial_blocks_done\num_initial_blocks\operation: + * num_initial_blocks = b mod 4 + * encrypt the initial num_initial_blocks blocks and apply ghash on + * the ciphertext +-* %r10, %r11, %r12, %rax, %xmm5, %xmm6, %xmm7, %xmm8, %xmm9 registers ++* %r10, %r11, %r15, %rax, %xmm5, %xmm6, %xmm7, %xmm8, %xmm9 registers + * are clobbered + * arg1, %arg2, %arg3, %r14 are used as a pointer only, not modified + */ +@@ -452,8 +453,8 @@ _initial_blocks_done\num_initial_blocks\operation: + .macro INITIAL_BLOCKS_ENC num_initial_blocks TMP1 TMP2 TMP3 TMP4 TMP5 XMM0 XMM1 \ + XMM2 XMM3 XMM4 XMMDst TMP6 TMP7 i i_seq operation + mov arg7, %r10 # %r10 = AAD +- mov arg8, %r12 # %r12 = aadLen +- mov %r12, %r11 ++ mov arg8, %r15 # %r15 = aadLen ++ mov %r15, %r11 + pxor %xmm\i, %xmm\i + _get_AAD_loop\num_initial_blocks\operation: + movd (%r10), \TMP1 +@@ -461,15 +462,15 @@ _get_AAD_loop\num_initial_blocks\operation: + psrldq $4, %xmm\i + pxor \TMP1, %xmm\i + add $4, %r10 +- sub $4, %r12 ++ sub $4, %r15 + jne _get_AAD_loop\num_initial_blocks\operation + cmp $16, %r11 + je _get_AAD_loop2_done\num_initial_blocks\operation +- mov $16, %r12 ++ mov $16, %r15 + _get_AAD_loop2\num_initial_blocks\operation: + psrldq $4, %xmm\i +- sub $4, %r12 +- cmp %r11, %r12 ++ sub $4, %r15 ++ cmp %r11, %r15 + jne _get_AAD_loop2\num_initial_blocks\operation + _get_AAD_loop2_done\num_initial_blocks\operation: + movdqa SHUF_MASK(%rip), %xmm14 +@@ -1269,7 +1270,7 @@ TMP7 XMM1 XMM2 XMM3 XMM4 XMMDst + * + *****************************************************************************/ + ENTRY(aesni_gcm_dec) +- push %r12 ++ push %r15 + push %r13 + push %r14 + mov %rsp, %r14 +@@ -1279,8 +1280,8 @@ ENTRY(aesni_gcm_dec) + */ + sub $VARIABLE_OFFSET, %rsp + and $~63, %rsp # align rsp to 64 bytes +- mov %arg6, %r12 +- movdqu (%r12), %xmm13 # %xmm13 = HashKey ++ mov %arg6, %r15 ++ movdqu (%r15), %xmm13 # %xmm13 = HashKey + movdqa SHUF_MASK(%rip), %xmm2 + PSHUFB_XMM %xmm2, %xmm13 + +@@ -1308,10 +1309,10 @@ ENTRY(aesni_gcm_dec) + movdqa %xmm13, HashKey(%rsp) # store HashKey<<1 (mod poly) + mov %arg4, %r13 # save the number of bytes of plaintext/ciphertext + and $-16, %r13 # %r13 = %r13 - (%r13 mod 16) +- mov %r13, %r12 +- and $(3<<4), %r12 ++ mov %r13, %r15 ++ and $(3<<4), %r15 + jz _initial_num_blocks_is_0_decrypt +- cmp $(2<<4), %r12 ++ cmp $(2<<4), %r15 + jb _initial_num_blocks_is_1_decrypt + je _initial_num_blocks_is_2_decrypt + _initial_num_blocks_is_3_decrypt: +@@ -1361,16 +1362,16 @@ _zero_cipher_left_decrypt: + sub $16, %r11 + add %r13, %r11 + movdqu (%arg3,%r11,1), %xmm1 # receive the last <16 byte block +- lea SHIFT_MASK+16(%rip), %r12 +- sub %r13, %r12 ++ lea SHIFT_MASK+16(%rip), %r15 ++ sub %r13, %r15 + # adjust the shuffle mask pointer to be able to shift 16-%r13 bytes + # (%r13 is the number of bytes in plaintext mod 16) +- movdqu (%r12), %xmm2 # get the appropriate shuffle mask ++ movdqu (%r15), %xmm2 # get the appropriate shuffle mask + PSHUFB_XMM %xmm2, %xmm1 # right shift 16-%r13 butes + + movdqa %xmm1, %xmm2 + pxor %xmm1, %xmm0 # Ciphertext XOR E(K, Yn) +- movdqu ALL_F-SHIFT_MASK(%r12), %xmm1 ++ movdqu ALL_F-SHIFT_MASK(%r15), %xmm1 + # get the appropriate mask to mask out top 16-%r13 bytes of %xmm0 + pand %xmm1, %xmm0 # mask out top 16-%r13 bytes of %xmm0 + pand %xmm1, %xmm2 +@@ -1399,9 +1400,9 @@ _less_than_8_bytes_left_decrypt: + sub $1, %r13 + jne _less_than_8_bytes_left_decrypt + _multiple_of_16_bytes_decrypt: +- mov arg8, %r12 # %r13 = aadLen (number of bytes) +- shl $3, %r12 # convert into number of bits +- movd %r12d, %xmm15 # len(A) in %xmm15 ++ mov arg8, %r15 # %r13 = aadLen (number of bytes) ++ shl $3, %r15 # convert into number of bits ++ movd %r15d, %xmm15 # len(A) in %xmm15 + shl $3, %arg4 # len(C) in bits (*128) + MOVQ_R64_XMM %arg4, %xmm1 + pslldq $8, %xmm15 # %xmm15 = len(A)||0x0000000000000000 +@@ -1440,7 +1441,8 @@ _return_T_done_decrypt: + mov %r14, %rsp + pop %r14 + pop %r13 +- pop %r12 ++ pop %r15 ++ pax_force_retaddr + ret + ENDPROC(aesni_gcm_dec) + +@@ -1529,7 +1531,7 @@ ENDPROC(aesni_gcm_dec) + * poly = x^128 + x^127 + x^126 + x^121 + 1 + ***************************************************************************/ + ENTRY(aesni_gcm_enc) +- push %r12 ++ push %r15 + push %r13 + push %r14 + mov %rsp, %r14 +@@ -1539,8 +1541,8 @@ ENTRY(aesni_gcm_enc) + # + sub $VARIABLE_OFFSET, %rsp + and $~63, %rsp +- mov %arg6, %r12 +- movdqu (%r12), %xmm13 ++ mov %arg6, %r15 ++ movdqu (%r15), %xmm13 + movdqa SHUF_MASK(%rip), %xmm2 + PSHUFB_XMM %xmm2, %xmm13 + +@@ -1564,13 +1566,13 @@ ENTRY(aesni_gcm_enc) + movdqa %xmm13, HashKey(%rsp) + mov %arg4, %r13 # %xmm13 holds HashKey<<1 (mod poly) + and $-16, %r13 +- mov %r13, %r12 ++ mov %r13, %r15 + + # Encrypt first few blocks + +- and $(3<<4), %r12 ++ and $(3<<4), %r15 + jz _initial_num_blocks_is_0_encrypt +- cmp $(2<<4), %r12 ++ cmp $(2<<4), %r15 + jb _initial_num_blocks_is_1_encrypt + je _initial_num_blocks_is_2_encrypt + _initial_num_blocks_is_3_encrypt: +@@ -1623,14 +1625,14 @@ _zero_cipher_left_encrypt: + sub $16, %r11 + add %r13, %r11 + movdqu (%arg3,%r11,1), %xmm1 # receive the last <16 byte blocks +- lea SHIFT_MASK+16(%rip), %r12 +- sub %r13, %r12 ++ lea SHIFT_MASK+16(%rip), %r15 ++ sub %r13, %r15 + # adjust the shuffle mask pointer to be able to shift 16-r13 bytes + # (%r13 is the number of bytes in plaintext mod 16) +- movdqu (%r12), %xmm2 # get the appropriate shuffle mask ++ movdqu (%r15), %xmm2 # get the appropriate shuffle mask + PSHUFB_XMM %xmm2, %xmm1 # shift right 16-r13 byte + pxor %xmm1, %xmm0 # Plaintext XOR Encrypt(K, Yn) +- movdqu ALL_F-SHIFT_MASK(%r12), %xmm1 ++ movdqu ALL_F-SHIFT_MASK(%r15), %xmm1 + # get the appropriate mask to mask out top 16-r13 bytes of xmm0 + pand %xmm1, %xmm0 # mask out top 16-r13 bytes of xmm0 + movdqa SHUF_MASK(%rip), %xmm10 +@@ -1663,9 +1665,9 @@ _less_than_8_bytes_left_encrypt: + sub $1, %r13 + jne _less_than_8_bytes_left_encrypt + _multiple_of_16_bytes_encrypt: +- mov arg8, %r12 # %r12 = addLen (number of bytes) +- shl $3, %r12 +- movd %r12d, %xmm15 # len(A) in %xmm15 ++ mov arg8, %r15 # %r15 = addLen (number of bytes) ++ shl $3, %r15 ++ movd %r15d, %xmm15 # len(A) in %xmm15 + shl $3, %arg4 # len(C) in bits (*128) + MOVQ_R64_XMM %arg4, %xmm1 + pslldq $8, %xmm15 # %xmm15 = len(A)||0x0000000000000000 +@@ -1704,7 +1706,8 @@ _return_T_done_encrypt: + mov %r14, %rsp + pop %r14 + pop %r13 +- pop %r12 ++ pop %r15 ++ pax_force_retaddr + ret + ENDPROC(aesni_gcm_enc) + +@@ -1722,6 +1725,7 @@ _key_expansion_256a: + pxor %xmm1, %xmm0 + movaps %xmm0, (TKEYP) + add $0x10, TKEYP ++ pax_force_retaddr + ret + ENDPROC(_key_expansion_128) + ENDPROC(_key_expansion_256a) +@@ -1748,6 +1752,7 @@ _key_expansion_192a: + shufps $0b01001110, %xmm2, %xmm1 + movaps %xmm1, 0x10(TKEYP) + add $0x20, TKEYP ++ pax_force_retaddr + ret + ENDPROC(_key_expansion_192a) + +@@ -1768,6 +1773,7 @@ _key_expansion_192b: + + movaps %xmm0, (TKEYP) + add $0x10, TKEYP ++ pax_force_retaddr + ret + ENDPROC(_key_expansion_192b) + +@@ -1781,6 +1787,7 @@ _key_expansion_256b: + pxor %xmm1, %xmm2 + movaps %xmm2, (TKEYP) + add $0x10, TKEYP ++ pax_force_retaddr + ret + ENDPROC(_key_expansion_256b) + +@@ -1894,6 +1901,7 @@ ENTRY(aesni_set_key) + #ifndef __x86_64__ + popl KEYP + #endif ++ pax_force_retaddr + ret + ENDPROC(aesni_set_key) + +@@ -1916,6 +1924,7 @@ ENTRY(aesni_enc) + popl KLEN + popl KEYP + #endif ++ pax_force_retaddr + ret + ENDPROC(aesni_enc) + +@@ -1974,6 +1983,7 @@ _aesni_enc1: + AESENC KEY STATE + movaps 0x70(TKEYP), KEY + AESENCLAST KEY STATE ++ pax_force_retaddr + ret + ENDPROC(_aesni_enc1) + +@@ -2083,6 +2093,7 @@ _aesni_enc4: + AESENCLAST KEY STATE2 + AESENCLAST KEY STATE3 + AESENCLAST KEY STATE4 ++ pax_force_retaddr + ret + ENDPROC(_aesni_enc4) + +@@ -2106,6 +2117,7 @@ ENTRY(aesni_dec) + popl KLEN + popl KEYP + #endif ++ pax_force_retaddr + ret + ENDPROC(aesni_dec) + +@@ -2164,6 +2176,7 @@ _aesni_dec1: + AESDEC KEY STATE + movaps 0x70(TKEYP), KEY + AESDECLAST KEY STATE ++ pax_force_retaddr + ret + ENDPROC(_aesni_dec1) + +@@ -2273,6 +2286,7 @@ _aesni_dec4: + AESDECLAST KEY STATE2 + AESDECLAST KEY STATE3 + AESDECLAST KEY STATE4 ++ pax_force_retaddr + ret + ENDPROC(_aesni_dec4) + +@@ -2331,6 +2345,7 @@ ENTRY(aesni_ecb_enc) + popl KEYP + popl LEN + #endif ++ pax_force_retaddr + ret + ENDPROC(aesni_ecb_enc) + +@@ -2390,6 +2405,7 @@ ENTRY(aesni_ecb_dec) + popl KEYP + popl LEN + #endif ++ pax_force_retaddr + ret + ENDPROC(aesni_ecb_dec) + +@@ -2432,6 +2448,7 @@ ENTRY(aesni_cbc_enc) + popl LEN + popl IVP + #endif ++ pax_force_retaddr + ret + ENDPROC(aesni_cbc_enc) + +@@ -2523,6 +2540,7 @@ ENTRY(aesni_cbc_dec) + popl LEN + popl IVP + #endif ++ pax_force_retaddr + ret + ENDPROC(aesni_cbc_dec) + +@@ -2550,6 +2568,7 @@ _aesni_inc_init: + mov $1, TCTR_LOW + MOVQ_R64_XMM TCTR_LOW INC + MOVQ_R64_XMM CTR TCTR_LOW ++ pax_force_retaddr + ret + ENDPROC(_aesni_inc_init) + +@@ -2579,6 +2598,7 @@ _aesni_inc: + .Linc_low: + movaps CTR, IV + PSHUFB_XMM BSWAP_MASK IV ++ pax_force_retaddr + ret + ENDPROC(_aesni_inc) + +@@ -2640,6 +2660,7 @@ ENTRY(aesni_ctr_enc) + .Lctr_enc_ret: + movups IV, (IVP) + .Lctr_enc_just_ret: ++ pax_force_retaddr + ret + ENDPROC(aesni_ctr_enc) + +@@ -2766,6 +2787,7 @@ ENTRY(aesni_xts_crypt8) + pxor INC, STATE4 + movdqu STATE4, 0x70(OUTP) + ++ pax_force_retaddr + ret + ENDPROC(aesni_xts_crypt8) + +diff --git a/arch/x86/crypto/blowfish-x86_64-asm_64.S b/arch/x86/crypto/blowfish-x86_64-asm_64.S +index 246c670..466e2d6 100644 +--- a/arch/x86/crypto/blowfish-x86_64-asm_64.S ++++ b/arch/x86/crypto/blowfish-x86_64-asm_64.S +@@ -21,6 +21,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + .file "blowfish-x86_64-asm.S" + .text +@@ -149,9 +150,11 @@ ENTRY(__blowfish_enc_blk) + jnz .L__enc_xor; + + write_block(); ++ pax_force_retaddr + ret; + .L__enc_xor: + xor_block(); ++ pax_force_retaddr + ret; + ENDPROC(__blowfish_enc_blk) + +@@ -183,6 +186,7 @@ ENTRY(blowfish_dec_blk) + + movq %r11, %rbp; + ++ pax_force_retaddr + ret; + ENDPROC(blowfish_dec_blk) + +@@ -334,6 +338,7 @@ ENTRY(__blowfish_enc_blk_4way) + + popq %rbx; + popq %rbp; ++ pax_force_retaddr + ret; + + .L__enc_xor4: +@@ -341,6 +346,7 @@ ENTRY(__blowfish_enc_blk_4way) + + popq %rbx; + popq %rbp; ++ pax_force_retaddr + ret; + ENDPROC(__blowfish_enc_blk_4way) + +@@ -375,5 +381,6 @@ ENTRY(blowfish_dec_blk_4way) + popq %rbx; + popq %rbp; + ++ pax_force_retaddr + ret; + ENDPROC(blowfish_dec_blk_4way) +diff --git a/arch/x86/crypto/camellia-aesni-avx-asm_64.S b/arch/x86/crypto/camellia-aesni-avx-asm_64.S +index ce71f92..1dce7ec 100644 +--- a/arch/x86/crypto/camellia-aesni-avx-asm_64.S ++++ b/arch/x86/crypto/camellia-aesni-avx-asm_64.S +@@ -16,6 +16,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + #define CAMELLIA_TABLE_BYTE_LEN 272 + +@@ -191,6 +192,7 @@ roundsm16_x0_x1_x2_x3_x4_x5_x6_x7_y0_y1_y2_y3_y4_y5_y6_y7_cd: + roundsm16(%xmm0, %xmm1, %xmm2, %xmm3, %xmm4, %xmm5, %xmm6, %xmm7, + %xmm8, %xmm9, %xmm10, %xmm11, %xmm12, %xmm13, %xmm14, %xmm15, + %rcx, (%r9)); ++ pax_force_retaddr + ret; + ENDPROC(roundsm16_x0_x1_x2_x3_x4_x5_x6_x7_y0_y1_y2_y3_y4_y5_y6_y7_cd) + +@@ -199,6 +201,7 @@ roundsm16_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab: + roundsm16(%xmm4, %xmm5, %xmm6, %xmm7, %xmm0, %xmm1, %xmm2, %xmm3, + %xmm12, %xmm13, %xmm14, %xmm15, %xmm8, %xmm9, %xmm10, %xmm11, + %rax, (%r9)); ++ pax_force_retaddr + ret; + ENDPROC(roundsm16_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab) + +@@ -780,6 +783,7 @@ __camellia_enc_blk16: + %xmm8, %xmm9, %xmm10, %xmm11, %xmm12, %xmm13, %xmm14, + %xmm15, (key_table)(CTX, %r8, 8), (%rax), 1 * 16(%rax)); + ++ pax_force_retaddr + ret; + + .align 8 +@@ -865,6 +869,7 @@ __camellia_dec_blk16: + %xmm8, %xmm9, %xmm10, %xmm11, %xmm12, %xmm13, %xmm14, + %xmm15, (key_table)(CTX), (%rax), 1 * 16(%rax)); + ++ pax_force_retaddr + ret; + + .align 8 +@@ -904,6 +909,7 @@ ENTRY(camellia_ecb_enc_16way) + %xmm15, %xmm14, %xmm13, %xmm12, %xmm11, %xmm10, %xmm9, + %xmm8, %rsi); + ++ pax_force_retaddr + ret; + ENDPROC(camellia_ecb_enc_16way) + +@@ -932,6 +938,7 @@ ENTRY(camellia_ecb_dec_16way) + %xmm15, %xmm14, %xmm13, %xmm12, %xmm11, %xmm10, %xmm9, + %xmm8, %rsi); + ++ pax_force_retaddr + ret; + ENDPROC(camellia_ecb_dec_16way) + +@@ -981,6 +988,7 @@ ENTRY(camellia_cbc_dec_16way) + %xmm15, %xmm14, %xmm13, %xmm12, %xmm11, %xmm10, %xmm9, + %xmm8, %rsi); + ++ pax_force_retaddr + ret; + ENDPROC(camellia_cbc_dec_16way) + +@@ -1092,6 +1100,7 @@ ENTRY(camellia_ctr_16way) + %xmm15, %xmm14, %xmm13, %xmm12, %xmm11, %xmm10, %xmm9, + %xmm8, %rsi); + ++ pax_force_retaddr + ret; + ENDPROC(camellia_ctr_16way) + +@@ -1234,6 +1243,7 @@ camellia_xts_crypt_16way: + %xmm15, %xmm14, %xmm13, %xmm12, %xmm11, %xmm10, %xmm9, + %xmm8, %rsi); + ++ pax_force_retaddr + ret; + ENDPROC(camellia_xts_crypt_16way) + +diff --git a/arch/x86/crypto/camellia-aesni-avx2-asm_64.S b/arch/x86/crypto/camellia-aesni-avx2-asm_64.S +index 0e0b886..5a3123c 100644 +--- a/arch/x86/crypto/camellia-aesni-avx2-asm_64.S ++++ b/arch/x86/crypto/camellia-aesni-avx2-asm_64.S +@@ -11,6 +11,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + #define CAMELLIA_TABLE_BYTE_LEN 272 + +@@ -230,6 +231,7 @@ roundsm32_x0_x1_x2_x3_x4_x5_x6_x7_y0_y1_y2_y3_y4_y5_y6_y7_cd: + roundsm32(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7, + %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15, + %rcx, (%r9)); ++ pax_force_retaddr + ret; + ENDPROC(roundsm32_x0_x1_x2_x3_x4_x5_x6_x7_y0_y1_y2_y3_y4_y5_y6_y7_cd) + +@@ -238,6 +240,7 @@ roundsm32_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab: + roundsm32(%ymm4, %ymm5, %ymm6, %ymm7, %ymm0, %ymm1, %ymm2, %ymm3, + %ymm12, %ymm13, %ymm14, %ymm15, %ymm8, %ymm9, %ymm10, %ymm11, + %rax, (%r9)); ++ pax_force_retaddr + ret; + ENDPROC(roundsm32_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab) + +@@ -820,6 +823,7 @@ __camellia_enc_blk32: + %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, + %ymm15, (key_table)(CTX, %r8, 8), (%rax), 1 * 32(%rax)); + ++ pax_force_retaddr + ret; + + .align 8 +@@ -905,6 +909,7 @@ __camellia_dec_blk32: + %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, + %ymm15, (key_table)(CTX), (%rax), 1 * 32(%rax)); + ++ pax_force_retaddr + ret; + + .align 8 +@@ -948,6 +953,7 @@ ENTRY(camellia_ecb_enc_32way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(camellia_ecb_enc_32way) + +@@ -980,6 +986,7 @@ ENTRY(camellia_ecb_dec_32way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(camellia_ecb_dec_32way) + +@@ -1046,6 +1053,7 @@ ENTRY(camellia_cbc_dec_32way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(camellia_cbc_dec_32way) + +@@ -1184,6 +1192,7 @@ ENTRY(camellia_ctr_32way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(camellia_ctr_32way) + +@@ -1349,6 +1358,7 @@ camellia_xts_crypt_32way: + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(camellia_xts_crypt_32way) + +diff --git a/arch/x86/crypto/camellia-x86_64-asm_64.S b/arch/x86/crypto/camellia-x86_64-asm_64.S +index 310319c..db3d7b5 100644 +--- a/arch/x86/crypto/camellia-x86_64-asm_64.S ++++ b/arch/x86/crypto/camellia-x86_64-asm_64.S +@@ -21,6 +21,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + .file "camellia-x86_64-asm_64.S" + .text +@@ -228,12 +229,14 @@ ENTRY(__camellia_enc_blk) + enc_outunpack(mov, RT1); + + movq RRBP, %rbp; ++ pax_force_retaddr + ret; + + .L__enc_xor: + enc_outunpack(xor, RT1); + + movq RRBP, %rbp; ++ pax_force_retaddr + ret; + ENDPROC(__camellia_enc_blk) + +@@ -272,6 +275,7 @@ ENTRY(camellia_dec_blk) + dec_outunpack(); + + movq RRBP, %rbp; ++ pax_force_retaddr + ret; + ENDPROC(camellia_dec_blk) + +@@ -463,6 +467,7 @@ ENTRY(__camellia_enc_blk_2way) + + movq RRBP, %rbp; + popq %rbx; ++ pax_force_retaddr + ret; + + .L__enc2_xor: +@@ -470,6 +475,7 @@ ENTRY(__camellia_enc_blk_2way) + + movq RRBP, %rbp; + popq %rbx; ++ pax_force_retaddr + ret; + ENDPROC(__camellia_enc_blk_2way) + +@@ -510,5 +516,6 @@ ENTRY(camellia_dec_blk_2way) + + movq RRBP, %rbp; + movq RXOR, %rbx; ++ pax_force_retaddr + ret; + ENDPROC(camellia_dec_blk_2way) +diff --git a/arch/x86/crypto/cast5-avx-x86_64-asm_64.S b/arch/x86/crypto/cast5-avx-x86_64-asm_64.S +index c35fd5d..2d8c7db 100644 +--- a/arch/x86/crypto/cast5-avx-x86_64-asm_64.S ++++ b/arch/x86/crypto/cast5-avx-x86_64-asm_64.S +@@ -24,6 +24,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + .file "cast5-avx-x86_64-asm_64.S" + +@@ -281,6 +282,7 @@ __cast5_enc_blk16: + outunpack_blocks(RR3, RL3, RTMP, RX, RKM); + outunpack_blocks(RR4, RL4, RTMP, RX, RKM); + ++ pax_force_retaddr + ret; + ENDPROC(__cast5_enc_blk16) + +@@ -352,6 +354,7 @@ __cast5_dec_blk16: + outunpack_blocks(RR3, RL3, RTMP, RX, RKM); + outunpack_blocks(RR4, RL4, RTMP, RX, RKM); + ++ pax_force_retaddr + ret; + + .L__skip_dec: +@@ -388,6 +391,7 @@ ENTRY(cast5_ecb_enc_16way) + vmovdqu RR4, (6*4*4)(%r11); + vmovdqu RL4, (7*4*4)(%r11); + ++ pax_force_retaddr + ret; + ENDPROC(cast5_ecb_enc_16way) + +@@ -420,6 +424,7 @@ ENTRY(cast5_ecb_dec_16way) + vmovdqu RR4, (6*4*4)(%r11); + vmovdqu RL4, (7*4*4)(%r11); + ++ pax_force_retaddr + ret; + ENDPROC(cast5_ecb_dec_16way) + +@@ -430,10 +435,10 @@ ENTRY(cast5_cbc_dec_16way) + * %rdx: src + */ + +- pushq %r12; ++ pushq %r14; + + movq %rsi, %r11; +- movq %rdx, %r12; ++ movq %rdx, %r14; + + vmovdqu (0*16)(%rdx), RL1; + vmovdqu (1*16)(%rdx), RR1; +@@ -447,16 +452,16 @@ ENTRY(cast5_cbc_dec_16way) + call __cast5_dec_blk16; + + /* xor with src */ +- vmovq (%r12), RX; ++ vmovq (%r14), RX; + vpshufd $0x4f, RX, RX; + vpxor RX, RR1, RR1; +- vpxor 0*16+8(%r12), RL1, RL1; +- vpxor 1*16+8(%r12), RR2, RR2; +- vpxor 2*16+8(%r12), RL2, RL2; +- vpxor 3*16+8(%r12), RR3, RR3; +- vpxor 4*16+8(%r12), RL3, RL3; +- vpxor 5*16+8(%r12), RR4, RR4; +- vpxor 6*16+8(%r12), RL4, RL4; ++ vpxor 0*16+8(%r14), RL1, RL1; ++ vpxor 1*16+8(%r14), RR2, RR2; ++ vpxor 2*16+8(%r14), RL2, RL2; ++ vpxor 3*16+8(%r14), RR3, RR3; ++ vpxor 4*16+8(%r14), RL3, RL3; ++ vpxor 5*16+8(%r14), RR4, RR4; ++ vpxor 6*16+8(%r14), RL4, RL4; + + vmovdqu RR1, (0*16)(%r11); + vmovdqu RL1, (1*16)(%r11); +@@ -467,8 +472,9 @@ ENTRY(cast5_cbc_dec_16way) + vmovdqu RR4, (6*16)(%r11); + vmovdqu RL4, (7*16)(%r11); + +- popq %r12; ++ popq %r14; + ++ pax_force_retaddr + ret; + ENDPROC(cast5_cbc_dec_16way) + +@@ -480,10 +486,10 @@ ENTRY(cast5_ctr_16way) + * %rcx: iv (big endian, 64bit) + */ + +- pushq %r12; ++ pushq %r14; + + movq %rsi, %r11; +- movq %rdx, %r12; ++ movq %rdx, %r14; + + vpcmpeqd RTMP, RTMP, RTMP; + vpsrldq $8, RTMP, RTMP; /* low: -1, high: 0 */ +@@ -523,14 +529,14 @@ ENTRY(cast5_ctr_16way) + call __cast5_enc_blk16; + + /* dst = src ^ iv */ +- vpxor (0*16)(%r12), RR1, RR1; +- vpxor (1*16)(%r12), RL1, RL1; +- vpxor (2*16)(%r12), RR2, RR2; +- vpxor (3*16)(%r12), RL2, RL2; +- vpxor (4*16)(%r12), RR3, RR3; +- vpxor (5*16)(%r12), RL3, RL3; +- vpxor (6*16)(%r12), RR4, RR4; +- vpxor (7*16)(%r12), RL4, RL4; ++ vpxor (0*16)(%r14), RR1, RR1; ++ vpxor (1*16)(%r14), RL1, RL1; ++ vpxor (2*16)(%r14), RR2, RR2; ++ vpxor (3*16)(%r14), RL2, RL2; ++ vpxor (4*16)(%r14), RR3, RR3; ++ vpxor (5*16)(%r14), RL3, RL3; ++ vpxor (6*16)(%r14), RR4, RR4; ++ vpxor (7*16)(%r14), RL4, RL4; + vmovdqu RR1, (0*16)(%r11); + vmovdqu RL1, (1*16)(%r11); + vmovdqu RR2, (2*16)(%r11); +@@ -540,7 +546,8 @@ ENTRY(cast5_ctr_16way) + vmovdqu RR4, (6*16)(%r11); + vmovdqu RL4, (7*16)(%r11); + +- popq %r12; ++ popq %r14; + ++ pax_force_retaddr + ret; + ENDPROC(cast5_ctr_16way) +diff --git a/arch/x86/crypto/cast6-avx-x86_64-asm_64.S b/arch/x86/crypto/cast6-avx-x86_64-asm_64.S +index e3531f8..e123f35 100644 +--- a/arch/x86/crypto/cast6-avx-x86_64-asm_64.S ++++ b/arch/x86/crypto/cast6-avx-x86_64-asm_64.S +@@ -24,6 +24,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + #include "glue_helper-asm-avx.S" + + .file "cast6-avx-x86_64-asm_64.S" +@@ -295,6 +296,7 @@ __cast6_enc_blk8: + outunpack_blocks(RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM); + outunpack_blocks(RA2, RB2, RC2, RD2, RTMP, RX, RKRF, RKM); + ++ pax_force_retaddr + ret; + ENDPROC(__cast6_enc_blk8) + +@@ -340,6 +342,7 @@ __cast6_dec_blk8: + outunpack_blocks(RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM); + outunpack_blocks(RA2, RB2, RC2, RD2, RTMP, RX, RKRF, RKM); + ++ pax_force_retaddr + ret; + ENDPROC(__cast6_dec_blk8) + +@@ -358,6 +361,7 @@ ENTRY(cast6_ecb_enc_8way) + + store_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + ++ pax_force_retaddr + ret; + ENDPROC(cast6_ecb_enc_8way) + +@@ -376,6 +380,7 @@ ENTRY(cast6_ecb_dec_8way) + + store_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + ++ pax_force_retaddr + ret; + ENDPROC(cast6_ecb_dec_8way) + +@@ -386,19 +391,20 @@ ENTRY(cast6_cbc_dec_8way) + * %rdx: src + */ + +- pushq %r12; ++ pushq %r14; + + movq %rsi, %r11; +- movq %rdx, %r12; ++ movq %rdx, %r14; + + load_8way(%rdx, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + + call __cast6_dec_blk8; + +- store_cbc_8way(%r12, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); ++ store_cbc_8way(%r14, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + +- popq %r12; ++ popq %r14; + ++ pax_force_retaddr + ret; + ENDPROC(cast6_cbc_dec_8way) + +@@ -410,20 +416,21 @@ ENTRY(cast6_ctr_8way) + * %rcx: iv (little endian, 128bit) + */ + +- pushq %r12; ++ pushq %r14; + + movq %rsi, %r11; +- movq %rdx, %r12; ++ movq %rdx, %r14; + + load_ctr_8way(%rcx, .Lbswap128_mask, RA1, RB1, RC1, RD1, RA2, RB2, RC2, + RD2, RX, RKR, RKM); + + call __cast6_enc_blk8; + +- store_ctr_8way(%r12, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); ++ store_ctr_8way(%r14, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + +- popq %r12; ++ popq %r14; + ++ pax_force_retaddr + ret; + ENDPROC(cast6_ctr_8way) + +@@ -446,6 +453,7 @@ ENTRY(cast6_xts_enc_8way) + /* dst <= regs xor IVs(in dst) */ + store_xts_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + ++ pax_force_retaddr + ret; + ENDPROC(cast6_xts_enc_8way) + +@@ -468,5 +476,6 @@ ENTRY(cast6_xts_dec_8way) + /* dst <= regs xor IVs(in dst) */ + store_xts_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + ++ pax_force_retaddr + ret; + ENDPROC(cast6_xts_dec_8way) +diff --git a/arch/x86/crypto/crc32c-pcl-intel-asm_64.S b/arch/x86/crypto/crc32c-pcl-intel-asm_64.S +index 26d49eb..c0a8c84 100644 +--- a/arch/x86/crypto/crc32c-pcl-intel-asm_64.S ++++ b/arch/x86/crypto/crc32c-pcl-intel-asm_64.S +@@ -45,6 +45,7 @@ + + #include <asm/inst.h> + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + ## ISCSI CRC 32 Implementation with crc32 and pclmulqdq Instruction + +@@ -309,6 +310,7 @@ do_return: + popq %rsi + popq %rdi + popq %rbx ++ pax_force_retaddr + ret + + ################################################################ +diff --git a/arch/x86/crypto/ghash-clmulni-intel_asm.S b/arch/x86/crypto/ghash-clmulni-intel_asm.S +index 5d1e007..098cb4f 100644 +--- a/arch/x86/crypto/ghash-clmulni-intel_asm.S ++++ b/arch/x86/crypto/ghash-clmulni-intel_asm.S +@@ -18,6 +18,7 @@ + + #include <linux/linkage.h> + #include <asm/inst.h> ++#include <asm/alternative-asm.h> + + .data + +@@ -89,6 +90,7 @@ __clmul_gf128mul_ble: + psrlq $1, T2 + pxor T2, T1 + pxor T1, DATA ++ pax_force_retaddr + ret + ENDPROC(__clmul_gf128mul_ble) + +@@ -101,6 +103,7 @@ ENTRY(clmul_ghash_mul) + call __clmul_gf128mul_ble + PSHUFB_XMM BSWAP DATA + movups DATA, (%rdi) ++ pax_force_retaddr + ret + ENDPROC(clmul_ghash_mul) + +@@ -128,5 +131,6 @@ ENTRY(clmul_ghash_update) + PSHUFB_XMM BSWAP DATA + movups DATA, (%rdi) + .Lupdate_just_ret: ++ pax_force_retaddr + ret + ENDPROC(clmul_ghash_update) +diff --git a/arch/x86/crypto/salsa20-x86_64-asm_64.S b/arch/x86/crypto/salsa20-x86_64-asm_64.S +index 9279e0b..c4b3d2c 100644 +--- a/arch/x86/crypto/salsa20-x86_64-asm_64.S ++++ b/arch/x86/crypto/salsa20-x86_64-asm_64.S +@@ -1,4 +1,5 @@ + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + # enter salsa20_encrypt_bytes + ENTRY(salsa20_encrypt_bytes) +@@ -789,6 +790,7 @@ ENTRY(salsa20_encrypt_bytes) + add %r11,%rsp + mov %rdi,%rax + mov %rsi,%rdx ++ pax_force_retaddr + ret + # bytesatleast65: + ._bytesatleast65: +@@ -889,6 +891,7 @@ ENTRY(salsa20_keysetup) + add %r11,%rsp + mov %rdi,%rax + mov %rsi,%rdx ++ pax_force_retaddr + ret + ENDPROC(salsa20_keysetup) + +@@ -914,5 +917,6 @@ ENTRY(salsa20_ivsetup) + add %r11,%rsp + mov %rdi,%rax + mov %rsi,%rdx ++ pax_force_retaddr + ret + ENDPROC(salsa20_ivsetup) +diff --git a/arch/x86/crypto/serpent-avx-x86_64-asm_64.S b/arch/x86/crypto/serpent-avx-x86_64-asm_64.S +index 2f202f4..d9164d6 100644 +--- a/arch/x86/crypto/serpent-avx-x86_64-asm_64.S ++++ b/arch/x86/crypto/serpent-avx-x86_64-asm_64.S +@@ -24,6 +24,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + #include "glue_helper-asm-avx.S" + + .file "serpent-avx-x86_64-asm_64.S" +@@ -618,6 +619,7 @@ __serpent_enc_blk8_avx: + write_blocks(RA1, RB1, RC1, RD1, RK0, RK1, RK2); + write_blocks(RA2, RB2, RC2, RD2, RK0, RK1, RK2); + ++ pax_force_retaddr + ret; + ENDPROC(__serpent_enc_blk8_avx) + +@@ -672,6 +674,7 @@ __serpent_dec_blk8_avx: + write_blocks(RC1, RD1, RB1, RE1, RK0, RK1, RK2); + write_blocks(RC2, RD2, RB2, RE2, RK0, RK1, RK2); + ++ pax_force_retaddr + ret; + ENDPROC(__serpent_dec_blk8_avx) + +@@ -688,6 +691,7 @@ ENTRY(serpent_ecb_enc_8way_avx) + + store_8way(%rsi, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + ++ pax_force_retaddr + ret; + ENDPROC(serpent_ecb_enc_8way_avx) + +@@ -704,6 +708,7 @@ ENTRY(serpent_ecb_dec_8way_avx) + + store_8way(%rsi, RC1, RD1, RB1, RE1, RC2, RD2, RB2, RE2); + ++ pax_force_retaddr + ret; + ENDPROC(serpent_ecb_dec_8way_avx) + +@@ -720,6 +725,7 @@ ENTRY(serpent_cbc_dec_8way_avx) + + store_cbc_8way(%rdx, %rsi, RC1, RD1, RB1, RE1, RC2, RD2, RB2, RE2); + ++ pax_force_retaddr + ret; + ENDPROC(serpent_cbc_dec_8way_avx) + +@@ -738,6 +744,7 @@ ENTRY(serpent_ctr_8way_avx) + + store_ctr_8way(%rdx, %rsi, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + ++ pax_force_retaddr + ret; + ENDPROC(serpent_ctr_8way_avx) + +@@ -758,6 +765,7 @@ ENTRY(serpent_xts_enc_8way_avx) + /* dst <= regs xor IVs(in dst) */ + store_xts_8way(%rsi, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + ++ pax_force_retaddr + ret; + ENDPROC(serpent_xts_enc_8way_avx) + +@@ -778,5 +786,6 @@ ENTRY(serpent_xts_dec_8way_avx) + /* dst <= regs xor IVs(in dst) */ + store_xts_8way(%rsi, RC1, RD1, RB1, RE1, RC2, RD2, RB2, RE2); + ++ pax_force_retaddr + ret; + ENDPROC(serpent_xts_dec_8way_avx) +diff --git a/arch/x86/crypto/serpent-avx2-asm_64.S b/arch/x86/crypto/serpent-avx2-asm_64.S +index b222085..abd483c 100644 +--- a/arch/x86/crypto/serpent-avx2-asm_64.S ++++ b/arch/x86/crypto/serpent-avx2-asm_64.S +@@ -15,6 +15,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + #include "glue_helper-asm-avx2.S" + + .file "serpent-avx2-asm_64.S" +@@ -610,6 +611,7 @@ __serpent_enc_blk16: + write_blocks(RA1, RB1, RC1, RD1, RK0, RK1, RK2); + write_blocks(RA2, RB2, RC2, RD2, RK0, RK1, RK2); + ++ pax_force_retaddr + ret; + ENDPROC(__serpent_enc_blk16) + +@@ -664,6 +666,7 @@ __serpent_dec_blk16: + write_blocks(RC1, RD1, RB1, RE1, RK0, RK1, RK2); + write_blocks(RC2, RD2, RB2, RE2, RK0, RK1, RK2); + ++ pax_force_retaddr + ret; + ENDPROC(__serpent_dec_blk16) + +@@ -684,6 +687,7 @@ ENTRY(serpent_ecb_enc_16way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(serpent_ecb_enc_16way) + +@@ -704,6 +708,7 @@ ENTRY(serpent_ecb_dec_16way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(serpent_ecb_dec_16way) + +@@ -725,6 +730,7 @@ ENTRY(serpent_cbc_dec_16way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(serpent_cbc_dec_16way) + +@@ -748,6 +754,7 @@ ENTRY(serpent_ctr_16way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(serpent_ctr_16way) + +@@ -772,6 +779,7 @@ ENTRY(serpent_xts_enc_16way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(serpent_xts_enc_16way) + +@@ -796,5 +804,6 @@ ENTRY(serpent_xts_dec_16way) + + vzeroupper; + ++ pax_force_retaddr + ret; + ENDPROC(serpent_xts_dec_16way) +diff --git a/arch/x86/crypto/serpent-sse2-x86_64-asm_64.S b/arch/x86/crypto/serpent-sse2-x86_64-asm_64.S +index acc066c..1559cc4 100644 +--- a/arch/x86/crypto/serpent-sse2-x86_64-asm_64.S ++++ b/arch/x86/crypto/serpent-sse2-x86_64-asm_64.S +@@ -25,6 +25,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + .file "serpent-sse2-x86_64-asm_64.S" + .text +@@ -690,12 +691,14 @@ ENTRY(__serpent_enc_blk_8way) + write_blocks(%rsi, RA1, RB1, RC1, RD1, RK0, RK1, RK2); + write_blocks(%rax, RA2, RB2, RC2, RD2, RK0, RK1, RK2); + ++ pax_force_retaddr + ret; + + .L__enc_xor8: + xor_blocks(%rsi, RA1, RB1, RC1, RD1, RK0, RK1, RK2); + xor_blocks(%rax, RA2, RB2, RC2, RD2, RK0, RK1, RK2); + ++ pax_force_retaddr + ret; + ENDPROC(__serpent_enc_blk_8way) + +@@ -750,5 +753,6 @@ ENTRY(serpent_dec_blk_8way) + write_blocks(%rsi, RC1, RD1, RB1, RE1, RK0, RK1, RK2); + write_blocks(%rax, RC2, RD2, RB2, RE2, RK0, RK1, RK2); + ++ pax_force_retaddr + ret; + ENDPROC(serpent_dec_blk_8way) +diff --git a/arch/x86/crypto/sha1_ssse3_asm.S b/arch/x86/crypto/sha1_ssse3_asm.S +index a410950..9dfe7ad 100644 +--- a/arch/x86/crypto/sha1_ssse3_asm.S ++++ b/arch/x86/crypto/sha1_ssse3_asm.S +@@ -29,6 +29,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + #define CTX %rdi // arg1 + #define BUF %rsi // arg2 +@@ -75,9 +76,9 @@ + + push %rbx + push %rbp +- push %r12 ++ push %r14 + +- mov %rsp, %r12 ++ mov %rsp, %r14 + sub $64, %rsp # allocate workspace + and $~15, %rsp # align stack + +@@ -99,11 +100,12 @@ + xor %rax, %rax + rep stosq + +- mov %r12, %rsp # deallocate workspace ++ mov %r14, %rsp # deallocate workspace + +- pop %r12 ++ pop %r14 + pop %rbp + pop %rbx ++ pax_force_retaddr + ret + + ENDPROC(\name) +diff --git a/arch/x86/crypto/sha256-avx-asm.S b/arch/x86/crypto/sha256-avx-asm.S +index 642f156..51a513c 100644 +--- a/arch/x86/crypto/sha256-avx-asm.S ++++ b/arch/x86/crypto/sha256-avx-asm.S +@@ -49,6 +49,7 @@ + + #ifdef CONFIG_AS_AVX + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + ## assume buffers not aligned + #define VMOVDQ vmovdqu +@@ -460,6 +461,7 @@ done_hash: + popq %r13 + popq %rbp + popq %rbx ++ pax_force_retaddr + ret + ENDPROC(sha256_transform_avx) + +diff --git a/arch/x86/crypto/sha256-avx2-asm.S b/arch/x86/crypto/sha256-avx2-asm.S +index 9e86944..3795e6a 100644 +--- a/arch/x86/crypto/sha256-avx2-asm.S ++++ b/arch/x86/crypto/sha256-avx2-asm.S +@@ -50,6 +50,7 @@ + + #ifdef CONFIG_AS_AVX2 + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + ## assume buffers not aligned + #define VMOVDQ vmovdqu +@@ -720,6 +721,7 @@ done_hash: + popq %r12 + popq %rbp + popq %rbx ++ pax_force_retaddr + ret + ENDPROC(sha256_transform_rorx) + +diff --git a/arch/x86/crypto/sha256-ssse3-asm.S b/arch/x86/crypto/sha256-ssse3-asm.S +index f833b74..8c62a9e 100644 +--- a/arch/x86/crypto/sha256-ssse3-asm.S ++++ b/arch/x86/crypto/sha256-ssse3-asm.S +@@ -47,6 +47,7 @@ + ######################################################################## + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + ## assume buffers not aligned + #define MOVDQ movdqu +@@ -471,6 +472,7 @@ done_hash: + popq %rbp + popq %rbx + ++ pax_force_retaddr + ret + ENDPROC(sha256_transform_ssse3) + +diff --git a/arch/x86/crypto/sha512-avx-asm.S b/arch/x86/crypto/sha512-avx-asm.S +index 974dde9..a823ff9 100644 +--- a/arch/x86/crypto/sha512-avx-asm.S ++++ b/arch/x86/crypto/sha512-avx-asm.S +@@ -49,6 +49,7 @@ + + #ifdef CONFIG_AS_AVX + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + .text + +@@ -364,6 +365,7 @@ updateblock: + mov frame_RSPSAVE(%rsp), %rsp + + nowork: ++ pax_force_retaddr + ret + ENDPROC(sha512_transform_avx) + +diff --git a/arch/x86/crypto/sha512-avx2-asm.S b/arch/x86/crypto/sha512-avx2-asm.S +index 568b961..ed20c37 100644 +--- a/arch/x86/crypto/sha512-avx2-asm.S ++++ b/arch/x86/crypto/sha512-avx2-asm.S +@@ -51,6 +51,7 @@ + + #ifdef CONFIG_AS_AVX2 + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + .text + +@@ -678,6 +679,7 @@ done_hash: + + # Restore Stack Pointer + mov frame_RSPSAVE(%rsp), %rsp ++ pax_force_retaddr + ret + ENDPROC(sha512_transform_rorx) + +diff --git a/arch/x86/crypto/sha512-ssse3-asm.S b/arch/x86/crypto/sha512-ssse3-asm.S +index fb56855..6edd768 100644 +--- a/arch/x86/crypto/sha512-ssse3-asm.S ++++ b/arch/x86/crypto/sha512-ssse3-asm.S +@@ -48,6 +48,7 @@ + ######################################################################## + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + .text + +@@ -363,6 +364,7 @@ updateblock: + mov frame_RSPSAVE(%rsp), %rsp + + nowork: ++ pax_force_retaddr + ret + ENDPROC(sha512_transform_ssse3) + +diff --git a/arch/x86/crypto/twofish-avx-x86_64-asm_64.S b/arch/x86/crypto/twofish-avx-x86_64-asm_64.S +index 0505813..b067311 100644 +--- a/arch/x86/crypto/twofish-avx-x86_64-asm_64.S ++++ b/arch/x86/crypto/twofish-avx-x86_64-asm_64.S +@@ -24,6 +24,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + #include "glue_helper-asm-avx.S" + + .file "twofish-avx-x86_64-asm_64.S" +@@ -284,6 +285,7 @@ __twofish_enc_blk8: + outunpack_blocks(RC1, RD1, RA1, RB1, RK1, RX0, RY0, RK2); + outunpack_blocks(RC2, RD2, RA2, RB2, RK1, RX0, RY0, RK2); + ++ pax_force_retaddr + ret; + ENDPROC(__twofish_enc_blk8) + +@@ -324,6 +326,7 @@ __twofish_dec_blk8: + outunpack_blocks(RA1, RB1, RC1, RD1, RK1, RX0, RY0, RK2); + outunpack_blocks(RA2, RB2, RC2, RD2, RK1, RX0, RY0, RK2); + ++ pax_force_retaddr + ret; + ENDPROC(__twofish_dec_blk8) + +@@ -342,6 +345,7 @@ ENTRY(twofish_ecb_enc_8way) + + store_8way(%r11, RC1, RD1, RA1, RB1, RC2, RD2, RA2, RB2); + ++ pax_force_retaddr + ret; + ENDPROC(twofish_ecb_enc_8way) + +@@ -360,6 +364,7 @@ ENTRY(twofish_ecb_dec_8way) + + store_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + ++ pax_force_retaddr + ret; + ENDPROC(twofish_ecb_dec_8way) + +@@ -370,19 +375,20 @@ ENTRY(twofish_cbc_dec_8way) + * %rdx: src + */ + +- pushq %r12; ++ pushq %r14; + + movq %rsi, %r11; +- movq %rdx, %r12; ++ movq %rdx, %r14; + + load_8way(%rdx, RC1, RD1, RA1, RB1, RC2, RD2, RA2, RB2); + + call __twofish_dec_blk8; + +- store_cbc_8way(%r12, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); ++ store_cbc_8way(%r14, %r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + +- popq %r12; ++ popq %r14; + ++ pax_force_retaddr + ret; + ENDPROC(twofish_cbc_dec_8way) + +@@ -394,20 +400,21 @@ ENTRY(twofish_ctr_8way) + * %rcx: iv (little endian, 128bit) + */ + +- pushq %r12; ++ pushq %r14; + + movq %rsi, %r11; +- movq %rdx, %r12; ++ movq %rdx, %r14; + + load_ctr_8way(%rcx, .Lbswap128_mask, RA1, RB1, RC1, RD1, RA2, RB2, RC2, + RD2, RX0, RX1, RY0); + + call __twofish_enc_blk8; + +- store_ctr_8way(%r12, %r11, RC1, RD1, RA1, RB1, RC2, RD2, RA2, RB2); ++ store_ctr_8way(%r14, %r11, RC1, RD1, RA1, RB1, RC2, RD2, RA2, RB2); + +- popq %r12; ++ popq %r14; + ++ pax_force_retaddr + ret; + ENDPROC(twofish_ctr_8way) + +@@ -430,6 +437,7 @@ ENTRY(twofish_xts_enc_8way) + /* dst <= regs xor IVs(in dst) */ + store_xts_8way(%r11, RC1, RD1, RA1, RB1, RC2, RD2, RA2, RB2); + ++ pax_force_retaddr + ret; + ENDPROC(twofish_xts_enc_8way) + +@@ -452,5 +460,6 @@ ENTRY(twofish_xts_dec_8way) + /* dst <= regs xor IVs(in dst) */ + store_xts_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2); + ++ pax_force_retaddr + ret; + ENDPROC(twofish_xts_dec_8way) +diff --git a/arch/x86/crypto/twofish-x86_64-asm_64-3way.S b/arch/x86/crypto/twofish-x86_64-asm_64-3way.S +index 1c3b7ce..02f578d 100644 +--- a/arch/x86/crypto/twofish-x86_64-asm_64-3way.S ++++ b/arch/x86/crypto/twofish-x86_64-asm_64-3way.S +@@ -21,6 +21,7 @@ + */ + + #include <linux/linkage.h> ++#include <asm/alternative-asm.h> + + .file "twofish-x86_64-asm-3way.S" + .text +@@ -258,6 +259,7 @@ ENTRY(__twofish_enc_blk_3way) + popq %r13; + popq %r14; + popq %r15; ++ pax_force_retaddr + ret; + + .L__enc_xor3: +@@ -269,6 +271,7 @@ ENTRY(__twofish_enc_blk_3way) + popq %r13; + popq %r14; + popq %r15; ++ pax_force_retaddr + ret; + ENDPROC(__twofish_enc_blk_3way) + +@@ -308,5 +311,6 @@ ENTRY(twofish_dec_blk_3way) + popq %r13; + popq %r14; + popq %r15; ++ pax_force_retaddr + ret; + ENDPROC(twofish_dec_blk_3way) +diff --git a/arch/x86/crypto/twofish-x86_64-asm_64.S b/arch/x86/crypto/twofish-x86_64-asm_64.S +index a039d21..524b8b2 100644 +--- a/arch/x86/crypto/twofish-x86_64-asm_64.S ++++ b/arch/x86/crypto/twofish-x86_64-asm_64.S +@@ -22,6 +22,7 @@ + + #include <linux/linkage.h> + #include <asm/asm-offsets.h> ++#include <asm/alternative-asm.h> + + #define a_offset 0 + #define b_offset 4 +@@ -265,6 +266,7 @@ ENTRY(twofish_enc_blk) + + popq R1 + movq $1,%rax ++ pax_force_retaddr + ret + ENDPROC(twofish_enc_blk) + +@@ -317,5 +319,6 @@ ENTRY(twofish_dec_blk) + + popq R1 + movq $1,%rax ++ pax_force_retaddr + ret + ENDPROC(twofish_dec_blk) +diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c +index df91466..74b31cb 100644 +--- a/arch/x86/ia32/ia32_aout.c ++++ b/arch/x86/ia32/ia32_aout.c +@@ -153,6 +153,8 @@ static int aout_core_dump(struct coredump_params *cprm) + unsigned long dump_start, dump_size; + struct user32 dump; + ++ memset(&dump, 0, sizeof(dump)); ++ + fs = get_fs(); + set_fs(KERNEL_DS); + has_dumped = 1; +diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c +index f9e181a..300544c 100644 +--- a/arch/x86/ia32/ia32_signal.c ++++ b/arch/x86/ia32/ia32_signal.c +@@ -218,7 +218,7 @@ asmlinkage long sys32_sigreturn(void) + if (__get_user(set.sig[0], &frame->sc.oldmask) + || (_COMPAT_NSIG_WORDS > 1 + && __copy_from_user((((char *) &set.sig) + 4), +- &frame->extramask, ++ frame->extramask, + sizeof(frame->extramask)))) + goto badframe; + +@@ -338,7 +338,7 @@ static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, + sp -= frame_size; + /* Align the stack pointer according to the i386 ABI, + * i.e. so that on function entry ((sp + 4) & 15) == 0. */ +- sp = ((sp + 4) & -16ul) - 4; ++ sp = ((sp - 12) & -16ul) - 4; + return (void __user *) sp; + } + +@@ -383,10 +383,10 @@ int ia32_setup_frame(int sig, struct ksignal *ksig, + } else { + /* Return stub is in 32bit vsyscall page */ + if (current->mm->context.vdso) +- restorer = current->mm->context.vdso + +- selected_vdso32->sym___kernel_sigreturn; ++ restorer = (void __force_user *)(current->mm->context.vdso + ++ selected_vdso32->sym___kernel_sigreturn); + else +- restorer = &frame->retcode; ++ restorer = frame->retcode; + } + + put_user_try { +@@ -396,7 +396,7 @@ int ia32_setup_frame(int sig, struct ksignal *ksig, + * These are actually not used anymore, but left because some + * gdb versions depend on them as a marker. + */ +- put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode); ++ put_user_ex(*((const u64 *)&code), (u64 __user *)frame->retcode); + } put_user_catch(err); + + if (err) +@@ -438,7 +438,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig, + 0xb8, + __NR_ia32_rt_sigreturn, + 0x80cd, +- 0, ++ 0 + }; + + frame = get_sigframe(ksig, regs, sizeof(*frame), &fpstate); +@@ -461,16 +461,19 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig, + + if (ksig->ka.sa.sa_flags & SA_RESTORER) + restorer = ksig->ka.sa.sa_restorer; ++ else if (current->mm->context.vdso) ++ /* Return stub is in 32bit vsyscall page */ ++ restorer = (void __force_user *)(current->mm->context.vdso + ++ selected_vdso32->sym___kernel_rt_sigreturn); + else +- restorer = current->mm->context.vdso + +- selected_vdso32->sym___kernel_rt_sigreturn; ++ restorer = frame->retcode; + put_user_ex(ptr_to_compat(restorer), &frame->pretcode); + + /* + * Not actually used anymore, but left because some gdb + * versions need it. + */ +- put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode); ++ put_user_ex(*((const u64 *)&code), (u64 __user *)frame->retcode); + } put_user_catch(err); + + err |= copy_siginfo_to_user32(&frame->info, &ksig->info); +diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S +index ffe7122..899bad3 100644 +--- a/arch/x86/ia32/ia32entry.S ++++ b/arch/x86/ia32/ia32entry.S +@@ -15,8 +15,10 @@ + #include <asm/irqflags.h> + #include <asm/asm.h> + #include <asm/smap.h> ++#include <asm/pgtable.h> + #include <linux/linkage.h> + #include <linux/err.h> ++#include <asm/alternative-asm.h> + + /* Avoid __ASSEMBLER__'ifying <linux/audit.h> just for this. */ + #include <linux/elf-em.h> +@@ -62,12 +64,12 @@ + */ + .macro LOAD_ARGS32 offset, _r9=0 + .if \_r9 +- movl \offset+16(%rsp),%r9d ++ movl \offset+R9(%rsp),%r9d + .endif +- movl \offset+40(%rsp),%ecx +- movl \offset+48(%rsp),%edx +- movl \offset+56(%rsp),%esi +- movl \offset+64(%rsp),%edi ++ movl \offset+RCX(%rsp),%ecx ++ movl \offset+RDX(%rsp),%edx ++ movl \offset+RSI(%rsp),%esi ++ movl \offset+RDI(%rsp),%edi + movl %eax,%eax /* zero extension */ + .endm + +@@ -96,6 +98,32 @@ ENTRY(native_irq_enable_sysexit) + ENDPROC(native_irq_enable_sysexit) + #endif + ++ .macro pax_enter_kernel_user ++ pax_set_fptr_mask ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ call pax_enter_kernel_user ++#endif ++ .endm ++ ++ .macro pax_exit_kernel_user ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ call pax_exit_kernel_user ++#endif ++#ifdef CONFIG_PAX_RANDKSTACK ++ pushq %rax ++ pushq %r11 ++ call pax_randomize_kstack ++ popq %r11 ++ popq %rax ++#endif ++ .endm ++ ++ .macro pax_erase_kstack ++#ifdef CONFIG_PAX_MEMORY_STACKLEAK ++ call pax_erase_kstack ++#endif ++ .endm ++ + /* + * 32bit SYSENTER instruction entry. + * +@@ -122,12 +150,6 @@ ENTRY(ia32_sysenter_target) + CFI_REGISTER rsp,rbp + SWAPGS_UNSAFE_STACK + movq PER_CPU_VAR(kernel_stack), %rsp +- addq $(KERNEL_STACK_OFFSET),%rsp +- /* +- * No need to follow this irqs on/off section: the syscall +- * disabled irqs, here we enable it straight after entry: +- */ +- ENABLE_INTERRUPTS(CLBR_NONE) + movl %ebp,%ebp /* zero extension */ + pushq_cfi $__USER32_DS + /*CFI_REL_OFFSET ss,0*/ +@@ -135,23 +157,46 @@ ENTRY(ia32_sysenter_target) + CFI_REL_OFFSET rsp,0 + pushfq_cfi + /*CFI_REL_OFFSET rflags,0*/ +- movl TI_sysenter_return+THREAD_INFO(%rsp,3*8-KERNEL_STACK_OFFSET),%r10d +- CFI_REGISTER rip,r10 ++ orl $X86_EFLAGS_IF,(%rsp) ++ GET_THREAD_INFO(%r11) ++ movl TI_sysenter_return(%r11), %r11d ++ CFI_REGISTER rip,r11 + pushq_cfi $__USER32_CS + /*CFI_REL_OFFSET cs,0*/ + movl %eax, %eax +- pushq_cfi %r10 ++ pushq_cfi %r11 + CFI_REL_OFFSET rip,0 + pushq_cfi %rax + cld + SAVE_ARGS 0,1,0 ++ pax_enter_kernel_user ++ ++#ifdef CONFIG_PAX_RANDKSTACK ++ pax_erase_kstack ++#endif ++ ++ /* ++ * No need to follow this irqs on/off section: the syscall ++ * disabled irqs, here we enable it straight after entry: ++ */ ++ ENABLE_INTERRUPTS(CLBR_NONE) + /* no need to do an access_ok check here because rbp has been + 32bit zero extended */ ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ addq pax_user_shadow_base,%rbp ++ ASM_PAX_OPEN_USERLAND ++#endif ++ + ASM_STAC + 1: movl (%rbp),%ebp + _ASM_EXTABLE(1b,ia32_badarg) + ASM_CLAC + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ ASM_PAX_CLOSE_USERLAND ++#endif ++ + /* + * Sysenter doesn't filter flags, so we need to clear NT + * ourselves. To save a few cycles, we can check whether +@@ -161,8 +206,9 @@ ENTRY(ia32_sysenter_target) + jnz sysenter_fix_flags + sysenter_flags_fixed: + +- orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) +- testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ GET_THREAD_INFO(%r11) ++ orl $TS_COMPAT,TI_status(%r11) ++ testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r11) + CFI_REMEMBER_STATE + jnz sysenter_tracesys + cmpq $(IA32_NR_syscalls-1),%rax +@@ -172,15 +218,18 @@ sysenter_do_call: + sysenter_dispatch: + call *ia32_sys_call_table(,%rax,8) + movq %rax,RAX-ARGOFFSET(%rsp) ++ GET_THREAD_INFO(%r11) + DISABLE_INTERRUPTS(CLBR_NONE) + TRACE_IRQS_OFF +- testl $_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ testl $_TIF_ALLWORK_MASK,TI_flags(%r11) + jnz sysexit_audit + sysexit_from_sys_call: +- andl $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ pax_exit_kernel_user ++ pax_erase_kstack ++ andl $~TS_COMPAT,TI_status(%r11) + /* clear IF, that popfq doesn't enable interrupts early */ +- andl $~0x200,EFLAGS-R11(%rsp) +- movl RIP-R11(%rsp),%edx /* User %eip */ ++ andl $~X86_EFLAGS_IF,EFLAGS(%rsp) ++ movl RIP(%rsp),%edx /* User %eip */ + CFI_REGISTER rip,rdx + RESTORE_ARGS 0,24,0,0,0,0 + xorq %r8,%r8 +@@ -205,6 +254,9 @@ sysexit_from_sys_call: + movl %ebx,%esi /* 2nd arg: 1st syscall arg */ + movl %eax,%edi /* 1st arg: syscall number */ + call __audit_syscall_entry ++ ++ pax_erase_kstack ++ + movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall number */ + cmpq $(IA32_NR_syscalls-1),%rax + ja ia32_badsys +@@ -216,7 +268,7 @@ sysexit_from_sys_call: + .endm + + .macro auditsys_exit exit +- testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r11) + jnz ia32_ret_from_sys_call + TRACE_IRQS_ON + ENABLE_INTERRUPTS(CLBR_NONE) +@@ -227,11 +279,12 @@ sysexit_from_sys_call: + 1: setbe %al /* 1 if error, 0 if not */ + movzbl %al,%edi /* zero-extend that into %edi */ + call __audit_syscall_exit ++ GET_THREAD_INFO(%r11) + movq RAX-ARGOFFSET(%rsp),%rax /* reload syscall return value */ + movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi + DISABLE_INTERRUPTS(CLBR_NONE) + TRACE_IRQS_OFF +- testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ testl %edi,TI_flags(%r11) + jz \exit + CLEAR_RREGS -ARGOFFSET + jmp int_with_check +@@ -253,7 +306,7 @@ sysenter_fix_flags: + + sysenter_tracesys: + #ifdef CONFIG_AUDITSYSCALL +- testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags(%r11) + jz sysenter_auditsys + #endif + SAVE_REST +@@ -265,6 +318,9 @@ sysenter_tracesys: + RESTORE_REST + cmpq $(IA32_NR_syscalls-1),%rax + ja int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */ ++ ++ pax_erase_kstack ++ + jmp sysenter_do_call + CFI_ENDPROC + ENDPROC(ia32_sysenter_target) +@@ -292,19 +348,25 @@ ENDPROC(ia32_sysenter_target) + ENTRY(ia32_cstar_target) + CFI_STARTPROC32 simple + CFI_SIGNAL_FRAME +- CFI_DEF_CFA rsp,KERNEL_STACK_OFFSET ++ CFI_DEF_CFA rsp,0 + CFI_REGISTER rip,rcx + /*CFI_REGISTER rflags,r11*/ + SWAPGS_UNSAFE_STACK + movl %esp,%r8d + CFI_REGISTER rsp,r8 + movq PER_CPU_VAR(kernel_stack),%rsp ++ SAVE_ARGS 8*6,0,0 ++ pax_enter_kernel_user ++ ++#ifdef CONFIG_PAX_RANDKSTACK ++ pax_erase_kstack ++#endif ++ + /* + * No need to follow this irqs on/off section: the syscall + * disabled irqs and here we enable it straight after entry: + */ + ENABLE_INTERRUPTS(CLBR_NONE) +- SAVE_ARGS 8,0,0 + movl %eax,%eax /* zero extension */ + movq %rax,ORIG_RAX-ARGOFFSET(%rsp) + movq %rcx,RIP-ARGOFFSET(%rsp) +@@ -320,12 +382,25 @@ ENTRY(ia32_cstar_target) + /* no need to do an access_ok check here because r8 has been + 32bit zero extended */ + /* hardware stack frame is complete now */ ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ ASM_PAX_OPEN_USERLAND ++ movq pax_user_shadow_base,%r8 ++ addq RSP-ARGOFFSET(%rsp),%r8 ++#endif ++ + ASM_STAC + 1: movl (%r8),%r9d + _ASM_EXTABLE(1b,ia32_badarg) + ASM_CLAC +- orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) +- testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ ASM_PAX_CLOSE_USERLAND ++#endif ++ ++ GET_THREAD_INFO(%r11) ++ orl $TS_COMPAT,TI_status(%r11) ++ testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r11) + CFI_REMEMBER_STATE + jnz cstar_tracesys + cmpq $IA32_NR_syscalls-1,%rax +@@ -335,13 +410,16 @@ cstar_do_call: + cstar_dispatch: + call *ia32_sys_call_table(,%rax,8) + movq %rax,RAX-ARGOFFSET(%rsp) ++ GET_THREAD_INFO(%r11) + DISABLE_INTERRUPTS(CLBR_NONE) + TRACE_IRQS_OFF +- testl $_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ testl $_TIF_ALLWORK_MASK,TI_flags(%r11) + jnz sysretl_audit + sysretl_from_sys_call: +- andl $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) +- RESTORE_ARGS 0,-ARG_SKIP,0,0,0 ++ pax_exit_kernel_user ++ pax_erase_kstack ++ andl $~TS_COMPAT,TI_status(%r11) ++ RESTORE_ARGS 0,-ORIG_RAX,0,0,0 + movl RIP-ARGOFFSET(%rsp),%ecx + CFI_REGISTER rip,rcx + movl EFLAGS-ARGOFFSET(%rsp),%r11d +@@ -368,7 +446,7 @@ sysretl_audit: + + cstar_tracesys: + #ifdef CONFIG_AUDITSYSCALL +- testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags(%r11) + jz cstar_auditsys + #endif + xchgl %r9d,%ebp +@@ -382,11 +460,19 @@ cstar_tracesys: + xchgl %ebp,%r9d + cmpq $(IA32_NR_syscalls-1),%rax + ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */ ++ ++ pax_erase_kstack ++ + jmp cstar_do_call + END(ia32_cstar_target) + + ia32_badarg: + ASM_CLAC ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ ASM_PAX_CLOSE_USERLAND ++#endif ++ + movq $-EFAULT,%rax + jmp ia32_sysret + CFI_ENDPROC +@@ -423,19 +509,26 @@ ENTRY(ia32_syscall) + CFI_REL_OFFSET rip,RIP-RIP + PARAVIRT_ADJUST_EXCEPTION_FRAME + SWAPGS +- /* +- * No need to follow this irqs on/off section: the syscall +- * disabled irqs and here we enable it straight after entry: +- */ +- ENABLE_INTERRUPTS(CLBR_NONE) + movl %eax,%eax + pushq_cfi %rax + cld + /* note the registers are not zero extended to the sf. + this could be a problem. */ + SAVE_ARGS 0,1,0 +- orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) +- testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ pax_enter_kernel_user ++ ++#ifdef CONFIG_PAX_RANDKSTACK ++ pax_erase_kstack ++#endif ++ ++ /* ++ * No need to follow this irqs on/off section: the syscall ++ * disabled irqs and here we enable it straight after entry: ++ */ ++ ENABLE_INTERRUPTS(CLBR_NONE) ++ GET_THREAD_INFO(%r11) ++ orl $TS_COMPAT,TI_status(%r11) ++ testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r11) + jnz ia32_tracesys + cmpq $(IA32_NR_syscalls-1),%rax + ja ia32_badsys +@@ -458,6 +551,9 @@ ia32_tracesys: + RESTORE_REST + cmpq $(IA32_NR_syscalls-1),%rax + ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */ ++ ++ pax_erase_kstack ++ + jmp ia32_do_call + END(ia32_syscall) + +diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c +index 8e0ceec..af13504 100644 +--- a/arch/x86/ia32/sys_ia32.c ++++ b/arch/x86/ia32/sys_ia32.c +@@ -69,8 +69,8 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long offset_low, + */ + static int cp_stat64(struct stat64 __user *ubuf, struct kstat *stat) + { +- typeof(ubuf->st_uid) uid = 0; +- typeof(ubuf->st_gid) gid = 0; ++ typeof(((struct stat64 *)0)->st_uid) uid = 0; ++ typeof(((struct stat64 *)0)->st_gid) gid = 0; + SET_UID(uid, from_kuid_munged(current_user_ns(), stat->uid)); + SET_GID(gid, from_kgid_munged(current_user_ns(), stat->gid)); + if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct stat64)) || +diff --git a/arch/x86/include/asm/alternative-asm.h b/arch/x86/include/asm/alternative-asm.h +index 372231c..51b537d 100644 +--- a/arch/x86/include/asm/alternative-asm.h ++++ b/arch/x86/include/asm/alternative-asm.h +@@ -18,6 +18,45 @@ + .endm + #endif + ++#ifdef KERNEXEC_PLUGIN ++ .macro pax_force_retaddr_bts rip=0 ++ btsq $63,\rip(%rsp) ++ .endm ++#ifdef CONFIG_PAX_KERNEXEC_PLUGIN_METHOD_BTS ++ .macro pax_force_retaddr rip=0, reload=0 ++ btsq $63,\rip(%rsp) ++ .endm ++ .macro pax_force_fptr ptr ++ btsq $63,\ptr ++ .endm ++ .macro pax_set_fptr_mask ++ .endm ++#endif ++#ifdef CONFIG_PAX_KERNEXEC_PLUGIN_METHOD_OR ++ .macro pax_force_retaddr rip=0, reload=0 ++ .if \reload ++ pax_set_fptr_mask ++ .endif ++ orq %r12,\rip(%rsp) ++ .endm ++ .macro pax_force_fptr ptr ++ orq %r12,\ptr ++ .endm ++ .macro pax_set_fptr_mask ++ movabs $0x8000000000000000,%r12 ++ .endm ++#endif ++#else ++ .macro pax_force_retaddr rip=0, reload=0 ++ .endm ++ .macro pax_force_fptr ptr ++ .endm ++ .macro pax_force_retaddr_bts rip=0 ++ .endm ++ .macro pax_set_fptr_mask ++ .endm ++#endif ++ + .macro altinstruction_entry orig alt feature orig_len alt_len + .long \orig - . + .long \alt - . +diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h +index 473bdbe..b1e3377 100644 +--- a/arch/x86/include/asm/alternative.h ++++ b/arch/x86/include/asm/alternative.h +@@ -106,7 +106,7 @@ static inline int alternatives_text_reserved(void *start, void *end) + ".pushsection .discard,\"aw\",@progbits\n" \ + DISCARD_ENTRY(1) \ + ".popsection\n" \ +- ".pushsection .altinstr_replacement, \"ax\"\n" \ ++ ".pushsection .altinstr_replacement, \"a\"\n" \ + ALTINSTR_REPLACEMENT(newinstr, feature, 1) \ + ".popsection" + +@@ -120,7 +120,7 @@ static inline int alternatives_text_reserved(void *start, void *end) + DISCARD_ENTRY(1) \ + DISCARD_ENTRY(2) \ + ".popsection\n" \ +- ".pushsection .altinstr_replacement, \"ax\"\n" \ ++ ".pushsection .altinstr_replacement, \"a\"\n" \ + ALTINSTR_REPLACEMENT(newinstr1, feature1, 1) \ + ALTINSTR_REPLACEMENT(newinstr2, feature2, 2) \ + ".popsection" +diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h +index 465b309..ab7e51f 100644 +--- a/arch/x86/include/asm/apic.h ++++ b/arch/x86/include/asm/apic.h +@@ -45,7 +45,7 @@ static inline void generic_apic_probe(void) + + #ifdef CONFIG_X86_LOCAL_APIC + +-extern unsigned int apic_verbosity; ++extern int apic_verbosity; + extern int local_apic_timer_c2_ok; + + extern int disable_apic; +diff --git a/arch/x86/include/asm/apm.h b/arch/x86/include/asm/apm.h +index 20370c6..a2eb9b0 100644 +--- a/arch/x86/include/asm/apm.h ++++ b/arch/x86/include/asm/apm.h +@@ -34,7 +34,7 @@ static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in, + __asm__ __volatile__(APM_DO_ZERO_SEGS + "pushl %%edi\n\t" + "pushl %%ebp\n\t" +- "lcall *%%cs:apm_bios_entry\n\t" ++ "lcall *%%ss:apm_bios_entry\n\t" + "setc %%al\n\t" + "popl %%ebp\n\t" + "popl %%edi\n\t" +@@ -58,7 +58,7 @@ static inline u8 apm_bios_call_simple_asm(u32 func, u32 ebx_in, + __asm__ __volatile__(APM_DO_ZERO_SEGS + "pushl %%edi\n\t" + "pushl %%ebp\n\t" +- "lcall *%%cs:apm_bios_entry\n\t" ++ "lcall *%%ss:apm_bios_entry\n\t" + "setc %%bl\n\t" + "popl %%ebp\n\t" + "popl %%edi\n\t" +diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h +index 5e5cd12..3d18208 100644 +--- a/arch/x86/include/asm/atomic.h ++++ b/arch/x86/include/asm/atomic.h +@@ -28,6 +28,17 @@ static inline int atomic_read(const atomic_t *v) + } + + /** ++ * atomic_read_unchecked - read atomic variable ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically reads the value of @v. ++ */ ++static inline int __intentional_overflow(-1) atomic_read_unchecked(const atomic_unchecked_t *v) ++{ ++ return ACCESS_ONCE((v)->counter); ++} ++ ++/** + * atomic_set - set atomic variable + * @v: pointer of type atomic_t + * @i: required value +@@ -40,6 +51,18 @@ static inline void atomic_set(atomic_t *v, int i) + } + + /** ++ * atomic_set_unchecked - set atomic variable ++ * @v: pointer of type atomic_unchecked_t ++ * @i: required value ++ * ++ * Atomically sets the value of @v to @i. ++ */ ++static inline void atomic_set_unchecked(atomic_unchecked_t *v, int i) ++{ ++ v->counter = i; ++} ++ ++/** + * atomic_add - add integer to atomic variable + * @i: integer value to add + * @v: pointer of type atomic_t +@@ -48,7 +71,29 @@ static inline void atomic_set(atomic_t *v, int i) + */ + static inline void atomic_add(int i, atomic_t *v) + { +- asm volatile(LOCK_PREFIX "addl %1,%0" ++ asm volatile(LOCK_PREFIX "addl %1,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "subl %1,%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (v->counter) ++ : "ir" (i)); ++} ++ ++/** ++ * atomic_add_unchecked - add integer to atomic variable ++ * @i: integer value to add ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically adds @i to @v. ++ */ ++static inline void atomic_add_unchecked(int i, atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "addl %1,%0\n" + : "+m" (v->counter) + : "ir" (i)); + } +@@ -62,7 +107,29 @@ static inline void atomic_add(int i, atomic_t *v) + */ + static inline void atomic_sub(int i, atomic_t *v) + { +- asm volatile(LOCK_PREFIX "subl %1,%0" ++ asm volatile(LOCK_PREFIX "subl %1,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "addl %1,%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (v->counter) ++ : "ir" (i)); ++} ++ ++/** ++ * atomic_sub_unchecked - subtract integer from atomic variable ++ * @i: integer value to subtract ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically subtracts @i from @v. ++ */ ++static inline void atomic_sub_unchecked(int i, atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "subl %1,%0\n" + : "+m" (v->counter) + : "ir" (i)); + } +@@ -78,7 +145,7 @@ static inline void atomic_sub(int i, atomic_t *v) + */ + static inline int atomic_sub_and_test(int i, atomic_t *v) + { +- GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, "er", i, "%0", "e"); ++ GEN_BINARY_RMWcc(LOCK_PREFIX "subl", LOCK_PREFIX "addl", v->counter, "er", i, "%0", "e"); + } + + /** +@@ -89,7 +156,27 @@ static inline int atomic_sub_and_test(int i, atomic_t *v) + */ + static inline void atomic_inc(atomic_t *v) + { +- asm volatile(LOCK_PREFIX "incl %0" ++ asm volatile(LOCK_PREFIX "incl %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "decl %0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (v->counter)); ++} ++ ++/** ++ * atomic_inc_unchecked - increment atomic variable ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically increments @v by 1. ++ */ ++static inline void atomic_inc_unchecked(atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "incl %0\n" + : "+m" (v->counter)); + } + +@@ -101,7 +188,27 @@ static inline void atomic_inc(atomic_t *v) + */ + static inline void atomic_dec(atomic_t *v) + { +- asm volatile(LOCK_PREFIX "decl %0" ++ asm volatile(LOCK_PREFIX "decl %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "incl %0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (v->counter)); ++} ++ ++/** ++ * atomic_dec_unchecked - decrement atomic variable ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically decrements @v by 1. ++ */ ++static inline void atomic_dec_unchecked(atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "decl %0\n" + : "+m" (v->counter)); + } + +@@ -115,7 +222,7 @@ static inline void atomic_dec(atomic_t *v) + */ + static inline int atomic_dec_and_test(atomic_t *v) + { +- GEN_UNARY_RMWcc(LOCK_PREFIX "decl", v->counter, "%0", "e"); ++ GEN_UNARY_RMWcc(LOCK_PREFIX "decl", LOCK_PREFIX "incl", v->counter, "%0", "e"); + } + + /** +@@ -128,7 +235,20 @@ static inline int atomic_dec_and_test(atomic_t *v) + */ + static inline int atomic_inc_and_test(atomic_t *v) + { +- GEN_UNARY_RMWcc(LOCK_PREFIX "incl", v->counter, "%0", "e"); ++ GEN_UNARY_RMWcc(LOCK_PREFIX "incl", LOCK_PREFIX "decl", v->counter, "%0", "e"); ++} ++ ++/** ++ * atomic_inc_and_test_unchecked - increment and test ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically increments @v by 1 ++ * and returns true if the result is zero, or false for all ++ * other cases. ++ */ ++static inline int atomic_inc_and_test_unchecked(atomic_unchecked_t *v) ++{ ++ GEN_UNARY_RMWcc_unchecked(LOCK_PREFIX "incl", v->counter, "%0", "e"); + } + + /** +@@ -142,7 +262,7 @@ static inline int atomic_inc_and_test(atomic_t *v) + */ + static inline int atomic_add_negative(int i, atomic_t *v) + { +- GEN_BINARY_RMWcc(LOCK_PREFIX "addl", v->counter, "er", i, "%0", "s"); ++ GEN_BINARY_RMWcc(LOCK_PREFIX "addl", LOCK_PREFIX "subl", v->counter, "er", i, "%0", "s"); + } + + /** +@@ -152,7 +272,19 @@ static inline int atomic_add_negative(int i, atomic_t *v) + * + * Atomically adds @i to @v and returns @i + @v + */ +-static inline int atomic_add_return(int i, atomic_t *v) ++static inline int __intentional_overflow(-1) atomic_add_return(int i, atomic_t *v) ++{ ++ return i + xadd_check_overflow(&v->counter, i); ++} ++ ++/** ++ * atomic_add_return_unchecked - add integer and return ++ * @i: integer value to add ++ * @v: pointer of type atomic_unchecked_t ++ * ++ * Atomically adds @i to @v and returns @i + @v ++ */ ++static inline int atomic_add_return_unchecked(int i, atomic_unchecked_t *v) + { + return i + xadd(&v->counter, i); + } +@@ -164,15 +296,24 @@ static inline int atomic_add_return(int i, atomic_t *v) + * + * Atomically subtracts @i from @v and returns @v - @i + */ +-static inline int atomic_sub_return(int i, atomic_t *v) ++static inline int __intentional_overflow(-1) atomic_sub_return(int i, atomic_t *v) + { + return atomic_add_return(-i, v); + } + + #define atomic_inc_return(v) (atomic_add_return(1, v)) ++static inline int atomic_inc_return_unchecked(atomic_unchecked_t *v) ++{ ++ return atomic_add_return_unchecked(1, v); ++} + #define atomic_dec_return(v) (atomic_sub_return(1, v)) + +-static inline int atomic_cmpxchg(atomic_t *v, int old, int new) ++static inline int __intentional_overflow(-1) atomic_cmpxchg(atomic_t *v, int old, int new) ++{ ++ return cmpxchg(&v->counter, old, new); ++} ++ ++static inline int atomic_cmpxchg_unchecked(atomic_unchecked_t *v, int old, int new) + { + return cmpxchg(&v->counter, old, new); + } +@@ -182,6 +323,11 @@ static inline int atomic_xchg(atomic_t *v, int new) + return xchg(&v->counter, new); + } + ++static inline int atomic_xchg_unchecked(atomic_unchecked_t *v, int new) ++{ ++ return xchg(&v->counter, new); ++} ++ + /** + * __atomic_add_unless - add unless the number is already a given value + * @v: pointer of type atomic_t +@@ -191,14 +337,27 @@ static inline int atomic_xchg(atomic_t *v, int new) + * Atomically adds @a to @v, so long as @v was not already @u. + * Returns the old value of @v. + */ +-static inline int __atomic_add_unless(atomic_t *v, int a, int u) ++static inline int __intentional_overflow(-1) __atomic_add_unless(atomic_t *v, int a, int u) + { +- int c, old; ++ int c, old, new; + c = atomic_read(v); + for (;;) { +- if (unlikely(c == (u))) ++ if (unlikely(c == u)) + break; +- old = atomic_cmpxchg((v), c, c + (a)); ++ ++ asm volatile("addl %2,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ "subl %2,%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "=r" (new) ++ : "0" (c), "ir" (a)); ++ ++ old = atomic_cmpxchg(v, c, new); + if (likely(old == c)) + break; + c = old; +@@ -207,6 +366,49 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u) + } + + /** ++ * atomic_inc_not_zero_hint - increment if not null ++ * @v: pointer of type atomic_t ++ * @hint: probable value of the atomic before the increment ++ * ++ * This version of atomic_inc_not_zero() gives a hint of probable ++ * value of the atomic. This helps processor to not read the memory ++ * before doing the atomic read/modify/write cycle, lowering ++ * number of bus transactions on some arches. ++ * ++ * Returns: 0 if increment was not done, 1 otherwise. ++ */ ++#define atomic_inc_not_zero_hint atomic_inc_not_zero_hint ++static inline int atomic_inc_not_zero_hint(atomic_t *v, int hint) ++{ ++ int val, c = hint, new; ++ ++ /* sanity test, should be removed by compiler if hint is a constant */ ++ if (!hint) ++ return __atomic_add_unless(v, 1, 0); ++ ++ do { ++ asm volatile("incl %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ "decl %0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "=r" (new) ++ : "0" (c)); ++ ++ val = atomic_cmpxchg(v, c, new); ++ if (val == c) ++ return 1; ++ c = val; ++ } while (c); ++ ++ return 0; ++} ++ ++/** + * atomic_inc_short - increment of a short integer + * @v: pointer to type int + * +@@ -220,14 +422,37 @@ static inline short int atomic_inc_short(short int *v) + } + + /* These are x86-specific, used by some header files */ +-#define atomic_clear_mask(mask, addr) \ +- asm volatile(LOCK_PREFIX "andl %0,%1" \ +- : : "r" (~(mask)), "m" (*(addr)) : "memory") +- +-#define atomic_set_mask(mask, addr) \ +- asm volatile(LOCK_PREFIX "orl %0,%1" \ +- : : "r" ((unsigned)(mask)), "m" (*(addr)) \ +- : "memory") ++static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) ++{ ++ asm volatile(LOCK_PREFIX "andl %1,%0" ++ : "+m" (v->counter) ++ : "r" (~(mask)) ++ : "memory"); ++} ++ ++static inline void atomic_clear_mask_unchecked(unsigned int mask, atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "andl %1,%0" ++ : "+m" (v->counter) ++ : "r" (~(mask)) ++ : "memory"); ++} ++ ++static inline void atomic_set_mask(unsigned int mask, atomic_t *v) ++{ ++ asm volatile(LOCK_PREFIX "orl %1,%0" ++ : "+m" (v->counter) ++ : "r" (mask) ++ : "memory"); ++} ++ ++static inline void atomic_set_mask_unchecked(unsigned int mask, atomic_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "orl %1,%0" ++ : "+m" (v->counter) ++ : "r" (mask) ++ : "memory"); ++} + + #ifdef CONFIG_X86_32 + # include <asm/atomic64_32.h> +diff --git a/arch/x86/include/asm/atomic64_32.h b/arch/x86/include/asm/atomic64_32.h +index b154de7..bf18a5a 100644 +--- a/arch/x86/include/asm/atomic64_32.h ++++ b/arch/x86/include/asm/atomic64_32.h +@@ -12,6 +12,14 @@ typedef struct { + u64 __aligned(8) counter; + } atomic64_t; + ++#ifdef CONFIG_PAX_REFCOUNT ++typedef struct { ++ u64 __aligned(8) counter; ++} atomic64_unchecked_t; ++#else ++typedef atomic64_t atomic64_unchecked_t; ++#endif ++ + #define ATOMIC64_INIT(val) { (val) } + + #define __ATOMIC64_DECL(sym) void atomic64_##sym(atomic64_t *, ...) +@@ -37,21 +45,31 @@ typedef struct { + ATOMIC64_DECL_ONE(sym##_386) + + ATOMIC64_DECL_ONE(add_386); ++ATOMIC64_DECL_ONE(add_unchecked_386); + ATOMIC64_DECL_ONE(sub_386); ++ATOMIC64_DECL_ONE(sub_unchecked_386); + ATOMIC64_DECL_ONE(inc_386); ++ATOMIC64_DECL_ONE(inc_unchecked_386); + ATOMIC64_DECL_ONE(dec_386); ++ATOMIC64_DECL_ONE(dec_unchecked_386); + #endif + + #define alternative_atomic64(f, out, in...) \ + __alternative_atomic64(f, f, ASM_OUTPUT2(out), ## in) + + ATOMIC64_DECL(read); ++ATOMIC64_DECL(read_unchecked); + ATOMIC64_DECL(set); ++ATOMIC64_DECL(set_unchecked); + ATOMIC64_DECL(xchg); + ATOMIC64_DECL(add_return); ++ATOMIC64_DECL(add_return_unchecked); + ATOMIC64_DECL(sub_return); ++ATOMIC64_DECL(sub_return_unchecked); + ATOMIC64_DECL(inc_return); ++ATOMIC64_DECL(inc_return_unchecked); + ATOMIC64_DECL(dec_return); ++ATOMIC64_DECL(dec_return_unchecked); + ATOMIC64_DECL(dec_if_positive); + ATOMIC64_DECL(inc_not_zero); + ATOMIC64_DECL(add_unless); +@@ -77,6 +95,21 @@ static inline long long atomic64_cmpxchg(atomic64_t *v, long long o, long long n + } + + /** ++ * atomic64_cmpxchg_unchecked - cmpxchg atomic64 variable ++ * @p: pointer to type atomic64_unchecked_t ++ * @o: expected value ++ * @n: new value ++ * ++ * Atomically sets @v to @n if it was equal to @o and returns ++ * the old value. ++ */ ++ ++static inline long long atomic64_cmpxchg_unchecked(atomic64_unchecked_t *v, long long o, long long n) ++{ ++ return cmpxchg64(&v->counter, o, n); ++} ++ ++/** + * atomic64_xchg - xchg atomic64 variable + * @v: pointer to type atomic64_t + * @n: value to assign +@@ -112,6 +145,22 @@ static inline void atomic64_set(atomic64_t *v, long long i) + } + + /** ++ * atomic64_set_unchecked - set atomic64 variable ++ * @v: pointer to type atomic64_unchecked_t ++ * @n: value to assign ++ * ++ * Atomically sets the value of @v to @n. ++ */ ++static inline void atomic64_set_unchecked(atomic64_unchecked_t *v, long long i) ++{ ++ unsigned high = (unsigned)(i >> 32); ++ unsigned low = (unsigned)i; ++ alternative_atomic64(set, /* no output */, ++ "S" (v), "b" (low), "c" (high) ++ : "eax", "edx", "memory"); ++} ++ ++/** + * atomic64_read - read atomic64 variable + * @v: pointer to type atomic64_t + * +@@ -125,6 +174,19 @@ static inline long long atomic64_read(const atomic64_t *v) + } + + /** ++ * atomic64_read_unchecked - read atomic64 variable ++ * @v: pointer to type atomic64_unchecked_t ++ * ++ * Atomically reads the value of @v and returns it. ++ */ ++static inline long long __intentional_overflow(-1) atomic64_read_unchecked(atomic64_unchecked_t *v) ++{ ++ long long r; ++ alternative_atomic64(read, "=&A" (r), "c" (v) : "memory"); ++ return r; ++ } ++ ++/** + * atomic64_add_return - add and return + * @i: integer value to add + * @v: pointer to type atomic64_t +@@ -139,6 +201,21 @@ static inline long long atomic64_add_return(long long i, atomic64_t *v) + return i; + } + ++/** ++ * atomic64_add_return_unchecked - add and return ++ * @i: integer value to add ++ * @v: pointer to type atomic64_unchecked_t ++ * ++ * Atomically adds @i to @v and returns @i + *@v ++ */ ++static inline long long atomic64_add_return_unchecked(long long i, atomic64_unchecked_t *v) ++{ ++ alternative_atomic64(add_return_unchecked, ++ ASM_OUTPUT2("+A" (i), "+c" (v)), ++ ASM_NO_INPUT_CLOBBER("memory")); ++ return i; ++} ++ + /* + * Other variants with different arithmetic operators: + */ +@@ -158,6 +235,14 @@ static inline long long atomic64_inc_return(atomic64_t *v) + return a; + } + ++static inline long long atomic64_inc_return_unchecked(atomic64_unchecked_t *v) ++{ ++ long long a; ++ alternative_atomic64(inc_return_unchecked, "=&A" (a), ++ "S" (v) : "memory", "ecx"); ++ return a; ++} ++ + static inline long long atomic64_dec_return(atomic64_t *v) + { + long long a; +@@ -182,6 +267,21 @@ static inline long long atomic64_add(long long i, atomic64_t *v) + } + + /** ++ * atomic64_add_unchecked - add integer to atomic64 variable ++ * @i: integer value to add ++ * @v: pointer to type atomic64_unchecked_t ++ * ++ * Atomically adds @i to @v. ++ */ ++static inline long long atomic64_add_unchecked(long long i, atomic64_unchecked_t *v) ++{ ++ __alternative_atomic64(add_unchecked, add_return_unchecked, ++ ASM_OUTPUT2("+A" (i), "+c" (v)), ++ ASM_NO_INPUT_CLOBBER("memory")); ++ return i; ++} ++ ++/** + * atomic64_sub - subtract the atomic64 variable + * @i: integer value to subtract + * @v: pointer to type atomic64_t +diff --git a/arch/x86/include/asm/atomic64_64.h b/arch/x86/include/asm/atomic64_64.h +index f8d273e..02f39f3 100644 +--- a/arch/x86/include/asm/atomic64_64.h ++++ b/arch/x86/include/asm/atomic64_64.h +@@ -22,6 +22,18 @@ static inline long atomic64_read(const atomic64_t *v) + } + + /** ++ * atomic64_read_unchecked - read atomic64 variable ++ * @v: pointer of type atomic64_unchecked_t ++ * ++ * Atomically reads the value of @v. ++ * Doesn't imply a read memory barrier. ++ */ ++static inline long __intentional_overflow(-1) atomic64_read_unchecked(const atomic64_unchecked_t *v) ++{ ++ return ACCESS_ONCE((v)->counter); ++} ++ ++/** + * atomic64_set - set atomic64 variable + * @v: pointer to type atomic64_t + * @i: required value +@@ -34,6 +46,18 @@ static inline void atomic64_set(atomic64_t *v, long i) + } + + /** ++ * atomic64_set_unchecked - set atomic64 variable ++ * @v: pointer to type atomic64_unchecked_t ++ * @i: required value ++ * ++ * Atomically sets the value of @v to @i. ++ */ ++static inline void atomic64_set_unchecked(atomic64_unchecked_t *v, long i) ++{ ++ v->counter = i; ++} ++ ++/** + * atomic64_add - add integer to atomic64 variable + * @i: integer value to add + * @v: pointer to type atomic64_t +@@ -42,6 +66,28 @@ static inline void atomic64_set(atomic64_t *v, long i) + */ + static inline void atomic64_add(long i, atomic64_t *v) + { ++ asm volatile(LOCK_PREFIX "addq %1,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "subq %1,%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "=m" (v->counter) ++ : "er" (i), "m" (v->counter)); ++} ++ ++/** ++ * atomic64_add_unchecked - add integer to atomic64 variable ++ * @i: integer value to add ++ * @v: pointer to type atomic64_unchecked_t ++ * ++ * Atomically adds @i to @v. ++ */ ++static inline void atomic64_add_unchecked(long i, atomic64_unchecked_t *v) ++{ + asm volatile(LOCK_PREFIX "addq %1,%0" + : "=m" (v->counter) + : "er" (i), "m" (v->counter)); +@@ -56,7 +102,29 @@ static inline void atomic64_add(long i, atomic64_t *v) + */ + static inline void atomic64_sub(long i, atomic64_t *v) + { +- asm volatile(LOCK_PREFIX "subq %1,%0" ++ asm volatile(LOCK_PREFIX "subq %1,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "addq %1,%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "=m" (v->counter) ++ : "er" (i), "m" (v->counter)); ++} ++ ++/** ++ * atomic64_sub_unchecked - subtract the atomic64 variable ++ * @i: integer value to subtract ++ * @v: pointer to type atomic64_unchecked_t ++ * ++ * Atomically subtracts @i from @v. ++ */ ++static inline void atomic64_sub_unchecked(long i, atomic64_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "subq %1,%0\n" + : "=m" (v->counter) + : "er" (i), "m" (v->counter)); + } +@@ -72,7 +140,7 @@ static inline void atomic64_sub(long i, atomic64_t *v) + */ + static inline int atomic64_sub_and_test(long i, atomic64_t *v) + { +- GEN_BINARY_RMWcc(LOCK_PREFIX "subq", v->counter, "er", i, "%0", "e"); ++ GEN_BINARY_RMWcc(LOCK_PREFIX "subq", LOCK_PREFIX "addq", v->counter, "er", i, "%0", "e"); + } + + /** +@@ -83,6 +151,27 @@ static inline int atomic64_sub_and_test(long i, atomic64_t *v) + */ + static inline void atomic64_inc(atomic64_t *v) + { ++ asm volatile(LOCK_PREFIX "incq %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "decq %0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "=m" (v->counter) ++ : "m" (v->counter)); ++} ++ ++/** ++ * atomic64_inc_unchecked - increment atomic64 variable ++ * @v: pointer to type atomic64_unchecked_t ++ * ++ * Atomically increments @v by 1. ++ */ ++static inline void atomic64_inc_unchecked(atomic64_unchecked_t *v) ++{ + asm volatile(LOCK_PREFIX "incq %0" + : "=m" (v->counter) + : "m" (v->counter)); +@@ -96,7 +185,28 @@ static inline void atomic64_inc(atomic64_t *v) + */ + static inline void atomic64_dec(atomic64_t *v) + { +- asm volatile(LOCK_PREFIX "decq %0" ++ asm volatile(LOCK_PREFIX "decq %0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX "incq %0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "=m" (v->counter) ++ : "m" (v->counter)); ++} ++ ++/** ++ * atomic64_dec_unchecked - decrement atomic64 variable ++ * @v: pointer to type atomic64_t ++ * ++ * Atomically decrements @v by 1. ++ */ ++static inline void atomic64_dec_unchecked(atomic64_unchecked_t *v) ++{ ++ asm volatile(LOCK_PREFIX "decq %0\n" + : "=m" (v->counter) + : "m" (v->counter)); + } +@@ -111,7 +221,7 @@ static inline void atomic64_dec(atomic64_t *v) + */ + static inline int atomic64_dec_and_test(atomic64_t *v) + { +- GEN_UNARY_RMWcc(LOCK_PREFIX "decq", v->counter, "%0", "e"); ++ GEN_UNARY_RMWcc(LOCK_PREFIX "decq", LOCK_PREFIX "incq", v->counter, "%0", "e"); + } + + /** +@@ -124,7 +234,7 @@ static inline int atomic64_dec_and_test(atomic64_t *v) + */ + static inline int atomic64_inc_and_test(atomic64_t *v) + { +- GEN_UNARY_RMWcc(LOCK_PREFIX "incq", v->counter, "%0", "e"); ++ GEN_UNARY_RMWcc(LOCK_PREFIX "incq", LOCK_PREFIX "decq", v->counter, "%0", "e"); + } + + /** +@@ -138,7 +248,7 @@ static inline int atomic64_inc_and_test(atomic64_t *v) + */ + static inline int atomic64_add_negative(long i, atomic64_t *v) + { +- GEN_BINARY_RMWcc(LOCK_PREFIX "addq", v->counter, "er", i, "%0", "s"); ++ GEN_BINARY_RMWcc(LOCK_PREFIX "addq", LOCK_PREFIX "subq", v->counter, "er", i, "%0", "s"); + } + + /** +@@ -150,6 +260,18 @@ static inline int atomic64_add_negative(long i, atomic64_t *v) + */ + static inline long atomic64_add_return(long i, atomic64_t *v) + { ++ return i + xadd_check_overflow(&v->counter, i); ++} ++ ++/** ++ * atomic64_add_return_unchecked - add and return ++ * @i: integer value to add ++ * @v: pointer to type atomic64_unchecked_t ++ * ++ * Atomically adds @i to @v and returns @i + @v ++ */ ++static inline long atomic64_add_return_unchecked(long i, atomic64_unchecked_t *v) ++{ + return i + xadd(&v->counter, i); + } + +@@ -159,6 +281,10 @@ static inline long atomic64_sub_return(long i, atomic64_t *v) + } + + #define atomic64_inc_return(v) (atomic64_add_return(1, (v))) ++static inline long atomic64_inc_return_unchecked(atomic64_unchecked_t *v) ++{ ++ return atomic64_add_return_unchecked(1, v); ++} + #define atomic64_dec_return(v) (atomic64_sub_return(1, (v))) + + static inline long atomic64_cmpxchg(atomic64_t *v, long old, long new) +@@ -166,6 +292,11 @@ static inline long atomic64_cmpxchg(atomic64_t *v, long old, long new) + return cmpxchg(&v->counter, old, new); + } + ++static inline long atomic64_cmpxchg_unchecked(atomic64_unchecked_t *v, long old, long new) ++{ ++ return cmpxchg(&v->counter, old, new); ++} ++ + static inline long atomic64_xchg(atomic64_t *v, long new) + { + return xchg(&v->counter, new); +@@ -182,17 +313,30 @@ static inline long atomic64_xchg(atomic64_t *v, long new) + */ + static inline int atomic64_add_unless(atomic64_t *v, long a, long u) + { +- long c, old; ++ long c, old, new; + c = atomic64_read(v); + for (;;) { +- if (unlikely(c == (u))) ++ if (unlikely(c == u)) + break; +- old = atomic64_cmpxchg((v), c, c + (a)); ++ ++ asm volatile("add %2,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ "sub %2,%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "=r" (new) ++ : "0" (c), "ir" (a)); ++ ++ old = atomic64_cmpxchg(v, c, new); + if (likely(old == c)) + break; + c = old; + } +- return c != (u); ++ return c != u; + } + + #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) +diff --git a/arch/x86/include/asm/barrier.h b/arch/x86/include/asm/barrier.h +index 0f4460b..fa1ee19 100644 +--- a/arch/x86/include/asm/barrier.h ++++ b/arch/x86/include/asm/barrier.h +@@ -107,7 +107,7 @@ + do { \ + compiletime_assert_atomic_type(*p); \ + smp_mb(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +@@ -124,7 +124,7 @@ do { \ + do { \ + compiletime_assert_atomic_type(*p); \ + barrier(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h +index cfe3b95..d01b118 100644 +--- a/arch/x86/include/asm/bitops.h ++++ b/arch/x86/include/asm/bitops.h +@@ -50,7 +50,7 @@ + * a mask operation on a byte. + */ + #define IS_IMMEDIATE(nr) (__builtin_constant_p(nr)) +-#define CONST_MASK_ADDR(nr, addr) BITOP_ADDR((void *)(addr) + ((nr)>>3)) ++#define CONST_MASK_ADDR(nr, addr) BITOP_ADDR((volatile void *)(addr) + ((nr)>>3)) + #define CONST_MASK(nr) (1 << ((nr) & 7)) + + /** +@@ -203,7 +203,7 @@ static inline void change_bit(long nr, volatile unsigned long *addr) + */ + static inline int test_and_set_bit(long nr, volatile unsigned long *addr) + { +- GEN_BINARY_RMWcc(LOCK_PREFIX "bts", *addr, "Ir", nr, "%0", "c"); ++ GEN_BINARY_RMWcc_unchecked(LOCK_PREFIX "bts", *addr, "Ir", nr, "%0", "c"); + } + + /** +@@ -249,7 +249,7 @@ static inline int __test_and_set_bit(long nr, volatile unsigned long *addr) + */ + static inline int test_and_clear_bit(long nr, volatile unsigned long *addr) + { +- GEN_BINARY_RMWcc(LOCK_PREFIX "btr", *addr, "Ir", nr, "%0", "c"); ++ GEN_BINARY_RMWcc_unchecked(LOCK_PREFIX "btr", *addr, "Ir", nr, "%0", "c"); + } + + /** +@@ -302,7 +302,7 @@ static inline int __test_and_change_bit(long nr, volatile unsigned long *addr) + */ + static inline int test_and_change_bit(long nr, volatile unsigned long *addr) + { +- GEN_BINARY_RMWcc(LOCK_PREFIX "btc", *addr, "Ir", nr, "%0", "c"); ++ GEN_BINARY_RMWcc_unchecked(LOCK_PREFIX "btc", *addr, "Ir", nr, "%0", "c"); + } + + static __always_inline int constant_test_bit(long nr, const volatile unsigned long *addr) +@@ -343,7 +343,7 @@ static int test_bit(int nr, const volatile unsigned long *addr); + * + * Undefined if no bit exists, so code should check against 0 first. + */ +-static inline unsigned long __ffs(unsigned long word) ++static inline unsigned long __intentional_overflow(-1) __ffs(unsigned long word) + { + asm("rep; bsf %1,%0" + : "=r" (word) +@@ -357,7 +357,7 @@ static inline unsigned long __ffs(unsigned long word) + * + * Undefined if no zero exists, so code should check against ~0UL first. + */ +-static inline unsigned long ffz(unsigned long word) ++static inline unsigned long __intentional_overflow(-1) ffz(unsigned long word) + { + asm("rep; bsf %1,%0" + : "=r" (word) +@@ -371,7 +371,7 @@ static inline unsigned long ffz(unsigned long word) + * + * Undefined if no set bit exists, so code should check against 0 first. + */ +-static inline unsigned long __fls(unsigned long word) ++static inline unsigned long __intentional_overflow(-1) __fls(unsigned long word) + { + asm("bsr %1,%0" + : "=r" (word) +@@ -434,7 +434,7 @@ static inline int ffs(int x) + * set bit if value is nonzero. The last (most significant) bit is + * at position 32. + */ +-static inline int fls(int x) ++static inline int __intentional_overflow(-1) fls(int x) + { + int r; + +@@ -476,7 +476,7 @@ static inline int fls(int x) + * at position 64. + */ + #ifdef CONFIG_X86_64 +-static __always_inline int fls64(__u64 x) ++static __always_inline __intentional_overflow(-1) int fls64(__u64 x) + { + int bitpos = -1; + /* +diff --git a/arch/x86/include/asm/boot.h b/arch/x86/include/asm/boot.h +index 4fa687a..60f2d39 100644 +--- a/arch/x86/include/asm/boot.h ++++ b/arch/x86/include/asm/boot.h +@@ -6,10 +6,15 @@ + #include <uapi/asm/boot.h> + + /* Physical address where kernel should be loaded. */ +-#define LOAD_PHYSICAL_ADDR ((CONFIG_PHYSICAL_START \ ++#define ____LOAD_PHYSICAL_ADDR ((CONFIG_PHYSICAL_START \ + + (CONFIG_PHYSICAL_ALIGN - 1)) \ + & ~(CONFIG_PHYSICAL_ALIGN - 1)) + ++#ifndef __ASSEMBLY__ ++extern unsigned char __LOAD_PHYSICAL_ADDR[]; ++#define LOAD_PHYSICAL_ADDR ((unsigned long)__LOAD_PHYSICAL_ADDR) ++#endif ++ + /* Minimum kernel alignment, as a power of two */ + #ifdef CONFIG_X86_64 + #define MIN_KERNEL_ALIGN_LG2 PMD_SHIFT +diff --git a/arch/x86/include/asm/cache.h b/arch/x86/include/asm/cache.h +index 48f99f1..d78ebf9 100644 +--- a/arch/x86/include/asm/cache.h ++++ b/arch/x86/include/asm/cache.h +@@ -5,12 +5,13 @@ + + /* L1 cache line size */ + #define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_BYTES (_AC(1,UL) << L1_CACHE_SHIFT) + + #define __read_mostly __attribute__((__section__(".data..read_mostly"))) ++#define __read_only __attribute__((__section__(".data..read_only"))) + + #define INTERNODE_CACHE_SHIFT CONFIG_X86_INTERNODE_CACHE_SHIFT +-#define INTERNODE_CACHE_BYTES (1 << INTERNODE_CACHE_SHIFT) ++#define INTERNODE_CACHE_BYTES (_AC(1,UL) << INTERNODE_CACHE_SHIFT) + + #ifdef CONFIG_X86_VSMP + #ifdef CONFIG_SMP +diff --git a/arch/x86/include/asm/cacheflush.h b/arch/x86/include/asm/cacheflush.h +index 9863ee3..4a1f8e1 100644 +--- a/arch/x86/include/asm/cacheflush.h ++++ b/arch/x86/include/asm/cacheflush.h +@@ -27,7 +27,7 @@ static inline unsigned long get_page_memtype(struct page *pg) + unsigned long pg_flags = pg->flags & _PGMT_MASK; + + if (pg_flags == _PGMT_DEFAULT) +- return -1; ++ return ~0UL; + else if (pg_flags == _PGMT_WC) + return _PAGE_CACHE_WC; + else if (pg_flags == _PGMT_UC_MINUS) +diff --git a/arch/x86/include/asm/calling.h b/arch/x86/include/asm/calling.h +index 76659b6..72b8439 100644 +--- a/arch/x86/include/asm/calling.h ++++ b/arch/x86/include/asm/calling.h +@@ -82,107 +82,117 @@ For 32-bit we have the following conventions - kernel is built with + #define RSP 152 + #define SS 160 + +-#define ARGOFFSET R11 +-#define SWFRAME ORIG_RAX ++#define ARGOFFSET R15 + + .macro SAVE_ARGS addskip=0, save_rcx=1, save_r891011=1, rax_enosys=0 +- subq $9*8+\addskip, %rsp +- CFI_ADJUST_CFA_OFFSET 9*8+\addskip +- movq_cfi rdi, 8*8 +- movq_cfi rsi, 7*8 +- movq_cfi rdx, 6*8 ++ subq $ORIG_RAX-ARGOFFSET+\addskip, %rsp ++ CFI_ADJUST_CFA_OFFSET ORIG_RAX-ARGOFFSET+\addskip ++ movq_cfi rdi, RDI ++ movq_cfi rsi, RSI ++ movq_cfi rdx, RDX + + .if \save_rcx +- movq_cfi rcx, 5*8 ++ movq_cfi rcx, RCX + .endif + + .if \rax_enosys +- movq $-ENOSYS, 4*8(%rsp) ++ movq $-ENOSYS, RAX(%rsp) + .else +- movq_cfi rax, 4*8 ++ movq_cfi rax, RAX + .endif + + .if \save_r891011 +- movq_cfi r8, 3*8 +- movq_cfi r9, 2*8 +- movq_cfi r10, 1*8 +- movq_cfi r11, 0*8 ++ movq_cfi r8, R8 ++ movq_cfi r9, R9 ++ movq_cfi r10, R10 ++ movq_cfi r11, R11 + .endif + ++#ifdef CONFIG_PAX_KERNEXEC_PLUGIN_METHOD_OR ++ movq_cfi r12, R12 ++#endif ++ + .endm + +-#define ARG_SKIP (9*8) ++#define ARG_SKIP ORIG_RAX + + .macro RESTORE_ARGS rstor_rax=1, addskip=0, rstor_rcx=1, rstor_r11=1, \ + rstor_r8910=1, rstor_rdx=1 ++ ++#ifdef CONFIG_PAX_KERNEXEC_PLUGIN_METHOD_OR ++ movq_cfi_restore R12, r12 ++#endif ++ + .if \rstor_r11 +- movq_cfi_restore 0*8, r11 ++ movq_cfi_restore R11, r11 + .endif + + .if \rstor_r8910 +- movq_cfi_restore 1*8, r10 +- movq_cfi_restore 2*8, r9 +- movq_cfi_restore 3*8, r8 ++ movq_cfi_restore R10, r10 ++ movq_cfi_restore R9, r9 ++ movq_cfi_restore R8, r8 + .endif + + .if \rstor_rax +- movq_cfi_restore 4*8, rax ++ movq_cfi_restore RAX, rax + .endif + + .if \rstor_rcx +- movq_cfi_restore 5*8, rcx ++ movq_cfi_restore RCX, rcx + .endif + + .if \rstor_rdx +- movq_cfi_restore 6*8, rdx ++ movq_cfi_restore RDX, rdx + .endif + +- movq_cfi_restore 7*8, rsi +- movq_cfi_restore 8*8, rdi ++ movq_cfi_restore RSI, rsi ++ movq_cfi_restore RDI, rdi + +- .if ARG_SKIP+\addskip > 0 +- addq $ARG_SKIP+\addskip, %rsp +- CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip) ++ .if ORIG_RAX+\addskip > 0 ++ addq $ORIG_RAX+\addskip, %rsp ++ CFI_ADJUST_CFA_OFFSET -(ORIG_RAX+\addskip) + .endif + .endm + +- .macro LOAD_ARGS offset, skiprax=0 +- movq \offset(%rsp), %r11 +- movq \offset+8(%rsp), %r10 +- movq \offset+16(%rsp), %r9 +- movq \offset+24(%rsp), %r8 +- movq \offset+40(%rsp), %rcx +- movq \offset+48(%rsp), %rdx +- movq \offset+56(%rsp), %rsi +- movq \offset+64(%rsp), %rdi ++ .macro LOAD_ARGS skiprax=0 ++ movq R11(%rsp), %r11 ++ movq R10(%rsp), %r10 ++ movq R9(%rsp), %r9 ++ movq R8(%rsp), %r8 ++ movq RCX(%rsp), %rcx ++ movq RDX(%rsp), %rdx ++ movq RSI(%rsp), %rsi ++ movq RDI(%rsp), %rdi + .if \skiprax + .else +- movq \offset+72(%rsp), %rax ++ movq ORIG_RAX(%rsp), %rax + .endif + .endm + +-#define REST_SKIP (6*8) +- + .macro SAVE_REST +- subq $REST_SKIP, %rsp +- CFI_ADJUST_CFA_OFFSET REST_SKIP +- movq_cfi rbx, 5*8 +- movq_cfi rbp, 4*8 +- movq_cfi r12, 3*8 +- movq_cfi r13, 2*8 +- movq_cfi r14, 1*8 +- movq_cfi r15, 0*8 ++ movq_cfi rbx, RBX ++ movq_cfi rbp, RBP ++ ++#ifndef CONFIG_PAX_KERNEXEC_PLUGIN_METHOD_OR ++ movq_cfi r12, R12 ++#endif ++ ++ movq_cfi r13, R13 ++ movq_cfi r14, R14 ++ movq_cfi r15, R15 + .endm + + .macro RESTORE_REST +- movq_cfi_restore 0*8, r15 +- movq_cfi_restore 1*8, r14 +- movq_cfi_restore 2*8, r13 +- movq_cfi_restore 3*8, r12 +- movq_cfi_restore 4*8, rbp +- movq_cfi_restore 5*8, rbx +- addq $REST_SKIP, %rsp +- CFI_ADJUST_CFA_OFFSET -(REST_SKIP) ++ movq_cfi_restore R15, r15 ++ movq_cfi_restore R14, r14 ++ movq_cfi_restore R13, r13 ++ ++#ifndef CONFIG_PAX_KERNEXEC_PLUGIN_METHOD_OR ++ movq_cfi_restore R12, r12 ++#endif ++ ++ movq_cfi_restore RBP, rbp ++ movq_cfi_restore RBX, rbx + .endm + + .macro SAVE_ALL +diff --git a/arch/x86/include/asm/checksum_32.h b/arch/x86/include/asm/checksum_32.h +index f50de69..2b0a458 100644 +--- a/arch/x86/include/asm/checksum_32.h ++++ b/arch/x86/include/asm/checksum_32.h +@@ -31,6 +31,14 @@ asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, + int len, __wsum sum, + int *src_err_ptr, int *dst_err_ptr); + ++asmlinkage __wsum csum_partial_copy_generic_to_user(const void *src, void *dst, ++ int len, __wsum sum, ++ int *src_err_ptr, int *dst_err_ptr); ++ ++asmlinkage __wsum csum_partial_copy_generic_from_user(const void *src, void *dst, ++ int len, __wsum sum, ++ int *src_err_ptr, int *dst_err_ptr); ++ + /* + * Note: when you get a NULL pointer exception here this means someone + * passed in an incorrect kernel address to one of these functions. +@@ -53,7 +61,7 @@ static inline __wsum csum_partial_copy_from_user(const void __user *src, + + might_sleep(); + stac(); +- ret = csum_partial_copy_generic((__force void *)src, dst, ++ ret = csum_partial_copy_generic_from_user((__force void *)src, dst, + len, sum, err_ptr, NULL); + clac(); + +@@ -187,7 +195,7 @@ static inline __wsum csum_and_copy_to_user(const void *src, + might_sleep(); + if (access_ok(VERIFY_WRITE, dst, len)) { + stac(); +- ret = csum_partial_copy_generic(src, (__force void *)dst, ++ ret = csum_partial_copy_generic_to_user(src, (__force void *)dst, + len, sum, NULL, err_ptr); + clac(); + return ret; +diff --git a/arch/x86/include/asm/cmpxchg.h b/arch/x86/include/asm/cmpxchg.h +index 99c105d7..2f667ac 100644 +--- a/arch/x86/include/asm/cmpxchg.h ++++ b/arch/x86/include/asm/cmpxchg.h +@@ -16,8 +16,12 @@ extern void __cmpxchg_wrong_size(void) + __compiletime_error("Bad argument size for cmpxchg"); + extern void __xadd_wrong_size(void) + __compiletime_error("Bad argument size for xadd"); ++extern void __xadd_check_overflow_wrong_size(void) ++ __compiletime_error("Bad argument size for xadd_check_overflow"); + extern void __add_wrong_size(void) + __compiletime_error("Bad argument size for add"); ++extern void __add_check_overflow_wrong_size(void) ++ __compiletime_error("Bad argument size for add_check_overflow"); + + /* + * Constants for operation sizes. On 32-bit, the 64-bit size it set to +@@ -69,6 +73,38 @@ extern void __add_wrong_size(void) + __ret; \ + }) + ++#ifdef CONFIG_PAX_REFCOUNT ++#define __xchg_op_check_overflow(ptr, arg, op, lock) \ ++ ({ \ ++ __typeof__ (*(ptr)) __ret = (arg); \ ++ switch (sizeof(*(ptr))) { \ ++ case __X86_CASE_L: \ ++ asm volatile (lock #op "l %0, %1\n" \ ++ "jno 0f\n" \ ++ "mov %0,%1\n" \ ++ "int $4\n0:\n" \ ++ _ASM_EXTABLE(0b, 0b) \ ++ : "+r" (__ret), "+m" (*(ptr)) \ ++ : : "memory", "cc"); \ ++ break; \ ++ case __X86_CASE_Q: \ ++ asm volatile (lock #op "q %q0, %1\n" \ ++ "jno 0f\n" \ ++ "mov %0,%1\n" \ ++ "int $4\n0:\n" \ ++ _ASM_EXTABLE(0b, 0b) \ ++ : "+r" (__ret), "+m" (*(ptr)) \ ++ : : "memory", "cc"); \ ++ break; \ ++ default: \ ++ __ ## op ## _check_overflow_wrong_size(); \ ++ } \ ++ __ret; \ ++ }) ++#else ++#define __xchg_op_check_overflow(ptr, arg, op, lock) __xchg_op(ptr, arg, op, lock) ++#endif ++ + /* + * Note: no "lock" prefix even on SMP: xchg always implies lock anyway. + * Since this is generally used to protect other memory information, we +@@ -167,6 +203,9 @@ extern void __add_wrong_size(void) + #define xadd_sync(ptr, inc) __xadd((ptr), (inc), "lock; ") + #define xadd_local(ptr, inc) __xadd((ptr), (inc), "") + ++#define __xadd_check_overflow(ptr, inc, lock) __xchg_op_check_overflow((ptr), (inc), xadd, lock) ++#define xadd_check_overflow(ptr, inc) __xadd_check_overflow((ptr), (inc), LOCK_PREFIX) ++ + #define __add(ptr, inc, lock) \ + ({ \ + __typeof__ (*(ptr)) __ret = (inc); \ +diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h +index 59c6c40..5e0b22c 100644 +--- a/arch/x86/include/asm/compat.h ++++ b/arch/x86/include/asm/compat.h +@@ -41,7 +41,7 @@ typedef s64 __attribute__((aligned(4))) compat_s64; + typedef u32 compat_uint_t; + typedef u32 compat_ulong_t; + typedef u64 __attribute__((aligned(4))) compat_u64; +-typedef u32 compat_uptr_t; ++typedef u32 __user compat_uptr_t; + + struct compat_timespec { + compat_time_t tv_sec; +diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h +index 0bb1335..8f1aec7 100644 +--- a/arch/x86/include/asm/cpufeature.h ++++ b/arch/x86/include/asm/cpufeature.h +@@ -207,7 +207,7 @@ + #define X86_FEATURE_PAUSEFILTER ( 8*32+13) /* AMD filtered pause intercept */ + #define X86_FEATURE_PFTHRESHOLD ( 8*32+14) /* AMD pause filter threshold */ + #define X86_FEATURE_VMMCALL ( 8*32+15) /* Prefer vmmcall to vmcall */ +- ++#define X86_FEATURE_STRONGUDEREF (8*32+31) /* PaX PCID based strong UDEREF */ + + /* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx), word 9 */ + #define X86_FEATURE_FSGSBASE ( 9*32+ 0) /* {RD/WR}{FS/GS}BASE instructions*/ +@@ -215,7 +215,7 @@ + #define X86_FEATURE_BMI1 ( 9*32+ 3) /* 1st group bit manipulation extensions */ + #define X86_FEATURE_HLE ( 9*32+ 4) /* Hardware Lock Elision */ + #define X86_FEATURE_AVX2 ( 9*32+ 5) /* AVX2 instructions */ +-#define X86_FEATURE_SMEP ( 9*32+ 7) /* Supervisor Mode Execution Protection */ ++#define X86_FEATURE_SMEP ( 9*32+ 7) /* Supervisor Mode Execution Prevention */ + #define X86_FEATURE_BMI2 ( 9*32+ 8) /* 2nd group bit manipulation extensions */ + #define X86_FEATURE_ERMS ( 9*32+ 9) /* Enhanced REP MOVSB/STOSB */ + #define X86_FEATURE_INVPCID ( 9*32+10) /* Invalidate Processor Context ID */ +@@ -383,6 +383,7 @@ extern const char * const x86_bug_flags[NBUGINTS*32]; + #define cpu_has_cx16 boot_cpu_has(X86_FEATURE_CX16) + #define cpu_has_eager_fpu boot_cpu_has(X86_FEATURE_EAGER_FPU) + #define cpu_has_topoext boot_cpu_has(X86_FEATURE_TOPOEXT) ++#define cpu_has_pcid boot_cpu_has(X86_FEATURE_PCID) + + #if __GNUC__ >= 4 + extern void warn_pre_alternatives(void); +@@ -434,7 +435,8 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) + + #ifdef CONFIG_X86_DEBUG_STATIC_CPU_HAS + t_warn: +- warn_pre_alternatives(); ++ if (bit != X86_FEATURE_PCID && bit != X86_FEATURE_INVPCID) ++ warn_pre_alternatives(); + return false; + #endif + +@@ -454,7 +456,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit) + ".section .discard,\"aw\",@progbits\n" + " .byte 0xff + (4f-3f) - (2b-1b)\n" /* size check */ + ".previous\n" +- ".section .altinstr_replacement,\"ax\"\n" ++ ".section .altinstr_replacement,\"a\"\n" + "3: movb $1,%0\n" + "4:\n" + ".previous\n" +@@ -491,7 +493,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit) + " .byte 2b - 1b\n" /* src len */ + " .byte 4f - 3f\n" /* repl len */ + ".previous\n" +- ".section .altinstr_replacement,\"ax\"\n" ++ ".section .altinstr_replacement,\"a\"\n" + "3: .byte 0xe9\n .long %l[t_no] - 2b\n" + "4:\n" + ".previous\n" +@@ -524,7 +526,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit) + ".section .discard,\"aw\",@progbits\n" + " .byte 0xff + (4f-3f) - (2b-1b)\n" /* size check */ + ".previous\n" +- ".section .altinstr_replacement,\"ax\"\n" ++ ".section .altinstr_replacement,\"a\"\n" + "3: movb $0,%0\n" + "4:\n" + ".previous\n" +@@ -538,7 +540,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit) + ".section .discard,\"aw\",@progbits\n" + " .byte 0xff + (6f-5f) - (4b-3b)\n" /* size check */ + ".previous\n" +- ".section .altinstr_replacement,\"ax\"\n" ++ ".section .altinstr_replacement,\"a\"\n" + "5: movb $1,%0\n" + "6:\n" + ".previous\n" +diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h +index a94b82e..59ecefa 100644 +--- a/arch/x86/include/asm/desc.h ++++ b/arch/x86/include/asm/desc.h +@@ -4,6 +4,7 @@ + #include <asm/desc_defs.h> + #include <asm/ldt.h> + #include <asm/mmu.h> ++#include <asm/pgtable.h> + + #include <linux/smp.h> + #include <linux/percpu.h> +@@ -17,6 +18,7 @@ static inline void fill_ldt(struct desc_struct *desc, const struct user_desc *in + + desc->type = (info->read_exec_only ^ 1) << 1; + desc->type |= info->contents << 2; ++ desc->type |= info->seg_not_present ^ 1; + + desc->s = 1; + desc->dpl = 0x3; +@@ -35,19 +37,14 @@ static inline void fill_ldt(struct desc_struct *desc, const struct user_desc *in + } + + extern struct desc_ptr idt_descr; +-extern gate_desc idt_table[]; +-extern struct desc_ptr debug_idt_descr; +-extern gate_desc debug_idt_table[]; +- +-struct gdt_page { +- struct desc_struct gdt[GDT_ENTRIES]; +-} __attribute__((aligned(PAGE_SIZE))); +- +-DECLARE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page); ++extern gate_desc idt_table[IDT_ENTRIES]; ++extern const struct desc_ptr debug_idt_descr; ++extern gate_desc debug_idt_table[IDT_ENTRIES]; + ++extern struct desc_struct cpu_gdt_table[NR_CPUS][PAGE_SIZE / sizeof(struct desc_struct)]; + static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu) + { +- return per_cpu(gdt_page, cpu).gdt; ++ return cpu_gdt_table[cpu]; + } + + #ifdef CONFIG_X86_64 +@@ -72,8 +69,14 @@ static inline void pack_gate(gate_desc *gate, unsigned char type, + unsigned long base, unsigned dpl, unsigned flags, + unsigned short seg) + { +- gate->a = (seg << 16) | (base & 0xffff); +- gate->b = (base & 0xffff0000) | (((0x80 | type | (dpl << 5)) & 0xff) << 8); ++ gate->gate.offset_low = base; ++ gate->gate.seg = seg; ++ gate->gate.reserved = 0; ++ gate->gate.type = type; ++ gate->gate.s = 0; ++ gate->gate.dpl = dpl; ++ gate->gate.p = 1; ++ gate->gate.offset_high = base >> 16; + } + + #endif +@@ -118,12 +121,16 @@ static inline void paravirt_free_ldt(struct desc_struct *ldt, unsigned entries) + + static inline void native_write_idt_entry(gate_desc *idt, int entry, const gate_desc *gate) + { ++ pax_open_kernel(); + memcpy(&idt[entry], gate, sizeof(*gate)); ++ pax_close_kernel(); + } + + static inline void native_write_ldt_entry(struct desc_struct *ldt, int entry, const void *desc) + { ++ pax_open_kernel(); + memcpy(&ldt[entry], desc, 8); ++ pax_close_kernel(); + } + + static inline void +@@ -137,7 +144,9 @@ native_write_gdt_entry(struct desc_struct *gdt, int entry, const void *desc, int + default: size = sizeof(*gdt); break; + } + ++ pax_open_kernel(); + memcpy(&gdt[entry], desc, size); ++ pax_close_kernel(); + } + + static inline void pack_descriptor(struct desc_struct *desc, unsigned long base, +@@ -210,7 +219,9 @@ static inline void native_set_ldt(const void *addr, unsigned int entries) + + static inline void native_load_tr_desc(void) + { ++ pax_open_kernel(); + asm volatile("ltr %w0"::"q" (GDT_ENTRY_TSS*8)); ++ pax_close_kernel(); + } + + static inline void native_load_gdt(const struct desc_ptr *dtr) +@@ -247,8 +258,10 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) + struct desc_struct *gdt = get_cpu_gdt_table(cpu); + unsigned int i; + ++ pax_open_kernel(); + for (i = 0; i < GDT_ENTRY_TLS_ENTRIES; i++) + gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; ++ pax_close_kernel(); + } + + /* This intentionally ignores lm, since 32-bit apps don't have that field. */ +@@ -295,7 +308,7 @@ static inline void load_LDT(mm_context_t *pc) + preempt_enable(); + } + +-static inline unsigned long get_desc_base(const struct desc_struct *desc) ++static inline unsigned long __intentional_overflow(-1) get_desc_base(const struct desc_struct *desc) + { + return (unsigned)(desc->base0 | ((desc->base1) << 16) | ((desc->base2) << 24)); + } +@@ -319,7 +332,7 @@ static inline void set_desc_limit(struct desc_struct *desc, unsigned long limit) + } + + #ifdef CONFIG_X86_64 +-static inline void set_nmi_gate(int gate, void *addr) ++static inline void set_nmi_gate(int gate, const void *addr) + { + gate_desc s; + +@@ -329,14 +342,14 @@ static inline void set_nmi_gate(int gate, void *addr) + #endif + + #ifdef CONFIG_TRACING +-extern struct desc_ptr trace_idt_descr; +-extern gate_desc trace_idt_table[]; ++extern const struct desc_ptr trace_idt_descr; ++extern gate_desc trace_idt_table[IDT_ENTRIES]; + static inline void write_trace_idt_entry(int entry, const gate_desc *gate) + { + write_idt_entry(trace_idt_table, entry, gate); + } + +-static inline void _trace_set_gate(int gate, unsigned type, void *addr, ++static inline void _trace_set_gate(int gate, unsigned type, const void *addr, + unsigned dpl, unsigned ist, unsigned seg) + { + gate_desc s; +@@ -356,7 +369,7 @@ static inline void write_trace_idt_entry(int entry, const gate_desc *gate) + #define _trace_set_gate(gate, type, addr, dpl, ist, seg) + #endif + +-static inline void _set_gate(int gate, unsigned type, void *addr, ++static inline void _set_gate(int gate, unsigned type, const void *addr, + unsigned dpl, unsigned ist, unsigned seg) + { + gate_desc s; +@@ -379,9 +392,9 @@ static inline void _set_gate(int gate, unsigned type, void *addr, + #define set_intr_gate(n, addr) \ + do { \ + BUG_ON((unsigned)n > 0xFF); \ +- _set_gate(n, GATE_INTERRUPT, (void *)addr, 0, 0, \ ++ _set_gate(n, GATE_INTERRUPT, (const void *)addr, 0, 0, \ + __KERNEL_CS); \ +- _trace_set_gate(n, GATE_INTERRUPT, (void *)trace_##addr,\ ++ _trace_set_gate(n, GATE_INTERRUPT, (const void *)trace_##addr,\ + 0, 0, __KERNEL_CS); \ + } while (0) + +@@ -409,19 +422,19 @@ static inline void alloc_system_vector(int vector) + /* + * This routine sets up an interrupt gate at directory privilege level 3. + */ +-static inline void set_system_intr_gate(unsigned int n, void *addr) ++static inline void set_system_intr_gate(unsigned int n, const void *addr) + { + BUG_ON((unsigned)n > 0xFF); + _set_gate(n, GATE_INTERRUPT, addr, 0x3, 0, __KERNEL_CS); + } + +-static inline void set_system_trap_gate(unsigned int n, void *addr) ++static inline void set_system_trap_gate(unsigned int n, const void *addr) + { + BUG_ON((unsigned)n > 0xFF); + _set_gate(n, GATE_TRAP, addr, 0x3, 0, __KERNEL_CS); + } + +-static inline void set_trap_gate(unsigned int n, void *addr) ++static inline void set_trap_gate(unsigned int n, const void *addr) + { + BUG_ON((unsigned)n > 0xFF); + _set_gate(n, GATE_TRAP, addr, 0, 0, __KERNEL_CS); +@@ -430,16 +443,16 @@ static inline void set_trap_gate(unsigned int n, void *addr) + static inline void set_task_gate(unsigned int n, unsigned int gdt_entry) + { + BUG_ON((unsigned)n > 0xFF); +- _set_gate(n, GATE_TASK, (void *)0, 0, 0, (gdt_entry<<3)); ++ _set_gate(n, GATE_TASK, (const void *)0, 0, 0, (gdt_entry<<3)); + } + +-static inline void set_intr_gate_ist(int n, void *addr, unsigned ist) ++static inline void set_intr_gate_ist(int n, const void *addr, unsigned ist) + { + BUG_ON((unsigned)n > 0xFF); + _set_gate(n, GATE_INTERRUPT, addr, 0, ist, __KERNEL_CS); + } + +-static inline void set_system_intr_gate_ist(int n, void *addr, unsigned ist) ++static inline void set_system_intr_gate_ist(int n, const void *addr, unsigned ist) + { + BUG_ON((unsigned)n > 0xFF); + _set_gate(n, GATE_INTERRUPT, addr, 0x3, ist, __KERNEL_CS); +@@ -511,4 +524,17 @@ static inline void load_current_idt(void) + else + load_idt((const struct desc_ptr *)&idt_descr); + } ++ ++#ifdef CONFIG_X86_32 ++static inline void set_user_cs(unsigned long base, unsigned long limit, int cpu) ++{ ++ struct desc_struct d; ++ ++ if (likely(limit)) ++ limit = (limit - 1UL) >> PAGE_SHIFT; ++ pack_descriptor(&d, base, limit, 0xFB, 0xC); ++ write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_DEFAULT_USER_CS, &d, DESCTYPE_S); ++} ++#endif ++ + #endif /* _ASM_X86_DESC_H */ +diff --git a/arch/x86/include/asm/desc_defs.h b/arch/x86/include/asm/desc_defs.h +index 278441f..b95a174 100644 +--- a/arch/x86/include/asm/desc_defs.h ++++ b/arch/x86/include/asm/desc_defs.h +@@ -31,6 +31,12 @@ struct desc_struct { + unsigned base1: 8, type: 4, s: 1, dpl: 2, p: 1; + unsigned limit: 4, avl: 1, l: 1, d: 1, g: 1, base2: 8; + }; ++ struct { ++ u16 offset_low; ++ u16 seg; ++ unsigned reserved: 8, type: 4, s: 1, dpl: 2, p: 1; ++ unsigned offset_high: 16; ++ } gate; + }; + } __attribute__((packed)); + +diff --git a/arch/x86/include/asm/div64.h b/arch/x86/include/asm/div64.h +index ced283a..ffe04cc 100644 +--- a/arch/x86/include/asm/div64.h ++++ b/arch/x86/include/asm/div64.h +@@ -39,7 +39,7 @@ + __mod; \ + }) + +-static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) ++static inline u64 __intentional_overflow(-1) div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) + { + union { + u64 v64; +diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h +index ca3347a..1a5082a 100644 +--- a/arch/x86/include/asm/elf.h ++++ b/arch/x86/include/asm/elf.h +@@ -75,9 +75,6 @@ typedef struct user_fxsr_struct elf_fpxregset_t; + + #include <asm/vdso.h> + +-#ifdef CONFIG_X86_64 +-extern unsigned int vdso64_enabled; +-#endif + #if defined(CONFIG_X86_32) || defined(CONFIG_COMPAT) + extern unsigned int vdso32_enabled; + #endif +@@ -249,7 +246,25 @@ extern int force_personality32; + the loader. We need to make sure that it is out of the way of the program + that it will "exec", and that there is sufficient room for the brk. */ + ++#ifdef CONFIG_PAX_SEGMEXEC ++#define ELF_ET_DYN_BASE ((current->mm->pax_flags & MF_PAX_SEGMEXEC) ? SEGMEXEC_TASK_SIZE/3*2 : TASK_SIZE/3*2) ++#else + #define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2) ++#endif ++ ++#ifdef CONFIG_PAX_ASLR ++#ifdef CONFIG_X86_32 ++#define PAX_ELF_ET_DYN_BASE 0x10000000UL ++ ++#define PAX_DELTA_MMAP_LEN (current->mm->pax_flags & MF_PAX_SEGMEXEC ? 15 : 16) ++#define PAX_DELTA_STACK_LEN (current->mm->pax_flags & MF_PAX_SEGMEXEC ? 15 : 16) ++#else ++#define PAX_ELF_ET_DYN_BASE 0x400000UL ++ ++#define PAX_DELTA_MMAP_LEN ((test_thread_flag(TIF_ADDR32)) ? 16 : TASK_SIZE_MAX_SHIFT - PAGE_SHIFT - 3) ++#define PAX_DELTA_STACK_LEN ((test_thread_flag(TIF_ADDR32)) ? 16 : TASK_SIZE_MAX_SHIFT - PAGE_SHIFT - 3) ++#endif ++#endif + + /* This yields a mask that user programs can use to figure out what + instruction set this CPU supports. This could be done in user space, +@@ -298,17 +313,13 @@ do { \ + + #define ARCH_DLINFO \ + do { \ +- if (vdso64_enabled) \ +- NEW_AUX_ENT(AT_SYSINFO_EHDR, \ +- (unsigned long __force)current->mm->context.vdso); \ ++ NEW_AUX_ENT(AT_SYSINFO_EHDR, current->mm->context.vdso); \ + } while (0) + + /* As a historical oddity, the x32 and x86_64 vDSOs are controlled together. */ + #define ARCH_DLINFO_X32 \ + do { \ +- if (vdso64_enabled) \ +- NEW_AUX_ENT(AT_SYSINFO_EHDR, \ +- (unsigned long __force)current->mm->context.vdso); \ ++ NEW_AUX_ENT(AT_SYSINFO_EHDR, current->mm->context.vdso); \ + } while (0) + + #define AT_SYSINFO 32 +@@ -323,10 +334,10 @@ else \ + + #endif /* !CONFIG_X86_32 */ + +-#define VDSO_CURRENT_BASE ((unsigned long)current->mm->context.vdso) ++#define VDSO_CURRENT_BASE (current->mm->context.vdso) + + #define VDSO_ENTRY \ +- ((unsigned long)current->mm->context.vdso + \ ++ (current->mm->context.vdso + \ + selected_vdso32->sym___kernel_vsyscall) + + struct linux_binprm; +@@ -338,9 +349,6 @@ extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm, + int uses_interp); + #define compat_arch_setup_additional_pages compat_arch_setup_additional_pages + +-extern unsigned long arch_randomize_brk(struct mm_struct *mm); +-#define arch_randomize_brk arch_randomize_brk +- + /* + * True on X86_32 or when emulating IA32 on X86_64 + */ +diff --git a/arch/x86/include/asm/emergency-restart.h b/arch/x86/include/asm/emergency-restart.h +index 77a99ac..39ff7f5 100644 +--- a/arch/x86/include/asm/emergency-restart.h ++++ b/arch/x86/include/asm/emergency-restart.h +@@ -1,6 +1,6 @@ + #ifndef _ASM_X86_EMERGENCY_RESTART_H + #define _ASM_X86_EMERGENCY_RESTART_H + +-extern void machine_emergency_restart(void); ++extern void machine_emergency_restart(void) __noreturn; + + #endif /* _ASM_X86_EMERGENCY_RESTART_H */ +diff --git a/arch/x86/include/asm/floppy.h b/arch/x86/include/asm/floppy.h +index 1c7eefe..d0e4702 100644 +--- a/arch/x86/include/asm/floppy.h ++++ b/arch/x86/include/asm/floppy.h +@@ -229,18 +229,18 @@ static struct fd_routine_l { + int (*_dma_setup)(char *addr, unsigned long size, int mode, int io); + } fd_routine[] = { + { +- request_dma, +- free_dma, +- get_dma_residue, +- dma_mem_alloc, +- hard_dma_setup ++ ._request_dma = request_dma, ++ ._free_dma = free_dma, ++ ._get_dma_residue = get_dma_residue, ++ ._dma_mem_alloc = dma_mem_alloc, ++ ._dma_setup = hard_dma_setup + }, + { +- vdma_request_dma, +- vdma_nop, +- vdma_get_dma_residue, +- vdma_mem_alloc, +- vdma_dma_setup ++ ._request_dma = vdma_request_dma, ++ ._free_dma = vdma_nop, ++ ._get_dma_residue = vdma_get_dma_residue, ++ ._dma_mem_alloc = vdma_mem_alloc, ++ ._dma_setup = vdma_dma_setup + } + }; + +diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h +index f895358..800c60d 100644 +--- a/arch/x86/include/asm/fpu-internal.h ++++ b/arch/x86/include/asm/fpu-internal.h +@@ -124,8 +124,11 @@ static inline void sanitize_i387_state(struct task_struct *tsk) + #define user_insn(insn, output, input...) \ + ({ \ + int err; \ ++ pax_open_userland(); \ + asm volatile(ASM_STAC "\n" \ +- "1:" #insn "\n\t" \ ++ "1:" \ ++ __copyuser_seg \ ++ #insn "\n\t" \ + "2: " ASM_CLAC "\n" \ + ".section .fixup,\"ax\"\n" \ + "3: movl $-1,%[err]\n" \ +@@ -134,6 +137,7 @@ static inline void sanitize_i387_state(struct task_struct *tsk) + _ASM_EXTABLE(1b, 3b) \ + : [err] "=r" (err), output \ + : "0"(0), input); \ ++ pax_close_userland(); \ + err; \ + }) + +@@ -298,7 +302,7 @@ static inline int restore_fpu_checking(struct task_struct *tsk) + "fnclex\n\t" + "emms\n\t" + "fildl %P[addr]" /* set F?P to defined value */ +- : : [addr] "m" (tsk->thread.fpu.has_fpu)); ++ : : [addr] "m" (init_tss[raw_smp_processor_id()].x86_tss.sp0)); + } + + return fpu_restore_checking(&tsk->thread.fpu); +diff --git a/arch/x86/include/asm/futex.h b/arch/x86/include/asm/futex.h +index b4c1f54..e290c08 100644 +--- a/arch/x86/include/asm/futex.h ++++ b/arch/x86/include/asm/futex.h +@@ -12,6 +12,7 @@ + #include <asm/smap.h> + + #define __futex_atomic_op1(insn, ret, oldval, uaddr, oparg) \ ++ typecheck(u32 __user *, uaddr); \ + asm volatile("\t" ASM_STAC "\n" \ + "1:\t" insn "\n" \ + "2:\t" ASM_CLAC "\n" \ +@@ -20,15 +21,16 @@ + "\tjmp\t2b\n" \ + "\t.previous\n" \ + _ASM_EXTABLE(1b, 3b) \ +- : "=r" (oldval), "=r" (ret), "+m" (*uaddr) \ ++ : "=r" (oldval), "=r" (ret), "+m" (*(u32 __user *)____m(uaddr)) \ + : "i" (-EFAULT), "0" (oparg), "1" (0)) + + #define __futex_atomic_op2(insn, ret, oldval, uaddr, oparg) \ ++ typecheck(u32 __user *, uaddr); \ + asm volatile("\t" ASM_STAC "\n" \ + "1:\tmovl %2, %0\n" \ + "\tmovl\t%0, %3\n" \ + "\t" insn "\n" \ +- "2:\t" LOCK_PREFIX "cmpxchgl %3, %2\n" \ ++ "2:\t" LOCK_PREFIX __copyuser_seg"cmpxchgl %3, %2\n" \ + "\tjnz\t1b\n" \ + "3:\t" ASM_CLAC "\n" \ + "\t.section .fixup,\"ax\"\n" \ +@@ -38,7 +40,7 @@ + _ASM_EXTABLE(1b, 4b) \ + _ASM_EXTABLE(2b, 4b) \ + : "=&a" (oldval), "=&r" (ret), \ +- "+m" (*uaddr), "=&r" (tem) \ ++ "+m" (*(u32 __user *)____m(uaddr)), "=&r" (tem) \ + : "r" (oparg), "i" (-EFAULT), "1" (0)) + + static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) +@@ -57,12 +59,13 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) + + pagefault_disable(); + ++ pax_open_userland(); + switch (op) { + case FUTEX_OP_SET: +- __futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg); ++ __futex_atomic_op1(__copyuser_seg"xchgl %0, %2", ret, oldval, uaddr, oparg); + break; + case FUTEX_OP_ADD: +- __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval, ++ __futex_atomic_op1(LOCK_PREFIX __copyuser_seg"xaddl %0, %2", ret, oldval, + uaddr, oparg); + break; + case FUTEX_OP_OR: +@@ -77,6 +80,7 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) + default: + ret = -ENOSYS; + } ++ pax_close_userland(); + + pagefault_enable(); + +diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h +index 4615906..788c817 100644 +--- a/arch/x86/include/asm/hw_irq.h ++++ b/arch/x86/include/asm/hw_irq.h +@@ -164,8 +164,8 @@ extern void setup_ioapic_dest(void); + extern void enable_IO_APIC(void); + + /* Statistics */ +-extern atomic_t irq_err_count; +-extern atomic_t irq_mis_count; ++extern atomic_unchecked_t irq_err_count; ++extern atomic_unchecked_t irq_mis_count; + + /* EISA */ + extern void eisa_set_level_irq(unsigned int irq); +diff --git a/arch/x86/include/asm/i8259.h b/arch/x86/include/asm/i8259.h +index ccffa53..3c90c87 100644 +--- a/arch/x86/include/asm/i8259.h ++++ b/arch/x86/include/asm/i8259.h +@@ -62,7 +62,7 @@ struct legacy_pic { + void (*init)(int auto_eoi); + int (*irq_pending)(unsigned int irq); + void (*make_irq)(unsigned int irq); +-}; ++} __do_const; + + extern struct legacy_pic *legacy_pic; + extern struct legacy_pic null_legacy_pic; +diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h +index b8237d8..3e8864e 100644 +--- a/arch/x86/include/asm/io.h ++++ b/arch/x86/include/asm/io.h +@@ -52,12 +52,12 @@ static inline void name(type val, volatile void __iomem *addr) \ + "m" (*(volatile type __force *)addr) barrier); } + + build_mmio_read(readb, "b", unsigned char, "=q", :"memory") +-build_mmio_read(readw, "w", unsigned short, "=r", :"memory") +-build_mmio_read(readl, "l", unsigned int, "=r", :"memory") ++build_mmio_read(__intentional_overflow(-1) readw, "w", unsigned short, "=r", :"memory") ++build_mmio_read(__intentional_overflow(-1) readl, "l", unsigned int, "=r", :"memory") + + build_mmio_read(__readb, "b", unsigned char, "=q", ) +-build_mmio_read(__readw, "w", unsigned short, "=r", ) +-build_mmio_read(__readl, "l", unsigned int, "=r", ) ++build_mmio_read(__intentional_overflow(-1) __readw, "w", unsigned short, "=r", ) ++build_mmio_read(__intentional_overflow(-1) __readl, "l", unsigned int, "=r", ) + + build_mmio_write(writeb, "b", unsigned char, "q", :"memory") + build_mmio_write(writew, "w", unsigned short, "r", :"memory") +@@ -109,7 +109,7 @@ build_mmio_write(writeq, "q", unsigned long, "r", :"memory") + * this function + */ + +-static inline phys_addr_t virt_to_phys(volatile void *address) ++static inline phys_addr_t __intentional_overflow(-1) virt_to_phys(volatile void *address) + { + return __pa(address); + } +@@ -185,7 +185,7 @@ static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) + return ioremap_nocache(offset, size); + } + +-extern void iounmap(volatile void __iomem *addr); ++extern void iounmap(const volatile void __iomem *addr); + + extern void set_iounmap_nonlazy(void); + +@@ -195,6 +195,17 @@ extern void set_iounmap_nonlazy(void); + + #include <linux/vmalloc.h> + ++#define ARCH_HAS_VALID_PHYS_ADDR_RANGE ++static inline int valid_phys_addr_range(unsigned long addr, size_t count) ++{ ++ return ((addr + count + PAGE_SIZE - 1) >> PAGE_SHIFT) < (1ULL << (boot_cpu_data.x86_phys_bits - PAGE_SHIFT)) ? 1 : 0; ++} ++ ++static inline int valid_mmap_phys_addr_range(unsigned long pfn, size_t count) ++{ ++ return (pfn + (count >> PAGE_SHIFT)) < (1ULL << (boot_cpu_data.x86_phys_bits - PAGE_SHIFT)) ? 1 : 0; ++} ++ + /* + * Convert a virtual cached pointer to an uncached pointer + */ +diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h +index 0a8b519..80e7d5b 100644 +--- a/arch/x86/include/asm/irqflags.h ++++ b/arch/x86/include/asm/irqflags.h +@@ -141,6 +141,11 @@ static inline notrace unsigned long arch_local_irq_save(void) + sti; \ + sysexit + ++#define GET_CR0_INTO_RDI mov %cr0, %rdi ++#define SET_RDI_INTO_CR0 mov %rdi, %cr0 ++#define GET_CR3_INTO_RDI mov %cr3, %rdi ++#define SET_RDI_INTO_CR3 mov %rdi, %cr3 ++ + #else + #define INTERRUPT_RETURN iret + #define ENABLE_INTERRUPTS_SYSEXIT sti; sysexit +diff --git a/arch/x86/include/asm/kprobes.h b/arch/x86/include/asm/kprobes.h +index 4421b5d..8543006 100644 +--- a/arch/x86/include/asm/kprobes.h ++++ b/arch/x86/include/asm/kprobes.h +@@ -37,13 +37,8 @@ typedef u8 kprobe_opcode_t; + #define RELATIVEJUMP_SIZE 5 + #define RELATIVECALL_OPCODE 0xe8 + #define RELATIVE_ADDR_SIZE 4 +-#define MAX_STACK_SIZE 64 +-#define MIN_STACK_SIZE(ADDR) \ +- (((MAX_STACK_SIZE) < (((unsigned long)current_thread_info()) + \ +- THREAD_SIZE - (unsigned long)(ADDR))) \ +- ? (MAX_STACK_SIZE) \ +- : (((unsigned long)current_thread_info()) + \ +- THREAD_SIZE - (unsigned long)(ADDR))) ++#define MAX_STACK_SIZE 64UL ++#define MIN_STACK_SIZE(ADDR) min(MAX_STACK_SIZE, current->thread.sp0 - (unsigned long)(ADDR)) + + #define flush_insn_slot(p) do { } while (0) + +diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h +index 6ed0c30..74fb6c3 100644 +--- a/arch/x86/include/asm/kvm_host.h ++++ b/arch/x86/include/asm/kvm_host.h +@@ -51,6 +51,7 @@ + | X86_CR0_NW | X86_CR0_CD | X86_CR0_PG)) + + #define CR3_L_MODE_RESERVED_BITS 0xFFFFFF0000000000ULL ++#define CR3_PCID_INVD (1UL << 63) + #define CR4_RESERVED_BITS \ + (~(unsigned long)(X86_CR4_VME | X86_CR4_PVI | X86_CR4_TSD | X86_CR4_DE\ + | X86_CR4_PSE | X86_CR4_PAE | X86_CR4_MCE \ +diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h +index 4ad6560..75c7bdd 100644 +--- a/arch/x86/include/asm/local.h ++++ b/arch/x86/include/asm/local.h +@@ -10,33 +10,97 @@ typedef struct { + atomic_long_t a; + } local_t; + ++typedef struct { ++ atomic_long_unchecked_t a; ++} local_unchecked_t; ++ + #define LOCAL_INIT(i) { ATOMIC_LONG_INIT(i) } + + #define local_read(l) atomic_long_read(&(l)->a) ++#define local_read_unchecked(l) atomic_long_read_unchecked(&(l)->a) + #define local_set(l, i) atomic_long_set(&(l)->a, (i)) ++#define local_set_unchecked(l, i) atomic_long_set_unchecked(&(l)->a, (i)) + + static inline void local_inc(local_t *l) + { +- asm volatile(_ASM_INC "%0" ++ asm volatile(_ASM_INC "%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ _ASM_DEC "%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (l->a.counter)); ++} ++ ++static inline void local_inc_unchecked(local_unchecked_t *l) ++{ ++ asm volatile(_ASM_INC "%0\n" + : "+m" (l->a.counter)); + } + + static inline void local_dec(local_t *l) + { +- asm volatile(_ASM_DEC "%0" ++ asm volatile(_ASM_DEC "%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ _ASM_INC "%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (l->a.counter)); ++} ++ ++static inline void local_dec_unchecked(local_unchecked_t *l) ++{ ++ asm volatile(_ASM_DEC "%0\n" + : "+m" (l->a.counter)); + } + + static inline void local_add(long i, local_t *l) + { +- asm volatile(_ASM_ADD "%1,%0" ++ asm volatile(_ASM_ADD "%1,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ _ASM_SUB "%1,%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (l->a.counter) ++ : "ir" (i)); ++} ++ ++static inline void local_add_unchecked(long i, local_unchecked_t *l) ++{ ++ asm volatile(_ASM_ADD "%1,%0\n" + : "+m" (l->a.counter) + : "ir" (i)); + } + + static inline void local_sub(long i, local_t *l) + { +- asm volatile(_ASM_SUB "%1,%0" ++ asm volatile(_ASM_SUB "%1,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ _ASM_ADD "%1,%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+m" (l->a.counter) ++ : "ir" (i)); ++} ++ ++static inline void local_sub_unchecked(long i, local_unchecked_t *l) ++{ ++ asm volatile(_ASM_SUB "%1,%0\n" + : "+m" (l->a.counter) + : "ir" (i)); + } +@@ -52,7 +116,7 @@ static inline void local_sub(long i, local_t *l) + */ + static inline int local_sub_and_test(long i, local_t *l) + { +- GEN_BINARY_RMWcc(_ASM_SUB, l->a.counter, "er", i, "%0", "e"); ++ GEN_BINARY_RMWcc(_ASM_SUB, _ASM_ADD, l->a.counter, "er", i, "%0", "e"); + } + + /** +@@ -65,7 +129,7 @@ static inline int local_sub_and_test(long i, local_t *l) + */ + static inline int local_dec_and_test(local_t *l) + { +- GEN_UNARY_RMWcc(_ASM_DEC, l->a.counter, "%0", "e"); ++ GEN_UNARY_RMWcc(_ASM_DEC, _ASM_INC, l->a.counter, "%0", "e"); + } + + /** +@@ -78,7 +142,7 @@ static inline int local_dec_and_test(local_t *l) + */ + static inline int local_inc_and_test(local_t *l) + { +- GEN_UNARY_RMWcc(_ASM_INC, l->a.counter, "%0", "e"); ++ GEN_UNARY_RMWcc(_ASM_INC, _ASM_DEC, l->a.counter, "%0", "e"); + } + + /** +@@ -92,7 +156,7 @@ static inline int local_inc_and_test(local_t *l) + */ + static inline int local_add_negative(long i, local_t *l) + { +- GEN_BINARY_RMWcc(_ASM_ADD, l->a.counter, "er", i, "%0", "s"); ++ GEN_BINARY_RMWcc(_ASM_ADD, _ASM_SUB, l->a.counter, "er", i, "%0", "s"); + } + + /** +@@ -105,6 +169,30 @@ static inline int local_add_negative(long i, local_t *l) + static inline long local_add_return(long i, local_t *l) + { + long __i = i; ++ asm volatile(_ASM_XADD "%0, %1\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ _ASM_MOV "%0,%1\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++ : "+r" (i), "+m" (l->a.counter) ++ : : "memory"); ++ return i + __i; ++} ++ ++/** ++ * local_add_return_unchecked - add and return ++ * @i: integer value to add ++ * @l: pointer to type local_unchecked_t ++ * ++ * Atomically adds @i to @l and returns @i + @l ++ */ ++static inline long local_add_return_unchecked(long i, local_unchecked_t *l) ++{ ++ long __i = i; + asm volatile(_ASM_XADD "%0, %1;" + : "+r" (i), "+m" (l->a.counter) + : : "memory"); +@@ -121,6 +209,8 @@ static inline long local_sub_return(long i, local_t *l) + + #define local_cmpxchg(l, o, n) \ + (cmpxchg_local(&((l)->a.counter), (o), (n))) ++#define local_cmpxchg_unchecked(l, o, n) \ ++ (cmpxchg_local(&((l)->a.counter), (o), (n))) + /* Always has a lock prefix */ + #define local_xchg(l, n) (xchg(&((l)->a.counter), (n))) + +diff --git a/arch/x86/include/asm/mman.h b/arch/x86/include/asm/mman.h +new file mode 100644 +index 0000000..2bfd3ba +--- /dev/null ++++ b/arch/x86/include/asm/mman.h +@@ -0,0 +1,15 @@ ++#ifndef _X86_MMAN_H ++#define _X86_MMAN_H ++ ++#include <uapi/asm/mman.h> ++ ++#ifdef __KERNEL__ ++#ifndef __ASSEMBLY__ ++#ifdef CONFIG_X86_32 ++#define arch_mmap_check i386_mmap_check ++int i386_mmap_check(unsigned long addr, unsigned long len, unsigned long flags); ++#endif ++#endif ++#endif ++ ++#endif /* X86_MMAN_H */ +diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h +index 876e74e..e20bfb1 100644 +--- a/arch/x86/include/asm/mmu.h ++++ b/arch/x86/include/asm/mmu.h +@@ -9,7 +9,7 @@ + * we put the segment information here. + */ + typedef struct { +- void *ldt; ++ struct desc_struct *ldt; + int size; + + #ifdef CONFIG_X86_64 +@@ -18,7 +18,19 @@ typedef struct { + #endif + + struct mutex lock; +- void __user *vdso; ++ unsigned long vdso; ++ ++#ifdef CONFIG_X86_32 ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++ unsigned long user_cs_base; ++ unsigned long user_cs_limit; ++ ++#if defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_SMP) ++ cpumask_t cpu_user_cs_mask; ++#endif ++ ++#endif ++#endif + } mm_context_t; + + #ifdef CONFIG_SMP +diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h +index 166af2a..648c200 100644 +--- a/arch/x86/include/asm/mmu_context.h ++++ b/arch/x86/include/asm/mmu_context.h +@@ -28,6 +28,20 @@ void destroy_context(struct mm_struct *mm); + + static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) + { ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ if (!(static_cpu_has(X86_FEATURE_PCID))) { ++ unsigned int i; ++ pgd_t *pgd; ++ ++ pax_open_kernel(); ++ pgd = get_cpu_pgd(smp_processor_id(), kernel); ++ for (i = USER_PGD_PTRS; i < 2 * USER_PGD_PTRS; ++i) ++ set_pgd_batched(pgd+i, native_make_pgd(0)); ++ pax_close_kernel(); ++ } ++#endif ++ + #ifdef CONFIG_SMP + if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK) + this_cpu_write(cpu_tlbstate.state, TLBSTATE_LAZY); +@@ -38,16 +52,59 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, + struct task_struct *tsk) + { + unsigned cpu = smp_processor_id(); ++#if defined(CONFIG_X86_32) && defined(CONFIG_SMP) && (defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC)) ++ int tlbstate = TLBSTATE_OK; ++#endif + + if (likely(prev != next)) { + #ifdef CONFIG_SMP ++#if defined(CONFIG_X86_32) && (defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC)) ++ tlbstate = this_cpu_read(cpu_tlbstate.state); ++#endif + this_cpu_write(cpu_tlbstate.state, TLBSTATE_OK); + this_cpu_write(cpu_tlbstate.active_mm, next); + #endif + cpumask_set_cpu(cpu, mm_cpumask(next)); + + /* Re-load page tables */ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ pax_open_kernel(); ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ if (static_cpu_has(X86_FEATURE_PCID)) ++ __clone_user_pgds(get_cpu_pgd(cpu, user), next->pgd); ++ else ++#endif ++ ++ __clone_user_pgds(get_cpu_pgd(cpu, kernel), next->pgd); ++ __shadow_user_pgds(get_cpu_pgd(cpu, kernel) + USER_PGD_PTRS, next->pgd); ++ pax_close_kernel(); ++ BUG_ON((__pa(get_cpu_pgd(cpu, kernel)) | PCID_KERNEL) != (read_cr3() & __PHYSICAL_MASK) && (__pa(get_cpu_pgd(cpu, user)) | PCID_USER) != (read_cr3() & __PHYSICAL_MASK)); ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ if (static_cpu_has(X86_FEATURE_PCID)) { ++ if (static_cpu_has(X86_FEATURE_INVPCID)) { ++ u64 descriptor[2]; ++ descriptor[0] = PCID_USER; ++ asm volatile(__ASM_INVPCID : : "d"(&descriptor), "a"(INVPCID_SINGLE_CONTEXT) : "memory"); ++ if (!static_cpu_has(X86_FEATURE_STRONGUDEREF)) { ++ descriptor[0] = PCID_KERNEL; ++ asm volatile(__ASM_INVPCID : : "d"(&descriptor), "a"(INVPCID_SINGLE_CONTEXT) : "memory"); ++ } ++ } else { ++ write_cr3(__pa(get_cpu_pgd(cpu, user)) | PCID_USER); ++ if (static_cpu_has(X86_FEATURE_STRONGUDEREF)) ++ write_cr3(__pa(get_cpu_pgd(cpu, kernel)) | PCID_KERNEL | PCID_NOFLUSH); ++ else ++ write_cr3(__pa(get_cpu_pgd(cpu, kernel)) | PCID_KERNEL); ++ } ++ } else ++#endif ++ ++ load_cr3(get_cpu_pgd(cpu, kernel)); ++#else + load_cr3(next->pgd); ++#endif + trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH, TLB_FLUSH_ALL); + + /* Stop flush ipis for the previous mm */ +@@ -56,9 +113,67 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, + /* Load the LDT, if the LDT is different: */ + if (unlikely(prev->context.ldt != next->context.ldt)) + load_LDT_nolock(&next->context); ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_SMP) ++ if (!(__supported_pte_mask & _PAGE_NX)) { ++ smp_mb__before_atomic(); ++ cpu_clear(cpu, prev->context.cpu_user_cs_mask); ++ smp_mb__after_atomic(); ++ cpu_set(cpu, next->context.cpu_user_cs_mask); ++ } ++#endif ++ ++#if defined(CONFIG_X86_32) && (defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC)) ++ if (unlikely(prev->context.user_cs_base != next->context.user_cs_base || ++ prev->context.user_cs_limit != next->context.user_cs_limit)) ++ set_user_cs(next->context.user_cs_base, next->context.user_cs_limit, cpu); ++#ifdef CONFIG_SMP ++ else if (unlikely(tlbstate != TLBSTATE_OK)) ++ set_user_cs(next->context.user_cs_base, next->context.user_cs_limit, cpu); ++#endif ++#endif ++ + } ++ else { ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ pax_open_kernel(); ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ if (static_cpu_has(X86_FEATURE_PCID)) ++ __clone_user_pgds(get_cpu_pgd(cpu, user), next->pgd); ++ else ++#endif ++ ++ __clone_user_pgds(get_cpu_pgd(cpu, kernel), next->pgd); ++ __shadow_user_pgds(get_cpu_pgd(cpu, kernel) + USER_PGD_PTRS, next->pgd); ++ pax_close_kernel(); ++ BUG_ON((__pa(get_cpu_pgd(cpu, kernel)) | PCID_KERNEL) != (read_cr3() & __PHYSICAL_MASK) && (__pa(get_cpu_pgd(cpu, user)) | PCID_USER) != (read_cr3() & __PHYSICAL_MASK)); ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ if (static_cpu_has(X86_FEATURE_PCID)) { ++ if (static_cpu_has(X86_FEATURE_INVPCID)) { ++ u64 descriptor[2]; ++ descriptor[0] = PCID_USER; ++ asm volatile(__ASM_INVPCID : : "d"(&descriptor), "a"(INVPCID_SINGLE_CONTEXT) : "memory"); ++ if (!static_cpu_has(X86_FEATURE_STRONGUDEREF)) { ++ descriptor[0] = PCID_KERNEL; ++ asm volatile(__ASM_INVPCID : : "d"(&descriptor), "a"(INVPCID_SINGLE_CONTEXT) : "memory"); ++ } ++ } else { ++ write_cr3(__pa(get_cpu_pgd(cpu, user)) | PCID_USER); ++ if (static_cpu_has(X86_FEATURE_STRONGUDEREF)) ++ write_cr3(__pa(get_cpu_pgd(cpu, kernel)) | PCID_KERNEL | PCID_NOFLUSH); ++ else ++ write_cr3(__pa(get_cpu_pgd(cpu, kernel)) | PCID_KERNEL); ++ } ++ } else ++#endif ++ ++ load_cr3(get_cpu_pgd(cpu, kernel)); ++#endif ++ + #ifdef CONFIG_SMP +- else { + this_cpu_write(cpu_tlbstate.state, TLBSTATE_OK); + BUG_ON(this_cpu_read(cpu_tlbstate.active_mm) != next); + +@@ -75,12 +190,29 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, + * tlb flush IPI delivery. We must reload CR3 + * to make sure to use no freed page tables. + */ ++ ++#ifndef CONFIG_PAX_PER_CPU_PGD + load_cr3(next->pgd); + trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH, TLB_FLUSH_ALL); ++#endif ++ + load_LDT_nolock(&next->context); ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_PAGEEXEC) ++ if (!(__supported_pte_mask & _PAGE_NX)) ++ cpu_set(cpu, next->context.cpu_user_cs_mask); ++#endif ++ ++#if defined(CONFIG_X86_32) && (defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC)) ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!((next->pax_flags & MF_PAX_PAGEEXEC) && (__supported_pte_mask & _PAGE_NX))) ++#endif ++ set_user_cs(next->context.user_cs_base, next->context.user_cs_limit, cpu); ++#endif ++ + } +- } + #endif ++ } + } + + #define activate_mm(prev, next) \ +diff --git a/arch/x86/include/asm/module.h b/arch/x86/include/asm/module.h +index e3b7819..b257c64 100644 +--- a/arch/x86/include/asm/module.h ++++ b/arch/x86/include/asm/module.h +@@ -5,6 +5,7 @@ + + #ifdef CONFIG_X86_64 + /* X86_64 does not define MODULE_PROC_FAMILY */ ++#define MODULE_PROC_FAMILY "" + #elif defined CONFIG_M486 + #define MODULE_PROC_FAMILY "486 " + #elif defined CONFIG_M586 +@@ -57,8 +58,20 @@ + #error unknown processor family + #endif + +-#ifdef CONFIG_X86_32 +-# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY ++#ifdef CONFIG_PAX_KERNEXEC_PLUGIN_METHOD_BTS ++#define MODULE_PAX_KERNEXEC "KERNEXEC_BTS " ++#elif defined(CONFIG_PAX_KERNEXEC_PLUGIN_METHOD_OR) ++#define MODULE_PAX_KERNEXEC "KERNEXEC_OR " ++#else ++#define MODULE_PAX_KERNEXEC "" + #endif + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++#define MODULE_PAX_UDEREF "UDEREF " ++#else ++#define MODULE_PAX_UDEREF "" ++#endif ++ ++#define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_PAX_KERNEXEC MODULE_PAX_UDEREF ++ + #endif /* _ASM_X86_MODULE_H */ +diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h +index 5f2fc44..106caa6 100644 +--- a/arch/x86/include/asm/nmi.h ++++ b/arch/x86/include/asm/nmi.h +@@ -36,26 +36,35 @@ enum { + + typedef int (*nmi_handler_t)(unsigned int, struct pt_regs *); + ++struct nmiaction; ++ ++struct nmiwork { ++ const struct nmiaction *action; ++ u64 max_duration; ++ struct irq_work irq_work; ++}; ++ + struct nmiaction { + struct list_head list; + nmi_handler_t handler; +- u64 max_duration; +- struct irq_work irq_work; + unsigned long flags; + const char *name; +-}; ++ struct nmiwork *work; ++} __do_const; + + #define register_nmi_handler(t, fn, fg, n, init...) \ + ({ \ +- static struct nmiaction init fn##_na = { \ ++ static struct nmiwork fn##_nw; \ ++ static const struct nmiaction init fn##_na = { \ + .handler = (fn), \ + .name = (n), \ + .flags = (fg), \ ++ .work = &fn##_nw, \ + }; \ + __register_nmi_handler((t), &fn##_na); \ + }) + +-int __register_nmi_handler(unsigned int, struct nmiaction *); ++int __register_nmi_handler(unsigned int, const struct nmiaction *); + + void unregister_nmi_handler(unsigned int, const char *); + +diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h +index 802dde3..9183e68 100644 +--- a/arch/x86/include/asm/page.h ++++ b/arch/x86/include/asm/page.h +@@ -52,6 +52,7 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr, + __phys_addr_symbol(__phys_reloc_hide((unsigned long)(x))) + + #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) ++#define __early_va(x) ((void *)((unsigned long)(x)+__START_KERNEL_map - phys_base)) + + #define __boot_va(x) __va(x) + #define __boot_pa(x) __pa(x) +@@ -60,11 +61,21 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr, + * virt_to_page(kaddr) returns a valid pointer if and only if + * virt_addr_valid(kaddr) returns true. + */ +-#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) + #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) + extern bool __virt_addr_valid(unsigned long kaddr); + #define virt_addr_valid(kaddr) __virt_addr_valid((unsigned long) (kaddr)) + ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++#define virt_to_page(kaddr) \ ++ ({ \ ++ const void *__kaddr = (const void *)(kaddr); \ ++ BUG_ON(!virt_addr_valid(__kaddr)); \ ++ pfn_to_page(__pa(__kaddr) >> PAGE_SHIFT); \ ++ }) ++#else ++#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) ++#endif ++ + #endif /* __ASSEMBLY__ */ + + #include <asm-generic/memory_model.h> +diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h +index f408caf..59142b8 100644 +--- a/arch/x86/include/asm/page_64.h ++++ b/arch/x86/include/asm/page_64.h +@@ -7,9 +7,9 @@ + + /* duplicated to the one in bootmem.h */ + extern unsigned long max_pfn; +-extern unsigned long phys_base; ++extern const unsigned long phys_base; + +-static inline unsigned long __phys_addr_nodebug(unsigned long x) ++static inline unsigned long __intentional_overflow(-1) __phys_addr_nodebug(unsigned long x) + { + unsigned long y = x - __START_KERNEL_map; + +@@ -20,8 +20,8 @@ static inline unsigned long __phys_addr_nodebug(unsigned long x) + } + + #ifdef CONFIG_DEBUG_VIRTUAL +-extern unsigned long __phys_addr(unsigned long); +-extern unsigned long __phys_addr_symbol(unsigned long); ++extern unsigned long __intentional_overflow(-1) __phys_addr(unsigned long); ++extern unsigned long __intentional_overflow(-1) __phys_addr_symbol(unsigned long); + #else + #define __phys_addr(x) __phys_addr_nodebug(x) + #define __phys_addr_symbol(x) \ +diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h +index cd6e161..70f4418 100644 +--- a/arch/x86/include/asm/paravirt.h ++++ b/arch/x86/include/asm/paravirt.h +@@ -560,7 +560,7 @@ static inline pmd_t __pmd(pmdval_t val) + return (pmd_t) { ret }; + } + +-static inline pmdval_t pmd_val(pmd_t pmd) ++static inline __intentional_overflow(-1) pmdval_t pmd_val(pmd_t pmd) + { + pmdval_t ret; + +@@ -626,6 +626,18 @@ static inline void set_pgd(pgd_t *pgdp, pgd_t pgd) + val); + } + ++static inline void set_pgd_batched(pgd_t *pgdp, pgd_t pgd) ++{ ++ pgdval_t val = native_pgd_val(pgd); ++ ++ if (sizeof(pgdval_t) > sizeof(long)) ++ PVOP_VCALL3(pv_mmu_ops.set_pgd_batched, pgdp, ++ val, (u64)val >> 32); ++ else ++ PVOP_VCALL2(pv_mmu_ops.set_pgd_batched, pgdp, ++ val); ++} ++ + static inline void pgd_clear(pgd_t *pgdp) + { + set_pgd(pgdp, __pgd(0)); +@@ -710,6 +722,21 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, + pv_mmu_ops.set_fixmap(idx, phys, flags); + } + ++#ifdef CONFIG_PAX_KERNEXEC ++static inline unsigned long pax_open_kernel(void) ++{ ++ return PVOP_CALL0(unsigned long, pv_mmu_ops.pax_open_kernel); ++} ++ ++static inline unsigned long pax_close_kernel(void) ++{ ++ return PVOP_CALL0(unsigned long, pv_mmu_ops.pax_close_kernel); ++} ++#else ++static inline unsigned long pax_open_kernel(void) { return 0; } ++static inline unsigned long pax_close_kernel(void) { return 0; } ++#endif ++ + #if defined(CONFIG_SMP) && defined(CONFIG_PARAVIRT_SPINLOCKS) + + static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, +@@ -906,7 +933,7 @@ extern void default_banner(void); + + #define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 4) + #define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .long, 4) +-#define PARA_INDIRECT(addr) *%cs:addr ++#define PARA_INDIRECT(addr) *%ss:addr + #endif + + #define INTERRUPT_RETURN \ +@@ -981,6 +1008,21 @@ extern void default_banner(void); + PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_irq_enable_sysexit), \ + CLBR_NONE, \ + jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_irq_enable_sysexit)) ++ ++#define GET_CR0_INTO_RDI \ ++ call PARA_INDIRECT(pv_cpu_ops+PV_CPU_read_cr0); \ ++ mov %rax,%rdi ++ ++#define SET_RDI_INTO_CR0 \ ++ call PARA_INDIRECT(pv_cpu_ops+PV_CPU_write_cr0) ++ ++#define GET_CR3_INTO_RDI \ ++ call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr3); \ ++ mov %rax,%rdi ++ ++#define SET_RDI_INTO_CR3 \ ++ call PARA_INDIRECT(pv_mmu_ops+PV_MMU_write_cr3) ++ + #endif /* CONFIG_X86_32 */ + + #endif /* __ASSEMBLY__ */ +diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h +index 7549b8b..f0edfda 100644 +--- a/arch/x86/include/asm/paravirt_types.h ++++ b/arch/x86/include/asm/paravirt_types.h +@@ -84,7 +84,7 @@ struct pv_init_ops { + */ + unsigned (*patch)(u8 type, u16 clobber, void *insnbuf, + unsigned long addr, unsigned len); +-}; ++} __no_const __no_randomize_layout; + + + struct pv_lazy_ops { +@@ -92,13 +92,13 @@ struct pv_lazy_ops { + void (*enter)(void); + void (*leave)(void); + void (*flush)(void); +-}; ++} __no_randomize_layout; + + struct pv_time_ops { + unsigned long long (*sched_clock)(void); + unsigned long long (*steal_clock)(int cpu); + unsigned long (*get_tsc_khz)(void); +-}; ++} __no_const __no_randomize_layout; + + struct pv_cpu_ops { + /* hooks for various privileged instructions */ +@@ -192,7 +192,7 @@ struct pv_cpu_ops { + + void (*start_context_switch)(struct task_struct *prev); + void (*end_context_switch)(struct task_struct *next); +-}; ++} __no_const __no_randomize_layout; + + struct pv_irq_ops { + /* +@@ -215,7 +215,7 @@ struct pv_irq_ops { + #ifdef CONFIG_X86_64 + void (*adjust_exception_frame)(void); + #endif +-}; ++} __no_randomize_layout; + + struct pv_apic_ops { + #ifdef CONFIG_X86_LOCAL_APIC +@@ -223,7 +223,7 @@ struct pv_apic_ops { + unsigned long start_eip, + unsigned long start_esp); + #endif +-}; ++} __no_const __no_randomize_layout; + + struct pv_mmu_ops { + unsigned long (*read_cr2)(void); +@@ -313,6 +313,7 @@ struct pv_mmu_ops { + struct paravirt_callee_save make_pud; + + void (*set_pgd)(pgd_t *pudp, pgd_t pgdval); ++ void (*set_pgd_batched)(pgd_t *pudp, pgd_t pgdval); + #endif /* PAGETABLE_LEVELS == 4 */ + #endif /* PAGETABLE_LEVELS >= 3 */ + +@@ -324,7 +325,13 @@ struct pv_mmu_ops { + an mfn. We can tell which is which from the index. */ + void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx, + phys_addr_t phys, pgprot_t flags); +-}; ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ unsigned long (*pax_open_kernel)(void); ++ unsigned long (*pax_close_kernel)(void); ++#endif ++ ++} __no_randomize_layout; + + struct arch_spinlock; + #ifdef CONFIG_SMP +@@ -336,11 +343,14 @@ typedef u16 __ticket_t; + struct pv_lock_ops { + struct paravirt_callee_save lock_spinning; + void (*unlock_kick)(struct arch_spinlock *lock, __ticket_t ticket); +-}; ++} __no_randomize_layout; + + /* This contains all the paravirt structures: we get a convenient + * number for each function using the offset which we use to indicate +- * what to patch. */ ++ * what to patch. ++ * shouldn't be randomized due to the "NEAT TRICK" in paravirt.c ++ */ ++ + struct paravirt_patch_template { + struct pv_init_ops pv_init_ops; + struct pv_time_ops pv_time_ops; +@@ -349,7 +359,7 @@ struct paravirt_patch_template { + struct pv_apic_ops pv_apic_ops; + struct pv_mmu_ops pv_mmu_ops; + struct pv_lock_ops pv_lock_ops; +-}; ++} __no_randomize_layout; + + extern struct pv_info pv_info; + extern struct pv_init_ops pv_init_ops; +diff --git a/arch/x86/include/asm/pgalloc.h b/arch/x86/include/asm/pgalloc.h +index c4412e9..90e88c5 100644 +--- a/arch/x86/include/asm/pgalloc.h ++++ b/arch/x86/include/asm/pgalloc.h +@@ -63,6 +63,13 @@ static inline void pmd_populate_kernel(struct mm_struct *mm, + pmd_t *pmd, pte_t *pte) + { + paravirt_alloc_pte(mm, __pa(pte) >> PAGE_SHIFT); ++ set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE)); ++} ++ ++static inline void pmd_populate_user(struct mm_struct *mm, ++ pmd_t *pmd, pte_t *pte) ++{ ++ paravirt_alloc_pte(mm, __pa(pte) >> PAGE_SHIFT); + set_pmd(pmd, __pmd(__pa(pte) | _PAGE_TABLE)); + } + +@@ -108,12 +115,22 @@ static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, + + #ifdef CONFIG_X86_PAE + extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd); ++static inline void pud_populate_kernel(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd) ++{ ++ pud_populate(mm, pudp, pmd); ++} + #else /* !CONFIG_X86_PAE */ + static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) + { + paravirt_alloc_pmd(mm, __pa(pmd) >> PAGE_SHIFT); + set_pud(pud, __pud(_PAGE_TABLE | __pa(pmd))); + } ++ ++static inline void pud_populate_kernel(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) ++{ ++ paravirt_alloc_pmd(mm, __pa(pmd) >> PAGE_SHIFT); ++ set_pud(pud, __pud(_KERNPG_TABLE | __pa(pmd))); ++} + #endif /* CONFIG_X86_PAE */ + + #if PAGETABLE_LEVELS > 3 +@@ -123,6 +140,12 @@ static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud) + set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud))); + } + ++static inline void pgd_populate_kernel(struct mm_struct *mm, pgd_t *pgd, pud_t *pud) ++{ ++ paravirt_alloc_pud(mm, __pa(pud) >> PAGE_SHIFT); ++ set_pgd(pgd, __pgd(_KERNPG_TABLE | __pa(pud))); ++} ++ + static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) + { + return (pud_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); +diff --git a/arch/x86/include/asm/pgtable-2level.h b/arch/x86/include/asm/pgtable-2level.h +index 206a87f..1623b06 100644 +--- a/arch/x86/include/asm/pgtable-2level.h ++++ b/arch/x86/include/asm/pgtable-2level.h +@@ -18,7 +18,9 @@ static inline void native_set_pte(pte_t *ptep , pte_t pte) + + static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) + { ++ pax_open_kernel(); + *pmdp = pmd; ++ pax_close_kernel(); + } + + static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte) +diff --git a/arch/x86/include/asm/pgtable-3level.h b/arch/x86/include/asm/pgtable-3level.h +index 81bb91b..9392125 100644 +--- a/arch/x86/include/asm/pgtable-3level.h ++++ b/arch/x86/include/asm/pgtable-3level.h +@@ -92,12 +92,16 @@ static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte) + + static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) + { ++ pax_open_kernel(); + set_64bit((unsigned long long *)(pmdp), native_pmd_val(pmd)); ++ pax_close_kernel(); + } + + static inline void native_set_pud(pud_t *pudp, pud_t pud) + { ++ pax_open_kernel(); + set_64bit((unsigned long long *)(pudp), native_pud_val(pud)); ++ pax_close_kernel(); + } + + /* +diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h +index aa97a07..5c53c32 100644 +--- a/arch/x86/include/asm/pgtable.h ++++ b/arch/x86/include/asm/pgtable.h +@@ -46,6 +46,7 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page); + + #ifndef __PAGETABLE_PUD_FOLDED + #define set_pgd(pgdp, pgd) native_set_pgd(pgdp, pgd) ++#define set_pgd_batched(pgdp, pgd) native_set_pgd_batched(pgdp, pgd) + #define pgd_clear(pgd) native_pgd_clear(pgd) + #endif + +@@ -83,12 +84,53 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page); + + #define arch_end_context_switch(prev) do {} while(0) + ++#define pax_open_kernel() native_pax_open_kernel() ++#define pax_close_kernel() native_pax_close_kernel() + #endif /* CONFIG_PARAVIRT */ + ++#define __HAVE_ARCH_PAX_OPEN_KERNEL ++#define __HAVE_ARCH_PAX_CLOSE_KERNEL ++ ++#ifdef CONFIG_PAX_KERNEXEC ++static inline unsigned long native_pax_open_kernel(void) ++{ ++ unsigned long cr0; ++ ++ preempt_disable(); ++ barrier(); ++ cr0 = read_cr0() ^ X86_CR0_WP; ++ BUG_ON(cr0 & X86_CR0_WP); ++ write_cr0(cr0); ++ barrier(); ++ return cr0 ^ X86_CR0_WP; ++} ++ ++static inline unsigned long native_pax_close_kernel(void) ++{ ++ unsigned long cr0; ++ ++ barrier(); ++ cr0 = read_cr0() ^ X86_CR0_WP; ++ BUG_ON(!(cr0 & X86_CR0_WP)); ++ write_cr0(cr0); ++ barrier(); ++ preempt_enable_no_resched(); ++ return cr0 ^ X86_CR0_WP; ++} ++#else ++static inline unsigned long native_pax_open_kernel(void) { return 0; } ++static inline unsigned long native_pax_close_kernel(void) { return 0; } ++#endif ++ + /* + * The following only work if pte_present() is true. + * Undefined behaviour if not.. + */ ++static inline int pte_user(pte_t pte) ++{ ++ return pte_val(pte) & _PAGE_USER; ++} ++ + static inline int pte_dirty(pte_t pte) + { + return pte_flags(pte) & _PAGE_DIRTY; +@@ -155,6 +197,11 @@ static inline unsigned long pud_pfn(pud_t pud) + return (pud_val(pud) & PTE_PFN_MASK) >> PAGE_SHIFT; + } + ++static inline unsigned long pgd_pfn(pgd_t pgd) ++{ ++ return (pgd_val(pgd) & PTE_PFN_MASK) >> PAGE_SHIFT; ++} ++ + #define pte_page(pte) pfn_to_page(pte_pfn(pte)) + + static inline int pmd_large(pmd_t pte) +@@ -208,9 +255,29 @@ static inline pte_t pte_wrprotect(pte_t pte) + return pte_clear_flags(pte, _PAGE_RW); + } + ++static inline pte_t pte_mkread(pte_t pte) ++{ ++ return __pte(pte_val(pte) | _PAGE_USER); ++} ++ + static inline pte_t pte_mkexec(pte_t pte) + { +- return pte_clear_flags(pte, _PAGE_NX); ++#ifdef CONFIG_X86_PAE ++ if (__supported_pte_mask & _PAGE_NX) ++ return pte_clear_flags(pte, _PAGE_NX); ++ else ++#endif ++ return pte_set_flags(pte, _PAGE_USER); ++} ++ ++static inline pte_t pte_exprotect(pte_t pte) ++{ ++#ifdef CONFIG_X86_PAE ++ if (__supported_pte_mask & _PAGE_NX) ++ return pte_set_flags(pte, _PAGE_NX); ++ else ++#endif ++ return pte_clear_flags(pte, _PAGE_USER); + } + + static inline pte_t pte_mkdirty(pte_t pte) +@@ -440,6 +507,16 @@ pte_t *populate_extra_pte(unsigned long vaddr); + #endif + + #ifndef __ASSEMBLY__ ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++extern pgd_t cpu_pgd[NR_CPUS][2][PTRS_PER_PGD]; ++enum cpu_pgd_type {kernel = 0, user = 1}; ++static inline pgd_t *get_cpu_pgd(unsigned int cpu, enum cpu_pgd_type type) ++{ ++ return cpu_pgd[cpu][type]; ++} ++#endif ++ + #include <linux/mm_types.h> + #include <linux/mmdebug.h> + #include <linux/log2.h> +@@ -586,7 +663,7 @@ static inline unsigned long pud_page_vaddr(pud_t pud) + * Currently stuck as a macro due to indirect forward reference to + * linux/mmzone.h's __section_mem_map_addr() definition: + */ +-#define pud_page(pud) pfn_to_page(pud_val(pud) >> PAGE_SHIFT) ++#define pud_page(pud) pfn_to_page((pud_val(pud) & PTE_PFN_MASK) >> PAGE_SHIFT) + + /* Find an entry in the second-level page table.. */ + static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address) +@@ -626,7 +703,7 @@ static inline unsigned long pgd_page_vaddr(pgd_t pgd) + * Currently stuck as a macro due to indirect forward reference to + * linux/mmzone.h's __section_mem_map_addr() definition: + */ +-#define pgd_page(pgd) pfn_to_page(pgd_val(pgd) >> PAGE_SHIFT) ++#define pgd_page(pgd) pfn_to_page((pgd_val(pgd) & PTE_PFN_MASK) >> PAGE_SHIFT) + + /* to find an entry in a page-table-directory. */ + static inline unsigned long pud_index(unsigned long address) +@@ -641,7 +718,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address) + + static inline int pgd_bad(pgd_t pgd) + { +- return (pgd_flags(pgd) & ~_PAGE_USER) != _KERNPG_TABLE; ++ return (pgd_flags(pgd) & ~(_PAGE_USER | _PAGE_NX)) != _KERNPG_TABLE; + } + + static inline int pgd_none(pgd_t pgd) +@@ -664,7 +741,12 @@ static inline int pgd_none(pgd_t pgd) + * pgd_offset() returns a (pgd_t *) + * pgd_index() is used get the offset into the pgd page's array of pgd_t's; + */ +-#define pgd_offset(mm, address) ((mm)->pgd + pgd_index((address))) ++#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++#define pgd_offset_cpu(cpu, type, address) (get_cpu_pgd(cpu, type) + pgd_index(address)) ++#endif ++ + /* + * a shortcut which implies the use of the kernel's pgd, instead + * of a process's +@@ -675,6 +757,23 @@ static inline int pgd_none(pgd_t pgd) + #define KERNEL_PGD_BOUNDARY pgd_index(PAGE_OFFSET) + #define KERNEL_PGD_PTRS (PTRS_PER_PGD - KERNEL_PGD_BOUNDARY) + ++#ifdef CONFIG_X86_32 ++#define USER_PGD_PTRS KERNEL_PGD_BOUNDARY ++#else ++#define TASK_SIZE_MAX_SHIFT CONFIG_TASK_SIZE_MAX_SHIFT ++#define USER_PGD_PTRS (_AC(1,UL) << (TASK_SIZE_MAX_SHIFT - PGDIR_SHIFT)) ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++#ifdef __ASSEMBLY__ ++#define pax_user_shadow_base pax_user_shadow_base(%rip) ++#else ++extern unsigned long pax_user_shadow_base; ++extern pgdval_t clone_pgd_mask; ++#endif ++#endif ++ ++#endif ++ + #ifndef __ASSEMBLY__ + + extern int direct_gbpages; +@@ -841,11 +940,24 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm, + * dst and src can be on the same page, but the range must not overlap, + * and must not cross a page boundary. + */ +-static inline void clone_pgd_range(pgd_t *dst, pgd_t *src, int count) ++static inline void clone_pgd_range(pgd_t *dst, const pgd_t *src, int count) + { +- memcpy(dst, src, count * sizeof(pgd_t)); ++ pax_open_kernel(); ++ while (count--) ++ *dst++ = *src++; ++ pax_close_kernel(); + } + ++#ifdef CONFIG_PAX_PER_CPU_PGD ++extern void __clone_user_pgds(pgd_t *dst, const pgd_t *src); ++#endif ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++extern void __shadow_user_pgds(pgd_t *dst, const pgd_t *src); ++#else ++static inline void __shadow_user_pgds(pgd_t *dst, const pgd_t *src) {} ++#endif ++ + #define PTE_SHIFT ilog2(PTRS_PER_PTE) + static inline int page_level_shift(enum pg_level level) + { +diff --git a/arch/x86/include/asm/pgtable_32.h b/arch/x86/include/asm/pgtable_32.h +index b6c0b40..3535d47 100644 +--- a/arch/x86/include/asm/pgtable_32.h ++++ b/arch/x86/include/asm/pgtable_32.h +@@ -25,9 +25,6 @@ + struct mm_struct; + struct vm_area_struct; + +-extern pgd_t swapper_pg_dir[1024]; +-extern pgd_t initial_page_table[1024]; +- + static inline void pgtable_cache_init(void) { } + static inline void check_pgt_cache(void) { } + void paging_init(void); +@@ -45,6 +42,12 @@ void paging_init(void); + # include <asm/pgtable-2level.h> + #endif + ++extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; ++extern pgd_t initial_page_table[PTRS_PER_PGD]; ++#ifdef CONFIG_X86_PAE ++extern pmd_t swapper_pm_dir[PTRS_PER_PGD][PTRS_PER_PMD]; ++#endif ++ + #if defined(CONFIG_HIGHPTE) + #define pte_offset_map(dir, address) \ + ((pte_t *)kmap_atomic(pmd_page(*(dir))) + \ +@@ -59,12 +62,17 @@ void paging_init(void); + /* Clear a kernel PTE and flush it from the TLB */ + #define kpte_clear_flush(ptep, vaddr) \ + do { \ ++ pax_open_kernel(); \ + pte_clear(&init_mm, (vaddr), (ptep)); \ ++ pax_close_kernel(); \ + __flush_tlb_one((vaddr)); \ + } while (0) + + #endif /* !__ASSEMBLY__ */ + ++#define HAVE_ARCH_UNMAPPED_AREA ++#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN ++ + /* + * kern_addr_valid() is (1) for FLATMEM and (0) for + * SPARSEMEM and DISCONTIGMEM +diff --git a/arch/x86/include/asm/pgtable_32_types.h b/arch/x86/include/asm/pgtable_32_types.h +index ed5903b..c7fe163 100644 +--- a/arch/x86/include/asm/pgtable_32_types.h ++++ b/arch/x86/include/asm/pgtable_32_types.h +@@ -8,7 +8,7 @@ + */ + #ifdef CONFIG_X86_PAE + # include <asm/pgtable-3level_types.h> +-# define PMD_SIZE (1UL << PMD_SHIFT) ++# define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) + # define PMD_MASK (~(PMD_SIZE - 1)) + #else + # include <asm/pgtable-2level_types.h> +@@ -46,6 +46,19 @@ extern bool __vmalloc_start_set; /* set once high_memory is set */ + # define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE) + #endif + ++#ifdef CONFIG_PAX_KERNEXEC ++#ifndef __ASSEMBLY__ ++extern unsigned char MODULES_EXEC_VADDR[]; ++extern unsigned char MODULES_EXEC_END[]; ++#endif ++#include <asm/boot.h> ++#define ktla_ktva(addr) (addr + LOAD_PHYSICAL_ADDR + PAGE_OFFSET) ++#define ktva_ktla(addr) (addr - LOAD_PHYSICAL_ADDR - PAGE_OFFSET) ++#else ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) ++#endif ++ + #define MODULES_VADDR VMALLOC_START + #define MODULES_END VMALLOC_END + #define MODULES_LEN (MODULES_VADDR - MODULES_END) +diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h +index 4572b2f..4430113 100644 +--- a/arch/x86/include/asm/pgtable_64.h ++++ b/arch/x86/include/asm/pgtable_64.h +@@ -16,11 +16,16 @@ + + extern pud_t level3_kernel_pgt[512]; + extern pud_t level3_ident_pgt[512]; ++extern pud_t level3_vmalloc_start_pgt[512]; ++extern pud_t level3_vmalloc_end_pgt[512]; ++extern pud_t level3_vmemmap_pgt[512]; ++extern pud_t level2_vmemmap_pgt[512]; + extern pmd_t level2_kernel_pgt[512]; + extern pmd_t level2_fixmap_pgt[512]; +-extern pmd_t level2_ident_pgt[512]; ++extern pmd_t level2_ident_pgt[512*2]; + extern pte_t level1_fixmap_pgt[512]; +-extern pgd_t init_level4_pgt[]; ++extern pte_t level1_vsyscall_pgt[512]; ++extern pgd_t init_level4_pgt[512]; + + #define swapper_pg_dir init_level4_pgt + +@@ -62,7 +67,9 @@ static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte) + + static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd) + { ++ pax_open_kernel(); + *pmdp = pmd; ++ pax_close_kernel(); + } + + static inline void native_pmd_clear(pmd_t *pmd) +@@ -98,7 +105,9 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp) + + static inline void native_set_pud(pud_t *pudp, pud_t pud) + { ++ pax_open_kernel(); + *pudp = pud; ++ pax_close_kernel(); + } + + static inline void native_pud_clear(pud_t *pud) +@@ -108,6 +117,13 @@ static inline void native_pud_clear(pud_t *pud) + + static inline void native_set_pgd(pgd_t *pgdp, pgd_t pgd) + { ++ pax_open_kernel(); ++ *pgdp = pgd; ++ pax_close_kernel(); ++} ++ ++static inline void native_set_pgd_batched(pgd_t *pgdp, pgd_t pgd) ++{ + *pgdp = pgd; + } + +diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h +index 7166e25..baaa6fe 100644 +--- a/arch/x86/include/asm/pgtable_64_types.h ++++ b/arch/x86/include/asm/pgtable_64_types.h +@@ -61,9 +61,14 @@ typedef struct { pteval_t pte; } pte_t; + #define MODULES_VADDR (__START_KERNEL_map + KERNEL_IMAGE_SIZE) + #define MODULES_END _AC(0xffffffffff000000, UL) + #define MODULES_LEN (MODULES_END - MODULES_VADDR) ++#define MODULES_EXEC_VADDR MODULES_VADDR ++#define MODULES_EXEC_END MODULES_END + #define ESPFIX_PGD_ENTRY _AC(-2, UL) + #define ESPFIX_BASE_ADDR (ESPFIX_PGD_ENTRY << PGDIR_SHIFT) + ++#define ktla_ktva(addr) (addr) ++#define ktva_ktla(addr) (addr) ++ + #define EARLY_DYNAMIC_PAGE_TABLES 64 + + #endif /* _ASM_X86_PGTABLE_64_DEFS_H */ +diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h +index 0778964..0e94758 100644 +--- a/arch/x86/include/asm/pgtable_types.h ++++ b/arch/x86/include/asm/pgtable_types.h +@@ -110,8 +110,10 @@ + + #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) + #define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX) +-#else ++#elif defined(CONFIG_KMEMCHECK) || defined(CONFIG_MEM_SOFT_DIRTY) + #define _PAGE_NX (_AT(pteval_t, 0)) ++#else ++#define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_HIDDEN) + #endif + + #define _PAGE_FILE (_AT(pteval_t, 1) << _PAGE_BIT_FILE) +@@ -150,6 +152,9 @@ + #define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \ + _PAGE_ACCESSED) + ++#define PAGE_READONLY_NOEXEC PAGE_READONLY ++#define PAGE_SHARED_NOEXEC PAGE_SHARED ++ + #define __PAGE_KERNEL_EXEC \ + (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL) + #define __PAGE_KERNEL (__PAGE_KERNEL_EXEC | _PAGE_NX) +@@ -160,7 +165,7 @@ + #define __PAGE_KERNEL_WC (__PAGE_KERNEL | _PAGE_CACHE_WC) + #define __PAGE_KERNEL_NOCACHE (__PAGE_KERNEL | _PAGE_PCD | _PAGE_PWT) + #define __PAGE_KERNEL_UC_MINUS (__PAGE_KERNEL | _PAGE_PCD) +-#define __PAGE_KERNEL_VSYSCALL (__PAGE_KERNEL_RX | _PAGE_USER) ++#define __PAGE_KERNEL_VSYSCALL (__PAGE_KERNEL_RO | _PAGE_USER) + #define __PAGE_KERNEL_VVAR (__PAGE_KERNEL_RO | _PAGE_USER) + #define __PAGE_KERNEL_VVAR_NOCACHE (__PAGE_KERNEL_VVAR | _PAGE_PCD | _PAGE_PWT) + #define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE) +@@ -217,7 +222,7 @@ + #ifdef CONFIG_X86_64 + #define __PAGE_KERNEL_IDENT_LARGE_EXEC __PAGE_KERNEL_LARGE_EXEC + #else +-#define PTE_IDENT_ATTR 0x003 /* PRESENT+RW */ ++#define PTE_IDENT_ATTR 0x063 /* PRESENT+RW+DIRTY+ACCESSED */ + #define PDE_IDENT_ATTR 0x063 /* PRESENT+RW+DIRTY+ACCESSED */ + #define PGD_IDENT_ATTR 0x001 /* PRESENT (no other attributes) */ + #endif +@@ -256,7 +261,17 @@ static inline pgdval_t pgd_flags(pgd_t pgd) + { + return native_pgd_val(pgd) & PTE_FLAGS_MASK; + } ++#endif + ++#if PAGETABLE_LEVELS == 3 ++#include <asm-generic/pgtable-nopud.h> ++#endif ++ ++#if PAGETABLE_LEVELS == 2 ++#include <asm-generic/pgtable-nopmd.h> ++#endif ++ ++#ifndef __ASSEMBLY__ + #if PAGETABLE_LEVELS > 3 + typedef struct { pudval_t pud; } pud_t; + +@@ -270,8 +285,6 @@ static inline pudval_t native_pud_val(pud_t pud) + return pud.pud; + } + #else +-#include <asm-generic/pgtable-nopud.h> +- + static inline pudval_t native_pud_val(pud_t pud) + { + return native_pgd_val(pud.pgd); +@@ -291,8 +304,6 @@ static inline pmdval_t native_pmd_val(pmd_t pmd) + return pmd.pmd; + } + #else +-#include <asm-generic/pgtable-nopmd.h> +- + static inline pmdval_t native_pmd_val(pmd_t pmd) + { + return native_pgd_val(pmd.pud.pgd); +@@ -346,7 +357,6 @@ typedef struct page *pgtable_t; + + extern pteval_t __supported_pte_mask; + extern void set_nx(void); +-extern int nx_enabled; + + #define pgprot_writecombine pgprot_writecombine + extern pgprot_t pgprot_writecombine(pgprot_t prot); +diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h +index 4008734..48f0d81 100644 +--- a/arch/x86/include/asm/preempt.h ++++ b/arch/x86/include/asm/preempt.h +@@ -87,7 +87,7 @@ static __always_inline void __preempt_count_sub(int val) + */ + static __always_inline bool __preempt_count_dec_and_test(void) + { +- GEN_UNARY_RMWcc("decl", __preempt_count, __percpu_arg(0), "e"); ++ GEN_UNARY_RMWcc("decl", "incl", __preempt_count, __percpu_arg(0), "e"); + } + + /* +diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h +index eb71ec7..f06532a 100644 +--- a/arch/x86/include/asm/processor.h ++++ b/arch/x86/include/asm/processor.h +@@ -127,7 +127,7 @@ struct cpuinfo_x86 { + /* Index into per_cpu list: */ + u16 cpu_index; + u32 microcode; +-} __attribute__((__aligned__(SMP_CACHE_BYTES))); ++} __attribute__((__aligned__(SMP_CACHE_BYTES))) __randomize_layout; + + #define X86_VENDOR_INTEL 0 + #define X86_VENDOR_CYRIX 1 +@@ -198,9 +198,21 @@ static inline void native_cpuid(unsigned int *eax, unsigned int *ebx, + : "memory"); + } + ++/* invpcid (%rdx),%rax */ ++#define __ASM_INVPCID ".byte 0x66,0x0f,0x38,0x82,0x02" ++ ++#define INVPCID_SINGLE_ADDRESS 0UL ++#define INVPCID_SINGLE_CONTEXT 1UL ++#define INVPCID_ALL_GLOBAL 2UL ++#define INVPCID_ALL_NONGLOBAL 3UL ++ ++#define PCID_KERNEL 0UL ++#define PCID_USER 1UL ++#define PCID_NOFLUSH (1UL << 63) ++ + static inline void load_cr3(pgd_t *pgdir) + { +- write_cr3(__pa(pgdir)); ++ write_cr3(__pa(pgdir) | PCID_KERNEL); + } + + #ifdef CONFIG_X86_32 +@@ -282,7 +294,7 @@ struct tss_struct { + + } ____cacheline_aligned; + +-DECLARE_PER_CPU_SHARED_ALIGNED(struct tss_struct, init_tss); ++extern struct tss_struct init_tss[NR_CPUS]; + + /* + * Save the original ist values for checking stack pointers during debugging +@@ -478,6 +490,7 @@ struct thread_struct { + unsigned short ds; + unsigned short fsindex; + unsigned short gsindex; ++ unsigned short ss; + #endif + #ifdef CONFIG_X86_32 + unsigned long ip; +@@ -587,29 +600,8 @@ static inline void load_sp0(struct tss_struct *tss, + extern unsigned long mmu_cr4_features; + extern u32 *trampoline_cr4_features; + +-static inline void set_in_cr4(unsigned long mask) +-{ +- unsigned long cr4; +- +- mmu_cr4_features |= mask; +- if (trampoline_cr4_features) +- *trampoline_cr4_features = mmu_cr4_features; +- cr4 = read_cr4(); +- cr4 |= mask; +- write_cr4(cr4); +-} +- +-static inline void clear_in_cr4(unsigned long mask) +-{ +- unsigned long cr4; +- +- mmu_cr4_features &= ~mask; +- if (trampoline_cr4_features) +- *trampoline_cr4_features = mmu_cr4_features; +- cr4 = read_cr4(); +- cr4 &= ~mask; +- write_cr4(cr4); +-} ++extern void set_in_cr4(unsigned long mask); ++extern void clear_in_cr4(unsigned long mask); + + typedef struct { + unsigned long seg; +@@ -837,11 +829,18 @@ static inline void spin_lock_prefetch(const void *x) + */ + #define TASK_SIZE PAGE_OFFSET + #define TASK_SIZE_MAX TASK_SIZE ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++#define SEGMEXEC_TASK_SIZE (TASK_SIZE / 2) ++#define STACK_TOP ((current->mm->pax_flags & MF_PAX_SEGMEXEC)?SEGMEXEC_TASK_SIZE:TASK_SIZE) ++#else + #define STACK_TOP TASK_SIZE +-#define STACK_TOP_MAX STACK_TOP ++#endif ++ ++#define STACK_TOP_MAX TASK_SIZE + + #define INIT_THREAD { \ +- .sp0 = sizeof(init_stack) + (long)&init_stack, \ ++ .sp0 = sizeof(init_stack) + (long)&init_stack - 8, \ + .vm86_info = NULL, \ + .sysenter_cs = __KERNEL_CS, \ + .io_bitmap_ptr = NULL, \ +@@ -855,7 +854,7 @@ static inline void spin_lock_prefetch(const void *x) + */ + #define INIT_TSS { \ + .x86_tss = { \ +- .sp0 = sizeof(init_stack) + (long)&init_stack, \ ++ .sp0 = sizeof(init_stack) + (long)&init_stack - 8, \ + .ss0 = __KERNEL_DS, \ + .ss1 = __KERNEL_CS, \ + .io_bitmap_base = INVALID_IO_BITMAP_OFFSET, \ +@@ -866,11 +865,7 @@ static inline void spin_lock_prefetch(const void *x) + extern unsigned long thread_saved_pc(struct task_struct *tsk); + + #define THREAD_SIZE_LONGS (THREAD_SIZE/sizeof(unsigned long)) +-#define KSTK_TOP(info) \ +-({ \ +- unsigned long *__ptr = (unsigned long *)(info); \ +- (unsigned long)(&__ptr[THREAD_SIZE_LONGS]); \ +-}) ++#define KSTK_TOP(info) ((container_of(info, struct task_struct, tinfo))->thread.sp0) + + /* + * The below -8 is to reserve 8 bytes on top of the ring0 stack. +@@ -885,7 +880,7 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); + #define task_pt_regs(task) \ + ({ \ + struct pt_regs *__regs__; \ +- __regs__ = (struct pt_regs *)(KSTK_TOP(task_stack_page(task))-8); \ ++ __regs__ = (struct pt_regs *)((task)->thread.sp0); \ + __regs__ - 1; \ + }) + +@@ -895,13 +890,13 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); + /* + * User space process size. 47bits minus one guard page. + */ +-#define TASK_SIZE_MAX ((1UL << 47) - PAGE_SIZE) ++#define TASK_SIZE_MAX ((1UL << TASK_SIZE_MAX_SHIFT) - PAGE_SIZE) + + /* This decides where the kernel will search for a free chunk of vm + * space during mmap's. + */ + #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ +- 0xc0000000 : 0xFFFFe000) ++ 0xc0000000 : 0xFFFFf000) + + #define TASK_SIZE (test_thread_flag(TIF_ADDR32) ? \ + IA32_PAGE_OFFSET : TASK_SIZE_MAX) +@@ -912,11 +907,11 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk); + #define STACK_TOP_MAX TASK_SIZE_MAX + + #define INIT_THREAD { \ +- .sp0 = (unsigned long)&init_stack + sizeof(init_stack) \ ++ .sp0 = (unsigned long)&init_stack + sizeof(init_stack) - 16 \ + } + + #define INIT_TSS { \ +- .x86_tss.sp0 = (unsigned long)&init_stack + sizeof(init_stack) \ ++ .x86_tss.sp0 = (unsigned long)&init_stack + sizeof(init_stack) - 16 \ + } + + /* +@@ -944,6 +939,10 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip, + */ + #define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) + ++#ifdef CONFIG_PAX_SEGMEXEC ++#define SEGMEXEC_TASK_UNMAPPED_BASE (PAGE_ALIGN(SEGMEXEC_TASK_SIZE / 3)) ++#endif ++ + #define KSTK_EIP(task) (task_pt_regs(task)->ip) + + /* Get/set a process' ability to use the timestamp counter instruction */ +@@ -970,7 +969,7 @@ static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves) + return 0; + } + +-extern unsigned long arch_align_stack(unsigned long sp); ++#define arch_align_stack(x) ((x) & ~0xfUL) + extern void free_init_pages(char *what, unsigned long begin, unsigned long end); + + void default_idle(void); +@@ -980,6 +979,6 @@ bool xen_set_default_idle(void); + #define xen_set_default_idle 0 + #endif + +-void stop_this_cpu(void *dummy); ++void stop_this_cpu(void *dummy) __noreturn; + void df_debug(struct pt_regs *regs, long error_code); + #endif /* _ASM_X86_PROCESSOR_H */ +diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h +index 86fc2bb..bd5049a 100644 +--- a/arch/x86/include/asm/ptrace.h ++++ b/arch/x86/include/asm/ptrace.h +@@ -89,28 +89,29 @@ static inline unsigned long regs_return_value(struct pt_regs *regs) + } + + /* +- * user_mode_vm(regs) determines whether a register set came from user mode. ++ * user_mode(regs) determines whether a register set came from user mode. + * This is true if V8086 mode was enabled OR if the register set was from + * protected mode with RPL-3 CS value. This tricky test checks that with + * one comparison. Many places in the kernel can bypass this full check +- * if they have already ruled out V8086 mode, so user_mode(regs) can be used. ++ * if they have already ruled out V8086 mode, so user_mode_novm(regs) can ++ * be used. + */ +-static inline int user_mode(struct pt_regs *regs) ++static inline int user_mode_novm(struct pt_regs *regs) + { + #ifdef CONFIG_X86_32 + return (regs->cs & SEGMENT_RPL_MASK) == USER_RPL; + #else +- return !!(regs->cs & 3); ++ return !!(regs->cs & SEGMENT_RPL_MASK); + #endif + } + +-static inline int user_mode_vm(struct pt_regs *regs) ++static inline int user_mode(struct pt_regs *regs) + { + #ifdef CONFIG_X86_32 + return ((regs->cs & SEGMENT_RPL_MASK) | (regs->flags & X86_VM_MASK)) >= + USER_RPL; + #else +- return user_mode(regs); ++ return user_mode_novm(regs); + #endif + } + +@@ -126,15 +127,16 @@ static inline int v8086_mode(struct pt_regs *regs) + #ifdef CONFIG_X86_64 + static inline bool user_64bit_mode(struct pt_regs *regs) + { ++ unsigned long cs = regs->cs & 0xffff; + #ifndef CONFIG_PARAVIRT + /* + * On non-paravirt systems, this is the only long mode CPL 3 + * selector. We do not allow long mode selectors in the LDT. + */ +- return regs->cs == __USER_CS; ++ return cs == __USER_CS; + #else + /* Headers are too twisted for this to go in paravirt.h. */ +- return regs->cs == __USER_CS || regs->cs == pv_info.extra_user_64bit_cs; ++ return cs == __USER_CS || cs == pv_info.extra_user_64bit_cs; + #endif + } + +@@ -185,9 +187,11 @@ static inline unsigned long regs_get_register(struct pt_regs *regs, + * Traps from the kernel do not save sp and ss. + * Use the helper function to retrieve sp. + */ +- if (offset == offsetof(struct pt_regs, sp) && +- regs->cs == __KERNEL_CS) +- return kernel_stack_pointer(regs); ++ if (offset == offsetof(struct pt_regs, sp)) { ++ unsigned long cs = regs->cs & 0xffff; ++ if (cs == __KERNEL_CS || cs == __KERNEXEC_KERNEL_CS) ++ return kernel_stack_pointer(regs); ++ } + #endif + return *(unsigned long *)((unsigned long)regs + offset); + } +diff --git a/arch/x86/include/asm/qrwlock.h b/arch/x86/include/asm/qrwlock.h +index ae0e241..e80b10b 100644 +--- a/arch/x86/include/asm/qrwlock.h ++++ b/arch/x86/include/asm/qrwlock.h +@@ -7,8 +7,8 @@ + #define queue_write_unlock queue_write_unlock + static inline void queue_write_unlock(struct qrwlock *lock) + { +- barrier(); +- ACCESS_ONCE(*(u8 *)&lock->cnts) = 0; ++ barrier(); ++ ACCESS_ONCE_RW(*(u8 *)&lock->cnts) = 0; + } + #endif + +diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h +index 9c6b890..5305f53 100644 +--- a/arch/x86/include/asm/realmode.h ++++ b/arch/x86/include/asm/realmode.h +@@ -22,16 +22,14 @@ struct real_mode_header { + #endif + /* APM/BIOS reboot */ + u32 machine_real_restart_asm; +-#ifdef CONFIG_X86_64 + u32 machine_real_restart_seg; +-#endif + }; + + /* This must match data at trampoline_32/64.S */ + struct trampoline_header { + #ifdef CONFIG_X86_32 + u32 start; +- u16 gdt_pad; ++ u16 boot_cs; + u16 gdt_limit; + u32 gdt_base; + #else +diff --git a/arch/x86/include/asm/reboot.h b/arch/x86/include/asm/reboot.h +index a82c4f1..ac45053 100644 +--- a/arch/x86/include/asm/reboot.h ++++ b/arch/x86/include/asm/reboot.h +@@ -6,13 +6,13 @@ + struct pt_regs; + + struct machine_ops { +- void (*restart)(char *cmd); +- void (*halt)(void); +- void (*power_off)(void); ++ void (* __noreturn restart)(char *cmd); ++ void (* __noreturn halt)(void); ++ void (* __noreturn power_off)(void); + void (*shutdown)(void); + void (*crash_shutdown)(struct pt_regs *); +- void (*emergency_restart)(void); +-}; ++ void (* __noreturn emergency_restart)(void); ++} __no_const; + + extern struct machine_ops machine_ops; + +diff --git a/arch/x86/include/asm/rmwcc.h b/arch/x86/include/asm/rmwcc.h +index 8f7866a..e442f20 100644 +--- a/arch/x86/include/asm/rmwcc.h ++++ b/arch/x86/include/asm/rmwcc.h +@@ -3,7 +3,34 @@ + + #ifdef CC_HAVE_ASM_GOTO + +-#define __GEN_RMWcc(fullop, var, cc, ...) \ ++#ifdef CONFIG_PAX_REFCOUNT ++#define __GEN_RMWcc(fullop, fullantiop, var, cc, ...) \ ++do { \ ++ asm_volatile_goto (fullop \ ++ ";jno 0f\n" \ ++ fullantiop \ ++ ";int $4\n0:\n" \ ++ _ASM_EXTABLE(0b, 0b) \ ++ ";j" cc " %l[cc_label]" \ ++ : : "m" (var), ## __VA_ARGS__ \ ++ : "memory" : cc_label); \ ++ return 0; \ ++cc_label: \ ++ return 1; \ ++} while (0) ++#else ++#define __GEN_RMWcc(fullop, fullantiop, var, cc, ...) \ ++do { \ ++ asm_volatile_goto (fullop ";j" cc " %l[cc_label]" \ ++ : : "m" (var), ## __VA_ARGS__ \ ++ : "memory" : cc_label); \ ++ return 0; \ ++cc_label: \ ++ return 1; \ ++} while (0) ++#endif ++ ++#define __GEN_RMWcc_unchecked(fullop, var, cc, ...) \ + do { \ + asm_volatile_goto (fullop "; j" cc " %l[cc_label]" \ + : : "m" (var), ## __VA_ARGS__ \ +@@ -13,15 +40,46 @@ cc_label: \ + return 1; \ + } while (0) + +-#define GEN_UNARY_RMWcc(op, var, arg0, cc) \ +- __GEN_RMWcc(op " " arg0, var, cc) ++#define GEN_UNARY_RMWcc(op, antiop, var, arg0, cc) \ ++ __GEN_RMWcc(op " " arg0, antiop " " arg0, var, cc) ++ ++#define GEN_UNARY_RMWcc_unchecked(op, var, arg0, cc) \ ++ __GEN_RMWcc_unchecked(op " " arg0, var, cc) ++ ++#define GEN_BINARY_RMWcc(op, antiop, var, vcon, val, arg0, cc) \ ++ __GEN_RMWcc(op " %1, " arg0, antiop " %1, " arg0, var, cc, vcon (val)) + +-#define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ +- __GEN_RMWcc(op " %1, " arg0, var, cc, vcon (val)) ++#define GEN_BINARY_RMWcc_unchecked(op, var, vcon, val, arg0, cc) \ ++ __GEN_RMWcc_unchecked(op " %1, " arg0, var, cc, vcon (val)) + + #else /* !CC_HAVE_ASM_GOTO */ + +-#define __GEN_RMWcc(fullop, var, cc, ...) \ ++#ifdef CONFIG_PAX_REFCOUNT ++#define __GEN_RMWcc(fullop, fullantiop, var, cc, ...) \ ++do { \ ++ char c; \ ++ asm volatile (fullop \ ++ ";jno 0f\n" \ ++ fullantiop \ ++ ";int $4\n0:\n" \ ++ _ASM_EXTABLE(0b, 0b) \ ++ "; set" cc " %1" \ ++ : "+m" (var), "=qm" (c) \ ++ : __VA_ARGS__ : "memory"); \ ++ return c != 0; \ ++} while (0) ++#else ++#define __GEN_RMWcc(fullop, fullantiop, var, cc, ...) \ ++do { \ ++ char c; \ ++ asm volatile (fullop "; set" cc " %1" \ ++ : "+m" (var), "=qm" (c) \ ++ : __VA_ARGS__ : "memory"); \ ++ return c != 0; \ ++} while (0) ++#endif ++ ++#define __GEN_RMWcc_unchecked(fullop, var, cc, ...) \ + do { \ + char c; \ + asm volatile (fullop "; set" cc " %1" \ +@@ -30,11 +88,17 @@ do { \ + return c != 0; \ + } while (0) + +-#define GEN_UNARY_RMWcc(op, var, arg0, cc) \ +- __GEN_RMWcc(op " " arg0, var, cc) ++#define GEN_UNARY_RMWcc(op, antiop, var, arg0, cc) \ ++ __GEN_RMWcc(op " " arg0, antiop " " arg0, var, cc) ++ ++#define GEN_UNARY_RMWcc_unchecked(op, var, arg0, cc) \ ++ __GEN_RMWcc_unchecked(op " " arg0, var, cc) ++ ++#define GEN_BINARY_RMWcc(op, antiop, var, vcon, val, arg0, cc) \ ++ __GEN_RMWcc(op " %2, " arg0, antiop " %2, " arg0, var, cc, vcon (val)) + +-#define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ +- __GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val)) ++#define GEN_BINARY_RMWcc_unchecked(op, var, vcon, val, arg0, cc) \ ++ __GEN_RMWcc_unchecked(op " %2, " arg0, var, cc, vcon (val)) + + #endif /* CC_HAVE_ASM_GOTO */ + +diff --git a/arch/x86/include/asm/rwsem.h b/arch/x86/include/asm/rwsem.h +index cad82c9..2e5c5c1 100644 +--- a/arch/x86/include/asm/rwsem.h ++++ b/arch/x86/include/asm/rwsem.h +@@ -64,6 +64,14 @@ static inline void __down_read(struct rw_semaphore *sem) + { + asm volatile("# beginning down_read\n\t" + LOCK_PREFIX _ASM_INC "(%1)\n\t" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX _ASM_DEC "(%1)\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ + /* adds 0x00000001 */ + " jns 1f\n" + " call call_rwsem_down_read_failed\n" +@@ -85,6 +93,14 @@ static inline int __down_read_trylock(struct rw_semaphore *sem) + "1:\n\t" + " mov %1,%2\n\t" + " add %3,%2\n\t" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ "sub %3,%2\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ + " jle 2f\n\t" + LOCK_PREFIX " cmpxchg %2,%0\n\t" + " jnz 1b\n\t" +@@ -104,6 +120,14 @@ static inline void __down_write_nested(struct rw_semaphore *sem, int subclass) + long tmp; + asm volatile("# beginning down_write\n\t" + LOCK_PREFIX " xadd %1,(%2)\n\t" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ "mov %1,(%2)\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ + /* adds 0xffff0001, returns the old value */ + " test " __ASM_SEL(%w1,%k1) "," __ASM_SEL(%w1,%k1) "\n\t" + /* was the active mask 0 before? */ +@@ -155,6 +179,14 @@ static inline void __up_read(struct rw_semaphore *sem) + long tmp; + asm volatile("# beginning __up_read\n\t" + LOCK_PREFIX " xadd %1,(%2)\n\t" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ "mov %1,(%2)\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ + /* subtracts 1, returns the old value */ + " jns 1f\n\t" + " call call_rwsem_wake\n" /* expects old value in %edx */ +@@ -173,6 +205,14 @@ static inline void __up_write(struct rw_semaphore *sem) + long tmp; + asm volatile("# beginning __up_write\n\t" + LOCK_PREFIX " xadd %1,(%2)\n\t" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ "mov %1,(%2)\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ + /* subtracts 0xffff0001, returns the old value */ + " jns 1f\n\t" + " call call_rwsem_wake\n" /* expects old value in %edx */ +@@ -190,6 +230,14 @@ static inline void __downgrade_write(struct rw_semaphore *sem) + { + asm volatile("# beginning __downgrade_write\n\t" + LOCK_PREFIX _ASM_ADD "%2,(%1)\n\t" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX _ASM_SUB "%2,(%1)\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ + /* + * transitions 0xZZZZ0001 -> 0xYYYY0001 (i386) + * 0xZZZZZZZZ00000001 -> 0xYYYYYYYY00000001 (x86_64) +@@ -208,7 +256,15 @@ static inline void __downgrade_write(struct rw_semaphore *sem) + */ + static inline void rwsem_atomic_add(long delta, struct rw_semaphore *sem) + { +- asm volatile(LOCK_PREFIX _ASM_ADD "%1,%0" ++ asm volatile(LOCK_PREFIX _ASM_ADD "%1,%0\n" ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ "jno 0f\n" ++ LOCK_PREFIX _ASM_SUB "%1,%0\n" ++ "int $4\n0:\n" ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ + : "+m" (sem->count) + : "er" (delta)); + } +@@ -218,7 +274,7 @@ static inline void rwsem_atomic_add(long delta, struct rw_semaphore *sem) + */ + static inline long rwsem_atomic_update(long delta, struct rw_semaphore *sem) + { +- return delta + xadd(&sem->count, delta); ++ return delta + xadd_check_overflow(&sem->count, delta); + } + + #endif /* __KERNEL__ */ +diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h +index 6f1c3a8..7744f19 100644 +--- a/arch/x86/include/asm/segment.h ++++ b/arch/x86/include/asm/segment.h +@@ -64,10 +64,15 @@ + * 26 - ESPFIX small SS + * 27 - per-cpu [ offset to per-cpu data area ] + * 28 - stack_canary-20 [ for stack protector ] +- * 29 - unused +- * 30 - unused ++ * 29 - PCI BIOS CS ++ * 30 - PCI BIOS DS + * 31 - TSS for double fault handler + */ ++#define GDT_ENTRY_KERNEXEC_EFI_CS (1) ++#define GDT_ENTRY_KERNEXEC_EFI_DS (2) ++#define __KERNEXEC_EFI_CS (GDT_ENTRY_KERNEXEC_EFI_CS*8) ++#define __KERNEXEC_EFI_DS (GDT_ENTRY_KERNEXEC_EFI_DS*8) ++ + #define GDT_ENTRY_TLS_MIN 6 + #define GDT_ENTRY_TLS_MAX (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1) + +@@ -79,6 +84,8 @@ + + #define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE+0) + ++#define GDT_ENTRY_KERNEXEC_KERNEL_CS (4) ++ + #define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE+1) + + #define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE+4) +@@ -104,6 +111,12 @@ + #define __KERNEL_STACK_CANARY 0 + #endif + ++#define GDT_ENTRY_PCIBIOS_CS (GDT_ENTRY_KERNEL_BASE+17) ++#define __PCIBIOS_CS (GDT_ENTRY_PCIBIOS_CS * 8) ++ ++#define GDT_ENTRY_PCIBIOS_DS (GDT_ENTRY_KERNEL_BASE+18) ++#define __PCIBIOS_DS (GDT_ENTRY_PCIBIOS_DS * 8) ++ + #define GDT_ENTRY_DOUBLEFAULT_TSS 31 + + /* +@@ -141,7 +154,7 @@ + */ + + /* Matches PNP_CS32 and PNP_CS16 (they must be consecutive) */ +-#define SEGMENT_IS_PNP_CODE(x) (((x) & 0xf4) == GDT_ENTRY_PNPBIOS_BASE * 8) ++#define SEGMENT_IS_PNP_CODE(x) (((x) & 0xFFFCU) == PNP_CS32 || ((x) & 0xFFFCU) == PNP_CS16) + + + #else +@@ -165,6 +178,8 @@ + #define __USER32_CS (GDT_ENTRY_DEFAULT_USER32_CS*8+3) + #define __USER32_DS __USER_DS + ++#define GDT_ENTRY_KERNEXEC_KERNEL_CS 7 ++ + #define GDT_ENTRY_TSS 8 /* needs two entries */ + #define GDT_ENTRY_LDT 10 /* needs two entries */ + #define GDT_ENTRY_TLS_MIN 12 +@@ -173,6 +188,8 @@ + #define GDT_ENTRY_PER_CPU 15 /* Abused to load per CPU data from limit */ + #define __PER_CPU_SEG (GDT_ENTRY_PER_CPU * 8 + 3) + ++#define GDT_ENTRY_UDEREF_KERNEL_DS 16 ++ + /* TLS indexes for 64bit - hardcoded in arch_prctl */ + #define FS_TLS 0 + #define GS_TLS 1 +@@ -180,12 +197,14 @@ + #define GS_TLS_SEL ((GDT_ENTRY_TLS_MIN+GS_TLS)*8 + 3) + #define FS_TLS_SEL ((GDT_ENTRY_TLS_MIN+FS_TLS)*8 + 3) + +-#define GDT_ENTRIES 16 ++#define GDT_ENTRIES 17 + + #endif + + #define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8) ++#define __KERNEXEC_KERNEL_CS (GDT_ENTRY_KERNEXEC_KERNEL_CS*8) + #define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8) ++#define __UDEREF_KERNEL_DS (GDT_ENTRY_UDEREF_KERNEL_DS*8) + #define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8+3) + #define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8+3) + #ifndef CONFIG_PARAVIRT +@@ -268,7 +287,7 @@ static inline unsigned long get_limit(unsigned long segment) + { + unsigned long __limit; + asm("lsll %1,%0" : "=r" (__limit) : "r" (segment)); +- return __limit + 1; ++ return __limit; + } + + #endif /* !__ASSEMBLY__ */ +diff --git a/arch/x86/include/asm/smap.h b/arch/x86/include/asm/smap.h +index 8d3120f..352b440 100644 +--- a/arch/x86/include/asm/smap.h ++++ b/arch/x86/include/asm/smap.h +@@ -25,11 +25,40 @@ + + #include <asm/alternative-asm.h> + ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define ASM_PAX_OPEN_USERLAND \ ++ 661: jmp 663f; \ ++ .pushsection .altinstr_replacement, "a" ; \ ++ 662: pushq %rax; nop; \ ++ .popsection ; \ ++ .pushsection .altinstructions, "a" ; \ ++ altinstruction_entry 661b, 662b, X86_FEATURE_STRONGUDEREF, 2, 2;\ ++ .popsection ; \ ++ call __pax_open_userland; \ ++ popq %rax; \ ++ 663: ++ ++#define ASM_PAX_CLOSE_USERLAND \ ++ 661: jmp 663f; \ ++ .pushsection .altinstr_replacement, "a" ; \ ++ 662: pushq %rax; nop; \ ++ .popsection; \ ++ .pushsection .altinstructions, "a" ; \ ++ altinstruction_entry 661b, 662b, X86_FEATURE_STRONGUDEREF, 2, 2;\ ++ .popsection; \ ++ call __pax_close_userland; \ ++ popq %rax; \ ++ 663: ++#else ++#define ASM_PAX_OPEN_USERLAND ++#define ASM_PAX_CLOSE_USERLAND ++#endif ++ + #ifdef CONFIG_X86_SMAP + + #define ASM_CLAC \ + 661: ASM_NOP3 ; \ +- .pushsection .altinstr_replacement, "ax" ; \ ++ .pushsection .altinstr_replacement, "a" ; \ + 662: __ASM_CLAC ; \ + .popsection ; \ + .pushsection .altinstructions, "a" ; \ +@@ -38,7 +67,7 @@ + + #define ASM_STAC \ + 661: ASM_NOP3 ; \ +- .pushsection .altinstr_replacement, "ax" ; \ ++ .pushsection .altinstr_replacement, "a" ; \ + 662: __ASM_STAC ; \ + .popsection ; \ + .pushsection .altinstructions, "a" ; \ +@@ -56,6 +85,37 @@ + + #include <asm/alternative.h> + ++#define __HAVE_ARCH_PAX_OPEN_USERLAND ++#define __HAVE_ARCH_PAX_CLOSE_USERLAND ++ ++extern void __pax_open_userland(void); ++static __always_inline unsigned long pax_open_userland(void) ++{ ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ asm volatile(ALTERNATIVE(ASM_NOP5, "call %P[open]", X86_FEATURE_STRONGUDEREF) ++ : ++ : [open] "i" (__pax_open_userland) ++ : "memory", "rax"); ++#endif ++ ++ return 0; ++} ++ ++extern void __pax_close_userland(void); ++static __always_inline unsigned long pax_close_userland(void) ++{ ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ asm volatile(ALTERNATIVE(ASM_NOP5, "call %P[close]", X86_FEATURE_STRONGUDEREF) ++ : ++ : [close] "i" (__pax_close_userland) ++ : "memory", "rax"); ++#endif ++ ++ return 0; ++} ++ + #ifdef CONFIG_X86_SMAP + + static __always_inline void clac(void) +diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h +index 8cd1cc3..827e09e 100644 +--- a/arch/x86/include/asm/smp.h ++++ b/arch/x86/include/asm/smp.h +@@ -35,7 +35,7 @@ DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_core_map); + /* cpus sharing the last level cache: */ + DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_llc_shared_map); + DECLARE_PER_CPU_READ_MOSTLY(u16, cpu_llc_id); +-DECLARE_PER_CPU_READ_MOSTLY(int, cpu_number); ++DECLARE_PER_CPU_READ_MOSTLY(unsigned int, cpu_number); + + static inline struct cpumask *cpu_sibling_mask(int cpu) + { +@@ -78,7 +78,7 @@ struct smp_ops { + + void (*send_call_func_ipi)(const struct cpumask *mask); + void (*send_call_func_single_ipi)(int cpu); +-}; ++} __no_const; + + /* Globals due to paravirt */ + extern void set_cpu_sibling_map(int cpu); +@@ -191,14 +191,8 @@ extern unsigned disabled_cpus; + extern int safe_smp_processor_id(void); + + #elif defined(CONFIG_X86_64_SMP) +-#define raw_smp_processor_id() (this_cpu_read(cpu_number)) +- +-#define stack_smp_processor_id() \ +-({ \ +- struct thread_info *ti; \ +- __asm__("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK)); \ +- ti->cpu; \ +-}) ++#define raw_smp_processor_id() (this_cpu_read(cpu_number)) ++#define stack_smp_processor_id() raw_smp_processor_id() + #define safe_smp_processor_id() smp_processor_id() + + #endif +diff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h +index 6a99859..03cb807 100644 +--- a/arch/x86/include/asm/stackprotector.h ++++ b/arch/x86/include/asm/stackprotector.h +@@ -47,7 +47,7 @@ + * head_32 for boot CPU and setup_per_cpu_areas() for others. + */ + #define GDT_STACK_CANARY_INIT \ +- [GDT_ENTRY_STACK_CANARY] = GDT_ENTRY_INIT(0x4090, 0, 0x18), ++ [GDT_ENTRY_STACK_CANARY] = GDT_ENTRY_INIT(0x4090, 0, 0x17), + + /* + * Initialize the stackprotector canary value. +@@ -112,7 +112,7 @@ static inline void setup_stack_canary_segment(int cpu) + + static inline void load_stack_canary_segment(void) + { +-#ifdef CONFIG_X86_32 ++#if defined(CONFIG_X86_32) && !defined(CONFIG_PAX_MEMORY_UDEREF) + asm volatile ("mov %0, %%gs" : : "r" (0)); + #endif + } +diff --git a/arch/x86/include/asm/stacktrace.h b/arch/x86/include/asm/stacktrace.h +index 70bbe39..4ae2bd4 100644 +--- a/arch/x86/include/asm/stacktrace.h ++++ b/arch/x86/include/asm/stacktrace.h +@@ -11,28 +11,20 @@ + + extern int kstack_depth_to_print; + +-struct thread_info; ++struct task_struct; + struct stacktrace_ops; + +-typedef unsigned long (*walk_stack_t)(struct thread_info *tinfo, +- unsigned long *stack, +- unsigned long bp, +- const struct stacktrace_ops *ops, +- void *data, +- unsigned long *end, +- int *graph); +- +-extern unsigned long +-print_context_stack(struct thread_info *tinfo, +- unsigned long *stack, unsigned long bp, +- const struct stacktrace_ops *ops, void *data, +- unsigned long *end, int *graph); +- +-extern unsigned long +-print_context_stack_bp(struct thread_info *tinfo, +- unsigned long *stack, unsigned long bp, +- const struct stacktrace_ops *ops, void *data, +- unsigned long *end, int *graph); ++typedef unsigned long walk_stack_t(struct task_struct *task, ++ void *stack_start, ++ unsigned long *stack, ++ unsigned long bp, ++ const struct stacktrace_ops *ops, ++ void *data, ++ unsigned long *end, ++ int *graph); ++ ++extern walk_stack_t print_context_stack; ++extern walk_stack_t print_context_stack_bp; + + /* Generic stack tracer with callbacks */ + +@@ -40,7 +32,7 @@ struct stacktrace_ops { + void (*address)(void *data, unsigned long address, int reliable); + /* On negative return stop dumping */ + int (*stack)(void *data, char *name); +- walk_stack_t walk_stack; ++ walk_stack_t *walk_stack; + }; + + void dump_trace(struct task_struct *tsk, struct pt_regs *regs, +diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h +index d7f3b3b..3cc39f1 100644 +--- a/arch/x86/include/asm/switch_to.h ++++ b/arch/x86/include/asm/switch_to.h +@@ -108,7 +108,7 @@ do { \ + "call __switch_to\n\t" \ + "movq "__percpu_arg([current_task])",%%rsi\n\t" \ + __switch_canary \ +- "movq %P[thread_info](%%rsi),%%r8\n\t" \ ++ "movq "__percpu_arg([thread_info])",%%r8\n\t" \ + "movq %%rax,%%rdi\n\t" \ + "testl %[_tif_fork],%P[ti_flags](%%r8)\n\t" \ + "jnz ret_from_fork\n\t" \ +@@ -119,7 +119,7 @@ do { \ + [threadrsp] "i" (offsetof(struct task_struct, thread.sp)), \ + [ti_flags] "i" (offsetof(struct thread_info, flags)), \ + [_tif_fork] "i" (_TIF_FORK), \ +- [thread_info] "i" (offsetof(struct task_struct, stack)), \ ++ [thread_info] "m" (current_tinfo), \ + [current_task] "m" (current_task) \ + __switch_canary_iparam \ + : "memory", "cc" __EXTRA_CLOBBER) +diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h +index 547e344..6be1175 100644 +--- a/arch/x86/include/asm/thread_info.h ++++ b/arch/x86/include/asm/thread_info.h +@@ -24,7 +24,6 @@ struct exec_domain; + #include <linux/atomic.h> + + struct thread_info { +- struct task_struct *task; /* main task structure */ + struct exec_domain *exec_domain; /* execution domain */ + __u32 flags; /* low level flags */ + __u32 status; /* thread synchronous flags */ +@@ -33,13 +32,13 @@ struct thread_info { + mm_segment_t addr_limit; + struct restart_block restart_block; + void __user *sysenter_return; ++ unsigned long lowest_stack; + unsigned int sig_on_uaccess_error:1; + unsigned int uaccess_err:1; /* uaccess failed */ + }; + +-#define INIT_THREAD_INFO(tsk) \ ++#define INIT_THREAD_INFO \ + { \ +- .task = &tsk, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ +@@ -50,7 +49,7 @@ struct thread_info { + }, \ + } + +-#define init_thread_info (init_thread_union.thread_info) ++#define init_thread_info (init_thread_union.stack) + #define init_stack (init_thread_union.stack) + + #else /* !__ASSEMBLY__ */ +@@ -91,6 +90,7 @@ struct thread_info { + #define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */ + #define TIF_ADDR32 29 /* 32-bit address space on 64 bits */ + #define TIF_X32 30 /* 32-bit native x86-64 binary */ ++#define TIF_GRSEC_SETXID 31 /* update credentials on syscall entry/exit */ + + #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) + #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) +@@ -115,17 +115,18 @@ struct thread_info { + #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) + #define _TIF_ADDR32 (1 << TIF_ADDR32) + #define _TIF_X32 (1 << TIF_X32) ++#define _TIF_GRSEC_SETXID (1 << TIF_GRSEC_SETXID) + + /* work to do in syscall_trace_enter() */ + #define _TIF_WORK_SYSCALL_ENTRY \ + (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_EMU | _TIF_SYSCALL_AUDIT | \ + _TIF_SECCOMP | _TIF_SINGLESTEP | _TIF_SYSCALL_TRACEPOINT | \ +- _TIF_NOHZ) ++ _TIF_NOHZ | _TIF_GRSEC_SETXID) + + /* work to do in syscall_trace_leave() */ + #define _TIF_WORK_SYSCALL_EXIT \ + (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP | \ +- _TIF_SYSCALL_TRACEPOINT | _TIF_NOHZ) ++ _TIF_SYSCALL_TRACEPOINT | _TIF_NOHZ | _TIF_GRSEC_SETXID) + + /* work to do on interrupt/exception return */ + #define _TIF_WORK_MASK \ +@@ -136,7 +137,7 @@ struct thread_info { + /* work to do on any return to user space */ + #define _TIF_ALLWORK_MASK \ + ((0x0000FFFF & ~_TIF_SECCOMP) | _TIF_SYSCALL_TRACEPOINT | \ +- _TIF_NOHZ) ++ _TIF_NOHZ | _TIF_GRSEC_SETXID) + + /* Only used for 64 bit */ + #define _TIF_DO_NOTIFY_MASK \ +@@ -151,7 +152,6 @@ struct thread_info { + #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) + + #define STACK_WARN (THREAD_SIZE/8) +-#define KERNEL_STACK_OFFSET (5*(BITS_PER_LONG/8)) + + /* + * macros/functions for gaining access to the thread information structure +@@ -162,26 +162,18 @@ struct thread_info { + + DECLARE_PER_CPU(unsigned long, kernel_stack); + ++DECLARE_PER_CPU(struct thread_info *, current_tinfo); ++ + static inline struct thread_info *current_thread_info(void) + { +- struct thread_info *ti; +- ti = (void *)(this_cpu_read_stable(kernel_stack) + +- KERNEL_STACK_OFFSET - THREAD_SIZE); +- return ti; ++ return this_cpu_read_stable(current_tinfo); + } + + #else /* !__ASSEMBLY__ */ + + /* how to get the thread information struct from ASM */ + #define GET_THREAD_INFO(reg) \ +- _ASM_MOV PER_CPU_VAR(kernel_stack),reg ; \ +- _ASM_SUB $(THREAD_SIZE-KERNEL_STACK_OFFSET),reg ; +- +-/* +- * Same if PER_CPU_VAR(kernel_stack) is, perhaps with some offset, already in +- * a certain register (to be used in assembler memory operands). +- */ +-#define THREAD_INFO(reg, off) KERNEL_STACK_OFFSET+(off)-THREAD_SIZE(reg) ++ _ASM_MOV PER_CPU_VAR(current_tinfo),reg ; + + #endif + +@@ -237,5 +229,12 @@ static inline bool is_ia32_task(void) + extern void arch_task_cache_init(void); + extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); + extern void arch_release_task_struct(struct task_struct *tsk); ++ ++#define __HAVE_THREAD_FUNCTIONS ++#define task_thread_info(task) (&(task)->tinfo) ++#define task_stack_page(task) ((task)->stack) ++#define setup_thread_stack(p, org) do {} while (0) ++#define end_of_stack(p) ((unsigned long *)task_stack_page(p) + 1) ++ + #endif + #endif /* _ASM_X86_THREAD_INFO_H */ +diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h +index 04905bf..1178cdf 100644 +--- a/arch/x86/include/asm/tlbflush.h ++++ b/arch/x86/include/asm/tlbflush.h +@@ -17,18 +17,44 @@ + + static inline void __native_flush_tlb(void) + { ++ if (static_cpu_has(X86_FEATURE_INVPCID)) { ++ u64 descriptor[2]; ++ ++ descriptor[0] = PCID_KERNEL; ++ asm volatile(__ASM_INVPCID : : "d"(&descriptor), "a"(INVPCID_ALL_NONGLOBAL) : "memory"); ++ return; ++ } ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ if (static_cpu_has(X86_FEATURE_PCID)) { ++ unsigned int cpu = raw_get_cpu(); ++ ++ native_write_cr3(__pa(get_cpu_pgd(cpu, user)) | PCID_USER); ++ native_write_cr3(__pa(get_cpu_pgd(cpu, kernel)) | PCID_KERNEL); ++ raw_put_cpu_no_resched(); ++ return; ++ } ++#endif ++ + native_write_cr3(native_read_cr3()); + } + + static inline void __native_flush_tlb_global_irq_disabled(void) + { +- unsigned long cr4; +- +- cr4 = native_read_cr4(); +- /* clear PGE */ +- native_write_cr4(cr4 & ~X86_CR4_PGE); +- /* write old PGE again and flush TLBs */ +- native_write_cr4(cr4); ++ if (static_cpu_has(X86_FEATURE_INVPCID)) { ++ u64 descriptor[2]; ++ ++ descriptor[0] = PCID_KERNEL; ++ asm volatile(__ASM_INVPCID : : "d"(&descriptor), "a"(INVPCID_ALL_GLOBAL) : "memory"); ++ } else { ++ unsigned long cr4; ++ ++ cr4 = native_read_cr4(); ++ /* clear PGE */ ++ native_write_cr4(cr4 & ~X86_CR4_PGE); ++ /* write old PGE again and flush TLBs */ ++ native_write_cr4(cr4); ++ } + } + + static inline void __native_flush_tlb_global(void) +@@ -49,6 +75,41 @@ static inline void __native_flush_tlb_global(void) + + static inline void __native_flush_tlb_single(unsigned long addr) + { ++ if (static_cpu_has(X86_FEATURE_INVPCID)) { ++ u64 descriptor[2]; ++ ++ descriptor[0] = PCID_KERNEL; ++ descriptor[1] = addr; ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ if (!static_cpu_has(X86_FEATURE_STRONGUDEREF) || addr >= TASK_SIZE_MAX) { ++ if (addr < TASK_SIZE_MAX) ++ descriptor[1] += pax_user_shadow_base; ++ asm volatile(__ASM_INVPCID : : "d"(&descriptor), "a"(INVPCID_SINGLE_ADDRESS) : "memory"); ++ } ++ ++ descriptor[0] = PCID_USER; ++ descriptor[1] = addr; ++#endif ++ ++ asm volatile(__ASM_INVPCID : : "d"(&descriptor), "a"(INVPCID_SINGLE_ADDRESS) : "memory"); ++ return; ++ } ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ if (static_cpu_has(X86_FEATURE_PCID)) { ++ unsigned int cpu = raw_get_cpu(); ++ ++ native_write_cr3(__pa(get_cpu_pgd(cpu, user)) | PCID_USER | PCID_NOFLUSH); ++ asm volatile("invlpg (%0)" ::"r" (addr) : "memory"); ++ native_write_cr3(__pa(get_cpu_pgd(cpu, kernel)) | PCID_KERNEL | PCID_NOFLUSH); ++ raw_put_cpu_no_resched(); ++ ++ if (!static_cpu_has(X86_FEATURE_STRONGUDEREF) && addr < TASK_SIZE_MAX) ++ addr += pax_user_shadow_base; ++ } ++#endif ++ + asm volatile("invlpg (%0)" ::"r" (addr) : "memory"); + } + +diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h +index 0d592e0..a9e3d4a 100644 +--- a/arch/x86/include/asm/uaccess.h ++++ b/arch/x86/include/asm/uaccess.h +@@ -7,6 +7,7 @@ + #include <linux/compiler.h> + #include <linux/thread_info.h> + #include <linux/string.h> ++#include <linux/spinlock.h> + #include <asm/asm.h> + #include <asm/page.h> + #include <asm/smap.h> +@@ -29,7 +30,12 @@ + + #define get_ds() (KERNEL_DS) + #define get_fs() (current_thread_info()->addr_limit) ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_MEMORY_UDEREF) ++void __set_fs(mm_segment_t x); ++void set_fs(mm_segment_t x); ++#else + #define set_fs(x) (current_thread_info()->addr_limit = (x)) ++#endif + + #define segment_eq(a, b) ((a).seg == (b).seg) + +@@ -85,8 +91,36 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un + * checks that the pointer is in the user space range - after calling + * this function, memory access functions may still return -EFAULT. + */ +-#define access_ok(type, addr, size) \ +- likely(!__range_not_ok(addr, size, user_addr_max())) ++extern int _cond_resched(void); ++#define access_ok_noprefault(type, addr, size) (likely(!__range_not_ok(addr, size, user_addr_max()))) ++#define access_ok(type, addr, size) \ ++({ \ ++ unsigned long __size = size; \ ++ unsigned long __addr = (unsigned long)addr; \ ++ bool __ret_ao = __range_not_ok(__addr, __size, user_addr_max()) == 0;\ ++ if (__ret_ao && __size) { \ ++ unsigned long __addr_ao = __addr & PAGE_MASK; \ ++ unsigned long __end_ao = __addr + __size - 1; \ ++ if (unlikely((__end_ao ^ __addr_ao) & PAGE_MASK)) { \ ++ while (__addr_ao <= __end_ao) { \ ++ char __c_ao; \ ++ __addr_ao += PAGE_SIZE; \ ++ if (__size > PAGE_SIZE) \ ++ _cond_resched(); \ ++ if (__get_user(__c_ao, (char __user *)__addr)) \ ++ break; \ ++ if (type != VERIFY_WRITE) { \ ++ __addr = __addr_ao; \ ++ continue; \ ++ } \ ++ if (__put_user(__c_ao, (char __user *)__addr)) \ ++ break; \ ++ __addr = __addr_ao; \ ++ } \ ++ } \ ++ } \ ++ __ret_ao; \ ++}) + + /* + * The exception table consists of pairs of addresses relative to the +@@ -134,11 +168,13 @@ extern int __get_user_8(void); + extern int __get_user_bad(void); + + /* +- * This is a type: either unsigned long, if the argument fits into +- * that type, or otherwise unsigned long long. ++ * This is a type: either (un)signed int, if the argument fits into ++ * that type, or otherwise (un)signed long long. + */ + #define __inttype(x) \ +-__typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) ++__typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0U), \ ++ __builtin_choose_expr(__type_is_unsigned(__typeof__(x)), 0ULL, 0LL),\ ++ __builtin_choose_expr(__type_is_unsigned(__typeof__(x)), 0U, 0))) + + /** + * get_user: - Get a simple variable from user space. +@@ -176,10 +212,12 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) + register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX); \ + __chk_user_ptr(ptr); \ + might_fault(); \ ++ pax_open_userland(); \ + asm volatile("call __get_user_%P3" \ + : "=a" (__ret_gu), "=r" (__val_gu) \ + : "0" (ptr), "i" (sizeof(*(ptr)))); \ + (x) = (__typeof__(*(ptr))) __val_gu; \ ++ pax_close_userland(); \ + __ret_gu; \ + }) + +@@ -187,13 +225,21 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) + asm volatile("call __put_user_" #size : "=a" (__ret_pu) \ + : "0" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") + +- ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define __copyuser_seg "gs;" ++#define __COPYUSER_SET_ES "pushl %%gs; popl %%es\n" ++#define __COPYUSER_RESTORE_ES "pushl %%ss; popl %%es\n" ++#else ++#define __copyuser_seg ++#define __COPYUSER_SET_ES ++#define __COPYUSER_RESTORE_ES ++#endif + + #ifdef CONFIG_X86_32 + #define __put_user_asm_u64(x, addr, err, errret) \ + asm volatile(ASM_STAC "\n" \ +- "1: movl %%eax,0(%2)\n" \ +- "2: movl %%edx,4(%2)\n" \ ++ "1: "__copyuser_seg"movl %%eax,0(%2)\n" \ ++ "2: "__copyuser_seg"movl %%edx,4(%2)\n" \ + "3: " ASM_CLAC "\n" \ + ".section .fixup,\"ax\"\n" \ + "4: movl %3,%0\n" \ +@@ -206,8 +252,8 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) + + #define __put_user_asm_ex_u64(x, addr) \ + asm volatile(ASM_STAC "\n" \ +- "1: movl %%eax,0(%1)\n" \ +- "2: movl %%edx,4(%1)\n" \ ++ "1: "__copyuser_seg"movl %%eax,0(%1)\n" \ ++ "2: "__copyuser_seg"movl %%edx,4(%1)\n" \ + "3: " ASM_CLAC "\n" \ + _ASM_EXTABLE_EX(1b, 2b) \ + _ASM_EXTABLE_EX(2b, 3b) \ +@@ -257,7 +303,8 @@ extern void __put_user_8(void); + __typeof__(*(ptr)) __pu_val; \ + __chk_user_ptr(ptr); \ + might_fault(); \ +- __pu_val = x; \ ++ __pu_val = (x); \ ++ pax_open_userland(); \ + switch (sizeof(*(ptr))) { \ + case 1: \ + __put_user_x(1, __pu_val, ptr, __ret_pu); \ +@@ -275,6 +322,7 @@ extern void __put_user_8(void); + __put_user_x(X, __pu_val, ptr, __ret_pu); \ + break; \ + } \ ++ pax_close_userland(); \ + __ret_pu; \ + }) + +@@ -355,8 +403,10 @@ do { \ + } while (0) + + #define __get_user_asm(x, addr, err, itype, rtype, ltype, errret) \ ++do { \ ++ pax_open_userland(); \ + asm volatile(ASM_STAC "\n" \ +- "1: mov"itype" %2,%"rtype"1\n" \ ++ "1: "__copyuser_seg"mov"itype" %2,%"rtype"1\n"\ + "2: " ASM_CLAC "\n" \ + ".section .fixup,\"ax\"\n" \ + "3: mov %3,%0\n" \ +@@ -364,8 +414,10 @@ do { \ + " jmp 2b\n" \ + ".previous\n" \ + _ASM_EXTABLE(1b, 3b) \ +- : "=r" (err), ltype(x) \ +- : "m" (__m(addr)), "i" (errret), "0" (err)) ++ : "=r" (err), ltype (x) \ ++ : "m" (__m(addr)), "i" (errret), "0" (err)); \ ++ pax_close_userland(); \ ++} while (0) + + #define __get_user_size_ex(x, ptr, size) \ + do { \ +@@ -389,7 +441,7 @@ do { \ + } while (0) + + #define __get_user_asm_ex(x, addr, itype, rtype, ltype) \ +- asm volatile("1: mov"itype" %1,%"rtype"0\n" \ ++ asm volatile("1: "__copyuser_seg"mov"itype" %1,%"rtype"0\n"\ + "2:\n" \ + _ASM_EXTABLE_EX(1b, 2b) \ + : ltype(x) : "m" (__m(addr))) +@@ -406,13 +458,24 @@ do { \ + int __gu_err; \ + unsigned long __gu_val; \ + __get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \ +- (x) = (__force __typeof__(*(ptr)))__gu_val; \ ++ (x) = (__typeof__(*(ptr)))__gu_val; \ + __gu_err; \ + }) + + /* FIXME: this hack is definitely wrong -AK */ + struct __large_struct { unsigned long buf[100]; }; +-#define __m(x) (*(struct __large_struct __user *)(x)) ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define ____m(x) \ ++({ \ ++ unsigned long ____x = (unsigned long)(x); \ ++ if (____x < pax_user_shadow_base) \ ++ ____x += pax_user_shadow_base; \ ++ (typeof(x))____x; \ ++}) ++#else ++#define ____m(x) (x) ++#endif ++#define __m(x) (*(struct __large_struct __user *)____m(x)) + + /* + * Tell gcc we read from memory instead of writing: this is because +@@ -420,8 +483,10 @@ struct __large_struct { unsigned long buf[100]; }; + * aliasing issues. + */ + #define __put_user_asm(x, addr, err, itype, rtype, ltype, errret) \ ++do { \ ++ pax_open_userland(); \ + asm volatile(ASM_STAC "\n" \ +- "1: mov"itype" %"rtype"1,%2\n" \ ++ "1: "__copyuser_seg"mov"itype" %"rtype"1,%2\n"\ + "2: " ASM_CLAC "\n" \ + ".section .fixup,\"ax\"\n" \ + "3: mov %3,%0\n" \ +@@ -429,10 +494,12 @@ struct __large_struct { unsigned long buf[100]; }; + ".previous\n" \ + _ASM_EXTABLE(1b, 3b) \ + : "=r"(err) \ +- : ltype(x), "m" (__m(addr)), "i" (errret), "0" (err)) ++ : ltype (x), "m" (__m(addr)), "i" (errret), "0" (err));\ ++ pax_close_userland(); \ ++} while (0) + + #define __put_user_asm_ex(x, addr, itype, rtype, ltype) \ +- asm volatile("1: mov"itype" %"rtype"0,%1\n" \ ++ asm volatile("1: "__copyuser_seg"mov"itype" %"rtype"0,%1\n"\ + "2:\n" \ + _ASM_EXTABLE_EX(1b, 2b) \ + : : ltype(x), "m" (__m(addr))) +@@ -442,11 +509,13 @@ struct __large_struct { unsigned long buf[100]; }; + */ + #define uaccess_try do { \ + current_thread_info()->uaccess_err = 0; \ ++ pax_open_userland(); \ + stac(); \ + barrier(); + + #define uaccess_catch(err) \ + clac(); \ ++ pax_close_userland(); \ + (err) |= (current_thread_info()->uaccess_err ? -EFAULT : 0); \ + } while (0) + +@@ -471,8 +540,12 @@ struct __large_struct { unsigned long buf[100]; }; + * On error, the variable @x is set to zero. + */ + ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define __get_user(x, ptr) get_user((x), (ptr)) ++#else + #define __get_user(x, ptr) \ + __get_user_nocheck((x), (ptr), sizeof(*(ptr))) ++#endif + + /** + * __put_user: - Write a simple value into user space, with less checking. +@@ -494,8 +567,12 @@ struct __large_struct { unsigned long buf[100]; }; + * Returns zero on success, or -EFAULT on error. + */ + ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define __put_user(x, ptr) put_user((x), (ptr)) ++#else + #define __put_user(x, ptr) \ + __put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) ++#endif + + #define __get_user_unaligned __get_user + #define __put_user_unaligned __put_user +@@ -513,7 +590,7 @@ struct __large_struct { unsigned long buf[100]; }; + #define get_user_ex(x, ptr) do { \ + unsigned long __gue_val; \ + __get_user_size_ex((__gue_val), (ptr), (sizeof(*(ptr)))); \ +- (x) = (__force __typeof__(*(ptr)))__gue_val; \ ++ (x) = (__typeof__(*(ptr)))__gue_val; \ + } while (0) + + #define put_user_try uaccess_try +@@ -542,18 +619,19 @@ extern void __cmpxchg_wrong_size(void) + __typeof__(ptr) __uval = (uval); \ + __typeof__(*(ptr)) __old = (old); \ + __typeof__(*(ptr)) __new = (new); \ ++ pax_open_userland(); \ + switch (size) { \ + case 1: \ + { \ + asm volatile("\t" ASM_STAC "\n" \ +- "1:\t" LOCK_PREFIX "cmpxchgb %4, %2\n" \ ++ "1:\t" LOCK_PREFIX __copyuser_seg"cmpxchgb %4, %2\n"\ + "2:\t" ASM_CLAC "\n" \ + "\t.section .fixup, \"ax\"\n" \ + "3:\tmov %3, %0\n" \ + "\tjmp 2b\n" \ + "\t.previous\n" \ + _ASM_EXTABLE(1b, 3b) \ +- : "+r" (__ret), "=a" (__old), "+m" (*(ptr)) \ ++ : "+r" (__ret), "=a" (__old), "+m" (*____m(ptr))\ + : "i" (-EFAULT), "q" (__new), "1" (__old) \ + : "memory" \ + ); \ +@@ -562,14 +640,14 @@ extern void __cmpxchg_wrong_size(void) + case 2: \ + { \ + asm volatile("\t" ASM_STAC "\n" \ +- "1:\t" LOCK_PREFIX "cmpxchgw %4, %2\n" \ ++ "1:\t" LOCK_PREFIX __copyuser_seg"cmpxchgw %4, %2\n"\ + "2:\t" ASM_CLAC "\n" \ + "\t.section .fixup, \"ax\"\n" \ + "3:\tmov %3, %0\n" \ + "\tjmp 2b\n" \ + "\t.previous\n" \ + _ASM_EXTABLE(1b, 3b) \ +- : "+r" (__ret), "=a" (__old), "+m" (*(ptr)) \ ++ : "+r" (__ret), "=a" (__old), "+m" (*____m(ptr))\ + : "i" (-EFAULT), "r" (__new), "1" (__old) \ + : "memory" \ + ); \ +@@ -578,14 +656,14 @@ extern void __cmpxchg_wrong_size(void) + case 4: \ + { \ + asm volatile("\t" ASM_STAC "\n" \ +- "1:\t" LOCK_PREFIX "cmpxchgl %4, %2\n" \ ++ "1:\t" LOCK_PREFIX __copyuser_seg"cmpxchgl %4, %2\n"\ + "2:\t" ASM_CLAC "\n" \ + "\t.section .fixup, \"ax\"\n" \ + "3:\tmov %3, %0\n" \ + "\tjmp 2b\n" \ + "\t.previous\n" \ + _ASM_EXTABLE(1b, 3b) \ +- : "+r" (__ret), "=a" (__old), "+m" (*(ptr)) \ ++ : "+r" (__ret), "=a" (__old), "+m" (*____m(ptr))\ + : "i" (-EFAULT), "r" (__new), "1" (__old) \ + : "memory" \ + ); \ +@@ -597,14 +675,14 @@ extern void __cmpxchg_wrong_size(void) + __cmpxchg_wrong_size(); \ + \ + asm volatile("\t" ASM_STAC "\n" \ +- "1:\t" LOCK_PREFIX "cmpxchgq %4, %2\n" \ ++ "1:\t" LOCK_PREFIX __copyuser_seg"cmpxchgq %4, %2\n"\ + "2:\t" ASM_CLAC "\n" \ + "\t.section .fixup, \"ax\"\n" \ + "3:\tmov %3, %0\n" \ + "\tjmp 2b\n" \ + "\t.previous\n" \ + _ASM_EXTABLE(1b, 3b) \ +- : "+r" (__ret), "=a" (__old), "+m" (*(ptr)) \ ++ : "+r" (__ret), "=a" (__old), "+m" (*____m(ptr))\ + : "i" (-EFAULT), "r" (__new), "1" (__old) \ + : "memory" \ + ); \ +@@ -613,6 +691,7 @@ extern void __cmpxchg_wrong_size(void) + default: \ + __cmpxchg_wrong_size(); \ + } \ ++ pax_close_userland(); \ + *__uval = __old; \ + __ret; \ + }) +@@ -636,17 +715,6 @@ extern struct movsl_mask { + + #define ARCH_HAS_NOCACHE_UACCESS 1 + +-#ifdef CONFIG_X86_32 +-# include <asm/uaccess_32.h> +-#else +-# include <asm/uaccess_64.h> +-#endif +- +-unsigned long __must_check _copy_from_user(void *to, const void __user *from, +- unsigned n); +-unsigned long __must_check _copy_to_user(void __user *to, const void *from, +- unsigned n); +- + #ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS + # define copy_user_diag __compiletime_error + #else +@@ -656,7 +724,7 @@ unsigned long __must_check _copy_to_user(void __user *to, const void *from, + extern void copy_user_diag("copy_from_user() buffer size is too small") + copy_from_user_overflow(void); + extern void copy_user_diag("copy_to_user() buffer size is too small") +-copy_to_user_overflow(void) __asm__("copy_from_user_overflow"); ++copy_to_user_overflow(void); + + #undef copy_user_diag + +@@ -669,7 +737,7 @@ __copy_from_user_overflow(void) __asm__("copy_from_user_overflow"); + + extern void + __compiletime_warning("copy_to_user() buffer size is not provably correct") +-__copy_to_user_overflow(void) __asm__("copy_from_user_overflow"); ++__copy_to_user_overflow(void) __asm__("copy_to_user_overflow"); + #define __copy_to_user_overflow(size, count) __copy_to_user_overflow() + + #else +@@ -684,10 +752,16 @@ __copy_from_user_overflow(int size, unsigned long count) + + #endif + ++#ifdef CONFIG_X86_32 ++# include <asm/uaccess_32.h> ++#else ++# include <asm/uaccess_64.h> ++#endif ++ + static inline unsigned long __must_check + copy_from_user(void *to, const void __user *from, unsigned long n) + { +- int sz = __compiletime_object_size(to); ++ size_t sz = __compiletime_object_size(to); + + might_fault(); + +@@ -709,12 +783,15 @@ copy_from_user(void *to, const void __user *from, unsigned long n) + * case, and do only runtime checking for non-constant sizes. + */ + +- if (likely(sz < 0 || sz >= n)) +- n = _copy_from_user(to, from, n); +- else if(__builtin_constant_p(n)) +- copy_from_user_overflow(); +- else +- __copy_from_user_overflow(sz, n); ++ if (likely(sz != (size_t)-1 && sz < n)) { ++ if(__builtin_constant_p(n)) ++ copy_from_user_overflow(); ++ else ++ __copy_from_user_overflow(sz, n); ++ } else if (access_ok(VERIFY_READ, from, n)) ++ n = __copy_from_user(to, from, n); ++ else if ((long)n > 0) ++ memset(to, 0, n); + + return n; + } +@@ -722,17 +799,18 @@ copy_from_user(void *to, const void __user *from, unsigned long n) + static inline unsigned long __must_check + copy_to_user(void __user *to, const void *from, unsigned long n) + { +- int sz = __compiletime_object_size(from); ++ size_t sz = __compiletime_object_size(from); + + might_fault(); + + /* See the comment in copy_from_user() above. */ +- if (likely(sz < 0 || sz >= n)) +- n = _copy_to_user(to, from, n); +- else if(__builtin_constant_p(n)) +- copy_to_user_overflow(); +- else +- __copy_to_user_overflow(sz, n); ++ if (likely(sz != (size_t)-1 && sz < n)) { ++ if(__builtin_constant_p(n)) ++ copy_to_user_overflow(); ++ else ++ __copy_to_user_overflow(sz, n); ++ } else if (access_ok(VERIFY_WRITE, to, n)) ++ n = __copy_to_user(to, from, n); + + return n; + } +diff --git a/arch/x86/include/asm/uaccess_32.h b/arch/x86/include/asm/uaccess_32.h +index 3c03a5d..1071638 100644 +--- a/arch/x86/include/asm/uaccess_32.h ++++ b/arch/x86/include/asm/uaccess_32.h +@@ -43,6 +43,11 @@ unsigned long __must_check __copy_from_user_ll_nocache_nozero + static __always_inline unsigned long __must_check + __copy_to_user_inatomic(void __user *to, const void *from, unsigned long n) + { ++ if ((long)n < 0) ++ return n; ++ ++ check_object_size(from, n, true); ++ + if (__builtin_constant_p(n)) { + unsigned long ret; + +@@ -82,12 +87,16 @@ static __always_inline unsigned long __must_check + __copy_to_user(void __user *to, const void *from, unsigned long n) + { + might_fault(); ++ + return __copy_to_user_inatomic(to, from, n); + } + + static __always_inline unsigned long + __copy_from_user_inatomic(void *to, const void __user *from, unsigned long n) + { ++ if ((long)n < 0) ++ return n; ++ + /* Avoid zeroing the tail if the copy fails.. + * If 'n' is constant and 1, 2, or 4, we do still zero on a failure, + * but as the zeroing behaviour is only significant when n is not +@@ -137,6 +146,12 @@ static __always_inline unsigned long + __copy_from_user(void *to, const void __user *from, unsigned long n) + { + might_fault(); ++ ++ if ((long)n < 0) ++ return n; ++ ++ check_object_size(to, n, false); ++ + if (__builtin_constant_p(n)) { + unsigned long ret; + +@@ -159,6 +174,10 @@ static __always_inline unsigned long __copy_from_user_nocache(void *to, + const void __user *from, unsigned long n) + { + might_fault(); ++ ++ if ((long)n < 0) ++ return n; ++ + if (__builtin_constant_p(n)) { + unsigned long ret; + +@@ -181,7 +200,10 @@ static __always_inline unsigned long + __copy_from_user_inatomic_nocache(void *to, const void __user *from, + unsigned long n) + { +- return __copy_from_user_ll_nocache_nozero(to, from, n); ++ if ((long)n < 0) ++ return n; ++ ++ return __copy_from_user_ll_nocache_nozero(to, from, n); + } + + #endif /* _ASM_X86_UACCESS_32_H */ +diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h +index 12a26b9..206c200 100644 +--- a/arch/x86/include/asm/uaccess_64.h ++++ b/arch/x86/include/asm/uaccess_64.h +@@ -10,6 +10,9 @@ + #include <asm/alternative.h> + #include <asm/cpufeature.h> + #include <asm/page.h> ++#include <asm/pgtable.h> ++ ++#define set_fs(x) (current_thread_info()->addr_limit = (x)) + + /* + * Copy To/From Userspace +@@ -17,14 +20,14 @@ + + /* Handles exceptions in both to and from, but doesn't do access_ok */ + __must_check unsigned long +-copy_user_enhanced_fast_string(void *to, const void *from, unsigned len); ++copy_user_enhanced_fast_string(void *to, const void *from, unsigned len) __size_overflow(3); + __must_check unsigned long +-copy_user_generic_string(void *to, const void *from, unsigned len); ++copy_user_generic_string(void *to, const void *from, unsigned len) __size_overflow(3); + __must_check unsigned long +-copy_user_generic_unrolled(void *to, const void *from, unsigned len); ++copy_user_generic_unrolled(void *to, const void *from, unsigned len) __size_overflow(3); + + static __always_inline __must_check unsigned long +-copy_user_generic(void *to, const void *from, unsigned len) ++copy_user_generic(void *to, const void *from, unsigned long len) + { + unsigned ret; + +@@ -46,121 +49,170 @@ copy_user_generic(void *to, const void *from, unsigned len) + } + + __must_check unsigned long +-copy_in_user(void __user *to, const void __user *from, unsigned len); ++copy_in_user(void __user *to, const void __user *from, unsigned long len); + + static __always_inline __must_check +-int __copy_from_user_nocheck(void *dst, const void __user *src, unsigned size) ++unsigned long __copy_from_user_nocheck(void *dst, const void __user *src, unsigned long size) + { +- int ret = 0; ++ size_t sz = __compiletime_object_size(dst); ++ unsigned ret = 0; ++ ++ if (size > INT_MAX) ++ return size; ++ ++ check_object_size(dst, size, false); ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (!access_ok_noprefault(VERIFY_READ, src, size)) ++ return size; ++#endif ++ ++ if (unlikely(sz != (size_t)-1 && sz < size)) { ++ if(__builtin_constant_p(size)) ++ copy_from_user_overflow(); ++ else ++ __copy_from_user_overflow(sz, size); ++ return size; ++ } + + if (!__builtin_constant_p(size)) +- return copy_user_generic(dst, (__force void *)src, size); ++ return copy_user_generic(dst, (__force_kernel const void *)____m(src), size); + switch (size) { +- case 1:__get_user_asm(*(u8 *)dst, (u8 __user *)src, ++ case 1:__get_user_asm(*(u8 *)dst, (const u8 __user *)src, + ret, "b", "b", "=q", 1); + return ret; +- case 2:__get_user_asm(*(u16 *)dst, (u16 __user *)src, ++ case 2:__get_user_asm(*(u16 *)dst, (const u16 __user *)src, + ret, "w", "w", "=r", 2); + return ret; +- case 4:__get_user_asm(*(u32 *)dst, (u32 __user *)src, ++ case 4:__get_user_asm(*(u32 *)dst, (const u32 __user *)src, + ret, "l", "k", "=r", 4); + return ret; +- case 8:__get_user_asm(*(u64 *)dst, (u64 __user *)src, ++ case 8:__get_user_asm(*(u64 *)dst, (const u64 __user *)src, + ret, "q", "", "=r", 8); + return ret; + case 10: +- __get_user_asm(*(u64 *)dst, (u64 __user *)src, ++ __get_user_asm(*(u64 *)dst, (const u64 __user *)src, + ret, "q", "", "=r", 10); + if (unlikely(ret)) + return ret; + __get_user_asm(*(u16 *)(8 + (char *)dst), +- (u16 __user *)(8 + (char __user *)src), ++ (const u16 __user *)(8 + (const char __user *)src), + ret, "w", "w", "=r", 2); + return ret; + case 16: +- __get_user_asm(*(u64 *)dst, (u64 __user *)src, ++ __get_user_asm(*(u64 *)dst, (const u64 __user *)src, + ret, "q", "", "=r", 16); + if (unlikely(ret)) + return ret; + __get_user_asm(*(u64 *)(8 + (char *)dst), +- (u64 __user *)(8 + (char __user *)src), ++ (const u64 __user *)(8 + (const char __user *)src), + ret, "q", "", "=r", 8); + return ret; + default: +- return copy_user_generic(dst, (__force void *)src, size); ++ return copy_user_generic(dst, (__force_kernel const void *)____m(src), size); + } + } + + static __always_inline __must_check +-int __copy_from_user(void *dst, const void __user *src, unsigned size) ++unsigned long __copy_from_user(void *dst, const void __user *src, unsigned long size) + { + might_fault(); + return __copy_from_user_nocheck(dst, src, size); + } + + static __always_inline __must_check +-int __copy_to_user_nocheck(void __user *dst, const void *src, unsigned size) ++unsigned long __copy_to_user_nocheck(void __user *dst, const void *src, unsigned long size) + { +- int ret = 0; ++ size_t sz = __compiletime_object_size(src); ++ unsigned ret = 0; ++ ++ if (size > INT_MAX) ++ return size; ++ ++ check_object_size(src, size, true); ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (!access_ok_noprefault(VERIFY_WRITE, dst, size)) ++ return size; ++#endif ++ ++ if (unlikely(sz != (size_t)-1 && sz < size)) { ++ if(__builtin_constant_p(size)) ++ copy_to_user_overflow(); ++ else ++ __copy_to_user_overflow(sz, size); ++ return size; ++ } + + if (!__builtin_constant_p(size)) +- return copy_user_generic((__force void *)dst, src, size); ++ return copy_user_generic((__force_kernel void *)____m(dst), src, size); + switch (size) { +- case 1:__put_user_asm(*(u8 *)src, (u8 __user *)dst, ++ case 1:__put_user_asm(*(const u8 *)src, (u8 __user *)dst, + ret, "b", "b", "iq", 1); + return ret; +- case 2:__put_user_asm(*(u16 *)src, (u16 __user *)dst, ++ case 2:__put_user_asm(*(const u16 *)src, (u16 __user *)dst, + ret, "w", "w", "ir", 2); + return ret; +- case 4:__put_user_asm(*(u32 *)src, (u32 __user *)dst, ++ case 4:__put_user_asm(*(const u32 *)src, (u32 __user *)dst, + ret, "l", "k", "ir", 4); + return ret; +- case 8:__put_user_asm(*(u64 *)src, (u64 __user *)dst, ++ case 8:__put_user_asm(*(const u64 *)src, (u64 __user *)dst, + ret, "q", "", "er", 8); + return ret; + case 10: +- __put_user_asm(*(u64 *)src, (u64 __user *)dst, ++ __put_user_asm(*(const u64 *)src, (u64 __user *)dst, + ret, "q", "", "er", 10); + if (unlikely(ret)) + return ret; + asm("":::"memory"); +- __put_user_asm(4[(u16 *)src], 4 + (u16 __user *)dst, ++ __put_user_asm(4[(const u16 *)src], 4 + (u16 __user *)dst, + ret, "w", "w", "ir", 2); + return ret; + case 16: +- __put_user_asm(*(u64 *)src, (u64 __user *)dst, ++ __put_user_asm(*(const u64 *)src, (u64 __user *)dst, + ret, "q", "", "er", 16); + if (unlikely(ret)) + return ret; + asm("":::"memory"); +- __put_user_asm(1[(u64 *)src], 1 + (u64 __user *)dst, ++ __put_user_asm(1[(const u64 *)src], 1 + (u64 __user *)dst, + ret, "q", "", "er", 8); + return ret; + default: +- return copy_user_generic((__force void *)dst, src, size); ++ return copy_user_generic((__force_kernel void *)____m(dst), src, size); + } + } + + static __always_inline __must_check +-int __copy_to_user(void __user *dst, const void *src, unsigned size) ++unsigned long __copy_to_user(void __user *dst, const void *src, unsigned long size) + { + might_fault(); + return __copy_to_user_nocheck(dst, src, size); + } + + static __always_inline __must_check +-int __copy_in_user(void __user *dst, const void __user *src, unsigned size) ++unsigned long __copy_in_user(void __user *dst, const void __user *src, unsigned size) + { +- int ret = 0; ++ unsigned ret = 0; + + might_fault(); ++ ++ if (size > INT_MAX) ++ return size; ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (!access_ok_noprefault(VERIFY_READ, src, size)) ++ return size; ++ if (!access_ok_noprefault(VERIFY_WRITE, dst, size)) ++ return size; ++#endif ++ + if (!__builtin_constant_p(size)) +- return copy_user_generic((__force void *)dst, +- (__force void *)src, size); ++ return copy_user_generic((__force_kernel void *)____m(dst), ++ (__force_kernel const void *)____m(src), size); + switch (size) { + case 1: { + u8 tmp; +- __get_user_asm(tmp, (u8 __user *)src, ++ __get_user_asm(tmp, (const u8 __user *)src, + ret, "b", "b", "=q", 1); + if (likely(!ret)) + __put_user_asm(tmp, (u8 __user *)dst, +@@ -169,7 +221,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size) + } + case 2: { + u16 tmp; +- __get_user_asm(tmp, (u16 __user *)src, ++ __get_user_asm(tmp, (const u16 __user *)src, + ret, "w", "w", "=r", 2); + if (likely(!ret)) + __put_user_asm(tmp, (u16 __user *)dst, +@@ -179,7 +231,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size) + + case 4: { + u32 tmp; +- __get_user_asm(tmp, (u32 __user *)src, ++ __get_user_asm(tmp, (const u32 __user *)src, + ret, "l", "k", "=r", 4); + if (likely(!ret)) + __put_user_asm(tmp, (u32 __user *)dst, +@@ -188,7 +240,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size) + } + case 8: { + u64 tmp; +- __get_user_asm(tmp, (u64 __user *)src, ++ __get_user_asm(tmp, (const u64 __user *)src, + ret, "q", "", "=r", 8); + if (likely(!ret)) + __put_user_asm(tmp, (u64 __user *)dst, +@@ -196,41 +248,58 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size) + return ret; + } + default: +- return copy_user_generic((__force void *)dst, +- (__force void *)src, size); ++ return copy_user_generic((__force_kernel void *)____m(dst), ++ (__force_kernel const void *)____m(src), size); + } + } + +-static __must_check __always_inline int +-__copy_from_user_inatomic(void *dst, const void __user *src, unsigned size) ++static __must_check __always_inline unsigned long ++__copy_from_user_inatomic(void *dst, const void __user *src, unsigned long size) + { + return __copy_from_user_nocheck(dst, src, size); + } + +-static __must_check __always_inline int +-__copy_to_user_inatomic(void __user *dst, const void *src, unsigned size) ++static __must_check __always_inline unsigned long ++__copy_to_user_inatomic(void __user *dst, const void *src, unsigned long size) + { + return __copy_to_user_nocheck(dst, src, size); + } + +-extern long __copy_user_nocache(void *dst, const void __user *src, +- unsigned size, int zerorest); ++extern unsigned long __copy_user_nocache(void *dst, const void __user *src, ++ unsigned long size, int zerorest); + +-static inline int +-__copy_from_user_nocache(void *dst, const void __user *src, unsigned size) ++static inline unsigned long ++__copy_from_user_nocache(void *dst, const void __user *src, unsigned long size) + { + might_fault(); ++ ++ if (size > INT_MAX) ++ return size; ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (!access_ok_noprefault(VERIFY_READ, src, size)) ++ return size; ++#endif ++ + return __copy_user_nocache(dst, src, size, 1); + } + +-static inline int ++static inline unsigned long + __copy_from_user_inatomic_nocache(void *dst, const void __user *src, +- unsigned size) ++ unsigned long size) + { ++ if (size > INT_MAX) ++ return size; ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (!access_ok_noprefault(VERIFY_READ, src, size)) ++ return size; ++#endif ++ + return __copy_user_nocache(dst, src, size, 0); + } + + unsigned long +-copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest); ++copy_user_handle_tail(char __user *to, char __user *from, unsigned long len, unsigned zerorest) __size_overflow(3); + + #endif /* _ASM_X86_UACCESS_64_H */ +diff --git a/arch/x86/include/asm/word-at-a-time.h b/arch/x86/include/asm/word-at-a-time.h +index 5b238981..77fdd78 100644 +--- a/arch/x86/include/asm/word-at-a-time.h ++++ b/arch/x86/include/asm/word-at-a-time.h +@@ -11,7 +11,7 @@ + * and shift, for example. + */ + struct word_at_a_time { +- const unsigned long one_bits, high_bits; ++ unsigned long one_bits, high_bits; + }; + + #define WORD_AT_A_TIME_CONSTANTS { REPEAT_BYTE(0x01), REPEAT_BYTE(0x80) } +diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h +index e45e4da..44e8572 100644 +--- a/arch/x86/include/asm/x86_init.h ++++ b/arch/x86/include/asm/x86_init.h +@@ -129,7 +129,7 @@ struct x86_init_ops { + struct x86_init_timers timers; + struct x86_init_iommu iommu; + struct x86_init_pci pci; +-}; ++} __no_const; + + /** + * struct x86_cpuinit_ops - platform specific cpu hotplug setups +@@ -140,7 +140,7 @@ struct x86_cpuinit_ops { + void (*setup_percpu_clockev)(void); + void (*early_percpu_clock_init)(void); + void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node); +-}; ++} __no_const; + + struct timespec; + +@@ -168,7 +168,7 @@ struct x86_platform_ops { + void (*save_sched_clock_state)(void); + void (*restore_sched_clock_state)(void); + void (*apic_post_init)(void); +-}; ++} __no_const; + + struct pci_dev; + struct msi_msg; +@@ -185,7 +185,7 @@ struct x86_msi_ops { + int (*setup_hpet_msi)(unsigned int irq, unsigned int id); + u32 (*msi_mask_irq)(struct msi_desc *desc, u32 mask, u32 flag); + u32 (*msix_mask_irq)(struct msi_desc *desc, u32 flag); +-}; ++} __no_const; + + struct IO_APIC_route_entry; + struct io_apic_irq_attr; +@@ -206,7 +206,7 @@ struct x86_io_apic_ops { + unsigned int destination, int vector, + struct io_apic_irq_attr *attr); + void (*eoi_ioapic_pin)(int apic, int pin, int vector); +-}; ++} __no_const; + + extern struct x86_init_ops x86_init; + extern struct x86_cpuinit_ops x86_cpuinit; +diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h +index f58ef6c..a2abc78 100644 +--- a/arch/x86/include/asm/xen/page.h ++++ b/arch/x86/include/asm/xen/page.h +@@ -63,7 +63,7 @@ extern int m2p_remove_override(struct page *page, + extern struct page *m2p_find_override(unsigned long mfn); + extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn); + +-static inline unsigned long pfn_to_mfn(unsigned long pfn) ++static inline unsigned long __intentional_overflow(-1) pfn_to_mfn(unsigned long pfn) + { + unsigned long mfn; + +diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h +index d82b804..20176ec 100644 +--- a/arch/x86/include/asm/xsave.h ++++ b/arch/x86/include/asm/xsave.h +@@ -222,12 +222,16 @@ static inline int xsave_user(struct xsave_struct __user *buf) + if (unlikely(err)) + return -EFAULT; + ++ pax_open_userland(); + __asm__ __volatile__(ASM_STAC "\n" +- "1:"XSAVE"\n" ++ "1:" ++ __copyuser_seg ++ XSAVE"\n" + "2: " ASM_CLAC "\n" + xstate_fault + : "D" (buf), "a" (-1), "d" (-1), "0" (0) + : "memory"); ++ pax_close_userland(); + return err; + } + +@@ -237,16 +241,20 @@ static inline int xsave_user(struct xsave_struct __user *buf) + static inline int xrestore_user(struct xsave_struct __user *buf, u64 mask) + { + int err = 0; +- struct xsave_struct *xstate = ((__force struct xsave_struct *)buf); ++ struct xsave_struct *xstate = ((__force_kernel struct xsave_struct *)buf); + u32 lmask = mask; + u32 hmask = mask >> 32; + ++ pax_open_userland(); + __asm__ __volatile__(ASM_STAC "\n" +- "1:"XRSTOR"\n" ++ "1:" ++ __copyuser_seg ++ XRSTOR"\n" + "2: " ASM_CLAC "\n" + xstate_fault + : "D" (xstate), "a" (lmask), "d" (hmask), "0" (0) + : "memory"); /* memory required? */ ++ pax_close_userland(); + return err; + } + +diff --git a/arch/x86/include/uapi/asm/e820.h b/arch/x86/include/uapi/asm/e820.h +index d993e33..8db1b18 100644 +--- a/arch/x86/include/uapi/asm/e820.h ++++ b/arch/x86/include/uapi/asm/e820.h +@@ -58,7 +58,7 @@ struct e820map { + #define ISA_START_ADDRESS 0xa0000 + #define ISA_END_ADDRESS 0x100000 + +-#define BIOS_BEGIN 0x000a0000 ++#define BIOS_BEGIN 0x000c0000 + #define BIOS_END 0x00100000 + + #define BIOS_ROM_BASE 0xffe00000 +diff --git a/arch/x86/include/uapi/asm/ptrace-abi.h b/arch/x86/include/uapi/asm/ptrace-abi.h +index 7b0a55a..ad115bf 100644 +--- a/arch/x86/include/uapi/asm/ptrace-abi.h ++++ b/arch/x86/include/uapi/asm/ptrace-abi.h +@@ -49,7 +49,6 @@ + #define EFLAGS 144 + #define RSP 152 + #define SS 160 +-#define ARGOFFSET R11 + #endif /* __ASSEMBLY__ */ + + /* top of stack page */ +diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile +index 8f1e774..9b4c381 100644 +--- a/arch/x86/kernel/Makefile ++++ b/arch/x86/kernel/Makefile +@@ -24,7 +24,7 @@ obj-y += time.o ioport.o ldt.o dumpstack.o nmi.o + obj-y += setup.o x86_init.o i8259.o irqinit.o jump_label.o + obj-$(CONFIG_IRQ_WORK) += irq_work.o + obj-y += probe_roms.o +-obj-$(CONFIG_X86_32) += i386_ksyms_32.o ++obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o + obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o + obj-$(CONFIG_X86_64) += mcount_64.o + obj-y += syscall_$(BITS).o vsyscall_gtod.o +diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c +index a3eadfd..56fdd27 100644 +--- a/arch/x86/kernel/acpi/boot.c ++++ b/arch/x86/kernel/acpi/boot.c +@@ -1282,7 +1282,7 @@ static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d) + * If your system is blacklisted here, but you find that acpi=force + * works for you, please contact linux-acpi@vger.kernel.org + */ +-static struct dmi_system_id __initdata acpi_dmi_table[] = { ++static const struct dmi_system_id __initconst acpi_dmi_table[] = { + /* + * Boxes that need ACPI disabled + */ +@@ -1357,7 +1357,7 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = { + }; + + /* second table for DMI checks that should run after early-quirks */ +-static struct dmi_system_id __initdata acpi_dmi_table_late[] = { ++static const struct dmi_system_id __initconst acpi_dmi_table_late[] = { + /* + * HP laptops which use a DSDT reporting as HP/SB400/10000, + * which includes some code which overrides all temperature +diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c +index 3136820..e2c6577e 100644 +--- a/arch/x86/kernel/acpi/sleep.c ++++ b/arch/x86/kernel/acpi/sleep.c +@@ -99,8 +99,12 @@ int x86_acpi_suspend_lowlevel(void) + #else /* CONFIG_64BIT */ + #ifdef CONFIG_SMP + stack_start = (unsigned long)temp_stack + sizeof(temp_stack); ++ ++ pax_open_kernel(); + early_gdt_descr.address = + (unsigned long)get_cpu_gdt_table(smp_processor_id()); ++ pax_close_kernel(); ++ + initial_gs = per_cpu_offset(smp_processor_id()); + #endif + initial_code = (unsigned long)wakeup_long64; +diff --git a/arch/x86/kernel/acpi/wakeup_32.S b/arch/x86/kernel/acpi/wakeup_32.S +index 665c6b7..eae4d56 100644 +--- a/arch/x86/kernel/acpi/wakeup_32.S ++++ b/arch/x86/kernel/acpi/wakeup_32.S +@@ -29,13 +29,11 @@ wakeup_pmode_return: + # and restore the stack ... but you need gdt for this to work + movl saved_context_esp, %esp + +- movl %cs:saved_magic, %eax +- cmpl $0x12345678, %eax ++ cmpl $0x12345678, saved_magic + jne bogus_magic + + # jump to place where we left off +- movl saved_eip, %eax +- jmp *%eax ++ jmp *(saved_eip) + + bogus_magic: + jmp bogus_magic +diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c +index 703130f..27a155d 100644 +--- a/arch/x86/kernel/alternative.c ++++ b/arch/x86/kernel/alternative.c +@@ -268,6 +268,13 @@ void __init_or_module apply_alternatives(struct alt_instr *start, + */ + for (a = start; a < end; a++) { + instr = (u8 *)&a->instr_offset + a->instr_offset; ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ instr += ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++ if (instr < (u8 *)_text || (u8 *)_einittext <= instr) ++ instr -= ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++#endif ++ + replacement = (u8 *)&a->repl_offset + a->repl_offset; + BUG_ON(a->replacementlen > a->instrlen); + BUG_ON(a->instrlen > sizeof(insnbuf)); +@@ -284,6 +291,11 @@ void __init_or_module apply_alternatives(struct alt_instr *start, + add_nops(insnbuf + a->replacementlen, + a->instrlen - a->replacementlen); + ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if (instr < (u8 *)_text || (u8 *)_einittext <= instr) ++ instr = ktva_ktla(instr); ++#endif ++ + text_poke_early(instr, insnbuf, a->instrlen); + } + } +@@ -299,10 +311,16 @@ static void alternatives_smp_lock(const s32 *start, const s32 *end, + for (poff = start; poff < end; poff++) { + u8 *ptr = (u8 *)poff + *poff; + ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ ptr += ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++ if (ptr < (u8 *)_text || (u8 *)_einittext <= ptr) ++ ptr -= ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++#endif ++ + if (!*poff || ptr < text || ptr >= text_end) + continue; + /* turn DS segment override prefix into lock prefix */ +- if (*ptr == 0x3e) ++ if (*ktla_ktva(ptr) == 0x3e) + text_poke(ptr, ((unsigned char []){0xf0}), 1); + } + mutex_unlock(&text_mutex); +@@ -317,10 +335,16 @@ static void alternatives_smp_unlock(const s32 *start, const s32 *end, + for (poff = start; poff < end; poff++) { + u8 *ptr = (u8 *)poff + *poff; + ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ ptr += ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++ if (ptr < (u8 *)_text || (u8 *)_einittext <= ptr) ++ ptr -= ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++#endif ++ + if (!*poff || ptr < text || ptr >= text_end) + continue; + /* turn lock prefix into DS segment override prefix */ +- if (*ptr == 0xf0) ++ if (*ktla_ktva(ptr) == 0xf0) + text_poke(ptr, ((unsigned char []){0x3E}), 1); + } + mutex_unlock(&text_mutex); +@@ -457,7 +481,7 @@ void __init_or_module apply_paravirt(struct paravirt_patch_site *start, + + BUG_ON(p->len > MAX_PATCH_LEN); + /* prep the buffer with the original instructions */ +- memcpy(insnbuf, p->instr, p->len); ++ memcpy(insnbuf, ktla_ktva(p->instr), p->len); + used = pv_init_ops.patch(p->instrtype, p->clobbers, insnbuf, + (unsigned long)p->instr, p->len); + +@@ -504,7 +528,7 @@ void __init alternative_instructions(void) + if (!uniproc_patched || num_possible_cpus() == 1) + free_init_pages("SMP alternatives", + (unsigned long)__smp_locks, +- (unsigned long)__smp_locks_end); ++ PAGE_ALIGN((unsigned long)__smp_locks_end)); + #endif + + apply_paravirt(__parainstructions, __parainstructions_end); +@@ -524,13 +548,17 @@ void __init alternative_instructions(void) + * instructions. And on the local CPU you need to be protected again NMI or MCE + * handlers seeing an inconsistent instruction while you patch. + */ +-void *__init_or_module text_poke_early(void *addr, const void *opcode, ++void *__kprobes text_poke_early(void *addr, const void *opcode, + size_t len) + { + unsigned long flags; + local_irq_save(flags); +- memcpy(addr, opcode, len); ++ ++ pax_open_kernel(); ++ memcpy(ktla_ktva(addr), opcode, len); + sync_core(); ++ pax_close_kernel(); ++ + local_irq_restore(flags); + /* Could also do a CLFLUSH here to speed up CPU recovery; but + that causes hangs on some VIA CPUs. */ +@@ -552,36 +580,22 @@ void *__init_or_module text_poke_early(void *addr, const void *opcode, + */ + void *text_poke(void *addr, const void *opcode, size_t len) + { +- unsigned long flags; +- char *vaddr; ++ unsigned char *vaddr = ktla_ktva(addr); + struct page *pages[2]; +- int i; ++ size_t i; + + if (!core_kernel_text((unsigned long)addr)) { +- pages[0] = vmalloc_to_page(addr); +- pages[1] = vmalloc_to_page(addr + PAGE_SIZE); ++ pages[0] = vmalloc_to_page(vaddr); ++ pages[1] = vmalloc_to_page(vaddr + PAGE_SIZE); + } else { +- pages[0] = virt_to_page(addr); ++ pages[0] = virt_to_page(vaddr); + WARN_ON(!PageReserved(pages[0])); +- pages[1] = virt_to_page(addr + PAGE_SIZE); ++ pages[1] = virt_to_page(vaddr + PAGE_SIZE); + } + BUG_ON(!pages[0]); +- local_irq_save(flags); +- set_fixmap(FIX_TEXT_POKE0, page_to_phys(pages[0])); +- if (pages[1]) +- set_fixmap(FIX_TEXT_POKE1, page_to_phys(pages[1])); +- vaddr = (char *)fix_to_virt(FIX_TEXT_POKE0); +- memcpy(&vaddr[(unsigned long)addr & ~PAGE_MASK], opcode, len); +- clear_fixmap(FIX_TEXT_POKE0); +- if (pages[1]) +- clear_fixmap(FIX_TEXT_POKE1); +- local_flush_tlb(); +- sync_core(); +- /* Could also do a CLFLUSH here to speed up CPU recovery; but +- that causes hangs on some VIA CPUs. */ ++ text_poke_early(addr, opcode, len); + for (i = 0; i < len; i++) +- BUG_ON(((char *)addr)[i] != ((char *)opcode)[i]); +- local_irq_restore(flags); ++ BUG_ON((vaddr)[i] != ((const unsigned char *)opcode)[i]); + return addr; + } + +@@ -601,7 +615,7 @@ int poke_int3_handler(struct pt_regs *regs) + if (likely(!bp_patching_in_progress)) + return 0; + +- if (user_mode_vm(regs) || regs->ip != (unsigned long)bp_int3_addr) ++ if (user_mode(regs) || regs->ip != (unsigned long)bp_int3_addr) + return 0; + + /* set up the specified breakpoint handler */ +@@ -635,7 +649,7 @@ int poke_int3_handler(struct pt_regs *regs) + */ + void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler) + { +- unsigned char int3 = 0xcc; ++ const unsigned char int3 = 0xcc; + + bp_int3_handler = handler; + bp_int3_addr = (u8 *)addr + sizeof(int3); +diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c +index ba6cc04..06fd971 100644 +--- a/arch/x86/kernel/apic/apic.c ++++ b/arch/x86/kernel/apic/apic.c +@@ -201,7 +201,7 @@ int first_system_vector = 0xfe; + /* + * Debug level, exported for io_apic.c + */ +-unsigned int apic_verbosity; ++int apic_verbosity; + + int pic_mode; + +@@ -1989,7 +1989,7 @@ static inline void __smp_error_interrupt(struct pt_regs *regs) + apic_write(APIC_ESR, 0); + v = apic_read(APIC_ESR); + ack_APIC_irq(); +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + + apic_printk(APIC_DEBUG, KERN_DEBUG "APIC error on CPU%d: %02x", + smp_processor_id(), v); +diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c +index de918c4..32eed23 100644 +--- a/arch/x86/kernel/apic/apic_flat_64.c ++++ b/arch/x86/kernel/apic/apic_flat_64.c +@@ -154,7 +154,7 @@ static int flat_probe(void) + return 1; + } + +-static struct apic apic_flat = { ++static struct apic apic_flat __read_only = { + .name = "flat", + .probe = flat_probe, + .acpi_madt_oem_check = flat_acpi_madt_oem_check, +@@ -260,7 +260,7 @@ static int physflat_probe(void) + return 0; + } + +-static struct apic apic_physflat = { ++static struct apic apic_physflat __read_only = { + + .name = "physical flat", + .probe = physflat_probe, +diff --git a/arch/x86/kernel/apic/apic_noop.c b/arch/x86/kernel/apic/apic_noop.c +index b205cdb..d8503ff 100644 +--- a/arch/x86/kernel/apic/apic_noop.c ++++ b/arch/x86/kernel/apic/apic_noop.c +@@ -108,7 +108,7 @@ static void noop_apic_write(u32 reg, u32 v) + WARN_ON_ONCE(cpu_has_apic && !disable_apic); + } + +-struct apic apic_noop = { ++struct apic apic_noop __read_only = { + .name = "noop", + .probe = noop_probe, + .acpi_madt_oem_check = NULL, +diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c +index c4a8d63..fe893ac 100644 +--- a/arch/x86/kernel/apic/bigsmp_32.c ++++ b/arch/x86/kernel/apic/bigsmp_32.c +@@ -147,7 +147,7 @@ static int probe_bigsmp(void) + return dmi_bigsmp; + } + +-static struct apic apic_bigsmp = { ++static struct apic apic_bigsmp __read_only = { + + .name = "bigsmp", + .probe = probe_bigsmp, +diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c +index 1183d54..dc39b33 100644 +--- a/arch/x86/kernel/apic/io_apic.c ++++ b/arch/x86/kernel/apic/io_apic.c +@@ -1230,7 +1230,7 @@ out: + } + EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector); + +-void lock_vector_lock(void) ++void lock_vector_lock(void) __acquires(vector_lock) + { + /* Used to the online set of cpus does not change + * during assign_irq_vector. +@@ -1238,7 +1238,7 @@ void lock_vector_lock(void) + raw_spin_lock(&vector_lock); + } + +-void unlock_vector_lock(void) ++void unlock_vector_lock(void) __releases(vector_lock) + { + raw_spin_unlock(&vector_lock); + } +@@ -2465,7 +2465,7 @@ static void ack_apic_edge(struct irq_data *data) + ack_APIC_irq(); + } + +-atomic_t irq_mis_count; ++atomic_unchecked_t irq_mis_count; + + #ifdef CONFIG_GENERIC_PENDING_IRQ + static bool io_apic_level_ack_pending(struct irq_cfg *cfg) +@@ -2606,7 +2606,7 @@ static void ack_apic_level(struct irq_data *data) + * at the cpu. + */ + if (!(v & (1 << (i & 0x1f)))) { +- atomic_inc(&irq_mis_count); ++ atomic_inc_unchecked(&irq_mis_count); + + eoi_ioapic_irq(irq, cfg); + } +@@ -2614,7 +2614,7 @@ static void ack_apic_level(struct irq_data *data) + ioapic_irqd_unmask(data, cfg, masked); + } + +-static struct irq_chip ioapic_chip __read_mostly = { ++static struct irq_chip ioapic_chip = { + .name = "IO-APIC", + .irq_startup = startup_ioapic_irq, + .irq_mask = mask_ioapic_irq, +@@ -2673,7 +2673,7 @@ static void ack_lapic_irq(struct irq_data *data) + ack_APIC_irq(); + } + +-static struct irq_chip lapic_chip __read_mostly = { ++static struct irq_chip lapic_chip = { + .name = "local-APIC", + .irq_mask = mask_lapic_irq, + .irq_unmask = unmask_lapic_irq, +diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c +index bda4886..f9c7195 100644 +--- a/arch/x86/kernel/apic/probe_32.c ++++ b/arch/x86/kernel/apic/probe_32.c +@@ -72,7 +72,7 @@ static int probe_default(void) + return 1; + } + +-static struct apic apic_default = { ++static struct apic apic_default __read_only = { + + .name = "default", + .probe = probe_default, +diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c +index e658f21..b695a1a 100644 +--- a/arch/x86/kernel/apic/x2apic_cluster.c ++++ b/arch/x86/kernel/apic/x2apic_cluster.c +@@ -182,7 +182,7 @@ update_clusterinfo(struct notifier_block *nfb, unsigned long action, void *hcpu) + return notifier_from_errno(err); + } + +-static struct notifier_block __refdata x2apic_cpu_notifier = { ++static struct notifier_block x2apic_cpu_notifier = { + .notifier_call = update_clusterinfo, + }; + +@@ -234,7 +234,7 @@ static void cluster_vector_allocation_domain(int cpu, struct cpumask *retmask, + cpumask_and(retmask, mask, per_cpu(cpus_in_cluster, cpu)); + } + +-static struct apic apic_x2apic_cluster = { ++static struct apic apic_x2apic_cluster __read_only = { + + .name = "cluster x2apic", + .probe = x2apic_cluster_probe, +diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c +index 6fae733..5ca17af 100644 +--- a/arch/x86/kernel/apic/x2apic_phys.c ++++ b/arch/x86/kernel/apic/x2apic_phys.c +@@ -88,7 +88,7 @@ static int x2apic_phys_probe(void) + return apic == &apic_x2apic_phys; + } + +-static struct apic apic_x2apic_phys = { ++static struct apic apic_x2apic_phys __read_only = { + + .name = "physical x2apic", + .probe = x2apic_phys_probe, +diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c +index 8e9dcfd..c61b3e4 100644 +--- a/arch/x86/kernel/apic/x2apic_uv_x.c ++++ b/arch/x86/kernel/apic/x2apic_uv_x.c +@@ -348,7 +348,7 @@ static int uv_probe(void) + return apic == &apic_x2apic_uv_x; + } + +-static struct apic __refdata apic_x2apic_uv_x = { ++static struct apic apic_x2apic_uv_x __read_only = { + + .name = "UV large system", + .probe = uv_probe, +diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c +index 5848744..286d7bc 100644 +--- a/arch/x86/kernel/apm_32.c ++++ b/arch/x86/kernel/apm_32.c +@@ -433,7 +433,7 @@ static DEFINE_MUTEX(apm_mutex); + * This is for buggy BIOS's that refer to (real mode) segment 0x40 + * even though they are called in protected mode. + */ +-static struct desc_struct bad_bios_desc = GDT_ENTRY_INIT(0x4092, ++static const struct desc_struct bad_bios_desc = GDT_ENTRY_INIT(0x4093, + (unsigned long)__va(0x400UL), PAGE_SIZE - 0x400 - 1); + + static const char driver_version[] = "1.16ac"; /* no spaces */ +@@ -611,7 +611,10 @@ static long __apm_bios_call(void *_call) + BUG_ON(cpu != 0); + gdt = get_cpu_gdt_table(cpu); + save_desc_40 = gdt[0x40 / 8]; ++ ++ pax_open_kernel(); + gdt[0x40 / 8] = bad_bios_desc; ++ pax_close_kernel(); + + apm_irq_save(flags); + APM_DO_SAVE_SEGS; +@@ -620,7 +623,11 @@ static long __apm_bios_call(void *_call) + &call->esi); + APM_DO_RESTORE_SEGS; + apm_irq_restore(flags); ++ ++ pax_open_kernel(); + gdt[0x40 / 8] = save_desc_40; ++ pax_close_kernel(); ++ + put_cpu(); + + return call->eax & 0xff; +@@ -687,7 +694,10 @@ static long __apm_bios_call_simple(void *_call) + BUG_ON(cpu != 0); + gdt = get_cpu_gdt_table(cpu); + save_desc_40 = gdt[0x40 / 8]; ++ ++ pax_open_kernel(); + gdt[0x40 / 8] = bad_bios_desc; ++ pax_close_kernel(); + + apm_irq_save(flags); + APM_DO_SAVE_SEGS; +@@ -695,7 +705,11 @@ static long __apm_bios_call_simple(void *_call) + &call->eax); + APM_DO_RESTORE_SEGS; + apm_irq_restore(flags); ++ ++ pax_open_kernel(); + gdt[0x40 / 8] = save_desc_40; ++ pax_close_kernel(); ++ + put_cpu(); + return error; + } +@@ -2040,7 +2054,7 @@ static int __init swab_apm_power_in_minutes(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id __initdata apm_dmi_table[] = { ++static const struct dmi_system_id __initconst apm_dmi_table[] = { + { + print_if_true, + KERN_WARNING "IBM T23 - BIOS 1.03b+ and controller firmware 1.02+ may be needed for Linux APM.", +@@ -2350,12 +2364,15 @@ static int __init apm_init(void) + * code to that CPU. + */ + gdt = get_cpu_gdt_table(0); ++ ++ pax_open_kernel(); + set_desc_base(&gdt[APM_CS >> 3], + (unsigned long)__va((unsigned long)apm_info.bios.cseg << 4)); + set_desc_base(&gdt[APM_CS_16 >> 3], + (unsigned long)__va((unsigned long)apm_info.bios.cseg_16 << 4)); + set_desc_base(&gdt[APM_DS >> 3], + (unsigned long)__va((unsigned long)apm_info.bios.dseg << 4)); ++ pax_close_kernel(); + + proc_create("apm", 0, NULL, &apm_file_ops); + +diff --git a/arch/x86/kernel/asm-offsets.c b/arch/x86/kernel/asm-offsets.c +index 9f6b934..cf5ffb3 100644 +--- a/arch/x86/kernel/asm-offsets.c ++++ b/arch/x86/kernel/asm-offsets.c +@@ -32,6 +32,8 @@ void common(void) { + OFFSET(TI_flags, thread_info, flags); + OFFSET(TI_status, thread_info, status); + OFFSET(TI_addr_limit, thread_info, addr_limit); ++ OFFSET(TI_lowest_stack, thread_info, lowest_stack); ++ DEFINE(TI_task_thread_sp0, offsetof(struct task_struct, thread.sp0) - offsetof(struct task_struct, tinfo)); + + BLANK(); + OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx); +@@ -52,8 +54,26 @@ void common(void) { + OFFSET(PV_CPU_irq_enable_sysexit, pv_cpu_ops, irq_enable_sysexit); + OFFSET(PV_CPU_read_cr0, pv_cpu_ops, read_cr0); + OFFSET(PV_MMU_read_cr2, pv_mmu_ops, read_cr2); ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ OFFSET(PV_CPU_write_cr0, pv_cpu_ops, write_cr0); ++#endif ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ OFFSET(PV_MMU_read_cr3, pv_mmu_ops, read_cr3); ++ OFFSET(PV_MMU_write_cr3, pv_mmu_ops, write_cr3); ++#ifdef CONFIG_X86_64 ++ OFFSET(PV_MMU_set_pgd_batched, pv_mmu_ops, set_pgd_batched); ++#endif + #endif + ++#endif ++ ++ BLANK(); ++ DEFINE(PAGE_SIZE_asm, PAGE_SIZE); ++ DEFINE(PAGE_SHIFT_asm, PAGE_SHIFT); ++ DEFINE(THREAD_SIZE_asm, THREAD_SIZE); ++ + #ifdef CONFIG_XEN + BLANK(); + OFFSET(XEN_vcpu_info_mask, vcpu_info, evtchn_upcall_mask); +diff --git a/arch/x86/kernel/asm-offsets_64.c b/arch/x86/kernel/asm-offsets_64.c +index e7c798b..2b2019b 100644 +--- a/arch/x86/kernel/asm-offsets_64.c ++++ b/arch/x86/kernel/asm-offsets_64.c +@@ -77,6 +77,7 @@ int main(void) + BLANK(); + #undef ENTRY + ++ DEFINE(TSS_size, sizeof(struct tss_struct)); + OFFSET(TSS_ist, tss_struct, x86_tss.ist); + BLANK(); + +diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile +index 80091ae..0c5184f 100644 +--- a/arch/x86/kernel/cpu/Makefile ++++ b/arch/x86/kernel/cpu/Makefile +@@ -8,10 +8,6 @@ CFLAGS_REMOVE_common.o = -pg + CFLAGS_REMOVE_perf_event.o = -pg + endif + +-# Make sure load_percpu_segment has no stackprotector +-nostackp := $(call cc-option, -fno-stack-protector) +-CFLAGS_common.o := $(nostackp) +- + obj-y := intel_cacheinfo.o scattered.o topology.o + obj-y += common.o + obj-y += rdrand.o +diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c +index 813d29d..6e542d4 100644 +--- a/arch/x86/kernel/cpu/amd.c ++++ b/arch/x86/kernel/cpu/amd.c +@@ -718,7 +718,7 @@ static void init_amd(struct cpuinfo_x86 *c) + static unsigned int amd_size_cache(struct cpuinfo_x86 *c, unsigned int size) + { + /* AMD errata T13 (order #21922) */ +- if ((c->x86 == 6)) { ++ if (c->x86 == 6) { + /* Duron Rev A0 */ + if (c->x86_model == 3 && c->x86_mask == 0) + size = 64; +diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c +index cfa9b5b..e8426dd 100644 +--- a/arch/x86/kernel/cpu/common.c ++++ b/arch/x86/kernel/cpu/common.c +@@ -90,60 +90,6 @@ static const struct cpu_dev default_cpu = { + + static const struct cpu_dev *this_cpu = &default_cpu; + +-DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = { +-#ifdef CONFIG_X86_64 +- /* +- * We need valid kernel segments for data and code in long mode too +- * IRET will check the segment types kkeil 2000/10/28 +- * Also sysret mandates a special GDT layout +- * +- * TLS descriptors are currently at a different place compared to i386. +- * Hopefully nobody expects them at a fixed place (Wine?) +- */ +- [GDT_ENTRY_KERNEL32_CS] = GDT_ENTRY_INIT(0xc09b, 0, 0xfffff), +- [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(0xa09b, 0, 0xfffff), +- [GDT_ENTRY_KERNEL_DS] = GDT_ENTRY_INIT(0xc093, 0, 0xfffff), +- [GDT_ENTRY_DEFAULT_USER32_CS] = GDT_ENTRY_INIT(0xc0fb, 0, 0xfffff), +- [GDT_ENTRY_DEFAULT_USER_DS] = GDT_ENTRY_INIT(0xc0f3, 0, 0xfffff), +- [GDT_ENTRY_DEFAULT_USER_CS] = GDT_ENTRY_INIT(0xa0fb, 0, 0xfffff), +-#else +- [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(0xc09a, 0, 0xfffff), +- [GDT_ENTRY_KERNEL_DS] = GDT_ENTRY_INIT(0xc092, 0, 0xfffff), +- [GDT_ENTRY_DEFAULT_USER_CS] = GDT_ENTRY_INIT(0xc0fa, 0, 0xfffff), +- [GDT_ENTRY_DEFAULT_USER_DS] = GDT_ENTRY_INIT(0xc0f2, 0, 0xfffff), +- /* +- * Segments used for calling PnP BIOS have byte granularity. +- * They code segments and data segments have fixed 64k limits, +- * the transfer segment sizes are set at run time. +- */ +- /* 32-bit code */ +- [GDT_ENTRY_PNPBIOS_CS32] = GDT_ENTRY_INIT(0x409a, 0, 0xffff), +- /* 16-bit code */ +- [GDT_ENTRY_PNPBIOS_CS16] = GDT_ENTRY_INIT(0x009a, 0, 0xffff), +- /* 16-bit data */ +- [GDT_ENTRY_PNPBIOS_DS] = GDT_ENTRY_INIT(0x0092, 0, 0xffff), +- /* 16-bit data */ +- [GDT_ENTRY_PNPBIOS_TS1] = GDT_ENTRY_INIT(0x0092, 0, 0), +- /* 16-bit data */ +- [GDT_ENTRY_PNPBIOS_TS2] = GDT_ENTRY_INIT(0x0092, 0, 0), +- /* +- * The APM segments have byte granularity and their bases +- * are set at run time. All have 64k limits. +- */ +- /* 32-bit code */ +- [GDT_ENTRY_APMBIOS_BASE] = GDT_ENTRY_INIT(0x409a, 0, 0xffff), +- /* 16-bit code */ +- [GDT_ENTRY_APMBIOS_BASE+1] = GDT_ENTRY_INIT(0x009a, 0, 0xffff), +- /* data */ +- [GDT_ENTRY_APMBIOS_BASE+2] = GDT_ENTRY_INIT(0x4092, 0, 0xffff), +- +- [GDT_ENTRY_ESPFIX_SS] = GDT_ENTRY_INIT(0xc092, 0, 0xfffff), +- [GDT_ENTRY_PERCPU] = GDT_ENTRY_INIT(0xc092, 0, 0xfffff), +- GDT_STACK_CANARY_INIT +-#endif +-} }; +-EXPORT_PER_CPU_SYMBOL_GPL(gdt_page); +- + static int __init x86_xsave_setup(char *s) + { + if (strlen(s)) +@@ -305,6 +251,59 @@ static __always_inline void setup_smap(struct cpuinfo_x86 *c) + } + } + ++#ifdef CONFIG_X86_64 ++static __init int setup_disable_pcid(char *arg) ++{ ++ setup_clear_cpu_cap(X86_FEATURE_PCID); ++ setup_clear_cpu_cap(X86_FEATURE_INVPCID); ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (clone_pgd_mask != ~(pgdval_t)0UL) ++ pax_user_shadow_base = 1UL << TASK_SIZE_MAX_SHIFT; ++#endif ++ ++ return 1; ++} ++__setup("nopcid", setup_disable_pcid); ++ ++static void setup_pcid(struct cpuinfo_x86 *c) ++{ ++ if (!cpu_has(c, X86_FEATURE_PCID)) { ++ clear_cpu_cap(c, X86_FEATURE_INVPCID); ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ if (clone_pgd_mask != ~(pgdval_t)0UL) { ++ pax_open_kernel(); ++ pax_user_shadow_base = 1UL << TASK_SIZE_MAX_SHIFT; ++ pax_close_kernel(); ++ printk("PAX: slow and weak UDEREF enabled\n"); ++ } else ++ printk("PAX: UDEREF disabled\n"); ++#endif ++ ++ return; ++ } ++ ++ printk("PAX: PCID detected\n"); ++ set_in_cr4(X86_CR4_PCIDE); ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ pax_open_kernel(); ++ clone_pgd_mask = ~(pgdval_t)0UL; ++ pax_close_kernel(); ++ if (pax_user_shadow_base) ++ printk("PAX: weak UDEREF enabled\n"); ++ else { ++ set_cpu_cap(c, X86_FEATURE_STRONGUDEREF); ++ printk("PAX: strong UDEREF enabled\n"); ++ } ++#endif ++ ++ if (cpu_has(c, X86_FEATURE_INVPCID)) ++ printk("PAX: INVPCID detected\n"); ++} ++#endif ++ + /* + * Some CPU features depend on higher CPUID levels, which may not always + * be available due to CPUID level capping or broken virtualization +@@ -405,7 +404,7 @@ void switch_to_new_gdt(int cpu) + { + struct desc_ptr gdt_descr; + +- gdt_descr.address = (long)get_cpu_gdt_table(cpu); ++ gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu); + gdt_descr.size = GDT_SIZE - 1; + load_gdt(&gdt_descr); + /* Reload the per-cpu base */ +@@ -895,6 +894,20 @@ static void identify_cpu(struct cpuinfo_x86 *c) + setup_smep(c); + setup_smap(c); + ++#ifdef CONFIG_X86_32 ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!(__supported_pte_mask & _PAGE_NX)) ++ clear_cpu_cap(c, X86_FEATURE_PSE); ++#endif ++#if defined(CONFIG_PAX_SEGMEXEC) || defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ clear_cpu_cap(c, X86_FEATURE_SEP); ++#endif ++#endif ++ ++#ifdef CONFIG_X86_64 ++ setup_pcid(c); ++#endif ++ + /* + * The vendor-specific functions might have changed features. + * Now we do "generic changes." +@@ -985,7 +998,7 @@ static void syscall32_cpu_init(void) + void enable_sep_cpu(void) + { + int cpu = get_cpu(); +- struct tss_struct *tss = &per_cpu(init_tss, cpu); ++ struct tss_struct *tss = init_tss + cpu; + + if (!boot_cpu_has(X86_FEATURE_SEP)) { + put_cpu(); +@@ -1125,14 +1138,16 @@ static __init int setup_disablecpuid(char *arg) + } + __setup("clearcpuid=", setup_disablecpuid); + ++DEFINE_PER_CPU(struct thread_info *, current_tinfo) = &init_task.tinfo; ++EXPORT_PER_CPU_SYMBOL(current_tinfo); ++ + DEFINE_PER_CPU(unsigned long, kernel_stack) = +- (unsigned long)&init_thread_union - KERNEL_STACK_OFFSET + THREAD_SIZE; ++ (unsigned long)&init_thread_union - 16 + THREAD_SIZE; + EXPORT_PER_CPU_SYMBOL(kernel_stack); + + #ifdef CONFIG_X86_64 +-struct desc_ptr idt_descr = { NR_VECTORS * 16 - 1, (unsigned long) idt_table }; +-struct desc_ptr debug_idt_descr = { NR_VECTORS * 16 - 1, +- (unsigned long) debug_idt_table }; ++struct desc_ptr idt_descr __read_only = { NR_VECTORS * 16 - 1, (unsigned long) idt_table }; ++const struct desc_ptr debug_idt_descr = { NR_VECTORS * 16 - 1, (unsigned long) debug_idt_table }; + + DEFINE_PER_CPU_FIRST(union irq_stack_union, + irq_stack_union) __aligned(PAGE_SIZE) __visible; +@@ -1309,7 +1324,7 @@ void cpu_init(void) + */ + load_ucode_ap(); + +- t = &per_cpu(init_tss, cpu); ++ t = init_tss + cpu; + oist = &per_cpu(orig_ist, cpu); + + #ifdef CONFIG_NUMA +@@ -1341,7 +1356,6 @@ void cpu_init(void) + wrmsrl(MSR_KERNEL_GS_BASE, 0); + barrier(); + +- x86_configure_nx(); + enable_x2apic(); + + /* +@@ -1393,7 +1407,7 @@ void cpu_init(void) + { + int cpu = smp_processor_id(); + struct task_struct *curr = current; +- struct tss_struct *t = &per_cpu(init_tss, cpu); ++ struct tss_struct *t = init_tss + cpu; + struct thread_struct *thread = &curr->thread; + + wait_for_master_cpu(cpu); +diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c +index c703507..28535e3 100644 +--- a/arch/x86/kernel/cpu/intel_cacheinfo.c ++++ b/arch/x86/kernel/cpu/intel_cacheinfo.c +@@ -1026,6 +1026,22 @@ static struct attribute *default_attrs[] = { + }; + + #ifdef CONFIG_AMD_NB ++static struct attribute *default_attrs_amd_nb[] = { ++ &type.attr, ++ &level.attr, ++ &coherency_line_size.attr, ++ &physical_line_partition.attr, ++ &ways_of_associativity.attr, ++ &number_of_sets.attr, ++ &size.attr, ++ &shared_cpu_map.attr, ++ &shared_cpu_list.attr, ++ NULL, ++ NULL, ++ NULL, ++ NULL ++}; ++ + static struct attribute **amd_l3_attrs(void) + { + static struct attribute **attrs; +@@ -1036,18 +1052,7 @@ static struct attribute **amd_l3_attrs(void) + + n = ARRAY_SIZE(default_attrs); + +- if (amd_nb_has_feature(AMD_NB_L3_INDEX_DISABLE)) +- n += 2; +- +- if (amd_nb_has_feature(AMD_NB_L3_PARTITIONING)) +- n += 1; +- +- attrs = kzalloc(n * sizeof (struct attribute *), GFP_KERNEL); +- if (attrs == NULL) +- return attrs = default_attrs; +- +- for (n = 0; default_attrs[n]; n++) +- attrs[n] = default_attrs[n]; ++ attrs = default_attrs_amd_nb; + + if (amd_nb_has_feature(AMD_NB_L3_INDEX_DISABLE)) { + attrs[n++] = &cache_disable_0.attr; +@@ -1098,6 +1103,13 @@ static struct kobj_type ktype_cache = { + .default_attrs = default_attrs, + }; + ++#ifdef CONFIG_AMD_NB ++static struct kobj_type ktype_cache_amd_nb = { ++ .sysfs_ops = &sysfs_ops, ++ .default_attrs = default_attrs_amd_nb, ++}; ++#endif ++ + static struct kobj_type ktype_percpu_entry = { + .sysfs_ops = &sysfs_ops, + }; +@@ -1163,20 +1175,26 @@ static int cache_add_dev(struct device *dev) + return retval; + } + ++#ifdef CONFIG_AMD_NB ++ amd_l3_attrs(); ++#endif ++ + for (i = 0; i < num_cache_leaves; i++) { ++ struct kobj_type *ktype; ++ + this_object = INDEX_KOBJECT_PTR(cpu, i); + this_object->cpu = cpu; + this_object->index = i; + + this_leaf = CPUID4_INFO_IDX(cpu, i); + +- ktype_cache.default_attrs = default_attrs; ++ ktype = &ktype_cache; + #ifdef CONFIG_AMD_NB + if (this_leaf->base.nb) +- ktype_cache.default_attrs = amd_l3_attrs(); ++ ktype = &ktype_cache_amd_nb; + #endif + retval = kobject_init_and_add(&(this_object->kobj), +- &ktype_cache, ++ ktype, + per_cpu(ici_cache_kobject, cpu), + "index%1lu", i); + if (unlikely(retval)) { +diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c +index 61a9668ce..b446a37 100644 +--- a/arch/x86/kernel/cpu/mcheck/mce.c ++++ b/arch/x86/kernel/cpu/mcheck/mce.c +@@ -45,6 +45,7 @@ + #include <asm/processor.h> + #include <asm/mce.h> + #include <asm/msr.h> ++#include <asm/local.h> + + #include "mce-internal.h" + +@@ -259,7 +260,7 @@ static void print_mce(struct mce *m) + !(m->mcgstatus & MCG_STATUS_EIPV) ? " !INEXACT!" : "", + m->cs, m->ip); + +- if (m->cs == __KERNEL_CS) ++ if (m->cs == __KERNEL_CS || m->cs == __KERNEXEC_KERNEL_CS) + print_symbol("{%s}", m->ip); + pr_cont("\n"); + } +@@ -292,10 +293,10 @@ static void print_mce(struct mce *m) + + #define PANIC_TIMEOUT 5 /* 5 seconds */ + +-static atomic_t mce_paniced; ++static atomic_unchecked_t mce_paniced; + + static int fake_panic; +-static atomic_t mce_fake_paniced; ++static atomic_unchecked_t mce_fake_paniced; + + /* Panic in progress. Enable interrupts and wait for final IPI */ + static void wait_for_panic(void) +@@ -319,7 +320,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp) + /* + * Make sure only one CPU runs in machine check panic + */ +- if (atomic_inc_return(&mce_paniced) > 1) ++ if (atomic_inc_return_unchecked(&mce_paniced) > 1) + wait_for_panic(); + barrier(); + +@@ -327,7 +328,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp) + console_verbose(); + } else { + /* Don't log too much for fake panic */ +- if (atomic_inc_return(&mce_fake_paniced) > 1) ++ if (atomic_inc_return_unchecked(&mce_fake_paniced) > 1) + return; + } + /* First print corrected ones that are still unlogged */ +@@ -366,7 +367,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp) + if (!fake_panic) { + if (panic_timeout == 0) + panic_timeout = mca_cfg.panic_timeout; +- panic(msg); ++ panic("%s", msg); + } else + pr_emerg(HW_ERR "Fake kernel panic: %s\n", msg); + } +@@ -697,7 +698,7 @@ static int mce_timed_out(u64 *t) + * might have been modified by someone else. + */ + rmb(); +- if (atomic_read(&mce_paniced)) ++ if (atomic_read_unchecked(&mce_paniced)) + wait_for_panic(); + if (!mca_cfg.monarch_timeout) + goto out; +@@ -1674,7 +1675,7 @@ static void unexpected_machine_check(struct pt_regs *regs, long error_code) + } + + /* Call the installed machine check handler for this CPU setup. */ +-void (*machine_check_vector)(struct pt_regs *, long error_code) = ++void (*machine_check_vector)(struct pt_regs *, long error_code) __read_only = + unexpected_machine_check; + + /* +@@ -1697,7 +1698,9 @@ void mcheck_cpu_init(struct cpuinfo_x86 *c) + return; + } + ++ pax_open_kernel(); + machine_check_vector = do_machine_check; ++ pax_close_kernel(); + + __mcheck_cpu_init_generic(); + __mcheck_cpu_init_vendor(c); +@@ -1711,7 +1714,7 @@ void mcheck_cpu_init(struct cpuinfo_x86 *c) + */ + + static DEFINE_SPINLOCK(mce_chrdev_state_lock); +-static int mce_chrdev_open_count; /* #times opened */ ++static local_t mce_chrdev_open_count; /* #times opened */ + static int mce_chrdev_open_exclu; /* already open exclusive? */ + + static int mce_chrdev_open(struct inode *inode, struct file *file) +@@ -1719,7 +1722,7 @@ static int mce_chrdev_open(struct inode *inode, struct file *file) + spin_lock(&mce_chrdev_state_lock); + + if (mce_chrdev_open_exclu || +- (mce_chrdev_open_count && (file->f_flags & O_EXCL))) { ++ (local_read(&mce_chrdev_open_count) && (file->f_flags & O_EXCL))) { + spin_unlock(&mce_chrdev_state_lock); + + return -EBUSY; +@@ -1727,7 +1730,7 @@ static int mce_chrdev_open(struct inode *inode, struct file *file) + + if (file->f_flags & O_EXCL) + mce_chrdev_open_exclu = 1; +- mce_chrdev_open_count++; ++ local_inc(&mce_chrdev_open_count); + + spin_unlock(&mce_chrdev_state_lock); + +@@ -1738,7 +1741,7 @@ static int mce_chrdev_release(struct inode *inode, struct file *file) + { + spin_lock(&mce_chrdev_state_lock); + +- mce_chrdev_open_count--; ++ local_dec(&mce_chrdev_open_count); + mce_chrdev_open_exclu = 0; + + spin_unlock(&mce_chrdev_state_lock); +@@ -2413,7 +2416,7 @@ static __init void mce_init_banks(void) + + for (i = 0; i < mca_cfg.banks; i++) { + struct mce_bank *b = &mce_banks[i]; +- struct device_attribute *a = &b->attr; ++ device_attribute_no_const *a = &b->attr; + + sysfs_attr_init(&a->attr); + a->attr.name = b->attrname; +@@ -2520,7 +2523,7 @@ struct dentry *mce_get_debugfs_dir(void) + static void mce_reset(void) + { + cpu_missing = 0; +- atomic_set(&mce_fake_paniced, 0); ++ atomic_set_unchecked(&mce_fake_paniced, 0); + atomic_set(&mce_executing, 0); + atomic_set(&mce_callin, 0); + atomic_set(&global_nwo, 0); +diff --git a/arch/x86/kernel/cpu/mcheck/p5.c b/arch/x86/kernel/cpu/mcheck/p5.c +index a304298..49b6d06 100644 +--- a/arch/x86/kernel/cpu/mcheck/p5.c ++++ b/arch/x86/kernel/cpu/mcheck/p5.c +@@ -10,6 +10,7 @@ + #include <asm/processor.h> + #include <asm/mce.h> + #include <asm/msr.h> ++#include <asm/pgtable.h> + + /* By default disabled */ + int mce_p5_enabled __read_mostly; +@@ -48,7 +49,9 @@ void intel_p5_mcheck_init(struct cpuinfo_x86 *c) + if (!cpu_has(c, X86_FEATURE_MCE)) + return; + ++ pax_open_kernel(); + machine_check_vector = pentium_machine_check; ++ pax_close_kernel(); + /* Make sure the vector pointer is visible before we enable MCEs: */ + wmb(); + +diff --git a/arch/x86/kernel/cpu/mcheck/winchip.c b/arch/x86/kernel/cpu/mcheck/winchip.c +index 7dc5564..1273569 100644 +--- a/arch/x86/kernel/cpu/mcheck/winchip.c ++++ b/arch/x86/kernel/cpu/mcheck/winchip.c +@@ -9,6 +9,7 @@ + #include <asm/processor.h> + #include <asm/mce.h> + #include <asm/msr.h> ++#include <asm/pgtable.h> + + /* Machine check handler for WinChip C6: */ + static void winchip_machine_check(struct pt_regs *regs, long error_code) +@@ -22,7 +23,9 @@ void winchip_mcheck_init(struct cpuinfo_x86 *c) + { + u32 lo, hi; + ++ pax_open_kernel(); + machine_check_vector = winchip_machine_check; ++ pax_close_kernel(); + /* Make sure the vector pointer is visible before we enable MCEs: */ + wmb(); + +diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c +index 36a8361..e7058c2 100644 +--- a/arch/x86/kernel/cpu/microcode/core.c ++++ b/arch/x86/kernel/cpu/microcode/core.c +@@ -518,7 +518,7 @@ mc_cpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu) + return NOTIFY_OK; + } + +-static struct notifier_block __refdata mc_cpu_notifier = { ++static struct notifier_block mc_cpu_notifier = { + .notifier_call = mc_cpu_callback, + }; + +diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c +index c6826d1..8dc677e 100644 +--- a/arch/x86/kernel/cpu/microcode/intel.c ++++ b/arch/x86/kernel/cpu/microcode/intel.c +@@ -196,6 +196,11 @@ static enum ucode_state generic_load_microcode(int cpu, void *data, size_t size, + struct microcode_header_intel mc_header; + unsigned int mc_size; + ++ if (leftover < sizeof(mc_header)) { ++ pr_err("error! Truncated header in microcode data file\n"); ++ break; ++ } ++ + if (get_ucode_data(&mc_header, ucode_ptr, sizeof(mc_header))) + break; + +@@ -293,13 +298,13 @@ static enum ucode_state request_microcode_fw(int cpu, struct device *device, + + static int get_ucode_user(void *to, const void *from, size_t n) + { +- return copy_from_user(to, from, n); ++ return copy_from_user(to, (const void __force_user *)from, n); + } + + static enum ucode_state + request_microcode_user(int cpu, const void __user *buf, size_t size) + { +- return generic_load_microcode(cpu, (void *)buf, size, &get_ucode_user); ++ return generic_load_microcode(cpu, (__force_kernel void *)buf, size, &get_ucode_user); + } + + static void microcode_fini_cpu(int cpu) +diff --git a/arch/x86/kernel/cpu/microcode/intel_early.c b/arch/x86/kernel/cpu/microcode/intel_early.c +index ec9df6f..420eb93 100644 +--- a/arch/x86/kernel/cpu/microcode/intel_early.c ++++ b/arch/x86/kernel/cpu/microcode/intel_early.c +@@ -321,7 +321,11 @@ get_matching_model_microcode(int cpu, unsigned long start, + unsigned int mc_saved_count = mc_saved_data->mc_saved_count; + int i; + +- while (leftover) { ++ while (leftover && mc_saved_count < ARRAY_SIZE(mc_saved_tmp)) { ++ ++ if (leftover < sizeof(mc_header)) ++ break; ++ + mc_header = (struct microcode_header_intel *)ucode_ptr; + + mc_size = get_totalsize(mc_header); +diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c +index ea5f363..cb0e905 100644 +--- a/arch/x86/kernel/cpu/mtrr/main.c ++++ b/arch/x86/kernel/cpu/mtrr/main.c +@@ -66,7 +66,7 @@ static DEFINE_MUTEX(mtrr_mutex); + u64 size_or_mask, size_and_mask; + static bool mtrr_aps_delayed_init; + +-static const struct mtrr_ops *mtrr_ops[X86_VENDOR_NUM]; ++static const struct mtrr_ops *mtrr_ops[X86_VENDOR_NUM] __read_only; + + const struct mtrr_ops *mtrr_if; + +diff --git a/arch/x86/kernel/cpu/mtrr/mtrr.h b/arch/x86/kernel/cpu/mtrr/mtrr.h +index df5e41f..816c719 100644 +--- a/arch/x86/kernel/cpu/mtrr/mtrr.h ++++ b/arch/x86/kernel/cpu/mtrr/mtrr.h +@@ -25,7 +25,7 @@ struct mtrr_ops { + int (*validate_add_page)(unsigned long base, unsigned long size, + unsigned int type); + int (*have_wrcomb)(void); +-}; ++} __do_const; + + extern int generic_get_free_region(unsigned long base, unsigned long size, + int replace_reg); +diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c +index 143e5f5..5825081 100644 +--- a/arch/x86/kernel/cpu/perf_event.c ++++ b/arch/x86/kernel/cpu/perf_event.c +@@ -1374,7 +1374,7 @@ static void __init pmu_check_apic(void) + + } + +-static struct attribute_group x86_pmu_format_group = { ++static attribute_group_no_const x86_pmu_format_group = { + .name = "format", + .attrs = NULL, + }; +@@ -1473,7 +1473,7 @@ static struct attribute *events_attr[] = { + NULL, + }; + +-static struct attribute_group x86_pmu_events_group = { ++static attribute_group_no_const x86_pmu_events_group = { + .name = "events", + .attrs = events_attr, + }; +@@ -1997,7 +1997,7 @@ static unsigned long get_segment_base(unsigned int segment) + if (idx > GDT_ENTRIES) + return 0; + +- desc = raw_cpu_ptr(gdt_page.gdt); ++ desc = get_cpu_gdt_table(smp_processor_id()); + } + + return get_desc_base(desc + idx); +@@ -2087,7 +2087,7 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) + break; + + perf_callchain_store(entry, frame.return_address); +- fp = frame.next_frame; ++ fp = (const void __force_user *)frame.next_frame; + } + } + +diff --git a/arch/x86/kernel/cpu/perf_event_amd_iommu.c b/arch/x86/kernel/cpu/perf_event_amd_iommu.c +index 639d128..e92d7e5 100644 +--- a/arch/x86/kernel/cpu/perf_event_amd_iommu.c ++++ b/arch/x86/kernel/cpu/perf_event_amd_iommu.c +@@ -405,7 +405,7 @@ static void perf_iommu_del(struct perf_event *event, int flags) + static __init int _init_events_attrs(struct perf_amd_iommu *perf_iommu) + { + struct attribute **attrs; +- struct attribute_group *attr_group; ++ attribute_group_no_const *attr_group; + int i = 0, j; + + while (amd_iommu_v2_event_descs[i].attr.attr.name) +diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c +index 498b6d9..4126515 100644 +--- a/arch/x86/kernel/cpu/perf_event_intel.c ++++ b/arch/x86/kernel/cpu/perf_event_intel.c +@@ -2353,10 +2353,10 @@ __init int intel_pmu_init(void) + x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); + + if (boot_cpu_has(X86_FEATURE_PDCM)) { +- u64 capabilities; ++ u64 capabilities = x86_pmu.intel_cap.capabilities; + +- rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities); +- x86_pmu.intel_cap.capabilities = capabilities; ++ if (rdmsrl_safe(MSR_IA32_PERF_CAPABILITIES, &x86_pmu.intel_cap.capabilities)) ++ x86_pmu.intel_cap.capabilities = capabilities; + } + + intel_ds_init(); +diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c +index 8c25674..30aa32e 100644 +--- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c ++++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c +@@ -449,7 +449,7 @@ static struct attribute *rapl_events_hsw_attr[] = { + NULL, + }; + +-static struct attribute_group rapl_pmu_events_group = { ++static attribute_group_no_const rapl_pmu_events_group __read_only = { + .name = "events", + .attrs = NULL, /* patched at runtime */ + }; +diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c +index e98f68c..1992b15 100644 +--- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c ++++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c +@@ -737,7 +737,7 @@ static void __init uncore_types_exit(struct intel_uncore_type **types) + static int __init uncore_type_init(struct intel_uncore_type *type) + { + struct intel_uncore_pmu *pmus; +- struct attribute_group *attr_group; ++ attribute_group_no_const *attr_group; + struct attribute **attrs; + int i, j; + +diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.h b/arch/x86/kernel/cpu/perf_event_intel_uncore.h +index 863d9b0..6289b63 100644 +--- a/arch/x86/kernel/cpu/perf_event_intel_uncore.h ++++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.h +@@ -114,7 +114,7 @@ struct intel_uncore_box { + struct uncore_event_desc { + struct kobj_attribute attr; + const char *config; +-}; ++} __do_const; + + ssize_t uncore_event_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf); +diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c +index 3225ae6c..ee3c6db 100644 +--- a/arch/x86/kernel/cpuid.c ++++ b/arch/x86/kernel/cpuid.c +@@ -170,7 +170,7 @@ static int cpuid_class_cpu_callback(struct notifier_block *nfb, + return notifier_from_errno(err); + } + +-static struct notifier_block __refdata cpuid_class_cpu_notifier = ++static struct notifier_block cpuid_class_cpu_notifier = + { + .notifier_call = cpuid_class_cpu_callback, + }; +diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c +index f5ab56d..d3b201a 100644 +--- a/arch/x86/kernel/crash.c ++++ b/arch/x86/kernel/crash.c +@@ -104,7 +104,7 @@ static void kdump_nmi_callback(int cpu, struct pt_regs *regs) + #ifdef CONFIG_X86_32 + struct pt_regs fixed_regs; + +- if (!user_mode_vm(regs)) { ++ if (!user_mode(regs)) { + crash_fixup_ss_esp(&fixed_regs, regs); + regs = &fixed_regs; + } +diff --git a/arch/x86/kernel/crash_dump_64.c b/arch/x86/kernel/crash_dump_64.c +index afa64ad..dce67dd 100644 +--- a/arch/x86/kernel/crash_dump_64.c ++++ b/arch/x86/kernel/crash_dump_64.c +@@ -36,7 +36,7 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, + return -ENOMEM; + + if (userbuf) { +- if (copy_to_user(buf, vaddr + offset, csize)) { ++ if (copy_to_user((char __force_user *)buf, vaddr + offset, csize)) { + iounmap(vaddr); + return -EFAULT; + } +diff --git a/arch/x86/kernel/doublefault.c b/arch/x86/kernel/doublefault.c +index f6dfd93..892ade4 100644 +--- a/arch/x86/kernel/doublefault.c ++++ b/arch/x86/kernel/doublefault.c +@@ -12,7 +12,7 @@ + + #define DOUBLEFAULT_STACKSIZE (1024) + static unsigned long doublefault_stack[DOUBLEFAULT_STACKSIZE]; +-#define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE) ++#define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE-2) + + #define ptr_ok(x) ((x) > PAGE_OFFSET && (x) < PAGE_OFFSET + MAXMEM) + +@@ -22,7 +22,7 @@ static void doublefault_fn(void) + unsigned long gdt, tss; + + native_store_gdt(&gdt_desc); +- gdt = gdt_desc.address; ++ gdt = (unsigned long)gdt_desc.address; + + printk(KERN_EMERG "PANIC: double fault, gdt at %08lx [%d bytes]\n", gdt, gdt_desc.size); + +@@ -59,10 +59,10 @@ struct tss_struct doublefault_tss __cacheline_aligned = { + /* 0x2 bit is always set */ + .flags = X86_EFLAGS_SF | 0x2, + .sp = STACK_START, +- .es = __USER_DS, ++ .es = __KERNEL_DS, + .cs = __KERNEL_CS, + .ss = __KERNEL_DS, +- .ds = __USER_DS, ++ .ds = __KERNEL_DS, + .fs = __KERNEL_PERCPU, + + .__cr3 = __pa_nodebug(swapper_pg_dir), +diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c +index b74ebc7..2c95874 100644 +--- a/arch/x86/kernel/dumpstack.c ++++ b/arch/x86/kernel/dumpstack.c +@@ -2,6 +2,9 @@ + * Copyright (C) 1991, 1992 Linus Torvalds + * Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs + */ ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++#define __INCLUDED_BY_HIDESYM 1 ++#endif + #include <linux/kallsyms.h> + #include <linux/kprobes.h> + #include <linux/uaccess.h> +@@ -33,23 +36,21 @@ static void printk_stack_address(unsigned long address, int reliable) + + void printk_address(unsigned long address) + { +- pr_cont(" [<%p>] %pS\n", (void *)address, (void *)address); ++ pr_cont(" [<%p>] %pA\n", (void *)address, (void *)address); + } + + #ifdef CONFIG_FUNCTION_GRAPH_TRACER + static void + print_ftrace_graph_addr(unsigned long addr, void *data, + const struct stacktrace_ops *ops, +- struct thread_info *tinfo, int *graph) ++ struct task_struct *task, int *graph) + { +- struct task_struct *task; + unsigned long ret_addr; + int index; + + if (addr != (unsigned long)return_to_handler) + return; + +- task = tinfo->task; + index = task->curr_ret_stack; + + if (!task->ret_stack || index < *graph) +@@ -66,7 +67,7 @@ print_ftrace_graph_addr(unsigned long addr, void *data, + static inline void + print_ftrace_graph_addr(unsigned long addr, void *data, + const struct stacktrace_ops *ops, +- struct thread_info *tinfo, int *graph) ++ struct task_struct *task, int *graph) + { } + #endif + +@@ -77,10 +78,8 @@ print_ftrace_graph_addr(unsigned long addr, void *data, + * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack + */ + +-static inline int valid_stack_ptr(struct thread_info *tinfo, +- void *p, unsigned int size, void *end) ++static inline int valid_stack_ptr(void *t, void *p, unsigned int size, void *end) + { +- void *t = tinfo; + if (end) { + if (p < end && p >= (end-THREAD_SIZE)) + return 1; +@@ -91,14 +90,14 @@ static inline int valid_stack_ptr(struct thread_info *tinfo, + } + + unsigned long +-print_context_stack(struct thread_info *tinfo, ++print_context_stack(struct task_struct *task, void *stack_start, + unsigned long *stack, unsigned long bp, + const struct stacktrace_ops *ops, void *data, + unsigned long *end, int *graph) + { + struct stack_frame *frame = (struct stack_frame *)bp; + +- while (valid_stack_ptr(tinfo, stack, sizeof(*stack), end)) { ++ while (valid_stack_ptr(stack_start, stack, sizeof(*stack), end)) { + unsigned long addr; + + addr = *stack; +@@ -110,7 +109,7 @@ print_context_stack(struct thread_info *tinfo, + } else { + ops->address(data, addr, 0); + } +- print_ftrace_graph_addr(addr, data, ops, tinfo, graph); ++ print_ftrace_graph_addr(addr, data, ops, task, graph); + } + stack++; + } +@@ -119,7 +118,7 @@ print_context_stack(struct thread_info *tinfo, + EXPORT_SYMBOL_GPL(print_context_stack); + + unsigned long +-print_context_stack_bp(struct thread_info *tinfo, ++print_context_stack_bp(struct task_struct *task, void *stack_start, + unsigned long *stack, unsigned long bp, + const struct stacktrace_ops *ops, void *data, + unsigned long *end, int *graph) +@@ -127,7 +126,7 @@ print_context_stack_bp(struct thread_info *tinfo, + struct stack_frame *frame = (struct stack_frame *)bp; + unsigned long *ret_addr = &frame->return_address; + +- while (valid_stack_ptr(tinfo, ret_addr, sizeof(*ret_addr), end)) { ++ while (valid_stack_ptr(stack_start, ret_addr, sizeof(*ret_addr), end)) { + unsigned long addr = *ret_addr; + + if (!__kernel_text_address(addr)) +@@ -136,7 +135,7 @@ print_context_stack_bp(struct thread_info *tinfo, + ops->address(data, addr, 1); + frame = frame->next_frame; + ret_addr = &frame->return_address; +- print_ftrace_graph_addr(addr, data, ops, tinfo, graph); ++ print_ftrace_graph_addr(addr, data, ops, task, graph); + } + + return (unsigned long)frame; +@@ -155,7 +154,7 @@ static int print_trace_stack(void *data, char *name) + static void print_trace_address(void *data, unsigned long addr, int reliable) + { + touch_nmi_watchdog(); +- printk(data); ++ printk("%s", (char *)data); + printk_stack_address(addr, reliable); + } + +@@ -225,6 +224,8 @@ unsigned long oops_begin(void) + EXPORT_SYMBOL_GPL(oops_begin); + NOKPROBE_SYMBOL(oops_begin); + ++extern void gr_handle_kernel_exploit(void); ++ + void oops_end(unsigned long flags, struct pt_regs *regs, int signr) + { + if (regs && kexec_should_crash(current)) +@@ -246,7 +247,10 @@ void oops_end(unsigned long flags, struct pt_regs *regs, int signr) + panic("Fatal exception in interrupt"); + if (panic_on_oops) + panic("Fatal exception"); +- do_exit(signr); ++ ++ gr_handle_kernel_exploit(); ++ ++ do_group_exit(signr); + } + NOKPROBE_SYMBOL(oops_end); + +@@ -275,7 +279,7 @@ int __die(const char *str, struct pt_regs *regs, long err) + print_modules(); + show_regs(regs); + #ifdef CONFIG_X86_32 +- if (user_mode_vm(regs)) { ++ if (user_mode(regs)) { + sp = regs->sp; + ss = regs->ss & 0xffff; + } else { +@@ -304,7 +308,7 @@ void die(const char *str, struct pt_regs *regs, long err) + unsigned long flags = oops_begin(); + int sig = SIGSEGV; + +- if (!user_mode_vm(regs)) ++ if (!user_mode(regs)) + report_bug(regs->ip, regs); + + if (__die(str, regs, err)) +diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c +index 5abd4cd..c65733b 100644 +--- a/arch/x86/kernel/dumpstack_32.c ++++ b/arch/x86/kernel/dumpstack_32.c +@@ -61,15 +61,14 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, + bp = stack_frame(task, regs); + + for (;;) { +- struct thread_info *context; ++ void *stack_start = (void *)((unsigned long)stack & ~(THREAD_SIZE-1)); + void *end_stack; + + end_stack = is_hardirq_stack(stack, cpu); + if (!end_stack) + end_stack = is_softirq_stack(stack, cpu); + +- context = task_thread_info(task); +- bp = ops->walk_stack(context, stack, bp, ops, data, ++ bp = ops->walk_stack(task, stack_start, stack, bp, ops, data, + end_stack, &graph); + + /* Stop if not on irq stack */ +@@ -123,27 +122,28 @@ void show_regs(struct pt_regs *regs) + int i; + + show_regs_print_info(KERN_EMERG); +- __show_regs(regs, !user_mode_vm(regs)); ++ __show_regs(regs, !user_mode(regs)); + + /* + * When in-kernel, we also print out the stack and code at the + * time of the fault.. + */ +- if (!user_mode_vm(regs)) { ++ if (!user_mode(regs)) { + unsigned int code_prologue = code_bytes * 43 / 64; + unsigned int code_len = code_bytes; + unsigned char c; + u8 *ip; ++ unsigned long cs_base = get_desc_base(&get_cpu_gdt_table(0)[(0xffff & regs->cs) >> 3]); + + pr_emerg("Stack:\n"); + show_stack_log_lvl(NULL, regs, ®s->sp, 0, KERN_EMERG); + + pr_emerg("Code:"); + +- ip = (u8 *)regs->ip - code_prologue; ++ ip = (u8 *)regs->ip - code_prologue + cs_base; + if (ip < (u8 *)PAGE_OFFSET || probe_kernel_address(ip, c)) { + /* try starting at IP */ +- ip = (u8 *)regs->ip; ++ ip = (u8 *)regs->ip + cs_base; + code_len = code_len - code_prologue + 1; + } + for (i = 0; i < code_len; i++, ip++) { +@@ -152,7 +152,7 @@ void show_regs(struct pt_regs *regs) + pr_cont(" Bad EIP value."); + break; + } +- if (ip == (u8 *)regs->ip) ++ if (ip == (u8 *)regs->ip + cs_base) + pr_cont(" <%02x>", c); + else + pr_cont(" %02x", c); +@@ -165,6 +165,7 @@ int is_valid_bugaddr(unsigned long ip) + { + unsigned short ud2; + ++ ip = ktla_ktva(ip); + if (ip < PAGE_OFFSET) + return 0; + if (probe_kernel_address((unsigned short *)ip, ud2)) +@@ -172,3 +173,15 @@ int is_valid_bugaddr(unsigned long ip) + + return ud2 == 0x0b0f; + } ++ ++#if defined(CONFIG_PAX_MEMORY_STACKLEAK) || defined(CONFIG_PAX_USERCOPY) ++void pax_check_alloca(unsigned long size) ++{ ++ unsigned long sp = (unsigned long)&sp, stack_left; ++ ++ /* all kernel stacks are of the same size */ ++ stack_left = sp & (THREAD_SIZE - 1); ++ BUG_ON(stack_left < 256 || size >= stack_left - 256); ++} ++EXPORT_SYMBOL(pax_check_alloca); ++#endif +diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c +index ff86f19..73eabf4 100644 +--- a/arch/x86/kernel/dumpstack_64.c ++++ b/arch/x86/kernel/dumpstack_64.c +@@ -153,12 +153,12 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, + const struct stacktrace_ops *ops, void *data) + { + const unsigned cpu = get_cpu(); +- struct thread_info *tinfo; + unsigned long *irq_stack = (unsigned long *)per_cpu(irq_stack_ptr, cpu); + unsigned long dummy; + unsigned used = 0; + int graph = 0; + int done = 0; ++ void *stack_start; + + if (!task) + task = current; +@@ -179,7 +179,6 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, + * current stack address. If the stacks consist of nested + * exceptions + */ +- tinfo = task_thread_info(task); + while (!done) { + unsigned long *stack_end; + enum stack_type stype; +@@ -202,7 +201,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, + if (ops->stack(data, id) < 0) + break; + +- bp = ops->walk_stack(tinfo, stack, bp, ops, ++ bp = ops->walk_stack(task, stack_end - EXCEPTION_STKSZ, stack, bp, ops, + data, stack_end, &graph); + ops->stack(data, "<EOE>"); + /* +@@ -210,6 +209,8 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, + * second-to-last pointer (index -2 to end) in the + * exception stack: + */ ++ if ((u16)stack_end[-1] != __KERNEL_DS) ++ goto out; + stack = (unsigned long *) stack_end[-2]; + done = 0; + break; +@@ -218,7 +219,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, + + if (ops->stack(data, "IRQ") < 0) + break; +- bp = ops->walk_stack(tinfo, stack, bp, ++ bp = ops->walk_stack(task, irq_stack, stack, bp, + ops, data, stack_end, &graph); + /* + * We link to the next stack (which would be +@@ -240,7 +241,9 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, + /* + * This handles the process stack: + */ +- bp = ops->walk_stack(tinfo, stack, bp, ops, data, NULL, &graph); ++ stack_start = (void *)((unsigned long)stack & ~(THREAD_SIZE-1)); ++ bp = ops->walk_stack(task, stack_start, stack, bp, ops, data, NULL, &graph); ++out: + put_cpu(); + } + EXPORT_SYMBOL(dump_trace); +@@ -344,8 +347,55 @@ int is_valid_bugaddr(unsigned long ip) + { + unsigned short ud2; + +- if (__copy_from_user(&ud2, (const void __user *) ip, sizeof(ud2))) ++ if (probe_kernel_address((unsigned short *)ip, ud2)) + return 0; + + return ud2 == 0x0b0f; + } ++ ++#if defined(CONFIG_PAX_MEMORY_STACKLEAK) || defined(CONFIG_PAX_USERCOPY) ++void pax_check_alloca(unsigned long size) ++{ ++ unsigned long sp = (unsigned long)&sp, stack_start, stack_end; ++ unsigned cpu, used; ++ char *id; ++ ++ /* check the process stack first */ ++ stack_start = (unsigned long)task_stack_page(current); ++ stack_end = stack_start + THREAD_SIZE; ++ if (likely(stack_start <= sp && sp < stack_end)) { ++ unsigned long stack_left = sp & (THREAD_SIZE - 1); ++ BUG_ON(stack_left < 256 || size >= stack_left - 256); ++ return; ++ } ++ ++ cpu = get_cpu(); ++ ++ /* check the irq stacks */ ++ stack_end = (unsigned long)per_cpu(irq_stack_ptr, cpu); ++ stack_start = stack_end - IRQ_STACK_SIZE; ++ if (stack_start <= sp && sp < stack_end) { ++ unsigned long stack_left = sp & (IRQ_STACK_SIZE - 1); ++ put_cpu(); ++ BUG_ON(stack_left < 256 || size >= stack_left - 256); ++ return; ++ } ++ ++ /* check the exception stacks */ ++ used = 0; ++ stack_end = (unsigned long)in_exception_stack(cpu, sp, &used, &id); ++ stack_start = stack_end - EXCEPTION_STKSZ; ++ if (stack_end && stack_start <= sp && sp < stack_end) { ++ unsigned long stack_left = sp & (EXCEPTION_STKSZ - 1); ++ put_cpu(); ++ BUG_ON(stack_left < 256 || size >= stack_left - 256); ++ return; ++ } ++ ++ put_cpu(); ++ ++ /* unknown stack */ ++ BUG(); ++} ++EXPORT_SYMBOL(pax_check_alloca); ++#endif +diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c +index 49f8864..1cc6d07 100644 +--- a/arch/x86/kernel/e820.c ++++ b/arch/x86/kernel/e820.c +@@ -802,8 +802,8 @@ unsigned long __init e820_end_of_low_ram_pfn(void) + + static void early_panic(char *msg) + { +- early_printk(msg); +- panic(msg); ++ early_printk("%s", msg); ++ panic("%s", msg); + } + + static int userdef __initdata; +diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c +index 01d1c18..8073693 100644 +--- a/arch/x86/kernel/early_printk.c ++++ b/arch/x86/kernel/early_printk.c +@@ -7,6 +7,7 @@ + #include <linux/pci_regs.h> + #include <linux/pci_ids.h> + #include <linux/errno.h> ++#include <linux/sched.h> + #include <asm/io.h> + #include <asm/processor.h> + #include <asm/fcntl.h> +diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S +index 344b63f..55adf14 100644 +--- a/arch/x86/kernel/entry_32.S ++++ b/arch/x86/kernel/entry_32.S +@@ -177,13 +177,154 @@ + /*CFI_REL_OFFSET gs, PT_GS*/ + .endm + .macro SET_KERNEL_GS reg ++ ++#ifdef CONFIG_CC_STACKPROTECTOR + movl $(__KERNEL_STACK_CANARY), \reg ++#elif defined(CONFIG_PAX_MEMORY_UDEREF) ++ movl $(__USER_DS), \reg ++#else ++ xorl \reg, \reg ++#endif ++ + movl \reg, %gs + .endm + + #endif /* CONFIG_X86_32_LAZY_GS */ + +-.macro SAVE_ALL ++.macro pax_enter_kernel ++#ifdef CONFIG_PAX_KERNEXEC ++ call pax_enter_kernel ++#endif ++.endm ++ ++.macro pax_exit_kernel ++#ifdef CONFIG_PAX_KERNEXEC ++ call pax_exit_kernel ++#endif ++.endm ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ENTRY(pax_enter_kernel) ++#ifdef CONFIG_PARAVIRT ++ pushl %eax ++ pushl %ecx ++ call PARA_INDIRECT(pv_cpu_ops+PV_CPU_read_cr0) ++ mov %eax, %esi ++#else ++ mov %cr0, %esi ++#endif ++ bts $16, %esi ++ jnc 1f ++ mov %cs, %esi ++ cmp $__KERNEL_CS, %esi ++ jz 3f ++ ljmp $__KERNEL_CS, $3f ++1: ljmp $__KERNEXEC_KERNEL_CS, $2f ++2: ++#ifdef CONFIG_PARAVIRT ++ mov %esi, %eax ++ call PARA_INDIRECT(pv_cpu_ops+PV_CPU_write_cr0) ++#else ++ mov %esi, %cr0 ++#endif ++3: ++#ifdef CONFIG_PARAVIRT ++ popl %ecx ++ popl %eax ++#endif ++ ret ++ENDPROC(pax_enter_kernel) ++ ++ENTRY(pax_exit_kernel) ++#ifdef CONFIG_PARAVIRT ++ pushl %eax ++ pushl %ecx ++#endif ++ mov %cs, %esi ++ cmp $__KERNEXEC_KERNEL_CS, %esi ++ jnz 2f ++#ifdef CONFIG_PARAVIRT ++ call PARA_INDIRECT(pv_cpu_ops+PV_CPU_read_cr0); ++ mov %eax, %esi ++#else ++ mov %cr0, %esi ++#endif ++ btr $16, %esi ++ ljmp $__KERNEL_CS, $1f ++1: ++#ifdef CONFIG_PARAVIRT ++ mov %esi, %eax ++ call PARA_INDIRECT(pv_cpu_ops+PV_CPU_write_cr0); ++#else ++ mov %esi, %cr0 ++#endif ++2: ++#ifdef CONFIG_PARAVIRT ++ popl %ecx ++ popl %eax ++#endif ++ ret ++ENDPROC(pax_exit_kernel) ++#endif ++ ++ .macro pax_erase_kstack ++#ifdef CONFIG_PAX_MEMORY_STACKLEAK ++ call pax_erase_kstack ++#endif ++ .endm ++ ++#ifdef CONFIG_PAX_MEMORY_STACKLEAK ++/* ++ * ebp: thread_info ++ */ ++ENTRY(pax_erase_kstack) ++ pushl %edi ++ pushl %ecx ++ pushl %eax ++ ++ mov TI_lowest_stack(%ebp), %edi ++ mov $-0xBEEF, %eax ++ std ++ ++1: mov %edi, %ecx ++ and $THREAD_SIZE_asm - 1, %ecx ++ shr $2, %ecx ++ repne scasl ++ jecxz 2f ++ ++ cmp $2*16, %ecx ++ jc 2f ++ ++ mov $2*16, %ecx ++ repe scasl ++ jecxz 2f ++ jne 1b ++ ++2: cld ++ or $2*4, %edi ++ mov %esp, %ecx ++ sub %edi, %ecx ++ ++ cmp $THREAD_SIZE_asm, %ecx ++ jb 3f ++ ud2 ++3: ++ ++ shr $2, %ecx ++ rep stosl ++ ++ mov TI_task_thread_sp0(%ebp), %edi ++ sub $128, %edi ++ mov %edi, TI_lowest_stack(%ebp) ++ ++ popl %eax ++ popl %ecx ++ popl %edi ++ ret ++ENDPROC(pax_erase_kstack) ++#endif ++ ++.macro __SAVE_ALL _DS + cld + PUSH_GS + pushl_cfi %fs +@@ -206,7 +347,7 @@ + CFI_REL_OFFSET ecx, 0 + pushl_cfi %ebx + CFI_REL_OFFSET ebx, 0 +- movl $(__USER_DS), %edx ++ movl $\_DS, %edx + movl %edx, %ds + movl %edx, %es + movl $(__KERNEL_PERCPU), %edx +@@ -214,6 +355,15 @@ + SET_KERNEL_GS %edx + .endm + ++.macro SAVE_ALL ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ __SAVE_ALL __KERNEL_DS ++ pax_enter_kernel ++#else ++ __SAVE_ALL __USER_DS ++#endif ++.endm ++ + .macro RESTORE_INT_REGS + popl_cfi %ebx + CFI_RESTORE ebx +@@ -297,7 +447,7 @@ ENTRY(ret_from_fork) + popfl_cfi + jmp syscall_exit + CFI_ENDPROC +-END(ret_from_fork) ++ENDPROC(ret_from_fork) + + ENTRY(ret_from_kernel_thread) + CFI_STARTPROC +@@ -340,7 +490,15 @@ ret_from_intr: + andl $SEGMENT_RPL_MASK, %eax + #endif + cmpl $USER_RPL, %eax ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ jae resume_userspace ++ ++ pax_exit_kernel ++ jmp resume_kernel ++#else + jb resume_kernel # not returning to v8086 or userspace ++#endif + + ENTRY(resume_userspace) + LOCKDEP_SYS_EXIT +@@ -352,8 +510,8 @@ ENTRY(resume_userspace) + andl $_TIF_WORK_MASK, %ecx # is there any work to be done on + # int/exception return? + jne work_pending +- jmp restore_all +-END(ret_from_exception) ++ jmp restore_all_pax ++ENDPROC(ret_from_exception) + + #ifdef CONFIG_PREEMPT + ENTRY(resume_kernel) +@@ -365,7 +523,7 @@ need_resched: + jz restore_all + call preempt_schedule_irq + jmp need_resched +-END(resume_kernel) ++ENDPROC(resume_kernel) + #endif + CFI_ENDPROC + +@@ -395,30 +553,45 @@ sysenter_past_esp: + /*CFI_REL_OFFSET cs, 0*/ + /* + * Push current_thread_info()->sysenter_return to the stack. +- * A tiny bit of offset fixup is necessary - 4*4 means the 4 words +- * pushed above; +8 corresponds to copy_thread's esp0 setting. + */ +- pushl_cfi ((TI_sysenter_return)-THREAD_SIZE+8+4*4)(%esp) ++ pushl_cfi $0 + CFI_REL_OFFSET eip, 0 + + pushl_cfi %eax + SAVE_ALL ++ GET_THREAD_INFO(%ebp) ++ movl TI_sysenter_return(%ebp),%ebp ++ movl %ebp,PT_EIP(%esp) + ENABLE_INTERRUPTS(CLBR_NONE) + + /* + * Load the potential sixth argument from user stack. + * Careful about security. + */ ++ movl PT_OLDESP(%esp),%ebp ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ mov PT_OLDSS(%esp),%ds ++1: movl %ds:(%ebp),%ebp ++ push %ss ++ pop %ds ++#else + cmpl $__PAGE_OFFSET-3,%ebp + jae syscall_fault + ASM_STAC + 1: movl (%ebp),%ebp + ASM_CLAC ++#endif ++ + movl %ebp,PT_EBP(%esp) + _ASM_EXTABLE(1b,syscall_fault) + + GET_THREAD_INFO(%ebp) + ++#ifdef CONFIG_PAX_RANDKSTACK ++ pax_erase_kstack ++#endif ++ + testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) + jnz sysenter_audit + sysenter_do_call: +@@ -434,12 +607,24 @@ sysenter_after_call: + testl $_TIF_ALLWORK_MASK, %ecx + jne sysexit_audit + sysenter_exit: ++ ++#ifdef CONFIG_PAX_RANDKSTACK ++ pushl_cfi %eax ++ movl %esp, %eax ++ call pax_randomize_kstack ++ popl_cfi %eax ++#endif ++ ++ pax_erase_kstack ++ + /* if something modifies registers it must also disable sysexit */ + movl PT_EIP(%esp), %edx + movl PT_OLDESP(%esp), %ecx + xorl %ebp,%ebp + TRACE_IRQS_ON + 1: mov PT_FS(%esp), %fs ++2: mov PT_DS(%esp), %ds ++3: mov PT_ES(%esp), %es + PTGS_TO_GS + ENABLE_INTERRUPTS_SYSEXIT + +@@ -453,6 +638,9 @@ sysenter_audit: + pushl_cfi PT_ESI(%esp) /* a3: 5th arg */ + pushl_cfi PT_EDX+4(%esp) /* a2: 4th arg */ + call __audit_syscall_entry ++ ++ pax_erase_kstack ++ + popl_cfi %ecx /* get that remapped edx off the stack */ + popl_cfi %ecx /* get that remapped esi off the stack */ + movl PT_EAX(%esp),%eax /* reload syscall number */ +@@ -479,10 +667,16 @@ sysexit_audit: + + CFI_ENDPROC + .pushsection .fixup,"ax" +-2: movl $0,PT_FS(%esp) ++4: movl $0,PT_FS(%esp) ++ jmp 1b ++5: movl $0,PT_DS(%esp) ++ jmp 1b ++6: movl $0,PT_ES(%esp) + jmp 1b + .popsection +- _ASM_EXTABLE(1b,2b) ++ _ASM_EXTABLE(1b,4b) ++ _ASM_EXTABLE(2b,5b) ++ _ASM_EXTABLE(3b,6b) + PTGS_TO_GS_EX + ENDPROC(ia32_sysenter_target) + +@@ -493,6 +687,11 @@ ENTRY(system_call) + pushl_cfi %eax # save orig_eax + SAVE_ALL + GET_THREAD_INFO(%ebp) ++ ++#ifdef CONFIG_PAX_RANDKSTACK ++ pax_erase_kstack ++#endif ++ + # system call tracing in operation / emulation + testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) + jnz syscall_trace_entry +@@ -512,6 +711,15 @@ syscall_exit: + testl $_TIF_ALLWORK_MASK, %ecx # current->work + jne syscall_exit_work + ++restore_all_pax: ++ ++#ifdef CONFIG_PAX_RANDKSTACK ++ movl %esp, %eax ++ call pax_randomize_kstack ++#endif ++ ++ pax_erase_kstack ++ + restore_all: + TRACE_IRQS_IRET + restore_all_notrace: +@@ -566,14 +774,34 @@ ldt_ss: + * compensating for the offset by changing to the ESPFIX segment with + * a base address that matches for the difference. + */ +-#define GDT_ESPFIX_SS PER_CPU_VAR(gdt_page) + (GDT_ENTRY_ESPFIX_SS * 8) ++#define GDT_ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8)(%ebx) + mov %esp, %edx /* load kernel esp */ + mov PT_OLDESP(%esp), %eax /* load userspace esp */ + mov %dx, %ax /* eax: new kernel esp */ + sub %eax, %edx /* offset (low word is 0) */ ++#ifdef CONFIG_SMP ++ movl PER_CPU_VAR(cpu_number), %ebx ++ shll $PAGE_SHIFT_asm, %ebx ++ addl $cpu_gdt_table, %ebx ++#else ++ movl $cpu_gdt_table, %ebx ++#endif + shr $16, %edx +- mov %dl, GDT_ESPFIX_SS + 4 /* bits 16..23 */ +- mov %dh, GDT_ESPFIX_SS + 7 /* bits 24..31 */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ mov %cr0, %esi ++ btr $16, %esi ++ mov %esi, %cr0 ++#endif ++ ++ mov %dl, 4 + GDT_ESPFIX_SS /* bits 16..23 */ ++ mov %dh, 7 + GDT_ESPFIX_SS /* bits 24..31 */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ bts $16, %esi ++ mov %esi, %cr0 ++#endif ++ + pushl_cfi $__ESPFIX_SS + pushl_cfi %eax /* new kernel esp */ + /* Disable interrupts, but do not irqtrace this section: we +@@ -603,20 +831,18 @@ work_resched: + movl TI_flags(%ebp), %ecx + andl $_TIF_WORK_MASK, %ecx # is there any work to be done other + # than syscall tracing? +- jz restore_all ++ jz restore_all_pax + testb $_TIF_NEED_RESCHED, %cl + jnz work_resched + + work_notifysig: # deal with pending signals and + # notify-resume requests ++ movl %esp, %eax + #ifdef CONFIG_VM86 + testl $X86_EFLAGS_VM, PT_EFLAGS(%esp) +- movl %esp, %eax + jne work_notifysig_v86 # returning to kernel-space or + # vm86-space + 1: +-#else +- movl %esp, %eax + #endif + TRACE_IRQS_ON + ENABLE_INTERRUPTS(CLBR_NONE) +@@ -637,7 +863,7 @@ work_notifysig_v86: + movl %eax, %esp + jmp 1b + #endif +-END(work_pending) ++ENDPROC(work_pending) + + # perform syscall exit tracing + ALIGN +@@ -645,11 +871,14 @@ syscall_trace_entry: + movl $-ENOSYS,PT_EAX(%esp) + movl %esp, %eax + call syscall_trace_enter ++ ++ pax_erase_kstack ++ + /* What it returned is what we'll actually use. */ + cmpl $(NR_syscalls), %eax + jnae syscall_call + jmp syscall_exit +-END(syscall_trace_entry) ++ENDPROC(syscall_trace_entry) + + # perform syscall exit tracing + ALIGN +@@ -662,26 +891,30 @@ syscall_exit_work: + movl %esp, %eax + call syscall_trace_leave + jmp resume_userspace +-END(syscall_exit_work) ++ENDPROC(syscall_exit_work) + CFI_ENDPROC + + RING0_INT_FRAME # can't unwind into user space anyway + syscall_fault: ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ push %ss ++ pop %ds ++#endif + ASM_CLAC + GET_THREAD_INFO(%ebp) + movl $-EFAULT,PT_EAX(%esp) + jmp resume_userspace +-END(syscall_fault) ++ENDPROC(syscall_fault) + + syscall_badsys: + movl $-ENOSYS,%eax + jmp syscall_after_call +-END(syscall_badsys) ++ENDPROC(syscall_badsys) + + sysenter_badsys: + movl $-ENOSYS,%eax + jmp sysenter_after_call +-END(sysenter_badsys) ++ENDPROC(sysenter_badsys) + CFI_ENDPROC + + .macro FIXUP_ESPFIX_STACK +@@ -694,8 +927,15 @@ END(sysenter_badsys) + */ + #ifdef CONFIG_X86_ESPFIX32 + /* fixup the stack */ +- mov GDT_ESPFIX_SS + 4, %al /* bits 16..23 */ +- mov GDT_ESPFIX_SS + 7, %ah /* bits 24..31 */ ++#ifdef CONFIG_SMP ++ movl PER_CPU_VAR(cpu_number), %ebx ++ shll $PAGE_SHIFT_asm, %ebx ++ addl $cpu_gdt_table, %ebx ++#else ++ movl $cpu_gdt_table, %ebx ++#endif ++ mov 4 + GDT_ESPFIX_SS, %al /* bits 16..23 */ ++ mov 7 + GDT_ESPFIX_SS, %ah /* bits 24..31 */ + shl $16, %eax + addl %esp, %eax /* the adjusted stack pointer */ + pushl_cfi $__KERNEL_DS +@@ -751,7 +991,7 @@ vector=vector+1 + .endr + 2: jmp common_interrupt + .endr +-END(irq_entries_start) ++ENDPROC(irq_entries_start) + + .previous + END(interrupt) +@@ -808,7 +1048,7 @@ ENTRY(coprocessor_error) + pushl_cfi $do_coprocessor_error + jmp error_code + CFI_ENDPROC +-END(coprocessor_error) ++ENDPROC(coprocessor_error) + + ENTRY(simd_coprocessor_error) + RING0_INT_FRAME +@@ -821,7 +1061,7 @@ ENTRY(simd_coprocessor_error) + .section .altinstructions,"a" + altinstruction_entry 661b, 663f, X86_FEATURE_XMM, 662b-661b, 664f-663f + .previous +-.section .altinstr_replacement,"ax" ++.section .altinstr_replacement,"a" + 663: pushl $do_simd_coprocessor_error + 664: + .previous +@@ -830,7 +1070,7 @@ ENTRY(simd_coprocessor_error) + #endif + jmp error_code + CFI_ENDPROC +-END(simd_coprocessor_error) ++ENDPROC(simd_coprocessor_error) + + ENTRY(device_not_available) + RING0_INT_FRAME +@@ -839,18 +1079,18 @@ ENTRY(device_not_available) + pushl_cfi $do_device_not_available + jmp error_code + CFI_ENDPROC +-END(device_not_available) ++ENDPROC(device_not_available) + + #ifdef CONFIG_PARAVIRT + ENTRY(native_iret) + iret + _ASM_EXTABLE(native_iret, iret_exc) +-END(native_iret) ++ENDPROC(native_iret) + + ENTRY(native_irq_enable_sysexit) + sti + sysexit +-END(native_irq_enable_sysexit) ++ENDPROC(native_irq_enable_sysexit) + #endif + + ENTRY(overflow) +@@ -860,7 +1100,7 @@ ENTRY(overflow) + pushl_cfi $do_overflow + jmp error_code + CFI_ENDPROC +-END(overflow) ++ENDPROC(overflow) + + ENTRY(bounds) + RING0_INT_FRAME +@@ -869,7 +1109,7 @@ ENTRY(bounds) + pushl_cfi $do_bounds + jmp error_code + CFI_ENDPROC +-END(bounds) ++ENDPROC(bounds) + + ENTRY(invalid_op) + RING0_INT_FRAME +@@ -878,7 +1118,7 @@ ENTRY(invalid_op) + pushl_cfi $do_invalid_op + jmp error_code + CFI_ENDPROC +-END(invalid_op) ++ENDPROC(invalid_op) + + ENTRY(coprocessor_segment_overrun) + RING0_INT_FRAME +@@ -887,7 +1127,7 @@ ENTRY(coprocessor_segment_overrun) + pushl_cfi $do_coprocessor_segment_overrun + jmp error_code + CFI_ENDPROC +-END(coprocessor_segment_overrun) ++ENDPROC(coprocessor_segment_overrun) + + ENTRY(invalid_TSS) + RING0_EC_FRAME +@@ -895,7 +1135,7 @@ ENTRY(invalid_TSS) + pushl_cfi $do_invalid_TSS + jmp error_code + CFI_ENDPROC +-END(invalid_TSS) ++ENDPROC(invalid_TSS) + + ENTRY(segment_not_present) + RING0_EC_FRAME +@@ -903,7 +1143,7 @@ ENTRY(segment_not_present) + pushl_cfi $do_segment_not_present + jmp error_code + CFI_ENDPROC +-END(segment_not_present) ++ENDPROC(segment_not_present) + + ENTRY(stack_segment) + RING0_EC_FRAME +@@ -911,7 +1151,7 @@ ENTRY(stack_segment) + pushl_cfi $do_stack_segment + jmp error_code + CFI_ENDPROC +-END(stack_segment) ++ENDPROC(stack_segment) + + ENTRY(alignment_check) + RING0_EC_FRAME +@@ -919,7 +1159,7 @@ ENTRY(alignment_check) + pushl_cfi $do_alignment_check + jmp error_code + CFI_ENDPROC +-END(alignment_check) ++ENDPROC(alignment_check) + + ENTRY(divide_error) + RING0_INT_FRAME +@@ -928,7 +1168,7 @@ ENTRY(divide_error) + pushl_cfi $do_divide_error + jmp error_code + CFI_ENDPROC +-END(divide_error) ++ENDPROC(divide_error) + + #ifdef CONFIG_X86_MCE + ENTRY(machine_check) +@@ -938,7 +1178,7 @@ ENTRY(machine_check) + pushl_cfi machine_check_vector + jmp error_code + CFI_ENDPROC +-END(machine_check) ++ENDPROC(machine_check) + #endif + + ENTRY(spurious_interrupt_bug) +@@ -948,7 +1188,7 @@ ENTRY(spurious_interrupt_bug) + pushl_cfi $do_spurious_interrupt_bug + jmp error_code + CFI_ENDPROC +-END(spurious_interrupt_bug) ++ENDPROC(spurious_interrupt_bug) + + #ifdef CONFIG_XEN + /* Xen doesn't set %esp to be precisely what the normal sysenter +@@ -1054,7 +1294,7 @@ BUILD_INTERRUPT3(hyperv_callback_vector, HYPERVISOR_CALLBACK_VECTOR, + + ENTRY(mcount) + ret +-END(mcount) ++ENDPROC(mcount) + + ENTRY(ftrace_caller) + pushl %eax +@@ -1084,7 +1324,7 @@ ftrace_graph_call: + .globl ftrace_stub + ftrace_stub: + ret +-END(ftrace_caller) ++ENDPROC(ftrace_caller) + + ENTRY(ftrace_regs_caller) + pushf /* push flags before compare (in cs location) */ +@@ -1182,7 +1422,7 @@ trace: + popl %ecx + popl %eax + jmp ftrace_stub +-END(mcount) ++ENDPROC(mcount) + #endif /* CONFIG_DYNAMIC_FTRACE */ + #endif /* CONFIG_FUNCTION_TRACER */ + +@@ -1200,7 +1440,7 @@ ENTRY(ftrace_graph_caller) + popl %ecx + popl %eax + ret +-END(ftrace_graph_caller) ++ENDPROC(ftrace_graph_caller) + + .globl return_to_handler + return_to_handler: +@@ -1261,15 +1501,18 @@ error_code: + movl $-1, PT_ORIG_EAX(%esp) # no syscall to restart + REG_TO_PTGS %ecx + SET_KERNEL_GS %ecx +- movl $(__USER_DS), %ecx ++ movl $(__KERNEL_DS), %ecx + movl %ecx, %ds + movl %ecx, %es ++ ++ pax_enter_kernel ++ + TRACE_IRQS_OFF + movl %esp,%eax # pt_regs pointer + call *%edi + jmp ret_from_exception + CFI_ENDPROC +-END(page_fault) ++ENDPROC(page_fault) + + /* + * Debug traps and NMI can happen at the one SYSENTER instruction +@@ -1312,7 +1555,7 @@ debug_stack_correct: + call do_debug + jmp ret_from_exception + CFI_ENDPROC +-END(debug) ++ENDPROC(debug) + + /* + * NMI is doubly nasty. It can happen _while_ we're handling +@@ -1352,6 +1595,9 @@ nmi_stack_correct: + xorl %edx,%edx # zero error code + movl %esp,%eax # pt_regs pointer + call do_nmi ++ ++ pax_exit_kernel ++ + jmp restore_all_notrace + CFI_ENDPROC + +@@ -1389,13 +1635,16 @@ nmi_espfix_stack: + FIXUP_ESPFIX_STACK # %eax == %esp + xorl %edx,%edx # zero error code + call do_nmi ++ ++ pax_exit_kernel ++ + RESTORE_REGS + lss 12+4(%esp), %esp # back to espfix stack + CFI_ADJUST_CFA_OFFSET -24 + jmp irq_return + #endif + CFI_ENDPROC +-END(nmi) ++ENDPROC(nmi) + + ENTRY(int3) + RING0_INT_FRAME +@@ -1408,14 +1657,14 @@ ENTRY(int3) + call do_int3 + jmp ret_from_exception + CFI_ENDPROC +-END(int3) ++ENDPROC(int3) + + ENTRY(general_protection) + RING0_EC_FRAME + pushl_cfi $do_general_protection + jmp error_code + CFI_ENDPROC +-END(general_protection) ++ENDPROC(general_protection) + + #ifdef CONFIG_KVM_GUEST + ENTRY(async_page_fault) +@@ -1424,6 +1673,6 @@ ENTRY(async_page_fault) + pushl_cfi $do_async_page_fault + jmp error_code + CFI_ENDPROC +-END(async_page_fault) ++ENDPROC(async_page_fault) + #endif + +diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S +index f1dc27f..386eb53 100644 +--- a/arch/x86/kernel/entry_64.S ++++ b/arch/x86/kernel/entry_64.S +@@ -59,6 +59,8 @@ + #include <asm/smap.h> + #include <asm/pgtable_types.h> + #include <linux/err.h> ++#include <asm/pgtable.h> ++#include <asm/alternative-asm.h> + + /* Avoid __ASSEMBLER__'ifying <linux/audit.h> just for this. */ + #include <linux/elf-em.h> +@@ -81,6 +83,431 @@ ENTRY(native_usergs_sysret64) + ENDPROC(native_usergs_sysret64) + #endif /* CONFIG_PARAVIRT */ + ++ .macro ljmpq sel, off ++#if defined(CONFIG_MPSC) || defined(CONFIG_MCORE2) || defined (CONFIG_MATOM) ++ .byte 0x48; ljmp *1234f(%rip) ++ .pushsection .rodata ++ .align 16 ++ 1234: .quad \off; .word \sel ++ .popsection ++#else ++ pushq $\sel ++ pushq $\off ++ lretq ++#endif ++ .endm ++ ++ .macro pax_enter_kernel ++ pax_set_fptr_mask ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ call pax_enter_kernel ++#endif ++ .endm ++ ++ .macro pax_exit_kernel ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ call pax_exit_kernel ++#endif ++ ++ .endm ++ ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ENTRY(pax_enter_kernel) ++ pushq %rdi ++ ++#ifdef CONFIG_PARAVIRT ++ PV_SAVE_REGS(CLBR_RDI) ++#endif ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ GET_CR0_INTO_RDI ++ bts $16,%rdi ++ jnc 3f ++ mov %cs,%edi ++ cmp $__KERNEL_CS,%edi ++ jnz 2f ++1: ++#endif ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ 661: jmp 111f ++ .pushsection .altinstr_replacement, "a" ++ 662: ASM_NOP2 ++ .popsection ++ .pushsection .altinstructions, "a" ++ altinstruction_entry 661b, 662b, X86_FEATURE_PCID, 2, 2 ++ .popsection ++ GET_CR3_INTO_RDI ++ cmp $0,%dil ++ jnz 112f ++ mov $__KERNEL_DS,%edi ++ mov %edi,%ss ++ jmp 111f ++112: cmp $1,%dil ++ jz 113f ++ ud2 ++113: sub $4097,%rdi ++ bts $63,%rdi ++ SET_RDI_INTO_CR3 ++ mov $__UDEREF_KERNEL_DS,%edi ++ mov %edi,%ss ++111: ++#endif ++ ++#ifdef CONFIG_PARAVIRT ++ PV_RESTORE_REGS(CLBR_RDI) ++#endif ++ ++ popq %rdi ++ pax_force_retaddr ++ retq ++ ++#ifdef CONFIG_PAX_KERNEXEC ++2: ljmpq __KERNEL_CS,1b ++3: ljmpq __KERNEXEC_KERNEL_CS,4f ++4: SET_RDI_INTO_CR0 ++ jmp 1b ++#endif ++ENDPROC(pax_enter_kernel) ++ ++ENTRY(pax_exit_kernel) ++ pushq %rdi ++ ++#ifdef CONFIG_PARAVIRT ++ PV_SAVE_REGS(CLBR_RDI) ++#endif ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ mov %cs,%rdi ++ cmp $__KERNEXEC_KERNEL_CS,%edi ++ jz 2f ++ GET_CR0_INTO_RDI ++ bts $16,%rdi ++ jnc 4f ++1: ++#endif ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ 661: jmp 111f ++ .pushsection .altinstr_replacement, "a" ++ 662: ASM_NOP2 ++ .popsection ++ .pushsection .altinstructions, "a" ++ altinstruction_entry 661b, 662b, X86_FEATURE_PCID, 2, 2 ++ .popsection ++ mov %ss,%edi ++ cmp $__UDEREF_KERNEL_DS,%edi ++ jnz 111f ++ GET_CR3_INTO_RDI ++ cmp $0,%dil ++ jz 112f ++ ud2 ++112: add $4097,%rdi ++ bts $63,%rdi ++ SET_RDI_INTO_CR3 ++ mov $__KERNEL_DS,%edi ++ mov %edi,%ss ++111: ++#endif ++ ++#ifdef CONFIG_PARAVIRT ++ PV_RESTORE_REGS(CLBR_RDI); ++#endif ++ ++ popq %rdi ++ pax_force_retaddr ++ retq ++ ++#ifdef CONFIG_PAX_KERNEXEC ++2: GET_CR0_INTO_RDI ++ btr $16,%rdi ++ jnc 4f ++ ljmpq __KERNEL_CS,3f ++3: SET_RDI_INTO_CR0 ++ jmp 1b ++4: ud2 ++ jmp 4b ++#endif ++ENDPROC(pax_exit_kernel) ++#endif ++ ++ .macro pax_enter_kernel_user ++ pax_set_fptr_mask ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ call pax_enter_kernel_user ++#endif ++ .endm ++ ++ .macro pax_exit_kernel_user ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ call pax_exit_kernel_user ++#endif ++#ifdef CONFIG_PAX_RANDKSTACK ++ pushq %rax ++ pushq %r11 ++ call pax_randomize_kstack ++ popq %r11 ++ popq %rax ++#endif ++ .endm ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ENTRY(pax_enter_kernel_user) ++ pushq %rdi ++ pushq %rbx ++ ++#ifdef CONFIG_PARAVIRT ++ PV_SAVE_REGS(CLBR_RDI) ++#endif ++ ++ 661: jmp 111f ++ .pushsection .altinstr_replacement, "a" ++ 662: ASM_NOP2 ++ .popsection ++ .pushsection .altinstructions, "a" ++ altinstruction_entry 661b, 662b, X86_FEATURE_PCID, 2, 2 ++ .popsection ++ GET_CR3_INTO_RDI ++ cmp $1,%dil ++ jnz 4f ++ sub $4097,%rdi ++ bts $63,%rdi ++ SET_RDI_INTO_CR3 ++ jmp 3f ++111: ++ ++ GET_CR3_INTO_RDI ++ mov %rdi,%rbx ++ add $__START_KERNEL_map,%rbx ++ sub phys_base(%rip),%rbx ++ ++#ifdef CONFIG_PARAVIRT ++ cmpl $0, pv_info+PARAVIRT_enabled ++ jz 1f ++ pushq %rdi ++ i = 0 ++ .rept USER_PGD_PTRS ++ mov i*8(%rbx),%rsi ++ mov $0,%sil ++ lea i*8(%rbx),%rdi ++ call PARA_INDIRECT(pv_mmu_ops+PV_MMU_set_pgd_batched) ++ i = i + 1 ++ .endr ++ popq %rdi ++ jmp 2f ++1: ++#endif ++ ++ i = 0 ++ .rept USER_PGD_PTRS ++ movb $0,i*8(%rbx) ++ i = i + 1 ++ .endr ++ ++2: SET_RDI_INTO_CR3 ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ GET_CR0_INTO_RDI ++ bts $16,%rdi ++ SET_RDI_INTO_CR0 ++#endif ++ ++3: ++ ++#ifdef CONFIG_PARAVIRT ++ PV_RESTORE_REGS(CLBR_RDI) ++#endif ++ ++ popq %rbx ++ popq %rdi ++ pax_force_retaddr ++ retq ++4: ud2 ++ENDPROC(pax_enter_kernel_user) ++ ++ENTRY(pax_exit_kernel_user) ++ pushq %rdi ++ pushq %rbx ++ ++#ifdef CONFIG_PARAVIRT ++ PV_SAVE_REGS(CLBR_RDI) ++#endif ++ ++ GET_CR3_INTO_RDI ++ 661: jmp 1f ++ .pushsection .altinstr_replacement, "a" ++ 662: ASM_NOP2 ++ .popsection ++ .pushsection .altinstructions, "a" ++ altinstruction_entry 661b, 662b, X86_FEATURE_PCID, 2, 2 ++ .popsection ++ cmp $0,%dil ++ jnz 3f ++ add $4097,%rdi ++ bts $63,%rdi ++ SET_RDI_INTO_CR3 ++ jmp 2f ++1: ++ ++ mov %rdi,%rbx ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ GET_CR0_INTO_RDI ++ btr $16,%rdi ++ jnc 3f ++ SET_RDI_INTO_CR0 ++#endif ++ ++ add $__START_KERNEL_map,%rbx ++ sub phys_base(%rip),%rbx ++ ++#ifdef CONFIG_PARAVIRT ++ cmpl $0, pv_info+PARAVIRT_enabled ++ jz 1f ++ i = 0 ++ .rept USER_PGD_PTRS ++ mov i*8(%rbx),%rsi ++ mov $0x67,%sil ++ lea i*8(%rbx),%rdi ++ call PARA_INDIRECT(pv_mmu_ops+PV_MMU_set_pgd_batched) ++ i = i + 1 ++ .endr ++ jmp 2f ++1: ++#endif ++ ++ i = 0 ++ .rept USER_PGD_PTRS ++ movb $0x67,i*8(%rbx) ++ i = i + 1 ++ .endr ++2: ++ ++#ifdef CONFIG_PARAVIRT ++ PV_RESTORE_REGS(CLBR_RDI) ++#endif ++ ++ popq %rbx ++ popq %rdi ++ pax_force_retaddr ++ retq ++3: ud2 ++ENDPROC(pax_exit_kernel_user) ++#endif ++ ++ .macro pax_enter_kernel_nmi ++ pax_set_fptr_mask ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ GET_CR0_INTO_RDI ++ bts $16,%rdi ++ jc 110f ++ SET_RDI_INTO_CR0 ++ or $2,%ebx ++110: ++#endif ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ 661: jmp 111f ++ .pushsection .altinstr_replacement, "a" ++ 662: ASM_NOP2 ++ .popsection ++ .pushsection .altinstructions, "a" ++ altinstruction_entry 661b, 662b, X86_FEATURE_PCID, 2, 2 ++ .popsection ++ GET_CR3_INTO_RDI ++ cmp $0,%dil ++ jz 111f ++ sub $4097,%rdi ++ or $4,%ebx ++ bts $63,%rdi ++ SET_RDI_INTO_CR3 ++ mov $__UDEREF_KERNEL_DS,%edi ++ mov %edi,%ss ++111: ++#endif ++ .endm ++ ++ .macro pax_exit_kernel_nmi ++#ifdef CONFIG_PAX_KERNEXEC ++ btr $1,%ebx ++ jnc 110f ++ GET_CR0_INTO_RDI ++ btr $16,%rdi ++ SET_RDI_INTO_CR0 ++110: ++#endif ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ btr $2,%ebx ++ jnc 111f ++ GET_CR3_INTO_RDI ++ add $4097,%rdi ++ bts $63,%rdi ++ SET_RDI_INTO_CR3 ++ mov $__KERNEL_DS,%edi ++ mov %edi,%ss ++111: ++#endif ++ .endm ++ ++ .macro pax_erase_kstack ++#ifdef CONFIG_PAX_MEMORY_STACKLEAK ++ call pax_erase_kstack ++#endif ++ .endm ++ ++#ifdef CONFIG_PAX_MEMORY_STACKLEAK ++ENTRY(pax_erase_kstack) ++ pushq %rdi ++ pushq %rcx ++ pushq %rax ++ pushq %r11 ++ ++ GET_THREAD_INFO(%r11) ++ mov TI_lowest_stack(%r11), %rdi ++ mov $-0xBEEF, %rax ++ std ++ ++1: mov %edi, %ecx ++ and $THREAD_SIZE_asm - 1, %ecx ++ shr $3, %ecx ++ repne scasq ++ jecxz 2f ++ ++ cmp $2*8, %ecx ++ jc 2f ++ ++ mov $2*8, %ecx ++ repe scasq ++ jecxz 2f ++ jne 1b ++ ++2: cld ++ or $2*8, %rdi ++ mov %esp, %ecx ++ sub %edi, %ecx ++ ++ cmp $THREAD_SIZE_asm, %rcx ++ jb 3f ++ ud2 ++3: ++ ++ shr $3, %ecx ++ rep stosq ++ ++ mov TI_task_thread_sp0(%r11), %rdi ++ sub $256, %rdi ++ mov %rdi, TI_lowest_stack(%r11) ++ ++ popq %r11 ++ popq %rax ++ popq %rcx ++ popq %rdi ++ pax_force_retaddr ++ ret ++ENDPROC(pax_erase_kstack) ++#endif + + .macro TRACE_IRQS_IRETQ offset=ARGOFFSET + #ifdef CONFIG_TRACE_IRQFLAGS +@@ -117,7 +544,7 @@ ENDPROC(native_usergs_sysret64) + .endm + + .macro TRACE_IRQS_IRETQ_DEBUG offset=ARGOFFSET +- bt $9,EFLAGS-\offset(%rsp) /* interrupts off? */ ++ bt $X86_EFLAGS_IF_BIT,EFLAGS-\offset(%rsp) /* interrupts off? */ + jnc 1f + TRACE_IRQS_ON_DEBUG + 1: +@@ -155,27 +582,6 @@ ENDPROC(native_usergs_sysret64) + movq \tmp,R11+\offset(%rsp) + .endm + +- .macro FAKE_STACK_FRAME child_rip +- /* push in order ss, rsp, eflags, cs, rip */ +- xorl %eax, %eax +- pushq_cfi $__KERNEL_DS /* ss */ +- /*CFI_REL_OFFSET ss,0*/ +- pushq_cfi %rax /* rsp */ +- CFI_REL_OFFSET rsp,0 +- pushq_cfi $(X86_EFLAGS_IF|X86_EFLAGS_FIXED) /* eflags - interrupts on */ +- /*CFI_REL_OFFSET rflags,0*/ +- pushq_cfi $__KERNEL_CS /* cs */ +- /*CFI_REL_OFFSET cs,0*/ +- pushq_cfi \child_rip /* rip */ +- CFI_REL_OFFSET rip,0 +- pushq_cfi %rax /* orig rax */ +- .endm +- +- .macro UNFAKE_STACK_FRAME +- addq $8*6, %rsp +- CFI_ADJUST_CFA_OFFSET -(6*8) +- .endm +- + /* + * initial frame state for interrupts (and exceptions without error code) + */ +@@ -241,25 +647,26 @@ ENDPROC(native_usergs_sysret64) + /* save partial stack frame */ + .macro SAVE_ARGS_IRQ + cld +- /* start from rbp in pt_regs and jump over */ +- movq_cfi rdi, (RDI-RBP) +- movq_cfi rsi, (RSI-RBP) +- movq_cfi rdx, (RDX-RBP) +- movq_cfi rcx, (RCX-RBP) +- movq_cfi rax, (RAX-RBP) +- movq_cfi r8, (R8-RBP) +- movq_cfi r9, (R9-RBP) +- movq_cfi r10, (R10-RBP) +- movq_cfi r11, (R11-RBP) ++ /* start from r15 in pt_regs and jump over */ ++ movq_cfi rdi, RDI ++ movq_cfi rsi, RSI ++ movq_cfi rdx, RDX ++ movq_cfi rcx, RCX ++ movq_cfi rax, RAX ++ movq_cfi r8, R8 ++ movq_cfi r9, R9 ++ movq_cfi r10, R10 ++ movq_cfi r11, R11 ++ movq_cfi r12, R12 + + /* Save rbp so that we can unwind from get_irq_regs() */ +- movq_cfi rbp, 0 ++ movq_cfi rbp, RBP + + /* Save previous stack value */ + movq %rsp, %rsi + +- leaq -RBP(%rsp),%rdi /* arg1 for handler */ +- testl $3, CS-RBP(%rsi) ++ movq %rsp,%rdi /* arg1 for handler */ ++ testb $3, CS(%rsi) + je 1f + SWAPGS + /* +@@ -279,6 +686,18 @@ ENDPROC(native_usergs_sysret64) + 0x06 /* DW_OP_deref */, \ + 0x08 /* DW_OP_const1u */, SS+8-RBP, \ + 0x22 /* DW_OP_plus */ ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ testb $3, CS(%rdi) ++ jnz 1f ++ pax_enter_kernel ++ jmp 2f ++1: pax_enter_kernel_user ++2: ++#else ++ pax_enter_kernel ++#endif ++ + /* We entered an interrupt context - irqs are off: */ + TRACE_IRQS_OFF + .endm +@@ -308,9 +727,52 @@ ENTRY(save_paranoid) + js 1f /* negative -> in kernel */ + SWAPGS + xorl %ebx,%ebx +-1: ret ++1: ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ testb $3, CS+8(%rsp) ++ jnz 1f ++ pax_enter_kernel ++ jmp 2f ++1: pax_enter_kernel_user ++2: ++#else ++ pax_enter_kernel ++#endif ++ pax_force_retaddr ++ ret + CFI_ENDPROC +-END(save_paranoid) ++ENDPROC(save_paranoid) ++ ++ENTRY(save_paranoid_nmi) ++ XCPT_FRAME 1 RDI+8 ++ cld ++ movq_cfi rdi, RDI+8 ++ movq_cfi rsi, RSI+8 ++ movq_cfi rdx, RDX+8 ++ movq_cfi rcx, RCX+8 ++ movq_cfi rax, RAX+8 ++ movq_cfi r8, R8+8 ++ movq_cfi r9, R9+8 ++ movq_cfi r10, R10+8 ++ movq_cfi r11, R11+8 ++ movq_cfi rbx, RBX+8 ++ movq_cfi rbp, RBP+8 ++ movq_cfi r12, R12+8 ++ movq_cfi r13, R13+8 ++ movq_cfi r14, R14+8 ++ movq_cfi r15, R15+8 ++ movl $1,%ebx ++ movl $MSR_GS_BASE,%ecx ++ rdmsr ++ testl %edx,%edx ++ js 1f /* negative -> in kernel */ ++ SWAPGS ++ xorl %ebx,%ebx ++1: pax_enter_kernel_nmi ++ pax_force_retaddr ++ ret ++ CFI_ENDPROC ++ENDPROC(save_paranoid_nmi) + + /* + * A newly forked process directly context switches into this address. +@@ -331,7 +793,7 @@ ENTRY(ret_from_fork) + + RESTORE_REST + +- testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread? ++ testb $3, CS-ARGOFFSET(%rsp) # from kernel_thread? + jz 1f + + /* +@@ -344,15 +806,13 @@ ENTRY(ret_from_fork) + jmp int_ret_from_sys_call + + 1: +- subq $REST_SKIP, %rsp # leave space for volatiles +- CFI_ADJUST_CFA_OFFSET REST_SKIP + movq %rbp, %rdi + call *%rbx + movl $0, RAX(%rsp) + RESTORE_REST + jmp int_ret_from_sys_call + CFI_ENDPROC +-END(ret_from_fork) ++ENDPROC(ret_from_fork) + + /* + * System call entry. Up to 6 arguments in registers are supported. +@@ -389,7 +849,7 @@ END(ret_from_fork) + ENTRY(system_call) + CFI_STARTPROC simple + CFI_SIGNAL_FRAME +- CFI_DEF_CFA rsp,KERNEL_STACK_OFFSET ++ CFI_DEF_CFA rsp,0 + CFI_REGISTER rip,rcx + /*CFI_REGISTER rflags,r11*/ + SWAPGS_UNSAFE_STACK +@@ -402,16 +862,23 @@ GLOBAL(system_call_after_swapgs) + + movq %rsp,PER_CPU_VAR(old_rsp) + movq PER_CPU_VAR(kernel_stack),%rsp ++ SAVE_ARGS 8*6, 0, rax_enosys=1 ++ pax_enter_kernel_user ++ ++#ifdef CONFIG_PAX_RANDKSTACK ++ pax_erase_kstack ++#endif ++ + /* + * No need to follow this irqs off/on section - it's straight + * and short: + */ + ENABLE_INTERRUPTS(CLBR_NONE) +- SAVE_ARGS 8, 0, rax_enosys=1 + movq_cfi rax,(ORIG_RAX-ARGOFFSET) + movq %rcx,RIP-ARGOFFSET(%rsp) + CFI_REL_OFFSET rip,RIP-ARGOFFSET +- testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) ++ GET_THREAD_INFO(%rcx) ++ testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%rcx) + jnz tracesys + system_call_fastpath: + #if __SYSCALL_MASK == ~0 +@@ -435,10 +902,13 @@ sysret_check: + LOCKDEP_SYS_EXIT + DISABLE_INTERRUPTS(CLBR_NONE) + TRACE_IRQS_OFF +- movl TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET),%edx ++ GET_THREAD_INFO(%rcx) ++ movl TI_flags(%rcx),%edx + andl %edi,%edx + jnz sysret_careful + CFI_REMEMBER_STATE ++ pax_exit_kernel_user ++ pax_erase_kstack + /* + * sysretq will re-enable interrupts: + */ +@@ -497,12 +967,15 @@ sysret_audit: + + /* Do syscall tracing */ + tracesys: +- leaq -REST_SKIP(%rsp), %rdi ++ movq %rsp, %rdi + movq $AUDIT_ARCH_X86_64, %rsi + call syscall_trace_enter_phase1 + test %rax, %rax + jnz tracesys_phase2 /* if needed, run the slow path */ +- LOAD_ARGS 0 /* else restore clobbered regs */ ++ ++ pax_erase_kstack ++ ++ LOAD_ARGS /* else restore clobbered regs */ + jmp system_call_fastpath /* and return to the fast path */ + + tracesys_phase2: +@@ -513,12 +986,14 @@ tracesys_phase2: + movq %rax,%rdx + call syscall_trace_enter_phase2 + ++ pax_erase_kstack ++ + /* + * Reload arg registers from stack in case ptrace changed them. + * We don't reload %rax because syscall_trace_entry_phase2() returned + * the value it wants us to use in the table lookup. + */ +- LOAD_ARGS ARGOFFSET, 1 ++ LOAD_ARGS 1 + RESTORE_REST + #if __SYSCALL_MASK == ~0 + cmpq $__NR_syscall_max,%rax +@@ -548,7 +1023,9 @@ GLOBAL(int_with_check) + andl %edi,%edx + jnz int_careful + andl $~TS_COMPAT,TI_status(%rcx) +- jmp retint_swapgs ++ pax_exit_kernel_user ++ pax_erase_kstack ++ jmp retint_swapgs_pax + + /* Either reschedule or signal or syscall exit tracking needed. */ + /* First do a reschedule test. */ +@@ -594,7 +1071,7 @@ int_restore_rest: + TRACE_IRQS_OFF + jmp int_with_check + CFI_ENDPROC +-END(system_call) ++ENDPROC(system_call) + + .macro FORK_LIKE func + ENTRY(stub_\func) +@@ -607,9 +1084,10 @@ ENTRY(stub_\func) + DEFAULT_FRAME 0 8 /* offset 8: return address */ + call sys_\func + RESTORE_TOP_OF_STACK %r11, 8 +- ret $REST_SKIP /* pop extended registers */ ++ pax_force_retaddr ++ ret + CFI_ENDPROC +-END(stub_\func) ++ENDPROC(stub_\func) + .endm + + .macro FIXED_FRAME label,func +@@ -619,9 +1097,10 @@ ENTRY(\label) + FIXUP_TOP_OF_STACK %r11, 8-ARGOFFSET + call \func + RESTORE_TOP_OF_STACK %r11, 8-ARGOFFSET ++ pax_force_retaddr + ret + CFI_ENDPROC +-END(\label) ++ENDPROC(\label) + .endm + + FORK_LIKE clone +@@ -629,19 +1108,6 @@ END(\label) + FORK_LIKE vfork + FIXED_FRAME stub_iopl, sys_iopl + +-ENTRY(ptregscall_common) +- DEFAULT_FRAME 1 8 /* offset 8: return address */ +- RESTORE_TOP_OF_STACK %r11, 8 +- movq_cfi_restore R15+8, r15 +- movq_cfi_restore R14+8, r14 +- movq_cfi_restore R13+8, r13 +- movq_cfi_restore R12+8, r12 +- movq_cfi_restore RBP+8, rbp +- movq_cfi_restore RBX+8, rbx +- ret $REST_SKIP /* pop extended registers */ +- CFI_ENDPROC +-END(ptregscall_common) +- + ENTRY(stub_execve) + CFI_STARTPROC + addq $8, %rsp +@@ -653,7 +1119,7 @@ ENTRY(stub_execve) + RESTORE_REST + jmp int_ret_from_sys_call + CFI_ENDPROC +-END(stub_execve) ++ENDPROC(stub_execve) + + /* + * sigreturn is special because it needs to restore all registers on return. +@@ -670,7 +1136,7 @@ ENTRY(stub_rt_sigreturn) + RESTORE_REST + jmp int_ret_from_sys_call + CFI_ENDPROC +-END(stub_rt_sigreturn) ++ENDPROC(stub_rt_sigreturn) + + #ifdef CONFIG_X86_X32_ABI + ENTRY(stub_x32_rt_sigreturn) +@@ -684,7 +1150,7 @@ ENTRY(stub_x32_rt_sigreturn) + RESTORE_REST + jmp int_ret_from_sys_call + CFI_ENDPROC +-END(stub_x32_rt_sigreturn) ++ENDPROC(stub_x32_rt_sigreturn) + + ENTRY(stub_x32_execve) + CFI_STARTPROC +@@ -698,7 +1164,7 @@ ENTRY(stub_x32_execve) + RESTORE_REST + jmp int_ret_from_sys_call + CFI_ENDPROC +-END(stub_x32_execve) ++ENDPROC(stub_x32_execve) + + #endif + +@@ -735,7 +1201,7 @@ vector=vector+1 + 2: jmp common_interrupt + .endr + CFI_ENDPROC +-END(irq_entries_start) ++ENDPROC(irq_entries_start) + + .previous + END(interrupt) +@@ -752,8 +1218,8 @@ END(interrupt) + /* 0(%rsp): ~(interrupt number) */ + .macro interrupt func + /* reserve pt_regs for scratch regs and rbp */ +- subq $ORIG_RAX-RBP, %rsp +- CFI_ADJUST_CFA_OFFSET ORIG_RAX-RBP ++ subq $ORIG_RAX, %rsp ++ CFI_ADJUST_CFA_OFFSET ORIG_RAX + SAVE_ARGS_IRQ + call \func + .endm +@@ -776,14 +1242,14 @@ ret_from_intr: + + /* Restore saved previous stack */ + popq %rsi +- CFI_DEF_CFA rsi,SS+8-RBP /* reg/off reset after def_cfa_expr */ +- leaq ARGOFFSET-RBP(%rsi), %rsp ++ CFI_DEF_CFA rsi,SS+8 /* reg/off reset after def_cfa_expr */ ++ movq %rsi, %rsp + CFI_DEF_CFA_REGISTER rsp +- CFI_ADJUST_CFA_OFFSET RBP-ARGOFFSET ++ CFI_ADJUST_CFA_OFFSET -ARGOFFSET + + exit_intr: + GET_THREAD_INFO(%rcx) +- testl $3,CS-ARGOFFSET(%rsp) ++ testb $3,CS-ARGOFFSET(%rsp) + je retint_kernel + + /* Interrupt came from user space */ +@@ -805,12 +1271,35 @@ retint_swapgs: /* return to user-space */ + * The iretq could re-enable interrupts: + */ + DISABLE_INTERRUPTS(CLBR_ANY) ++ pax_exit_kernel_user ++retint_swapgs_pax: + TRACE_IRQS_IRETQ + SWAPGS + jmp restore_args + + retint_restore_args: /* return to kernel space */ + DISABLE_INTERRUPTS(CLBR_ANY) ++ pax_exit_kernel ++ ++#if defined(CONFIG_EFI) && defined(CONFIG_PAX_KERNEXEC) ++ /* This is a quirk to allow IRQs/NMIs/MCEs during early EFI setup, ++ * namely calling EFI runtime services with a phys mapping. We're ++ * starting off with NOPs and patch in the real instrumentation ++ * (BTS/OR) before starting any userland process; even before starting ++ * up the APs. ++ */ ++ .pushsection .altinstr_replacement, "a" ++ 601: pax_force_retaddr (RIP-ARGOFFSET) ++ 602: ++ .popsection ++ 603: .fill 602b-601b, 1, 0x90 ++ .pushsection .altinstructions, "a" ++ altinstruction_entry 603b, 601b, X86_FEATURE_ALWAYS, 602b-601b, 602b-601b ++ .popsection ++#else ++ pax_force_retaddr (RIP-ARGOFFSET) ++#endif ++ + /* + * The iretq could re-enable interrupts: + */ +@@ -848,15 +1337,15 @@ native_irq_return_ldt: + SWAPGS + movq PER_CPU_VAR(espfix_waddr),%rdi + movq %rax,(0*8)(%rdi) /* RAX */ +- movq (2*8)(%rsp),%rax /* RIP */ ++ movq (2*8 + RIP-RIP)(%rsp),%rax /* RIP */ + movq %rax,(1*8)(%rdi) +- movq (3*8)(%rsp),%rax /* CS */ ++ movq (2*8 + CS-RIP)(%rsp),%rax /* CS */ + movq %rax,(2*8)(%rdi) +- movq (4*8)(%rsp),%rax /* RFLAGS */ ++ movq (2*8 + EFLAGS-RIP)(%rsp),%rax /* RFLAGS */ + movq %rax,(3*8)(%rdi) +- movq (6*8)(%rsp),%rax /* SS */ ++ movq (2*8 + SS-RIP)(%rsp),%rax /* SS */ + movq %rax,(5*8)(%rdi) +- movq (5*8)(%rsp),%rax /* RSP */ ++ movq (2*8 + RSP-RIP)(%rsp),%rax /* RSP */ + movq %rax,(4*8)(%rdi) + andl $0xffff0000,%eax + popq_cfi %rdi +@@ -910,7 +1399,7 @@ ENTRY(retint_kernel) + jmp exit_intr + #endif + CFI_ENDPROC +-END(common_interrupt) ++ENDPROC(common_interrupt) + + /* + * APIC interrupts. +@@ -924,7 +1413,7 @@ ENTRY(\sym) + interrupt \do_sym + jmp ret_from_intr + CFI_ENDPROC +-END(\sym) ++ENDPROC(\sym) + .endm + + #ifdef CONFIG_TRACING +@@ -997,7 +1486,7 @@ apicinterrupt IRQ_WORK_VECTOR \ + /* + * Exception entry points. + */ +-#define INIT_TSS_IST(x) PER_CPU_VAR(init_tss) + (TSS_ist + ((x) - 1) * 8) ++#define INIT_TSS_IST(x) (TSS_ist + ((x) - 1) * 8)(%r13) + + .macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 + ENTRY(\sym) +@@ -1048,6 +1537,12 @@ ENTRY(\sym) + .endif + + .if \shift_ist != -1 ++#ifdef CONFIG_SMP ++ imul $TSS_size, PER_CPU_VAR(cpu_number), %r13d ++ lea init_tss(%r13), %r13 ++#else ++ lea init_tss(%rip), %r13 ++#endif + subq $EXCEPTION_STKSZ, INIT_TSS_IST(\shift_ist) + .endif + +@@ -1064,7 +1559,7 @@ ENTRY(\sym) + .endif + + CFI_ENDPROC +-END(\sym) ++ENDPROC(\sym) + .endm + + #ifdef CONFIG_TRACING +@@ -1105,9 +1600,10 @@ gs_change: + 2: mfence /* workaround */ + SWAPGS + popfq_cfi ++ pax_force_retaddr + ret + CFI_ENDPROC +-END(native_load_gs_index) ++ENDPROC(native_load_gs_index) + + _ASM_EXTABLE(gs_change,bad_gs) + .section .fixup,"ax" +@@ -1135,9 +1631,10 @@ ENTRY(do_softirq_own_stack) + CFI_DEF_CFA_REGISTER rsp + CFI_ADJUST_CFA_OFFSET -8 + decl PER_CPU_VAR(irq_count) ++ pax_force_retaddr + ret + CFI_ENDPROC +-END(do_softirq_own_stack) ++ENDPROC(do_softirq_own_stack) + + #ifdef CONFIG_XEN + idtentry xen_hypervisor_callback xen_do_hypervisor_callback has_error_code=0 +@@ -1175,7 +1672,7 @@ ENTRY(xen_do_hypervisor_callback) # do_hypervisor_callback(struct *pt_regs) + decl PER_CPU_VAR(irq_count) + jmp error_exit + CFI_ENDPROC +-END(xen_do_hypervisor_callback) ++ENDPROC(xen_do_hypervisor_callback) + + /* + * Hypervisor uses this for application faults while it executes. +@@ -1234,7 +1731,7 @@ ENTRY(xen_failsafe_callback) + SAVE_ALL + jmp error_exit + CFI_ENDPROC +-END(xen_failsafe_callback) ++ENDPROC(xen_failsafe_callback) + + apicinterrupt3 HYPERVISOR_CALLBACK_VECTOR \ + xen_hvm_callback_vector xen_evtchn_do_upcall +@@ -1281,18 +1778,33 @@ ENTRY(paranoid_exit) + DEFAULT_FRAME + DISABLE_INTERRUPTS(CLBR_NONE) + TRACE_IRQS_OFF_DEBUG +- testl %ebx,%ebx /* swapgs needed? */ ++ testl $1,%ebx /* swapgs needed? */ + jnz paranoid_restore +- testl $3,CS(%rsp) ++ testb $3,CS(%rsp) + jnz paranoid_userspace ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ pax_exit_kernel ++ TRACE_IRQS_IRETQ 0 ++ SWAPGS_UNSAFE_STACK ++ RESTORE_ALL 8 ++ pax_force_retaddr_bts ++ jmp irq_return ++#endif + paranoid_swapgs: ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ pax_exit_kernel_user ++#else ++ pax_exit_kernel ++#endif + TRACE_IRQS_IRETQ 0 + SWAPGS_UNSAFE_STACK + RESTORE_ALL 8 + jmp irq_return + paranoid_restore: ++ pax_exit_kernel + TRACE_IRQS_IRETQ_DEBUG 0 + RESTORE_ALL 8 ++ pax_force_retaddr_bts + jmp irq_return + paranoid_userspace: + GET_THREAD_INFO(%rcx) +@@ -1321,7 +1833,7 @@ paranoid_schedule: + TRACE_IRQS_OFF + jmp paranoid_userspace + CFI_ENDPROC +-END(paranoid_exit) ++ENDPROC(paranoid_exit) + + /* + * Exception entry point. This expects an error code/orig_rax on the stack. +@@ -1348,12 +1860,23 @@ ENTRY(error_entry) + movq %r14, R14+8(%rsp) + movq %r15, R15+8(%rsp) + xorl %ebx,%ebx +- testl $3,CS+8(%rsp) ++ testb $3,CS+8(%rsp) + je error_kernelspace + error_swapgs: + SWAPGS + error_sti: ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ testb $3, CS+8(%rsp) ++ jnz 1f ++ pax_enter_kernel ++ jmp 2f ++1: pax_enter_kernel_user ++2: ++#else ++ pax_enter_kernel ++#endif + TRACE_IRQS_OFF ++ pax_force_retaddr + ret + + /* +@@ -1388,7 +1911,7 @@ error_bad_iret: + decl %ebx /* Return to usergs */ + jmp error_sti + CFI_ENDPROC +-END(error_entry) ++ENDPROC(error_entry) + + + /* ebx: no swapgs flag (1: don't need swapgs, 0: need it) */ +@@ -1399,7 +1922,7 @@ ENTRY(error_exit) + DISABLE_INTERRUPTS(CLBR_NONE) + TRACE_IRQS_OFF + GET_THREAD_INFO(%rcx) +- testl %eax,%eax ++ testl $1,%eax + jne retint_kernel + LOCKDEP_SYS_EXIT_IRQ + movl TI_flags(%rcx),%edx +@@ -1408,7 +1931,7 @@ ENTRY(error_exit) + jnz retint_careful + jmp retint_swapgs + CFI_ENDPROC +-END(error_exit) ++ENDPROC(error_exit) + + /* + * Test if a given stack is an NMI stack or not. +@@ -1466,9 +1989,11 @@ ENTRY(nmi) + * If %cs was not the kernel segment, then the NMI triggered in user + * space, which means it is definitely not nested. + */ ++ cmpl $__KERNEXEC_KERNEL_CS, 16(%rsp) ++ je 1f + cmpl $__KERNEL_CS, 16(%rsp) + jne first_nmi +- ++1: + /* + * Check the special variable on the stack to see if NMIs are + * executing. +@@ -1502,8 +2027,7 @@ nested_nmi: + + 1: + /* Set up the interrupted NMIs stack to jump to repeat_nmi */ +- leaq -1*8(%rsp), %rdx +- movq %rdx, %rsp ++ subq $8, %rsp + CFI_ADJUST_CFA_OFFSET 1*8 + leaq -10*8(%rsp), %rdx + pushq_cfi $__KERNEL_DS +@@ -1521,6 +2045,7 @@ nested_nmi_out: + CFI_RESTORE rdx + + /* No need to check faults here */ ++# pax_force_retaddr_bts + INTERRUPT_RETURN + + CFI_RESTORE_STATE +@@ -1617,13 +2142,13 @@ end_repeat_nmi: + subq $ORIG_RAX-R15, %rsp + CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15 + /* +- * Use save_paranoid to handle SWAPGS, but no need to use paranoid_exit ++ * Use save_paranoid_nmi to handle SWAPGS, but no need to use paranoid_exit + * as we should not be calling schedule in NMI context. + * Even with normal interrupts enabled. An NMI should not be + * setting NEED_RESCHED or anything that normal interrupts and + * exceptions might do. + */ +- call save_paranoid ++ call save_paranoid_nmi + DEFAULT_FRAME 0 + + /* +@@ -1633,9 +2158,9 @@ end_repeat_nmi: + * NMI itself takes a page fault, the page fault that was preempted + * will read the information from the NMI page fault and not the + * origin fault. Save it off and restore it if it changes. +- * Use the r12 callee-saved register. ++ * Use the r13 callee-saved register. + */ +- movq %cr2, %r12 ++ movq %cr2, %r13 + + /* paranoidentry do_nmi, 0; without TRACE_IRQS_OFF */ + movq %rsp,%rdi +@@ -1644,29 +2169,34 @@ end_repeat_nmi: + + /* Did the NMI take a page fault? Restore cr2 if it did */ + movq %cr2, %rcx +- cmpq %rcx, %r12 ++ cmpq %rcx, %r13 + je 1f +- movq %r12, %cr2 ++ movq %r13, %cr2 + 1: + +- testl %ebx,%ebx /* swapgs needed? */ ++ testl $1,%ebx /* swapgs needed? */ + jnz nmi_restore + nmi_swapgs: + SWAPGS_UNSAFE_STACK + nmi_restore: ++ pax_exit_kernel_nmi + /* Pop the extra iret frame at once */ + RESTORE_ALL 6*8 ++ testb $3, 8(%rsp) ++ jnz 1f ++ pax_force_retaddr_bts ++1: + + /* Clear the NMI executing stack variable */ + movq $0, 5*8(%rsp) + jmp irq_return + CFI_ENDPROC +-END(nmi) ++ENDPROC(nmi) + + ENTRY(ignore_sysret) + CFI_STARTPROC + mov $-ENOSYS,%eax + sysret + CFI_ENDPROC +-END(ignore_sysret) ++ENDPROC(ignore_sysret) + +diff --git a/arch/x86/kernel/espfix_64.c b/arch/x86/kernel/espfix_64.c +index 94d857f..5bce89c 100644 +--- a/arch/x86/kernel/espfix_64.c ++++ b/arch/x86/kernel/espfix_64.c +@@ -70,8 +70,7 @@ static DEFINE_MUTEX(espfix_init_mutex); + #define ESPFIX_MAX_PAGES DIV_ROUND_UP(CONFIG_NR_CPUS, ESPFIX_STACKS_PER_PAGE) + static void *espfix_pages[ESPFIX_MAX_PAGES]; + +-static __page_aligned_bss pud_t espfix_pud_page[PTRS_PER_PUD] +- __aligned(PAGE_SIZE); ++static pud_t espfix_pud_page[PTRS_PER_PUD] __page_aligned_rodata; + + static unsigned int page_random, slot_random; + +@@ -122,14 +121,17 @@ static void init_espfix_random(void) + void __init init_espfix_bsp(void) + { + pgd_t *pgd_p; +- pteval_t ptemask; +- +- ptemask = __supported_pte_mask; ++ unsigned long index = pgd_index(ESPFIX_BASE_ADDR); + + /* Install the espfix pud into the kernel page directory */ +- pgd_p = &init_level4_pgt[pgd_index(ESPFIX_BASE_ADDR)]; ++ pgd_p = &init_level4_pgt[index]; + pgd_populate(&init_mm, pgd_p, (pud_t *)espfix_pud_page); + ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ clone_pgd_range(get_cpu_pgd(0, kernel) + index, swapper_pg_dir + index, 1); ++ clone_pgd_range(get_cpu_pgd(0, user) + index, swapper_pg_dir + index, 1); ++#endif ++ + /* Randomize the locations */ + init_espfix_random(); + +@@ -197,7 +199,7 @@ void init_espfix_ap(void) + set_pte(&pte_p[n*PTE_STRIDE], pte); + + /* Job is done for this CPU and any CPU which shares this page */ +- ACCESS_ONCE(espfix_pages[page]) = stack_page; ++ ACCESS_ONCE_RW(espfix_pages[page]) = stack_page; + + unlock_done: + mutex_unlock(&espfix_init_mutex); +diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c +index 3386dc9..28bdf81 100644 +--- a/arch/x86/kernel/ftrace.c ++++ b/arch/x86/kernel/ftrace.c +@@ -88,7 +88,7 @@ static unsigned long text_ip_addr(unsigned long ip) + * kernel identity mapping to modify code. + */ + if (within(ip, (unsigned long)_text, (unsigned long)_etext)) +- ip = (unsigned long)__va(__pa_symbol(ip)); ++ ip = (unsigned long)__va(__pa_symbol(ktla_ktva(ip))); + + return ip; + } +@@ -104,6 +104,8 @@ ftrace_modify_code_direct(unsigned long ip, unsigned const char *old_code, + { + unsigned char replaced[MCOUNT_INSN_SIZE]; + ++ ip = ktla_ktva(ip); ++ + /* + * Note: Due to modules and __init, code can + * disappear and change, we need to protect against faulting +@@ -229,7 +231,7 @@ static int update_ftrace_func(unsigned long ip, void *new) + unsigned char old[MCOUNT_INSN_SIZE]; + int ret; + +- memcpy(old, (void *)ip, MCOUNT_INSN_SIZE); ++ memcpy(old, (void *)ktla_ktva(ip), MCOUNT_INSN_SIZE); + + ftrace_update_func = ip; + /* Make sure the breakpoints see the ftrace_update_func update */ +@@ -310,7 +312,7 @@ static int add_break(unsigned long ip, const char *old) + unsigned char replaced[MCOUNT_INSN_SIZE]; + unsigned char brk = BREAKPOINT_INSTRUCTION; + +- if (probe_kernel_read(replaced, (void *)ip, MCOUNT_INSN_SIZE)) ++ if (probe_kernel_read(replaced, (void *)ktla_ktva(ip), MCOUNT_INSN_SIZE)) + return -EFAULT; + + /* Make sure it is what we expect it to be */ +diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c +index eda1a86..8f6df48 100644 +--- a/arch/x86/kernel/head64.c ++++ b/arch/x86/kernel/head64.c +@@ -67,12 +67,12 @@ again: + pgd = *pgd_p; + + /* +- * The use of __START_KERNEL_map rather than __PAGE_OFFSET here is +- * critical -- __PAGE_OFFSET would point us back into the dynamic ++ * The use of __early_va rather than __va here is critical: ++ * __va would point us back into the dynamic + * range and we might end up looping forever... + */ + if (pgd) +- pud_p = (pudval_t *)((pgd & PTE_PFN_MASK) + __START_KERNEL_map - phys_base); ++ pud_p = (pudval_t *)(__early_va(pgd & PTE_PFN_MASK)); + else { + if (next_early_pgt >= EARLY_DYNAMIC_PAGE_TABLES) { + reset_early_page_tables(); +@@ -82,13 +82,13 @@ again: + pud_p = (pudval_t *)early_dynamic_pgts[next_early_pgt++]; + for (i = 0; i < PTRS_PER_PUD; i++) + pud_p[i] = 0; +- *pgd_p = (pgdval_t)pud_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE; ++ *pgd_p = (pgdval_t)__pa(pud_p) + _KERNPG_TABLE; + } + pud_p += pud_index(address); + pud = *pud_p; + + if (pud) +- pmd_p = (pmdval_t *)((pud & PTE_PFN_MASK) + __START_KERNEL_map - phys_base); ++ pmd_p = (pmdval_t *)(__early_va(pud & PTE_PFN_MASK)); + else { + if (next_early_pgt >= EARLY_DYNAMIC_PAGE_TABLES) { + reset_early_page_tables(); +@@ -98,7 +98,7 @@ again: + pmd_p = (pmdval_t *)early_dynamic_pgts[next_early_pgt++]; + for (i = 0; i < PTRS_PER_PMD; i++) + pmd_p[i] = 0; +- *pud_p = (pudval_t)pmd_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE; ++ *pud_p = (pudval_t)__pa(pmd_p) + _KERNPG_TABLE; + } + pmd = (physaddr & PMD_MASK) + early_pmd_flags; + pmd_p[pmd_index(address)] = pmd; +@@ -175,7 +175,6 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data) + if (console_loglevel >= CONSOLE_LOGLEVEL_DEBUG) + early_printk("Kernel alive\n"); + +- clear_page(init_level4_pgt); + /* set init_level4_pgt kernel high mapping*/ + init_level4_pgt[511] = early_level4_pgt[511]; + +diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S +index f36bd42..0ab4474 100644 +--- a/arch/x86/kernel/head_32.S ++++ b/arch/x86/kernel/head_32.S +@@ -26,6 +26,12 @@ + /* Physical address */ + #define pa(X) ((X) - __PAGE_OFFSET) + ++#ifdef CONFIG_PAX_KERNEXEC ++#define ta(X) (X) ++#else ++#define ta(X) ((X) - __PAGE_OFFSET) ++#endif ++ + /* + * References to members of the new_cpu_data structure. + */ +@@ -55,11 +61,7 @@ + * and small than max_low_pfn, otherwise will waste some page table entries + */ + +-#if PTRS_PER_PMD > 1 +-#define PAGE_TABLE_SIZE(pages) (((pages) / PTRS_PER_PMD) + PTRS_PER_PGD) +-#else +-#define PAGE_TABLE_SIZE(pages) ((pages) / PTRS_PER_PGD) +-#endif ++#define PAGE_TABLE_SIZE(pages) ((pages) / PTRS_PER_PTE) + + /* Number of possible pages in the lowmem region */ + LOWMEM_PAGES = (((1<<32) - __PAGE_OFFSET) >> PAGE_SHIFT) +@@ -78,6 +80,12 @@ INIT_MAP_SIZE = PAGE_TABLE_SIZE(KERNEL_PAGES) * PAGE_SIZE + RESERVE_BRK(pagetables, INIT_MAP_SIZE) + + /* ++ * Real beginning of normal "text" segment ++ */ ++ENTRY(stext) ++ENTRY(_stext) ++ ++/* + * 32-bit kernel entrypoint; only used by the boot CPU. On entry, + * %esi points to the real-mode code as a 32-bit pointer. + * CS and DS must be 4 GB flat segments, but we don't depend on +@@ -85,6 +93,13 @@ RESERVE_BRK(pagetables, INIT_MAP_SIZE) + * can. + */ + __HEAD ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ jmp startup_32 ++/* PaX: fill first page in .text with int3 to catch NULL derefs in kernel mode */ ++.fill PAGE_SIZE-5,1,0xcc ++#endif ++ + ENTRY(startup_32) + movl pa(stack_start),%ecx + +@@ -106,6 +121,59 @@ ENTRY(startup_32) + 2: + leal -__PAGE_OFFSET(%ecx),%esp + ++#ifdef CONFIG_SMP ++ movl $pa(cpu_gdt_table),%edi ++ movl $__per_cpu_load,%eax ++ movw %ax,GDT_ENTRY_PERCPU * 8 + 2(%edi) ++ rorl $16,%eax ++ movb %al,GDT_ENTRY_PERCPU * 8 + 4(%edi) ++ movb %ah,GDT_ENTRY_PERCPU * 8 + 7(%edi) ++ movl $__per_cpu_end - 1,%eax ++ subl $__per_cpu_start,%eax ++ movw %ax,GDT_ENTRY_PERCPU * 8 + 0(%edi) ++#endif ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ movl $NR_CPUS,%ecx ++ movl $pa(cpu_gdt_table),%edi ++1: ++ movl $((((__PAGE_OFFSET-1) & 0xf0000000) >> 12) | 0x00c09700),GDT_ENTRY_KERNEL_DS * 8 + 4(%edi) ++ movl $((((__PAGE_OFFSET-1) & 0xf0000000) >> 12) | 0x00c0fb00),GDT_ENTRY_DEFAULT_USER_CS * 8 + 4(%edi) ++ movl $((((__PAGE_OFFSET-1) & 0xf0000000) >> 12) | 0x00c0f300),GDT_ENTRY_DEFAULT_USER_DS * 8 + 4(%edi) ++ addl $PAGE_SIZE_asm,%edi ++ loop 1b ++#endif ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ movl $pa(boot_gdt),%edi ++ movl $__LOAD_PHYSICAL_ADDR,%eax ++ movw %ax,GDT_ENTRY_BOOT_CS * 8 + 2(%edi) ++ rorl $16,%eax ++ movb %al,GDT_ENTRY_BOOT_CS * 8 + 4(%edi) ++ movb %ah,GDT_ENTRY_BOOT_CS * 8 + 7(%edi) ++ rorl $16,%eax ++ ++ ljmp $(__BOOT_CS),$1f ++1: ++ ++ movl $NR_CPUS,%ecx ++ movl $pa(cpu_gdt_table),%edi ++ addl $__PAGE_OFFSET,%eax ++1: ++ movb $0xc0,GDT_ENTRY_KERNEL_CS * 8 + 6(%edi) ++ movb $0xc0,GDT_ENTRY_KERNEXEC_KERNEL_CS * 8 + 6(%edi) ++ movw %ax,GDT_ENTRY_KERNEL_CS * 8 + 2(%edi) ++ movw %ax,GDT_ENTRY_KERNEXEC_KERNEL_CS * 8 + 2(%edi) ++ rorl $16,%eax ++ movb %al,GDT_ENTRY_KERNEL_CS * 8 + 4(%edi) ++ movb %al,GDT_ENTRY_KERNEXEC_KERNEL_CS * 8 + 4(%edi) ++ movb %ah,GDT_ENTRY_KERNEL_CS * 8 + 7(%edi) ++ movb %ah,GDT_ENTRY_KERNEXEC_KERNEL_CS * 8 + 7(%edi) ++ rorl $16,%eax ++ addl $PAGE_SIZE_asm,%edi ++ loop 1b ++#endif ++ + /* + * Clear BSS first so that there are no surprises... + */ +@@ -201,8 +269,11 @@ ENTRY(startup_32) + movl %eax, pa(max_pfn_mapped) + + /* Do early initialization of the fixmap area */ +- movl $pa(initial_pg_fixmap)+PDE_IDENT_ATTR,%eax +- movl %eax,pa(initial_pg_pmd+0x1000*KPMDS-8) ++#ifdef CONFIG_COMPAT_VDSO ++ movl $pa(initial_pg_fixmap)+PDE_IDENT_ATTR+_PAGE_USER,pa(initial_pg_pmd+0x1000*KPMDS-8) ++#else ++ movl $pa(initial_pg_fixmap)+PDE_IDENT_ATTR,pa(initial_pg_pmd+0x1000*KPMDS-8) ++#endif + #else /* Not PAE */ + + page_pde_offset = (__PAGE_OFFSET >> 20); +@@ -232,8 +303,11 @@ page_pde_offset = (__PAGE_OFFSET >> 20); + movl %eax, pa(max_pfn_mapped) + + /* Do early initialization of the fixmap area */ +- movl $pa(initial_pg_fixmap)+PDE_IDENT_ATTR,%eax +- movl %eax,pa(initial_page_table+0xffc) ++#ifdef CONFIG_COMPAT_VDSO ++ movl $pa(initial_pg_fixmap)+PDE_IDENT_ATTR+_PAGE_USER,pa(initial_page_table+0xffc) ++#else ++ movl $pa(initial_pg_fixmap)+PDE_IDENT_ATTR,pa(initial_page_table+0xffc) ++#endif + #endif + + #ifdef CONFIG_PARAVIRT +@@ -247,9 +321,7 @@ page_pde_offset = (__PAGE_OFFSET >> 20); + cmpl $num_subarch_entries, %eax + jae bad_subarch + +- movl pa(subarch_entries)(,%eax,4), %eax +- subl $__PAGE_OFFSET, %eax +- jmp *%eax ++ jmp *pa(subarch_entries)(,%eax,4) + + bad_subarch: + WEAK(lguest_entry) +@@ -261,10 +333,10 @@ WEAK(xen_entry) + __INITDATA + + subarch_entries: +- .long default_entry /* normal x86/PC */ +- .long lguest_entry /* lguest hypervisor */ +- .long xen_entry /* Xen hypervisor */ +- .long default_entry /* Moorestown MID */ ++ .long ta(default_entry) /* normal x86/PC */ ++ .long ta(lguest_entry) /* lguest hypervisor */ ++ .long ta(xen_entry) /* Xen hypervisor */ ++ .long ta(default_entry) /* Moorestown MID */ + num_subarch_entries = (. - subarch_entries) / 4 + .previous + #else +@@ -354,6 +426,7 @@ default_entry: + movl pa(mmu_cr4_features),%eax + movl %eax,%cr4 + ++#ifdef CONFIG_X86_PAE + testb $X86_CR4_PAE, %al # check if PAE is enabled + jz enable_paging + +@@ -382,6 +455,9 @@ default_entry: + /* Make changes effective */ + wrmsr + ++ btsl $_PAGE_BIT_NX-32,pa(__supported_pte_mask+4) ++#endif ++ + enable_paging: + + /* +@@ -449,14 +525,20 @@ is486: + 1: movl $(__KERNEL_DS),%eax # reload all the segment registers + movl %eax,%ss # after changing gdt. + +- movl $(__USER_DS),%eax # DS/ES contains default USER segment ++# movl $(__KERNEL_DS),%eax # DS/ES contains default KERNEL segment + movl %eax,%ds + movl %eax,%es + + movl $(__KERNEL_PERCPU), %eax + movl %eax,%fs # set this cpu's percpu + ++#ifdef CONFIG_CC_STACKPROTECTOR + movl $(__KERNEL_STACK_CANARY),%eax ++#elif defined(CONFIG_PAX_MEMORY_UDEREF) ++ movl $(__USER_DS),%eax ++#else ++ xorl %eax,%eax ++#endif + movl %eax,%gs + + xorl %eax,%eax # Clear LDT +@@ -512,8 +594,11 @@ setup_once: + * relocation. Manually set base address in stack canary + * segment descriptor. + */ +- movl $gdt_page,%eax ++ movl $cpu_gdt_table,%eax + movl $stack_canary,%ecx ++#ifdef CONFIG_SMP ++ addl $__per_cpu_load,%ecx ++#endif + movw %cx, 8 * GDT_ENTRY_STACK_CANARY + 2(%eax) + shrl $16, %ecx + movb %cl, 8 * GDT_ENTRY_STACK_CANARY + 4(%eax) +@@ -548,7 +633,7 @@ ENTRY(early_idt_handler) + cmpl $2,(%esp) # X86_TRAP_NMI + je is_nmi # Ignore NMI + +- cmpl $2,%ss:early_recursion_flag ++ cmpl $1,%ss:early_recursion_flag + je hlt_loop + incl %ss:early_recursion_flag + +@@ -586,8 +671,8 @@ ENTRY(early_idt_handler) + pushl (20+6*4)(%esp) /* trapno */ + pushl $fault_msg + call printk +-#endif + call dump_stack ++#endif + hlt_loop: + hlt + jmp hlt_loop +@@ -607,8 +692,11 @@ ENDPROC(early_idt_handler) + /* This is the default interrupt "handler" :-) */ + ALIGN + ignore_int: +- cld + #ifdef CONFIG_PRINTK ++ cmpl $2,%ss:early_recursion_flag ++ je hlt_loop ++ incl %ss:early_recursion_flag ++ cld + pushl %eax + pushl %ecx + pushl %edx +@@ -617,9 +705,6 @@ ignore_int: + movl $(__KERNEL_DS),%eax + movl %eax,%ds + movl %eax,%es +- cmpl $2,early_recursion_flag +- je hlt_loop +- incl early_recursion_flag + pushl 16(%esp) + pushl 24(%esp) + pushl 32(%esp) +@@ -653,29 +738,34 @@ ENTRY(setup_once_ref) + /* + * BSS section + */ +-__PAGE_ALIGNED_BSS +- .align PAGE_SIZE + #ifdef CONFIG_X86_PAE ++.section .initial_pg_pmd,"a",@progbits + initial_pg_pmd: + .fill 1024*KPMDS,4,0 + #else ++.section .initial_page_table,"a",@progbits + ENTRY(initial_page_table) + .fill 1024,4,0 + #endif ++.section .initial_pg_fixmap,"a",@progbits + initial_pg_fixmap: + .fill 1024,4,0 ++.section .empty_zero_page,"a",@progbits + ENTRY(empty_zero_page) + .fill 4096,1,0 ++.section .swapper_pg_dir,"a",@progbits + ENTRY(swapper_pg_dir) ++#ifdef CONFIG_X86_PAE ++ .fill 4,8,0 ++#else + .fill 1024,4,0 ++#endif + + /* + * This starts the data section. + */ + #ifdef CONFIG_X86_PAE +-__PAGE_ALIGNED_DATA +- /* Page-aligned for the benefit of paravirt? */ +- .align PAGE_SIZE ++.section .initial_page_table,"a",@progbits + ENTRY(initial_page_table) + .long pa(initial_pg_pmd+PGD_IDENT_ATTR),0 /* low identity map */ + # if KPMDS == 3 +@@ -694,12 +784,20 @@ ENTRY(initial_page_table) + # error "Kernel PMDs should be 1, 2 or 3" + # endif + .align PAGE_SIZE /* needs to be page-sized too */ ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ENTRY(cpu_pgd) ++ .rept 2*NR_CPUS ++ .fill 4,8,0 ++ .endr ++#endif ++ + #endif + + .data + .balign 4 + ENTRY(stack_start) +- .long init_thread_union+THREAD_SIZE ++ .long init_thread_union+THREAD_SIZE-8 + + __INITRODATA + int_msg: +@@ -727,7 +825,7 @@ fault_msg: + * segment size, and 32-bit linear address value: + */ + +- .data ++.section .rodata,"a",@progbits + .globl boot_gdt_descr + .globl idt_descr + +@@ -736,7 +834,7 @@ fault_msg: + .word 0 # 32 bit align gdt_desc.address + boot_gdt_descr: + .word __BOOT_DS+7 +- .long boot_gdt - __PAGE_OFFSET ++ .long pa(boot_gdt) + + .word 0 # 32-bit align idt_desc.address + idt_descr: +@@ -747,7 +845,7 @@ idt_descr: + .word 0 # 32 bit align gdt_desc.address + ENTRY(early_gdt_descr) + .word GDT_ENTRIES*8-1 +- .long gdt_page /* Overwritten for secondary CPUs */ ++ .long cpu_gdt_table /* Overwritten for secondary CPUs */ + + /* + * The boot_gdt must mirror the equivalent in setup.S and is +@@ -756,5 +854,65 @@ ENTRY(early_gdt_descr) + .align L1_CACHE_BYTES + ENTRY(boot_gdt) + .fill GDT_ENTRY_BOOT_CS,8,0 +- .quad 0x00cf9a000000ffff /* kernel 4GB code at 0x00000000 */ +- .quad 0x00cf92000000ffff /* kernel 4GB data at 0x00000000 */ ++ .quad 0x00cf9b000000ffff /* kernel 4GB code at 0x00000000 */ ++ .quad 0x00cf93000000ffff /* kernel 4GB data at 0x00000000 */ ++ ++ .align PAGE_SIZE_asm ++ENTRY(cpu_gdt_table) ++ .rept NR_CPUS ++ .quad 0x0000000000000000 /* NULL descriptor */ ++ .quad 0x0000000000000000 /* 0x0b reserved */ ++ .quad 0x0000000000000000 /* 0x13 reserved */ ++ .quad 0x0000000000000000 /* 0x1b reserved */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ .quad 0x00cf9b000000ffff /* 0x20 alternate kernel 4GB code at 0x00000000 */ ++#else ++ .quad 0x0000000000000000 /* 0x20 unused */ ++#endif ++ ++ .quad 0x0000000000000000 /* 0x28 unused */ ++ .quad 0x0000000000000000 /* 0x33 TLS entry 1 */ ++ .quad 0x0000000000000000 /* 0x3b TLS entry 2 */ ++ .quad 0x0000000000000000 /* 0x43 TLS entry 3 */ ++ .quad 0x0000000000000000 /* 0x4b reserved */ ++ .quad 0x0000000000000000 /* 0x53 reserved */ ++ .quad 0x0000000000000000 /* 0x5b reserved */ ++ ++ .quad 0x00cf9b000000ffff /* 0x60 kernel 4GB code at 0x00000000 */ ++ .quad 0x00cf93000000ffff /* 0x68 kernel 4GB data at 0x00000000 */ ++ .quad 0x00cffb000000ffff /* 0x73 user 4GB code at 0x00000000 */ ++ .quad 0x00cff3000000ffff /* 0x7b user 4GB data at 0x00000000 */ ++ ++ .quad 0x0000000000000000 /* 0x80 TSS descriptor */ ++ .quad 0x0000000000000000 /* 0x88 LDT descriptor */ ++ ++ /* ++ * Segments used for calling PnP BIOS have byte granularity. ++ * The code segments and data segments have fixed 64k limits, ++ * the transfer segment sizes are set at run time. ++ */ ++ .quad 0x00409b000000ffff /* 0x90 32-bit code */ ++ .quad 0x00009b000000ffff /* 0x98 16-bit code */ ++ .quad 0x000093000000ffff /* 0xa0 16-bit data */ ++ .quad 0x0000930000000000 /* 0xa8 16-bit data */ ++ .quad 0x0000930000000000 /* 0xb0 16-bit data */ ++ ++ /* ++ * The APM segments have byte granularity and their bases ++ * are set at run time. All have 64k limits. ++ */ ++ .quad 0x00409b000000ffff /* 0xb8 APM CS code */ ++ .quad 0x00009b000000ffff /* 0xc0 APM CS 16 code (16 bit) */ ++ .quad 0x004093000000ffff /* 0xc8 APM DS data */ ++ ++ .quad 0x00c093000000ffff /* 0xd0 - ESPFIX SS */ ++ .quad 0x0040930000000000 /* 0xd8 - PERCPU */ ++ .quad 0x0040910000000017 /* 0xe0 - STACK_CANARY */ ++ .quad 0x0000000000000000 /* 0xe8 - PCIBIOS_CS */ ++ .quad 0x0000000000000000 /* 0xf0 - PCIBIOS_DS */ ++ .quad 0x0000000000000000 /* 0xf8 - GDT entry 31: double-fault TSS */ ++ ++ /* Be sure this is zeroed to avoid false validations in Xen */ ++ .fill PAGE_SIZE_asm - GDT_SIZE,1,0 ++ .endr +diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S +index a468c0a..8b5a879 100644 +--- a/arch/x86/kernel/head_64.S ++++ b/arch/x86/kernel/head_64.S +@@ -20,6 +20,8 @@ + #include <asm/processor-flags.h> + #include <asm/percpu.h> + #include <asm/nops.h> ++#include <asm/cpufeature.h> ++#include <asm/alternative-asm.h> + + #ifdef CONFIG_PARAVIRT + #include <asm/asm-offsets.h> +@@ -41,6 +43,12 @@ L4_PAGE_OFFSET = pgd_index(__PAGE_OFFSET) + L3_PAGE_OFFSET = pud_index(__PAGE_OFFSET) + L4_START_KERNEL = pgd_index(__START_KERNEL_map) + L3_START_KERNEL = pud_index(__START_KERNEL_map) ++L4_VMALLOC_START = pgd_index(VMALLOC_START) ++L3_VMALLOC_START = pud_index(VMALLOC_START) ++L4_VMALLOC_END = pgd_index(VMALLOC_END) ++L3_VMALLOC_END = pud_index(VMALLOC_END) ++L4_VMEMMAP_START = pgd_index(VMEMMAP_START) ++L3_VMEMMAP_START = pud_index(VMEMMAP_START) + + .text + __HEAD +@@ -89,11 +97,24 @@ startup_64: + * Fixup the physical addresses in the page table + */ + addq %rbp, early_level4_pgt + (L4_START_KERNEL*8)(%rip) ++ addq %rbp, init_level4_pgt + (L4_PAGE_OFFSET*8)(%rip) ++ addq %rbp, init_level4_pgt + (L4_VMALLOC_START*8)(%rip) ++ addq %rbp, init_level4_pgt + (L4_VMALLOC_END*8)(%rip) ++ addq %rbp, init_level4_pgt + (L4_VMEMMAP_START*8)(%rip) ++ addq %rbp, init_level4_pgt + (L4_START_KERNEL*8)(%rip) + +- addq %rbp, level3_kernel_pgt + (510*8)(%rip) +- addq %rbp, level3_kernel_pgt + (511*8)(%rip) ++ addq %rbp, level3_ident_pgt + (0*8)(%rip) ++#ifndef CONFIG_XEN ++ addq %rbp, level3_ident_pgt + (1*8)(%rip) ++#endif ++ ++ addq %rbp, level3_vmemmap_pgt + (L3_VMEMMAP_START*8)(%rip) ++ ++ addq %rbp, level3_kernel_pgt + (L3_START_KERNEL*8)(%rip) ++ addq %rbp, level3_kernel_pgt + ((L3_START_KERNEL+1)*8)(%rip) + + addq %rbp, level2_fixmap_pgt + (506*8)(%rip) ++ addq %rbp, level2_fixmap_pgt + (507*8)(%rip) + + /* + * Set up the identity mapping for the switchover. These +@@ -174,11 +195,12 @@ ENTRY(secondary_startup_64) + * after the boot processor executes this code. + */ + ++ orq $-1, %rbp + movq $(init_level4_pgt - __START_KERNEL_map), %rax + 1: + +- /* Enable PAE mode and PGE */ +- movl $(X86_CR4_PAE | X86_CR4_PGE), %ecx ++ /* Enable PAE mode and PSE/PGE */ ++ movl $(X86_CR4_PSE | X86_CR4_PAE | X86_CR4_PGE), %ecx + movq %rcx, %cr4 + + /* Setup early boot stage 4 level pagetables. */ +@@ -199,10 +221,19 @@ ENTRY(secondary_startup_64) + movl $MSR_EFER, %ecx + rdmsr + btsl $_EFER_SCE, %eax /* Enable System Call */ +- btl $20,%edi /* No Execute supported? */ ++ btl $(X86_FEATURE_NX & 31),%edi /* No Execute supported? */ + jnc 1f + btsl $_EFER_NX, %eax ++ cmpq $-1, %rbp ++ je 1f + btsq $_PAGE_BIT_NX,early_pmd_flags(%rip) ++ btsq $_PAGE_BIT_NX, init_level4_pgt + 8*L4_PAGE_OFFSET(%rip) ++ btsq $_PAGE_BIT_NX, init_level4_pgt + 8*L4_VMALLOC_START(%rip) ++ btsq $_PAGE_BIT_NX, init_level4_pgt + 8*L4_VMALLOC_END(%rip) ++ btsq $_PAGE_BIT_NX, init_level4_pgt + 8*L4_VMEMMAP_START(%rip) ++ btsq $_PAGE_BIT_NX, level2_fixmap_pgt + 8*506(%rip) ++ btsq $_PAGE_BIT_NX, level2_fixmap_pgt + 8*507(%rip) ++ btsq $_PAGE_BIT_NX, __supported_pte_mask(%rip) + 1: wrmsr /* Make changes effective */ + + /* Setup cr0 */ +@@ -282,6 +313,7 @@ ENTRY(secondary_startup_64) + * REX.W + FF /5 JMP m16:64 Jump far, absolute indirect, + * address given in m16:64. + */ ++ pax_set_fptr_mask + movq initial_code(%rip),%rax + pushq $0 # fake return address to stop unwinder + pushq $__KERNEL_CS # set correct cs +@@ -313,7 +345,7 @@ ENDPROC(start_cpu0) + .quad INIT_PER_CPU_VAR(irq_stack_union) + + GLOBAL(stack_start) +- .quad init_thread_union+THREAD_SIZE-8 ++ .quad init_thread_union+THREAD_SIZE-16 + .word 0 + __FINITDATA + +@@ -391,7 +423,7 @@ ENTRY(early_idt_handler) + call dump_stack + #ifdef CONFIG_KALLSYMS + leaq early_idt_ripmsg(%rip),%rdi +- movq 40(%rsp),%rsi # %rip again ++ movq 88(%rsp),%rsi # %rip again + call __print_symbol + #endif + #endif /* EARLY_PRINTK */ +@@ -420,6 +452,7 @@ ENDPROC(early_idt_handler) + early_recursion_flag: + .long 0 + ++ .section .rodata,"a",@progbits + #ifdef CONFIG_EARLY_PRINTK + early_idt_msg: + .asciz "PANIC: early exception %02lx rip %lx:%lx error %lx cr2 %lx\n" +@@ -447,29 +480,52 @@ NEXT_PAGE(early_level4_pgt) + NEXT_PAGE(early_dynamic_pgts) + .fill 512*EARLY_DYNAMIC_PAGE_TABLES,8,0 + +- .data ++ .section .rodata,"a",@progbits + +-#ifndef CONFIG_XEN + NEXT_PAGE(init_level4_pgt) +- .fill 512,8,0 +-#else +-NEXT_PAGE(init_level4_pgt) +- .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE + .org init_level4_pgt + L4_PAGE_OFFSET*8, 0 + .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE ++ .org init_level4_pgt + L4_VMALLOC_START*8, 0 ++ .quad level3_vmalloc_start_pgt - __START_KERNEL_map + _KERNPG_TABLE ++ .org init_level4_pgt + L4_VMALLOC_END*8, 0 ++ .quad level3_vmalloc_end_pgt - __START_KERNEL_map + _KERNPG_TABLE ++ .org init_level4_pgt + L4_VMEMMAP_START*8, 0 ++ .quad level3_vmemmap_pgt - __START_KERNEL_map + _KERNPG_TABLE + .org init_level4_pgt + L4_START_KERNEL*8, 0 + /* (2^48-(2*1024*1024*1024))/(2^39) = 511 */ + .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE + ++#ifdef CONFIG_PAX_PER_CPU_PGD ++NEXT_PAGE(cpu_pgd) ++ .rept 2*NR_CPUS ++ .fill 512,8,0 ++ .endr ++#endif ++ + NEXT_PAGE(level3_ident_pgt) + .quad level2_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE ++#ifdef CONFIG_XEN + .fill 511, 8, 0 ++#else ++ .quad level2_ident_pgt + PAGE_SIZE - __START_KERNEL_map + _KERNPG_TABLE ++ .fill 510,8,0 ++#endif ++ ++NEXT_PAGE(level3_vmalloc_start_pgt) ++ .fill 512,8,0 ++ ++NEXT_PAGE(level3_vmalloc_end_pgt) ++ .fill 512,8,0 ++ ++NEXT_PAGE(level3_vmemmap_pgt) ++ .fill L3_VMEMMAP_START,8,0 ++ .quad level2_vmemmap_pgt - __START_KERNEL_map + _KERNPG_TABLE ++ + NEXT_PAGE(level2_ident_pgt) +- /* Since I easily can, map the first 1G. ++ /* Since I easily can, map the first 2G. + * Don't set NX because code runs from these pages. + */ +- PMDS(0, __PAGE_KERNEL_IDENT_LARGE_EXEC, PTRS_PER_PMD) +-#endif ++ PMDS(0, __PAGE_KERNEL_IDENT_LARGE_EXEC, 2*PTRS_PER_PMD) + + NEXT_PAGE(level3_kernel_pgt) + .fill L3_START_KERNEL,8,0 +@@ -477,6 +533,9 @@ NEXT_PAGE(level3_kernel_pgt) + .quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE + .quad level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE + ++NEXT_PAGE(level2_vmemmap_pgt) ++ .fill 512,8,0 ++ + NEXT_PAGE(level2_kernel_pgt) + /* + * 512 MB kernel mapping. We spend a full page on this pagetable +@@ -494,28 +553,64 @@ NEXT_PAGE(level2_kernel_pgt) + NEXT_PAGE(level2_fixmap_pgt) + .fill 506,8,0 + .quad level1_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE +- /* 8MB reserved for vsyscalls + a 2MB hole = 4 + 1 entries */ +- .fill 5,8,0 ++ .quad level1_vsyscall_pgt - __START_KERNEL_map + _PAGE_TABLE ++ /* 6MB reserved for vsyscalls + a 2MB hole = 3 + 1 entries */ ++ .fill 4,8,0 + + NEXT_PAGE(level1_fixmap_pgt) + .fill 512,8,0 + ++NEXT_PAGE(level1_vsyscall_pgt) ++ .fill 512,8,0 ++ + #undef PMDS + +- .data ++ .align PAGE_SIZE ++ENTRY(cpu_gdt_table) ++ .rept NR_CPUS ++ .quad 0x0000000000000000 /* NULL descriptor */ ++ .quad 0x00cf9b000000ffff /* __KERNEL32_CS */ ++ .quad 0x00af9b000000ffff /* __KERNEL_CS */ ++ .quad 0x00cf93000000ffff /* __KERNEL_DS */ ++ .quad 0x00cffb000000ffff /* __USER32_CS */ ++ .quad 0x00cff3000000ffff /* __USER_DS, __USER32_DS */ ++ .quad 0x00affb000000ffff /* __USER_CS */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ .quad 0x00af9b000000ffff /* __KERNEXEC_KERNEL_CS */ ++#else ++ .quad 0x0 /* unused */ ++#endif ++ ++ .quad 0,0 /* TSS */ ++ .quad 0,0 /* LDT */ ++ .quad 0,0,0 /* three TLS descriptors */ ++ .quad 0x0000f40000000000 /* node/CPU stored in limit */ ++ /* asm/segment.h:GDT_ENTRIES must match this */ ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ .quad 0x00cf93000000ffff /* __UDEREF_KERNEL_DS */ ++#else ++ .quad 0x0 /* unused */ ++#endif ++ ++ /* zero the remaining page */ ++ .fill PAGE_SIZE / 8 - GDT_ENTRIES,8,0 ++ .endr ++ + .align 16 + .globl early_gdt_descr + early_gdt_descr: + .word GDT_ENTRIES*8-1 + early_gdt_descr_base: +- .quad INIT_PER_CPU_VAR(gdt_page) ++ .quad cpu_gdt_table + + ENTRY(phys_base) + /* This must match the first entry in level2_kernel_pgt */ + .quad 0x0000000000000000 + + #include "../../x86/xen/xen-head.S" +- +- __PAGE_ALIGNED_BSS ++ ++ .section .rodata,"a",@progbits + NEXT_PAGE(empty_zero_page) + .skip PAGE_SIZE +diff --git a/arch/x86/kernel/i386_ksyms_32.c b/arch/x86/kernel/i386_ksyms_32.c +index 05fd74f..c3548b1 100644 +--- a/arch/x86/kernel/i386_ksyms_32.c ++++ b/arch/x86/kernel/i386_ksyms_32.c +@@ -20,8 +20,12 @@ extern void cmpxchg8b_emu(void); + EXPORT_SYMBOL(cmpxchg8b_emu); + #endif + ++EXPORT_SYMBOL_GPL(cpu_gdt_table); ++ + /* Networking helper routines. */ + EXPORT_SYMBOL(csum_partial_copy_generic); ++EXPORT_SYMBOL(csum_partial_copy_generic_to_user); ++EXPORT_SYMBOL(csum_partial_copy_generic_from_user); + + EXPORT_SYMBOL(__get_user_1); + EXPORT_SYMBOL(__get_user_2); +@@ -44,3 +48,11 @@ EXPORT_SYMBOL(___preempt_schedule); + EXPORT_SYMBOL(___preempt_schedule_context); + #endif + #endif ++ ++#ifdef CONFIG_PAX_KERNEXEC ++EXPORT_SYMBOL(__LOAD_PHYSICAL_ADDR); ++#endif ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++EXPORT_SYMBOL(cpu_pgd); ++#endif +diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c +index a9a4229..6f4d476 100644 +--- a/arch/x86/kernel/i387.c ++++ b/arch/x86/kernel/i387.c +@@ -51,7 +51,7 @@ static inline bool interrupted_kernel_fpu_idle(void) + static inline bool interrupted_user_mode(void) + { + struct pt_regs *regs = get_irq_regs(); +- return regs && user_mode_vm(regs); ++ return regs && user_mode(regs); + } + + /* +diff --git a/arch/x86/kernel/i8259.c b/arch/x86/kernel/i8259.c +index e7cc537..67d7372 100644 +--- a/arch/x86/kernel/i8259.c ++++ b/arch/x86/kernel/i8259.c +@@ -110,7 +110,7 @@ static int i8259A_irq_pending(unsigned int irq) + static void make_8259A_irq(unsigned int irq) + { + disable_irq_nosync(irq); +- io_apic_irqs &= ~(1<<irq); ++ io_apic_irqs &= ~(1UL<<irq); + irq_set_chip_and_handler(irq, &i8259A_chip, handle_level_irq); + enable_irq(irq); + } +@@ -208,7 +208,7 @@ spurious_8259A_irq: + "spurious 8259A interrupt: IRQ%d.\n", irq); + spurious_irq_mask |= irqmask; + } +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + /* + * Theoretically we do not have to handle this IRQ, + * but in Linux this does not cause problems and is +@@ -349,14 +349,16 @@ static void init_8259A(int auto_eoi) + /* (slave's support for AEOI in flat mode is to be investigated) */ + outb_pic(SLAVE_ICW4_DEFAULT, PIC_SLAVE_IMR); + ++ pax_open_kernel(); + if (auto_eoi) + /* + * In AEOI mode we just have to mask the interrupt + * when acking. + */ +- i8259A_chip.irq_mask_ack = disable_8259A_irq; ++ *(void **)&i8259A_chip.irq_mask_ack = disable_8259A_irq; + else +- i8259A_chip.irq_mask_ack = mask_and_ack_8259A; ++ *(void **)&i8259A_chip.irq_mask_ack = mask_and_ack_8259A; ++ pax_close_kernel(); + + udelay(100); /* wait for 8259A to initialize */ + +diff --git a/arch/x86/kernel/io_delay.c b/arch/x86/kernel/io_delay.c +index a979b5b..1d6db75 100644 +--- a/arch/x86/kernel/io_delay.c ++++ b/arch/x86/kernel/io_delay.c +@@ -58,7 +58,7 @@ static int __init dmi_io_delay_0xed_port(const struct dmi_system_id *id) + * Quirk table for systems that misbehave (lock up, etc.) if port + * 0x80 is used: + */ +-static struct dmi_system_id __initdata io_delay_0xed_port_dmi_table[] = { ++static const struct dmi_system_id __initconst io_delay_0xed_port_dmi_table[] = { + { + .callback = dmi_io_delay_0xed_port, + .ident = "Compaq Presario V6000", +diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c +index 4ddaf66..49d5c18 100644 +--- a/arch/x86/kernel/ioport.c ++++ b/arch/x86/kernel/ioport.c +@@ -6,6 +6,7 @@ + #include <linux/sched.h> + #include <linux/kernel.h> + #include <linux/capability.h> ++#include <linux/security.h> + #include <linux/errno.h> + #include <linux/types.h> + #include <linux/ioport.h> +@@ -30,6 +31,12 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) + return -EINVAL; + if (turn_on && !capable(CAP_SYS_RAWIO)) + return -EPERM; ++#ifdef CONFIG_GRKERNSEC_IO ++ if (turn_on && grsec_disable_privio) { ++ gr_handle_ioperm(); ++ return -ENODEV; ++ } ++#endif + + /* + * If it's the first ioperm() call in this thread's lifetime, set the +@@ -54,7 +61,7 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) + * because the ->io_bitmap_max value must match the bitmap + * contents: + */ +- tss = &per_cpu(init_tss, get_cpu()); ++ tss = init_tss + get_cpu(); + + if (turn_on) + bitmap_clear(t->io_bitmap_ptr, from, num); +@@ -105,6 +112,12 @@ SYSCALL_DEFINE1(iopl, unsigned int, level) + if (level > old) { + if (!capable(CAP_SYS_RAWIO)) + return -EPERM; ++#ifdef CONFIG_GRKERNSEC_IO ++ if (grsec_disable_privio) { ++ gr_handle_iopl(); ++ return -ENODEV; ++ } ++#endif + } + regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12); + t->iopl = level << 12; +diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c +index 3790775..53717dc 100644 +--- a/arch/x86/kernel/irq.c ++++ b/arch/x86/kernel/irq.c +@@ -22,7 +22,7 @@ + #define CREATE_TRACE_POINTS + #include <asm/trace/irq_vectors.h> + +-atomic_t irq_err_count; ++atomic_unchecked_t irq_err_count; + + /* Function pointer for generic interrupt vector handling */ + void (*x86_platform_ipi_callback)(void) = NULL; +@@ -132,9 +132,9 @@ int arch_show_interrupts(struct seq_file *p, int prec) + seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count); + seq_printf(p, " Hypervisor callback interrupts\n"); + #endif +- seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read(&irq_err_count)); ++ seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read_unchecked(&irq_err_count)); + #if defined(CONFIG_X86_IO_APIC) +- seq_printf(p, "%*s: %10u\n", prec, "MIS", atomic_read(&irq_mis_count)); ++ seq_printf(p, "%*s: %10u\n", prec, "MIS", atomic_read_unchecked(&irq_mis_count)); + #endif + return 0; + } +@@ -174,7 +174,7 @@ u64 arch_irq_stat_cpu(unsigned int cpu) + + u64 arch_irq_stat(void) + { +- u64 sum = atomic_read(&irq_err_count); ++ u64 sum = atomic_read_unchecked(&irq_err_count); + return sum; + } + +diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c +index 63ce838..2ea3e06 100644 +--- a/arch/x86/kernel/irq_32.c ++++ b/arch/x86/kernel/irq_32.c +@@ -29,6 +29,8 @@ EXPORT_PER_CPU_SYMBOL(irq_regs); + + #ifdef CONFIG_DEBUG_STACKOVERFLOW + ++extern void gr_handle_kernel_exploit(void); ++ + int sysctl_panic_on_stackoverflow __read_mostly; + + /* Debugging check for stack overflow: is there less than 1KB free? */ +@@ -39,13 +41,14 @@ static int check_stack_overflow(void) + __asm__ __volatile__("andl %%esp,%0" : + "=r" (sp) : "0" (THREAD_SIZE - 1)); + +- return sp < (sizeof(struct thread_info) + STACK_WARN); ++ return sp < STACK_WARN; + } + + static void print_stack_overflow(void) + { + printk(KERN_WARNING "low stack detected by irq handler\n"); + dump_stack(); ++ gr_handle_kernel_exploit(); + if (sysctl_panic_on_stackoverflow) + panic("low stack detected by irq handler - check messages\n"); + } +@@ -84,10 +87,9 @@ static inline void *current_stack(void) + static inline int + execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) + { +- struct irq_stack *curstk, *irqstk; ++ struct irq_stack *irqstk; + u32 *isp, *prev_esp, arg1, arg2; + +- curstk = (struct irq_stack *) current_stack(); + irqstk = __this_cpu_read(hardirq_stack); + + /* +@@ -96,15 +98,19 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) + * handler) we can't do that and just have to keep using the + * current stack (which is the irq stack already after all) + */ +- if (unlikely(curstk == irqstk)) ++ if (unlikely((void *)current_stack_pointer - (void *)irqstk < THREAD_SIZE)) + return 0; + +- isp = (u32 *) ((char *)irqstk + sizeof(*irqstk)); ++ isp = (u32 *) ((char *)irqstk + sizeof(*irqstk) - 8); + + /* Save the next esp at the bottom of the stack */ + prev_esp = (u32 *)irqstk; + *prev_esp = current_stack_pointer; + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ __set_fs(MAKE_MM_SEG(0)); ++#endif ++ + if (unlikely(overflow)) + call_on_stack(print_stack_overflow, isp); + +@@ -115,6 +121,11 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) + : "0" (irq), "1" (desc), "2" (isp), + "D" (desc->handle_irq) + : "memory", "cc", "ecx"); ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ __set_fs(current_thread_info()->addr_limit); ++#endif ++ + return 1; + } + +@@ -123,32 +134,18 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) + */ + void irq_ctx_init(int cpu) + { +- struct irq_stack *irqstk; +- + if (per_cpu(hardirq_stack, cpu)) + return; + +- irqstk = page_address(alloc_pages_node(cpu_to_node(cpu), +- THREADINFO_GFP, +- THREAD_SIZE_ORDER)); +- per_cpu(hardirq_stack, cpu) = irqstk; +- +- irqstk = page_address(alloc_pages_node(cpu_to_node(cpu), +- THREADINFO_GFP, +- THREAD_SIZE_ORDER)); +- per_cpu(softirq_stack, cpu) = irqstk; +- +- printk(KERN_DEBUG "CPU %u irqstacks, hard=%p soft=%p\n", +- cpu, per_cpu(hardirq_stack, cpu), per_cpu(softirq_stack, cpu)); ++ per_cpu(hardirq_stack, cpu) = page_address(alloc_pages_node(cpu_to_node(cpu), THREADINFO_GFP, THREAD_SIZE_ORDER)); ++ per_cpu(softirq_stack, cpu) = page_address(alloc_pages_node(cpu_to_node(cpu), THREADINFO_GFP, THREAD_SIZE_ORDER)); + } + + void do_softirq_own_stack(void) + { +- struct thread_info *curstk; + struct irq_stack *irqstk; + u32 *isp, *prev_esp; + +- curstk = current_stack(); + irqstk = __this_cpu_read(softirq_stack); + + /* build the stack frame on the softirq stack */ +@@ -158,7 +155,16 @@ void do_softirq_own_stack(void) + prev_esp = (u32 *)irqstk; + *prev_esp = current_stack_pointer; + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ __set_fs(MAKE_MM_SEG(0)); ++#endif ++ + call_on_stack(__do_softirq, isp); ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ __set_fs(current_thread_info()->addr_limit); ++#endif ++ + } + + bool handle_irq(unsigned irq, struct pt_regs *regs) +@@ -172,7 +178,7 @@ bool handle_irq(unsigned irq, struct pt_regs *regs) + if (unlikely(!desc)) + return false; + +- if (user_mode_vm(regs) || !execute_on_irq_stack(overflow, desc, irq)) { ++ if (user_mode(regs) || !execute_on_irq_stack(overflow, desc, irq)) { + if (unlikely(overflow)) + print_stack_overflow(); + desc->handle_irq(irq, desc); +diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c +index e4b503d..824fce8 100644 +--- a/arch/x86/kernel/irq_64.c ++++ b/arch/x86/kernel/irq_64.c +@@ -26,6 +26,8 @@ EXPORT_PER_CPU_SYMBOL(irq_stat); + DEFINE_PER_CPU(struct pt_regs *, irq_regs); + EXPORT_PER_CPU_SYMBOL(irq_regs); + ++extern void gr_handle_kernel_exploit(void); ++ + int sysctl_panic_on_stackoverflow; + + /* +@@ -44,7 +46,7 @@ static inline void stack_overflow_check(struct pt_regs *regs) + u64 estack_top, estack_bottom; + u64 curbase = (u64)task_stack_page(current); + +- if (user_mode_vm(regs)) ++ if (user_mode(regs)) + return; + + if (regs->sp >= curbase + sizeof(struct thread_info) + +@@ -69,6 +71,8 @@ static inline void stack_overflow_check(struct pt_regs *regs) + irq_stack_top, irq_stack_bottom, + estack_top, estack_bottom); + ++ gr_handle_kernel_exploit(); ++ + if (sysctl_panic_on_stackoverflow) + panic("low stack detected by irq handler - check messages\n"); + #endif +diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c +index 26d5a55..a01160a 100644 +--- a/arch/x86/kernel/jump_label.c ++++ b/arch/x86/kernel/jump_label.c +@@ -51,7 +51,7 @@ static void __jump_label_transform(struct jump_entry *entry, + * Jump label is enabled for the first time. + * So we expect a default_nop... + */ +- if (unlikely(memcmp((void *)entry->code, default_nop, 5) ++ if (unlikely(memcmp((void *)ktla_ktva(entry->code), default_nop, 5) + != 0)) + bug_at((void *)entry->code, __LINE__); + } else { +@@ -59,7 +59,7 @@ static void __jump_label_transform(struct jump_entry *entry, + * ...otherwise expect an ideal_nop. Otherwise + * something went horribly wrong. + */ +- if (unlikely(memcmp((void *)entry->code, ideal_nop, 5) ++ if (unlikely(memcmp((void *)ktla_ktva(entry->code), ideal_nop, 5) + != 0)) + bug_at((void *)entry->code, __LINE__); + } +@@ -75,13 +75,13 @@ static void __jump_label_transform(struct jump_entry *entry, + * are converting the default nop to the ideal nop. + */ + if (init) { +- if (unlikely(memcmp((void *)entry->code, default_nop, 5) != 0)) ++ if (unlikely(memcmp((void *)ktla_ktva(entry->code), default_nop, 5) != 0)) + bug_at((void *)entry->code, __LINE__); + } else { + code.jump = 0xe9; + code.offset = entry->target - + (entry->code + JUMP_LABEL_NOP_SIZE); +- if (unlikely(memcmp((void *)entry->code, &code, 5) != 0)) ++ if (unlikely(memcmp((void *)ktla_ktva(entry->code), &code, 5) != 0)) + bug_at((void *)entry->code, __LINE__); + } + memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE); +diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c +index 7ec1d5f..5a7d130 100644 +--- a/arch/x86/kernel/kgdb.c ++++ b/arch/x86/kernel/kgdb.c +@@ -126,11 +126,11 @@ char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs) + #ifdef CONFIG_X86_32 + switch (regno) { + case GDB_SS: +- if (!user_mode_vm(regs)) ++ if (!user_mode(regs)) + *(unsigned long *)mem = __KERNEL_DS; + break; + case GDB_SP: +- if (!user_mode_vm(regs)) ++ if (!user_mode(regs)) + *(unsigned long *)mem = kernel_stack_pointer(regs); + break; + case GDB_GS: +@@ -228,7 +228,10 @@ static void kgdb_correct_hw_break(void) + bp->attr.bp_addr = breakinfo[breakno].addr; + bp->attr.bp_len = breakinfo[breakno].len; + bp->attr.bp_type = breakinfo[breakno].type; +- info->address = breakinfo[breakno].addr; ++ if (breakinfo[breakno].type == X86_BREAKPOINT_EXECUTE) ++ info->address = ktla_ktva(breakinfo[breakno].addr); ++ else ++ info->address = breakinfo[breakno].addr; + info->len = breakinfo[breakno].len; + info->type = breakinfo[breakno].type; + val = arch_install_hw_breakpoint(bp); +@@ -475,12 +478,12 @@ int kgdb_arch_handle_exception(int e_vector, int signo, int err_code, + case 'k': + /* clear the trace bit */ + linux_regs->flags &= ~X86_EFLAGS_TF; +- atomic_set(&kgdb_cpu_doing_single_step, -1); ++ atomic_set_unchecked(&kgdb_cpu_doing_single_step, -1); + + /* set the trace bit if we're stepping */ + if (remcomInBuffer[0] == 's') { + linux_regs->flags |= X86_EFLAGS_TF; +- atomic_set(&kgdb_cpu_doing_single_step, ++ atomic_set_unchecked(&kgdb_cpu_doing_single_step, + raw_smp_processor_id()); + } + +@@ -545,7 +548,7 @@ static int __kgdb_notify(struct die_args *args, unsigned long cmd) + + switch (cmd) { + case DIE_DEBUG: +- if (atomic_read(&kgdb_cpu_doing_single_step) != -1) { ++ if (atomic_read_unchecked(&kgdb_cpu_doing_single_step) != -1) { + if (user_mode(regs)) + return single_step_cont(regs, args); + break; +@@ -750,11 +753,11 @@ int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt) + #endif /* CONFIG_DEBUG_RODATA */ + + bpt->type = BP_BREAKPOINT; +- err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr, ++ err = probe_kernel_read(bpt->saved_instr, ktla_ktva((char *)bpt->bpt_addr), + BREAK_INSTR_SIZE); + if (err) + return err; +- err = probe_kernel_write((char *)bpt->bpt_addr, ++ err = probe_kernel_write(ktla_ktva((char *)bpt->bpt_addr), + arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE); + #ifdef CONFIG_DEBUG_RODATA + if (!err) +@@ -767,7 +770,7 @@ int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt) + return -EBUSY; + text_poke((void *)bpt->bpt_addr, arch_kgdb_ops.gdb_bpt_instr, + BREAK_INSTR_SIZE); +- err = probe_kernel_read(opc, (char *)bpt->bpt_addr, BREAK_INSTR_SIZE); ++ err = probe_kernel_read(opc, ktla_ktva((char *)bpt->bpt_addr), BREAK_INSTR_SIZE); + if (err) + return err; + if (memcmp(opc, arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE)) +@@ -792,13 +795,13 @@ int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt) + if (mutex_is_locked(&text_mutex)) + goto knl_write; + text_poke((void *)bpt->bpt_addr, bpt->saved_instr, BREAK_INSTR_SIZE); +- err = probe_kernel_read(opc, (char *)bpt->bpt_addr, BREAK_INSTR_SIZE); ++ err = probe_kernel_read(opc, ktla_ktva((char *)bpt->bpt_addr), BREAK_INSTR_SIZE); + if (err || memcmp(opc, bpt->saved_instr, BREAK_INSTR_SIZE)) + goto knl_write; + return err; + knl_write: + #endif /* CONFIG_DEBUG_RODATA */ +- return probe_kernel_write((char *)bpt->bpt_addr, ++ return probe_kernel_write(ktla_ktva((char *)bpt->bpt_addr), + (char *)bpt->saved_instr, BREAK_INSTR_SIZE); + } + +diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c +index 93d2c04..36d0e94 100644 +--- a/arch/x86/kernel/kprobes/core.c ++++ b/arch/x86/kernel/kprobes/core.c +@@ -120,9 +120,12 @@ __synthesize_relative_insn(void *from, void *to, u8 op) + s32 raddr; + } __packed *insn; + +- insn = (struct __arch_relative_insn *)from; ++ insn = (struct __arch_relative_insn *)ktla_ktva(from); ++ ++ pax_open_kernel(); + insn->raddr = (s32)((long)(to) - ((long)(from) + 5)); + insn->op = op; ++ pax_close_kernel(); + } + + /* Insert a jump instruction at address 'from', which jumps to address 'to'.*/ +@@ -168,7 +171,7 @@ int can_boost(kprobe_opcode_t *opcodes) + kprobe_opcode_t opcode; + kprobe_opcode_t *orig_opcodes = opcodes; + +- if (search_exception_tables((unsigned long)opcodes)) ++ if (search_exception_tables(ktva_ktla((unsigned long)opcodes))) + return 0; /* Page fault may occur on this address. */ + + retry: +@@ -242,9 +245,9 @@ __recover_probed_insn(kprobe_opcode_t *buf, unsigned long addr) + * for the first byte, we can recover the original instruction + * from it and kp->opcode. + */ +- memcpy(buf, kp->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); ++ memcpy(buf, ktla_ktva(kp->addr), MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); + buf[0] = kp->opcode; +- return (unsigned long)buf; ++ return ktva_ktla((unsigned long)buf); + } + + /* +@@ -336,7 +339,9 @@ int __copy_instruction(u8 *dest, u8 *src) + /* Another subsystem puts a breakpoint, failed to recover */ + if (insn.opcode.bytes[0] == BREAKPOINT_INSTRUCTION) + return 0; ++ pax_open_kernel(); + memcpy(dest, insn.kaddr, insn.length); ++ pax_close_kernel(); + + #ifdef CONFIG_X86_64 + if (insn_rip_relative(&insn)) { +@@ -363,7 +368,9 @@ int __copy_instruction(u8 *dest, u8 *src) + return 0; + } + disp = (u8 *) dest + insn_offset_displacement(&insn); ++ pax_open_kernel(); + *(s32 *) disp = (s32) newdisp; ++ pax_close_kernel(); + } + #endif + return insn.length; +@@ -505,7 +512,7 @@ static void setup_singlestep(struct kprobe *p, struct pt_regs *regs, + * nor set current_kprobe, because it doesn't use single + * stepping. + */ +- regs->ip = (unsigned long)p->ainsn.insn; ++ regs->ip = ktva_ktla((unsigned long)p->ainsn.insn); + preempt_enable_no_resched(); + return; + } +@@ -522,9 +529,9 @@ static void setup_singlestep(struct kprobe *p, struct pt_regs *regs, + regs->flags &= ~X86_EFLAGS_IF; + /* single step inline if the instruction is an int3 */ + if (p->opcode == BREAKPOINT_INSTRUCTION) +- regs->ip = (unsigned long)p->addr; ++ regs->ip = ktla_ktva((unsigned long)p->addr); + else +- regs->ip = (unsigned long)p->ainsn.insn; ++ regs->ip = ktva_ktla((unsigned long)p->ainsn.insn); + } + NOKPROBE_SYMBOL(setup_singlestep); + +@@ -574,7 +581,7 @@ int kprobe_int3_handler(struct pt_regs *regs) + struct kprobe *p; + struct kprobe_ctlblk *kcb; + +- if (user_mode_vm(regs)) ++ if (user_mode(regs)) + return 0; + + addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t)); +@@ -609,7 +616,7 @@ int kprobe_int3_handler(struct pt_regs *regs) + setup_singlestep(p, regs, kcb, 0); + return 1; + } +- } else if (*addr != BREAKPOINT_INSTRUCTION) { ++ } else if (*(kprobe_opcode_t *)ktla_ktva((unsigned long)addr) != BREAKPOINT_INSTRUCTION) { + /* + * The breakpoint instruction was removed right + * after we hit it. Another cpu has removed +@@ -656,6 +663,9 @@ static void __used kretprobe_trampoline_holder(void) + " movq %rax, 152(%rsp)\n" + RESTORE_REGS_STRING + " popfq\n" ++#ifdef KERNEXEC_PLUGIN ++ " btsq $63,(%rsp)\n" ++#endif + #else + " pushf\n" + SAVE_REGS_STRING +@@ -796,7 +806,7 @@ static void resume_execution(struct kprobe *p, struct pt_regs *regs, + struct kprobe_ctlblk *kcb) + { + unsigned long *tos = stack_addr(regs); +- unsigned long copy_ip = (unsigned long)p->ainsn.insn; ++ unsigned long copy_ip = ktva_ktla((unsigned long)p->ainsn.insn); + unsigned long orig_ip = (unsigned long)p->addr; + kprobe_opcode_t *insn = p->ainsn.insn; + +@@ -979,7 +989,7 @@ int kprobe_exceptions_notify(struct notifier_block *self, unsigned long val, + struct die_args *args = data; + int ret = NOTIFY_DONE; + +- if (args->regs && user_mode_vm(args->regs)) ++ if (args->regs && user_mode(args->regs)) + return ret; + + if (val == DIE_GPF) { +diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c +index f1314d0..15f3154 100644 +--- a/arch/x86/kernel/kprobes/opt.c ++++ b/arch/x86/kernel/kprobes/opt.c +@@ -79,6 +79,7 @@ found: + /* Insert a move instruction which sets a pointer to eax/rdi (1st arg). */ + static void synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long val) + { ++ pax_open_kernel(); + #ifdef CONFIG_X86_64 + *addr++ = 0x48; + *addr++ = 0xbf; +@@ -86,6 +87,7 @@ static void synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long val) + *addr++ = 0xb8; + #endif + *(unsigned long *)addr = val; ++ pax_close_kernel(); + } + + asm ( +@@ -337,7 +339,7 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op) + * Verify if the address gap is in 2GB range, because this uses + * a relative jump. + */ +- rel = (long)op->optinsn.insn - (long)op->kp.addr + RELATIVEJUMP_SIZE; ++ rel = (long)op->optinsn.insn - ktla_ktva((long)op->kp.addr) + RELATIVEJUMP_SIZE; + if (abs(rel) > 0x7fffffff) { + __arch_remove_optimized_kprobe(op, 0); + return -ERANGE; +@@ -354,16 +356,18 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op) + op->optinsn.size = ret; + + /* Copy arch-dep-instance from template */ +- memcpy(buf, &optprobe_template_entry, TMPL_END_IDX); ++ pax_open_kernel(); ++ memcpy(buf, ktla_ktva(&optprobe_template_entry), TMPL_END_IDX); ++ pax_close_kernel(); + + /* Set probe information */ + synthesize_set_arg1(buf + TMPL_MOVE_IDX, (unsigned long)op); + + /* Set probe function call */ +- synthesize_relcall(buf + TMPL_CALL_IDX, optimized_callback); ++ synthesize_relcall(ktva_ktla(buf) + TMPL_CALL_IDX, optimized_callback); + + /* Set returning jmp instruction at the tail of out-of-line buffer */ +- synthesize_reljump(buf + TMPL_END_IDX + op->optinsn.size, ++ synthesize_reljump(ktva_ktla(buf) + TMPL_END_IDX + op->optinsn.size, + (u8 *)op->kp.addr + op->optinsn.size); + + flush_icache_range((unsigned long) buf, +@@ -388,7 +392,7 @@ void arch_optimize_kprobes(struct list_head *oplist) + WARN_ON(kprobe_disabled(&op->kp)); + + /* Backup instructions which will be replaced by jump address */ +- memcpy(op->optinsn.copied_insn, op->kp.addr + INT3_SIZE, ++ memcpy(op->optinsn.copied_insn, ktla_ktva(op->kp.addr) + INT3_SIZE, + RELATIVE_ADDR_SIZE); + + insn_buf[0] = RELATIVEJUMP_OPCODE; +@@ -436,7 +440,7 @@ int setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter) + /* This kprobe is really able to run optimized path. */ + op = container_of(p, struct optimized_kprobe, kp); + /* Detour through copied instructions */ +- regs->ip = (unsigned long)op->optinsn.insn + TMPL_END_IDX; ++ regs->ip = ktva_ktla((unsigned long)op->optinsn.insn) + TMPL_END_IDX; + if (!reenter) + reset_current_kprobe(); + preempt_enable_no_resched(); +diff --git a/arch/x86/kernel/ksysfs.c b/arch/x86/kernel/ksysfs.c +index c2bedae..25e7ab6 100644 +--- a/arch/x86/kernel/ksysfs.c ++++ b/arch/x86/kernel/ksysfs.c +@@ -184,7 +184,7 @@ out: + + static struct kobj_attribute type_attr = __ATTR_RO(type); + +-static struct bin_attribute data_attr = { ++static bin_attribute_no_const data_attr __read_only = { + .attr = { + .name = "data", + .mode = S_IRUGO, +diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c +index c37886d..d851d32 100644 +--- a/arch/x86/kernel/ldt.c ++++ b/arch/x86/kernel/ldt.c +@@ -66,13 +66,13 @@ static int alloc_ldt(mm_context_t *pc, int mincount, int reload) + if (reload) { + #ifdef CONFIG_SMP + preempt_disable(); +- load_LDT(pc); ++ load_LDT_nolock(pc); + if (!cpumask_equal(mm_cpumask(current->mm), + cpumask_of(smp_processor_id()))) + smp_call_function(flush_ldt, current->mm, 1); + preempt_enable(); + #else +- load_LDT(pc); ++ load_LDT_nolock(pc); + #endif + } + if (oldsize) { +@@ -94,7 +94,7 @@ static inline int copy_ldt(mm_context_t *new, mm_context_t *old) + return err; + + for (i = 0; i < old->size; i++) +- write_ldt_entry(new->ldt, i, old->ldt + i * LDT_ENTRY_SIZE); ++ write_ldt_entry(new->ldt, i, old->ldt + i); + return 0; + } + +@@ -115,6 +115,24 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm) + retval = copy_ldt(&mm->context, &old_mm->context); + mutex_unlock(&old_mm->context.lock); + } ++ ++ if (tsk == current) { ++ mm->context.vdso = 0; ++ ++#ifdef CONFIG_X86_32 ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++ mm->context.user_cs_base = 0UL; ++ mm->context.user_cs_limit = ~0UL; ++ ++#if defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_SMP) ++ cpus_clear(mm->context.cpu_user_cs_mask); ++#endif ++ ++#endif ++#endif ++ ++ } ++ + return retval; + } + +@@ -229,6 +247,13 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode) + } + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((mm->pax_flags & MF_PAX_SEGMEXEC) && (ldt_info.contents & MODIFY_LDT_CONTENTS_CODE)) { ++ error = -EINVAL; ++ goto out_unlock; ++ } ++#endif ++ + if (!IS_ENABLED(CONFIG_X86_16BIT) && !ldt_info.seg_32bit) { + error = -EINVAL; + goto out_unlock; +diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c +index 72e8e31..f2f1605 100644 +--- a/arch/x86/kernel/machine_kexec_32.c ++++ b/arch/x86/kernel/machine_kexec_32.c +@@ -25,7 +25,7 @@ + #include <asm/cacheflush.h> + #include <asm/debugreg.h> + +-static void set_idt(void *newidt, __u16 limit) ++static void set_idt(struct desc_struct *newidt, __u16 limit) + { + struct desc_ptr curidt; + +@@ -37,7 +37,7 @@ static void set_idt(void *newidt, __u16 limit) + } + + +-static void set_gdt(void *newgdt, __u16 limit) ++static void set_gdt(struct desc_struct *newgdt, __u16 limit) + { + struct desc_ptr curgdt; + +@@ -215,7 +215,7 @@ void machine_kexec(struct kimage *image) + } + + control_page = page_address(image->control_code_page); +- memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE); ++ memcpy(control_page, (void *)ktla_ktva((unsigned long)relocate_kernel), KEXEC_CONTROL_CODE_MAX_SIZE); + + relocate_kernel_ptr = control_page; + page_list[PA_CONTROL_PAGE] = __pa(control_page); +diff --git a/arch/x86/kernel/mcount_64.S b/arch/x86/kernel/mcount_64.S +index c73aecf..4c63630 100644 +--- a/arch/x86/kernel/mcount_64.S ++++ b/arch/x86/kernel/mcount_64.S +@@ -7,7 +7,7 @@ + #include <linux/linkage.h> + #include <asm/ptrace.h> + #include <asm/ftrace.h> +- ++#include <asm/alternative-asm.h> + + .code64 + .section .entry.text, "ax" +@@ -24,8 +24,9 @@ + #ifdef CONFIG_DYNAMIC_FTRACE + + ENTRY(function_hook) ++ pax_force_retaddr + retq +-END(function_hook) ++ENDPROC(function_hook) + + /* skip is set if stack has been adjusted */ + .macro ftrace_caller_setup skip=0 +@@ -62,8 +63,9 @@ GLOBAL(ftrace_graph_call) + #endif + + GLOBAL(ftrace_stub) ++ pax_force_retaddr + retq +-END(ftrace_caller) ++ENDPROC(ftrace_caller) + + ENTRY(ftrace_regs_caller) + /* Save the current flags before compare (in SS location)*/ +@@ -127,7 +129,7 @@ GLOBAL(ftrace_regs_call) + popfq + jmp ftrace_stub + +-END(ftrace_regs_caller) ++ENDPROC(ftrace_regs_caller) + + + #else /* ! CONFIG_DYNAMIC_FTRACE */ +@@ -145,6 +147,7 @@ ENTRY(function_hook) + #endif + + GLOBAL(ftrace_stub) ++ pax_force_retaddr + retq + + trace: +@@ -158,12 +161,13 @@ trace: + #endif + subq $MCOUNT_INSN_SIZE, %rdi + ++ pax_force_fptr ftrace_trace_function + call *ftrace_trace_function + + MCOUNT_RESTORE_FRAME + + jmp ftrace_stub +-END(function_hook) ++ENDPROC(function_hook) + #endif /* CONFIG_DYNAMIC_FTRACE */ + #endif /* CONFIG_FUNCTION_TRACER */ + +@@ -185,8 +189,9 @@ ENTRY(ftrace_graph_caller) + + MCOUNT_RESTORE_FRAME + ++ pax_force_retaddr + retq +-END(ftrace_graph_caller) ++ENDPROC(ftrace_graph_caller) + + GLOBAL(return_to_handler) + subq $24, %rsp +@@ -202,5 +207,7 @@ GLOBAL(return_to_handler) + movq 8(%rsp), %rdx + movq (%rsp), %rax + addq $24, %rsp ++ pax_force_fptr %rdi + jmp *%rdi ++ENDPROC(return_to_handler) + #endif +diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c +index e69f988..da078ea 100644 +--- a/arch/x86/kernel/module.c ++++ b/arch/x86/kernel/module.c +@@ -81,17 +81,62 @@ static unsigned long int get_module_load_offset(void) + } + #endif + +-void *module_alloc(unsigned long size) ++static inline void *__module_alloc(unsigned long size, pgprot_t prot) + { +- if (PAGE_ALIGN(size) > MODULES_LEN) ++ if (!size || PAGE_ALIGN(size) > MODULES_LEN) + return NULL; + return __vmalloc_node_range(size, 1, + MODULES_VADDR + get_module_load_offset(), +- MODULES_END, GFP_KERNEL | __GFP_HIGHMEM, +- PAGE_KERNEL_EXEC, NUMA_NO_NODE, ++ MODULES_END, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, ++ prot, NUMA_NO_NODE, + __builtin_return_address(0)); + } + ++void *module_alloc(unsigned long size) ++{ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ return __module_alloc(size, PAGE_KERNEL); ++#else ++ return __module_alloc(size, PAGE_KERNEL_EXEC); ++#endif ++ ++} ++ ++#ifdef CONFIG_PAX_KERNEXEC ++#ifdef CONFIG_X86_32 ++void *module_alloc_exec(unsigned long size) ++{ ++ struct vm_struct *area; ++ ++ if (size == 0) ++ return NULL; ++ ++ area = __get_vm_area(size, VM_ALLOC, (unsigned long)&MODULES_EXEC_VADDR, (unsigned long)&MODULES_EXEC_END); ++return area ? area->addr : NULL; ++} ++EXPORT_SYMBOL(module_alloc_exec); ++ ++void module_free_exec(struct module *mod, void *module_region) ++{ ++ vunmap(module_region); ++} ++EXPORT_SYMBOL(module_free_exec); ++#else ++void module_free_exec(struct module *mod, void *module_region) ++{ ++ module_free(mod, module_region); ++} ++EXPORT_SYMBOL(module_free_exec); ++ ++void *module_alloc_exec(unsigned long size) ++{ ++ return __module_alloc(size, PAGE_KERNEL_RX); ++} ++EXPORT_SYMBOL(module_alloc_exec); ++#endif ++#endif ++ + #ifdef CONFIG_X86_32 + int apply_relocate(Elf32_Shdr *sechdrs, + const char *strtab, +@@ -102,14 +147,16 @@ int apply_relocate(Elf32_Shdr *sechdrs, + unsigned int i; + Elf32_Rel *rel = (void *)sechdrs[relsec].sh_addr; + Elf32_Sym *sym; +- uint32_t *location; ++ uint32_t *plocation, location; + + DEBUGP("Applying relocate section %u to %u\n", + relsec, sechdrs[relsec].sh_info); + for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { + /* This is where to make the change */ +- location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr +- + rel[i].r_offset; ++ plocation = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr + rel[i].r_offset; ++ location = (uint32_t)plocation; ++ if (sechdrs[sechdrs[relsec].sh_info].sh_flags & SHF_EXECINSTR) ++ plocation = ktla_ktva((void *)plocation); + /* This is the symbol it is referring to. Note that all + undefined symbols have been resolved. */ + sym = (Elf32_Sym *)sechdrs[symindex].sh_addr +@@ -118,11 +165,15 @@ int apply_relocate(Elf32_Shdr *sechdrs, + switch (ELF32_R_TYPE(rel[i].r_info)) { + case R_386_32: + /* We add the value into the location given */ +- *location += sym->st_value; ++ pax_open_kernel(); ++ *plocation += sym->st_value; ++ pax_close_kernel(); + break; + case R_386_PC32: + /* Add the value, subtract its position */ +- *location += sym->st_value - (uint32_t)location; ++ pax_open_kernel(); ++ *plocation += sym->st_value - location; ++ pax_close_kernel(); + break; + default: + pr_err("%s: Unknown relocation: %u\n", +@@ -167,21 +218,30 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, + case R_X86_64_NONE: + break; + case R_X86_64_64: ++ pax_open_kernel(); + *(u64 *)loc = val; ++ pax_close_kernel(); + break; + case R_X86_64_32: ++ pax_open_kernel(); + *(u32 *)loc = val; ++ pax_close_kernel(); + if (val != *(u32 *)loc) + goto overflow; + break; + case R_X86_64_32S: ++ pax_open_kernel(); + *(s32 *)loc = val; ++ pax_close_kernel(); + if ((s64)val != *(s32 *)loc) + goto overflow; + break; + case R_X86_64_PC32: + val -= (u64)loc; ++ pax_open_kernel(); + *(u32 *)loc = val; ++ pax_close_kernel(); ++ + #if 0 + if ((s64)val != *(s32 *)loc) + goto overflow; +diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c +index c9603ac..9f88728 100644 +--- a/arch/x86/kernel/msr.c ++++ b/arch/x86/kernel/msr.c +@@ -37,6 +37,7 @@ + #include <linux/notifier.h> + #include <linux/uaccess.h> + #include <linux/gfp.h> ++#include <linux/grsecurity.h> + + #include <asm/processor.h> + #include <asm/msr.h> +@@ -103,6 +104,11 @@ static ssize_t msr_write(struct file *file, const char __user *buf, + int err = 0; + ssize_t bytes = 0; + ++#ifdef CONFIG_GRKERNSEC_KMEM ++ gr_handle_msr_write(); ++ return -EPERM; ++#endif ++ + if (count % 8) + return -EINVAL; /* Invalid chunk size */ + +@@ -150,6 +156,10 @@ static long msr_ioctl(struct file *file, unsigned int ioc, unsigned long arg) + err = -EBADF; + break; + } ++#ifdef CONFIG_GRKERNSEC_KMEM ++ gr_handle_msr_write(); ++ return -EPERM; ++#endif + if (copy_from_user(®s, uregs, sizeof regs)) { + err = -EFAULT; + break; +@@ -233,7 +243,7 @@ static int msr_class_cpu_callback(struct notifier_block *nfb, + return notifier_from_errno(err); + } + +-static struct notifier_block __refdata msr_class_cpu_notifier = { ++static struct notifier_block msr_class_cpu_notifier = { + .notifier_call = msr_class_cpu_callback, + }; + +diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c +index c3e985d..110a36a 100644 +--- a/arch/x86/kernel/nmi.c ++++ b/arch/x86/kernel/nmi.c +@@ -98,16 +98,16 @@ fs_initcall(nmi_warning_debugfs); + + static void nmi_max_handler(struct irq_work *w) + { +- struct nmiaction *a = container_of(w, struct nmiaction, irq_work); ++ struct nmiwork *n = container_of(w, struct nmiwork, irq_work); + int remainder_ns, decimal_msecs; +- u64 whole_msecs = ACCESS_ONCE(a->max_duration); ++ u64 whole_msecs = ACCESS_ONCE(n->max_duration); + + remainder_ns = do_div(whole_msecs, (1000 * 1000)); + decimal_msecs = remainder_ns / 1000; + + printk_ratelimited(KERN_INFO + "INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n", +- a->handler, whole_msecs, decimal_msecs); ++ n->action->handler, whole_msecs, decimal_msecs); + } + + static int nmi_handle(unsigned int type, struct pt_regs *regs, bool b2b) +@@ -134,11 +134,11 @@ static int nmi_handle(unsigned int type, struct pt_regs *regs, bool b2b) + delta = sched_clock() - delta; + trace_nmi_handler(a->handler, (int)delta, thishandled); + +- if (delta < nmi_longest_ns || delta < a->max_duration) ++ if (delta < nmi_longest_ns || delta < a->work->max_duration) + continue; + +- a->max_duration = delta; +- irq_work_queue(&a->irq_work); ++ a->work->max_duration = delta; ++ irq_work_queue(&a->work->irq_work); + } + + rcu_read_unlock(); +@@ -148,7 +148,7 @@ static int nmi_handle(unsigned int type, struct pt_regs *regs, bool b2b) + } + NOKPROBE_SYMBOL(nmi_handle); + +-int __register_nmi_handler(unsigned int type, struct nmiaction *action) ++int __register_nmi_handler(unsigned int type, const struct nmiaction *action) + { + struct nmi_desc *desc = nmi_to_desc(type); + unsigned long flags; +@@ -156,7 +156,8 @@ int __register_nmi_handler(unsigned int type, struct nmiaction *action) + if (!action->handler) + return -EINVAL; + +- init_irq_work(&action->irq_work, nmi_max_handler); ++ action->work->action = action; ++ init_irq_work(&action->work->irq_work, nmi_max_handler); + + spin_lock_irqsave(&desc->lock, flags); + +@@ -174,9 +175,9 @@ int __register_nmi_handler(unsigned int type, struct nmiaction *action) + * event confuses some handlers (kdump uses this flag) + */ + if (action->flags & NMI_FLAG_FIRST) +- list_add_rcu(&action->list, &desc->head); ++ pax_list_add_rcu((struct list_head *)&action->list, &desc->head); + else +- list_add_tail_rcu(&action->list, &desc->head); ++ pax_list_add_tail_rcu((struct list_head *)&action->list, &desc->head); + + spin_unlock_irqrestore(&desc->lock, flags); + return 0; +@@ -199,7 +200,7 @@ void unregister_nmi_handler(unsigned int type, const char *name) + if (!strcmp(n->name, name)) { + WARN(in_nmi(), + "Trying to free NMI (%s) from NMI context!\n", n->name); +- list_del_rcu(&n->list); ++ pax_list_del_rcu((struct list_head *)&n->list); + break; + } + } +@@ -528,6 +529,17 @@ static inline void nmi_nesting_postprocess(void) + dotraplinkage notrace void + do_nmi(struct pt_regs *regs, long error_code) + { ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if (!user_mode(regs)) { ++ unsigned long cs = regs->cs & 0xFFFF; ++ unsigned long ip = ktva_ktla(regs->ip); ++ ++ if ((cs == __KERNEL_CS || cs == __KERNEXEC_KERNEL_CS) && ip <= (unsigned long)_etext) ++ regs->ip = ip; ++ } ++#endif ++ + nmi_nesting_preprocess(regs); + + nmi_enter(); +diff --git a/arch/x86/kernel/nmi_selftest.c b/arch/x86/kernel/nmi_selftest.c +index 6d9582e..f746287 100644 +--- a/arch/x86/kernel/nmi_selftest.c ++++ b/arch/x86/kernel/nmi_selftest.c +@@ -43,7 +43,7 @@ static void __init init_nmi_testsuite(void) + { + /* trap all the unknown NMIs we may generate */ + register_nmi_handler(NMI_UNKNOWN, nmi_unk_cb, 0, "nmi_selftest_unk", +- __initdata); ++ __initconst); + } + + static void __init cleanup_nmi_testsuite(void) +@@ -66,7 +66,7 @@ static void __init test_nmi_ipi(struct cpumask *mask) + unsigned long timeout; + + if (register_nmi_handler(NMI_LOCAL, test_nmi_ipi_callback, +- NMI_FLAG_FIRST, "nmi_selftest", __initdata)) { ++ NMI_FLAG_FIRST, "nmi_selftest", __initconst)) { + nmi_fail = FAILURE; + return; + } +diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c +index bbb6c73..24a58ef 100644 +--- a/arch/x86/kernel/paravirt-spinlocks.c ++++ b/arch/x86/kernel/paravirt-spinlocks.c +@@ -8,7 +8,7 @@ + + #include <asm/paravirt.h> + +-struct pv_lock_ops pv_lock_ops = { ++struct pv_lock_ops pv_lock_ops __read_only = { + #ifdef CONFIG_SMP + .lock_spinning = __PV_IS_CALLEE_SAVE(paravirt_nop), + .unlock_kick = paravirt_nop, +diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c +index 548d25f..f8fb99c 100644 +--- a/arch/x86/kernel/paravirt.c ++++ b/arch/x86/kernel/paravirt.c +@@ -56,6 +56,9 @@ u64 _paravirt_ident_64(u64 x) + { + return x; + } ++#if defined(CONFIG_X86_32) && defined(CONFIG_X86_PAE) ++PV_CALLEE_SAVE_REGS_THUNK(_paravirt_ident_64); ++#endif + + void __init default_banner(void) + { +@@ -142,16 +145,20 @@ unsigned paravirt_patch_default(u8 type, u16 clobbers, void *insnbuf, + + if (opfunc == NULL) + /* If there's no function, patch it with a ud2a (BUG) */ +- ret = paravirt_patch_insns(insnbuf, len, ud2a, ud2a+sizeof(ud2a)); +- else if (opfunc == _paravirt_nop) ++ ret = paravirt_patch_insns(insnbuf, len, ktva_ktla(ud2a), ud2a+sizeof(ud2a)); ++ else if (opfunc == (void *)_paravirt_nop) + /* If the operation is a nop, then nop the callsite */ + ret = paravirt_patch_nop(); + + /* identity functions just return their single argument */ +- else if (opfunc == _paravirt_ident_32) ++ else if (opfunc == (void *)_paravirt_ident_32) + ret = paravirt_patch_ident_32(insnbuf, len); +- else if (opfunc == _paravirt_ident_64) ++ else if (opfunc == (void *)_paravirt_ident_64) ++ ret = paravirt_patch_ident_64(insnbuf, len); ++#if defined(CONFIG_X86_32) && defined(CONFIG_X86_PAE) ++ else if (opfunc == (void *)__raw_callee_save__paravirt_ident_64) + ret = paravirt_patch_ident_64(insnbuf, len); ++#endif + + else if (type == PARAVIRT_PATCH(pv_cpu_ops.iret) || + type == PARAVIRT_PATCH(pv_cpu_ops.irq_enable_sysexit) || +@@ -176,7 +183,7 @@ unsigned paravirt_patch_insns(void *insnbuf, unsigned len, + if (insn_len > len || start == NULL) + insn_len = len; + else +- memcpy(insnbuf, start, insn_len); ++ memcpy(insnbuf, ktla_ktva(start), insn_len); + + return insn_len; + } +@@ -300,7 +307,7 @@ enum paravirt_lazy_mode paravirt_get_lazy_mode(void) + return this_cpu_read(paravirt_lazy_mode); + } + +-struct pv_info pv_info = { ++struct pv_info pv_info __read_only = { + .name = "bare hardware", + .paravirt_enabled = 0, + .kernel_rpl = 0, +@@ -311,16 +318,16 @@ struct pv_info pv_info = { + #endif + }; + +-struct pv_init_ops pv_init_ops = { ++struct pv_init_ops pv_init_ops __read_only = { + .patch = native_patch, + }; + +-struct pv_time_ops pv_time_ops = { ++struct pv_time_ops pv_time_ops __read_only = { + .sched_clock = native_sched_clock, + .steal_clock = native_steal_clock, + }; + +-__visible struct pv_irq_ops pv_irq_ops = { ++__visible struct pv_irq_ops pv_irq_ops __read_only = { + .save_fl = __PV_IS_CALLEE_SAVE(native_save_fl), + .restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl), + .irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable), +@@ -332,7 +339,7 @@ __visible struct pv_irq_ops pv_irq_ops = { + #endif + }; + +-__visible struct pv_cpu_ops pv_cpu_ops = { ++__visible struct pv_cpu_ops pv_cpu_ops __read_only = { + .cpuid = native_cpuid, + .get_debugreg = native_get_debugreg, + .set_debugreg = native_set_debugreg, +@@ -395,21 +402,26 @@ NOKPROBE_SYMBOL(native_get_debugreg); + NOKPROBE_SYMBOL(native_set_debugreg); + NOKPROBE_SYMBOL(native_load_idt); + +-struct pv_apic_ops pv_apic_ops = { ++struct pv_apic_ops pv_apic_ops __read_only= { + #ifdef CONFIG_X86_LOCAL_APIC + .startup_ipi_hook = paravirt_nop, + #endif + }; + +-#if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) ++#ifdef CONFIG_X86_32 ++#ifdef CONFIG_X86_PAE ++/* 64-bit pagetable entries */ ++#define PTE_IDENT PV_CALLEE_SAVE(_paravirt_ident_64) ++#else + /* 32-bit pagetable entries */ + #define PTE_IDENT __PV_IS_CALLEE_SAVE(_paravirt_ident_32) ++#endif + #else + /* 64-bit pagetable entries */ + #define PTE_IDENT __PV_IS_CALLEE_SAVE(_paravirt_ident_64) + #endif + +-struct pv_mmu_ops pv_mmu_ops = { ++struct pv_mmu_ops pv_mmu_ops __read_only = { + + .read_cr2 = native_read_cr2, + .write_cr2 = native_write_cr2, +@@ -459,6 +471,7 @@ struct pv_mmu_ops pv_mmu_ops = { + .make_pud = PTE_IDENT, + + .set_pgd = native_set_pgd, ++ .set_pgd_batched = native_set_pgd_batched, + #endif + #endif /* PAGETABLE_LEVELS >= 3 */ + +@@ -479,6 +492,12 @@ struct pv_mmu_ops pv_mmu_ops = { + }, + + .set_fixmap = native_set_fixmap, ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ .pax_open_kernel = native_pax_open_kernel, ++ .pax_close_kernel = native_pax_close_kernel, ++#endif ++ + }; + + EXPORT_SYMBOL_GPL(pv_time_ops); +diff --git a/arch/x86/kernel/paravirt_patch_64.c b/arch/x86/kernel/paravirt_patch_64.c +index a1da673..b6f5831 100644 +--- a/arch/x86/kernel/paravirt_patch_64.c ++++ b/arch/x86/kernel/paravirt_patch_64.c +@@ -9,7 +9,11 @@ DEF_NATIVE(pv_irq_ops, save_fl, "pushfq; popq %rax"); + DEF_NATIVE(pv_mmu_ops, read_cr2, "movq %cr2, %rax"); + DEF_NATIVE(pv_mmu_ops, read_cr3, "movq %cr3, %rax"); + DEF_NATIVE(pv_mmu_ops, write_cr3, "movq %rdi, %cr3"); ++ ++#ifndef CONFIG_PAX_MEMORY_UDEREF + DEF_NATIVE(pv_mmu_ops, flush_tlb_single, "invlpg (%rdi)"); ++#endif ++ + DEF_NATIVE(pv_cpu_ops, clts, "clts"); + DEF_NATIVE(pv_cpu_ops, wbinvd, "wbinvd"); + +@@ -57,7 +61,11 @@ unsigned native_patch(u8 type, u16 clobbers, void *ibuf, + PATCH_SITE(pv_mmu_ops, read_cr3); + PATCH_SITE(pv_mmu_ops, write_cr3); + PATCH_SITE(pv_cpu_ops, clts); ++ ++#ifndef CONFIG_PAX_MEMORY_UDEREF + PATCH_SITE(pv_mmu_ops, flush_tlb_single); ++#endif ++ + PATCH_SITE(pv_cpu_ops, wbinvd); + + patch_site: +diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c +index 0497f71..7186c0d 100644 +--- a/arch/x86/kernel/pci-calgary_64.c ++++ b/arch/x86/kernel/pci-calgary_64.c +@@ -1347,7 +1347,7 @@ static void __init get_tce_space_from_tar(void) + tce_space = be64_to_cpu(readq(target)); + tce_space = tce_space & TAR_SW_BITS; + +- tce_space = tce_space & (~specified_table_size); ++ tce_space = tce_space & (~(unsigned long)specified_table_size); + info->tce_space = (u64 *)__va(tce_space); + } + } +diff --git a/arch/x86/kernel/pci-iommu_table.c b/arch/x86/kernel/pci-iommu_table.c +index 35ccf75..7a15747 100644 +--- a/arch/x86/kernel/pci-iommu_table.c ++++ b/arch/x86/kernel/pci-iommu_table.c +@@ -2,7 +2,7 @@ + #include <asm/iommu_table.h> + #include <linux/string.h> + #include <linux/kallsyms.h> +- ++#include <linux/sched.h> + + #define DEBUG 1 + +diff --git a/arch/x86/kernel/pci-swiotlb.c b/arch/x86/kernel/pci-swiotlb.c +index 77dd0ad..9ec4723 100644 +--- a/arch/x86/kernel/pci-swiotlb.c ++++ b/arch/x86/kernel/pci-swiotlb.c +@@ -33,7 +33,7 @@ void x86_swiotlb_free_coherent(struct device *dev, size_t size, + struct dma_attrs *attrs) + { + if (is_swiotlb_buffer(dma_to_phys(dev, dma_addr))) +- swiotlb_free_coherent(dev, size, vaddr, dma_addr); ++ swiotlb_free_coherent(dev, size, vaddr, dma_addr, attrs); + else + dma_generic_free_coherent(dev, size, vaddr, dma_addr, attrs); + } +diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c +index e127dda..94e384d 100644 +--- a/arch/x86/kernel/process.c ++++ b/arch/x86/kernel/process.c +@@ -36,7 +36,8 @@ + * section. Since TSS's are completely CPU-local, we want them + * on exact cacheline boundaries, to eliminate cacheline ping-pong. + */ +-__visible DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, init_tss) = INIT_TSS; ++struct tss_struct init_tss[NR_CPUS] __visible ____cacheline_internodealigned_in_smp = { [0 ... NR_CPUS-1] = INIT_TSS }; ++EXPORT_SYMBOL(init_tss); + + #ifdef CONFIG_X86_64 + static DEFINE_PER_CPU(unsigned char, is_idle); +@@ -94,7 +95,7 @@ void arch_task_cache_init(void) + task_xstate_cachep = + kmem_cache_create("task_xstate", xstate_size, + __alignof__(union thread_xstate), +- SLAB_PANIC | SLAB_NOTRACK, NULL); ++ SLAB_PANIC | SLAB_NOTRACK | SLAB_USERCOPY, NULL); + setup_xstate_comp(); + } + +@@ -108,7 +109,7 @@ void exit_thread(void) + unsigned long *bp = t->io_bitmap_ptr; + + if (bp) { +- struct tss_struct *tss = &per_cpu(init_tss, get_cpu()); ++ struct tss_struct *tss = init_tss + get_cpu(); + + t->io_bitmap_ptr = NULL; + clear_thread_flag(TIF_IO_BITMAP); +@@ -128,6 +129,9 @@ void flush_thread(void) + { + struct task_struct *tsk = current; + ++#if defined(CONFIG_X86_32) && !defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_PAX_MEMORY_UDEREF) ++ loadsegment(gs, 0); ++#endif + flush_ptrace_hw_breakpoint(tsk); + memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); + drop_init_fpu(tsk); +@@ -274,7 +278,7 @@ static void __exit_idle(void) + void exit_idle(void) + { + /* idle loop has pid 0 */ +- if (current->pid) ++ if (task_pid_nr(current)) + return; + __exit_idle(); + } +@@ -327,7 +331,7 @@ bool xen_set_default_idle(void) + return ret; + } + #endif +-void stop_this_cpu(void *dummy) ++__noreturn void stop_this_cpu(void *dummy) + { + local_irq_disable(); + /* +@@ -456,16 +460,37 @@ static int __init idle_setup(char *str) + } + early_param("idle", idle_setup); + +-unsigned long arch_align_stack(unsigned long sp) ++#ifdef CONFIG_PAX_RANDKSTACK ++void pax_randomize_kstack(struct pt_regs *regs) + { +- if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space) +- sp -= get_random_int() % 8192; +- return sp & ~0xf; +-} ++ struct thread_struct *thread = ¤t->thread; ++ unsigned long time; + +-unsigned long arch_randomize_brk(struct mm_struct *mm) +-{ +- unsigned long range_end = mm->brk + 0x02000000; +- return randomize_range(mm->brk, range_end, 0) ? : mm->brk; +-} ++ if (!randomize_va_space) ++ return; ++ ++ if (v8086_mode(regs)) ++ return; + ++ rdtscl(time); ++ ++ /* P4 seems to return a 0 LSB, ignore it */ ++#ifdef CONFIG_MPENTIUM4 ++ time &= 0x3EUL; ++ time <<= 2; ++#elif defined(CONFIG_X86_64) ++ time &= 0xFUL; ++ time <<= 4; ++#else ++ time &= 0x1FUL; ++ time <<= 3; ++#endif ++ ++ thread->sp0 ^= time; ++ load_sp0(init_tss + smp_processor_id(), thread); ++ ++#ifdef CONFIG_X86_64 ++ this_cpu_write(kernel_stack, thread->sp0); ++#endif ++} ++#endif +diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c +index 8f3ebfe..cbc731b 100644 +--- a/arch/x86/kernel/process_32.c ++++ b/arch/x86/kernel/process_32.c +@@ -64,6 +64,7 @@ asmlinkage void ret_from_kernel_thread(void) __asm__("ret_from_kernel_thread"); + unsigned long thread_saved_pc(struct task_struct *tsk) + { + return ((unsigned long *)tsk->thread.sp)[3]; ++//XXX return tsk->thread.eip; + } + + void __show_regs(struct pt_regs *regs, int all) +@@ -73,19 +74,18 @@ void __show_regs(struct pt_regs *regs, int all) + unsigned long sp; + unsigned short ss, gs; + +- if (user_mode_vm(regs)) { ++ if (user_mode(regs)) { + sp = regs->sp; + ss = regs->ss & 0xffff; +- gs = get_user_gs(regs); + } else { + sp = kernel_stack_pointer(regs); + savesegment(ss, ss); +- savesegment(gs, gs); + } ++ gs = get_user_gs(regs); + + printk(KERN_DEFAULT "EIP: %04x:[<%08lx>] EFLAGS: %08lx CPU: %d\n", + (u16)regs->cs, regs->ip, regs->flags, +- smp_processor_id()); ++ raw_smp_processor_id()); + print_symbol("EIP is at %s\n", regs->ip); + + printk(KERN_DEFAULT "EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n", +@@ -132,21 +132,22 @@ void release_thread(struct task_struct *dead_task) + int copy_thread(unsigned long clone_flags, unsigned long sp, + unsigned long arg, struct task_struct *p) + { +- struct pt_regs *childregs = task_pt_regs(p); ++ struct pt_regs *childregs = task_stack_page(p) + THREAD_SIZE - sizeof(struct pt_regs) - 8; + struct task_struct *tsk; + int err; + + p->thread.sp = (unsigned long) childregs; + p->thread.sp0 = (unsigned long) (childregs+1); ++ p->tinfo.lowest_stack = (unsigned long)task_stack_page(p) + 2 * sizeof(unsigned long); + memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps)); + + if (unlikely(p->flags & PF_KTHREAD)) { + /* kernel thread */ + memset(childregs, 0, sizeof(struct pt_regs)); + p->thread.ip = (unsigned long) ret_from_kernel_thread; +- task_user_gs(p) = __KERNEL_STACK_CANARY; +- childregs->ds = __USER_DS; +- childregs->es = __USER_DS; ++ savesegment(gs, childregs->gs); ++ childregs->ds = __KERNEL_DS; ++ childregs->es = __KERNEL_DS; + childregs->fs = __KERNEL_PERCPU; + childregs->bx = sp; /* function */ + childregs->bp = arg; +@@ -248,7 +249,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + struct thread_struct *prev = &prev_p->thread, + *next = &next_p->thread; + int cpu = smp_processor_id(); +- struct tss_struct *tss = &per_cpu(init_tss, cpu); ++ struct tss_struct *tss = init_tss + cpu; + fpu_switch_t fpu; + + /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ +@@ -272,6 +273,10 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + */ + lazy_save_gs(prev->gs); + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ __set_fs(task_thread_info(next_p)->addr_limit); ++#endif ++ + /* + * Load the per-thread Thread-Local Storage descriptor. + */ +@@ -310,9 +315,9 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + */ + arch_end_context_switch(next_p); + +- this_cpu_write(kernel_stack, +- (unsigned long)task_stack_page(next_p) + +- THREAD_SIZE - KERNEL_STACK_OFFSET); ++ this_cpu_write(current_task, next_p); ++ this_cpu_write(current_tinfo, &next_p->tinfo); ++ this_cpu_write(kernel_stack, next->sp0); + + /* + * Restore %gs if needed (which is common) +@@ -322,8 +327,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + + switch_fpu_finish(next_p, fpu); + +- this_cpu_write(current_task, next_p); +- + return prev_p; + } + +@@ -353,4 +356,3 @@ unsigned long get_wchan(struct task_struct *p) + } while (count++ < 16); + return 0; + } +- +diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c +index 5a2c029..ec8611d 100644 +--- a/arch/x86/kernel/process_64.c ++++ b/arch/x86/kernel/process_64.c +@@ -158,10 +158,11 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, + struct pt_regs *childregs; + struct task_struct *me = current; + +- p->thread.sp0 = (unsigned long)task_stack_page(p) + THREAD_SIZE; ++ p->thread.sp0 = (unsigned long)task_stack_page(p) + THREAD_SIZE - 16; + childregs = task_pt_regs(p); + p->thread.sp = (unsigned long) childregs; + p->thread.usersp = me->thread.usersp; ++ p->tinfo.lowest_stack = (unsigned long)task_stack_page(p) + 2 * sizeof(unsigned long); + set_tsk_thread_flag(p, TIF_FORK); + p->thread.io_bitmap_ptr = NULL; + +@@ -171,6 +172,8 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, + p->thread.fs = p->thread.fsindex ? 0 : me->thread.fs; + savesegment(es, p->thread.es); + savesegment(ds, p->thread.ds); ++ savesegment(ss, p->thread.ss); ++ BUG_ON(p->thread.ss == __UDEREF_KERNEL_DS); + memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps)); + + if (unlikely(p->flags & PF_KTHREAD)) { +@@ -277,7 +280,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + struct thread_struct *prev = &prev_p->thread; + struct thread_struct *next = &next_p->thread; + int cpu = smp_processor_id(); +- struct tss_struct *tss = &per_cpu(init_tss, cpu); ++ struct tss_struct *tss = init_tss + cpu; + unsigned fsindex, gsindex; + fpu_switch_t fpu; + +@@ -331,6 +334,10 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + if (unlikely(next->ds | prev->ds)) + loadsegment(ds, next->ds); + ++ savesegment(ss, prev->ss); ++ if (unlikely(next->ss != prev->ss)) ++ loadsegment(ss, next->ss); ++ + /* + * Switch FS and GS. + * +@@ -404,6 +411,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + prev->usersp = this_cpu_read(old_rsp); + this_cpu_write(old_rsp, next->usersp); + this_cpu_write(current_task, next_p); ++ this_cpu_write(current_tinfo, &next_p->tinfo); + + /* + * If it were not for PREEMPT_ACTIVE we could guarantee that the +@@ -413,9 +421,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + task_thread_info(prev_p)->saved_preempt_count = this_cpu_read(__preempt_count); + this_cpu_write(__preempt_count, task_thread_info(next_p)->saved_preempt_count); + +- this_cpu_write(kernel_stack, +- (unsigned long)task_stack_page(next_p) + +- THREAD_SIZE - KERNEL_STACK_OFFSET); ++ this_cpu_write(kernel_stack, next->sp0); + + /* + * Now maybe reload the debug registers and handle I/O bitmaps +@@ -485,12 +491,11 @@ unsigned long get_wchan(struct task_struct *p) + if (!p || p == current || p->state == TASK_RUNNING) + return 0; + stack = (unsigned long)task_stack_page(p); +- if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE) ++ if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE-16-sizeof(u64)) + return 0; + fp = *(u64 *)(p->thread.sp); + do { +- if (fp < (unsigned long)stack || +- fp >= (unsigned long)stack+THREAD_SIZE) ++ if (fp < stack || fp > stack+THREAD_SIZE-16-sizeof(u64)) + return 0; + ip = *(u64 *)(fp+8); + if (!in_sched_functions(ip)) +diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c +index e510618..5165ac0 100644 +--- a/arch/x86/kernel/ptrace.c ++++ b/arch/x86/kernel/ptrace.c +@@ -186,10 +186,10 @@ unsigned long kernel_stack_pointer(struct pt_regs *regs) + unsigned long sp = (unsigned long)®s->sp; + u32 *prev_esp; + +- if (context == (sp & ~(THREAD_SIZE - 1))) ++ if (context == ((sp + 8) & ~(THREAD_SIZE - 1))) + return sp; + +- prev_esp = (u32 *)(context); ++ prev_esp = *(u32 **)(context); + if (prev_esp) + return (unsigned long)prev_esp; + +@@ -452,6 +452,20 @@ static int putreg(struct task_struct *child, + if (child->thread.gs != value) + return do_arch_prctl(child, ARCH_SET_GS, value); + return 0; ++ ++ case offsetof(struct user_regs_struct,ip): ++ /* ++ * Protect against any attempt to set ip to an ++ * impossible address. There are dragons lurking if the ++ * address is noncanonical. (This explicitly allows ++ * setting ip to TASK_SIZE_MAX, because user code can do ++ * that all by itself by running off the end of its ++ * address space. ++ */ ++ if (value > TASK_SIZE_MAX) ++ return -EIO; ++ break; ++ + #endif + } + +@@ -588,7 +602,7 @@ static void ptrace_triggered(struct perf_event *bp, + static unsigned long ptrace_get_dr7(struct perf_event *bp[]) + { + int i; +- int dr7 = 0; ++ unsigned long dr7 = 0; + struct arch_hw_breakpoint *info; + + for (i = 0; i < HBP_NUM; i++) { +@@ -822,7 +836,7 @@ long arch_ptrace(struct task_struct *child, long request, + unsigned long addr, unsigned long data) + { + int ret; +- unsigned long __user *datap = (unsigned long __user *)data; ++ unsigned long __user *datap = (__force unsigned long __user *)data; + + switch (request) { + /* read the word at location addr in the USER area. */ +@@ -907,14 +921,14 @@ long arch_ptrace(struct task_struct *child, long request, + if ((int) addr < 0) + return -EIO; + ret = do_get_thread_area(child, addr, +- (struct user_desc __user *)data); ++ (__force struct user_desc __user *) data); + break; + + case PTRACE_SET_THREAD_AREA: + if ((int) addr < 0) + return -EIO; + ret = do_set_thread_area(child, addr, +- (struct user_desc __user *)data, 0); ++ (__force struct user_desc __user *) data, 0); + break; + #endif + +@@ -1292,7 +1306,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, + + #ifdef CONFIG_X86_64 + +-static struct user_regset x86_64_regsets[] __read_mostly = { ++static user_regset_no_const x86_64_regsets[] __read_only = { + [REGSET_GENERAL] = { + .core_note_type = NT_PRSTATUS, + .n = sizeof(struct user_regs_struct) / sizeof(long), +@@ -1333,7 +1347,7 @@ static const struct user_regset_view user_x86_64_view = { + #endif /* CONFIG_X86_64 */ + + #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION +-static struct user_regset x86_32_regsets[] __read_mostly = { ++static user_regset_no_const x86_32_regsets[] __read_only = { + [REGSET_GENERAL] = { + .core_note_type = NT_PRSTATUS, + .n = sizeof(struct user_regs_struct32) / sizeof(u32), +@@ -1386,7 +1400,7 @@ static const struct user_regset_view user_x86_32_view = { + */ + u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS]; + +-void update_regset_xstate_info(unsigned int size, u64 xstate_mask) ++void __init update_regset_xstate_info(unsigned int size, u64 xstate_mask) + { + #ifdef CONFIG_X86_64 + x86_64_regsets[REGSET_XSTATE].n = size / sizeof(u64); +@@ -1421,7 +1435,7 @@ static void fill_sigtrap_info(struct task_struct *tsk, + memset(info, 0, sizeof(*info)); + info->si_signo = SIGTRAP; + info->si_code = si_code; +- info->si_addr = user_mode_vm(regs) ? (void __user *)regs->ip : NULL; ++ info->si_addr = user_mode(regs) ? (__force void __user *)regs->ip : NULL; + } + + void user_single_step_siginfo(struct task_struct *tsk, +@@ -1455,6 +1469,10 @@ static void do_audit_syscall_entry(struct pt_regs *regs, u32 arch) + } + } + ++#ifdef CONFIG_GRKERNSEC_SETXID ++extern void gr_delayed_cred_worker(void); ++#endif ++ + /* + * We can return 0 to resume the syscall or anything else to go to phase + * 2. If we resume the syscall, we need to put something appropriate in +@@ -1562,6 +1580,11 @@ long syscall_trace_enter_phase2(struct pt_regs *regs, u32 arch, + + BUG_ON(regs != task_pt_regs(current)); + ++#ifdef CONFIG_GRKERNSEC_SETXID ++ if (unlikely(test_and_clear_thread_flag(TIF_GRSEC_SETXID))) ++ gr_delayed_cred_worker(); ++#endif ++ + /* + * If we stepped into a sysenter/syscall insn, it trapped in + * kernel mode; do_debug() cleared TF and set TIF_SINGLESTEP. +@@ -1620,6 +1643,11 @@ void syscall_trace_leave(struct pt_regs *regs) + */ + user_exit(); + ++#ifdef CONFIG_GRKERNSEC_SETXID ++ if (unlikely(test_and_clear_thread_flag(TIF_GRSEC_SETXID))) ++ gr_delayed_cred_worker(); ++#endif ++ + audit_syscall_exit(regs); + + if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) +diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c +index 2f355d2..e75ed0a 100644 +--- a/arch/x86/kernel/pvclock.c ++++ b/arch/x86/kernel/pvclock.c +@@ -51,11 +51,11 @@ void pvclock_touch_watchdogs(void) + reset_hung_task_detector(); + } + +-static atomic64_t last_value = ATOMIC64_INIT(0); ++static atomic64_unchecked_t last_value = ATOMIC64_INIT(0); + + void pvclock_resume(void) + { +- atomic64_set(&last_value, 0); ++ atomic64_set_unchecked(&last_value, 0); + } + + u8 pvclock_read_flags(struct pvclock_vcpu_time_info *src) +@@ -105,11 +105,11 @@ cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) + * updating at the same time, and one of them could be slightly behind, + * making the assumption that last_value always go forward fail to hold. + */ +- last = atomic64_read(&last_value); ++ last = atomic64_read_unchecked(&last_value); + do { + if (ret < last) + return last; +- last = atomic64_cmpxchg(&last_value, last, ret); ++ last = atomic64_cmpxchg_unchecked(&last_value, last, ret); + } while (unlikely(last != ret)); + + return ret; +diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c +index 587be13..bf69b24 100644 +--- a/arch/x86/kernel/reboot.c ++++ b/arch/x86/kernel/reboot.c +@@ -69,6 +69,11 @@ static int __init set_bios_reboot(const struct dmi_system_id *d) + + void __noreturn machine_real_restart(unsigned int type) + { ++ ++#if defined(CONFIG_X86_32) && (defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF)) ++ struct desc_struct *gdt; ++#endif ++ + local_irq_disable(); + + /* +@@ -96,7 +101,29 @@ void __noreturn machine_real_restart(unsigned int type) + + /* Jump to the identity-mapped low memory code */ + #ifdef CONFIG_X86_32 +- asm volatile("jmpl *%0" : : ++ ++#if defined(CONFIG_PAX_KERNEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF) ++ gdt = get_cpu_gdt_table(smp_processor_id()); ++ pax_open_kernel(); ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ gdt[GDT_ENTRY_KERNEL_DS].type = 3; ++ gdt[GDT_ENTRY_KERNEL_DS].limit = 0xf; ++ loadsegment(ds, __KERNEL_DS); ++ loadsegment(es, __KERNEL_DS); ++ loadsegment(ss, __KERNEL_DS); ++#endif ++#ifdef CONFIG_PAX_KERNEXEC ++ gdt[GDT_ENTRY_KERNEL_CS].base0 = 0; ++ gdt[GDT_ENTRY_KERNEL_CS].base1 = 0; ++ gdt[GDT_ENTRY_KERNEL_CS].base2 = 0; ++ gdt[GDT_ENTRY_KERNEL_CS].limit0 = 0xffff; ++ gdt[GDT_ENTRY_KERNEL_CS].limit = 0xf; ++ gdt[GDT_ENTRY_KERNEL_CS].g = 1; ++#endif ++ pax_close_kernel(); ++#endif ++ ++ asm volatile("ljmpl *%0" : : + "rm" (real_mode_header->machine_real_restart_asm), + "a" (type)); + #else +@@ -136,7 +163,7 @@ static int __init set_kbd_reboot(const struct dmi_system_id *d) + /* + * This is a single dmi_table handling all reboot quirks. + */ +-static struct dmi_system_id __initdata reboot_dmi_table[] = { ++static const struct dmi_system_id __initconst reboot_dmi_table[] = { + + /* Acer */ + { /* Handle reboot issue on Acer Aspire one */ +@@ -510,7 +537,7 @@ void __attribute__((weak)) mach_reboot_fixups(void) + * This means that this function can never return, it can misbehave + * by not rebooting properly and hanging. + */ +-static void native_machine_emergency_restart(void) ++static void __noreturn native_machine_emergency_restart(void) + { + int i; + int attempt = 0; +@@ -630,13 +657,13 @@ void native_machine_shutdown(void) + #endif + } + +-static void __machine_emergency_restart(int emergency) ++static void __noreturn __machine_emergency_restart(int emergency) + { + reboot_emergency = emergency; + machine_ops.emergency_restart(); + } + +-static void native_machine_restart(char *__unused) ++static void __noreturn native_machine_restart(char *__unused) + { + pr_notice("machine restart\n"); + +@@ -645,7 +672,7 @@ static void native_machine_restart(char *__unused) + __machine_emergency_restart(0); + } + +-static void native_machine_halt(void) ++static void __noreturn native_machine_halt(void) + { + /* Stop other cpus and apics */ + machine_shutdown(); +@@ -655,7 +682,7 @@ static void native_machine_halt(void) + stop_this_cpu(NULL); + } + +-static void native_machine_power_off(void) ++static void __noreturn native_machine_power_off(void) + { + if (pm_power_off) { + if (!reboot_force) +@@ -664,9 +691,10 @@ static void native_machine_power_off(void) + } + /* A fallback in case there is no PM info available */ + tboot_shutdown(TB_SHUTDOWN_HALT); ++ unreachable(); + } + +-struct machine_ops machine_ops = { ++struct machine_ops machine_ops __read_only = { + .power_off = native_machine_power_off, + .shutdown = native_machine_shutdown, + .emergency_restart = native_machine_emergency_restart, +diff --git a/arch/x86/kernel/reboot_fixups_32.c b/arch/x86/kernel/reboot_fixups_32.c +index c8e41e9..64049ef 100644 +--- a/arch/x86/kernel/reboot_fixups_32.c ++++ b/arch/x86/kernel/reboot_fixups_32.c +@@ -57,7 +57,7 @@ struct device_fixup { + unsigned int vendor; + unsigned int device; + void (*reboot_fixup)(struct pci_dev *); +-}; ++} __do_const; + + /* + * PCI ids solely used for fixups_table go here +diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S +index 3fd2c69..a444264 100644 +--- a/arch/x86/kernel/relocate_kernel_64.S ++++ b/arch/x86/kernel/relocate_kernel_64.S +@@ -96,8 +96,7 @@ relocate_kernel: + + /* jump to identity mapped page */ + addq $(identity_mapped - relocate_kernel), %r8 +- pushq %r8 +- ret ++ jmp *%r8 + + identity_mapped: + /* set return address to 0 if not preserving context */ +diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c +index ab08aa2..6d74a3a 100644 +--- a/arch/x86/kernel/setup.c ++++ b/arch/x86/kernel/setup.c +@@ -110,6 +110,7 @@ + #include <asm/mce.h> + #include <asm/alternative.h> + #include <asm/prom.h> ++#include <asm/boot.h> + + /* + * max_low_pfn_mapped: highest direct mapped pfn under 4GB +@@ -205,12 +206,50 @@ EXPORT_SYMBOL(boot_cpu_data); + #endif + + +-#if !defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64) +-__visible unsigned long mmu_cr4_features; ++#ifdef CONFIG_X86_64 ++__visible unsigned long mmu_cr4_features __read_only = X86_CR4_PSE | X86_CR4_PAE | X86_CR4_PGE; ++#elif defined(CONFIG_X86_PAE) ++__visible unsigned long mmu_cr4_features __read_only = X86_CR4_PAE; + #else +-__visible unsigned long mmu_cr4_features = X86_CR4_PAE; ++__visible unsigned long mmu_cr4_features __read_only; + #endif + ++void set_in_cr4(unsigned long mask) ++{ ++ unsigned long cr4 = read_cr4(); ++ ++ if ((cr4 & mask) == mask && cr4 == mmu_cr4_features) ++ return; ++ ++ pax_open_kernel(); ++ mmu_cr4_features |= mask; ++ pax_close_kernel(); ++ ++ if (trampoline_cr4_features) ++ *trampoline_cr4_features = mmu_cr4_features; ++ cr4 |= mask; ++ write_cr4(cr4); ++} ++EXPORT_SYMBOL(set_in_cr4); ++ ++void clear_in_cr4(unsigned long mask) ++{ ++ unsigned long cr4 = read_cr4(); ++ ++ if (!(cr4 & mask) && cr4 == mmu_cr4_features) ++ return; ++ ++ pax_open_kernel(); ++ mmu_cr4_features &= ~mask; ++ pax_close_kernel(); ++ ++ if (trampoline_cr4_features) ++ *trampoline_cr4_features = mmu_cr4_features; ++ cr4 &= ~mask; ++ write_cr4(cr4); ++} ++EXPORT_SYMBOL(clear_in_cr4); ++ + /* Boot loader ID and version as integers, for the benefit of proc_dointvec */ + int bootloader_type, bootloader_version; + +@@ -772,7 +811,7 @@ static void __init trim_bios_range(void) + * area (640->1Mb) as ram even though it is not. + * take them out. + */ +- e820_remove_range(BIOS_BEGIN, BIOS_END - BIOS_BEGIN, E820_RAM, 1); ++ e820_remove_range(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, E820_RAM, 1); + + sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); + } +@@ -780,7 +819,7 @@ static void __init trim_bios_range(void) + /* called before trim_bios_range() to spare extra sanitize */ + static void __init e820_add_kernel_range(void) + { +- u64 start = __pa_symbol(_text); ++ u64 start = __pa_symbol(ktla_ktva(_text)); + u64 size = __pa_symbol(_end) - start; + + /* +@@ -856,8 +895,12 @@ dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p) + + void __init setup_arch(char **cmdline_p) + { ++#ifdef CONFIG_X86_32 ++ memblock_reserve(LOAD_PHYSICAL_ADDR, __pa_symbol(__bss_stop) - LOAD_PHYSICAL_ADDR); ++#else + memblock_reserve(__pa_symbol(_text), + (unsigned long)__bss_stop - (unsigned long)_text); ++#endif + + early_reserve_initrd(); + +@@ -955,14 +998,14 @@ void __init setup_arch(char **cmdline_p) + + if (!boot_params.hdr.root_flags) + root_mountflags &= ~MS_RDONLY; +- init_mm.start_code = (unsigned long) _text; +- init_mm.end_code = (unsigned long) _etext; ++ init_mm.start_code = ktla_ktva((unsigned long) _text); ++ init_mm.end_code = ktla_ktva((unsigned long) _etext); + init_mm.end_data = (unsigned long) _edata; + init_mm.brk = _brk_end; + +- code_resource.start = __pa_symbol(_text); +- code_resource.end = __pa_symbol(_etext)-1; +- data_resource.start = __pa_symbol(_etext); ++ code_resource.start = __pa_symbol(ktla_ktva(_text)); ++ code_resource.end = __pa_symbol(ktla_ktva(_etext))-1; ++ data_resource.start = __pa_symbol(_sdata); + data_resource.end = __pa_symbol(_edata)-1; + bss_resource.start = __pa_symbol(__bss_start); + bss_resource.end = __pa_symbol(__bss_stop)-1; +diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c +index 5cdff03..80fa283 100644 +--- a/arch/x86/kernel/setup_percpu.c ++++ b/arch/x86/kernel/setup_percpu.c +@@ -21,19 +21,17 @@ + #include <asm/cpu.h> + #include <asm/stackprotector.h> + +-DEFINE_PER_CPU_READ_MOSTLY(int, cpu_number); ++#ifdef CONFIG_SMP ++DEFINE_PER_CPU_READ_MOSTLY(unsigned int, cpu_number); + EXPORT_PER_CPU_SYMBOL(cpu_number); ++#endif + +-#ifdef CONFIG_X86_64 + #define BOOT_PERCPU_OFFSET ((unsigned long)__per_cpu_load) +-#else +-#define BOOT_PERCPU_OFFSET 0 +-#endif + + DEFINE_PER_CPU(unsigned long, this_cpu_off) = BOOT_PERCPU_OFFSET; + EXPORT_PER_CPU_SYMBOL(this_cpu_off); + +-unsigned long __per_cpu_offset[NR_CPUS] __read_mostly = { ++unsigned long __per_cpu_offset[NR_CPUS] __read_only = { + [0 ... NR_CPUS-1] = BOOT_PERCPU_OFFSET, + }; + EXPORT_SYMBOL(__per_cpu_offset); +@@ -66,7 +64,7 @@ static bool __init pcpu_need_numa(void) + { + #ifdef CONFIG_NEED_MULTIPLE_NODES + pg_data_t *last = NULL; +- unsigned int cpu; ++ int cpu; + + for_each_possible_cpu(cpu) { + int node = early_cpu_to_node(cpu); +@@ -155,10 +153,10 @@ static inline void setup_percpu_segment(int cpu) + { + #ifdef CONFIG_X86_32 + struct desc_struct gdt; ++ unsigned long base = per_cpu_offset(cpu); + +- pack_descriptor(&gdt, per_cpu_offset(cpu), 0xFFFFF, +- 0x2 | DESCTYPE_S, 0x8); +- gdt.s = 1; ++ pack_descriptor(&gdt, base, (VMALLOC_END - base - 1) >> PAGE_SHIFT, ++ 0x83 | DESCTYPE_S, 0xC); + write_gdt_entry(get_cpu_gdt_table(cpu), + GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S); + #endif +@@ -219,6 +217,11 @@ void __init setup_per_cpu_areas(void) + /* alrighty, percpu areas up and running */ + delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start; + for_each_possible_cpu(cpu) { ++#ifdef CONFIG_CC_STACKPROTECTOR ++#ifdef CONFIG_X86_32 ++ unsigned long canary = per_cpu(stack_canary.canary, cpu); ++#endif ++#endif + per_cpu_offset(cpu) = delta + pcpu_unit_offsets[cpu]; + per_cpu(this_cpu_off, cpu) = per_cpu_offset(cpu); + per_cpu(cpu_number, cpu) = cpu; +@@ -259,6 +262,12 @@ void __init setup_per_cpu_areas(void) + */ + set_cpu_numa_node(cpu, early_cpu_to_node(cpu)); + #endif ++#ifdef CONFIG_CC_STACKPROTECTOR ++#ifdef CONFIG_X86_32 ++ if (!cpu) ++ per_cpu(stack_canary.canary, cpu) = canary; ++#endif ++#endif + /* + * Up to this point, the boot CPU has been using .init.data + * area. Reload any changed state for the boot CPU. +diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c +index ed37a76..39f936e 100644 +--- a/arch/x86/kernel/signal.c ++++ b/arch/x86/kernel/signal.c +@@ -190,7 +190,7 @@ static unsigned long align_sigframe(unsigned long sp) + * Align the stack pointer according to the i386 ABI, + * i.e. so that on function entry ((sp + 4) & 15) == 0. + */ +- sp = ((sp + 4) & -16ul) - 4; ++ sp = ((sp - 12) & -16ul) - 4; + #else /* !CONFIG_X86_32 */ + sp = round_down(sp, 16) - 8; + #endif +@@ -298,10 +298,9 @@ __setup_frame(int sig, struct ksignal *ksig, sigset_t *set, + } + + if (current->mm->context.vdso) +- restorer = current->mm->context.vdso + +- selected_vdso32->sym___kernel_sigreturn; ++ restorer = (void __force_user *)(current->mm->context.vdso + selected_vdso32->sym___kernel_sigreturn); + else +- restorer = &frame->retcode; ++ restorer = (void __user *)&frame->retcode; + if (ksig->ka.sa.sa_flags & SA_RESTORER) + restorer = ksig->ka.sa.sa_restorer; + +@@ -315,7 +314,7 @@ __setup_frame(int sig, struct ksignal *ksig, sigset_t *set, + * reasons and because gdb uses it as a signature to notice + * signal handler stack frames. + */ +- err |= __put_user(*((u64 *)&retcode), (u64 *)frame->retcode); ++ err |= __put_user(*((u64 *)&retcode), (u64 __user *)frame->retcode); + + if (err) + return -EFAULT; +@@ -362,8 +361,10 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig, + save_altstack_ex(&frame->uc.uc_stack, regs->sp); + + /* Set up to return from userspace. */ +- restorer = current->mm->context.vdso + +- selected_vdso32->sym___kernel_rt_sigreturn; ++ if (current->mm->context.vdso) ++ restorer = (void __force_user *)(current->mm->context.vdso + selected_vdso32->sym___kernel_rt_sigreturn); ++ else ++ restorer = (void __user *)&frame->retcode; + if (ksig->ka.sa.sa_flags & SA_RESTORER) + restorer = ksig->ka.sa.sa_restorer; + put_user_ex(restorer, &frame->pretcode); +@@ -375,7 +376,7 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig, + * reasons and because gdb uses it as a signature to notice + * signal handler stack frames. + */ +- put_user_ex(*((u64 *)&rt_retcode), (u64 *)frame->retcode); ++ put_user_ex(*((u64 *)&rt_retcode), (u64 __user *)frame->retcode); + } put_user_catch(err); + + err |= copy_siginfo_to_user(&frame->info, &ksig->info); +@@ -611,7 +612,12 @@ setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) + { + int usig = signr_convert(ksig->sig); + sigset_t *set = sigmask_to_save(); +- compat_sigset_t *cset = (compat_sigset_t *) set; ++ sigset_t sigcopy; ++ compat_sigset_t *cset; ++ ++ sigcopy = *set; ++ ++ cset = (compat_sigset_t *) &sigcopy; + + /* Set up the stack frame */ + if (is_ia32_frame()) { +@@ -622,7 +628,7 @@ setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) + } else if (is_x32_frame()) { + return x32_setup_rt_frame(ksig, cset, regs); + } else { +- return __setup_rt_frame(ksig->sig, ksig, set, regs); ++ return __setup_rt_frame(ksig->sig, ksig, &sigcopy, regs); + } + } + +diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c +index be8e1bd..a3d93fa 100644 +--- a/arch/x86/kernel/smp.c ++++ b/arch/x86/kernel/smp.c +@@ -341,7 +341,7 @@ static int __init nonmi_ipi_setup(char *str) + + __setup("nonmi_ipi", nonmi_ipi_setup); + +-struct smp_ops smp_ops = { ++struct smp_ops smp_ops __read_only = { + .smp_prepare_boot_cpu = native_smp_prepare_boot_cpu, + .smp_prepare_cpus = native_smp_prepare_cpus, + .smp_cpus_done = native_smp_cpus_done, +diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c +index 668d8f2..84a9d54 100644 +--- a/arch/x86/kernel/smpboot.c ++++ b/arch/x86/kernel/smpboot.c +@@ -194,14 +194,17 @@ static void notrace start_secondary(void *unused) + + enable_start_cpu0 = 0; + +-#ifdef CONFIG_X86_32 ++ /* otherwise gcc will move up smp_processor_id before the cpu_init */ ++ barrier(); ++ + /* switch away from the initial page table */ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ load_cr3(get_cpu_pgd(smp_processor_id(), kernel)); ++#else + load_cr3(swapper_pg_dir); +- __flush_tlb_all(); + #endif ++ __flush_tlb_all(); + +- /* otherwise gcc will move up smp_processor_id before the cpu_init */ +- barrier(); + /* + * Check TSC synchronization with the BP: + */ +@@ -765,8 +768,9 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle) + alternatives_enable_smp(); + + idle->thread.sp = (unsigned long) (((struct pt_regs *) +- (THREAD_SIZE + task_stack_page(idle))) - 1); ++ (THREAD_SIZE - 16 + task_stack_page(idle))) - 1); + per_cpu(current_task, cpu) = idle; ++ per_cpu(current_tinfo, cpu) = &idle->tinfo; + + #ifdef CONFIG_X86_32 + /* Stack for startup_32 can be just as for start_secondary onwards */ +@@ -775,10 +779,10 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle) + clear_tsk_thread_flag(idle, TIF_FORK); + initial_gs = per_cpu_offset(cpu); + #endif +- per_cpu(kernel_stack, cpu) = +- (unsigned long)task_stack_page(idle) - +- KERNEL_STACK_OFFSET + THREAD_SIZE; ++ per_cpu(kernel_stack, cpu) = (unsigned long)task_stack_page(idle) - 16 + THREAD_SIZE; ++ pax_open_kernel(); + early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu); ++ pax_close_kernel(); + initial_code = (unsigned long)start_secondary; + stack_start = idle->thread.sp; + +@@ -918,6 +922,15 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle) + /* the FPU context is blank, nobody can own it */ + __cpu_disable_lazy_restore(cpu); + ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ clone_pgd_range(get_cpu_pgd(cpu, kernel) + KERNEL_PGD_BOUNDARY, ++ swapper_pg_dir + KERNEL_PGD_BOUNDARY, ++ KERNEL_PGD_PTRS); ++ clone_pgd_range(get_cpu_pgd(cpu, user) + KERNEL_PGD_BOUNDARY, ++ swapper_pg_dir + KERNEL_PGD_BOUNDARY, ++ KERNEL_PGD_PTRS); ++#endif ++ + err = do_boot_cpu(apicid, cpu, tidle); + if (err) { + pr_err("do_boot_cpu failed(%d) to wakeup CPU#%u\n", err, cpu); +diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c +index 9b4d51d..5d28b58 100644 +--- a/arch/x86/kernel/step.c ++++ b/arch/x86/kernel/step.c +@@ -27,10 +27,10 @@ unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *re + struct desc_struct *desc; + unsigned long base; + +- seg &= ~7UL; ++ seg >>= 3; + + mutex_lock(&child->mm->context.lock); +- if (unlikely((seg >> 3) >= child->mm->context.size)) ++ if (unlikely(seg >= child->mm->context.size)) + addr = -1L; /* bogus selector, access would fault */ + else { + desc = child->mm->context.ldt + seg; +@@ -42,7 +42,8 @@ unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *re + addr += base; + } + mutex_unlock(&child->mm->context.lock); +- } ++ } else if (seg == __KERNEL_CS || seg == __KERNEXEC_KERNEL_CS) ++ addr = ktla_ktva(addr); + + return addr; + } +@@ -53,6 +54,9 @@ static int is_setting_trap_flag(struct task_struct *child, struct pt_regs *regs) + unsigned char opcode[15]; + unsigned long addr = convert_ip_to_linear(child, regs); + ++ if (addr == -EINVAL) ++ return 0; ++ + copied = access_process_vm(child, addr, opcode, sizeof(opcode), 0); + for (i = 0; i < copied; i++) { + switch (opcode[i]) { +diff --git a/arch/x86/kernel/sys_i386_32.c b/arch/x86/kernel/sys_i386_32.c +new file mode 100644 +index 0000000..5877189 +--- /dev/null ++++ b/arch/x86/kernel/sys_i386_32.c +@@ -0,0 +1,189 @@ ++/* ++ * This file contains various random system calls that ++ * have a non-standard calling sequence on the Linux/i386 ++ * platform. ++ */ ++ ++#include <linux/errno.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/fs.h> ++#include <linux/smp.h> ++#include <linux/sem.h> ++#include <linux/msg.h> ++#include <linux/shm.h> ++#include <linux/stat.h> ++#include <linux/syscalls.h> ++#include <linux/mman.h> ++#include <linux/file.h> ++#include <linux/utsname.h> ++#include <linux/ipc.h> ++#include <linux/elf.h> ++ ++#include <linux/uaccess.h> ++#include <linux/unistd.h> ++ ++#include <asm/syscalls.h> ++ ++int i386_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) ++{ ++ unsigned long pax_task_size = TASK_SIZE; ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (current->mm->pax_flags & MF_PAX_SEGMEXEC) ++ pax_task_size = SEGMEXEC_TASK_SIZE; ++#endif ++ ++ if (flags & MAP_FIXED) ++ if (len > pax_task_size || addr > pax_task_size - len) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++/* ++ * Align a virtual address to avoid aliasing in the I$ on AMD F15h. ++ */ ++static unsigned long get_align_mask(void) ++{ ++ if (va_align.flags < 0 || !(va_align.flags & ALIGN_VA_32)) ++ return 0; ++ ++ if (!(current->flags & PF_RANDOMIZE)) ++ return 0; ++ ++ return va_align.mask; ++} ++ ++unsigned long ++arch_get_unmapped_area(struct file *filp, unsigned long addr, ++ unsigned long len, unsigned long pgoff, unsigned long flags) ++{ ++ struct mm_struct *mm = current->mm; ++ struct vm_area_struct *vma; ++ unsigned long pax_task_size = TASK_SIZE; ++ struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) ++ pax_task_size = SEGMEXEC_TASK_SIZE; ++#endif ++ ++ pax_task_size -= PAGE_SIZE; ++ ++ if (len > pax_task_size) ++ return -ENOMEM; ++ ++ if (flags & MAP_FIXED) ++ return addr; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ ++ if (addr) { ++ addr = PAGE_ALIGN(addr); ++ if (pax_task_size - len >= addr) { ++ vma = find_vma(mm, addr); ++ if (check_heap_stack_gap(vma, addr, len, offset)) ++ return addr; ++ } ++ } ++ ++ info.flags = 0; ++ info.length = len; ++ info.align_mask = filp ? get_align_mask() : 0; ++ info.align_offset = pgoff << PAGE_SHIFT; ++ info.threadstack_offset = offset; ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!(__supported_pte_mask & _PAGE_NX) && (mm->pax_flags & MF_PAX_PAGEEXEC) && (flags & MAP_EXECUTABLE)) { ++ info.low_limit = 0x00110000UL; ++ info.high_limit = mm->start_code; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ info.low_limit += mm->delta_mmap & 0x03FFF000UL; ++#endif ++ ++ if (info.low_limit < info.high_limit) { ++ addr = vm_unmapped_area(&info); ++ if (!IS_ERR_VALUE(addr)) ++ return addr; ++ } ++ } else ++#endif ++ ++ info.low_limit = mm->mmap_base; ++ info.high_limit = pax_task_size; ++ ++ return vm_unmapped_area(&info); ++} ++ ++unsigned long ++arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, ++ const unsigned long len, const unsigned long pgoff, ++ const unsigned long flags) ++{ ++ struct vm_area_struct *vma; ++ struct mm_struct *mm = current->mm; ++ unsigned long addr = addr0, pax_task_size = TASK_SIZE; ++ struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) ++ pax_task_size = SEGMEXEC_TASK_SIZE; ++#endif ++ ++ pax_task_size -= PAGE_SIZE; ++ ++ /* requested length too big for entire address space */ ++ if (len > pax_task_size) ++ return -ENOMEM; ++ ++ if (flags & MAP_FIXED) ++ return addr; ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!(__supported_pte_mask & _PAGE_NX) && (mm->pax_flags & MF_PAX_PAGEEXEC) && (flags & MAP_EXECUTABLE)) ++ goto bottomup; ++#endif ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ ++ /* requesting a specific address */ ++ if (addr) { ++ addr = PAGE_ALIGN(addr); ++ if (pax_task_size - len >= addr) { ++ vma = find_vma(mm, addr); ++ if (check_heap_stack_gap(vma, addr, len, offset)) ++ return addr; ++ } ++ } ++ ++ info.flags = VM_UNMAPPED_AREA_TOPDOWN; ++ info.length = len; ++ info.low_limit = PAGE_SIZE; ++ info.high_limit = mm->mmap_base; ++ info.align_mask = filp ? get_align_mask() : 0; ++ info.align_offset = pgoff << PAGE_SHIFT; ++ info.threadstack_offset = offset; ++ ++ addr = vm_unmapped_area(&info); ++ if (!(addr & ~PAGE_MASK)) ++ return addr; ++ VM_BUG_ON(addr != -ENOMEM); ++ ++bottomup: ++ /* ++ * A failed mmap() very likely causes application failure, ++ * so fall back to the bottom-up function here. This scenario ++ * can happen with large stack limits and large mmap() ++ * allocations. ++ */ ++ return arch_get_unmapped_area(filp, addr0, len, pgoff, flags); ++} +diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c +index 30277e2..5664a29 100644 +--- a/arch/x86/kernel/sys_x86_64.c ++++ b/arch/x86/kernel/sys_x86_64.c +@@ -81,8 +81,8 @@ out: + return error; + } + +-static void find_start_end(unsigned long flags, unsigned long *begin, +- unsigned long *end) ++static void find_start_end(struct mm_struct *mm, unsigned long flags, ++ unsigned long *begin, unsigned long *end) + { + if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT)) { + unsigned long new_begin; +@@ -101,7 +101,7 @@ static void find_start_end(unsigned long flags, unsigned long *begin, + *begin = new_begin; + } + } else { +- *begin = current->mm->mmap_legacy_base; ++ *begin = mm->mmap_legacy_base; + *end = TASK_SIZE; + } + } +@@ -114,20 +114,24 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + struct vm_area_struct *vma; + struct vm_unmapped_area_info info; + unsigned long begin, end; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + + if (flags & MAP_FIXED) + return addr; + +- find_start_end(flags, &begin, &end); ++ find_start_end(mm, flags, &begin, &end); + + if (len > end) + return -ENOMEM; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + addr = PAGE_ALIGN(addr); + vma = find_vma(mm, addr); +- if (end - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (end - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + +@@ -137,6 +141,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + info.high_limit = end; + info.align_mask = filp ? get_align_mask() : 0; + info.align_offset = pgoff << PAGE_SHIFT; ++ info.threadstack_offset = offset; + return vm_unmapped_area(&info); + } + +@@ -149,6 +154,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + struct mm_struct *mm = current->mm; + unsigned long addr = addr0; + struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + + /* requested length too big for entire address space */ + if (len > TASK_SIZE) +@@ -161,12 +167,15 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT)) + goto bottomup; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + /* requesting a specific address */ + if (addr) { + addr = PAGE_ALIGN(addr); + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + +@@ -176,6 +185,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + info.high_limit = mm->mmap_base; + info.align_mask = filp ? get_align_mask() : 0; + info.align_offset = pgoff << PAGE_SHIFT; ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + if (!(addr & ~PAGE_MASK)) + return addr; +diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c +index 91a4496..bb87552 100644 +--- a/arch/x86/kernel/tboot.c ++++ b/arch/x86/kernel/tboot.c +@@ -221,7 +221,7 @@ static int tboot_setup_sleep(void) + + void tboot_shutdown(u32 shutdown_type) + { +- void (*shutdown)(void); ++ void (* __noreturn shutdown)(void); + + if (!tboot_enabled()) + return; +@@ -243,7 +243,7 @@ void tboot_shutdown(u32 shutdown_type) + + switch_to_tboot_pt(); + +- shutdown = (void(*)(void))(unsigned long)tboot->shutdown_entry; ++ shutdown = (void *)(unsigned long)tboot->shutdown_entry; + shutdown(); + + /* should not reach here */ +@@ -310,7 +310,7 @@ static int tboot_extended_sleep(u8 sleep_state, u32 val_a, u32 val_b) + return -ENODEV; + } + +-static atomic_t ap_wfs_count; ++static atomic_unchecked_t ap_wfs_count; + + static int tboot_wait_for_aps(int num_aps) + { +@@ -334,9 +334,9 @@ static int tboot_cpu_callback(struct notifier_block *nfb, unsigned long action, + { + switch (action) { + case CPU_DYING: +- atomic_inc(&ap_wfs_count); ++ atomic_inc_unchecked(&ap_wfs_count); + if (num_online_cpus() == 1) +- if (tboot_wait_for_aps(atomic_read(&ap_wfs_count))) ++ if (tboot_wait_for_aps(atomic_read_unchecked(&ap_wfs_count))) + return NOTIFY_BAD; + break; + } +@@ -422,7 +422,7 @@ static __init int tboot_late_init(void) + + tboot_create_trampoline(); + +- atomic_set(&ap_wfs_count, 0); ++ atomic_set_unchecked(&ap_wfs_count, 0); + register_hotcpu_notifier(&tboot_cpu_notifier); + + #ifdef CONFIG_DEBUG_FS +diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c +index 0fa2960..91eabbe 100644 +--- a/arch/x86/kernel/time.c ++++ b/arch/x86/kernel/time.c +@@ -30,9 +30,9 @@ unsigned long profile_pc(struct pt_regs *regs) + { + unsigned long pc = instruction_pointer(regs); + +- if (!user_mode_vm(regs) && in_lock_functions(pc)) { ++ if (!user_mode(regs) && in_lock_functions(pc)) { + #ifdef CONFIG_FRAME_POINTER +- return *(unsigned long *)(regs->bp + sizeof(long)); ++ return ktla_ktva(*(unsigned long *)(regs->bp + sizeof(long))); + #else + unsigned long *sp = + (unsigned long *)kernel_stack_pointer(regs); +@@ -41,11 +41,17 @@ unsigned long profile_pc(struct pt_regs *regs) + * or above a saved flags. Eflags has bits 22-31 zero, + * kernel addresses don't. + */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ return ktla_ktva(sp[0]); ++#else + if (sp[0] >> 22) + return sp[0]; + if (sp[1] >> 22) + return sp[1]; + #endif ++ ++#endif + } + return pc; + } +diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c +index 7fc5e84..c6e445a 100644 +--- a/arch/x86/kernel/tls.c ++++ b/arch/x86/kernel/tls.c +@@ -139,6 +139,11 @@ int do_set_thread_area(struct task_struct *p, int idx, + if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) + return -EINVAL; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((p->mm->pax_flags & MF_PAX_SEGMEXEC) && (info.contents & MODIFY_LDT_CONTENTS_CODE)) ++ return -EINVAL; ++#endif ++ + set_tls_desc(p, idx, &info, 1); + + return 0; +@@ -256,7 +261,7 @@ int regset_tls_set(struct task_struct *target, const struct user_regset *regset, + + if (kbuf) + info = kbuf; +- else if (__copy_from_user(infobuf, ubuf, count)) ++ else if (count > sizeof infobuf || __copy_from_user(infobuf, ubuf, count)) + return -EFAULT; + else + info = infobuf; +diff --git a/arch/x86/kernel/tracepoint.c b/arch/x86/kernel/tracepoint.c +index 1c113db..287b42e 100644 +--- a/arch/x86/kernel/tracepoint.c ++++ b/arch/x86/kernel/tracepoint.c +@@ -9,11 +9,11 @@ + #include <linux/atomic.h> + + atomic_t trace_idt_ctr = ATOMIC_INIT(0); +-struct desc_ptr trace_idt_descr = { NR_VECTORS * 16 - 1, ++const struct desc_ptr trace_idt_descr = { NR_VECTORS * 16 - 1, + (unsigned long) trace_idt_table }; + + /* No need to be aligned, but done to keep all IDTs defined the same way. */ +-gate_desc trace_idt_table[NR_VECTORS] __page_aligned_bss; ++gate_desc trace_idt_table[NR_VECTORS] __page_aligned_rodata; + + static int trace_irq_vector_refcount; + static DEFINE_MUTEX(irq_vector_mutex); +diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c +index 07ab8e9..99c8456 100644 +--- a/arch/x86/kernel/traps.c ++++ b/arch/x86/kernel/traps.c +@@ -67,7 +67,7 @@ + #include <asm/proto.h> + + /* No need to be aligned, but done to keep all IDTs defined the same way. */ +-gate_desc debug_idt_table[NR_VECTORS] __page_aligned_bss; ++gate_desc debug_idt_table[NR_VECTORS] __page_aligned_rodata; + #else + #include <asm/processor-flags.h> + #include <asm/setup.h> +@@ -76,7 +76,7 @@ asmlinkage int system_call(void); + #endif + + /* Must be page-aligned because the real IDT is used in a fixmap. */ +-gate_desc idt_table[NR_VECTORS] __page_aligned_bss; ++gate_desc idt_table[NR_VECTORS] __page_aligned_rodata; + + DECLARE_BITMAP(used_vectors, NR_VECTORS); + EXPORT_SYMBOL_GPL(used_vectors); +@@ -108,11 +108,11 @@ static inline void preempt_conditional_cli(struct pt_regs *regs) + } + + static nokprobe_inline int +-do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str, ++do_trap_no_signal(struct task_struct *tsk, int trapnr, const char *str, + struct pt_regs *regs, long error_code) + { + #ifdef CONFIG_X86_32 +- if (regs->flags & X86_VM_MASK) { ++ if (v8086_mode(regs)) { + /* + * Traps 0, 1, 3, 4, and 5 should be forwarded to vm86. + * On nmi (interrupt 2), do_trap should not be called. +@@ -125,12 +125,24 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str, + return -1; + } + #endif +- if (!user_mode(regs)) { ++ if (!user_mode_novm(regs)) { + if (!fixup_exception(regs)) { + tsk->thread.error_code = error_code; + tsk->thread.trap_nr = trapnr; ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if (trapnr == X86_TRAP_SS && ((regs->cs & 0xFFFF) == __KERNEL_CS || (regs->cs & 0xFFFF) == __KERNEXEC_KERNEL_CS)) ++ str = "PAX: suspicious stack segment fault"; ++#endif ++ + die(str, regs, error_code); + } ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ if (trapnr == X86_TRAP_OF) ++ pax_report_refcount_overflow(regs); ++#endif ++ + return 0; + } + +@@ -169,7 +181,7 @@ static siginfo_t *fill_trap_info(struct pt_regs *regs, int signr, int trapnr, + } + + static void +-do_trap(int trapnr, int signr, char *str, struct pt_regs *regs, ++do_trap(int trapnr, int signr, const char *str, struct pt_regs *regs, + long error_code, siginfo_t *info) + { + struct task_struct *tsk = current; +@@ -193,7 +205,7 @@ do_trap(int trapnr, int signr, char *str, struct pt_regs *regs, + if (show_unhandled_signals && unhandled_signal(tsk, signr) && + printk_ratelimit()) { + pr_info("%s[%d] trap %s ip:%lx sp:%lx error:%lx", +- tsk->comm, tsk->pid, str, ++ tsk->comm, task_pid_nr(tsk), str, + regs->ip, regs->sp, error_code); + print_vma_addr(" in ", regs->ip); + pr_cont("\n"); +@@ -274,6 +286,11 @@ dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code) + tsk->thread.error_code = error_code; + tsk->thread.trap_nr = X86_TRAP_DF; + ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++ if ((unsigned long)tsk->stack - regs->sp <= PAGE_SIZE) ++ die("grsec: kernel stack overflow detected", regs, error_code); ++#endif ++ + #ifdef CONFIG_DOUBLEFAULT + df_debug(regs, error_code); + #endif +@@ -296,7 +313,7 @@ do_general_protection(struct pt_regs *regs, long error_code) + conditional_sti(regs); + + #ifdef CONFIG_X86_32 +- if (regs->flags & X86_VM_MASK) { ++ if (v8086_mode(regs)) { + local_irq_enable(); + handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code); + goto exit; +@@ -304,18 +321,42 @@ do_general_protection(struct pt_regs *regs, long error_code) + #endif + + tsk = current; +- if (!user_mode(regs)) { ++ if (!user_mode_novm(regs)) { + if (fixup_exception(regs)) + goto exit; + + tsk->thread.error_code = error_code; + tsk->thread.trap_nr = X86_TRAP_GP; + if (notify_die(DIE_GPF, "general protection fault", regs, error_code, +- X86_TRAP_GP, SIGSEGV) != NOTIFY_STOP) ++ X86_TRAP_GP, SIGSEGV) != NOTIFY_STOP) { ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if ((regs->cs & 0xFFFF) == __KERNEL_CS || (regs->cs & 0xFFFF) == __KERNEXEC_KERNEL_CS) ++ die("PAX: suspicious general protection fault", regs, error_code); ++ else ++#endif ++ + die("general protection fault", regs, error_code); ++ } + goto exit; + } + ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_PAGEEXEC) ++ if (!(__supported_pte_mask & _PAGE_NX) && tsk->mm && (tsk->mm->pax_flags & MF_PAX_PAGEEXEC)) { ++ struct mm_struct *mm = tsk->mm; ++ unsigned long limit; ++ ++ down_write(&mm->mmap_sem); ++ limit = mm->context.user_cs_limit; ++ if (limit < TASK_SIZE) { ++ track_exec_limit(mm, limit, TASK_SIZE, VM_EXEC); ++ up_write(&mm->mmap_sem); ++ return; ++ } ++ up_write(&mm->mmap_sem); ++ } ++#endif ++ + tsk->thread.error_code = error_code; + tsk->thread.trap_nr = X86_TRAP_GP; + +@@ -427,13 +468,16 @@ struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s) + container_of(task_pt_regs(current), + struct bad_iret_stack, regs); + ++ if ((current->thread.sp0 ^ (unsigned long)s) < THREAD_SIZE) ++ new_stack = s; ++ + /* Copy the IRET target to the new stack. */ + memmove(&new_stack->regs.ip, (void *)s->regs.sp, 5*8); + + /* Copy the remainder of the stack from the current stack. */ + memmove(new_stack, s, offsetof(struct bad_iret_stack, regs.ip)); + +- BUG_ON(!user_mode_vm(&new_stack->regs)); ++ BUG_ON(!user_mode(&new_stack->regs)); + return new_stack; + } + NOKPROBE_SYMBOL(fixup_bad_iret); +@@ -519,7 +563,7 @@ dotraplinkage void do_debug(struct pt_regs *regs, long error_code) + /* It's safe to allow irq's after DR6 has been saved */ + preempt_conditional_sti(regs); + +- if (regs->flags & X86_VM_MASK) { ++ if (v8086_mode(regs)) { + handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, + X86_TRAP_DB); + preempt_conditional_cli(regs); +@@ -534,7 +578,7 @@ dotraplinkage void do_debug(struct pt_regs *regs, long error_code) + * We already checked v86 mode above, so we can check for kernel mode + * by just checking the CPL of CS. + */ +- if ((dr6 & DR_STEP) && !user_mode(regs)) { ++ if ((dr6 & DR_STEP) && !user_mode_novm(regs)) { + tsk->thread.debugreg6 &= ~DR_STEP; + set_tsk_thread_flag(tsk, TIF_SINGLESTEP); + regs->flags &= ~X86_EFLAGS_TF; +@@ -567,7 +611,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr) + return; + conditional_sti(regs); + +- if (!user_mode_vm(regs)) ++ if (!user_mode(regs)) + { + if (!fixup_exception(regs)) { + task->thread.error_code = error_code; +diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c +index 5054497..139f8f8 100644 +--- a/arch/x86/kernel/tsc.c ++++ b/arch/x86/kernel/tsc.c +@@ -150,7 +150,7 @@ static void cyc2ns_write_end(int cpu, struct cyc2ns_data *data) + */ + smp_wmb(); + +- ACCESS_ONCE(c2n->head) = data; ++ ACCESS_ONCE_RW(c2n->head) = data; + } + + /* +diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c +index 5d1cbfe..2a21feb 100644 +--- a/arch/x86/kernel/uprobes.c ++++ b/arch/x86/kernel/uprobes.c +@@ -845,7 +845,7 @@ int arch_uprobe_exception_notify(struct notifier_block *self, unsigned long val, + int ret = NOTIFY_DONE; + + /* We are only interested in userspace traps */ +- if (regs && !user_mode_vm(regs)) ++ if (regs && !user_mode(regs)) + return NOTIFY_DONE; + + switch (val) { +@@ -919,7 +919,7 @@ arch_uretprobe_hijack_return_addr(unsigned long trampoline_vaddr, struct pt_regs + + if (nleft != rasize) { + pr_err("uprobe: return address clobbered: pid=%d, %%sp=%#lx, " +- "%%ip=%#lx\n", current->pid, regs->sp, regs->ip); ++ "%%ip=%#lx\n", task_pid_nr(current), regs->sp, regs->ip); + + force_sig_info(SIGSEGV, SEND_SIG_FORCED, current); + } +diff --git a/arch/x86/kernel/verify_cpu.S b/arch/x86/kernel/verify_cpu.S +index b9242ba..50c5edd 100644 +--- a/arch/x86/kernel/verify_cpu.S ++++ b/arch/x86/kernel/verify_cpu.S +@@ -20,6 +20,7 @@ + * arch/x86/boot/compressed/head_64.S: Boot cpu verification + * arch/x86/kernel/trampoline_64.S: secondary processor verification + * arch/x86/kernel/head_32.S: processor startup ++ * arch/x86/kernel/acpi/realmode/wakeup.S: 32bit processor resume + * + * verify_cpu, returns the status of longmode and SSE in register %eax. + * 0: Success 1: Failure +diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c +index e8edcf5..27f9344 100644 +--- a/arch/x86/kernel/vm86_32.c ++++ b/arch/x86/kernel/vm86_32.c +@@ -44,6 +44,7 @@ + #include <linux/ptrace.h> + #include <linux/audit.h> + #include <linux/stddef.h> ++#include <linux/grsecurity.h> + + #include <asm/uaccess.h> + #include <asm/io.h> +@@ -150,7 +151,7 @@ struct pt_regs *save_v86_state(struct kernel_vm86_regs *regs) + do_exit(SIGSEGV); + } + +- tss = &per_cpu(init_tss, get_cpu()); ++ tss = init_tss + get_cpu(); + current->thread.sp0 = current->thread.saved_sp0; + current->thread.sysenter_cs = __KERNEL_CS; + load_sp0(tss, ¤t->thread); +@@ -214,6 +215,14 @@ SYSCALL_DEFINE1(vm86old, struct vm86_struct __user *, v86) + + if (tsk->thread.saved_sp0) + return -EPERM; ++ ++#ifdef CONFIG_GRKERNSEC_VM86 ++ if (!capable(CAP_SYS_RAWIO)) { ++ gr_handle_vm86(); ++ return -EPERM; ++ } ++#endif ++ + tmp = copy_vm86_regs_from_user(&info.regs, &v86->regs, + offsetof(struct kernel_vm86_struct, vm86plus) - + sizeof(info.regs)); +@@ -238,6 +247,13 @@ SYSCALL_DEFINE2(vm86, unsigned long, cmd, unsigned long, arg) + int tmp; + struct vm86plus_struct __user *v86; + ++#ifdef CONFIG_GRKERNSEC_VM86 ++ if (!capable(CAP_SYS_RAWIO)) { ++ gr_handle_vm86(); ++ return -EPERM; ++ } ++#endif ++ + tsk = current; + switch (cmd) { + case VM86_REQUEST_IRQ: +@@ -318,7 +334,7 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk + tsk->thread.saved_fs = info->regs32->fs; + tsk->thread.saved_gs = get_user_gs(info->regs32); + +- tss = &per_cpu(init_tss, get_cpu()); ++ tss = init_tss + get_cpu(); + tsk->thread.sp0 = (unsigned long) &info->VM86_TSS_ESP0; + if (cpu_has_sep) + tsk->thread.sysenter_cs = 0; +@@ -525,7 +541,7 @@ static void do_int(struct kernel_vm86_regs *regs, int i, + goto cannot_handle; + if (i == 0x21 && is_revectored(AH(regs), &KVM86->int21_revectored)) + goto cannot_handle; +- intr_ptr = (unsigned long __user *) (i << 2); ++ intr_ptr = (__force unsigned long __user *) (i << 2); + if (get_user(segoffs, intr_ptr)) + goto cannot_handle; + if ((segoffs >> 16) == BIOSSEG) +diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S +index 49edf2d..df596b1 100644 +--- a/arch/x86/kernel/vmlinux.lds.S ++++ b/arch/x86/kernel/vmlinux.lds.S +@@ -26,6 +26,13 @@ + #include <asm/page_types.h> + #include <asm/cache.h> + #include <asm/boot.h> ++#include <asm/segment.h> ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++#define __KERNEL_TEXT_OFFSET (LOAD_OFFSET + ____LOAD_PHYSICAL_ADDR) ++#else ++#define __KERNEL_TEXT_OFFSET 0 ++#endif + + #undef i386 /* in case the preprocessor is a 32bit one */ + +@@ -69,30 +76,43 @@ jiffies_64 = jiffies; + + PHDRS { + text PT_LOAD FLAGS(5); /* R_E */ ++#ifdef CONFIG_X86_32 ++ module PT_LOAD FLAGS(5); /* R_E */ ++#endif ++#ifdef CONFIG_XEN ++ rodata PT_LOAD FLAGS(5); /* R_E */ ++#else ++ rodata PT_LOAD FLAGS(4); /* R__ */ ++#endif + data PT_LOAD FLAGS(6); /* RW_ */ +-#ifdef CONFIG_X86_64 ++ init.begin PT_LOAD FLAGS(6); /* RW_ */ + #ifdef CONFIG_SMP + percpu PT_LOAD FLAGS(6); /* RW_ */ + #endif ++ text.init PT_LOAD FLAGS(5); /* R_E */ ++ text.exit PT_LOAD FLAGS(5); /* R_E */ + init PT_LOAD FLAGS(7); /* RWE */ +-#endif + note PT_NOTE FLAGS(0); /* ___ */ + } + + SECTIONS + { + #ifdef CONFIG_X86_32 +- . = LOAD_OFFSET + LOAD_PHYSICAL_ADDR; +- phys_startup_32 = startup_32 - LOAD_OFFSET; ++ . = LOAD_OFFSET + ____LOAD_PHYSICAL_ADDR; + #else +- . = __START_KERNEL; +- phys_startup_64 = startup_64 - LOAD_OFFSET; ++ . = __START_KERNEL; + #endif + + /* Text and read-only data */ +- .text : AT(ADDR(.text) - LOAD_OFFSET) { +- _text = .; ++ .text (. - __KERNEL_TEXT_OFFSET): AT(ADDR(.text) - LOAD_OFFSET + __KERNEL_TEXT_OFFSET) { + /* bootstrapping code */ ++#ifdef CONFIG_X86_32 ++ phys_startup_32 = startup_32 - LOAD_OFFSET + __KERNEL_TEXT_OFFSET; ++#else ++ phys_startup_64 = startup_64 - LOAD_OFFSET + __KERNEL_TEXT_OFFSET; ++#endif ++ __LOAD_PHYSICAL_ADDR = . - LOAD_OFFSET + __KERNEL_TEXT_OFFSET; ++ _text = .; + HEAD_TEXT + . = ALIGN(8); + _stext = .; +@@ -104,13 +124,47 @@ SECTIONS + IRQENTRY_TEXT + *(.fixup) + *(.gnu.warning) +- /* End of text section */ +- _etext = .; + } :text = 0x9090 + +- NOTES :text :note ++ . += __KERNEL_TEXT_OFFSET; ++ ++#ifdef CONFIG_X86_32 ++ . = ALIGN(PAGE_SIZE); ++ .module.text : AT(ADDR(.module.text) - LOAD_OFFSET) { ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ MODULES_EXEC_VADDR = .; ++ BYTE(0) ++ . += (CONFIG_PAX_KERNEXEC_MODULE_TEXT * 1024 * 1024); ++ . = ALIGN(HPAGE_SIZE) - 1; ++ MODULES_EXEC_END = .; ++#endif ++ ++ } :module ++#endif + +- EXCEPTION_TABLE(16) :text = 0x9090 ++ .text.end : AT(ADDR(.text.end) - LOAD_OFFSET) { ++ /* End of text section */ ++ BYTE(0) ++ _etext = . - __KERNEL_TEXT_OFFSET; ++ } ++ ++#ifdef CONFIG_X86_32 ++ . = ALIGN(PAGE_SIZE); ++ .rodata.page_aligned : AT(ADDR(.rodata.page_aligned) - LOAD_OFFSET) { ++ . = ALIGN(PAGE_SIZE); ++ *(.empty_zero_page) ++ *(.initial_pg_fixmap) ++ *(.initial_pg_pmd) ++ *(.initial_page_table) ++ *(.swapper_pg_dir) ++ } :rodata ++#endif ++ ++ . = ALIGN(PAGE_SIZE); ++ NOTES :rodata :note ++ ++ EXCEPTION_TABLE(16) :rodata + + #if defined(CONFIG_DEBUG_RODATA) + /* .text should occupy whole number of pages */ +@@ -122,16 +176,20 @@ SECTIONS + + /* Data */ + .data : AT(ADDR(.data) - LOAD_OFFSET) { ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ . = ALIGN(HPAGE_SIZE); ++#else ++ . = ALIGN(PAGE_SIZE); ++#endif ++ + /* Start of data section */ + _sdata = .; + + /* init_task */ + INIT_TASK_DATA(THREAD_SIZE) + +-#ifdef CONFIG_X86_32 +- /* 32 bit has nosave before _edata */ + NOSAVE_DATA +-#endif + + PAGE_ALIGNED_DATA(PAGE_SIZE) + +@@ -174,12 +232,19 @@ SECTIONS + . = ALIGN(__vvar_page + PAGE_SIZE, PAGE_SIZE); + + /* Init code and data - will be freed after init */ +- . = ALIGN(PAGE_SIZE); + .init.begin : AT(ADDR(.init.begin) - LOAD_OFFSET) { ++ BYTE(0) ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ . = ALIGN(HPAGE_SIZE); ++#else ++ . = ALIGN(PAGE_SIZE); ++#endif ++ + __init_begin = .; /* paired with __init_end */ +- } ++ } :init.begin + +-#if defined(CONFIG_X86_64) && defined(CONFIG_SMP) ++#ifdef CONFIG_SMP + /* + * percpu offsets are zero-based on SMP. PERCPU_VADDR() changes the + * output PHDR, so the next output section - .init.text - should +@@ -188,12 +253,27 @@ SECTIONS + PERCPU_VADDR(INTERNODE_CACHE_BYTES, 0, :percpu) + #endif + +- INIT_TEXT_SECTION(PAGE_SIZE) +-#ifdef CONFIG_X86_64 +- :init +-#endif ++ . = ALIGN(PAGE_SIZE); ++ init_begin = .; ++ .init.text (. - __KERNEL_TEXT_OFFSET): AT(init_begin - LOAD_OFFSET) { ++ VMLINUX_SYMBOL(_sinittext) = .; ++ INIT_TEXT ++ . = ALIGN(PAGE_SIZE); ++ } :text.init + +- INIT_DATA_SECTION(16) ++ /* ++ * .exit.text is discard at runtime, not link time, to deal with ++ * references from .altinstructions and .eh_frame ++ */ ++ .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET + __KERNEL_TEXT_OFFSET) { ++ EXIT_TEXT ++ VMLINUX_SYMBOL(_einittext) = .; ++ . = ALIGN(16); ++ } :text.exit ++ . = init_begin + SIZEOF(.init.text) + SIZEOF(.exit.text); ++ ++ . = ALIGN(PAGE_SIZE); ++ INIT_DATA_SECTION(16) :init + + .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { + __x86_cpu_dev_start = .; +@@ -264,19 +344,12 @@ SECTIONS + } + + . = ALIGN(8); +- /* +- * .exit.text is discard at runtime, not link time, to deal with +- * references from .altinstructions and .eh_frame +- */ +- .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { +- EXIT_TEXT +- } + + .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { + EXIT_DATA + } + +-#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP) ++#ifndef CONFIG_SMP + PERCPU_SECTION(INTERNODE_CACHE_BYTES) + #endif + +@@ -295,16 +368,10 @@ SECTIONS + .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) { + __smp_locks = .; + *(.smp_locks) +- . = ALIGN(PAGE_SIZE); + __smp_locks_end = .; ++ . = ALIGN(PAGE_SIZE); + } + +-#ifdef CONFIG_X86_64 +- .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { +- NOSAVE_DATA +- } +-#endif +- + /* BSS */ + . = ALIGN(PAGE_SIZE); + .bss : AT(ADDR(.bss) - LOAD_OFFSET) { +@@ -320,6 +387,7 @@ SECTIONS + __brk_base = .; + . += 64 * 1024; /* 64k alignment slop space */ + *(.brk_reservation) /* areas brk users have reserved */ ++ . = ALIGN(HPAGE_SIZE); + __brk_limit = .; + } + +@@ -346,13 +414,12 @@ SECTIONS + * for the boot processor. + */ + #define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load +-INIT_PER_CPU(gdt_page); + INIT_PER_CPU(irq_stack_union); + + /* + * Build-time check on the image size: + */ +-. = ASSERT((_end - _text <= KERNEL_IMAGE_SIZE), ++. = ASSERT((_end - _text - __KERNEL_TEXT_OFFSET <= KERNEL_IMAGE_SIZE), + "kernel image bigger than KERNEL_IMAGE_SIZE"); + + #ifdef CONFIG_SMP +diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c +index 957779f..74e405c 100644 +--- a/arch/x86/kernel/vsyscall_64.c ++++ b/arch/x86/kernel/vsyscall_64.c +@@ -54,15 +54,13 @@ + + DEFINE_VVAR(int, vgetcpu_mode); + +-static enum { EMULATE, NATIVE, NONE } vsyscall_mode = EMULATE; ++static enum { EMULATE, NONE } vsyscall_mode = EMULATE; + + static int __init vsyscall_setup(char *str) + { + if (str) { + if (!strcmp("emulate", str)) + vsyscall_mode = EMULATE; +- else if (!strcmp("native", str)) +- vsyscall_mode = NATIVE; + else if (!strcmp("none", str)) + vsyscall_mode = NONE; + else +@@ -279,8 +277,7 @@ do_ret: + return true; + + sigsegv: +- force_sig(SIGSEGV, current); +- return true; ++ do_group_exit(SIGKILL); + } + + /* +@@ -331,10 +328,7 @@ void __init map_vsyscall(void) + extern char __vsyscall_page; + unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page); + +- __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall, +- vsyscall_mode == NATIVE +- ? PAGE_KERNEL_VSYSCALL +- : PAGE_KERNEL_VVAR); ++ __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall, PAGE_KERNEL_VVAR); + BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) != + (unsigned long)VSYSCALL_ADDR); + } +diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c +index 0406819..4d75aa6 100644 +--- a/arch/x86/kernel/x8664_ksyms_64.c ++++ b/arch/x86/kernel/x8664_ksyms_64.c +@@ -34,8 +34,6 @@ EXPORT_SYMBOL(copy_user_generic_string); + EXPORT_SYMBOL(copy_user_generic_unrolled); + EXPORT_SYMBOL(copy_user_enhanced_fast_string); + EXPORT_SYMBOL(__copy_user_nocache); +-EXPORT_SYMBOL(_copy_from_user); +-EXPORT_SYMBOL(_copy_to_user); + + EXPORT_SYMBOL(copy_page); + EXPORT_SYMBOL(clear_page); +@@ -73,3 +71,7 @@ EXPORT_SYMBOL(___preempt_schedule); + EXPORT_SYMBOL(___preempt_schedule_context); + #endif + #endif ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++EXPORT_SYMBOL(cpu_pgd); ++#endif +diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c +index e48b674..a451dd9 100644 +--- a/arch/x86/kernel/x86_init.c ++++ b/arch/x86/kernel/x86_init.c +@@ -93,7 +93,7 @@ struct x86_cpuinit_ops x86_cpuinit = { + static void default_nmi_init(void) { }; + static int default_i8042_detect(void) { return 1; }; + +-struct x86_platform_ops x86_platform = { ++struct x86_platform_ops x86_platform __read_only = { + .calibrate_tsc = native_calibrate_tsc, + .get_wallclock = mach_get_cmos_time, + .set_wallclock = mach_set_rtc_mmss, +@@ -109,7 +109,7 @@ struct x86_platform_ops x86_platform = { + EXPORT_SYMBOL_GPL(x86_platform); + + #if defined(CONFIG_PCI_MSI) +-struct x86_msi_ops x86_msi = { ++struct x86_msi_ops x86_msi __read_only = { + .setup_msi_irqs = native_setup_msi_irqs, + .compose_msi_msg = native_compose_msi_msg, + .teardown_msi_irq = native_teardown_msi_irq, +@@ -150,7 +150,7 @@ u32 arch_msix_mask_irq(struct msi_desc *desc, u32 flag) + } + #endif + +-struct x86_io_apic_ops x86_io_apic_ops = { ++struct x86_io_apic_ops x86_io_apic_ops __read_only = { + .init = native_io_apic_init_mappings, + .read = native_io_apic_read, + .write = native_io_apic_write, +diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c +index 8be1e17..07dd990 100644 +--- a/arch/x86/kernel/xsave.c ++++ b/arch/x86/kernel/xsave.c +@@ -167,18 +167,18 @@ static inline int save_xstate_epilog(void __user *buf, int ia32_frame) + + /* Setup the bytes not touched by the [f]xsave and reserved for SW. */ + sw_bytes = ia32_frame ? &fx_sw_reserved_ia32 : &fx_sw_reserved; +- err = __copy_to_user(&x->i387.sw_reserved, sw_bytes, sizeof(*sw_bytes)); ++ err = __copy_to_user(x->i387.sw_reserved, sw_bytes, sizeof(*sw_bytes)); + + if (!use_xsave()) + return err; + +- err |= __put_user(FP_XSTATE_MAGIC2, (__u32 *)(buf + xstate_size)); ++ err |= __put_user(FP_XSTATE_MAGIC2, (__u32 __user *)(buf + xstate_size)); + + /* + * Read the xstate_bv which we copied (directly from the cpu or + * from the state in task struct) to the user buffers. + */ +- err |= __get_user(xstate_bv, (__u32 *)&x->xsave_hdr.xstate_bv); ++ err |= __get_user(xstate_bv, (__u32 __user *)&x->xsave_hdr.xstate_bv); + + /* + * For legacy compatible, we always set FP/SSE bits in the bit +@@ -193,7 +193,7 @@ static inline int save_xstate_epilog(void __user *buf, int ia32_frame) + */ + xstate_bv |= XSTATE_FPSSE; + +- err |= __put_user(xstate_bv, (__u32 *)&x->xsave_hdr.xstate_bv); ++ err |= __put_user(xstate_bv, (__u32 __user *)&x->xsave_hdr.xstate_bv); + + return err; + } +@@ -202,6 +202,7 @@ static inline int save_user_xstate(struct xsave_struct __user *buf) + { + int err; + ++ buf = (struct xsave_struct __user *)____m(buf); + if (use_xsave()) + err = xsave_user(buf); + else if (use_fxsr()) +@@ -312,6 +313,7 @@ sanitize_restored_xstate(struct task_struct *tsk, + */ + static inline int restore_user_xstate(void __user *buf, u64 xbv, int fx_only) + { ++ buf = (void __user *)____m(buf); + if (use_xsave()) { + if ((unsigned long)buf % 64 || fx_only) { + u64 init_bv = pcntxt_mask & ~XSTATE_FPSSE; +diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c +index 88f9201..0e7f1a3 100644 +--- a/arch/x86/kvm/cpuid.c ++++ b/arch/x86/kvm/cpuid.c +@@ -175,15 +175,20 @@ int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu, + struct kvm_cpuid2 *cpuid, + struct kvm_cpuid_entry2 __user *entries) + { +- int r; ++ int r, i; + + r = -E2BIG; + if (cpuid->nent > KVM_MAX_CPUID_ENTRIES) + goto out; + r = -EFAULT; +- if (copy_from_user(&vcpu->arch.cpuid_entries, entries, +- cpuid->nent * sizeof(struct kvm_cpuid_entry2))) ++ if (!access_ok(VERIFY_READ, entries, cpuid->nent * sizeof(struct kvm_cpuid_entry2))) + goto out; ++ for (i = 0; i < cpuid->nent; ++i) { ++ struct kvm_cpuid_entry2 cpuid_entry; ++ if (__copy_from_user(&cpuid_entry, entries + i, sizeof(cpuid_entry))) ++ goto out; ++ vcpu->arch.cpuid_entries[i] = cpuid_entry; ++ } + vcpu->arch.cpuid_nent = cpuid->nent; + kvm_apic_set_version(vcpu); + kvm_x86_ops->cpuid_update(vcpu); +@@ -196,15 +201,19 @@ int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu, + struct kvm_cpuid2 *cpuid, + struct kvm_cpuid_entry2 __user *entries) + { +- int r; ++ int r, i; + + r = -E2BIG; + if (cpuid->nent < vcpu->arch.cpuid_nent) + goto out; + r = -EFAULT; +- if (copy_to_user(entries, &vcpu->arch.cpuid_entries, +- vcpu->arch.cpuid_nent * sizeof(struct kvm_cpuid_entry2))) ++ if (!access_ok(VERIFY_WRITE, entries, vcpu->arch.cpuid_nent * sizeof(struct kvm_cpuid_entry2))) + goto out; ++ for (i = 0; i < vcpu->arch.cpuid_nent; ++i) { ++ struct kvm_cpuid_entry2 cpuid_entry = vcpu->arch.cpuid_entries[i]; ++ if (__copy_to_user(entries + i, &cpuid_entry, sizeof(cpuid_entry))) ++ goto out; ++ } + return 0; + + out: +diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c +index 974e4d9..86e5069 100644 +--- a/arch/x86/kvm/emulate.c ++++ b/arch/x86/kvm/emulate.c +@@ -3508,7 +3508,7 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt) + int cr = ctxt->modrm_reg; + u64 efer = 0; + +- static u64 cr_reserved_bits[] = { ++ static const u64 cr_reserved_bits[] = { + 0xffffffff00000000ULL, + 0, 0, 0, /* CR3 checked later */ + CR4_RESERVED_BITS, +@@ -3543,7 +3543,7 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt) + + ctxt->ops->get_msr(ctxt, MSR_EFER, &efer); + if (efer & EFER_LMA) +- rsvd = CR3_L_MODE_RESERVED_BITS; ++ rsvd = CR3_L_MODE_RESERVED_BITS & ~CR3_PCID_INVD; + + if (new_val & rsvd) + return emulate_gp(ctxt, 0); +diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c +index b8345dd..f225d71 100644 +--- a/arch/x86/kvm/lapic.c ++++ b/arch/x86/kvm/lapic.c +@@ -55,7 +55,7 @@ + #define APIC_BUS_CYCLE_NS 1 + + /* #define apic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg) */ +-#define apic_debug(fmt, arg...) ++#define apic_debug(fmt, arg...) do {} while (0) + + #define APIC_LVT_NUM 6 + /* 14 is the version for Xeon and Pentium 8.4.8*/ +diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h +index fd49c86..77e1aa0 100644 +--- a/arch/x86/kvm/paging_tmpl.h ++++ b/arch/x86/kvm/paging_tmpl.h +@@ -343,7 +343,7 @@ retry_walk: + if (unlikely(kvm_is_error_hva(host_addr))) + goto error; + +- ptep_user = (pt_element_t __user *)((void *)host_addr + offset); ++ ptep_user = (pt_element_t __force_user *)((void *)host_addr + offset); + if (unlikely(__copy_from_user(&pte, ptep_user, sizeof(pte)))) + goto error; + walker->ptep_user[walker->level - 1] = ptep_user; +diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c +index 7527cef..c63a838 100644 +--- a/arch/x86/kvm/svm.c ++++ b/arch/x86/kvm/svm.c +@@ -3564,7 +3564,11 @@ static void reload_tss(struct kvm_vcpu *vcpu) + int cpu = raw_smp_processor_id(); + + struct svm_cpu_data *sd = per_cpu(svm_data, cpu); ++ ++ pax_open_kernel(); + sd->tss_desc->type = 9; /* available 32/64-bit TSS */ ++ pax_close_kernel(); ++ + load_TR_desc(); + } + +@@ -3965,6 +3969,10 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) + #endif + #endif + ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ __set_fs(current_thread_info()->addr_limit); ++#endif ++ + reload_tss(vcpu); + + local_irq_disable(); +diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c +index ed70394..c629a68 100644 +--- a/arch/x86/kvm/vmx.c ++++ b/arch/x86/kvm/vmx.c +@@ -1366,12 +1366,12 @@ static void vmcs_write64(unsigned long field, u64 value) + #endif + } + +-static void vmcs_clear_bits(unsigned long field, u32 mask) ++static void vmcs_clear_bits(unsigned long field, unsigned long mask) + { + vmcs_writel(field, vmcs_readl(field) & ~mask); + } + +-static void vmcs_set_bits(unsigned long field, u32 mask) ++static void vmcs_set_bits(unsigned long field, unsigned long mask) + { + vmcs_writel(field, vmcs_readl(field) | mask); + } +@@ -1631,7 +1631,11 @@ static void reload_tss(void) + struct desc_struct *descs; + + descs = (void *)gdt->address; ++ ++ pax_open_kernel(); + descs[GDT_ENTRY_TSS].type = 9; /* available TSS */ ++ pax_close_kernel(); ++ + load_TR_desc(); + } + +@@ -1859,6 +1863,10 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu) + vmcs_writel(HOST_TR_BASE, kvm_read_tr_base()); /* 22.2.4 */ + vmcs_writel(HOST_GDTR_BASE, gdt->address); /* 22.2.4 */ + ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ vmcs_writel(HOST_CR3, read_cr3()); /* 22.2.3 FIXME: shadow tables */ ++#endif ++ + rdmsrl(MSR_IA32_SYSENTER_ESP, sysenter_esp); + vmcs_writel(HOST_IA32_SYSENTER_ESP, sysenter_esp); /* 22.2.3 */ + vmx->loaded_vmcs->cpu = cpu; +@@ -2148,7 +2156,7 @@ static void setup_msrs(struct vcpu_vmx *vmx) + * reads and returns guest's timestamp counter "register" + * guest_tsc = host_tsc + tsc_offset -- 21.3 + */ +-static u64 guest_read_tsc(void) ++static u64 __intentional_overflow(-1) guest_read_tsc(void) + { + u64 host_tsc, tsc_offset; + +@@ -3146,11 +3154,16 @@ static __init int hardware_setup(void) + * page upon invalidation. No need to do anything if the + * processor does not have the APIC_ACCESS_ADDR VMCS field. + */ +- kvm_x86_ops->set_apic_access_page_addr = NULL; ++ pax_open_kernel(); ++ *(void **)&kvm_x86_ops->set_apic_access_page_addr = NULL; ++ pax_close_kernel(); + } + +- if (!cpu_has_vmx_tpr_shadow()) +- kvm_x86_ops->update_cr8_intercept = NULL; ++ if (!cpu_has_vmx_tpr_shadow()) { ++ pax_open_kernel(); ++ *(void **)&kvm_x86_ops->update_cr8_intercept = NULL; ++ pax_close_kernel(); ++ } + + if (enable_ept && !cpu_has_vmx_ept_2m_page()) + kvm_disable_largepages(); +@@ -3161,13 +3174,15 @@ static __init int hardware_setup(void) + if (!cpu_has_vmx_apicv()) + enable_apicv = 0; + ++ pax_open_kernel(); + if (enable_apicv) +- kvm_x86_ops->update_cr8_intercept = NULL; ++ *(void **)&kvm_x86_ops->update_cr8_intercept = NULL; + else { +- kvm_x86_ops->hwapic_irr_update = NULL; +- kvm_x86_ops->deliver_posted_interrupt = NULL; +- kvm_x86_ops->sync_pir_to_irr = vmx_sync_pir_to_irr_dummy; ++ *(void **)&kvm_x86_ops->hwapic_irr_update = NULL; ++ *(void **)&kvm_x86_ops->deliver_posted_interrupt = NULL; ++ *(void **)&kvm_x86_ops->sync_pir_to_irr = vmx_sync_pir_to_irr_dummy; + } ++ pax_close_kernel(); + + if (nested) + nested_vmx_setup_ctls_msrs(); +@@ -4274,7 +4289,10 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx) + unsigned long cr4; + + vmcs_writel(HOST_CR0, read_cr0() & ~X86_CR0_TS); /* 22.2.3 */ ++ ++#ifndef CONFIG_PAX_PER_CPU_PGD + vmcs_writel(HOST_CR3, read_cr3()); /* 22.2.3 FIXME: shadow tables */ ++#endif + + /* Save the most likely value for this task's CR4 in the VMCS. */ + cr4 = read_cr4(); +@@ -4301,7 +4319,7 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx) + vmcs_writel(HOST_IDTR_BASE, dt.address); /* 22.2.4 */ + vmx->host_idt_base = dt.address; + +- vmcs_writel(HOST_RIP, vmx_return); /* 22.2.5 */ ++ vmcs_writel(HOST_RIP, ktla_ktva(vmx_return)); /* 22.2.5 */ + + rdmsr(MSR_IA32_SYSENTER_CS, low32, high32); + vmcs_write32(HOST_IA32_SYSENTER_CS, low32); +@@ -7622,6 +7640,12 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) + "jmp 2f \n\t" + "1: " __ex(ASM_VMX_VMRESUME) "\n\t" + "2: " ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ "ljmp %[cs],$3f\n\t" ++ "3: " ++#endif ++ + /* Save guest registers, load host registers, keep flags */ + "mov %0, %c[wordsize](%%" _ASM_SP ") \n\t" + "pop %0 \n\t" +@@ -7674,6 +7698,11 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) + #endif + [cr2]"i"(offsetof(struct vcpu_vmx, vcpu.arch.cr2)), + [wordsize]"i"(sizeof(ulong)) ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ ,[cs]"i"(__KERNEL_CS) ++#endif ++ + : "cc", "memory" + #ifdef CONFIG_X86_64 + , "rax", "rbx", "rdi", "rsi" +@@ -7687,7 +7716,7 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) + if (debugctlmsr) + update_debugctlmsr(debugctlmsr); + +-#ifndef CONFIG_X86_64 ++#ifdef CONFIG_X86_32 + /* + * The sysexit path does not restore ds/es, so we must set them to + * a reasonable value ourselves. +@@ -7696,8 +7725,18 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) + * may be executed in interrupt context, which saves and restore segments + * around it, nullifying its effect. + */ +- loadsegment(ds, __USER_DS); +- loadsegment(es, __USER_DS); ++ loadsegment(ds, __KERNEL_DS); ++ loadsegment(es, __KERNEL_DS); ++ loadsegment(ss, __KERNEL_DS); ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ loadsegment(fs, __KERNEL_PERCPU); ++#endif ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ __set_fs(current_thread_info()->addr_limit); ++#endif ++ + #endif + + vcpu->arch.regs_avail = ~((1 << VCPU_REGS_RIP) | (1 << VCPU_REGS_RSP) +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index a38dd81..6907315 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -732,6 +732,8 @@ EXPORT_SYMBOL_GPL(kvm_set_cr4); + + int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) + { ++ cr3 &= ~CR3_PCID_INVD; ++ + if (cr3 == kvm_read_cr3(vcpu) && !pdptrs_changed(vcpu)) { + kvm_mmu_sync_roots(vcpu); + kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu); +@@ -1879,8 +1881,8 @@ static int xen_hvm_config(struct kvm_vcpu *vcpu, u64 data) + { + struct kvm *kvm = vcpu->kvm; + int lm = is_long_mode(vcpu); +- u8 *blob_addr = lm ? (u8 *)(long)kvm->arch.xen_hvm_config.blob_addr_64 +- : (u8 *)(long)kvm->arch.xen_hvm_config.blob_addr_32; ++ u8 __user *blob_addr = lm ? (u8 __user *)(long)kvm->arch.xen_hvm_config.blob_addr_64 ++ : (u8 __user *)(long)kvm->arch.xen_hvm_config.blob_addr_32; + u8 blob_size = lm ? kvm->arch.xen_hvm_config.blob_size_64 + : kvm->arch.xen_hvm_config.blob_size_32; + u32 page_num = data & ~PAGE_MASK; +@@ -2806,6 +2808,8 @@ long kvm_arch_dev_ioctl(struct file *filp, + if (n < msr_list.nmsrs) + goto out; + r = -EFAULT; ++ if (num_msrs_to_save > ARRAY_SIZE(msrs_to_save)) ++ goto out; + if (copy_to_user(user_msr_list->indices, &msrs_to_save, + num_msrs_to_save * sizeof(u32))) + goto out; +@@ -5743,7 +5747,7 @@ static struct notifier_block pvclock_gtod_notifier = { + }; + #endif + +-int kvm_arch_init(void *opaque) ++int kvm_arch_init(const void *opaque) + { + int r; + struct kvm_x86_ops *ops = opaque; +diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c +index aae9413..d11e829 100644 +--- a/arch/x86/lguest/boot.c ++++ b/arch/x86/lguest/boot.c +@@ -1206,9 +1206,10 @@ static __init int early_put_chars(u32 vtermno, const char *buf, int count) + * Rebooting also tells the Host we're finished, but the RESTART flag tells the + * Launcher to reboot us. + */ +-static void lguest_restart(char *reason) ++static __noreturn void lguest_restart(char *reason) + { + hcall(LHCALL_SHUTDOWN, __pa(reason), LGUEST_SHUTDOWN_RESTART, 0, 0); ++ BUG(); + } + + /*G:050 +diff --git a/arch/x86/lib/atomic64_386_32.S b/arch/x86/lib/atomic64_386_32.S +index 00933d5..3a64af9 100644 +--- a/arch/x86/lib/atomic64_386_32.S ++++ b/arch/x86/lib/atomic64_386_32.S +@@ -48,6 +48,10 @@ BEGIN(read) + movl (v), %eax + movl 4(v), %edx + RET_ENDP ++BEGIN(read_unchecked) ++ movl (v), %eax ++ movl 4(v), %edx ++RET_ENDP + #undef v + + #define v %esi +@@ -55,6 +59,10 @@ BEGIN(set) + movl %ebx, (v) + movl %ecx, 4(v) + RET_ENDP ++BEGIN(set_unchecked) ++ movl %ebx, (v) ++ movl %ecx, 4(v) ++RET_ENDP + #undef v + + #define v %esi +@@ -70,6 +78,20 @@ RET_ENDP + BEGIN(add) + addl %eax, (v) + adcl %edx, 4(v) ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ jno 0f ++ subl %eax, (v) ++ sbbl %edx, 4(v) ++ int $4 ++0: ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++RET_ENDP ++BEGIN(add_unchecked) ++ addl %eax, (v) ++ adcl %edx, 4(v) + RET_ENDP + #undef v + +@@ -77,6 +99,24 @@ RET_ENDP + BEGIN(add_return) + addl (v), %eax + adcl 4(v), %edx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 2f) ++#endif ++ ++ movl %eax, (v) ++ movl %edx, 4(v) ++ ++#ifdef CONFIG_PAX_REFCOUNT ++2: ++#endif ++ ++RET_ENDP ++BEGIN(add_return_unchecked) ++ addl (v), %eax ++ adcl 4(v), %edx + movl %eax, (v) + movl %edx, 4(v) + RET_ENDP +@@ -86,6 +126,20 @@ RET_ENDP + BEGIN(sub) + subl %eax, (v) + sbbl %edx, 4(v) ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ jno 0f ++ addl %eax, (v) ++ adcl %edx, 4(v) ++ int $4 ++0: ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++RET_ENDP ++BEGIN(sub_unchecked) ++ subl %eax, (v) ++ sbbl %edx, 4(v) + RET_ENDP + #undef v + +@@ -96,6 +150,27 @@ BEGIN(sub_return) + sbbl $0, %edx + addl (v), %eax + adcl 4(v), %edx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 2f) ++#endif ++ ++ movl %eax, (v) ++ movl %edx, 4(v) ++ ++#ifdef CONFIG_PAX_REFCOUNT ++2: ++#endif ++ ++RET_ENDP ++BEGIN(sub_return_unchecked) ++ negl %edx ++ negl %eax ++ sbbl $0, %edx ++ addl (v), %eax ++ adcl 4(v), %edx + movl %eax, (v) + movl %edx, 4(v) + RET_ENDP +@@ -105,6 +180,20 @@ RET_ENDP + BEGIN(inc) + addl $1, (v) + adcl $0, 4(v) ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ jno 0f ++ subl $1, (v) ++ sbbl $0, 4(v) ++ int $4 ++0: ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++RET_ENDP ++BEGIN(inc_unchecked) ++ addl $1, (v) ++ adcl $0, 4(v) + RET_ENDP + #undef v + +@@ -114,6 +203,26 @@ BEGIN(inc_return) + movl 4(v), %edx + addl $1, %eax + adcl $0, %edx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 2f) ++#endif ++ ++ movl %eax, (v) ++ movl %edx, 4(v) ++ ++#ifdef CONFIG_PAX_REFCOUNT ++2: ++#endif ++ ++RET_ENDP ++BEGIN(inc_return_unchecked) ++ movl (v), %eax ++ movl 4(v), %edx ++ addl $1, %eax ++ adcl $0, %edx + movl %eax, (v) + movl %edx, 4(v) + RET_ENDP +@@ -123,6 +232,20 @@ RET_ENDP + BEGIN(dec) + subl $1, (v) + sbbl $0, 4(v) ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ jno 0f ++ addl $1, (v) ++ adcl $0, 4(v) ++ int $4 ++0: ++ _ASM_EXTABLE(0b, 0b) ++#endif ++ ++RET_ENDP ++BEGIN(dec_unchecked) ++ subl $1, (v) ++ sbbl $0, 4(v) + RET_ENDP + #undef v + +@@ -132,6 +255,26 @@ BEGIN(dec_return) + movl 4(v), %edx + subl $1, %eax + sbbl $0, %edx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 2f) ++#endif ++ ++ movl %eax, (v) ++ movl %edx, 4(v) ++ ++#ifdef CONFIG_PAX_REFCOUNT ++2: ++#endif ++ ++RET_ENDP ++BEGIN(dec_return_unchecked) ++ movl (v), %eax ++ movl 4(v), %edx ++ subl $1, %eax ++ sbbl $0, %edx + movl %eax, (v) + movl %edx, 4(v) + RET_ENDP +@@ -143,6 +286,13 @@ BEGIN(add_unless) + adcl %edx, %edi + addl (v), %eax + adcl 4(v), %edx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 2f) ++#endif ++ + cmpl %eax, %ecx + je 3f + 1: +@@ -168,6 +318,13 @@ BEGIN(inc_not_zero) + 1: + addl $1, %eax + adcl $0, %edx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 2f) ++#endif ++ + movl %eax, (v) + movl %edx, 4(v) + movl $1, %eax +@@ -186,6 +343,13 @@ BEGIN(dec_if_positive) + movl 4(v), %edx + subl $1, %eax + sbbl $0, %edx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 1f) ++#endif ++ + js 1f + movl %eax, (v) + movl %edx, 4(v) +diff --git a/arch/x86/lib/atomic64_cx8_32.S b/arch/x86/lib/atomic64_cx8_32.S +index f5cc9eb..51fa319 100644 +--- a/arch/x86/lib/atomic64_cx8_32.S ++++ b/arch/x86/lib/atomic64_cx8_32.S +@@ -35,10 +35,20 @@ ENTRY(atomic64_read_cx8) + CFI_STARTPROC + + read64 %ecx ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(atomic64_read_cx8) + ++ENTRY(atomic64_read_unchecked_cx8) ++ CFI_STARTPROC ++ ++ read64 %ecx ++ pax_force_retaddr ++ ret ++ CFI_ENDPROC ++ENDPROC(atomic64_read_unchecked_cx8) ++ + ENTRY(atomic64_set_cx8) + CFI_STARTPROC + +@@ -48,10 +58,25 @@ ENTRY(atomic64_set_cx8) + cmpxchg8b (%esi) + jne 1b + ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(atomic64_set_cx8) + ++ENTRY(atomic64_set_unchecked_cx8) ++ CFI_STARTPROC ++ ++1: ++/* we don't need LOCK_PREFIX since aligned 64-bit writes ++ * are atomic on 586 and newer */ ++ cmpxchg8b (%esi) ++ jne 1b ++ ++ pax_force_retaddr ++ ret ++ CFI_ENDPROC ++ENDPROC(atomic64_set_unchecked_cx8) ++ + ENTRY(atomic64_xchg_cx8) + CFI_STARTPROC + +@@ -60,12 +85,13 @@ ENTRY(atomic64_xchg_cx8) + cmpxchg8b (%esi) + jne 1b + ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(atomic64_xchg_cx8) + +-.macro addsub_return func ins insc +-ENTRY(atomic64_\func\()_return_cx8) ++.macro addsub_return func ins insc unchecked="" ++ENTRY(atomic64_\func\()_return\unchecked\()_cx8) + CFI_STARTPROC + SAVE ebp + SAVE ebx +@@ -82,27 +108,44 @@ ENTRY(atomic64_\func\()_return_cx8) + movl %edx, %ecx + \ins\()l %esi, %ebx + \insc\()l %edi, %ecx ++ ++.ifb \unchecked ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++2: ++ _ASM_EXTABLE(2b, 3f) ++#endif ++.endif ++ + LOCK_PREFIX + cmpxchg8b (%ebp) + jne 1b +- +-10: + movl %ebx, %eax + movl %ecx, %edx ++ ++.ifb \unchecked ++#ifdef CONFIG_PAX_REFCOUNT ++3: ++#endif ++.endif ++ + RESTORE edi + RESTORE esi + RESTORE ebx + RESTORE ebp ++ pax_force_retaddr + ret + CFI_ENDPROC +-ENDPROC(atomic64_\func\()_return_cx8) ++ENDPROC(atomic64_\func\()_return\unchecked\()_cx8) + .endm + + addsub_return add add adc + addsub_return sub sub sbb ++addsub_return add add adc _unchecked ++addsub_return sub sub sbb _unchecked + +-.macro incdec_return func ins insc +-ENTRY(atomic64_\func\()_return_cx8) ++.macro incdec_return func ins insc unchecked="" ++ENTRY(atomic64_\func\()_return\unchecked\()_cx8) + CFI_STARTPROC + SAVE ebx + +@@ -112,21 +155,39 @@ ENTRY(atomic64_\func\()_return_cx8) + movl %edx, %ecx + \ins\()l $1, %ebx + \insc\()l $0, %ecx ++ ++.ifb \unchecked ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++2: ++ _ASM_EXTABLE(2b, 3f) ++#endif ++.endif ++ + LOCK_PREFIX + cmpxchg8b (%esi) + jne 1b + +-10: + movl %ebx, %eax + movl %ecx, %edx ++ ++.ifb \unchecked ++#ifdef CONFIG_PAX_REFCOUNT ++3: ++#endif ++.endif ++ + RESTORE ebx ++ pax_force_retaddr + ret + CFI_ENDPROC +-ENDPROC(atomic64_\func\()_return_cx8) ++ENDPROC(atomic64_\func\()_return\unchecked\()_cx8) + .endm + + incdec_return inc add adc + incdec_return dec sub sbb ++incdec_return inc add adc _unchecked ++incdec_return dec sub sbb _unchecked + + ENTRY(atomic64_dec_if_positive_cx8) + CFI_STARTPROC +@@ -138,6 +199,13 @@ ENTRY(atomic64_dec_if_positive_cx8) + movl %edx, %ecx + subl $1, %ebx + sbb $0, %ecx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 2f) ++#endif ++ + js 2f + LOCK_PREFIX + cmpxchg8b (%esi) +@@ -147,6 +215,7 @@ ENTRY(atomic64_dec_if_positive_cx8) + movl %ebx, %eax + movl %ecx, %edx + RESTORE ebx ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(atomic64_dec_if_positive_cx8) +@@ -171,6 +240,13 @@ ENTRY(atomic64_add_unless_cx8) + movl %edx, %ecx + addl %ebp, %ebx + adcl %edi, %ecx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 3f) ++#endif ++ + LOCK_PREFIX + cmpxchg8b (%esi) + jne 1b +@@ -181,6 +257,7 @@ ENTRY(atomic64_add_unless_cx8) + CFI_ADJUST_CFA_OFFSET -8 + RESTORE ebx + RESTORE ebp ++ pax_force_retaddr + ret + 4: + cmpl %edx, 4(%esp) +@@ -203,6 +280,13 @@ ENTRY(atomic64_inc_not_zero_cx8) + xorl %ecx, %ecx + addl $1, %ebx + adcl %edx, %ecx ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ into ++1234: ++ _ASM_EXTABLE(1234b, 3f) ++#endif ++ + LOCK_PREFIX + cmpxchg8b (%esi) + jne 1b +@@ -210,6 +294,7 @@ ENTRY(atomic64_inc_not_zero_cx8) + movl $1, %eax + 3: + RESTORE ebx ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(atomic64_inc_not_zero_cx8) +diff --git a/arch/x86/lib/checksum_32.S b/arch/x86/lib/checksum_32.S +index e78b8ee..7e173a8 100644 +--- a/arch/x86/lib/checksum_32.S ++++ b/arch/x86/lib/checksum_32.S +@@ -29,7 +29,8 @@ + #include <asm/dwarf2.h> + #include <asm/errno.h> + #include <asm/asm.h> +- ++#include <asm/segment.h> ++ + /* + * computes a partial checksum, e.g. for TCP/UDP fragments + */ +@@ -293,9 +294,24 @@ unsigned int csum_partial_copy_generic (const char *src, char *dst, + + #define ARGBASE 16 + #define FP 12 +- +-ENTRY(csum_partial_copy_generic) ++ ++ENTRY(csum_partial_copy_generic_to_user) + CFI_STARTPROC ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ pushl_cfi %gs ++ popl_cfi %es ++ jmp csum_partial_copy_generic ++#endif ++ ++ENTRY(csum_partial_copy_generic_from_user) ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ pushl_cfi %gs ++ popl_cfi %ds ++#endif ++ ++ENTRY(csum_partial_copy_generic) + subl $4,%esp + CFI_ADJUST_CFA_OFFSET 4 + pushl_cfi %edi +@@ -317,7 +333,7 @@ ENTRY(csum_partial_copy_generic) + jmp 4f + SRC(1: movw (%esi), %bx ) + addl $2, %esi +-DST( movw %bx, (%edi) ) ++DST( movw %bx, %es:(%edi) ) + addl $2, %edi + addw %bx, %ax + adcl $0, %eax +@@ -329,30 +345,30 @@ DST( movw %bx, (%edi) ) + SRC(1: movl (%esi), %ebx ) + SRC( movl 4(%esi), %edx ) + adcl %ebx, %eax +-DST( movl %ebx, (%edi) ) ++DST( movl %ebx, %es:(%edi) ) + adcl %edx, %eax +-DST( movl %edx, 4(%edi) ) ++DST( movl %edx, %es:4(%edi) ) + + SRC( movl 8(%esi), %ebx ) + SRC( movl 12(%esi), %edx ) + adcl %ebx, %eax +-DST( movl %ebx, 8(%edi) ) ++DST( movl %ebx, %es:8(%edi) ) + adcl %edx, %eax +-DST( movl %edx, 12(%edi) ) ++DST( movl %edx, %es:12(%edi) ) + + SRC( movl 16(%esi), %ebx ) + SRC( movl 20(%esi), %edx ) + adcl %ebx, %eax +-DST( movl %ebx, 16(%edi) ) ++DST( movl %ebx, %es:16(%edi) ) + adcl %edx, %eax +-DST( movl %edx, 20(%edi) ) ++DST( movl %edx, %es:20(%edi) ) + + SRC( movl 24(%esi), %ebx ) + SRC( movl 28(%esi), %edx ) + adcl %ebx, %eax +-DST( movl %ebx, 24(%edi) ) ++DST( movl %ebx, %es:24(%edi) ) + adcl %edx, %eax +-DST( movl %edx, 28(%edi) ) ++DST( movl %edx, %es:28(%edi) ) + + lea 32(%esi), %esi + lea 32(%edi), %edi +@@ -366,7 +382,7 @@ DST( movl %edx, 28(%edi) ) + shrl $2, %edx # This clears CF + SRC(3: movl (%esi), %ebx ) + adcl %ebx, %eax +-DST( movl %ebx, (%edi) ) ++DST( movl %ebx, %es:(%edi) ) + lea 4(%esi), %esi + lea 4(%edi), %edi + dec %edx +@@ -378,12 +394,12 @@ DST( movl %ebx, (%edi) ) + jb 5f + SRC( movw (%esi), %cx ) + leal 2(%esi), %esi +-DST( movw %cx, (%edi) ) ++DST( movw %cx, %es:(%edi) ) + leal 2(%edi), %edi + je 6f + shll $16,%ecx + SRC(5: movb (%esi), %cl ) +-DST( movb %cl, (%edi) ) ++DST( movb %cl, %es:(%edi) ) + 6: addl %ecx, %eax + adcl $0, %eax + 7: +@@ -394,7 +410,7 @@ DST( movb %cl, (%edi) ) + + 6001: + movl ARGBASE+20(%esp), %ebx # src_err_ptr +- movl $-EFAULT, (%ebx) ++ movl $-EFAULT, %ss:(%ebx) + + # zero the complete destination - computing the rest + # is too much work +@@ -407,11 +423,15 @@ DST( movb %cl, (%edi) ) + + 6002: + movl ARGBASE+24(%esp), %ebx # dst_err_ptr +- movl $-EFAULT,(%ebx) ++ movl $-EFAULT,%ss:(%ebx) + jmp 5000b + + .previous + ++ pushl_cfi %ss ++ popl_cfi %ds ++ pushl_cfi %ss ++ popl_cfi %es + popl_cfi %ebx + CFI_RESTORE ebx + popl_cfi %esi +@@ -421,26 +441,43 @@ DST( movb %cl, (%edi) ) + popl_cfi %ecx # equivalent to addl $4,%esp + ret + CFI_ENDPROC +-ENDPROC(csum_partial_copy_generic) ++ENDPROC(csum_partial_copy_generic_to_user) + + #else + + /* Version for PentiumII/PPro */ + + #define ROUND1(x) \ ++ nop; nop; nop; \ + SRC(movl x(%esi), %ebx ) ; \ + addl %ebx, %eax ; \ +- DST(movl %ebx, x(%edi) ) ; ++ DST(movl %ebx, %es:x(%edi)) ; + + #define ROUND(x) \ ++ nop; nop; nop; \ + SRC(movl x(%esi), %ebx ) ; \ + adcl %ebx, %eax ; \ +- DST(movl %ebx, x(%edi) ) ; ++ DST(movl %ebx, %es:x(%edi)) ; + + #define ARGBASE 12 +- +-ENTRY(csum_partial_copy_generic) ++ ++ENTRY(csum_partial_copy_generic_to_user) + CFI_STARTPROC ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ pushl_cfi %gs ++ popl_cfi %es ++ jmp csum_partial_copy_generic ++#endif ++ ++ENTRY(csum_partial_copy_generic_from_user) ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ pushl_cfi %gs ++ popl_cfi %ds ++#endif ++ ++ENTRY(csum_partial_copy_generic) + pushl_cfi %ebx + CFI_REL_OFFSET ebx, 0 + pushl_cfi %edi +@@ -461,7 +498,7 @@ ENTRY(csum_partial_copy_generic) + subl %ebx, %edi + lea -1(%esi),%edx + andl $-32,%edx +- lea 3f(%ebx,%ebx), %ebx ++ lea 3f(%ebx,%ebx,2), %ebx + testl %esi, %esi + jmp *%ebx + 1: addl $64,%esi +@@ -482,19 +519,19 @@ ENTRY(csum_partial_copy_generic) + jb 5f + SRC( movw (%esi), %dx ) + leal 2(%esi), %esi +-DST( movw %dx, (%edi) ) ++DST( movw %dx, %es:(%edi) ) + leal 2(%edi), %edi + je 6f + shll $16,%edx + 5: + SRC( movb (%esi), %dl ) +-DST( movb %dl, (%edi) ) ++DST( movb %dl, %es:(%edi) ) + 6: addl %edx, %eax + adcl $0, %eax + 7: + .section .fixup, "ax" + 6001: movl ARGBASE+20(%esp), %ebx # src_err_ptr +- movl $-EFAULT, (%ebx) ++ movl $-EFAULT, %ss:(%ebx) + # zero the complete destination (computing the rest is too much work) + movl ARGBASE+8(%esp),%edi # dst + movl ARGBASE+12(%esp),%ecx # len +@@ -502,10 +539,17 @@ DST( movb %dl, (%edi) ) + rep; stosb + jmp 7b + 6002: movl ARGBASE+24(%esp), %ebx # dst_err_ptr +- movl $-EFAULT, (%ebx) ++ movl $-EFAULT, %ss:(%ebx) + jmp 7b + .previous + ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ pushl_cfi %ss ++ popl_cfi %ds ++ pushl_cfi %ss ++ popl_cfi %es ++#endif ++ + popl_cfi %esi + CFI_RESTORE esi + popl_cfi %edi +@@ -514,7 +558,7 @@ DST( movb %dl, (%edi) ) + CFI_RESTORE ebx + ret + CFI_ENDPROC +-ENDPROC(csum_partial_copy_generic) ++ENDPROC(csum_partial_copy_generic_to_user) + + #undef ROUND + #undef ROUND1 +diff --git a/arch/x86/lib/clear_page_64.S b/arch/x86/lib/clear_page_64.S +index f2145cf..cea889d 100644 +--- a/arch/x86/lib/clear_page_64.S ++++ b/arch/x86/lib/clear_page_64.S +@@ -11,6 +11,7 @@ ENTRY(clear_page_c) + movl $4096/8,%ecx + xorl %eax,%eax + rep stosq ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(clear_page_c) +@@ -20,6 +21,7 @@ ENTRY(clear_page_c_e) + movl $4096,%ecx + xorl %eax,%eax + rep stosb ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(clear_page_c_e) +@@ -43,6 +45,7 @@ ENTRY(clear_page) + leaq 64(%rdi),%rdi + jnz .Lloop + nop ++ pax_force_retaddr + ret + CFI_ENDPROC + .Lclear_page_end: +@@ -58,7 +61,7 @@ ENDPROC(clear_page) + + #include <asm/cpufeature.h> + +- .section .altinstr_replacement,"ax" ++ .section .altinstr_replacement,"a" + 1: .byte 0xeb /* jmp <disp8> */ + .byte (clear_page_c - clear_page) - (2f - 1b) /* offset */ + 2: .byte 0xeb /* jmp <disp8> */ +diff --git a/arch/x86/lib/cmpxchg16b_emu.S b/arch/x86/lib/cmpxchg16b_emu.S +index 40a1725..5d12ac4 100644 +--- a/arch/x86/lib/cmpxchg16b_emu.S ++++ b/arch/x86/lib/cmpxchg16b_emu.S +@@ -8,6 +8,7 @@ + #include <linux/linkage.h> + #include <asm/dwarf2.h> + #include <asm/percpu.h> ++#include <asm/alternative-asm.h> + + .text + +@@ -46,12 +47,14 @@ CFI_STARTPROC + CFI_REMEMBER_STATE + popfq_cfi + mov $1, %al ++ pax_force_retaddr + ret + + CFI_RESTORE_STATE + .Lnot_same: + popfq_cfi + xor %al,%al ++ pax_force_retaddr + ret + + CFI_ENDPROC +diff --git a/arch/x86/lib/copy_page_64.S b/arch/x86/lib/copy_page_64.S +index 176cca6..e0d658e 100644 +--- a/arch/x86/lib/copy_page_64.S ++++ b/arch/x86/lib/copy_page_64.S +@@ -9,6 +9,7 @@ copy_page_rep: + CFI_STARTPROC + movl $4096/8, %ecx + rep movsq ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(copy_page_rep) +@@ -24,8 +25,8 @@ ENTRY(copy_page) + CFI_ADJUST_CFA_OFFSET 2*8 + movq %rbx, (%rsp) + CFI_REL_OFFSET rbx, 0 +- movq %r12, 1*8(%rsp) +- CFI_REL_OFFSET r12, 1*8 ++ movq %r13, 1*8(%rsp) ++ CFI_REL_OFFSET r13, 1*8 + + movl $(4096/64)-5, %ecx + .p2align 4 +@@ -38,7 +39,7 @@ ENTRY(copy_page) + movq 0x8*4(%rsi), %r9 + movq 0x8*5(%rsi), %r10 + movq 0x8*6(%rsi), %r11 +- movq 0x8*7(%rsi), %r12 ++ movq 0x8*7(%rsi), %r13 + + prefetcht0 5*64(%rsi) + +@@ -49,7 +50,7 @@ ENTRY(copy_page) + movq %r9, 0x8*4(%rdi) + movq %r10, 0x8*5(%rdi) + movq %r11, 0x8*6(%rdi) +- movq %r12, 0x8*7(%rdi) ++ movq %r13, 0x8*7(%rdi) + + leaq 64 (%rsi), %rsi + leaq 64 (%rdi), %rdi +@@ -68,7 +69,7 @@ ENTRY(copy_page) + movq 0x8*4(%rsi), %r9 + movq 0x8*5(%rsi), %r10 + movq 0x8*6(%rsi), %r11 +- movq 0x8*7(%rsi), %r12 ++ movq 0x8*7(%rsi), %r13 + + movq %rax, 0x8*0(%rdi) + movq %rbx, 0x8*1(%rdi) +@@ -77,7 +78,7 @@ ENTRY(copy_page) + movq %r9, 0x8*4(%rdi) + movq %r10, 0x8*5(%rdi) + movq %r11, 0x8*6(%rdi) +- movq %r12, 0x8*7(%rdi) ++ movq %r13, 0x8*7(%rdi) + + leaq 64(%rdi), %rdi + leaq 64(%rsi), %rsi +@@ -85,10 +86,11 @@ ENTRY(copy_page) + + movq (%rsp), %rbx + CFI_RESTORE rbx +- movq 1*8(%rsp), %r12 +- CFI_RESTORE r12 ++ movq 1*8(%rsp), %r13 ++ CFI_RESTORE r13 + addq $2*8, %rsp + CFI_ADJUST_CFA_OFFSET -2*8 ++ pax_force_retaddr + ret + .Lcopy_page_end: + CFI_ENDPROC +@@ -99,7 +101,7 @@ ENDPROC(copy_page) + + #include <asm/cpufeature.h> + +- .section .altinstr_replacement,"ax" ++ .section .altinstr_replacement,"a" + 1: .byte 0xeb /* jmp <disp8> */ + .byte (copy_page_rep - copy_page) - (2f - 1b) /* offset */ + 2: +diff --git a/arch/x86/lib/copy_user_64.S b/arch/x86/lib/copy_user_64.S +index dee945d..a84067b 100644 +--- a/arch/x86/lib/copy_user_64.S ++++ b/arch/x86/lib/copy_user_64.S +@@ -18,31 +18,7 @@ + #include <asm/alternative-asm.h> + #include <asm/asm.h> + #include <asm/smap.h> +- +-/* +- * By placing feature2 after feature1 in altinstructions section, we logically +- * implement: +- * If CPU has feature2, jmp to alt2 is used +- * else if CPU has feature1, jmp to alt1 is used +- * else jmp to orig is used. +- */ +- .macro ALTERNATIVE_JUMP feature1,feature2,orig,alt1,alt2 +-0: +- .byte 0xe9 /* 32bit jump */ +- .long \orig-1f /* by default jump to orig */ +-1: +- .section .altinstr_replacement,"ax" +-2: .byte 0xe9 /* near jump with 32bit immediate */ +- .long \alt1-1b /* offset */ /* or alternatively to alt1 */ +-3: .byte 0xe9 /* near jump with 32bit immediate */ +- .long \alt2-1b /* offset */ /* or alternatively to alt2 */ +- .previous +- +- .section .altinstructions,"a" +- altinstruction_entry 0b,2b,\feature1,5,5 +- altinstruction_entry 0b,3b,\feature2,5,5 +- .previous +- .endm ++#include <asm/pgtable.h> + + .macro ALIGN_DESTINATION + #ifdef FIX_ALIGNMENT +@@ -70,52 +46,6 @@ + #endif + .endm + +-/* Standard copy_to_user with segment limit checking */ +-ENTRY(_copy_to_user) +- CFI_STARTPROC +- GET_THREAD_INFO(%rax) +- movq %rdi,%rcx +- addq %rdx,%rcx +- jc bad_to_user +- cmpq TI_addr_limit(%rax),%rcx +- ja bad_to_user +- ALTERNATIVE_JUMP X86_FEATURE_REP_GOOD,X86_FEATURE_ERMS, \ +- copy_user_generic_unrolled,copy_user_generic_string, \ +- copy_user_enhanced_fast_string +- CFI_ENDPROC +-ENDPROC(_copy_to_user) +- +-/* Standard copy_from_user with segment limit checking */ +-ENTRY(_copy_from_user) +- CFI_STARTPROC +- GET_THREAD_INFO(%rax) +- movq %rsi,%rcx +- addq %rdx,%rcx +- jc bad_from_user +- cmpq TI_addr_limit(%rax),%rcx +- ja bad_from_user +- ALTERNATIVE_JUMP X86_FEATURE_REP_GOOD,X86_FEATURE_ERMS, \ +- copy_user_generic_unrolled,copy_user_generic_string, \ +- copy_user_enhanced_fast_string +- CFI_ENDPROC +-ENDPROC(_copy_from_user) +- +- .section .fixup,"ax" +- /* must zero dest */ +-ENTRY(bad_from_user) +-bad_from_user: +- CFI_STARTPROC +- movl %edx,%ecx +- xorl %eax,%eax +- rep +- stosb +-bad_to_user: +- movl %edx,%eax +- ret +- CFI_ENDPROC +-ENDPROC(bad_from_user) +- .previous +- + /* + * copy_user_generic_unrolled - memory copy with exception handling. + * This version is for CPUs like P4 that don't have efficient micro +@@ -131,6 +61,7 @@ ENDPROC(bad_from_user) + */ + ENTRY(copy_user_generic_unrolled) + CFI_STARTPROC ++ ASM_PAX_OPEN_USERLAND + ASM_STAC + cmpl $8,%edx + jb 20f /* less then 8 bytes, go to byte copy loop */ +@@ -180,6 +111,8 @@ ENTRY(copy_user_generic_unrolled) + jnz 21b + 23: xor %eax,%eax + ASM_CLAC ++ ASM_PAX_CLOSE_USERLAND ++ pax_force_retaddr + ret + + .section .fixup,"ax" +@@ -235,6 +168,7 @@ ENDPROC(copy_user_generic_unrolled) + */ + ENTRY(copy_user_generic_string) + CFI_STARTPROC ++ ASM_PAX_OPEN_USERLAND + ASM_STAC + cmpl $8,%edx + jb 2f /* less than 8 bytes, go to byte copy loop */ +@@ -249,6 +183,8 @@ ENTRY(copy_user_generic_string) + movsb + xorl %eax,%eax + ASM_CLAC ++ ASM_PAX_CLOSE_USERLAND ++ pax_force_retaddr + ret + + .section .fixup,"ax" +@@ -276,12 +212,15 @@ ENDPROC(copy_user_generic_string) + */ + ENTRY(copy_user_enhanced_fast_string) + CFI_STARTPROC ++ ASM_PAX_OPEN_USERLAND + ASM_STAC + movl %edx,%ecx + 1: rep + movsb + xorl %eax,%eax + ASM_CLAC ++ ASM_PAX_CLOSE_USERLAND ++ pax_force_retaddr + ret + + .section .fixup,"ax" +diff --git a/arch/x86/lib/copy_user_nocache_64.S b/arch/x86/lib/copy_user_nocache_64.S +index 6a4f43c..c70fb52 100644 +--- a/arch/x86/lib/copy_user_nocache_64.S ++++ b/arch/x86/lib/copy_user_nocache_64.S +@@ -8,6 +8,7 @@ + + #include <linux/linkage.h> + #include <asm/dwarf2.h> ++#include <asm/alternative-asm.h> + + #define FIX_ALIGNMENT 1 + +@@ -16,6 +17,7 @@ + #include <asm/thread_info.h> + #include <asm/asm.h> + #include <asm/smap.h> ++#include <asm/pgtable.h> + + .macro ALIGN_DESTINATION + #ifdef FIX_ALIGNMENT +@@ -49,6 +51,16 @@ + */ + ENTRY(__copy_user_nocache) + CFI_STARTPROC ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ mov pax_user_shadow_base,%rcx ++ cmp %rcx,%rsi ++ jae 1f ++ add %rcx,%rsi ++1: ++#endif ++ ++ ASM_PAX_OPEN_USERLAND + ASM_STAC + cmpl $8,%edx + jb 20f /* less then 8 bytes, go to byte copy loop */ +@@ -98,7 +110,9 @@ ENTRY(__copy_user_nocache) + jnz 21b + 23: xorl %eax,%eax + ASM_CLAC ++ ASM_PAX_CLOSE_USERLAND + sfence ++ pax_force_retaddr + ret + + .section .fixup,"ax" +diff --git a/arch/x86/lib/csum-copy_64.S b/arch/x86/lib/csum-copy_64.S +index 2419d5f..fe52d0e 100644 +--- a/arch/x86/lib/csum-copy_64.S ++++ b/arch/x86/lib/csum-copy_64.S +@@ -9,6 +9,7 @@ + #include <asm/dwarf2.h> + #include <asm/errno.h> + #include <asm/asm.h> ++#include <asm/alternative-asm.h> + + /* + * Checksum copy with exception handling. +@@ -56,8 +57,8 @@ ENTRY(csum_partial_copy_generic) + CFI_ADJUST_CFA_OFFSET 7*8 + movq %rbx, 2*8(%rsp) + CFI_REL_OFFSET rbx, 2*8 +- movq %r12, 3*8(%rsp) +- CFI_REL_OFFSET r12, 3*8 ++ movq %r15, 3*8(%rsp) ++ CFI_REL_OFFSET r15, 3*8 + movq %r14, 4*8(%rsp) + CFI_REL_OFFSET r14, 4*8 + movq %r13, 5*8(%rsp) +@@ -72,16 +73,16 @@ ENTRY(csum_partial_copy_generic) + movl %edx, %ecx + + xorl %r9d, %r9d +- movq %rcx, %r12 ++ movq %rcx, %r15 + +- shrq $6, %r12 ++ shrq $6, %r15 + jz .Lhandle_tail /* < 64 */ + + clc + + /* main loop. clear in 64 byte blocks */ + /* r9: zero, r8: temp2, rbx: temp1, rax: sum, rcx: saved length */ +- /* r11: temp3, rdx: temp4, r12 loopcnt */ ++ /* r11: temp3, rdx: temp4, r15 loopcnt */ + /* r10: temp5, rbp: temp6, r14 temp7, r13 temp8 */ + .p2align 4 + .Lloop: +@@ -115,7 +116,7 @@ ENTRY(csum_partial_copy_generic) + adcq %r14, %rax + adcq %r13, %rax + +- decl %r12d ++ decl %r15d + + dest + movq %rbx, (%rsi) +@@ -210,8 +211,8 @@ ENTRY(csum_partial_copy_generic) + .Lende: + movq 2*8(%rsp), %rbx + CFI_RESTORE rbx +- movq 3*8(%rsp), %r12 +- CFI_RESTORE r12 ++ movq 3*8(%rsp), %r15 ++ CFI_RESTORE r15 + movq 4*8(%rsp), %r14 + CFI_RESTORE r14 + movq 5*8(%rsp), %r13 +@@ -220,6 +221,7 @@ ENTRY(csum_partial_copy_generic) + CFI_RESTORE rbp + addq $7*8, %rsp + CFI_ADJUST_CFA_OFFSET -7*8 ++ pax_force_retaddr + ret + CFI_RESTORE_STATE + +diff --git a/arch/x86/lib/csum-wrappers_64.c b/arch/x86/lib/csum-wrappers_64.c +index 1318f75..44c30fd 100644 +--- a/arch/x86/lib/csum-wrappers_64.c ++++ b/arch/x86/lib/csum-wrappers_64.c +@@ -52,10 +52,12 @@ csum_partial_copy_from_user(const void __user *src, void *dst, + len -= 2; + } + } ++ pax_open_userland(); + stac(); +- isum = csum_partial_copy_generic((__force const void *)src, ++ isum = csum_partial_copy_generic((const void __force_kernel *)____m(src), + dst, len, isum, errp, NULL); + clac(); ++ pax_close_userland(); + if (unlikely(*errp)) + goto out_err; + +@@ -109,10 +111,12 @@ csum_partial_copy_to_user(const void *src, void __user *dst, + } + + *errp = 0; ++ pax_open_userland(); + stac(); +- ret = csum_partial_copy_generic(src, (void __force *)dst, ++ ret = csum_partial_copy_generic(src, (void __force_kernel *)____m(dst), + len, isum, NULL, errp); + clac(); ++ pax_close_userland(); + return ret; + } + EXPORT_SYMBOL(csum_partial_copy_to_user); +diff --git a/arch/x86/lib/getuser.S b/arch/x86/lib/getuser.S +index a451235..a74bfa3 100644 +--- a/arch/x86/lib/getuser.S ++++ b/arch/x86/lib/getuser.S +@@ -33,17 +33,40 @@ + #include <asm/thread_info.h> + #include <asm/asm.h> + #include <asm/smap.h> ++#include <asm/segment.h> ++#include <asm/pgtable.h> ++#include <asm/alternative-asm.h> ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define __copyuser_seg gs; ++#else ++#define __copyuser_seg ++#endif + + .text + ENTRY(__get_user_1) + CFI_STARTPROC ++ ++#if !defined(CONFIG_X86_32) || !defined(CONFIG_PAX_MEMORY_UDEREF) + GET_THREAD_INFO(%_ASM_DX) + cmp TI_addr_limit(%_ASM_DX),%_ASM_AX + jae bad_get_user ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ mov pax_user_shadow_base,%_ASM_DX ++ cmp %_ASM_DX,%_ASM_AX ++ jae 1234f ++ add %_ASM_DX,%_ASM_AX ++1234: ++#endif ++ ++#endif ++ + ASM_STAC +-1: movzbl (%_ASM_AX),%edx ++1: __copyuser_seg movzbl (%_ASM_AX),%edx + xor %eax,%eax + ASM_CLAC ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(__get_user_1) +@@ -51,14 +74,28 @@ ENDPROC(__get_user_1) + ENTRY(__get_user_2) + CFI_STARTPROC + add $1,%_ASM_AX ++ ++#if !defined(CONFIG_X86_32) || !defined(CONFIG_PAX_MEMORY_UDEREF) + jc bad_get_user + GET_THREAD_INFO(%_ASM_DX) + cmp TI_addr_limit(%_ASM_DX),%_ASM_AX + jae bad_get_user ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ mov pax_user_shadow_base,%_ASM_DX ++ cmp %_ASM_DX,%_ASM_AX ++ jae 1234f ++ add %_ASM_DX,%_ASM_AX ++1234: ++#endif ++ ++#endif ++ + ASM_STAC +-2: movzwl -1(%_ASM_AX),%edx ++2: __copyuser_seg movzwl -1(%_ASM_AX),%edx + xor %eax,%eax + ASM_CLAC ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(__get_user_2) +@@ -66,14 +103,28 @@ ENDPROC(__get_user_2) + ENTRY(__get_user_4) + CFI_STARTPROC + add $3,%_ASM_AX ++ ++#if !defined(CONFIG_X86_32) || !defined(CONFIG_PAX_MEMORY_UDEREF) + jc bad_get_user + GET_THREAD_INFO(%_ASM_DX) + cmp TI_addr_limit(%_ASM_DX),%_ASM_AX + jae bad_get_user ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ mov pax_user_shadow_base,%_ASM_DX ++ cmp %_ASM_DX,%_ASM_AX ++ jae 1234f ++ add %_ASM_DX,%_ASM_AX ++1234: ++#endif ++ ++#endif ++ + ASM_STAC +-3: movl -3(%_ASM_AX),%edx ++3: __copyuser_seg movl -3(%_ASM_AX),%edx + xor %eax,%eax + ASM_CLAC ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(__get_user_4) +@@ -86,10 +137,20 @@ ENTRY(__get_user_8) + GET_THREAD_INFO(%_ASM_DX) + cmp TI_addr_limit(%_ASM_DX),%_ASM_AX + jae bad_get_user ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++ mov pax_user_shadow_base,%_ASM_DX ++ cmp %_ASM_DX,%_ASM_AX ++ jae 1234f ++ add %_ASM_DX,%_ASM_AX ++1234: ++#endif ++ + ASM_STAC + 4: movq -7(%_ASM_AX),%rdx + xor %eax,%eax + ASM_CLAC ++ pax_force_retaddr + ret + #else + add $7,%_ASM_AX +@@ -98,10 +159,11 @@ ENTRY(__get_user_8) + cmp TI_addr_limit(%_ASM_DX),%_ASM_AX + jae bad_get_user_8 + ASM_STAC +-4: movl -7(%_ASM_AX),%edx +-5: movl -3(%_ASM_AX),%ecx ++4: __copyuser_seg movl -7(%_ASM_AX),%edx ++5: __copyuser_seg movl -3(%_ASM_AX),%ecx + xor %eax,%eax + ASM_CLAC ++ pax_force_retaddr + ret + #endif + CFI_ENDPROC +@@ -113,6 +175,7 @@ bad_get_user: + xor %edx,%edx + mov $(-EFAULT),%_ASM_AX + ASM_CLAC ++ pax_force_retaddr + ret + CFI_ENDPROC + END(bad_get_user) +@@ -124,6 +187,7 @@ bad_get_user_8: + xor %ecx,%ecx + mov $(-EFAULT),%_ASM_AX + ASM_CLAC ++ pax_force_retaddr + ret + CFI_ENDPROC + END(bad_get_user_8) +diff --git a/arch/x86/lib/insn.c b/arch/x86/lib/insn.c +index 54fcffe..7be149e 100644 +--- a/arch/x86/lib/insn.c ++++ b/arch/x86/lib/insn.c +@@ -20,8 +20,10 @@ + + #ifdef __KERNEL__ + #include <linux/string.h> ++#include <asm/pgtable_types.h> + #else + #include <string.h> ++#define ktla_ktva(addr) addr + #endif + #include <asm/inat.h> + #include <asm/insn.h> +@@ -53,8 +55,8 @@ + void insn_init(struct insn *insn, const void *kaddr, int x86_64) + { + memset(insn, 0, sizeof(*insn)); +- insn->kaddr = kaddr; +- insn->next_byte = kaddr; ++ insn->kaddr = ktla_ktva(kaddr); ++ insn->next_byte = ktla_ktva(kaddr); + insn->x86_64 = x86_64 ? 1 : 0; + insn->opnd_bytes = 4; + if (x86_64) +diff --git a/arch/x86/lib/iomap_copy_64.S b/arch/x86/lib/iomap_copy_64.S +index 05a95e7..326f2fa 100644 +--- a/arch/x86/lib/iomap_copy_64.S ++++ b/arch/x86/lib/iomap_copy_64.S +@@ -17,6 +17,7 @@ + + #include <linux/linkage.h> + #include <asm/dwarf2.h> ++#include <asm/alternative-asm.h> + + /* + * override generic version in lib/iomap_copy.c +@@ -25,6 +26,7 @@ ENTRY(__iowrite32_copy) + CFI_STARTPROC + movl %edx,%ecx + rep movsd ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(__iowrite32_copy) +diff --git a/arch/x86/lib/memcpy_64.S b/arch/x86/lib/memcpy_64.S +index 56313a3..0db417e 100644 +--- a/arch/x86/lib/memcpy_64.S ++++ b/arch/x86/lib/memcpy_64.S +@@ -24,7 +24,7 @@ + * This gets patched over the unrolled variant (below) via the + * alternative instructions framework: + */ +- .section .altinstr_replacement, "ax", @progbits ++ .section .altinstr_replacement, "a", @progbits + .Lmemcpy_c: + movq %rdi, %rax + movq %rdx, %rcx +@@ -33,6 +33,7 @@ + rep movsq + movl %edx, %ecx + rep movsb ++ pax_force_retaddr + ret + .Lmemcpy_e: + .previous +@@ -44,11 +45,12 @@ + * This gets patched over the unrolled variant (below) via the + * alternative instructions framework: + */ +- .section .altinstr_replacement, "ax", @progbits ++ .section .altinstr_replacement, "a", @progbits + .Lmemcpy_c_e: + movq %rdi, %rax + movq %rdx, %rcx + rep movsb ++ pax_force_retaddr + ret + .Lmemcpy_e_e: + .previous +@@ -136,6 +138,7 @@ ENTRY(memcpy) + movq %r9, 1*8(%rdi) + movq %r10, -2*8(%rdi, %rdx) + movq %r11, -1*8(%rdi, %rdx) ++ pax_force_retaddr + retq + .p2align 4 + .Lless_16bytes: +@@ -148,6 +151,7 @@ ENTRY(memcpy) + movq -1*8(%rsi, %rdx), %r9 + movq %r8, 0*8(%rdi) + movq %r9, -1*8(%rdi, %rdx) ++ pax_force_retaddr + retq + .p2align 4 + .Lless_8bytes: +@@ -161,6 +165,7 @@ ENTRY(memcpy) + movl -4(%rsi, %rdx), %r8d + movl %ecx, (%rdi) + movl %r8d, -4(%rdi, %rdx) ++ pax_force_retaddr + retq + .p2align 4 + .Lless_3bytes: +@@ -179,6 +184,7 @@ ENTRY(memcpy) + movb %cl, (%rdi) + + .Lend: ++ pax_force_retaddr + retq + CFI_ENDPROC + ENDPROC(memcpy) +diff --git a/arch/x86/lib/memmove_64.S b/arch/x86/lib/memmove_64.S +index 65268a6..dd1de11 100644 +--- a/arch/x86/lib/memmove_64.S ++++ b/arch/x86/lib/memmove_64.S +@@ -202,14 +202,16 @@ ENTRY(memmove) + movb (%rsi), %r11b + movb %r11b, (%rdi) + 13: ++ pax_force_retaddr + retq + CFI_ENDPROC + +- .section .altinstr_replacement,"ax" ++ .section .altinstr_replacement,"a" + .Lmemmove_begin_forward_efs: + /* Forward moving data. */ + movq %rdx, %rcx + rep movsb ++ pax_force_retaddr + retq + .Lmemmove_end_forward_efs: + .previous +diff --git a/arch/x86/lib/memset_64.S b/arch/x86/lib/memset_64.S +index 2dcb380..2eb79fe 100644 +--- a/arch/x86/lib/memset_64.S ++++ b/arch/x86/lib/memset_64.S +@@ -16,7 +16,7 @@ + * + * rax original destination + */ +- .section .altinstr_replacement, "ax", @progbits ++ .section .altinstr_replacement, "a", @progbits + .Lmemset_c: + movq %rdi,%r9 + movq %rdx,%rcx +@@ -30,6 +30,7 @@ + movl %edx,%ecx + rep stosb + movq %r9,%rax ++ pax_force_retaddr + ret + .Lmemset_e: + .previous +@@ -45,13 +46,14 @@ + * + * rax original destination + */ +- .section .altinstr_replacement, "ax", @progbits ++ .section .altinstr_replacement, "a", @progbits + .Lmemset_c_e: + movq %rdi,%r9 + movb %sil,%al + movq %rdx,%rcx + rep stosb + movq %r9,%rax ++ pax_force_retaddr + ret + .Lmemset_e_e: + .previous +@@ -118,6 +120,7 @@ ENTRY(__memset) + + .Lende: + movq %r10,%rax ++ pax_force_retaddr + ret + + CFI_RESTORE_STATE +diff --git a/arch/x86/lib/mmx_32.c b/arch/x86/lib/mmx_32.c +index c9f2d9b..e7fd2c0 100644 +--- a/arch/x86/lib/mmx_32.c ++++ b/arch/x86/lib/mmx_32.c +@@ -29,6 +29,7 @@ void *_mmx_memcpy(void *to, const void *from, size_t len) + { + void *p; + int i; ++ unsigned long cr0; + + if (unlikely(in_interrupt())) + return __memcpy(to, from, len); +@@ -39,44 +40,72 @@ void *_mmx_memcpy(void *to, const void *from, size_t len) + kernel_fpu_begin(); + + __asm__ __volatile__ ( +- "1: prefetch (%0)\n" /* This set is 28 bytes */ +- " prefetch 64(%0)\n" +- " prefetch 128(%0)\n" +- " prefetch 192(%0)\n" +- " prefetch 256(%0)\n" ++ "1: prefetch (%1)\n" /* This set is 28 bytes */ ++ " prefetch 64(%1)\n" ++ " prefetch 128(%1)\n" ++ " prefetch 192(%1)\n" ++ " prefetch 256(%1)\n" + "2: \n" + ".section .fixup, \"ax\"\n" +- "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */ ++ "3: \n" ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %%cr0, %0\n" ++ " movl %0, %%eax\n" ++ " andl $0xFFFEFFFF, %%eax\n" ++ " movl %%eax, %%cr0\n" ++#endif ++ ++ " movw $0x1AEB, 1b\n" /* jmp on 26 bytes */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %0, %%cr0\n" ++#endif ++ + " jmp 2b\n" + ".previous\n" + _ASM_EXTABLE(1b, 3b) +- : : "r" (from)); ++ : "=&r" (cr0) : "r" (from) : "ax"); + + for ( ; i > 5; i--) { + __asm__ __volatile__ ( +- "1: prefetch 320(%0)\n" +- "2: movq (%0), %%mm0\n" +- " movq 8(%0), %%mm1\n" +- " movq 16(%0), %%mm2\n" +- " movq 24(%0), %%mm3\n" +- " movq %%mm0, (%1)\n" +- " movq %%mm1, 8(%1)\n" +- " movq %%mm2, 16(%1)\n" +- " movq %%mm3, 24(%1)\n" +- " movq 32(%0), %%mm0\n" +- " movq 40(%0), %%mm1\n" +- " movq 48(%0), %%mm2\n" +- " movq 56(%0), %%mm3\n" +- " movq %%mm0, 32(%1)\n" +- " movq %%mm1, 40(%1)\n" +- " movq %%mm2, 48(%1)\n" +- " movq %%mm3, 56(%1)\n" ++ "1: prefetch 320(%1)\n" ++ "2: movq (%1), %%mm0\n" ++ " movq 8(%1), %%mm1\n" ++ " movq 16(%1), %%mm2\n" ++ " movq 24(%1), %%mm3\n" ++ " movq %%mm0, (%2)\n" ++ " movq %%mm1, 8(%2)\n" ++ " movq %%mm2, 16(%2)\n" ++ " movq %%mm3, 24(%2)\n" ++ " movq 32(%1), %%mm0\n" ++ " movq 40(%1), %%mm1\n" ++ " movq 48(%1), %%mm2\n" ++ " movq 56(%1), %%mm3\n" ++ " movq %%mm0, 32(%2)\n" ++ " movq %%mm1, 40(%2)\n" ++ " movq %%mm2, 48(%2)\n" ++ " movq %%mm3, 56(%2)\n" + ".section .fixup, \"ax\"\n" +- "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */ ++ "3:\n" ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %%cr0, %0\n" ++ " movl %0, %%eax\n" ++ " andl $0xFFFEFFFF, %%eax\n" ++ " movl %%eax, %%cr0\n" ++#endif ++ ++ " movw $0x05EB, 1b\n" /* jmp on 5 bytes */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %0, %%cr0\n" ++#endif ++ + " jmp 2b\n" + ".previous\n" + _ASM_EXTABLE(1b, 3b) +- : : "r" (from), "r" (to) : "memory"); ++ : "=&r" (cr0) : "r" (from), "r" (to) : "memory", "ax"); + + from += 64; + to += 64; +@@ -158,6 +187,7 @@ static void fast_clear_page(void *page) + static void fast_copy_page(void *to, void *from) + { + int i; ++ unsigned long cr0; + + kernel_fpu_begin(); + +@@ -166,42 +196,70 @@ static void fast_copy_page(void *to, void *from) + * but that is for later. -AV + */ + __asm__ __volatile__( +- "1: prefetch (%0)\n" +- " prefetch 64(%0)\n" +- " prefetch 128(%0)\n" +- " prefetch 192(%0)\n" +- " prefetch 256(%0)\n" ++ "1: prefetch (%1)\n" ++ " prefetch 64(%1)\n" ++ " prefetch 128(%1)\n" ++ " prefetch 192(%1)\n" ++ " prefetch 256(%1)\n" + "2: \n" + ".section .fixup, \"ax\"\n" +- "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */ ++ "3: \n" ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %%cr0, %0\n" ++ " movl %0, %%eax\n" ++ " andl $0xFFFEFFFF, %%eax\n" ++ " movl %%eax, %%cr0\n" ++#endif ++ ++ " movw $0x1AEB, 1b\n" /* jmp on 26 bytes */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %0, %%cr0\n" ++#endif ++ + " jmp 2b\n" + ".previous\n" +- _ASM_EXTABLE(1b, 3b) : : "r" (from)); ++ _ASM_EXTABLE(1b, 3b) : "=&r" (cr0) : "r" (from) : "ax"); + + for (i = 0; i < (4096-320)/64; i++) { + __asm__ __volatile__ ( +- "1: prefetch 320(%0)\n" +- "2: movq (%0), %%mm0\n" +- " movntq %%mm0, (%1)\n" +- " movq 8(%0), %%mm1\n" +- " movntq %%mm1, 8(%1)\n" +- " movq 16(%0), %%mm2\n" +- " movntq %%mm2, 16(%1)\n" +- " movq 24(%0), %%mm3\n" +- " movntq %%mm3, 24(%1)\n" +- " movq 32(%0), %%mm4\n" +- " movntq %%mm4, 32(%1)\n" +- " movq 40(%0), %%mm5\n" +- " movntq %%mm5, 40(%1)\n" +- " movq 48(%0), %%mm6\n" +- " movntq %%mm6, 48(%1)\n" +- " movq 56(%0), %%mm7\n" +- " movntq %%mm7, 56(%1)\n" ++ "1: prefetch 320(%1)\n" ++ "2: movq (%1), %%mm0\n" ++ " movntq %%mm0, (%2)\n" ++ " movq 8(%1), %%mm1\n" ++ " movntq %%mm1, 8(%2)\n" ++ " movq 16(%1), %%mm2\n" ++ " movntq %%mm2, 16(%2)\n" ++ " movq 24(%1), %%mm3\n" ++ " movntq %%mm3, 24(%2)\n" ++ " movq 32(%1), %%mm4\n" ++ " movntq %%mm4, 32(%2)\n" ++ " movq 40(%1), %%mm5\n" ++ " movntq %%mm5, 40(%2)\n" ++ " movq 48(%1), %%mm6\n" ++ " movntq %%mm6, 48(%2)\n" ++ " movq 56(%1), %%mm7\n" ++ " movntq %%mm7, 56(%2)\n" + ".section .fixup, \"ax\"\n" +- "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */ ++ "3:\n" ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %%cr0, %0\n" ++ " movl %0, %%eax\n" ++ " andl $0xFFFEFFFF, %%eax\n" ++ " movl %%eax, %%cr0\n" ++#endif ++ ++ " movw $0x05EB, 1b\n" /* jmp on 5 bytes */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %0, %%cr0\n" ++#endif ++ + " jmp 2b\n" + ".previous\n" +- _ASM_EXTABLE(1b, 3b) : : "r" (from), "r" (to) : "memory"); ++ _ASM_EXTABLE(1b, 3b) : "=&r" (cr0) : "r" (from), "r" (to) : "memory", "ax"); + + from += 64; + to += 64; +@@ -280,47 +338,76 @@ static void fast_clear_page(void *page) + static void fast_copy_page(void *to, void *from) + { + int i; ++ unsigned long cr0; + + kernel_fpu_begin(); + + __asm__ __volatile__ ( +- "1: prefetch (%0)\n" +- " prefetch 64(%0)\n" +- " prefetch 128(%0)\n" +- " prefetch 192(%0)\n" +- " prefetch 256(%0)\n" ++ "1: prefetch (%1)\n" ++ " prefetch 64(%1)\n" ++ " prefetch 128(%1)\n" ++ " prefetch 192(%1)\n" ++ " prefetch 256(%1)\n" + "2: \n" + ".section .fixup, \"ax\"\n" +- "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */ ++ "3: \n" ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %%cr0, %0\n" ++ " movl %0, %%eax\n" ++ " andl $0xFFFEFFFF, %%eax\n" ++ " movl %%eax, %%cr0\n" ++#endif ++ ++ " movw $0x1AEB, 1b\n" /* jmp on 26 bytes */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %0, %%cr0\n" ++#endif ++ + " jmp 2b\n" + ".previous\n" +- _ASM_EXTABLE(1b, 3b) : : "r" (from)); ++ _ASM_EXTABLE(1b, 3b) : "=&r" (cr0) : "r" (from) : "ax"); + + for (i = 0; i < 4096/64; i++) { + __asm__ __volatile__ ( +- "1: prefetch 320(%0)\n" +- "2: movq (%0), %%mm0\n" +- " movq 8(%0), %%mm1\n" +- " movq 16(%0), %%mm2\n" +- " movq 24(%0), %%mm3\n" +- " movq %%mm0, (%1)\n" +- " movq %%mm1, 8(%1)\n" +- " movq %%mm2, 16(%1)\n" +- " movq %%mm3, 24(%1)\n" +- " movq 32(%0), %%mm0\n" +- " movq 40(%0), %%mm1\n" +- " movq 48(%0), %%mm2\n" +- " movq 56(%0), %%mm3\n" +- " movq %%mm0, 32(%1)\n" +- " movq %%mm1, 40(%1)\n" +- " movq %%mm2, 48(%1)\n" +- " movq %%mm3, 56(%1)\n" ++ "1: prefetch 320(%1)\n" ++ "2: movq (%1), %%mm0\n" ++ " movq 8(%1), %%mm1\n" ++ " movq 16(%1), %%mm2\n" ++ " movq 24(%1), %%mm3\n" ++ " movq %%mm0, (%2)\n" ++ " movq %%mm1, 8(%2)\n" ++ " movq %%mm2, 16(%2)\n" ++ " movq %%mm3, 24(%2)\n" ++ " movq 32(%1), %%mm0\n" ++ " movq 40(%1), %%mm1\n" ++ " movq 48(%1), %%mm2\n" ++ " movq 56(%1), %%mm3\n" ++ " movq %%mm0, 32(%2)\n" ++ " movq %%mm1, 40(%2)\n" ++ " movq %%mm2, 48(%2)\n" ++ " movq %%mm3, 56(%2)\n" + ".section .fixup, \"ax\"\n" +- "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */ ++ "3:\n" ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %%cr0, %0\n" ++ " movl %0, %%eax\n" ++ " andl $0xFFFEFFFF, %%eax\n" ++ " movl %%eax, %%cr0\n" ++#endif ++ ++ " movw $0x05EB, 1b\n" /* jmp on 5 bytes */ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ " movl %0, %%cr0\n" ++#endif ++ + " jmp 2b\n" + ".previous\n" + _ASM_EXTABLE(1b, 3b) +- : : "r" (from), "r" (to) : "memory"); ++ : "=&r" (cr0) : "r" (from), "r" (to) : "memory", "ax"); + + from += 64; + to += 64; +diff --git a/arch/x86/lib/msr-reg.S b/arch/x86/lib/msr-reg.S +index f6d13ee..d789440 100644 +--- a/arch/x86/lib/msr-reg.S ++++ b/arch/x86/lib/msr-reg.S +@@ -3,6 +3,7 @@ + #include <asm/dwarf2.h> + #include <asm/asm.h> + #include <asm/msr.h> ++#include <asm/alternative-asm.h> + + #ifdef CONFIG_X86_64 + /* +@@ -37,6 +38,7 @@ ENTRY(\op\()_safe_regs) + movl %edi, 28(%r10) + popq_cfi %rbp + popq_cfi %rbx ++ pax_force_retaddr + ret + 3: + CFI_RESTORE_STATE +diff --git a/arch/x86/lib/putuser.S b/arch/x86/lib/putuser.S +index fc6ba17..14ad9a5 100644 +--- a/arch/x86/lib/putuser.S ++++ b/arch/x86/lib/putuser.S +@@ -16,7 +16,9 @@ + #include <asm/errno.h> + #include <asm/asm.h> + #include <asm/smap.h> +- ++#include <asm/segment.h> ++#include <asm/pgtable.h> ++#include <asm/alternative-asm.h> + + /* + * __put_user_X +@@ -30,57 +32,125 @@ + * as they get called from within inline assembly. + */ + +-#define ENTER CFI_STARTPROC ; \ +- GET_THREAD_INFO(%_ASM_BX) +-#define EXIT ASM_CLAC ; \ +- ret ; \ ++#define ENTER CFI_STARTPROC ++#define EXIT ASM_CLAC ; \ ++ pax_force_retaddr ; \ ++ ret ; \ + CFI_ENDPROC + ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define _DEST %_ASM_CX,%_ASM_BX ++#else ++#define _DEST %_ASM_CX ++#endif ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#define __copyuser_seg gs; ++#else ++#define __copyuser_seg ++#endif ++ + .text + ENTRY(__put_user_1) + ENTER ++ ++#if !defined(CONFIG_X86_32) || !defined(CONFIG_PAX_MEMORY_UDEREF) ++ GET_THREAD_INFO(%_ASM_BX) + cmp TI_addr_limit(%_ASM_BX),%_ASM_CX + jae bad_put_user ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ mov pax_user_shadow_base,%_ASM_BX ++ cmp %_ASM_BX,%_ASM_CX ++ jb 1234f ++ xor %ebx,%ebx ++1234: ++#endif ++ ++#endif ++ + ASM_STAC +-1: movb %al,(%_ASM_CX) ++1: __copyuser_seg movb %al,(_DEST) + xor %eax,%eax + EXIT + ENDPROC(__put_user_1) + + ENTRY(__put_user_2) + ENTER ++ ++#if !defined(CONFIG_X86_32) || !defined(CONFIG_PAX_MEMORY_UDEREF) ++ GET_THREAD_INFO(%_ASM_BX) + mov TI_addr_limit(%_ASM_BX),%_ASM_BX + sub $1,%_ASM_BX + cmp %_ASM_BX,%_ASM_CX + jae bad_put_user ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ mov pax_user_shadow_base,%_ASM_BX ++ cmp %_ASM_BX,%_ASM_CX ++ jb 1234f ++ xor %ebx,%ebx ++1234: ++#endif ++ ++#endif ++ + ASM_STAC +-2: movw %ax,(%_ASM_CX) ++2: __copyuser_seg movw %ax,(_DEST) + xor %eax,%eax + EXIT + ENDPROC(__put_user_2) + + ENTRY(__put_user_4) + ENTER ++ ++#if !defined(CONFIG_X86_32) || !defined(CONFIG_PAX_MEMORY_UDEREF) ++ GET_THREAD_INFO(%_ASM_BX) + mov TI_addr_limit(%_ASM_BX),%_ASM_BX + sub $3,%_ASM_BX + cmp %_ASM_BX,%_ASM_CX + jae bad_put_user ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ mov pax_user_shadow_base,%_ASM_BX ++ cmp %_ASM_BX,%_ASM_CX ++ jb 1234f ++ xor %ebx,%ebx ++1234: ++#endif ++ ++#endif ++ + ASM_STAC +-3: movl %eax,(%_ASM_CX) ++3: __copyuser_seg movl %eax,(_DEST) + xor %eax,%eax + EXIT + ENDPROC(__put_user_4) + + ENTRY(__put_user_8) + ENTER ++ ++#if !defined(CONFIG_X86_32) || !defined(CONFIG_PAX_MEMORY_UDEREF) ++ GET_THREAD_INFO(%_ASM_BX) + mov TI_addr_limit(%_ASM_BX),%_ASM_BX + sub $7,%_ASM_BX + cmp %_ASM_BX,%_ASM_CX + jae bad_put_user ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ mov pax_user_shadow_base,%_ASM_BX ++ cmp %_ASM_BX,%_ASM_CX ++ jb 1234f ++ xor %ebx,%ebx ++1234: ++#endif ++ ++#endif ++ + ASM_STAC +-4: mov %_ASM_AX,(%_ASM_CX) ++4: __copyuser_seg mov %_ASM_AX,(_DEST) + #ifdef CONFIG_X86_32 +-5: movl %edx,4(%_ASM_CX) ++5: __copyuser_seg movl %edx,4(_DEST) + #endif + xor %eax,%eax + EXIT +diff --git a/arch/x86/lib/rwsem.S b/arch/x86/lib/rwsem.S +index 5dff5f0..cadebf4 100644 +--- a/arch/x86/lib/rwsem.S ++++ b/arch/x86/lib/rwsem.S +@@ -94,6 +94,7 @@ ENTRY(call_rwsem_down_read_failed) + __ASM_SIZE(pop,_cfi) %__ASM_REG(dx) + CFI_RESTORE __ASM_REG(dx) + restore_common_regs ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(call_rwsem_down_read_failed) +@@ -104,6 +105,7 @@ ENTRY(call_rwsem_down_write_failed) + movq %rax,%rdi + call rwsem_down_write_failed + restore_common_regs ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(call_rwsem_down_write_failed) +@@ -117,7 +119,8 @@ ENTRY(call_rwsem_wake) + movq %rax,%rdi + call rwsem_wake + restore_common_regs +-1: ret ++1: pax_force_retaddr ++ ret + CFI_ENDPROC + ENDPROC(call_rwsem_wake) + +@@ -131,6 +134,7 @@ ENTRY(call_rwsem_downgrade_wake) + __ASM_SIZE(pop,_cfi) %__ASM_REG(dx) + CFI_RESTORE __ASM_REG(dx) + restore_common_regs ++ pax_force_retaddr + ret + CFI_ENDPROC + ENDPROC(call_rwsem_downgrade_wake) +diff --git a/arch/x86/lib/thunk_64.S b/arch/x86/lib/thunk_64.S +index b30b5eb..2b57052 100644 +--- a/arch/x86/lib/thunk_64.S ++++ b/arch/x86/lib/thunk_64.S +@@ -9,6 +9,7 @@ + #include <asm/dwarf2.h> + #include <asm/calling.h> + #include <asm/asm.h> ++#include <asm/alternative-asm.h> + + /* rdi: arg1 ... normal C conventions. rax is saved/restored. */ + .macro THUNK name, func, put_ret_addr_in_rdi=0 +@@ -16,11 +17,11 @@ + \name: + CFI_STARTPROC + +- /* this one pushes 9 elems, the next one would be %rIP */ +- SAVE_ARGS ++ /* this one pushes 15+1 elems, the next one would be %rIP */ ++ SAVE_ARGS 8 + + .if \put_ret_addr_in_rdi +- movq_cfi_restore 9*8, rdi ++ movq_cfi_restore RIP, rdi + .endif + + call \func +@@ -47,9 +48,10 @@ + + /* SAVE_ARGS below is used only for the .cfi directives it contains. */ + CFI_STARTPROC +- SAVE_ARGS ++ SAVE_ARGS 8 + restore: +- RESTORE_ARGS ++ RESTORE_ARGS 1,8 ++ pax_force_retaddr + ret + CFI_ENDPROC + _ASM_NOKPROBE(restore) +diff --git a/arch/x86/lib/usercopy_32.c b/arch/x86/lib/usercopy_32.c +index e2f5e21..4b22130 100644 +--- a/arch/x86/lib/usercopy_32.c ++++ b/arch/x86/lib/usercopy_32.c +@@ -42,11 +42,13 @@ do { \ + int __d0; \ + might_fault(); \ + __asm__ __volatile__( \ ++ __COPYUSER_SET_ES \ + ASM_STAC "\n" \ + "0: rep; stosl\n" \ + " movl %2,%0\n" \ + "1: rep; stosb\n" \ + "2: " ASM_CLAC "\n" \ ++ __COPYUSER_RESTORE_ES \ + ".section .fixup,\"ax\"\n" \ + "3: lea 0(%2,%0,4),%0\n" \ + " jmp 2b\n" \ +@@ -98,7 +100,7 @@ EXPORT_SYMBOL(__clear_user); + + #ifdef CONFIG_X86_INTEL_USERCOPY + static unsigned long +-__copy_user_intel(void __user *to, const void *from, unsigned long size) ++__generic_copy_to_user_intel(void __user *to, const void *from, unsigned long size) + { + int d0, d1; + __asm__ __volatile__( +@@ -110,36 +112,36 @@ __copy_user_intel(void __user *to, const void *from, unsigned long size) + " .align 2,0x90\n" + "3: movl 0(%4), %%eax\n" + "4: movl 4(%4), %%edx\n" +- "5: movl %%eax, 0(%3)\n" +- "6: movl %%edx, 4(%3)\n" ++ "5: "__copyuser_seg" movl %%eax, 0(%3)\n" ++ "6: "__copyuser_seg" movl %%edx, 4(%3)\n" + "7: movl 8(%4), %%eax\n" + "8: movl 12(%4),%%edx\n" +- "9: movl %%eax, 8(%3)\n" +- "10: movl %%edx, 12(%3)\n" ++ "9: "__copyuser_seg" movl %%eax, 8(%3)\n" ++ "10: "__copyuser_seg" movl %%edx, 12(%3)\n" + "11: movl 16(%4), %%eax\n" + "12: movl 20(%4), %%edx\n" +- "13: movl %%eax, 16(%3)\n" +- "14: movl %%edx, 20(%3)\n" ++ "13: "__copyuser_seg" movl %%eax, 16(%3)\n" ++ "14: "__copyuser_seg" movl %%edx, 20(%3)\n" + "15: movl 24(%4), %%eax\n" + "16: movl 28(%4), %%edx\n" +- "17: movl %%eax, 24(%3)\n" +- "18: movl %%edx, 28(%3)\n" ++ "17: "__copyuser_seg" movl %%eax, 24(%3)\n" ++ "18: "__copyuser_seg" movl %%edx, 28(%3)\n" + "19: movl 32(%4), %%eax\n" + "20: movl 36(%4), %%edx\n" +- "21: movl %%eax, 32(%3)\n" +- "22: movl %%edx, 36(%3)\n" ++ "21: "__copyuser_seg" movl %%eax, 32(%3)\n" ++ "22: "__copyuser_seg" movl %%edx, 36(%3)\n" + "23: movl 40(%4), %%eax\n" + "24: movl 44(%4), %%edx\n" +- "25: movl %%eax, 40(%3)\n" +- "26: movl %%edx, 44(%3)\n" ++ "25: "__copyuser_seg" movl %%eax, 40(%3)\n" ++ "26: "__copyuser_seg" movl %%edx, 44(%3)\n" + "27: movl 48(%4), %%eax\n" + "28: movl 52(%4), %%edx\n" +- "29: movl %%eax, 48(%3)\n" +- "30: movl %%edx, 52(%3)\n" ++ "29: "__copyuser_seg" movl %%eax, 48(%3)\n" ++ "30: "__copyuser_seg" movl %%edx, 52(%3)\n" + "31: movl 56(%4), %%eax\n" + "32: movl 60(%4), %%edx\n" +- "33: movl %%eax, 56(%3)\n" +- "34: movl %%edx, 60(%3)\n" ++ "33: "__copyuser_seg" movl %%eax, 56(%3)\n" ++ "34: "__copyuser_seg" movl %%edx, 60(%3)\n" + " addl $-64, %0\n" + " addl $64, %4\n" + " addl $64, %3\n" +@@ -149,10 +151,116 @@ __copy_user_intel(void __user *to, const void *from, unsigned long size) + " shrl $2, %0\n" + " andl $3, %%eax\n" + " cld\n" ++ __COPYUSER_SET_ES + "99: rep; movsl\n" + "36: movl %%eax, %0\n" + "37: rep; movsb\n" + "100:\n" ++ __COPYUSER_RESTORE_ES ++ ".section .fixup,\"ax\"\n" ++ "101: lea 0(%%eax,%0,4),%0\n" ++ " jmp 100b\n" ++ ".previous\n" ++ _ASM_EXTABLE(1b,100b) ++ _ASM_EXTABLE(2b,100b) ++ _ASM_EXTABLE(3b,100b) ++ _ASM_EXTABLE(4b,100b) ++ _ASM_EXTABLE(5b,100b) ++ _ASM_EXTABLE(6b,100b) ++ _ASM_EXTABLE(7b,100b) ++ _ASM_EXTABLE(8b,100b) ++ _ASM_EXTABLE(9b,100b) ++ _ASM_EXTABLE(10b,100b) ++ _ASM_EXTABLE(11b,100b) ++ _ASM_EXTABLE(12b,100b) ++ _ASM_EXTABLE(13b,100b) ++ _ASM_EXTABLE(14b,100b) ++ _ASM_EXTABLE(15b,100b) ++ _ASM_EXTABLE(16b,100b) ++ _ASM_EXTABLE(17b,100b) ++ _ASM_EXTABLE(18b,100b) ++ _ASM_EXTABLE(19b,100b) ++ _ASM_EXTABLE(20b,100b) ++ _ASM_EXTABLE(21b,100b) ++ _ASM_EXTABLE(22b,100b) ++ _ASM_EXTABLE(23b,100b) ++ _ASM_EXTABLE(24b,100b) ++ _ASM_EXTABLE(25b,100b) ++ _ASM_EXTABLE(26b,100b) ++ _ASM_EXTABLE(27b,100b) ++ _ASM_EXTABLE(28b,100b) ++ _ASM_EXTABLE(29b,100b) ++ _ASM_EXTABLE(30b,100b) ++ _ASM_EXTABLE(31b,100b) ++ _ASM_EXTABLE(32b,100b) ++ _ASM_EXTABLE(33b,100b) ++ _ASM_EXTABLE(34b,100b) ++ _ASM_EXTABLE(35b,100b) ++ _ASM_EXTABLE(36b,100b) ++ _ASM_EXTABLE(37b,100b) ++ _ASM_EXTABLE(99b,101b) ++ : "=&c"(size), "=&D" (d0), "=&S" (d1) ++ : "1"(to), "2"(from), "0"(size) ++ : "eax", "edx", "memory"); ++ return size; ++} ++ ++static unsigned long ++__generic_copy_from_user_intel(void *to, const void __user *from, unsigned long size) ++{ ++ int d0, d1; ++ __asm__ __volatile__( ++ " .align 2,0x90\n" ++ "1: "__copyuser_seg" movl 32(%4), %%eax\n" ++ " cmpl $67, %0\n" ++ " jbe 3f\n" ++ "2: "__copyuser_seg" movl 64(%4), %%eax\n" ++ " .align 2,0x90\n" ++ "3: "__copyuser_seg" movl 0(%4), %%eax\n" ++ "4: "__copyuser_seg" movl 4(%4), %%edx\n" ++ "5: movl %%eax, 0(%3)\n" ++ "6: movl %%edx, 4(%3)\n" ++ "7: "__copyuser_seg" movl 8(%4), %%eax\n" ++ "8: "__copyuser_seg" movl 12(%4),%%edx\n" ++ "9: movl %%eax, 8(%3)\n" ++ "10: movl %%edx, 12(%3)\n" ++ "11: "__copyuser_seg" movl 16(%4), %%eax\n" ++ "12: "__copyuser_seg" movl 20(%4), %%edx\n" ++ "13: movl %%eax, 16(%3)\n" ++ "14: movl %%edx, 20(%3)\n" ++ "15: "__copyuser_seg" movl 24(%4), %%eax\n" ++ "16: "__copyuser_seg" movl 28(%4), %%edx\n" ++ "17: movl %%eax, 24(%3)\n" ++ "18: movl %%edx, 28(%3)\n" ++ "19: "__copyuser_seg" movl 32(%4), %%eax\n" ++ "20: "__copyuser_seg" movl 36(%4), %%edx\n" ++ "21: movl %%eax, 32(%3)\n" ++ "22: movl %%edx, 36(%3)\n" ++ "23: "__copyuser_seg" movl 40(%4), %%eax\n" ++ "24: "__copyuser_seg" movl 44(%4), %%edx\n" ++ "25: movl %%eax, 40(%3)\n" ++ "26: movl %%edx, 44(%3)\n" ++ "27: "__copyuser_seg" movl 48(%4), %%eax\n" ++ "28: "__copyuser_seg" movl 52(%4), %%edx\n" ++ "29: movl %%eax, 48(%3)\n" ++ "30: movl %%edx, 52(%3)\n" ++ "31: "__copyuser_seg" movl 56(%4), %%eax\n" ++ "32: "__copyuser_seg" movl 60(%4), %%edx\n" ++ "33: movl %%eax, 56(%3)\n" ++ "34: movl %%edx, 60(%3)\n" ++ " addl $-64, %0\n" ++ " addl $64, %4\n" ++ " addl $64, %3\n" ++ " cmpl $63, %0\n" ++ " ja 1b\n" ++ "35: movl %0, %%eax\n" ++ " shrl $2, %0\n" ++ " andl $3, %%eax\n" ++ " cld\n" ++ "99: rep; "__copyuser_seg" movsl\n" ++ "36: movl %%eax, %0\n" ++ "37: rep; "__copyuser_seg" movsb\n" ++ "100:\n" + ".section .fixup,\"ax\"\n" + "101: lea 0(%%eax,%0,4),%0\n" + " jmp 100b\n" +@@ -207,41 +315,41 @@ __copy_user_zeroing_intel(void *to, const void __user *from, unsigned long size) + int d0, d1; + __asm__ __volatile__( + " .align 2,0x90\n" +- "0: movl 32(%4), %%eax\n" ++ "0: "__copyuser_seg" movl 32(%4), %%eax\n" + " cmpl $67, %0\n" + " jbe 2f\n" +- "1: movl 64(%4), %%eax\n" ++ "1: "__copyuser_seg" movl 64(%4), %%eax\n" + " .align 2,0x90\n" +- "2: movl 0(%4), %%eax\n" +- "21: movl 4(%4), %%edx\n" ++ "2: "__copyuser_seg" movl 0(%4), %%eax\n" ++ "21: "__copyuser_seg" movl 4(%4), %%edx\n" + " movl %%eax, 0(%3)\n" + " movl %%edx, 4(%3)\n" +- "3: movl 8(%4), %%eax\n" +- "31: movl 12(%4),%%edx\n" ++ "3: "__copyuser_seg" movl 8(%4), %%eax\n" ++ "31: "__copyuser_seg" movl 12(%4),%%edx\n" + " movl %%eax, 8(%3)\n" + " movl %%edx, 12(%3)\n" +- "4: movl 16(%4), %%eax\n" +- "41: movl 20(%4), %%edx\n" ++ "4: "__copyuser_seg" movl 16(%4), %%eax\n" ++ "41: "__copyuser_seg" movl 20(%4), %%edx\n" + " movl %%eax, 16(%3)\n" + " movl %%edx, 20(%3)\n" +- "10: movl 24(%4), %%eax\n" +- "51: movl 28(%4), %%edx\n" ++ "10: "__copyuser_seg" movl 24(%4), %%eax\n" ++ "51: "__copyuser_seg" movl 28(%4), %%edx\n" + " movl %%eax, 24(%3)\n" + " movl %%edx, 28(%3)\n" +- "11: movl 32(%4), %%eax\n" +- "61: movl 36(%4), %%edx\n" ++ "11: "__copyuser_seg" movl 32(%4), %%eax\n" ++ "61: "__copyuser_seg" movl 36(%4), %%edx\n" + " movl %%eax, 32(%3)\n" + " movl %%edx, 36(%3)\n" +- "12: movl 40(%4), %%eax\n" +- "71: movl 44(%4), %%edx\n" ++ "12: "__copyuser_seg" movl 40(%4), %%eax\n" ++ "71: "__copyuser_seg" movl 44(%4), %%edx\n" + " movl %%eax, 40(%3)\n" + " movl %%edx, 44(%3)\n" +- "13: movl 48(%4), %%eax\n" +- "81: movl 52(%4), %%edx\n" ++ "13: "__copyuser_seg" movl 48(%4), %%eax\n" ++ "81: "__copyuser_seg" movl 52(%4), %%edx\n" + " movl %%eax, 48(%3)\n" + " movl %%edx, 52(%3)\n" +- "14: movl 56(%4), %%eax\n" +- "91: movl 60(%4), %%edx\n" ++ "14: "__copyuser_seg" movl 56(%4), %%eax\n" ++ "91: "__copyuser_seg" movl 60(%4), %%edx\n" + " movl %%eax, 56(%3)\n" + " movl %%edx, 60(%3)\n" + " addl $-64, %0\n" +@@ -253,9 +361,9 @@ __copy_user_zeroing_intel(void *to, const void __user *from, unsigned long size) + " shrl $2, %0\n" + " andl $3, %%eax\n" + " cld\n" +- "6: rep; movsl\n" ++ "6: rep; "__copyuser_seg" movsl\n" + " movl %%eax,%0\n" +- "7: rep; movsb\n" ++ "7: rep; "__copyuser_seg" movsb\n" + "8:\n" + ".section .fixup,\"ax\"\n" + "9: lea 0(%%eax,%0,4),%0\n" +@@ -305,41 +413,41 @@ static unsigned long __copy_user_zeroing_intel_nocache(void *to, + + __asm__ __volatile__( + " .align 2,0x90\n" +- "0: movl 32(%4), %%eax\n" ++ "0: "__copyuser_seg" movl 32(%4), %%eax\n" + " cmpl $67, %0\n" + " jbe 2f\n" +- "1: movl 64(%4), %%eax\n" ++ "1: "__copyuser_seg" movl 64(%4), %%eax\n" + " .align 2,0x90\n" +- "2: movl 0(%4), %%eax\n" +- "21: movl 4(%4), %%edx\n" ++ "2: "__copyuser_seg" movl 0(%4), %%eax\n" ++ "21: "__copyuser_seg" movl 4(%4), %%edx\n" + " movnti %%eax, 0(%3)\n" + " movnti %%edx, 4(%3)\n" +- "3: movl 8(%4), %%eax\n" +- "31: movl 12(%4),%%edx\n" ++ "3: "__copyuser_seg" movl 8(%4), %%eax\n" ++ "31: "__copyuser_seg" movl 12(%4),%%edx\n" + " movnti %%eax, 8(%3)\n" + " movnti %%edx, 12(%3)\n" +- "4: movl 16(%4), %%eax\n" +- "41: movl 20(%4), %%edx\n" ++ "4: "__copyuser_seg" movl 16(%4), %%eax\n" ++ "41: "__copyuser_seg" movl 20(%4), %%edx\n" + " movnti %%eax, 16(%3)\n" + " movnti %%edx, 20(%3)\n" +- "10: movl 24(%4), %%eax\n" +- "51: movl 28(%4), %%edx\n" ++ "10: "__copyuser_seg" movl 24(%4), %%eax\n" ++ "51: "__copyuser_seg" movl 28(%4), %%edx\n" + " movnti %%eax, 24(%3)\n" + " movnti %%edx, 28(%3)\n" +- "11: movl 32(%4), %%eax\n" +- "61: movl 36(%4), %%edx\n" ++ "11: "__copyuser_seg" movl 32(%4), %%eax\n" ++ "61: "__copyuser_seg" movl 36(%4), %%edx\n" + " movnti %%eax, 32(%3)\n" + " movnti %%edx, 36(%3)\n" +- "12: movl 40(%4), %%eax\n" +- "71: movl 44(%4), %%edx\n" ++ "12: "__copyuser_seg" movl 40(%4), %%eax\n" ++ "71: "__copyuser_seg" movl 44(%4), %%edx\n" + " movnti %%eax, 40(%3)\n" + " movnti %%edx, 44(%3)\n" +- "13: movl 48(%4), %%eax\n" +- "81: movl 52(%4), %%edx\n" ++ "13: "__copyuser_seg" movl 48(%4), %%eax\n" ++ "81: "__copyuser_seg" movl 52(%4), %%edx\n" + " movnti %%eax, 48(%3)\n" + " movnti %%edx, 52(%3)\n" +- "14: movl 56(%4), %%eax\n" +- "91: movl 60(%4), %%edx\n" ++ "14: "__copyuser_seg" movl 56(%4), %%eax\n" ++ "91: "__copyuser_seg" movl 60(%4), %%edx\n" + " movnti %%eax, 56(%3)\n" + " movnti %%edx, 60(%3)\n" + " addl $-64, %0\n" +@@ -352,9 +460,9 @@ static unsigned long __copy_user_zeroing_intel_nocache(void *to, + " shrl $2, %0\n" + " andl $3, %%eax\n" + " cld\n" +- "6: rep; movsl\n" ++ "6: rep; "__copyuser_seg" movsl\n" + " movl %%eax,%0\n" +- "7: rep; movsb\n" ++ "7: rep; "__copyuser_seg" movsb\n" + "8:\n" + ".section .fixup,\"ax\"\n" + "9: lea 0(%%eax,%0,4),%0\n" +@@ -399,41 +507,41 @@ static unsigned long __copy_user_intel_nocache(void *to, + + __asm__ __volatile__( + " .align 2,0x90\n" +- "0: movl 32(%4), %%eax\n" ++ "0: "__copyuser_seg" movl 32(%4), %%eax\n" + " cmpl $67, %0\n" + " jbe 2f\n" +- "1: movl 64(%4), %%eax\n" ++ "1: "__copyuser_seg" movl 64(%4), %%eax\n" + " .align 2,0x90\n" +- "2: movl 0(%4), %%eax\n" +- "21: movl 4(%4), %%edx\n" ++ "2: "__copyuser_seg" movl 0(%4), %%eax\n" ++ "21: "__copyuser_seg" movl 4(%4), %%edx\n" + " movnti %%eax, 0(%3)\n" + " movnti %%edx, 4(%3)\n" +- "3: movl 8(%4), %%eax\n" +- "31: movl 12(%4),%%edx\n" ++ "3: "__copyuser_seg" movl 8(%4), %%eax\n" ++ "31: "__copyuser_seg" movl 12(%4),%%edx\n" + " movnti %%eax, 8(%3)\n" + " movnti %%edx, 12(%3)\n" +- "4: movl 16(%4), %%eax\n" +- "41: movl 20(%4), %%edx\n" ++ "4: "__copyuser_seg" movl 16(%4), %%eax\n" ++ "41: "__copyuser_seg" movl 20(%4), %%edx\n" + " movnti %%eax, 16(%3)\n" + " movnti %%edx, 20(%3)\n" +- "10: movl 24(%4), %%eax\n" +- "51: movl 28(%4), %%edx\n" ++ "10: "__copyuser_seg" movl 24(%4), %%eax\n" ++ "51: "__copyuser_seg" movl 28(%4), %%edx\n" + " movnti %%eax, 24(%3)\n" + " movnti %%edx, 28(%3)\n" +- "11: movl 32(%4), %%eax\n" +- "61: movl 36(%4), %%edx\n" ++ "11: "__copyuser_seg" movl 32(%4), %%eax\n" ++ "61: "__copyuser_seg" movl 36(%4), %%edx\n" + " movnti %%eax, 32(%3)\n" + " movnti %%edx, 36(%3)\n" +- "12: movl 40(%4), %%eax\n" +- "71: movl 44(%4), %%edx\n" ++ "12: "__copyuser_seg" movl 40(%4), %%eax\n" ++ "71: "__copyuser_seg" movl 44(%4), %%edx\n" + " movnti %%eax, 40(%3)\n" + " movnti %%edx, 44(%3)\n" +- "13: movl 48(%4), %%eax\n" +- "81: movl 52(%4), %%edx\n" ++ "13: "__copyuser_seg" movl 48(%4), %%eax\n" ++ "81: "__copyuser_seg" movl 52(%4), %%edx\n" + " movnti %%eax, 48(%3)\n" + " movnti %%edx, 52(%3)\n" +- "14: movl 56(%4), %%eax\n" +- "91: movl 60(%4), %%edx\n" ++ "14: "__copyuser_seg" movl 56(%4), %%eax\n" ++ "91: "__copyuser_seg" movl 60(%4), %%edx\n" + " movnti %%eax, 56(%3)\n" + " movnti %%edx, 60(%3)\n" + " addl $-64, %0\n" +@@ -446,9 +554,9 @@ static unsigned long __copy_user_intel_nocache(void *to, + " shrl $2, %0\n" + " andl $3, %%eax\n" + " cld\n" +- "6: rep; movsl\n" ++ "6: rep; "__copyuser_seg" movsl\n" + " movl %%eax,%0\n" +- "7: rep; movsb\n" ++ "7: rep; "__copyuser_seg" movsb\n" + "8:\n" + ".section .fixup,\"ax\"\n" + "9: lea 0(%%eax,%0,4),%0\n" +@@ -488,32 +596,36 @@ static unsigned long __copy_user_intel_nocache(void *to, + */ + unsigned long __copy_user_zeroing_intel(void *to, const void __user *from, + unsigned long size); +-unsigned long __copy_user_intel(void __user *to, const void *from, ++unsigned long __generic_copy_to_user_intel(void __user *to, const void *from, ++ unsigned long size); ++unsigned long __generic_copy_from_user_intel(void *to, const void __user *from, + unsigned long size); + unsigned long __copy_user_zeroing_intel_nocache(void *to, + const void __user *from, unsigned long size); + #endif /* CONFIG_X86_INTEL_USERCOPY */ + + /* Generic arbitrary sized copy. */ +-#define __copy_user(to, from, size) \ ++#define __copy_user(to, from, size, prefix, set, restore) \ + do { \ + int __d0, __d1, __d2; \ + __asm__ __volatile__( \ ++ set \ + " cmp $7,%0\n" \ + " jbe 1f\n" \ + " movl %1,%0\n" \ + " negl %0\n" \ + " andl $7,%0\n" \ + " subl %0,%3\n" \ +- "4: rep; movsb\n" \ ++ "4: rep; "prefix"movsb\n" \ + " movl %3,%0\n" \ + " shrl $2,%0\n" \ + " andl $3,%3\n" \ + " .align 2,0x90\n" \ +- "0: rep; movsl\n" \ ++ "0: rep; "prefix"movsl\n" \ + " movl %3,%0\n" \ +- "1: rep; movsb\n" \ ++ "1: rep; "prefix"movsb\n" \ + "2:\n" \ ++ restore \ + ".section .fixup,\"ax\"\n" \ + "5: addl %3,%0\n" \ + " jmp 2b\n" \ +@@ -538,14 +650,14 @@ do { \ + " negl %0\n" \ + " andl $7,%0\n" \ + " subl %0,%3\n" \ +- "4: rep; movsb\n" \ ++ "4: rep; "__copyuser_seg"movsb\n" \ + " movl %3,%0\n" \ + " shrl $2,%0\n" \ + " andl $3,%3\n" \ + " .align 2,0x90\n" \ +- "0: rep; movsl\n" \ ++ "0: rep; "__copyuser_seg"movsl\n" \ + " movl %3,%0\n" \ +- "1: rep; movsb\n" \ ++ "1: rep; "__copyuser_seg"movsb\n" \ + "2:\n" \ + ".section .fixup,\"ax\"\n" \ + "5: addl %3,%0\n" \ +@@ -572,9 +684,9 @@ unsigned long __copy_to_user_ll(void __user *to, const void *from, + { + stac(); + if (movsl_is_ok(to, from, n)) +- __copy_user(to, from, n); ++ __copy_user(to, from, n, "", __COPYUSER_SET_ES, __COPYUSER_RESTORE_ES); + else +- n = __copy_user_intel(to, from, n); ++ n = __generic_copy_to_user_intel(to, from, n); + clac(); + return n; + } +@@ -598,10 +710,9 @@ unsigned long __copy_from_user_ll_nozero(void *to, const void __user *from, + { + stac(); + if (movsl_is_ok(to, from, n)) +- __copy_user(to, from, n); ++ __copy_user(to, from, n, __copyuser_seg, "", ""); + else +- n = __copy_user_intel((void __user *)to, +- (const void *)from, n); ++ n = __generic_copy_from_user_intel(to, from, n); + clac(); + return n; + } +@@ -632,58 +743,38 @@ unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *fr + if (n > 64 && cpu_has_xmm2) + n = __copy_user_intel_nocache(to, from, n); + else +- __copy_user(to, from, n); ++ __copy_user(to, from, n, __copyuser_seg, "", ""); + #else +- __copy_user(to, from, n); ++ __copy_user(to, from, n, __copyuser_seg, "", ""); + #endif + clac(); + return n; + } + EXPORT_SYMBOL(__copy_from_user_ll_nocache_nozero); + +-/** +- * copy_to_user: - Copy a block of data into user space. +- * @to: Destination address, in user space. +- * @from: Source address, in kernel space. +- * @n: Number of bytes to copy. +- * +- * Context: User context only. This function may sleep. +- * +- * Copy data from kernel space to user space. +- * +- * Returns number of bytes that could not be copied. +- * On success, this will be zero. +- */ +-unsigned long _copy_to_user(void __user *to, const void *from, unsigned n) ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++void __set_fs(mm_segment_t x) + { +- if (access_ok(VERIFY_WRITE, to, n)) +- n = __copy_to_user(to, from, n); +- return n; ++ switch (x.seg) { ++ case 0: ++ loadsegment(gs, 0); ++ break; ++ case TASK_SIZE_MAX: ++ loadsegment(gs, __USER_DS); ++ break; ++ case -1UL: ++ loadsegment(gs, __KERNEL_DS); ++ break; ++ default: ++ BUG(); ++ } + } +-EXPORT_SYMBOL(_copy_to_user); ++EXPORT_SYMBOL(__set_fs); + +-/** +- * copy_from_user: - Copy a block of data from user space. +- * @to: Destination address, in kernel space. +- * @from: Source address, in user space. +- * @n: Number of bytes to copy. +- * +- * Context: User context only. This function may sleep. +- * +- * Copy data from user space to kernel space. +- * +- * Returns number of bytes that could not be copied. +- * On success, this will be zero. +- * +- * If some data could not be copied, this function will pad the copied +- * data to the requested size using zero bytes. +- */ +-unsigned long _copy_from_user(void *to, const void __user *from, unsigned n) ++void set_fs(mm_segment_t x) + { +- if (access_ok(VERIFY_READ, from, n)) +- n = __copy_from_user(to, from, n); +- else +- memset(to, 0, n); +- return n; ++ current_thread_info()->addr_limit = x; ++ __set_fs(x); + } +-EXPORT_SYMBOL(_copy_from_user); ++EXPORT_SYMBOL(set_fs); ++#endif +diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c +index c905e89..01ab928 100644 +--- a/arch/x86/lib/usercopy_64.c ++++ b/arch/x86/lib/usercopy_64.c +@@ -18,6 +18,7 @@ unsigned long __clear_user(void __user *addr, unsigned long size) + might_fault(); + /* no memory constraint because it doesn't change any memory gcc knows + about */ ++ pax_open_userland(); + stac(); + asm volatile( + " testq %[size8],%[size8]\n" +@@ -39,9 +40,10 @@ unsigned long __clear_user(void __user *addr, unsigned long size) + _ASM_EXTABLE(0b,3b) + _ASM_EXTABLE(1b,2b) + : [size8] "=&c"(size), [dst] "=&D" (__d0) +- : [size1] "r"(size & 7), "[size8]" (size / 8), "[dst]"(addr), ++ : [size1] "r"(size & 7), "[size8]" (size / 8), "[dst]"(____m(addr)), + [zero] "r" (0UL), [eight] "r" (8UL)); + clac(); ++ pax_close_userland(); + return size; + } + EXPORT_SYMBOL(__clear_user); +@@ -54,12 +56,11 @@ unsigned long clear_user(void __user *to, unsigned long n) + } + EXPORT_SYMBOL(clear_user); + +-unsigned long copy_in_user(void __user *to, const void __user *from, unsigned len) ++unsigned long copy_in_user(void __user *to, const void __user *from, unsigned long len) + { +- if (access_ok(VERIFY_WRITE, to, len) && access_ok(VERIFY_READ, from, len)) { +- return copy_user_generic((__force void *)to, (__force void *)from, len); +- } +- return len; ++ if (access_ok(VERIFY_WRITE, to, len) && access_ok(VERIFY_READ, from, len)) ++ return copy_user_generic((void __force_kernel *)____m(to), (void __force_kernel *)____m(from), len); ++ return len; + } + EXPORT_SYMBOL(copy_in_user); + +@@ -69,11 +70,13 @@ EXPORT_SYMBOL(copy_in_user); + * it is not necessary to optimize tail handling. + */ + __visible unsigned long +-copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest) ++copy_user_handle_tail(char __user *to, char __user *from, unsigned long len, unsigned zerorest) + { + char c; + unsigned zero_len; + ++ clac(); ++ pax_close_userland(); + for (; len; --len, to++) { + if (__get_user_nocheck(c, from++, sizeof(char))) + break; +@@ -84,6 +87,5 @@ copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest) + for (c = 0, zero_len = len; zerorest && zero_len; --zero_len) + if (__put_user_nocheck(c, to++, sizeof(char))) + break; +- clac(); + return len; + } +diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile +index 6a19ad9..1c48f9a 100644 +--- a/arch/x86/mm/Makefile ++++ b/arch/x86/mm/Makefile +@@ -30,3 +30,7 @@ obj-$(CONFIG_ACPI_NUMA) += srat.o + obj-$(CONFIG_NUMA_EMU) += numa_emulation.o + + obj-$(CONFIG_MEMTEST) += memtest.o ++ ++quote:=" ++obj-$(CONFIG_X86_64) += uderef_64.o ++CFLAGS_uderef_64.o := $(subst $(quote),,$(CONFIG_ARCH_HWEIGHT_CFLAGS)) +diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c +index 903ec1e..c4166b2 100644 +--- a/arch/x86/mm/extable.c ++++ b/arch/x86/mm/extable.c +@@ -6,12 +6,24 @@ + static inline unsigned long + ex_insn_addr(const struct exception_table_entry *x) + { +- return (unsigned long)&x->insn + x->insn; ++ unsigned long reloc = 0; ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ reloc = ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++#endif ++ ++ return (unsigned long)&x->insn + x->insn + reloc; + } + static inline unsigned long + ex_fixup_addr(const struct exception_table_entry *x) + { +- return (unsigned long)&x->fixup + x->fixup; ++ unsigned long reloc = 0; ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ reloc = ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++#endif ++ ++ return (unsigned long)&x->fixup + x->fixup + reloc; + } + + int fixup_exception(struct pt_regs *regs) +@@ -20,7 +32,7 @@ int fixup_exception(struct pt_regs *regs) + unsigned long new_ip; + + #ifdef CONFIG_PNPBIOS +- if (unlikely(SEGMENT_IS_PNP_CODE(regs->cs))) { ++ if (unlikely(!v8086_mode(regs) && SEGMENT_IS_PNP_CODE(regs->cs))) { + extern u32 pnp_bios_fault_eip, pnp_bios_fault_esp; + extern u32 pnp_bios_is_utter_crap; + pnp_bios_is_utter_crap = 1; +@@ -145,6 +157,13 @@ void sort_extable(struct exception_table_entry *start, + i += 4; + p->fixup -= i; + i += 4; ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ BUILD_BUG_ON(!IS_ENABLED(CONFIG_BUILDTIME_EXTABLE_SORT)); ++ p->insn -= ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++ p->fixup -= ____LOAD_PHYSICAL_ADDR - LOAD_PHYSICAL_ADDR; ++#endif ++ + } + } + +diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c +index 4d8ee82..ffc1011 100644 +--- a/arch/x86/mm/fault.c ++++ b/arch/x86/mm/fault.c +@@ -13,12 +13,19 @@ + #include <linux/hugetlb.h> /* hstate_index_to_shift */ + #include <linux/prefetch.h> /* prefetchw */ + #include <linux/context_tracking.h> /* exception_enter(), ... */ ++#include <linux/unistd.h> ++#include <linux/compiler.h> + + #include <asm/traps.h> /* dotraplinkage, ... */ + #include <asm/pgalloc.h> /* pgd_*(), ... */ + #include <asm/kmemcheck.h> /* kmemcheck_*(), ... */ + #include <asm/fixmap.h> /* VSYSCALL_ADDR */ + #include <asm/vsyscall.h> /* emulate_vsyscall */ ++#include <asm/tlbflush.h> ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++#include <asm/stacktrace.h> ++#endif + + #define CREATE_TRACE_POINTS + #include <asm/trace/exceptions.h> +@@ -59,7 +66,7 @@ static nokprobe_inline int kprobes_fault(struct pt_regs *regs) + int ret = 0; + + /* kprobe_running() needs smp_processor_id() */ +- if (kprobes_built_in() && !user_mode_vm(regs)) { ++ if (kprobes_built_in() && !user_mode(regs)) { + preempt_disable(); + if (kprobe_running() && kprobe_fault_handler(regs, 14)) + ret = 1; +@@ -120,7 +127,10 @@ check_prefetch_opcode(struct pt_regs *regs, unsigned char *instr, + return !instr_lo || (instr_lo>>1) == 1; + case 0x00: + /* Prefetch instruction is 0x0F0D or 0x0F18 */ +- if (probe_kernel_address(instr, opcode)) ++ if (user_mode(regs)) { ++ if (__copy_from_user_inatomic(&opcode, (unsigned char __force_user *)(instr), 1)) ++ return 0; ++ } else if (probe_kernel_address(instr, opcode)) + return 0; + + *prefetch = (instr_lo == 0xF) && +@@ -154,7 +164,10 @@ is_prefetch(struct pt_regs *regs, unsigned long error_code, unsigned long addr) + while (instr < max_instr) { + unsigned char opcode; + +- if (probe_kernel_address(instr, opcode)) ++ if (user_mode(regs)) { ++ if (__copy_from_user_inatomic(&opcode, (unsigned char __force_user *)(instr), 1)) ++ break; ++ } else if (probe_kernel_address(instr, opcode)) + break; + + instr++; +@@ -185,6 +198,34 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address, + force_sig_info(si_signo, &info, tsk); + } + ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++static bool pax_is_fetch_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address); ++#endif ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++static int pax_handle_fetch_fault(struct pt_regs *regs); ++#endif ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++static inline pmd_t * pax_get_pmd(struct mm_struct *mm, unsigned long address) ++{ ++ pgd_t *pgd; ++ pud_t *pud; ++ pmd_t *pmd; ++ ++ pgd = pgd_offset(mm, address); ++ if (!pgd_present(*pgd)) ++ return NULL; ++ pud = pud_offset(pgd, address); ++ if (!pud_present(*pud)) ++ return NULL; ++ pmd = pmd_offset(pud, address); ++ if (!pmd_present(*pmd)) ++ return NULL; ++ return pmd; ++} ++#endif ++ + DEFINE_SPINLOCK(pgd_lock); + LIST_HEAD(pgd_list); + +@@ -235,10 +276,27 @@ void vmalloc_sync_all(void) + for (address = VMALLOC_START & PMD_MASK; + address >= TASK_SIZE && address < FIXADDR_TOP; + address += PMD_SIZE) { ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ unsigned long cpu; ++#else + struct page *page; ++#endif + + spin_lock(&pgd_lock); ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ for (cpu = 0; cpu < nr_cpu_ids; ++cpu) { ++ pgd_t *pgd = get_cpu_pgd(cpu, user); ++ pmd_t *ret; ++ ++ ret = vmalloc_sync_one(pgd, address); ++ if (!ret) ++ break; ++ pgd = get_cpu_pgd(cpu, kernel); ++#else + list_for_each_entry(page, &pgd_list, lru) { ++ pgd_t *pgd; + spinlock_t *pgt_lock; + pmd_t *ret; + +@@ -246,8 +304,14 @@ void vmalloc_sync_all(void) + pgt_lock = &pgd_page_get_mm(page)->page_table_lock; + + spin_lock(pgt_lock); +- ret = vmalloc_sync_one(page_address(page), address); ++ pgd = page_address(page); ++#endif ++ ++ ret = vmalloc_sync_one(pgd, address); ++ ++#ifndef CONFIG_PAX_PER_CPU_PGD + spin_unlock(pgt_lock); ++#endif + + if (!ret) + break; +@@ -281,6 +345,12 @@ static noinline int vmalloc_fault(unsigned long address) + * an interrupt in the middle of a task switch.. + */ + pgd_paddr = read_cr3(); ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ BUG_ON(__pa(get_cpu_pgd(smp_processor_id(), kernel)) != (pgd_paddr & __PHYSICAL_MASK)); ++ vmalloc_sync_one(__va(pgd_paddr + PAGE_SIZE), address); ++#endif ++ + pmd_k = vmalloc_sync_one(__va(pgd_paddr), address); + if (!pmd_k) + return -1; +@@ -377,11 +447,25 @@ static noinline int vmalloc_fault(unsigned long address) + * happen within a race in page table update. In the later + * case just flush: + */ +- pgd = pgd_offset(current->active_mm, address); ++ + pgd_ref = pgd_offset_k(address); + if (pgd_none(*pgd_ref)) + return -1; + ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ BUG_ON(__pa(get_cpu_pgd(smp_processor_id(), kernel)) != (read_cr3() & __PHYSICAL_MASK)); ++ pgd = pgd_offset_cpu(smp_processor_id(), user, address); ++ if (pgd_none(*pgd)) { ++ set_pgd(pgd, *pgd_ref); ++ arch_flush_lazy_mmu_mode(); ++ } else { ++ BUG_ON(pgd_page_vaddr(*pgd) != pgd_page_vaddr(*pgd_ref)); ++ } ++ pgd = pgd_offset_cpu(smp_processor_id(), kernel, address); ++#else ++ pgd = pgd_offset(current->active_mm, address); ++#endif ++ + if (pgd_none(*pgd)) { + set_pgd(pgd, *pgd_ref); + arch_flush_lazy_mmu_mode(); +@@ -548,7 +632,7 @@ static int is_errata93(struct pt_regs *regs, unsigned long address) + static int is_errata100(struct pt_regs *regs, unsigned long address) + { + #ifdef CONFIG_X86_64 +- if ((regs->cs == __USER32_CS || (regs->cs & (1<<2))) && (address >> 32)) ++ if ((regs->cs == __USER32_CS || (regs->cs & SEGMENT_LDT)) && (address >> 32)) + return 1; + #endif + return 0; +@@ -575,9 +659,9 @@ static int is_f00f_bug(struct pt_regs *regs, unsigned long address) + } + + static const char nx_warning[] = KERN_CRIT +-"kernel tried to execute NX-protected page - exploit attempt? (uid: %d)\n"; ++"kernel tried to execute NX-protected page - exploit attempt? (uid: %d, task: %s, pid: %d)\n"; + static const char smep_warning[] = KERN_CRIT +-"unable to execute userspace code (SMEP?) (uid: %d)\n"; ++"unable to execute userspace code (SMEP?) (uid: %d, task: %s, pid: %d)\n"; + + static void + show_fault_oops(struct pt_regs *regs, unsigned long error_code, +@@ -586,7 +670,7 @@ show_fault_oops(struct pt_regs *regs, unsigned long error_code, + if (!oops_may_print()) + return; + +- if (error_code & PF_INSTR) { ++ if ((__supported_pte_mask & _PAGE_NX) && (error_code & PF_INSTR)) { + unsigned int level; + pgd_t *pgd; + pte_t *pte; +@@ -597,12 +681,24 @@ show_fault_oops(struct pt_regs *regs, unsigned long error_code, + pte = lookup_address_in_pgd(pgd, address, &level); + + if (pte && pte_present(*pte) && !pte_exec(*pte)) +- printk(nx_warning, from_kuid(&init_user_ns, current_uid())); ++ printk(nx_warning, from_kuid_munged(&init_user_ns, current_uid()), current->comm, task_pid_nr(current)); + if (pte && pte_present(*pte) && pte_exec(*pte) && + (pgd_flags(*pgd) & _PAGE_USER) && + (read_cr4() & X86_CR4_SMEP)) +- printk(smep_warning, from_kuid(&init_user_ns, current_uid())); ++ printk(smep_warning, from_kuid(&init_user_ns, current_uid()), current->comm, task_pid_nr(current)); ++ } ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ if (init_mm.start_code <= address && address < init_mm.end_code) { ++ if (current->signal->curr_ip) ++ printk(KERN_ERR "PAX: From %pI4: %s:%d, uid/euid: %u/%u, attempted to modify kernel code\n", ++ ¤t->signal->curr_ip, current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid())); ++ else ++ printk(KERN_ERR "PAX: %s:%d, uid/euid: %u/%u, attempted to modify kernel code\n", current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid())); + } ++#endif + + printk(KERN_ALERT "BUG: unable to handle kernel "); + if (address < PAGE_SIZE) +@@ -782,6 +878,22 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code, + return; + } + #endif ++ ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++ if (pax_is_fetch_fault(regs, error_code, address)) { ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ switch (pax_handle_fetch_fault(regs)) { ++ case 2: ++ return; ++ } ++#endif ++ ++ pax_report_fault(regs, (void *)regs->ip, (void *)regs->sp); ++ do_group_exit(SIGKILL); ++ } ++#endif ++ + /* Kernel addresses are always protection faults: */ + if (address >= TASK_SIZE) + error_code |= PF_PROT; +@@ -864,7 +976,7 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address, + if (fault & (VM_FAULT_HWPOISON|VM_FAULT_HWPOISON_LARGE)) { + printk(KERN_ERR + "MCE: Killing %s:%d due to hardware memory corruption fault at %lx\n", +- tsk->comm, tsk->pid, address); ++ tsk->comm, task_pid_nr(tsk), address); + code = BUS_MCEERR_AR; + } + #endif +@@ -916,6 +1028,99 @@ static int spurious_fault_check(unsigned long error_code, pte_t *pte) + return 1; + } + ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_PAGEEXEC) ++static int pax_handle_pageexec_fault(struct pt_regs *regs, struct mm_struct *mm, unsigned long address, unsigned long error_code) ++{ ++ pte_t *pte; ++ pmd_t *pmd; ++ spinlock_t *ptl; ++ unsigned char pte_mask; ++ ++ if ((__supported_pte_mask & _PAGE_NX) || (error_code & (PF_PROT|PF_USER)) != (PF_PROT|PF_USER) || v8086_mode(regs) || ++ !(mm->pax_flags & MF_PAX_PAGEEXEC)) ++ return 0; ++ ++ /* PaX: it's our fault, let's handle it if we can */ ++ ++ /* PaX: take a look at read faults before acquiring any locks */ ++ if (unlikely(!(error_code & PF_WRITE) && (regs->ip == address))) { ++ /* instruction fetch attempt from a protected page in user mode */ ++ up_read(&mm->mmap_sem); ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ switch (pax_handle_fetch_fault(regs)) { ++ case 2: ++ return 1; ++ } ++#endif ++ ++ pax_report_fault(regs, (void *)regs->ip, (void *)regs->sp); ++ do_group_exit(SIGKILL); ++ } ++ ++ pmd = pax_get_pmd(mm, address); ++ if (unlikely(!pmd)) ++ return 0; ++ ++ pte = pte_offset_map_lock(mm, pmd, address, &ptl); ++ if (unlikely(!(pte_val(*pte) & _PAGE_PRESENT) || pte_user(*pte))) { ++ pte_unmap_unlock(pte, ptl); ++ return 0; ++ } ++ ++ if (unlikely((error_code & PF_WRITE) && !pte_write(*pte))) { ++ /* write attempt to a protected page in user mode */ ++ pte_unmap_unlock(pte, ptl); ++ return 0; ++ } ++ ++#ifdef CONFIG_SMP ++ if (likely(address > get_limit(regs->cs) && cpu_isset(smp_processor_id(), mm->context.cpu_user_cs_mask))) ++#else ++ if (likely(address > get_limit(regs->cs))) ++#endif ++ { ++ set_pte(pte, pte_mkread(*pte)); ++ __flush_tlb_one(address); ++ pte_unmap_unlock(pte, ptl); ++ up_read(&mm->mmap_sem); ++ return 1; ++ } ++ ++ pte_mask = _PAGE_ACCESSED | _PAGE_USER | ((error_code & PF_WRITE) << (_PAGE_BIT_DIRTY-1)); ++ ++ /* ++ * PaX: fill DTLB with user rights and retry ++ */ ++ __asm__ __volatile__ ( ++ "orb %2,(%1)\n" ++#if defined(CONFIG_M586) || defined(CONFIG_M586TSC) ++/* ++ * PaX: let this uncommented 'invlpg' remind us on the behaviour of Intel's ++ * (and AMD's) TLBs. namely, they do not cache PTEs that would raise *any* ++ * page fault when examined during a TLB load attempt. this is true not only ++ * for PTEs holding a non-present entry but also present entries that will ++ * raise a page fault (such as those set up by PaX, or the copy-on-write ++ * mechanism). in effect it means that we do *not* need to flush the TLBs ++ * for our target pages since their PTEs are simply not in the TLBs at all. ++ ++ * the best thing in omitting it is that we gain around 15-20% speed in the ++ * fast path of the page fault handler and can get rid of tracing since we ++ * can no longer flush unintended entries. ++ */ ++ "invlpg (%0)\n" ++#endif ++ __copyuser_seg"testb $0,(%0)\n" ++ "xorb %3,(%1)\n" ++ : ++ : "r" (address), "r" (pte), "q" (pte_mask), "i" (_PAGE_USER) ++ : "memory", "cc"); ++ pte_unmap_unlock(pte, ptl); ++ up_read(&mm->mmap_sem); ++ return 1; ++} ++#endif ++ + /* + * Handle a spurious fault caused by a stale TLB entry. + * +@@ -1001,6 +1206,9 @@ int show_unhandled_signals = 1; + static inline int + access_error(unsigned long error_code, struct vm_area_struct *vma) + { ++ if ((__supported_pte_mask & _PAGE_NX) && (error_code & PF_INSTR) && !(vma->vm_flags & VM_EXEC)) ++ return 1; ++ + if (error_code & PF_WRITE) { + /* write, present and write, not present: */ + if (unlikely(!(vma->vm_flags & VM_WRITE))) +@@ -1035,7 +1243,7 @@ static inline bool smap_violation(int error_code, struct pt_regs *regs) + if (error_code & PF_USER) + return false; + +- if (!user_mode_vm(regs) && (regs->flags & X86_EFLAGS_AC)) ++ if (!user_mode(regs) && (regs->flags & X86_EFLAGS_AC)) + return false; + + return true; +@@ -1063,6 +1271,22 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code, + tsk = current; + mm = tsk->mm; + ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ if (!user_mode(regs) && address < 2 * pax_user_shadow_base) { ++ if (!search_exception_tables(regs->ip)) { ++ printk(KERN_ERR "PAX: please report this to pageexec@freemail.hu\n"); ++ bad_area_nosemaphore(regs, error_code, address); ++ return; ++ } ++ if (address < pax_user_shadow_base) { ++ printk(KERN_ERR "PAX: please report this to pageexec@freemail.hu\n"); ++ printk(KERN_ERR "PAX: faulting IP: %pS\n", (void *)regs->ip); ++ show_trace_log_lvl(NULL, NULL, (void *)regs->sp, regs->bp, KERN_ERR); ++ } else ++ address -= pax_user_shadow_base; ++ } ++#endif ++ + /* + * Detect and handle instructions that would cause a page fault for + * both a tracked kernel page and a userspace page. +@@ -1140,7 +1364,7 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code, + * User-mode registers count as a user access even for any + * potential system fault or CPU buglet: + */ +- if (user_mode_vm(regs)) { ++ if (user_mode(regs)) { + local_irq_enable(); + error_code |= PF_USER; + flags |= FAULT_FLAG_USER; +@@ -1187,6 +1411,11 @@ retry: + might_sleep(); + } + ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_PAGEEXEC) ++ if (pax_handle_pageexec_fault(regs, mm, address, error_code)) ++ return; ++#endif ++ + vma = find_vma(mm, address); + if (unlikely(!vma)) { + bad_area(regs, error_code, address); +@@ -1198,18 +1427,24 @@ retry: + bad_area(regs, error_code, address); + return; + } +- if (error_code & PF_USER) { +- /* +- * Accessing the stack below %sp is always a bug. +- * The large cushion allows instructions like enter +- * and pusha to work. ("enter $65535, $31" pushes +- * 32 pointers and then decrements %sp by 65535.) +- */ +- if (unlikely(address + 65536 + 32 * sizeof(unsigned long) < regs->sp)) { +- bad_area(regs, error_code, address); +- return; +- } ++ /* ++ * Accessing the stack below %sp is always a bug. ++ * The large cushion allows instructions like enter ++ * and pusha to work. ("enter $65535, $31" pushes ++ * 32 pointers and then decrements %sp by 65535.) ++ */ ++ if (unlikely(address + 65536 + 32 * sizeof(unsigned long) < task_pt_regs(tsk)->sp)) { ++ bad_area(regs, error_code, address); ++ return; + } ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (unlikely((mm->pax_flags & MF_PAX_SEGMEXEC) && vma->vm_end - SEGMEXEC_TASK_SIZE - 1 < address - SEGMEXEC_TASK_SIZE - 1)) { ++ bad_area(regs, error_code, address); ++ return; ++ } ++#endif ++ + if (unlikely(expand_stack(vma, address))) { + bad_area(regs, error_code, address); + return; +@@ -1327,3 +1562,292 @@ trace_do_page_fault(struct pt_regs *regs, unsigned long error_code) + } + NOKPROBE_SYMBOL(trace_do_page_fault); + #endif /* CONFIG_TRACING */ ++ ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++static bool pax_is_fetch_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address) ++{ ++ struct mm_struct *mm = current->mm; ++ unsigned long ip = regs->ip; ++ ++ if (v8086_mode(regs)) ++ ip = ((regs->cs & 0xffff) << 4) + (ip & 0xffff); ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (mm->pax_flags & MF_PAX_PAGEEXEC) { ++ if ((__supported_pte_mask & _PAGE_NX) && (error_code & PF_INSTR)) ++ return true; ++ if (!(error_code & (PF_PROT | PF_WRITE)) && ip == address) ++ return true; ++ return false; ++ } ++#endif ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) { ++ if (!(error_code & (PF_PROT | PF_WRITE)) && (ip + SEGMEXEC_TASK_SIZE == address)) ++ return true; ++ return false; ++ } ++#endif ++ ++ return false; ++} ++#endif ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++static int pax_handle_fetch_fault_32(struct pt_regs *regs) ++{ ++ int err; ++ ++ do { /* PaX: libffi trampoline emulation */ ++ unsigned char mov, jmp; ++ unsigned int addr1, addr2; ++ ++#ifdef CONFIG_X86_64 ++ if ((regs->ip + 9) >> 32) ++ break; ++#endif ++ ++ err = get_user(mov, (unsigned char __user *)regs->ip); ++ err |= get_user(addr1, (unsigned int __user *)(regs->ip + 1)); ++ err |= get_user(jmp, (unsigned char __user *)(regs->ip + 5)); ++ err |= get_user(addr2, (unsigned int __user *)(regs->ip + 6)); ++ ++ if (err) ++ break; ++ ++ if (mov == 0xB8 && jmp == 0xE9) { ++ regs->ax = addr1; ++ regs->ip = (unsigned int)(regs->ip + addr2 + 10); ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: gcc trampoline emulation #1 */ ++ unsigned char mov1, mov2; ++ unsigned short jmp; ++ unsigned int addr1, addr2; ++ ++#ifdef CONFIG_X86_64 ++ if ((regs->ip + 11) >> 32) ++ break; ++#endif ++ ++ err = get_user(mov1, (unsigned char __user *)regs->ip); ++ err |= get_user(addr1, (unsigned int __user *)(regs->ip + 1)); ++ err |= get_user(mov2, (unsigned char __user *)(regs->ip + 5)); ++ err |= get_user(addr2, (unsigned int __user *)(regs->ip + 6)); ++ err |= get_user(jmp, (unsigned short __user *)(regs->ip + 10)); ++ ++ if (err) ++ break; ++ ++ if (mov1 == 0xB9 && mov2 == 0xB8 && jmp == 0xE0FF) { ++ regs->cx = addr1; ++ regs->ax = addr2; ++ regs->ip = addr2; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: gcc trampoline emulation #2 */ ++ unsigned char mov, jmp; ++ unsigned int addr1, addr2; ++ ++#ifdef CONFIG_X86_64 ++ if ((regs->ip + 9) >> 32) ++ break; ++#endif ++ ++ err = get_user(mov, (unsigned char __user *)regs->ip); ++ err |= get_user(addr1, (unsigned int __user *)(regs->ip + 1)); ++ err |= get_user(jmp, (unsigned char __user *)(regs->ip + 5)); ++ err |= get_user(addr2, (unsigned int __user *)(regs->ip + 6)); ++ ++ if (err) ++ break; ++ ++ if (mov == 0xB9 && jmp == 0xE9) { ++ regs->cx = addr1; ++ regs->ip = (unsigned int)(regs->ip + addr2 + 10); ++ return 2; ++ } ++ } while (0); ++ ++ return 1; /* PaX in action */ ++} ++ ++#ifdef CONFIG_X86_64 ++static int pax_handle_fetch_fault_64(struct pt_regs *regs) ++{ ++ int err; ++ ++ do { /* PaX: libffi trampoline emulation */ ++ unsigned short mov1, mov2, jmp1; ++ unsigned char stcclc, jmp2; ++ unsigned long addr1, addr2; ++ ++ err = get_user(mov1, (unsigned short __user *)regs->ip); ++ err |= get_user(addr1, (unsigned long __user *)(regs->ip + 2)); ++ err |= get_user(mov2, (unsigned short __user *)(regs->ip + 10)); ++ err |= get_user(addr2, (unsigned long __user *)(regs->ip + 12)); ++ err |= get_user(stcclc, (unsigned char __user *)(regs->ip + 20)); ++ err |= get_user(jmp1, (unsigned short __user *)(regs->ip + 21)); ++ err |= get_user(jmp2, (unsigned char __user *)(regs->ip + 23)); ++ ++ if (err) ++ break; ++ ++ if (mov1 == 0xBB49 && mov2 == 0xBA49 && (stcclc == 0xF8 || stcclc == 0xF9) && jmp1 == 0xFF49 && jmp2 == 0xE3) { ++ regs->r11 = addr1; ++ regs->r10 = addr2; ++ if (stcclc == 0xF8) ++ regs->flags &= ~X86_EFLAGS_CF; ++ else ++ regs->flags |= X86_EFLAGS_CF; ++ regs->ip = addr1; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: gcc trampoline emulation #1 */ ++ unsigned short mov1, mov2, jmp1; ++ unsigned char jmp2; ++ unsigned int addr1; ++ unsigned long addr2; ++ ++ err = get_user(mov1, (unsigned short __user *)regs->ip); ++ err |= get_user(addr1, (unsigned int __user *)(regs->ip + 2)); ++ err |= get_user(mov2, (unsigned short __user *)(regs->ip + 6)); ++ err |= get_user(addr2, (unsigned long __user *)(regs->ip + 8)); ++ err |= get_user(jmp1, (unsigned short __user *)(regs->ip + 16)); ++ err |= get_user(jmp2, (unsigned char __user *)(regs->ip + 18)); ++ ++ if (err) ++ break; ++ ++ if (mov1 == 0xBB41 && mov2 == 0xBA49 && jmp1 == 0xFF49 && jmp2 == 0xE3) { ++ regs->r11 = addr1; ++ regs->r10 = addr2; ++ regs->ip = addr1; ++ return 2; ++ } ++ } while (0); ++ ++ do { /* PaX: gcc trampoline emulation #2 */ ++ unsigned short mov1, mov2, jmp1; ++ unsigned char jmp2; ++ unsigned long addr1, addr2; ++ ++ err = get_user(mov1, (unsigned short __user *)regs->ip); ++ err |= get_user(addr1, (unsigned long __user *)(regs->ip + 2)); ++ err |= get_user(mov2, (unsigned short __user *)(regs->ip + 10)); ++ err |= get_user(addr2, (unsigned long __user *)(regs->ip + 12)); ++ err |= get_user(jmp1, (unsigned short __user *)(regs->ip + 20)); ++ err |= get_user(jmp2, (unsigned char __user *)(regs->ip + 22)); ++ ++ if (err) ++ break; ++ ++ if (mov1 == 0xBB49 && mov2 == 0xBA49 && jmp1 == 0xFF49 && jmp2 == 0xE3) { ++ regs->r11 = addr1; ++ regs->r10 = addr2; ++ regs->ip = addr1; ++ return 2; ++ } ++ } while (0); ++ ++ return 1; /* PaX in action */ ++} ++#endif ++ ++/* ++ * PaX: decide what to do with offenders (regs->ip = fault address) ++ * ++ * returns 1 when task should be killed ++ * 2 when gcc trampoline was detected ++ */ ++static int pax_handle_fetch_fault(struct pt_regs *regs) ++{ ++ if (v8086_mode(regs)) ++ return 1; ++ ++ if (!(current->mm->pax_flags & MF_PAX_EMUTRAMP)) ++ return 1; ++ ++#ifdef CONFIG_X86_32 ++ return pax_handle_fetch_fault_32(regs); ++#else ++ if (regs->cs == __USER32_CS || (regs->cs & SEGMENT_LDT)) ++ return pax_handle_fetch_fault_32(regs); ++ else ++ return pax_handle_fetch_fault_64(regs); ++#endif ++} ++#endif ++ ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++void pax_report_insns(struct pt_regs *regs, void *pc, void *sp) ++{ ++ long i; ++ ++ printk(KERN_ERR "PAX: bytes at PC: "); ++ for (i = 0; i < 20; i++) { ++ unsigned char c; ++ if (get_user(c, (unsigned char __force_user *)pc+i)) ++ printk(KERN_CONT "?? "); ++ else ++ printk(KERN_CONT "%02x ", c); ++ } ++ printk("\n"); ++ ++ printk(KERN_ERR "PAX: bytes at SP-%lu: ", (unsigned long)sizeof(long)); ++ for (i = -1; i < 80 / (long)sizeof(long); i++) { ++ unsigned long c; ++ if (get_user(c, (unsigned long __force_user *)sp+i)) { ++#ifdef CONFIG_X86_32 ++ printk(KERN_CONT "???????? "); ++#else ++ if ((regs->cs == __USER32_CS || (regs->cs & SEGMENT_LDT))) ++ printk(KERN_CONT "???????? ???????? "); ++ else ++ printk(KERN_CONT "???????????????? "); ++#endif ++ } else { ++#ifdef CONFIG_X86_64 ++ if ((regs->cs == __USER32_CS || (regs->cs & SEGMENT_LDT))) { ++ printk(KERN_CONT "%08x ", (unsigned int)c); ++ printk(KERN_CONT "%08x ", (unsigned int)(c >> 32)); ++ } else ++#endif ++ printk(KERN_CONT "%0*lx ", 2 * (int)sizeof(long), c); ++ } ++ } ++ printk("\n"); ++} ++#endif ++ ++/** ++ * probe_kernel_write(): safely attempt to write to a location ++ * @dst: address to write to ++ * @src: pointer to the data that shall be written ++ * @size: size of the data chunk ++ * ++ * Safely write to address @dst from the buffer at @src. If a kernel fault ++ * happens, handle that and return -EFAULT. ++ */ ++long notrace probe_kernel_write(void *dst, const void *src, size_t size) ++{ ++ long ret; ++ mm_segment_t old_fs = get_fs(); ++ ++ set_fs(KERNEL_DS); ++ pagefault_disable(); ++ pax_open_kernel(); ++ ret = __copy_to_user_inatomic((void __force_user *)dst, src, size); ++ pax_close_kernel(); ++ pagefault_enable(); ++ set_fs(old_fs); ++ ++ return ret ? -EFAULT : 0; ++} +diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c +index 448ee89..88fe381 100644 +--- a/arch/x86/mm/gup.c ++++ b/arch/x86/mm/gup.c +@@ -268,7 +268,7 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, + addr = start; + len = (unsigned long) nr_pages << PAGE_SHIFT; + end = start + len; +- if (unlikely(!access_ok(write ? VERIFY_WRITE : VERIFY_READ, ++ if (unlikely(!access_ok_noprefault(write ? VERIFY_WRITE : VERIFY_READ, + (void __user *)start, len))) + return 0; + +@@ -344,6 +344,10 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write, + goto slow_irqon; + #endif + ++ if (unlikely(!access_ok_noprefault(write ? VERIFY_WRITE : VERIFY_READ, ++ (void __user *)start, len))) ++ return 0; ++ + /* + * XXX: batch / limit 'nr', to avoid large irq off latency + * needs some instrumenting to determine the common sizes used by +diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c +index 4500142..53a363c 100644 +--- a/arch/x86/mm/highmem_32.c ++++ b/arch/x86/mm/highmem_32.c +@@ -45,7 +45,11 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot) + idx = type + KM_TYPE_NR*smp_processor_id(); + vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); + BUG_ON(!pte_none(*(kmap_pte-idx))); ++ ++ pax_open_kernel(); + set_pte(kmap_pte-idx, mk_pte(page, prot)); ++ pax_close_kernel(); ++ + arch_flush_lazy_mmu_mode(); + + return (void *)vaddr; +diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c +index 006cc91..bf05a83 100644 +--- a/arch/x86/mm/hugetlbpage.c ++++ b/arch/x86/mm/hugetlbpage.c +@@ -86,23 +86,24 @@ int pud_huge(pud_t pud) + #ifdef CONFIG_HUGETLB_PAGE + static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, + unsigned long addr, unsigned long len, +- unsigned long pgoff, unsigned long flags) ++ unsigned long pgoff, unsigned long flags, unsigned long offset) + { + struct hstate *h = hstate_file(file); + struct vm_unmapped_area_info info; +- ++ + info.flags = 0; + info.length = len; + info.low_limit = current->mm->mmap_legacy_base; + info.high_limit = TASK_SIZE; + info.align_mask = PAGE_MASK & ~huge_page_mask(h); + info.align_offset = 0; ++ info.threadstack_offset = offset; + return vm_unmapped_area(&info); + } + + static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, + unsigned long addr0, unsigned long len, +- unsigned long pgoff, unsigned long flags) ++ unsigned long pgoff, unsigned long flags, unsigned long offset) + { + struct hstate *h = hstate_file(file); + struct vm_unmapped_area_info info; +@@ -114,6 +115,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, + info.high_limit = current->mm->mmap_base; + info.align_mask = PAGE_MASK & ~huge_page_mask(h); + info.align_offset = 0; ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + + /* +@@ -126,6 +128,12 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, + VM_BUG_ON(addr != -ENOMEM); + info.flags = 0; + info.low_limit = TASK_UNMAPPED_BASE; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (current->mm->pax_flags & MF_PAX_RANDMMAP) ++ info.low_limit += current->mm->delta_mmap; ++#endif ++ + info.high_limit = TASK_SIZE; + addr = vm_unmapped_area(&info); + } +@@ -140,10 +148,20 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, + struct hstate *h = hstate_file(file); + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; ++ unsigned long pax_task_size = TASK_SIZE; ++ unsigned long offset = gr_rand_threadstack_offset(mm, file, flags); + + if (len & ~huge_page_mask(h)) + return -EINVAL; +- if (len > TASK_SIZE) ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) ++ pax_task_size = SEGMEXEC_TASK_SIZE; ++#endif ++ ++ pax_task_size -= PAGE_SIZE; ++ ++ if (len > pax_task_size) + return -ENOMEM; + + if (flags & MAP_FIXED) { +@@ -152,19 +170,22 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, + return addr; + } + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + addr = ALIGN(addr, huge_page_size(h)); + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (pax_task_size - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + if (mm->get_unmapped_area == arch_get_unmapped_area) + return hugetlb_get_unmapped_area_bottomup(file, addr, len, +- pgoff, flags); ++ pgoff, flags, offset); + else + return hugetlb_get_unmapped_area_topdown(file, addr, len, +- pgoff, flags); ++ pgoff, flags, offset); + } + #endif /* CONFIG_HUGETLB_PAGE */ + +diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c +index 66dba36..f8082ec 100644 +--- a/arch/x86/mm/init.c ++++ b/arch/x86/mm/init.c +@@ -4,6 +4,7 @@ + #include <linux/swap.h> + #include <linux/memblock.h> + #include <linux/bootmem.h> /* for max_low_pfn */ ++#include <linux/tboot.h> + + #include <asm/cacheflush.h> + #include <asm/e820.h> +@@ -17,6 +18,8 @@ + #include <asm/proto.h> + #include <asm/dma.h> /* for MAX_DMA_PFN */ + #include <asm/microcode.h> ++#include <asm/desc.h> ++#include <asm/bios_ebda.h> + + /* + * We need to define the tracepoints somewhere, and tlb.c +@@ -570,7 +573,18 @@ void __init init_mem_mapping(void) + early_ioremap_page_table_range_init(); + #endif + ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ clone_pgd_range(get_cpu_pgd(0, kernel) + KERNEL_PGD_BOUNDARY, ++ swapper_pg_dir + KERNEL_PGD_BOUNDARY, ++ KERNEL_PGD_PTRS); ++ clone_pgd_range(get_cpu_pgd(0, user) + KERNEL_PGD_BOUNDARY, ++ swapper_pg_dir + KERNEL_PGD_BOUNDARY, ++ KERNEL_PGD_PTRS); ++ load_cr3(get_cpu_pgd(0, kernel)); ++#else + load_cr3(swapper_pg_dir); ++#endif ++ + __flush_tlb_all(); + + early_memtest(0, max_pfn_mapped << PAGE_SHIFT); +@@ -586,10 +600,40 @@ void __init init_mem_mapping(void) + * Access has to be given to non-kernel-ram areas as well, these contain the PCI + * mmio resources as well as potential bios/acpi data regions. + */ ++ ++#ifdef CONFIG_GRKERNSEC_KMEM ++static unsigned int ebda_start __read_only; ++static unsigned int ebda_end __read_only; ++#endif ++ + int devmem_is_allowed(unsigned long pagenr) + { +- if (pagenr < 256) ++#ifdef CONFIG_GRKERNSEC_KMEM ++ /* allow BDA */ ++ if (!pagenr) ++ return 1; ++ /* allow EBDA */ ++ if (pagenr >= ebda_start && pagenr < ebda_end) + return 1; ++ /* if tboot is in use, allow access to its hardcoded serial log range */ ++ if (tboot_enabled() && ((0x60000 >> PAGE_SHIFT) <= pagenr) && (pagenr < (0x68000 >> PAGE_SHIFT))) ++ return 1; ++#else ++ if (!pagenr) ++ return 1; ++#ifdef CONFIG_VM86 ++ if (pagenr < (ISA_START_ADDRESS >> PAGE_SHIFT)) ++ return 1; ++#endif ++#endif ++ ++ if ((ISA_START_ADDRESS >> PAGE_SHIFT) <= pagenr && pagenr < (ISA_END_ADDRESS >> PAGE_SHIFT)) ++ return 1; ++#ifdef CONFIG_GRKERNSEC_KMEM ++ /* throw out everything else below 1MB */ ++ if (pagenr <= 256) ++ return 0; ++#endif + if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) + return 0; + if (!page_is_ram(pagenr)) +@@ -635,8 +679,117 @@ void free_init_pages(char *what, unsigned long begin, unsigned long end) + #endif + } + ++#ifdef CONFIG_GRKERNSEC_KMEM ++static inline void gr_init_ebda(void) ++{ ++ unsigned int ebda_addr; ++ unsigned int ebda_size = 0; ++ ++ ebda_addr = get_bios_ebda(); ++ if (ebda_addr) { ++ ebda_size = *(unsigned char *)phys_to_virt(ebda_addr); ++ ebda_size <<= 10; ++ } ++ if (ebda_addr && ebda_size) { ++ ebda_start = ebda_addr >> PAGE_SHIFT; ++ ebda_end = min((unsigned int)PAGE_ALIGN(ebda_addr + ebda_size), (unsigned int)0xa0000) >> PAGE_SHIFT; ++ } else { ++ ebda_start = 0x9f000 >> PAGE_SHIFT; ++ ebda_end = 0xa0000 >> PAGE_SHIFT; ++ } ++} ++#else ++static inline void gr_init_ebda(void) { } ++#endif ++ + void free_initmem(void) + { ++#ifdef CONFIG_PAX_KERNEXEC ++#ifdef CONFIG_X86_32 ++ /* PaX: limit KERNEL_CS to actual size */ ++ unsigned long addr, limit; ++ struct desc_struct d; ++ int cpu; ++#else ++ pgd_t *pgd; ++ pud_t *pud; ++ pmd_t *pmd; ++ unsigned long addr, end; ++#endif ++#endif ++ ++ gr_init_ebda(); ++ ++#ifdef CONFIG_PAX_KERNEXEC ++#ifdef CONFIG_X86_32 ++ limit = paravirt_enabled() ? ktva_ktla(0xffffffff) : (unsigned long)&_etext; ++ limit = (limit - 1UL) >> PAGE_SHIFT; ++ ++ memset(__LOAD_PHYSICAL_ADDR + PAGE_OFFSET, POISON_FREE_INITMEM, PAGE_SIZE); ++ for (cpu = 0; cpu < nr_cpu_ids; cpu++) { ++ pack_descriptor(&d, get_desc_base(&get_cpu_gdt_table(cpu)[GDT_ENTRY_KERNEL_CS]), limit, 0x9B, 0xC); ++ write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_KERNEL_CS, &d, DESCTYPE_S); ++ write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_KERNEXEC_KERNEL_CS, &d, DESCTYPE_S); ++ } ++ ++ /* PaX: make KERNEL_CS read-only */ ++ addr = PFN_ALIGN(ktla_ktva((unsigned long)&_text)); ++ if (!paravirt_enabled()) ++ set_memory_ro(addr, (PFN_ALIGN(_sdata) - addr) >> PAGE_SHIFT); ++/* ++ for (addr = ktla_ktva((unsigned long)&_text); addr < (unsigned long)&_sdata; addr += PMD_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ set_pmd(pmd, __pmd(pmd_val(*pmd) & ~_PAGE_RW)); ++ } ++*/ ++#ifdef CONFIG_X86_PAE ++ set_memory_nx(PFN_ALIGN(__init_begin), (PFN_ALIGN(__init_end) - PFN_ALIGN(__init_begin)) >> PAGE_SHIFT); ++/* ++ for (addr = (unsigned long)&__init_begin; addr < (unsigned long)&__init_end; addr += PMD_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ set_pmd(pmd, __pmd(pmd_val(*pmd) | (_PAGE_NX & __supported_pte_mask))); ++ } ++*/ ++#endif ++ ++#ifdef CONFIG_MODULES ++ set_memory_4k((unsigned long)MODULES_EXEC_VADDR, (MODULES_EXEC_END - MODULES_EXEC_VADDR) >> PAGE_SHIFT); ++#endif ++ ++#else ++ /* PaX: make kernel code/rodata read-only, rest non-executable */ ++ for (addr = __START_KERNEL_map; addr < __START_KERNEL_map + KERNEL_IMAGE_SIZE; addr += PMD_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ if (!pmd_present(*pmd)) ++ continue; ++ if ((unsigned long)_text <= addr && addr < (unsigned long)_sdata) ++ set_pmd(pmd, __pmd(pmd_val(*pmd) & ~_PAGE_RW)); ++ else ++ set_pmd(pmd, __pmd(pmd_val(*pmd) | (_PAGE_NX & __supported_pte_mask))); ++ } ++ ++ addr = (unsigned long)__va(__pa(__START_KERNEL_map)); ++ end = addr + KERNEL_IMAGE_SIZE; ++ for (; addr < end; addr += PMD_SIZE) { ++ pgd = pgd_offset_k(addr); ++ pud = pud_offset(pgd, addr); ++ pmd = pmd_offset(pud, addr); ++ if (!pmd_present(*pmd)) ++ continue; ++ if ((unsigned long)__va(__pa(_text)) <= addr && addr < (unsigned long)__va(__pa(_sdata))) ++ set_pmd(pmd, __pmd(pmd_val(*pmd) & ~_PAGE_RW)); ++ } ++#endif ++ ++ flush_tlb_all(); ++#endif ++ + free_init_pages("unused kernel", + (unsigned long)(&__init_begin), + (unsigned long)(&__init_end)); +diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c +index c8140e1..59257fc 100644 +--- a/arch/x86/mm/init_32.c ++++ b/arch/x86/mm/init_32.c +@@ -62,33 +62,6 @@ static noinline int do_test_wp_bit(void); + bool __read_mostly __vmalloc_start_set = false; + + /* +- * Creates a middle page table and puts a pointer to it in the +- * given global directory entry. This only returns the gd entry +- * in non-PAE compilation mode, since the middle layer is folded. +- */ +-static pmd_t * __init one_md_table_init(pgd_t *pgd) +-{ +- pud_t *pud; +- pmd_t *pmd_table; +- +-#ifdef CONFIG_X86_PAE +- if (!(pgd_val(*pgd) & _PAGE_PRESENT)) { +- pmd_table = (pmd_t *)alloc_low_page(); +- paravirt_alloc_pmd(&init_mm, __pa(pmd_table) >> PAGE_SHIFT); +- set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT)); +- pud = pud_offset(pgd, 0); +- BUG_ON(pmd_table != pmd_offset(pud, 0)); +- +- return pmd_table; +- } +-#endif +- pud = pud_offset(pgd, 0); +- pmd_table = pmd_offset(pud, 0); +- +- return pmd_table; +-} +- +-/* + * Create a page table and place a pointer to it in a middle page + * directory entry: + */ +@@ -98,13 +71,28 @@ static pte_t * __init one_page_table_init(pmd_t *pmd) + pte_t *page_table = (pte_t *)alloc_low_page(); + + paravirt_alloc_pte(&init_mm, __pa(page_table) >> PAGE_SHIFT); ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++ set_pmd(pmd, __pmd(__pa(page_table) | _KERNPG_TABLE)); ++#else + set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE)); ++#endif + BUG_ON(page_table != pte_offset_kernel(pmd, 0)); + } + + return pte_offset_kernel(pmd, 0); + } + ++static pmd_t * __init one_md_table_init(pgd_t *pgd) ++{ ++ pud_t *pud; ++ pmd_t *pmd_table; ++ ++ pud = pud_offset(pgd, 0); ++ pmd_table = pmd_offset(pud, 0); ++ ++ return pmd_table; ++} ++ + pmd_t * __init populate_extra_pmd(unsigned long vaddr) + { + int pgd_idx = pgd_index(vaddr); +@@ -208,6 +196,7 @@ page_table_range_init(unsigned long start, unsigned long end, pgd_t *pgd_base) + int pgd_idx, pmd_idx; + unsigned long vaddr; + pgd_t *pgd; ++ pud_t *pud; + pmd_t *pmd; + pte_t *pte = NULL; + unsigned long count = page_table_range_init_count(start, end); +@@ -222,8 +211,13 @@ page_table_range_init(unsigned long start, unsigned long end, pgd_t *pgd_base) + pgd = pgd_base + pgd_idx; + + for ( ; (pgd_idx < PTRS_PER_PGD) && (vaddr != end); pgd++, pgd_idx++) { +- pmd = one_md_table_init(pgd); +- pmd = pmd + pmd_index(vaddr); ++ pud = pud_offset(pgd, vaddr); ++ pmd = pmd_offset(pud, vaddr); ++ ++#ifdef CONFIG_X86_PAE ++ paravirt_alloc_pmd(&init_mm, __pa(pmd) >> PAGE_SHIFT); ++#endif ++ + for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); + pmd++, pmd_idx++) { + pte = page_table_kmap_check(one_page_table_init(pmd), +@@ -235,11 +229,20 @@ page_table_range_init(unsigned long start, unsigned long end, pgd_t *pgd_base) + } + } + +-static inline int is_kernel_text(unsigned long addr) ++static inline int is_kernel_text(unsigned long start, unsigned long end) + { +- if (addr >= (unsigned long)_text && addr <= (unsigned long)__init_end) +- return 1; +- return 0; ++ if ((start >= ktla_ktva((unsigned long)_etext) || ++ end <= ktla_ktva((unsigned long)_stext)) && ++ (start >= ktla_ktva((unsigned long)_einittext) || ++ end <= ktla_ktva((unsigned long)_sinittext)) && ++ ++#ifdef CONFIG_ACPI_SLEEP ++ (start >= (unsigned long)__va(acpi_wakeup_address) + 0x4000 || end <= (unsigned long)__va(acpi_wakeup_address)) && ++#endif ++ ++ (start > (unsigned long)__va(0xfffff) || end <= (unsigned long)__va(0xc0000))) ++ return 0; ++ return 1; + } + + /* +@@ -256,9 +259,10 @@ kernel_physical_mapping_init(unsigned long start, + unsigned long last_map_addr = end; + unsigned long start_pfn, end_pfn; + pgd_t *pgd_base = swapper_pg_dir; +- int pgd_idx, pmd_idx, pte_ofs; ++ unsigned int pgd_idx, pmd_idx, pte_ofs; + unsigned long pfn; + pgd_t *pgd; ++ pud_t *pud; + pmd_t *pmd; + pte_t *pte; + unsigned pages_2m, pages_4k; +@@ -291,8 +295,13 @@ repeat: + pfn = start_pfn; + pgd_idx = pgd_index((pfn<<PAGE_SHIFT) + PAGE_OFFSET); + pgd = pgd_base + pgd_idx; +- for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++) { +- pmd = one_md_table_init(pgd); ++ for (; pgd_idx < PTRS_PER_PGD && pfn < max_low_pfn; pgd++, pgd_idx++) { ++ pud = pud_offset(pgd, 0); ++ pmd = pmd_offset(pud, 0); ++ ++#ifdef CONFIG_X86_PAE ++ paravirt_alloc_pmd(&init_mm, __pa(pmd) >> PAGE_SHIFT); ++#endif + + if (pfn >= end_pfn) + continue; +@@ -304,14 +313,13 @@ repeat: + #endif + for (; pmd_idx < PTRS_PER_PMD && pfn < end_pfn; + pmd++, pmd_idx++) { +- unsigned int addr = pfn * PAGE_SIZE + PAGE_OFFSET; ++ unsigned long address = pfn * PAGE_SIZE + PAGE_OFFSET; + + /* + * Map with big pages if possible, otherwise + * create normal page tables: + */ + if (use_pse) { +- unsigned int addr2; + pgprot_t prot = PAGE_KERNEL_LARGE; + /* + * first pass will use the same initial +@@ -322,11 +330,7 @@ repeat: + _PAGE_PSE); + + pfn &= PMD_MASK >> PAGE_SHIFT; +- addr2 = (pfn + PTRS_PER_PTE-1) * PAGE_SIZE + +- PAGE_OFFSET + PAGE_SIZE-1; +- +- if (is_kernel_text(addr) || +- is_kernel_text(addr2)) ++ if (is_kernel_text(address, address + PMD_SIZE)) + prot = PAGE_KERNEL_LARGE_EXEC; + + pages_2m++; +@@ -343,7 +347,7 @@ repeat: + pte_ofs = pte_index((pfn<<PAGE_SHIFT) + PAGE_OFFSET); + pte += pte_ofs; + for (; pte_ofs < PTRS_PER_PTE && pfn < end_pfn; +- pte++, pfn++, pte_ofs++, addr += PAGE_SIZE) { ++ pte++, pfn++, pte_ofs++, address += PAGE_SIZE) { + pgprot_t prot = PAGE_KERNEL; + /* + * first pass will use the same initial +@@ -351,7 +355,7 @@ repeat: + */ + pgprot_t init_prot = __pgprot(PTE_IDENT_ATTR); + +- if (is_kernel_text(addr)) ++ if (is_kernel_text(address, address + PAGE_SIZE)) + prot = PAGE_KERNEL_EXEC; + + pages_4k++; +@@ -474,7 +478,7 @@ void __init native_pagetable_init(void) + + pud = pud_offset(pgd, va); + pmd = pmd_offset(pud, va); +- if (!pmd_present(*pmd)) ++ if (!pmd_present(*pmd)) // PAX TODO || pmd_large(*pmd)) + break; + + /* should not be large page here */ +@@ -532,12 +536,10 @@ void __init early_ioremap_page_table_range_init(void) + + static void __init pagetable_init(void) + { +- pgd_t *pgd_base = swapper_pg_dir; +- +- permanent_kmaps_init(pgd_base); ++ permanent_kmaps_init(swapper_pg_dir); + } + +-pteval_t __supported_pte_mask __read_mostly = ~(_PAGE_NX | _PAGE_GLOBAL); ++pteval_t __supported_pte_mask __read_only = ~(_PAGE_NX | _PAGE_GLOBAL); + EXPORT_SYMBOL_GPL(__supported_pte_mask); + + /* user-defined highmem size */ +@@ -787,10 +789,10 @@ void __init mem_init(void) + ((unsigned long)&__init_end - + (unsigned long)&__init_begin) >> 10, + +- (unsigned long)&_etext, (unsigned long)&_edata, +- ((unsigned long)&_edata - (unsigned long)&_etext) >> 10, ++ (unsigned long)&_sdata, (unsigned long)&_edata, ++ ((unsigned long)&_edata - (unsigned long)&_sdata) >> 10, + +- (unsigned long)&_text, (unsigned long)&_etext, ++ ktla_ktva((unsigned long)&_text), ktla_ktva((unsigned long)&_etext), + ((unsigned long)&_etext - (unsigned long)&_text) >> 10); + + /* +@@ -884,6 +886,7 @@ void set_kernel_text_rw(void) + if (!kernel_set_to_readonly) + return; + ++ start = ktla_ktva(start); + pr_debug("Set kernel text: %lx - %lx for read write\n", + start, start+size); + +@@ -898,6 +901,7 @@ void set_kernel_text_ro(void) + if (!kernel_set_to_readonly) + return; + ++ start = ktla_ktva(start); + pr_debug("Set kernel text: %lx - %lx for read only\n", + start, start+size); + +@@ -926,6 +930,7 @@ void mark_rodata_ro(void) + unsigned long start = PFN_ALIGN(_text); + unsigned long size = PFN_ALIGN(_etext) - start; + ++ start = ktla_ktva(start); + set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT); + printk(KERN_INFO "Write protecting the kernel text: %luk\n", + size >> 10); +diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c +index 4e5dfec..6fd6dc5 100644 +--- a/arch/x86/mm/init_64.c ++++ b/arch/x86/mm/init_64.c +@@ -151,7 +151,7 @@ early_param("gbpages", parse_direct_gbpages_on); + * around without checking the pgd every time. + */ + +-pteval_t __supported_pte_mask __read_mostly = ~0; ++pteval_t __supported_pte_mask __read_only = ~_PAGE_NX; + EXPORT_SYMBOL_GPL(__supported_pte_mask); + + int force_personality32; +@@ -184,7 +184,12 @@ void sync_global_pgds(unsigned long start, unsigned long end, int removed) + + for (address = start; address <= end; address += PGDIR_SIZE) { + const pgd_t *pgd_ref = pgd_offset_k(address); ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ unsigned long cpu; ++#else + struct page *page; ++#endif + + /* + * When it is called after memory hot remove, pgd_none() +@@ -195,6 +200,25 @@ void sync_global_pgds(unsigned long start, unsigned long end, int removed) + continue; + + spin_lock(&pgd_lock); ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ for (cpu = 0; cpu < nr_cpu_ids; ++cpu) { ++ pgd_t *pgd = pgd_offset_cpu(cpu, user, address); ++ ++ if (!pgd_none(*pgd_ref) && !pgd_none(*pgd)) ++ BUG_ON(pgd_page_vaddr(*pgd) ++ != pgd_page_vaddr(*pgd_ref)); ++ ++ if (removed) { ++ if (pgd_none(*pgd_ref) && !pgd_none(*pgd)) ++ pgd_clear(pgd); ++ } else { ++ if (pgd_none(*pgd)) ++ set_pgd(pgd, *pgd_ref); ++ } ++ ++ pgd = pgd_offset_cpu(cpu, kernel, address); ++#else + list_for_each_entry(page, &pgd_list, lru) { + pgd_t *pgd; + spinlock_t *pgt_lock; +@@ -203,6 +227,7 @@ void sync_global_pgds(unsigned long start, unsigned long end, int removed) + /* the pgt_lock only for Xen */ + pgt_lock = &pgd_page_get_mm(page)->page_table_lock; + spin_lock(pgt_lock); ++#endif + + if (!pgd_none(*pgd_ref) && !pgd_none(*pgd)) + BUG_ON(pgd_page_vaddr(*pgd) +@@ -216,7 +241,10 @@ void sync_global_pgds(unsigned long start, unsigned long end, int removed) + set_pgd(pgd, *pgd_ref); + } + ++#ifndef CONFIG_PAX_PER_CPU_PGD + spin_unlock(pgt_lock); ++#endif ++ + } + spin_unlock(&pgd_lock); + } +@@ -249,7 +277,7 @@ static pud_t *fill_pud(pgd_t *pgd, unsigned long vaddr) + { + if (pgd_none(*pgd)) { + pud_t *pud = (pud_t *)spp_getpage(); +- pgd_populate(&init_mm, pgd, pud); ++ pgd_populate_kernel(&init_mm, pgd, pud); + if (pud != pud_offset(pgd, 0)) + printk(KERN_ERR "PAGETABLE BUG #00! %p <-> %p\n", + pud, pud_offset(pgd, 0)); +@@ -261,7 +289,7 @@ static pmd_t *fill_pmd(pud_t *pud, unsigned long vaddr) + { + if (pud_none(*pud)) { + pmd_t *pmd = (pmd_t *) spp_getpage(); +- pud_populate(&init_mm, pud, pmd); ++ pud_populate_kernel(&init_mm, pud, pmd); + if (pmd != pmd_offset(pud, 0)) + printk(KERN_ERR "PAGETABLE BUG #01! %p <-> %p\n", + pmd, pmd_offset(pud, 0)); +@@ -290,7 +318,9 @@ void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte) + pmd = fill_pmd(pud, vaddr); + pte = fill_pte(pmd, vaddr); + ++ pax_open_kernel(); + set_pte(pte, new_pte); ++ pax_close_kernel(); + + /* + * It's enough to flush this one mapping. +@@ -349,14 +379,12 @@ static void __init __init_extra_mapping(unsigned long phys, unsigned long size, + pgd = pgd_offset_k((unsigned long)__va(phys)); + if (pgd_none(*pgd)) { + pud = (pud_t *) spp_getpage(); +- set_pgd(pgd, __pgd(__pa(pud) | _KERNPG_TABLE | +- _PAGE_USER)); ++ set_pgd(pgd, __pgd(__pa(pud) | _PAGE_TABLE)); + } + pud = pud_offset(pgd, (unsigned long)__va(phys)); + if (pud_none(*pud)) { + pmd = (pmd_t *) spp_getpage(); +- set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | +- _PAGE_USER)); ++ set_pud(pud, __pud(__pa(pmd) | _PAGE_TABLE)); + } + pmd = pmd_offset(pud, phys); + BUG_ON(!pmd_none(*pmd)); +@@ -597,7 +625,7 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end, + prot); + + spin_lock(&init_mm.page_table_lock); +- pud_populate(&init_mm, pud, pmd); ++ pud_populate_kernel(&init_mm, pud, pmd); + spin_unlock(&init_mm.page_table_lock); + } + __flush_tlb_all(); +@@ -638,7 +666,7 @@ kernel_physical_mapping_init(unsigned long start, + page_size_mask); + + spin_lock(&init_mm.page_table_lock); +- pgd_populate(&init_mm, pgd, pud); ++ pgd_populate_kernel(&init_mm, pgd, pud); + spin_unlock(&init_mm.page_table_lock); + pgd_changed = true; + } +@@ -1217,8 +1245,8 @@ static struct vm_operations_struct gate_vma_ops = { + static struct vm_area_struct gate_vma = { + .vm_start = VSYSCALL_ADDR, + .vm_end = VSYSCALL_ADDR + PAGE_SIZE, +- .vm_page_prot = PAGE_READONLY_EXEC, +- .vm_flags = VM_READ | VM_EXEC, ++ .vm_page_prot = PAGE_READONLY, ++ .vm_flags = VM_READ, + .vm_ops = &gate_vma_ops, + }; + +diff --git a/arch/x86/mm/iomap_32.c b/arch/x86/mm/iomap_32.c +index 7b179b49..6bd1777 100644 +--- a/arch/x86/mm/iomap_32.c ++++ b/arch/x86/mm/iomap_32.c +@@ -64,7 +64,11 @@ void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) + type = kmap_atomic_idx_push(); + idx = type + KM_TYPE_NR * smp_processor_id(); + vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); ++ ++ pax_open_kernel(); + set_pte(kmap_pte - idx, pfn_pte(pfn, prot)); ++ pax_close_kernel(); ++ + arch_flush_lazy_mmu_mode(); + + return (void *)vaddr; +diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c +index af78e50..4f1fe56 100644 +--- a/arch/x86/mm/ioremap.c ++++ b/arch/x86/mm/ioremap.c +@@ -56,8 +56,8 @@ static int __ioremap_check_ram(unsigned long start_pfn, unsigned long nr_pages, + unsigned long i; + + for (i = 0; i < nr_pages; ++i) +- if (pfn_valid(start_pfn + i) && +- !PageReserved(pfn_to_page(start_pfn + i))) ++ if (pfn_valid(start_pfn + i) && (start_pfn + i >= 0x100 || ++ !PageReserved(pfn_to_page(start_pfn + i)))) + return 1; + + WARN_ONCE(1, "ioremap on RAM pfn 0x%lx\n", start_pfn); +@@ -280,7 +280,7 @@ EXPORT_SYMBOL(ioremap_prot); + * + * Caller must ensure there is only one unmapping for the same pointer. + */ +-void iounmap(volatile void __iomem *addr) ++void iounmap(const volatile void __iomem *addr) + { + struct vm_struct *p, *o; + +@@ -329,30 +329,29 @@ EXPORT_SYMBOL(iounmap); + */ + void *xlate_dev_mem_ptr(unsigned long phys) + { +- void *addr; +- unsigned long start = phys & PAGE_MASK; +- + /* If page is RAM, we can use __va. Otherwise ioremap and unmap. */ +- if (page_is_ram(start >> PAGE_SHIFT)) ++ if (page_is_ram(phys >> PAGE_SHIFT)) ++#ifdef CONFIG_HIGHMEM ++ if ((phys >> PAGE_SHIFT) < max_low_pfn) ++#endif + return __va(phys); + +- addr = (void __force *)ioremap_cache(start, PAGE_SIZE); +- if (addr) +- addr = (void *)((unsigned long)addr | (phys & ~PAGE_MASK)); +- +- return addr; ++ return (void __force *)ioremap_cache(phys, PAGE_SIZE); + } + + void unxlate_dev_mem_ptr(unsigned long phys, void *addr) + { + if (page_is_ram(phys >> PAGE_SHIFT)) ++#ifdef CONFIG_HIGHMEM ++ if ((phys >> PAGE_SHIFT) < max_low_pfn) ++#endif + return; + + iounmap((void __iomem *)((unsigned long)addr & PAGE_MASK)); + return; + } + +-static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] __page_aligned_bss; ++static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] __read_only __aligned(PAGE_SIZE); + + static inline pmd_t * __init early_ioremap_pmd(unsigned long addr) + { +@@ -388,8 +387,7 @@ void __init early_ioremap_init(void) + early_ioremap_setup(); + + pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN)); +- memset(bm_pte, 0, sizeof(bm_pte)); +- pmd_populate_kernel(&init_mm, pmd, bm_pte); ++ pmd_populate_user(&init_mm, pmd, bm_pte); + + /* + * The boot-ioremap range spans multiple pmds, for which +diff --git a/arch/x86/mm/kmemcheck/kmemcheck.c b/arch/x86/mm/kmemcheck/kmemcheck.c +index b4f2e7e..96c9c3e 100644 +--- a/arch/x86/mm/kmemcheck/kmemcheck.c ++++ b/arch/x86/mm/kmemcheck/kmemcheck.c +@@ -628,9 +628,9 @@ bool kmemcheck_fault(struct pt_regs *regs, unsigned long address, + * memory (e.g. tracked pages)? For now, we need this to avoid + * invoking kmemcheck for PnP BIOS calls. + */ +- if (regs->flags & X86_VM_MASK) ++ if (v8086_mode(regs)) + return false; +- if (regs->cs != __KERNEL_CS) ++ if (regs->cs != __KERNEL_CS && regs->cs != __KERNEXEC_KERNEL_CS) + return false; + + pte = kmemcheck_pte_lookup(address); +diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c +index df4552b..12c129c 100644 +--- a/arch/x86/mm/mmap.c ++++ b/arch/x86/mm/mmap.c +@@ -52,7 +52,7 @@ static unsigned long stack_maxrandom_size(void) + * Leave an at least ~128 MB hole with possible stack randomization. + */ + #define MIN_GAP (128*1024*1024UL + stack_maxrandom_size()) +-#define MAX_GAP (TASK_SIZE/6*5) ++#define MAX_GAP (pax_task_size/6*5) + + static int mmap_is_legacy(void) + { +@@ -82,27 +82,40 @@ static unsigned long mmap_rnd(void) + return rnd << PAGE_SHIFT; + } + +-static unsigned long mmap_base(void) ++static unsigned long mmap_base(struct mm_struct *mm) + { + unsigned long gap = rlimit(RLIMIT_STACK); ++ unsigned long pax_task_size = TASK_SIZE; ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) ++ pax_task_size = SEGMEXEC_TASK_SIZE; ++#endif + + if (gap < MIN_GAP) + gap = MIN_GAP; + else if (gap > MAX_GAP) + gap = MAX_GAP; + +- return PAGE_ALIGN(TASK_SIZE - gap - mmap_rnd()); ++ return PAGE_ALIGN(pax_task_size - gap - mmap_rnd()); + } + + /* + * Bottom-up (legacy) layout on X86_32 did not support randomization, X86_64 + * does, but not when emulating X86_32 + */ +-static unsigned long mmap_legacy_base(void) ++static unsigned long mmap_legacy_base(struct mm_struct *mm) + { +- if (mmap_is_ia32()) ++ if (mmap_is_ia32()) { ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) ++ return SEGMEXEC_TASK_UNMAPPED_BASE; ++ else ++#endif ++ + return TASK_UNMAPPED_BASE; +- else ++ } else + return TASK_UNMAPPED_BASE + mmap_rnd(); + } + +@@ -112,8 +125,15 @@ static unsigned long mmap_legacy_base(void) + */ + void arch_pick_mmap_layout(struct mm_struct *mm) + { +- mm->mmap_legacy_base = mmap_legacy_base(); +- mm->mmap_base = mmap_base(); ++ mm->mmap_legacy_base = mmap_legacy_base(mm); ++ mm->mmap_base = mmap_base(mm); ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) { ++ mm->mmap_legacy_base += mm->delta_mmap; ++ mm->mmap_base -= mm->delta_mmap + mm->delta_stack; ++ } ++#endif + + if (mmap_is_legacy()) { + mm->mmap_base = mm->mmap_legacy_base; +diff --git a/arch/x86/mm/mmio-mod.c b/arch/x86/mm/mmio-mod.c +index 0057a7a..95c7edd 100644 +--- a/arch/x86/mm/mmio-mod.c ++++ b/arch/x86/mm/mmio-mod.c +@@ -194,7 +194,7 @@ static void pre(struct kmmio_probe *p, struct pt_regs *regs, + break; + default: + { +- unsigned char *ip = (unsigned char *)instptr; ++ unsigned char *ip = (unsigned char *)ktla_ktva(instptr); + my_trace->opcode = MMIO_UNKNOWN_OP; + my_trace->width = 0; + my_trace->value = (*ip) << 16 | *(ip + 1) << 8 | +@@ -234,7 +234,7 @@ static void post(struct kmmio_probe *p, unsigned long condition, + static void ioremap_trace_core(resource_size_t offset, unsigned long size, + void __iomem *addr) + { +- static atomic_t next_id; ++ static atomic_unchecked_t next_id; + struct remap_trace *trace = kmalloc(sizeof(*trace), GFP_KERNEL); + /* These are page-unaligned. */ + struct mmiotrace_map map = { +@@ -258,7 +258,7 @@ static void ioremap_trace_core(resource_size_t offset, unsigned long size, + .private = trace + }, + .phys = offset, +- .id = atomic_inc_return(&next_id) ++ .id = atomic_inc_return_unchecked(&next_id) + }; + map.map_id = trace->id; + +@@ -290,7 +290,7 @@ void mmiotrace_ioremap(resource_size_t offset, unsigned long size, + ioremap_trace_core(offset, size, addr); + } + +-static void iounmap_trace_core(volatile void __iomem *addr) ++static void iounmap_trace_core(const volatile void __iomem *addr) + { + struct mmiotrace_map map = { + .phys = 0, +@@ -328,7 +328,7 @@ not_enabled: + } + } + +-void mmiotrace_iounmap(volatile void __iomem *addr) ++void mmiotrace_iounmap(const volatile void __iomem *addr) + { + might_sleep(); + if (is_enabled()) /* recheck and proper locking in *_core() */ +diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c +index 1a88370..3f598b5 100644 +--- a/arch/x86/mm/numa.c ++++ b/arch/x86/mm/numa.c +@@ -499,7 +499,7 @@ static void __init numa_clear_kernel_node_hotplug(void) + } + } + +-static int __init numa_register_memblks(struct numa_meminfo *mi) ++static int __init __intentional_overflow(-1) numa_register_memblks(struct numa_meminfo *mi) + { + unsigned long uninitialized_var(pfn_align); + int i, nid; +diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c +index 36de293..b820ddc 100644 +--- a/arch/x86/mm/pageattr.c ++++ b/arch/x86/mm/pageattr.c +@@ -262,7 +262,7 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address, + */ + #ifdef CONFIG_PCI_BIOS + if (pcibios_enabled && within(pfn, BIOS_BEGIN >> PAGE_SHIFT, BIOS_END >> PAGE_SHIFT)) +- pgprot_val(forbidden) |= _PAGE_NX; ++ pgprot_val(forbidden) |= _PAGE_NX & __supported_pte_mask; + #endif + + /* +@@ -270,9 +270,10 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address, + * Does not cover __inittext since that is gone later on. On + * 64bit we do not enforce !NX on the low mapping + */ +- if (within(address, (unsigned long)_text, (unsigned long)_etext)) +- pgprot_val(forbidden) |= _PAGE_NX; ++ if (within(address, ktla_ktva((unsigned long)_text), ktla_ktva((unsigned long)_etext))) ++ pgprot_val(forbidden) |= _PAGE_NX & __supported_pte_mask; + ++#ifdef CONFIG_DEBUG_RODATA + /* + * The .rodata section needs to be read-only. Using the pfn + * catches all aliases. +@@ -280,6 +281,7 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address, + if (within(pfn, __pa_symbol(__start_rodata) >> PAGE_SHIFT, + __pa_symbol(__end_rodata) >> PAGE_SHIFT)) + pgprot_val(forbidden) |= _PAGE_RW; ++#endif + + #if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA) + /* +@@ -318,6 +320,13 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address, + } + #endif + ++#ifdef CONFIG_PAX_KERNEXEC ++ if (within(pfn, __pa(ktla_ktva((unsigned long)&_text)), __pa((unsigned long)&_sdata))) { ++ pgprot_val(forbidden) |= _PAGE_RW; ++ pgprot_val(forbidden) |= _PAGE_NX & __supported_pte_mask; ++ } ++#endif ++ + prot = __pgprot(pgprot_val(prot) & ~pgprot_val(forbidden)); + + return prot; +@@ -420,23 +429,37 @@ EXPORT_SYMBOL_GPL(slow_virt_to_phys); + static void __set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte) + { + /* change init_mm */ ++ pax_open_kernel(); + set_pte_atomic(kpte, pte); ++ + #ifdef CONFIG_X86_32 + if (!SHARED_KERNEL_PMD) { ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ unsigned long cpu; ++#else + struct page *page; ++#endif + ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ for (cpu = 0; cpu < nr_cpu_ids; ++cpu) { ++ pgd_t *pgd = get_cpu_pgd(cpu, kernel); ++#else + list_for_each_entry(page, &pgd_list, lru) { +- pgd_t *pgd; ++ pgd_t *pgd = (pgd_t *)page_address(page); ++#endif ++ + pud_t *pud; + pmd_t *pmd; + +- pgd = (pgd_t *)page_address(page) + pgd_index(address); ++ pgd += pgd_index(address); + pud = pud_offset(pgd, address); + pmd = pmd_offset(pud, address); + set_pte_atomic((pte_t *)pmd, pte); + } + } + #endif ++ pax_close_kernel(); + } + + static int +diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c +index 6574388..87e9bef 100644 +--- a/arch/x86/mm/pat.c ++++ b/arch/x86/mm/pat.c +@@ -376,7 +376,7 @@ int free_memtype(u64 start, u64 end) + + if (!entry) { + printk(KERN_INFO "%s:%d freeing invalid memtype [mem %#010Lx-%#010Lx]\n", +- current->comm, current->pid, start, end - 1); ++ current->comm, task_pid_nr(current), start, end - 1); + return -EINVAL; + } + +@@ -506,8 +506,8 @@ static inline int range_is_allowed(unsigned long pfn, unsigned long size) + + while (cursor < to) { + if (!devmem_is_allowed(pfn)) { +- printk(KERN_INFO "Program %s tried to access /dev/mem between [mem %#010Lx-%#010Lx]\n", +- current->comm, from, to - 1); ++ printk(KERN_INFO "Program %s tried to access /dev/mem between [mem %#010Lx-%#010Lx] (%#010Lx)\n", ++ current->comm, from, to - 1, cursor); + return 0; + } + cursor += PAGE_SIZE; +@@ -577,7 +577,7 @@ int kernel_map_sync_memtype(u64 base, unsigned long size, unsigned long flags) + if (ioremap_change_attr((unsigned long)__va(base), id_sz, flags) < 0) { + printk(KERN_INFO "%s:%d ioremap_change_attr failed %s " + "for [mem %#010Lx-%#010Lx]\n", +- current->comm, current->pid, ++ current->comm, task_pid_nr(current), + cattr_name(flags), + base, (unsigned long long)(base + size-1)); + return -EINVAL; +@@ -612,7 +612,7 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot, + flags = lookup_memtype(paddr); + if (want_flags != flags) { + printk(KERN_WARNING "%s:%d map pfn RAM range req %s for [mem %#010Lx-%#010Lx], got %s\n", +- current->comm, current->pid, ++ current->comm, task_pid_nr(current), + cattr_name(want_flags), + (unsigned long long)paddr, + (unsigned long long)(paddr + size - 1), +@@ -634,7 +634,7 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot, + free_memtype(paddr, paddr + size); + printk(KERN_ERR "%s:%d map pfn expected mapping type %s" + " for [mem %#010Lx-%#010Lx], got %s\n", +- current->comm, current->pid, ++ current->comm, task_pid_nr(current), + cattr_name(want_flags), + (unsigned long long)paddr, + (unsigned long long)(paddr + size - 1), +diff --git a/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c +index 415f6c4..d319983 100644 +--- a/arch/x86/mm/pat_rbtree.c ++++ b/arch/x86/mm/pat_rbtree.c +@@ -160,7 +160,7 @@ success: + + failure: + printk(KERN_INFO "%s:%d conflicting memory types " +- "%Lx-%Lx %s<->%s\n", current->comm, current->pid, start, ++ "%Lx-%Lx %s<->%s\n", current->comm, task_pid_nr(current), start, + end, cattr_name(found_type), cattr_name(match->type)); + return -EBUSY; + } +diff --git a/arch/x86/mm/pf_in.c b/arch/x86/mm/pf_in.c +index 9f0614d..92ae64a 100644 +--- a/arch/x86/mm/pf_in.c ++++ b/arch/x86/mm/pf_in.c +@@ -148,7 +148,7 @@ enum reason_type get_ins_type(unsigned long ins_addr) + int i; + enum reason_type rv = OTHERS; + +- p = (unsigned char *)ins_addr; ++ p = (unsigned char *)ktla_ktva(ins_addr); + p += skip_prefix(p, &prf); + p += get_opcode(p, &opcode); + +@@ -168,7 +168,7 @@ static unsigned int get_ins_reg_width(unsigned long ins_addr) + struct prefix_bits prf; + int i; + +- p = (unsigned char *)ins_addr; ++ p = (unsigned char *)ktla_ktva(ins_addr); + p += skip_prefix(p, &prf); + p += get_opcode(p, &opcode); + +@@ -191,7 +191,7 @@ unsigned int get_ins_mem_width(unsigned long ins_addr) + struct prefix_bits prf; + int i; + +- p = (unsigned char *)ins_addr; ++ p = (unsigned char *)ktla_ktva(ins_addr); + p += skip_prefix(p, &prf); + p += get_opcode(p, &opcode); + +@@ -415,7 +415,7 @@ unsigned long get_ins_reg_val(unsigned long ins_addr, struct pt_regs *regs) + struct prefix_bits prf; + int i; + +- p = (unsigned char *)ins_addr; ++ p = (unsigned char *)ktla_ktva(ins_addr); + p += skip_prefix(p, &prf); + p += get_opcode(p, &opcode); + for (i = 0; i < ARRAY_SIZE(reg_rop); i++) +@@ -470,7 +470,7 @@ unsigned long get_ins_imm_val(unsigned long ins_addr) + struct prefix_bits prf; + int i; + +- p = (unsigned char *)ins_addr; ++ p = (unsigned char *)ktla_ktva(ins_addr); + p += skip_prefix(p, &prf); + p += get_opcode(p, &opcode); + for (i = 0; i < ARRAY_SIZE(imm_wop); i++) +diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c +index 6fb6927..634b0f7 100644 +--- a/arch/x86/mm/pgtable.c ++++ b/arch/x86/mm/pgtable.c +@@ -97,10 +97,71 @@ static inline void pgd_list_del(pgd_t *pgd) + list_del(&page->lru); + } + +-#define UNSHARED_PTRS_PER_PGD \ +- (SHARED_KERNEL_PMD ? KERNEL_PGD_BOUNDARY : PTRS_PER_PGD) ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++pgdval_t clone_pgd_mask __read_only = ~_PAGE_PRESENT; + ++void __shadow_user_pgds(pgd_t *dst, const pgd_t *src) ++{ ++ unsigned int count = USER_PGD_PTRS; ++ ++ if (!pax_user_shadow_base) ++ return; ++ ++ while (count--) ++ *dst++ = __pgd((pgd_val(*src++) | (_PAGE_NX & __supported_pte_mask)) & ~_PAGE_USER); ++} ++#endif ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++void __clone_user_pgds(pgd_t *dst, const pgd_t *src) ++{ ++ unsigned int count = USER_PGD_PTRS; ++ ++ while (count--) { ++ pgd_t pgd; ++ ++#ifdef CONFIG_X86_64 ++ pgd = __pgd(pgd_val(*src++) | _PAGE_USER); ++#else ++ pgd = *src++; ++#endif ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++ pgd = __pgd(pgd_val(pgd) & clone_pgd_mask); ++#endif + ++ *dst++ = pgd; ++ } ++ ++} ++#endif ++ ++#ifdef CONFIG_X86_64 ++#define pxd_t pud_t ++#define pyd_t pgd_t ++#define paravirt_release_pxd(pfn) paravirt_release_pud(pfn) ++#define pgtable_pxd_page_ctor(page) true ++#define pgtable_pxd_page_dtor(page) do {} while (0) ++#define pxd_free(mm, pud) pud_free((mm), (pud)) ++#define pyd_populate(mm, pgd, pud) pgd_populate((mm), (pgd), (pud)) ++#define pyd_offset(mm, address) pgd_offset((mm), (address)) ++#define PYD_SIZE PGDIR_SIZE ++#else ++#define pxd_t pmd_t ++#define pyd_t pud_t ++#define paravirt_release_pxd(pfn) paravirt_release_pmd(pfn) ++#define pgtable_pxd_page_ctor(page) pgtable_pmd_page_ctor(page) ++#define pgtable_pxd_page_dtor(page) pgtable_pmd_page_dtor(page) ++#define pxd_free(mm, pud) pmd_free((mm), (pud)) ++#define pyd_populate(mm, pgd, pud) pud_populate((mm), (pgd), (pud)) ++#define pyd_offset(mm, address) pud_offset((mm), (address)) ++#define PYD_SIZE PUD_SIZE ++#endif ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++static inline void pgd_ctor(struct mm_struct *mm, pgd_t *pgd) {} ++static inline void pgd_dtor(pgd_t *pgd) {} ++#else + static void pgd_set_mm(pgd_t *pgd, struct mm_struct *mm) + { + BUILD_BUG_ON(sizeof(virt_to_page(pgd)->index) < sizeof(mm)); +@@ -141,6 +202,7 @@ static void pgd_dtor(pgd_t *pgd) + pgd_list_del(pgd); + spin_unlock(&pgd_lock); + } ++#endif + + /* + * List of all pgd's needed for non-PAE so it can invalidate entries +@@ -153,7 +215,7 @@ static void pgd_dtor(pgd_t *pgd) + * -- nyc + */ + +-#ifdef CONFIG_X86_PAE ++#if defined(CONFIG_X86_32) && defined(CONFIG_X86_PAE) + /* + * In PAE mode, we need to do a cr3 reload (=tlb flush) when + * updating the top-level pagetable entries to guarantee the +@@ -165,7 +227,7 @@ static void pgd_dtor(pgd_t *pgd) + * not shared between pagetables (!SHARED_KERNEL_PMDS), we allocate + * and initialize the kernel pmds here. + */ +-#define PREALLOCATED_PMDS UNSHARED_PTRS_PER_PGD ++#define PREALLOCATED_PXDS (SHARED_KERNEL_PMD ? KERNEL_PGD_BOUNDARY : PTRS_PER_PGD) + + void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd) + { +@@ -183,43 +245,45 @@ void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd) + */ + flush_tlb_mm(mm); + } ++#elif defined(CONFIG_X86_64) && defined(CONFIG_PAX_PER_CPU_PGD) ++#define PREALLOCATED_PXDS USER_PGD_PTRS + #else /* !CONFIG_X86_PAE */ + + /* No need to prepopulate any pagetable entries in non-PAE modes. */ +-#define PREALLOCATED_PMDS 0 ++#define PREALLOCATED_PXDS 0 + + #endif /* CONFIG_X86_PAE */ + +-static void free_pmds(pmd_t *pmds[]) ++static void free_pxds(pxd_t *pxds[]) + { + int i; + +- for(i = 0; i < PREALLOCATED_PMDS; i++) +- if (pmds[i]) { +- pgtable_pmd_page_dtor(virt_to_page(pmds[i])); +- free_page((unsigned long)pmds[i]); ++ for(i = 0; i < PREALLOCATED_PXDS; i++) ++ if (pxds[i]) { ++ pgtable_pxd_page_dtor(virt_to_page(pxds[i])); ++ free_page((unsigned long)pxds[i]); + } + } + +-static int preallocate_pmds(pmd_t *pmds[]) ++static int preallocate_pxds(pxd_t *pxds[]) + { + int i; + bool failed = false; + +- for(i = 0; i < PREALLOCATED_PMDS; i++) { +- pmd_t *pmd = (pmd_t *)__get_free_page(PGALLOC_GFP); +- if (!pmd) ++ for(i = 0; i < PREALLOCATED_PXDS; i++) { ++ pxd_t *pxd = (pxd_t *)__get_free_page(PGALLOC_GFP); ++ if (!pxd) + failed = true; +- if (pmd && !pgtable_pmd_page_ctor(virt_to_page(pmd))) { +- free_page((unsigned long)pmd); +- pmd = NULL; ++ if (pxd && !pgtable_pxd_page_ctor(virt_to_page(pxd))) { ++ free_page((unsigned long)pxd); ++ pxd = NULL; + failed = true; + } +- pmds[i] = pmd; ++ pxds[i] = pxd; + } + + if (failed) { +- free_pmds(pmds); ++ free_pxds(pxds); + return -ENOMEM; + } + +@@ -232,49 +296,52 @@ static int preallocate_pmds(pmd_t *pmds[]) + * preallocate which never got a corresponding vma will need to be + * freed manually. + */ +-static void pgd_mop_up_pmds(struct mm_struct *mm, pgd_t *pgdp) ++static void pgd_mop_up_pxds(struct mm_struct *mm, pgd_t *pgdp) + { + int i; + +- for(i = 0; i < PREALLOCATED_PMDS; i++) { ++ for(i = 0; i < PREALLOCATED_PXDS; i++) { + pgd_t pgd = pgdp[i]; + + if (pgd_val(pgd) != 0) { +- pmd_t *pmd = (pmd_t *)pgd_page_vaddr(pgd); ++ pxd_t *pxd = (pxd_t *)pgd_page_vaddr(pgd); + +- pgdp[i] = native_make_pgd(0); ++ set_pgd(pgdp + i, native_make_pgd(0)); + +- paravirt_release_pmd(pgd_val(pgd) >> PAGE_SHIFT); +- pmd_free(mm, pmd); ++ paravirt_release_pxd(pgd_val(pgd) >> PAGE_SHIFT); ++ pxd_free(mm, pxd); + } + } + } + +-static void pgd_prepopulate_pmd(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmds[]) ++static void pgd_prepopulate_pxd(struct mm_struct *mm, pgd_t *pgd, pxd_t *pxds[]) + { +- pud_t *pud; ++ pyd_t *pyd; + int i; + +- if (PREALLOCATED_PMDS == 0) /* Work around gcc-3.4.x bug */ ++ if (PREALLOCATED_PXDS == 0) /* Work around gcc-3.4.x bug */ + return; + +- pud = pud_offset(pgd, 0); +- +- for (i = 0; i < PREALLOCATED_PMDS; i++, pud++) { +- pmd_t *pmd = pmds[i]; ++#ifdef CONFIG_X86_64 ++ pyd = pyd_offset(mm, 0L); ++#else ++ pyd = pyd_offset(pgd, 0L); ++#endif + ++ for (i = 0; i < PREALLOCATED_PXDS; i++, pyd++) { ++ pxd_t *pxd = pxds[i]; + if (i >= KERNEL_PGD_BOUNDARY) +- memcpy(pmd, (pmd_t *)pgd_page_vaddr(swapper_pg_dir[i]), +- sizeof(pmd_t) * PTRS_PER_PMD); ++ memcpy(pxd, (pxd_t *)pgd_page_vaddr(swapper_pg_dir[i]), ++ sizeof(pxd_t) * PTRS_PER_PMD); + +- pud_populate(mm, pud, pmd); ++ pyd_populate(mm, pyd, pxd); + } + } + + pgd_t *pgd_alloc(struct mm_struct *mm) + { + pgd_t *pgd; +- pmd_t *pmds[PREALLOCATED_PMDS]; ++ pxd_t *pxds[PREALLOCATED_PXDS]; + + pgd = (pgd_t *)__get_free_page(PGALLOC_GFP); + +@@ -283,11 +350,11 @@ pgd_t *pgd_alloc(struct mm_struct *mm) + + mm->pgd = pgd; + +- if (preallocate_pmds(pmds) != 0) ++ if (preallocate_pxds(pxds) != 0) + goto out_free_pgd; + + if (paravirt_pgd_alloc(mm) != 0) +- goto out_free_pmds; ++ goto out_free_pxds; + + /* + * Make sure that pre-populating the pmds is atomic with +@@ -297,14 +364,14 @@ pgd_t *pgd_alloc(struct mm_struct *mm) + spin_lock(&pgd_lock); + + pgd_ctor(mm, pgd); +- pgd_prepopulate_pmd(mm, pgd, pmds); ++ pgd_prepopulate_pxd(mm, pgd, pxds); + + spin_unlock(&pgd_lock); + + return pgd; + +-out_free_pmds: +- free_pmds(pmds); ++out_free_pxds: ++ free_pxds(pxds); + out_free_pgd: + free_page((unsigned long)pgd); + out: +@@ -313,7 +380,7 @@ out: + + void pgd_free(struct mm_struct *mm, pgd_t *pgd) + { +- pgd_mop_up_pmds(mm, pgd); ++ pgd_mop_up_pxds(mm, pgd); + pgd_dtor(pgd); + paravirt_pgd_free(mm, pgd); + free_page((unsigned long)pgd); +diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c +index 75cc097..79a097f 100644 +--- a/arch/x86/mm/pgtable_32.c ++++ b/arch/x86/mm/pgtable_32.c +@@ -47,10 +47,13 @@ void set_pte_vaddr(unsigned long vaddr, pte_t pteval) + return; + } + pte = pte_offset_kernel(pmd, vaddr); ++ ++ pax_open_kernel(); + if (pte_val(pteval)) + set_pte_at(&init_mm, vaddr, pte, pteval); + else + pte_clear(&init_mm, vaddr, pte); ++ pax_close_kernel(); + + /* + * It's enough to flush this one mapping. +diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c +index e666cbb..61788c45 100644 +--- a/arch/x86/mm/physaddr.c ++++ b/arch/x86/mm/physaddr.c +@@ -10,7 +10,7 @@ + #ifdef CONFIG_X86_64 + + #ifdef CONFIG_DEBUG_VIRTUAL +-unsigned long __phys_addr(unsigned long x) ++unsigned long __intentional_overflow(-1) __phys_addr(unsigned long x) + { + unsigned long y = x - __START_KERNEL_map; + +@@ -67,7 +67,7 @@ EXPORT_SYMBOL(__virt_addr_valid); + #else + + #ifdef CONFIG_DEBUG_VIRTUAL +-unsigned long __phys_addr(unsigned long x) ++unsigned long __intentional_overflow(-1) __phys_addr(unsigned long x) + { + unsigned long phys_addr = x - PAGE_OFFSET; + /* VMALLOC_* aren't constants */ +diff --git a/arch/x86/mm/setup_nx.c b/arch/x86/mm/setup_nx.c +index 90555bf..f5f1828 100644 +--- a/arch/x86/mm/setup_nx.c ++++ b/arch/x86/mm/setup_nx.c +@@ -5,8 +5,10 @@ + #include <asm/pgtable.h> + #include <asm/proto.h> + ++#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) + static int disable_nx; + ++#ifndef CONFIG_PAX_PAGEEXEC + /* + * noexec = on|off + * +@@ -28,12 +30,17 @@ static int __init noexec_setup(char *str) + return 0; + } + early_param("noexec", noexec_setup); ++#endif ++ ++#endif + + void x86_configure_nx(void) + { ++#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) + if (cpu_has_nx && !disable_nx) + __supported_pte_mask |= _PAGE_NX; + else ++#endif + __supported_pte_mask &= ~_PAGE_NX; + } + +diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c +index ee61c36..e6fedeb 100644 +--- a/arch/x86/mm/tlb.c ++++ b/arch/x86/mm/tlb.c +@@ -48,7 +48,11 @@ void leave_mm(int cpu) + BUG(); + if (cpumask_test_cpu(cpu, mm_cpumask(active_mm))) { + cpumask_clear_cpu(cpu, mm_cpumask(active_mm)); ++ ++#ifndef CONFIG_PAX_PER_CPU_PGD + load_cr3(swapper_pg_dir); ++#endif ++ + /* + * This gets called in the idle path where RCU + * functions differently. Tracing normally +diff --git a/arch/x86/mm/uderef_64.c b/arch/x86/mm/uderef_64.c +new file mode 100644 +index 0000000..dace51c +--- /dev/null ++++ b/arch/x86/mm/uderef_64.c +@@ -0,0 +1,37 @@ ++#include <linux/mm.h> ++#include <asm/pgtable.h> ++#include <asm/uaccess.h> ++ ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++/* PaX: due to the special call convention these functions must ++ * - remain leaf functions under all configurations, ++ * - never be called directly, only dereferenced from the wrappers. ++ */ ++void __pax_open_userland(void) ++{ ++ unsigned int cpu; ++ ++ if (unlikely(!segment_eq(get_fs(), USER_DS))) ++ return; ++ ++ cpu = raw_get_cpu(); ++ BUG_ON((read_cr3() & ~PAGE_MASK) != PCID_KERNEL); ++ write_cr3(__pa(get_cpu_pgd(cpu, user)) | PCID_USER | PCID_NOFLUSH); ++ raw_put_cpu_no_resched(); ++} ++EXPORT_SYMBOL(__pax_open_userland); ++ ++void __pax_close_userland(void) ++{ ++ unsigned int cpu; ++ ++ if (unlikely(!segment_eq(get_fs(), USER_DS))) ++ return; ++ ++ cpu = raw_get_cpu(); ++ BUG_ON((read_cr3() & ~PAGE_MASK) != PCID_USER); ++ write_cr3(__pa(get_cpu_pgd(cpu, kernel)) | PCID_KERNEL | PCID_NOFLUSH); ++ raw_put_cpu_no_resched(); ++} ++EXPORT_SYMBOL(__pax_close_userland); ++#endif +diff --git a/arch/x86/net/bpf_jit.S b/arch/x86/net/bpf_jit.S +index 6440221..f84b5c7 100644 +--- a/arch/x86/net/bpf_jit.S ++++ b/arch/x86/net/bpf_jit.S +@@ -9,6 +9,7 @@ + */ + #include <linux/linkage.h> + #include <asm/dwarf2.h> ++#include <asm/alternative-asm.h> + + /* + * Calling convention : +@@ -38,6 +39,7 @@ sk_load_word_positive_offset: + jle bpf_slow_path_word + mov (SKBDATA,%rsi),%eax + bswap %eax /* ntohl() */ ++ pax_force_retaddr + ret + + sk_load_half: +@@ -55,6 +57,7 @@ sk_load_half_positive_offset: + jle bpf_slow_path_half + movzwl (SKBDATA,%rsi),%eax + rol $8,%ax # ntohs() ++ pax_force_retaddr + ret + + sk_load_byte: +@@ -69,6 +72,7 @@ sk_load_byte_positive_offset: + cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte */ + jle bpf_slow_path_byte + movzbl (SKBDATA,%rsi),%eax ++ pax_force_retaddr + ret + + /* rsi contains offset and can be scratched */ +@@ -90,6 +94,7 @@ bpf_slow_path_word: + js bpf_error + mov - MAX_BPF_STACK + 32(%rbp),%eax + bswap %eax ++ pax_force_retaddr + ret + + bpf_slow_path_half: +@@ -98,12 +103,14 @@ bpf_slow_path_half: + mov - MAX_BPF_STACK + 32(%rbp),%ax + rol $8,%ax + movzwl %ax,%eax ++ pax_force_retaddr + ret + + bpf_slow_path_byte: + bpf_slow_path_common(1) + js bpf_error + movzbl - MAX_BPF_STACK + 32(%rbp),%eax ++ pax_force_retaddr + ret + + #define sk_negative_common(SIZE) \ +@@ -126,6 +133,7 @@ sk_load_word_negative_offset: + sk_negative_common(4) + mov (%rax), %eax + bswap %eax ++ pax_force_retaddr + ret + + bpf_slow_path_half_neg: +@@ -137,6 +145,7 @@ sk_load_half_negative_offset: + mov (%rax),%ax + rol $8,%ax + movzwl %ax,%eax ++ pax_force_retaddr + ret + + bpf_slow_path_byte_neg: +@@ -146,6 +155,7 @@ sk_load_byte_negative_offset: + .globl sk_load_byte_negative_offset + sk_negative_common(1) + movzbl (%rax), %eax ++ pax_force_retaddr + ret + + bpf_error: +@@ -156,4 +166,5 @@ bpf_error: + mov - MAX_BPF_STACK + 16(%rbp),%r14 + mov - MAX_BPF_STACK + 24(%rbp),%r15 + leaveq ++ pax_force_retaddr + ret +diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c +index 3f62734..a57894f 100644 +--- a/arch/x86/net/bpf_jit_comp.c ++++ b/arch/x86/net/bpf_jit_comp.c +@@ -13,7 +13,11 @@ + #include <linux/if_vlan.h> + #include <asm/cacheflush.h> + ++#ifdef CONFIG_GRKERNSEC_BPF_HARDEN ++int bpf_jit_enable __read_only; ++#else + int bpf_jit_enable __read_mostly; ++#endif + + /* + * assembly code in arch/x86/net/bpf_jit.S +@@ -174,7 +178,9 @@ static inline u8 add_2reg(u8 byte, u32 dst_reg, u32 src_reg) + static void jit_fill_hole(void *area, unsigned int size) + { + /* fill whole space with int3 instructions */ ++ pax_open_kernel(); + memset(area, 0xcc, size); ++ pax_close_kernel(); + } + + struct jit_context { +@@ -894,7 +900,9 @@ common_load: + pr_err("bpf_jit_compile fatal error\n"); + return -EFAULT; + } ++ pax_open_kernel(); + memcpy(image + proglen, temp, ilen); ++ pax_close_kernel(); + } + proglen += ilen; + addrs[i] = proglen; +@@ -966,7 +974,6 @@ void bpf_int_jit_compile(struct bpf_prog *prog) + + if (image) { + bpf_flush_icache(header, image + proglen); +- set_memory_ro((unsigned long)header, header->pages); + prog->bpf_func = (void *)image; + prog->jited = true; + } +@@ -979,12 +986,8 @@ void bpf_jit_free(struct bpf_prog *fp) + unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK; + struct bpf_binary_header *header = (void *)addr; + +- if (!fp->jited) +- goto free_filter; ++ if (fp->jited) ++ bpf_jit_binary_free(header); + +- set_memory_rw(addr, header->pages); +- bpf_jit_binary_free(header); +- +-free_filter: + bpf_prog_unlock_free(fp); + } +diff --git a/arch/x86/oprofile/backtrace.c b/arch/x86/oprofile/backtrace.c +index 5d04be5..2beeaa2 100644 +--- a/arch/x86/oprofile/backtrace.c ++++ b/arch/x86/oprofile/backtrace.c +@@ -46,11 +46,11 @@ dump_user_backtrace_32(struct stack_frame_ia32 *head) + struct stack_frame_ia32 *fp; + unsigned long bytes; + +- bytes = copy_from_user_nmi(bufhead, head, sizeof(bufhead)); ++ bytes = copy_from_user_nmi(bufhead, (const char __force_user *)head, sizeof(bufhead)); + if (bytes != 0) + return NULL; + +- fp = (struct stack_frame_ia32 *) compat_ptr(bufhead[0].next_frame); ++ fp = (struct stack_frame_ia32 __force_kernel *) compat_ptr(bufhead[0].next_frame); + + oprofile_add_trace(bufhead[0].return_address); + +@@ -92,7 +92,7 @@ static struct stack_frame *dump_user_backtrace(struct stack_frame *head) + struct stack_frame bufhead[2]; + unsigned long bytes; + +- bytes = copy_from_user_nmi(bufhead, head, sizeof(bufhead)); ++ bytes = copy_from_user_nmi(bufhead, (const char __force_user *)head, sizeof(bufhead)); + if (bytes != 0) + return NULL; + +@@ -111,7 +111,7 @@ x86_backtrace(struct pt_regs * const regs, unsigned int depth) + { + struct stack_frame *head = (struct stack_frame *)frame_pointer(regs); + +- if (!user_mode_vm(regs)) { ++ if (!user_mode(regs)) { + unsigned long stack = kernel_stack_pointer(regs); + if (depth) + dump_trace(NULL, regs, (unsigned long *)stack, 0, +diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c +index 1d2e639..f6ef82a 100644 +--- a/arch/x86/oprofile/nmi_int.c ++++ b/arch/x86/oprofile/nmi_int.c +@@ -23,6 +23,7 @@ + #include <asm/nmi.h> + #include <asm/msr.h> + #include <asm/apic.h> ++#include <asm/pgtable.h> + + #include "op_counter.h" + #include "op_x86_model.h" +@@ -785,8 +786,11 @@ int __init op_nmi_init(struct oprofile_operations *ops) + if (ret) + return ret; + +- if (!model->num_virt_counters) +- model->num_virt_counters = model->num_counters; ++ if (!model->num_virt_counters) { ++ pax_open_kernel(); ++ *(unsigned int *)&model->num_virt_counters = model->num_counters; ++ pax_close_kernel(); ++ } + + mux_init(ops); + +diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c +index 50d86c0..7985318 100644 +--- a/arch/x86/oprofile/op_model_amd.c ++++ b/arch/x86/oprofile/op_model_amd.c +@@ -519,9 +519,11 @@ static int op_amd_init(struct oprofile_operations *ops) + num_counters = AMD64_NUM_COUNTERS; + } + +- op_amd_spec.num_counters = num_counters; +- op_amd_spec.num_controls = num_counters; +- op_amd_spec.num_virt_counters = max(num_counters, NUM_VIRT_COUNTERS); ++ pax_open_kernel(); ++ *(unsigned int *)&op_amd_spec.num_counters = num_counters; ++ *(unsigned int *)&op_amd_spec.num_controls = num_counters; ++ *(unsigned int *)&op_amd_spec.num_virt_counters = max(num_counters, NUM_VIRT_COUNTERS); ++ pax_close_kernel(); + + return 0; + } +diff --git a/arch/x86/oprofile/op_model_ppro.c b/arch/x86/oprofile/op_model_ppro.c +index d90528e..0127e2b 100644 +--- a/arch/x86/oprofile/op_model_ppro.c ++++ b/arch/x86/oprofile/op_model_ppro.c +@@ -19,6 +19,7 @@ + #include <asm/msr.h> + #include <asm/apic.h> + #include <asm/nmi.h> ++#include <asm/pgtable.h> + + #include "op_x86_model.h" + #include "op_counter.h" +@@ -221,8 +222,10 @@ static void arch_perfmon_setup_counters(void) + + num_counters = min((int)eax.split.num_counters, OP_MAX_COUNTER); + +- op_arch_perfmon_spec.num_counters = num_counters; +- op_arch_perfmon_spec.num_controls = num_counters; ++ pax_open_kernel(); ++ *(unsigned int *)&op_arch_perfmon_spec.num_counters = num_counters; ++ *(unsigned int *)&op_arch_perfmon_spec.num_controls = num_counters; ++ pax_close_kernel(); + } + + static int arch_perfmon_init(struct oprofile_operations *ignore) +diff --git a/arch/x86/oprofile/op_x86_model.h b/arch/x86/oprofile/op_x86_model.h +index 71e8a67..6a313bb 100644 +--- a/arch/x86/oprofile/op_x86_model.h ++++ b/arch/x86/oprofile/op_x86_model.h +@@ -52,7 +52,7 @@ struct op_x86_model_spec { + void (*switch_ctrl)(struct op_x86_model_spec const *model, + struct op_msrs const * const msrs); + #endif +-}; ++} __do_const; + + struct op_counter_config; + +diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c +index b9958c3..24229ab 100644 +--- a/arch/x86/pci/intel_mid_pci.c ++++ b/arch/x86/pci/intel_mid_pci.c +@@ -250,7 +250,7 @@ int __init intel_mid_pci_init(void) + pci_mmcfg_late_init(); + pcibios_enable_irq = intel_mid_pci_irq_enable; + pcibios_disable_irq = intel_mid_pci_irq_disable; +- pci_root_ops = intel_mid_pci_ops; ++ memcpy((void *)&pci_root_ops, &intel_mid_pci_ops, sizeof pci_root_ops); + pci_soc_mode = 1; + /* Continue with standard init */ + return 1; +diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c +index eb500c2..eab9e70 100644 +--- a/arch/x86/pci/irq.c ++++ b/arch/x86/pci/irq.c +@@ -51,7 +51,7 @@ struct irq_router { + struct irq_router_handler { + u16 vendor; + int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device); +-}; ++} __do_const; + + int (*pcibios_enable_irq)(struct pci_dev *dev) = pirq_enable_irq; + void (*pcibios_disable_irq)(struct pci_dev *dev) = pirq_disable_irq; +@@ -791,7 +791,7 @@ static __init int pico_router_probe(struct irq_router *r, struct pci_dev *router + return 0; + } + +-static __initdata struct irq_router_handler pirq_routers[] = { ++static __initconst const struct irq_router_handler pirq_routers[] = { + { PCI_VENDOR_ID_INTEL, intel_router_probe }, + { PCI_VENDOR_ID_AL, ali_router_probe }, + { PCI_VENDOR_ID_ITE, ite_router_probe }, +@@ -818,7 +818,7 @@ static struct pci_dev *pirq_router_dev; + static void __init pirq_find_router(struct irq_router *r) + { + struct irq_routing_table *rt = pirq_table; +- struct irq_router_handler *h; ++ const struct irq_router_handler *h; + + #ifdef CONFIG_PCI_BIOS + if (!rt->signature) { +@@ -1091,7 +1091,7 @@ static int __init fix_acer_tm360_irqrouting(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id __initdata pciirq_dmi_table[] = { ++static const struct dmi_system_id __initconst pciirq_dmi_table[] = { + { + .callback = fix_broken_hp_bios_irq9, + .ident = "HP Pavilion N5400 Series Laptop", +diff --git a/arch/x86/pci/pcbios.c b/arch/x86/pci/pcbios.c +index 9b83b90..4112152 100644 +--- a/arch/x86/pci/pcbios.c ++++ b/arch/x86/pci/pcbios.c +@@ -79,7 +79,7 @@ union bios32 { + static struct { + unsigned long address; + unsigned short segment; +-} bios32_indirect __initdata = { 0, __KERNEL_CS }; ++} bios32_indirect __initconst = { 0, __PCIBIOS_CS }; + + /* + * Returns the entry point for the given service, NULL on error +@@ -92,37 +92,80 @@ static unsigned long __init bios32_service(unsigned long service) + unsigned long length; /* %ecx */ + unsigned long entry; /* %edx */ + unsigned long flags; ++ struct desc_struct d, *gdt; + + local_irq_save(flags); +- __asm__("lcall *(%%edi); cld" ++ ++ gdt = get_cpu_gdt_table(smp_processor_id()); ++ ++ pack_descriptor(&d, 0UL, 0xFFFFFUL, 0x9B, 0xC); ++ write_gdt_entry(gdt, GDT_ENTRY_PCIBIOS_CS, &d, DESCTYPE_S); ++ pack_descriptor(&d, 0UL, 0xFFFFFUL, 0x93, 0xC); ++ write_gdt_entry(gdt, GDT_ENTRY_PCIBIOS_DS, &d, DESCTYPE_S); ++ ++ __asm__("movw %w7, %%ds; lcall *(%%edi); push %%ss; pop %%ds; cld" + : "=a" (return_code), + "=b" (address), + "=c" (length), + "=d" (entry) + : "0" (service), + "1" (0), +- "D" (&bios32_indirect)); ++ "D" (&bios32_indirect), ++ "r"(__PCIBIOS_DS) ++ : "memory"); ++ ++ pax_open_kernel(); ++ gdt[GDT_ENTRY_PCIBIOS_CS].a = 0; ++ gdt[GDT_ENTRY_PCIBIOS_CS].b = 0; ++ gdt[GDT_ENTRY_PCIBIOS_DS].a = 0; ++ gdt[GDT_ENTRY_PCIBIOS_DS].b = 0; ++ pax_close_kernel(); ++ + local_irq_restore(flags); + + switch (return_code) { +- case 0: +- return address + entry; +- case 0x80: /* Not present */ +- printk(KERN_WARNING "bios32_service(0x%lx): not present\n", service); +- return 0; +- default: /* Shouldn't happen */ +- printk(KERN_WARNING "bios32_service(0x%lx): returned 0x%x -- BIOS bug!\n", +- service, return_code); ++ case 0: { ++ int cpu; ++ unsigned char flags; ++ ++ printk(KERN_INFO "bios32_service: base:%08lx length:%08lx entry:%08lx\n", address, length, entry); ++ if (address >= 0xFFFF0 || length > 0x100000 - address || length <= entry) { ++ printk(KERN_WARNING "bios32_service: not valid\n"); + return 0; ++ } ++ address = address + PAGE_OFFSET; ++ length += 16UL; /* some BIOSs underreport this... */ ++ flags = 4; ++ if (length >= 64*1024*1024) { ++ length >>= PAGE_SHIFT; ++ flags |= 8; ++ } ++ ++ for (cpu = 0; cpu < nr_cpu_ids; cpu++) { ++ gdt = get_cpu_gdt_table(cpu); ++ pack_descriptor(&d, address, length, 0x9b, flags); ++ write_gdt_entry(gdt, GDT_ENTRY_PCIBIOS_CS, &d, DESCTYPE_S); ++ pack_descriptor(&d, address, length, 0x93, flags); ++ write_gdt_entry(gdt, GDT_ENTRY_PCIBIOS_DS, &d, DESCTYPE_S); ++ } ++ return entry; ++ } ++ case 0x80: /* Not present */ ++ printk(KERN_WARNING "bios32_service(0x%lx): not present\n", service); ++ return 0; ++ default: /* Shouldn't happen */ ++ printk(KERN_WARNING "bios32_service(0x%lx): returned 0x%x -- BIOS bug!\n", ++ service, return_code); ++ return 0; + } + } + + static struct { + unsigned long address; + unsigned short segment; +-} pci_indirect = { 0, __KERNEL_CS }; ++} pci_indirect __read_only = { 0, __PCIBIOS_CS }; + +-static int pci_bios_present; ++static int pci_bios_present __read_only; + + static int __init check_pcibios(void) + { +@@ -131,11 +174,13 @@ static int __init check_pcibios(void) + unsigned long flags, pcibios_entry; + + if ((pcibios_entry = bios32_service(PCI_SERVICE))) { +- pci_indirect.address = pcibios_entry + PAGE_OFFSET; ++ pci_indirect.address = pcibios_entry; + + local_irq_save(flags); +- __asm__( +- "lcall *(%%edi); cld\n\t" ++ __asm__("movw %w6, %%ds\n\t" ++ "lcall *%%ss:(%%edi); cld\n\t" ++ "push %%ss\n\t" ++ "pop %%ds\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" +@@ -144,7 +189,8 @@ static int __init check_pcibios(void) + "=b" (ebx), + "=c" (ecx) + : "1" (PCIBIOS_PCI_BIOS_PRESENT), +- "D" (&pci_indirect) ++ "D" (&pci_indirect), ++ "r" (__PCIBIOS_DS) + : "memory"); + local_irq_restore(flags); + +@@ -189,7 +235,10 @@ static int pci_bios_read(unsigned int seg, unsigned int bus, + + switch (len) { + case 1: +- __asm__("lcall *(%%esi); cld\n\t" ++ __asm__("movw %w6, %%ds\n\t" ++ "lcall *%%ss:(%%esi); cld\n\t" ++ "push %%ss\n\t" ++ "pop %%ds\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" +@@ -198,7 +247,8 @@ static int pci_bios_read(unsigned int seg, unsigned int bus, + : "1" (PCIBIOS_READ_CONFIG_BYTE), + "b" (bx), + "D" ((long)reg), +- "S" (&pci_indirect)); ++ "S" (&pci_indirect), ++ "r" (__PCIBIOS_DS)); + /* + * Zero-extend the result beyond 8 bits, do not trust the + * BIOS having done it: +@@ -206,7 +256,10 @@ static int pci_bios_read(unsigned int seg, unsigned int bus, + *value &= 0xff; + break; + case 2: +- __asm__("lcall *(%%esi); cld\n\t" ++ __asm__("movw %w6, %%ds\n\t" ++ "lcall *%%ss:(%%esi); cld\n\t" ++ "push %%ss\n\t" ++ "pop %%ds\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" +@@ -215,7 +268,8 @@ static int pci_bios_read(unsigned int seg, unsigned int bus, + : "1" (PCIBIOS_READ_CONFIG_WORD), + "b" (bx), + "D" ((long)reg), +- "S" (&pci_indirect)); ++ "S" (&pci_indirect), ++ "r" (__PCIBIOS_DS)); + /* + * Zero-extend the result beyond 16 bits, do not trust the + * BIOS having done it: +@@ -223,7 +277,10 @@ static int pci_bios_read(unsigned int seg, unsigned int bus, + *value &= 0xffff; + break; + case 4: +- __asm__("lcall *(%%esi); cld\n\t" ++ __asm__("movw %w6, %%ds\n\t" ++ "lcall *%%ss:(%%esi); cld\n\t" ++ "push %%ss\n\t" ++ "pop %%ds\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" +@@ -232,7 +289,8 @@ static int pci_bios_read(unsigned int seg, unsigned int bus, + : "1" (PCIBIOS_READ_CONFIG_DWORD), + "b" (bx), + "D" ((long)reg), +- "S" (&pci_indirect)); ++ "S" (&pci_indirect), ++ "r" (__PCIBIOS_DS)); + break; + } + +@@ -256,7 +314,10 @@ static int pci_bios_write(unsigned int seg, unsigned int bus, + + switch (len) { + case 1: +- __asm__("lcall *(%%esi); cld\n\t" ++ __asm__("movw %w6, %%ds\n\t" ++ "lcall *%%ss:(%%esi); cld\n\t" ++ "push %%ss\n\t" ++ "pop %%ds\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" +@@ -265,10 +326,14 @@ static int pci_bios_write(unsigned int seg, unsigned int bus, + "c" (value), + "b" (bx), + "D" ((long)reg), +- "S" (&pci_indirect)); ++ "S" (&pci_indirect), ++ "r" (__PCIBIOS_DS)); + break; + case 2: +- __asm__("lcall *(%%esi); cld\n\t" ++ __asm__("movw %w6, %%ds\n\t" ++ "lcall *%%ss:(%%esi); cld\n\t" ++ "push %%ss\n\t" ++ "pop %%ds\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" +@@ -277,10 +342,14 @@ static int pci_bios_write(unsigned int seg, unsigned int bus, + "c" (value), + "b" (bx), + "D" ((long)reg), +- "S" (&pci_indirect)); ++ "S" (&pci_indirect), ++ "r" (__PCIBIOS_DS)); + break; + case 4: +- __asm__("lcall *(%%esi); cld\n\t" ++ __asm__("movw %w6, %%ds\n\t" ++ "lcall *%%ss:(%%esi); cld\n\t" ++ "push %%ss\n\t" ++ "pop %%ds\n\t" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" +@@ -289,7 +358,8 @@ static int pci_bios_write(unsigned int seg, unsigned int bus, + "c" (value), + "b" (bx), + "D" ((long)reg), +- "S" (&pci_indirect)); ++ "S" (&pci_indirect), ++ "r" (__PCIBIOS_DS)); + break; + } + +@@ -394,10 +464,13 @@ struct irq_routing_table * pcibios_get_irq_routing_table(void) + + DBG("PCI: Fetching IRQ routing table... "); + __asm__("push %%es\n\t" ++ "movw %w8, %%ds\n\t" + "push %%ds\n\t" + "pop %%es\n\t" +- "lcall *(%%esi); cld\n\t" ++ "lcall *%%ss:(%%esi); cld\n\t" + "pop %%es\n\t" ++ "push %%ss\n\t" ++ "pop %%ds\n" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" +@@ -408,7 +481,8 @@ struct irq_routing_table * pcibios_get_irq_routing_table(void) + "1" (0), + "D" ((long) &opt), + "S" (&pci_indirect), +- "m" (opt) ++ "m" (opt), ++ "r" (__PCIBIOS_DS) + : "memory"); + DBG("OK ret=%d, size=%d, map=%x\n", ret, opt.size, map); + if (ret & 0xff00) +@@ -432,7 +506,10 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq) + { + int ret; + +- __asm__("lcall *(%%esi); cld\n\t" ++ __asm__("movw %w5, %%ds\n\t" ++ "lcall *%%ss:(%%esi); cld\n\t" ++ "push %%ss\n\t" ++ "pop %%ds\n" + "jc 1f\n\t" + "xor %%ah, %%ah\n" + "1:" +@@ -440,7 +517,8 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq) + : "0" (PCIBIOS_SET_PCI_HW_INT), + "b" ((dev->bus->number << 8) | dev->devfn), + "c" ((irq << 8) | (pin + 10)), +- "S" (&pci_indirect)); ++ "S" (&pci_indirect), ++ "r" (__PCIBIOS_DS)); + return !(ret & 0xff00); + } + EXPORT_SYMBOL(pcibios_set_irq_routing); +diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c +index 40e7cda..c7e6672 100644 +--- a/arch/x86/platform/efi/efi_32.c ++++ b/arch/x86/platform/efi/efi_32.c +@@ -61,11 +61,22 @@ void __init efi_call_phys_prolog(void) + { + struct desc_ptr gdt_descr; + ++#ifdef CONFIG_PAX_KERNEXEC ++ struct desc_struct d; ++#endif ++ + local_irq_save(efi_rt_eflags); + + load_cr3(initial_page_table); + __flush_tlb_all(); + ++#ifdef CONFIG_PAX_KERNEXEC ++ pack_descriptor(&d, 0, 0xFFFFF, 0x9B, 0xC); ++ write_gdt_entry(get_cpu_gdt_table(0), GDT_ENTRY_KERNEXEC_EFI_CS, &d, DESCTYPE_S); ++ pack_descriptor(&d, 0, 0xFFFFF, 0x93, 0xC); ++ write_gdt_entry(get_cpu_gdt_table(0), GDT_ENTRY_KERNEXEC_EFI_DS, &d, DESCTYPE_S); ++#endif ++ + gdt_descr.address = __pa(get_cpu_gdt_table(0)); + gdt_descr.size = GDT_SIZE - 1; + load_gdt(&gdt_descr); +@@ -75,11 +86,24 @@ void __init efi_call_phys_epilog(void) + { + struct desc_ptr gdt_descr; + ++#ifdef CONFIG_PAX_KERNEXEC ++ struct desc_struct d; ++ ++ memset(&d, 0, sizeof d); ++ write_gdt_entry(get_cpu_gdt_table(0), GDT_ENTRY_KERNEXEC_EFI_CS, &d, DESCTYPE_S); ++ write_gdt_entry(get_cpu_gdt_table(0), GDT_ENTRY_KERNEXEC_EFI_DS, &d, DESCTYPE_S); ++#endif ++ + gdt_descr.address = (unsigned long)get_cpu_gdt_table(0); + gdt_descr.size = GDT_SIZE - 1; + load_gdt(&gdt_descr); + ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ load_cr3(get_cpu_pgd(smp_processor_id(), kernel)); ++#else + load_cr3(swapper_pg_dir); ++#endif ++ + __flush_tlb_all(); + + local_irq_restore(efi_rt_eflags); +diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c +index 35aecb6..46177db 100644 +--- a/arch/x86/platform/efi/efi_64.c ++++ b/arch/x86/platform/efi/efi_64.c +@@ -99,6 +99,11 @@ void __init efi_call_phys_prolog(void) + vaddress = (unsigned long)__va(pgd * PGDIR_SIZE); + set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), *pgd_offset_k(vaddress)); + } ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ load_cr3(swapper_pg_dir); ++#endif ++ + __flush_tlb_all(); + } + +@@ -116,6 +121,11 @@ void __init efi_call_phys_epilog(void) + for (pgd = 0; pgd < n_pgds; pgd++) + set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]); + kfree(save_pgd); ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ load_cr3(get_cpu_pgd(smp_processor_id(), kernel)); ++#endif ++ + __flush_tlb_all(); + local_irq_restore(efi_flags); + early_code_mapping_set_exec(0); +@@ -146,8 +156,23 @@ int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) + unsigned npages; + pgd_t *pgd; + +- if (efi_enabled(EFI_OLD_MEMMAP)) ++ if (efi_enabled(EFI_OLD_MEMMAP)) { ++ /* PaX: We need to disable the NX bit in the PGD, otherwise we won't be ++ * able to execute the EFI services. ++ */ ++ if (__supported_pte_mask & _PAGE_NX) { ++ unsigned long addr = (unsigned long) __va(0); ++ pgd_t pe = __pgd(pgd_val(*pgd_offset_k(addr)) & ~_PAGE_NX); ++ ++ pr_alert("PAX: Disabling NX protection for low memory map. Try booting without \"efi=old_map\"\n"); ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ set_pgd(pgd_offset_cpu(0, kernel, addr), pe); ++#endif ++ set_pgd(pgd_offset_k(addr), pe); ++ } ++ + return 0; ++ } + + efi_scratch.efi_pgt = (pgd_t *)(unsigned long)real_mode_header->trampoline_pgd; + pgd = __va(efi_scratch.efi_pgt); +diff --git a/arch/x86/platform/efi/efi_stub_32.S b/arch/x86/platform/efi/efi_stub_32.S +index 040192b..7d3300f 100644 +--- a/arch/x86/platform/efi/efi_stub_32.S ++++ b/arch/x86/platform/efi/efi_stub_32.S +@@ -6,7 +6,9 @@ + */ + + #include <linux/linkage.h> ++#include <linux/init.h> + #include <asm/page_types.h> ++#include <asm/segment.h> + + /* + * efi_call_phys(void *, ...) is a function with variable parameters. +@@ -20,7 +22,7 @@ + * service functions will comply with gcc calling convention, too. + */ + +-.text ++__INIT + ENTRY(efi_call_phys) + /* + * 0. The function can only be called in Linux kernel. So CS has been +@@ -36,10 +38,24 @@ ENTRY(efi_call_phys) + * The mapping of lower virtual memory has been created in prolog and + * epilog. + */ +- movl $1f, %edx +- subl $__PAGE_OFFSET, %edx +- jmp *%edx ++#ifdef CONFIG_PAX_KERNEXEC ++ movl $(__KERNEXEC_EFI_DS), %edx ++ mov %edx, %ds ++ mov %edx, %es ++ mov %edx, %ss ++ addl $2f,(1f) ++ ljmp *(1f) ++ ++__INITDATA ++1: .long __LOAD_PHYSICAL_ADDR, __KERNEXEC_EFI_CS ++.previous ++ ++2: ++ subl $2b,(1b) ++#else ++ jmp 1f-__PAGE_OFFSET + 1: ++#endif + + /* + * 2. Now on the top of stack is the return +@@ -47,14 +63,8 @@ ENTRY(efi_call_phys) + * parameter 2, ..., param n. To make things easy, we save the return + * address of efi_call_phys in a global variable. + */ +- popl %edx +- movl %edx, saved_return_addr +- /* get the function pointer into ECX*/ +- popl %ecx +- movl %ecx, efi_rt_function_ptr +- movl $2f, %edx +- subl $__PAGE_OFFSET, %edx +- pushl %edx ++ popl (saved_return_addr) ++ popl (efi_rt_function_ptr) + + /* + * 3. Clear PG bit in %CR0. +@@ -73,9 +83,8 @@ ENTRY(efi_call_phys) + /* + * 5. Call the physical function. + */ +- jmp *%ecx ++ call *(efi_rt_function_ptr-__PAGE_OFFSET) + +-2: + /* + * 6. After EFI runtime service returns, control will return to + * following instruction. We'd better readjust stack pointer first. +@@ -88,35 +97,36 @@ ENTRY(efi_call_phys) + movl %cr0, %edx + orl $0x80000000, %edx + movl %edx, %cr0 +- jmp 1f +-1: ++ + /* + * 8. Now restore the virtual mode from flat mode by + * adding EIP with PAGE_OFFSET. + */ +- movl $1f, %edx +- jmp *%edx ++#ifdef CONFIG_PAX_KERNEXEC ++ movl $(__KERNEL_DS), %edx ++ mov %edx, %ds ++ mov %edx, %es ++ mov %edx, %ss ++ ljmp $(__KERNEL_CS),$1f ++#else ++ jmp 1f+__PAGE_OFFSET ++#endif + 1: + + /* + * 9. Balance the stack. And because EAX contain the return value, + * we'd better not clobber it. + */ +- leal efi_rt_function_ptr, %edx +- movl (%edx), %ecx +- pushl %ecx ++ pushl (efi_rt_function_ptr) + + /* +- * 10. Push the saved return address onto the stack and return. ++ * 10. Return to the saved return address. + */ +- leal saved_return_addr, %edx +- movl (%edx), %ecx +- pushl %ecx +- ret ++ jmpl *(saved_return_addr) + ENDPROC(efi_call_phys) + .previous + +-.data ++__INITDATA + saved_return_addr: + .long 0 + efi_rt_function_ptr: +diff --git a/arch/x86/platform/efi/efi_stub_64.S b/arch/x86/platform/efi/efi_stub_64.S +index 86d0f9e..6d499f4 100644 +--- a/arch/x86/platform/efi/efi_stub_64.S ++++ b/arch/x86/platform/efi/efi_stub_64.S +@@ -11,6 +11,7 @@ + #include <asm/msr.h> + #include <asm/processor-flags.h> + #include <asm/page_types.h> ++#include <asm/alternative-asm.h> + + #define SAVE_XMM \ + mov %rsp, %rax; \ +@@ -88,6 +89,7 @@ ENTRY(efi_call) + RESTORE_PGT + addq $48, %rsp + RESTORE_XMM ++ pax_force_retaddr 0, 1 + ret + ENDPROC(efi_call) + +diff --git a/arch/x86/platform/intel-mid/intel-mid.c b/arch/x86/platform/intel-mid/intel-mid.c +index 1bbedc4..eb795b5 100644 +--- a/arch/x86/platform/intel-mid/intel-mid.c ++++ b/arch/x86/platform/intel-mid/intel-mid.c +@@ -71,9 +71,10 @@ static void intel_mid_power_off(void) + { + }; + +-static void intel_mid_reboot(void) ++static void __noreturn intel_mid_reboot(void) + { + intel_scu_ipc_simple_command(IPCMSG_COLD_BOOT, 0); ++ BUG(); + } + + static unsigned long __init intel_mid_calibrate_tsc(void) +diff --git a/arch/x86/platform/intel-mid/intel_mid_weak_decls.h b/arch/x86/platform/intel-mid/intel_mid_weak_decls.h +index 3c1c386..59a68ed 100644 +--- a/arch/x86/platform/intel-mid/intel_mid_weak_decls.h ++++ b/arch/x86/platform/intel-mid/intel_mid_weak_decls.h +@@ -13,6 +13,6 @@ + /* For every CPU addition a new get_<cpuname>_ops interface needs + * to be added. + */ +-extern void *get_penwell_ops(void); +-extern void *get_cloverview_ops(void); +-extern void *get_tangier_ops(void); ++extern const void *get_penwell_ops(void); ++extern const void *get_cloverview_ops(void); ++extern const void *get_tangier_ops(void); +diff --git a/arch/x86/platform/intel-mid/mfld.c b/arch/x86/platform/intel-mid/mfld.c +index 23381d2..8ddc10e 100644 +--- a/arch/x86/platform/intel-mid/mfld.c ++++ b/arch/x86/platform/intel-mid/mfld.c +@@ -64,12 +64,12 @@ static void __init penwell_arch_setup(void) + pm_power_off = mfld_power_off; + } + +-void *get_penwell_ops(void) ++const void *get_penwell_ops(void) + { + return &penwell_ops; + } + +-void *get_cloverview_ops(void) ++const void *get_cloverview_ops(void) + { + return &penwell_ops; + } +diff --git a/arch/x86/platform/intel-mid/mrfl.c b/arch/x86/platform/intel-mid/mrfl.c +index aaca917..66eadbc 100644 +--- a/arch/x86/platform/intel-mid/mrfl.c ++++ b/arch/x86/platform/intel-mid/mrfl.c +@@ -97,7 +97,7 @@ static struct intel_mid_ops tangier_ops = { + .arch_setup = tangier_arch_setup, + }; + +-void *get_tangier_ops(void) ++const void *get_tangier_ops(void) + { + return &tangier_ops; + } +diff --git a/arch/x86/platform/olpc/olpc_dt.c b/arch/x86/platform/olpc/olpc_dt.c +index d6ee929..3637cb5 100644 +--- a/arch/x86/platform/olpc/olpc_dt.c ++++ b/arch/x86/platform/olpc/olpc_dt.c +@@ -156,7 +156,7 @@ void * __init prom_early_alloc(unsigned long size) + return res; + } + +-static struct of_pdt_ops prom_olpc_ops __initdata = { ++static struct of_pdt_ops prom_olpc_ops __initconst = { + .nextprop = olpc_dt_nextprop, + .getproplen = olpc_dt_getproplen, + .getproperty = olpc_dt_getproperty, +diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c +index 6ec7910..ecdbb11 100644 +--- a/arch/x86/power/cpu.c ++++ b/arch/x86/power/cpu.c +@@ -137,11 +137,8 @@ static void do_fpu_end(void) + static void fix_processor_context(void) + { + int cpu = smp_processor_id(); +- struct tss_struct *t = &per_cpu(init_tss, cpu); +-#ifdef CONFIG_X86_64 +- struct desc_struct *desc = get_cpu_gdt_table(cpu); +- tss_desc tss; +-#endif ++ struct tss_struct *t = init_tss + cpu; ++ + set_tss_desc(cpu, t); /* + * This just modifies memory; should not be + * necessary. But... This is necessary, because +@@ -150,10 +147,6 @@ static void fix_processor_context(void) + */ + + #ifdef CONFIG_X86_64 +- memcpy(&tss, &desc[GDT_ENTRY_TSS], sizeof(tss_desc)); +- tss.type = 0x9; /* The available 64-bit TSS (see AMD vol 2, pg 91 */ +- write_gdt_entry(desc, GDT_ENTRY_TSS, &tss, DESC_TSS); +- + syscall_init(); /* This sets MSR_*STAR and related */ + #endif + load_TR_desc(); /* This does ltr */ +diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c +index bad628a..a102610 100644 +--- a/arch/x86/realmode/init.c ++++ b/arch/x86/realmode/init.c +@@ -68,7 +68,13 @@ void __init setup_real_mode(void) + __va(real_mode_header->trampoline_header); + + #ifdef CONFIG_X86_32 +- trampoline_header->start = __pa_symbol(startup_32_smp); ++ trampoline_header->start = __pa_symbol(ktla_ktva(startup_32_smp)); ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ trampoline_header->start -= LOAD_PHYSICAL_ADDR; ++#endif ++ ++ trampoline_header->boot_cs = __BOOT_CS; + trampoline_header->gdt_limit = __BOOT_DS + 7; + trampoline_header->gdt_base = __pa_symbol(boot_gdt); + #else +@@ -84,7 +90,7 @@ void __init setup_real_mode(void) + *trampoline_cr4_features = read_cr4(); + + trampoline_pgd = (u64 *) __va(real_mode_header->trampoline_pgd); +- trampoline_pgd[0] = init_level4_pgt[pgd_index(__PAGE_OFFSET)].pgd; ++ trampoline_pgd[0] = init_level4_pgt[pgd_index(__PAGE_OFFSET)].pgd & ~_PAGE_NX; + trampoline_pgd[511] = init_level4_pgt[511].pgd; + #endif + } +diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile +index 7c0d7be..d24dc88 100644 +--- a/arch/x86/realmode/rm/Makefile ++++ b/arch/x86/realmode/rm/Makefile +@@ -67,5 +67,8 @@ $(obj)/realmode.relocs: $(obj)/realmode.elf FORCE + + KBUILD_CFLAGS := $(LINUXINCLUDE) $(REALMODE_CFLAGS) -D_SETUP -D_WAKEUP \ + -I$(srctree)/arch/x86/boot ++ifdef CONSTIFY_PLUGIN ++KBUILD_CFLAGS += -fplugin-arg-constify_plugin-no-constify ++endif + KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ + GCOV_PROFILE := n +diff --git a/arch/x86/realmode/rm/header.S b/arch/x86/realmode/rm/header.S +index a28221d..93c40f1 100644 +--- a/arch/x86/realmode/rm/header.S ++++ b/arch/x86/realmode/rm/header.S +@@ -30,7 +30,9 @@ GLOBAL(real_mode_header) + #endif + /* APM/BIOS reboot */ + .long pa_machine_real_restart_asm +-#ifdef CONFIG_X86_64 ++#ifdef CONFIG_X86_32 ++ .long __KERNEL_CS ++#else + .long __KERNEL32_CS + #endif + END(real_mode_header) +diff --git a/arch/x86/realmode/rm/trampoline_32.S b/arch/x86/realmode/rm/trampoline_32.S +index 48ddd76..c26749f 100644 +--- a/arch/x86/realmode/rm/trampoline_32.S ++++ b/arch/x86/realmode/rm/trampoline_32.S +@@ -24,6 +24,12 @@ + #include <asm/page_types.h> + #include "realmode.h" + ++#ifdef CONFIG_PAX_KERNEXEC ++#define ta(X) (X) ++#else ++#define ta(X) (pa_ ## X) ++#endif ++ + .text + .code16 + +@@ -38,8 +44,6 @@ ENTRY(trampoline_start) + + cli # We should be safe anyway + +- movl tr_start, %eax # where we need to go +- + movl $0xA5A5A5A5, trampoline_status + # write marker for master knows we're running + +@@ -55,7 +59,7 @@ ENTRY(trampoline_start) + movw $1, %dx # protected mode (PE) bit + lmsw %dx # into protected mode + +- ljmpl $__BOOT_CS, $pa_startup_32 ++ ljmpl *(trampoline_header) + + .section ".text32","ax" + .code32 +@@ -66,7 +70,7 @@ ENTRY(startup_32) # note: also used from wakeup_asm.S + .balign 8 + GLOBAL(trampoline_header) + tr_start: .space 4 +- tr_gdt_pad: .space 2 ++ tr_boot_cs: .space 2 + tr_gdt: .space 6 + END(trampoline_header) + +diff --git a/arch/x86/realmode/rm/trampoline_64.S b/arch/x86/realmode/rm/trampoline_64.S +index dac7b20..72dbaca 100644 +--- a/arch/x86/realmode/rm/trampoline_64.S ++++ b/arch/x86/realmode/rm/trampoline_64.S +@@ -93,6 +93,7 @@ ENTRY(startup_32) + movl %edx, %gs + + movl pa_tr_cr4, %eax ++ andl $~X86_CR4_PCIDE, %eax + movl %eax, %cr4 # Enable PAE mode + + # Setup trampoline 4 level pagetables +@@ -106,7 +107,7 @@ ENTRY(startup_32) + wrmsr + + # Enable paging and in turn activate Long Mode +- movl $(X86_CR0_PG | X86_CR0_WP | X86_CR0_PE), %eax ++ movl $(X86_CR0_PG | X86_CR0_PE), %eax + movl %eax, %cr0 + + /* +diff --git a/arch/x86/realmode/rm/wakeup_asm.S b/arch/x86/realmode/rm/wakeup_asm.S +index 9e7e147..25a4158 100644 +--- a/arch/x86/realmode/rm/wakeup_asm.S ++++ b/arch/x86/realmode/rm/wakeup_asm.S +@@ -126,11 +126,10 @@ ENTRY(wakeup_start) + lgdtl pmode_gdt + + /* This really couldn't... */ +- movl pmode_entry, %eax + movl pmode_cr0, %ecx + movl %ecx, %cr0 +- ljmpl $__KERNEL_CS, $pa_startup_32 +- /* -> jmp *%eax in trampoline_32.S */ ++ ++ ljmpl *pmode_entry + #else + jmp trampoline_start + #endif +diff --git a/arch/x86/tools/Makefile b/arch/x86/tools/Makefile +index 604a37e..e49702a 100644 +--- a/arch/x86/tools/Makefile ++++ b/arch/x86/tools/Makefile +@@ -37,7 +37,7 @@ $(obj)/test_get_len.o: $(srctree)/arch/x86/lib/insn.c $(srctree)/arch/x86/lib/in + + $(obj)/insn_sanity.o: $(srctree)/arch/x86/lib/insn.c $(srctree)/arch/x86/lib/inat.c $(srctree)/arch/x86/include/asm/inat_types.h $(srctree)/arch/x86/include/asm/inat.h $(srctree)/arch/x86/include/asm/insn.h $(objtree)/arch/x86/lib/inat-tables.c + +-HOST_EXTRACFLAGS += -I$(srctree)/tools/include ++HOST_EXTRACFLAGS += -I$(srctree)/tools/include -ggdb + hostprogs-y += relocs + relocs-objs := relocs_32.o relocs_64.o relocs_common.o + PHONY += relocs +diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c +index a5efb21..97490e9 100644 +--- a/arch/x86/tools/relocs.c ++++ b/arch/x86/tools/relocs.c +@@ -1,5 +1,7 @@ + /* This is included from relocs_32/64.c */ + ++#include "../../../include/generated/autoconf.h" ++ + #define ElfW(type) _ElfW(ELF_BITS, type) + #define _ElfW(bits, type) __ElfW(bits, type) + #define __ElfW(bits, type) Elf##bits##_##type +@@ -11,6 +13,7 @@ + #define Elf_Sym ElfW(Sym) + + static Elf_Ehdr ehdr; ++static Elf_Phdr *phdr; + + struct relocs { + uint32_t *offset; +@@ -383,9 +386,39 @@ static void read_ehdr(FILE *fp) + } + } + ++static void read_phdrs(FILE *fp) ++{ ++ unsigned int i; ++ ++ phdr = calloc(ehdr.e_phnum, sizeof(Elf_Phdr)); ++ if (!phdr) { ++ die("Unable to allocate %d program headers\n", ++ ehdr.e_phnum); ++ } ++ if (fseek(fp, ehdr.e_phoff, SEEK_SET) < 0) { ++ die("Seek to %d failed: %s\n", ++ ehdr.e_phoff, strerror(errno)); ++ } ++ if (fread(phdr, sizeof(*phdr), ehdr.e_phnum, fp) != ehdr.e_phnum) { ++ die("Cannot read ELF program headers: %s\n", ++ strerror(errno)); ++ } ++ for(i = 0; i < ehdr.e_phnum; i++) { ++ phdr[i].p_type = elf_word_to_cpu(phdr[i].p_type); ++ phdr[i].p_offset = elf_off_to_cpu(phdr[i].p_offset); ++ phdr[i].p_vaddr = elf_addr_to_cpu(phdr[i].p_vaddr); ++ phdr[i].p_paddr = elf_addr_to_cpu(phdr[i].p_paddr); ++ phdr[i].p_filesz = elf_word_to_cpu(phdr[i].p_filesz); ++ phdr[i].p_memsz = elf_word_to_cpu(phdr[i].p_memsz); ++ phdr[i].p_flags = elf_word_to_cpu(phdr[i].p_flags); ++ phdr[i].p_align = elf_word_to_cpu(phdr[i].p_align); ++ } ++ ++} ++ + static void read_shdrs(FILE *fp) + { +- int i; ++ unsigned int i; + Elf_Shdr shdr; + + secs = calloc(ehdr.e_shnum, sizeof(struct section)); +@@ -420,7 +453,7 @@ static void read_shdrs(FILE *fp) + + static void read_strtabs(FILE *fp) + { +- int i; ++ unsigned int i; + for (i = 0; i < ehdr.e_shnum; i++) { + struct section *sec = &secs[i]; + if (sec->shdr.sh_type != SHT_STRTAB) { +@@ -445,7 +478,7 @@ static void read_strtabs(FILE *fp) + + static void read_symtabs(FILE *fp) + { +- int i,j; ++ unsigned int i,j; + for (i = 0; i < ehdr.e_shnum; i++) { + struct section *sec = &secs[i]; + if (sec->shdr.sh_type != SHT_SYMTAB) { +@@ -476,9 +509,11 @@ static void read_symtabs(FILE *fp) + } + + +-static void read_relocs(FILE *fp) ++static void read_relocs(FILE *fp, int use_real_mode) + { +- int i,j; ++ unsigned int i,j; ++ uint32_t base; ++ + for (i = 0; i < ehdr.e_shnum; i++) { + struct section *sec = &secs[i]; + if (sec->shdr.sh_type != SHT_REL_TYPE) { +@@ -498,9 +533,22 @@ static void read_relocs(FILE *fp) + die("Cannot read symbol table: %s\n", + strerror(errno)); + } ++ base = 0; ++ ++#ifdef CONFIG_X86_32 ++ for (j = 0; !use_real_mode && j < ehdr.e_phnum; j++) { ++ if (phdr[j].p_type != PT_LOAD ) ++ continue; ++ if (secs[sec->shdr.sh_info].shdr.sh_offset < phdr[j].p_offset || secs[sec->shdr.sh_info].shdr.sh_offset >= phdr[j].p_offset + phdr[j].p_filesz) ++ continue; ++ base = CONFIG_PAGE_OFFSET + phdr[j].p_paddr - phdr[j].p_vaddr; ++ break; ++ } ++#endif ++ + for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) { + Elf_Rel *rel = &sec->reltab[j]; +- rel->r_offset = elf_addr_to_cpu(rel->r_offset); ++ rel->r_offset = elf_addr_to_cpu(rel->r_offset) + base; + rel->r_info = elf_xword_to_cpu(rel->r_info); + #if (SHT_REL_TYPE == SHT_RELA) + rel->r_addend = elf_xword_to_cpu(rel->r_addend); +@@ -512,7 +560,7 @@ static void read_relocs(FILE *fp) + + static void print_absolute_symbols(void) + { +- int i; ++ unsigned int i; + const char *format; + + if (ELF_BITS == 64) +@@ -525,7 +573,7 @@ static void print_absolute_symbols(void) + for (i = 0; i < ehdr.e_shnum; i++) { + struct section *sec = &secs[i]; + char *sym_strtab; +- int j; ++ unsigned int j; + + if (sec->shdr.sh_type != SHT_SYMTAB) { + continue; +@@ -552,7 +600,7 @@ static void print_absolute_symbols(void) + + static void print_absolute_relocs(void) + { +- int i, printed = 0; ++ unsigned int i, printed = 0; + const char *format; + + if (ELF_BITS == 64) +@@ -565,7 +613,7 @@ static void print_absolute_relocs(void) + struct section *sec_applies, *sec_symtab; + char *sym_strtab; + Elf_Sym *sh_symtab; +- int j; ++ unsigned int j; + if (sec->shdr.sh_type != SHT_REL_TYPE) { + continue; + } +@@ -642,13 +690,13 @@ static void add_reloc(struct relocs *r, uint32_t offset) + static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel, + Elf_Sym *sym, const char *symname)) + { +- int i; ++ unsigned int i; + /* Walk through the relocations */ + for (i = 0; i < ehdr.e_shnum; i++) { + char *sym_strtab; + Elf_Sym *sh_symtab; + struct section *sec_applies, *sec_symtab; +- int j; ++ unsigned int j; + struct section *sec = &secs[i]; + + if (sec->shdr.sh_type != SHT_REL_TYPE) { +@@ -822,6 +870,23 @@ static int do_reloc32(struct section *sec, Elf_Rel *rel, Elf_Sym *sym, + { + unsigned r_type = ELF32_R_TYPE(rel->r_info); + int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname); ++ char *sym_strtab = sec->link->link->strtab; ++ ++ /* Don't relocate actual per-cpu variables, they are absolute indices, not addresses */ ++ if (!strcmp(sec_name(sym->st_shndx), ".data..percpu") && strcmp(sym_name(sym_strtab, sym), "__per_cpu_load")) ++ return 0; ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ /* Don't relocate actual code, they are relocated implicitly by the base address of KERNEL_CS */ ++ if (!strcmp(sec_name(sym->st_shndx), ".text.end") && !strcmp(sym_name(sym_strtab, sym), "_etext")) ++ return 0; ++ if (!strcmp(sec_name(sym->st_shndx), ".init.text")) ++ return 0; ++ if (!strcmp(sec_name(sym->st_shndx), ".exit.text")) ++ return 0; ++ if (!strcmp(sec_name(sym->st_shndx), ".text") && strcmp(sym_name(sym_strtab, sym), "__LOAD_PHYSICAL_ADDR")) ++ return 0; ++#endif + + switch (r_type) { + case R_386_NONE: +@@ -960,7 +1025,7 @@ static int write32_as_text(uint32_t v, FILE *f) + + static void emit_relocs(int as_text, int use_real_mode) + { +- int i; ++ unsigned int i; + int (*write_reloc)(uint32_t, FILE *) = write32; + int (*do_reloc)(struct section *sec, Elf_Rel *rel, Elf_Sym *sym, + const char *symname); +@@ -1060,10 +1125,11 @@ void process(FILE *fp, int use_real_mode, int as_text, + { + regex_init(use_real_mode); + read_ehdr(fp); ++ read_phdrs(fp); + read_shdrs(fp); + read_strtabs(fp); + read_symtabs(fp); +- read_relocs(fp); ++ read_relocs(fp, use_real_mode); + if (ELF_BITS == 64) + percpu_init(); + if (show_absolute_syms) { +diff --git a/arch/x86/um/mem_32.c b/arch/x86/um/mem_32.c +index f40281e..92728c9 100644 +--- a/arch/x86/um/mem_32.c ++++ b/arch/x86/um/mem_32.c +@@ -21,7 +21,7 @@ static int __init gate_vma_init(void) + gate_vma.vm_start = FIXADDR_USER_START; + gate_vma.vm_end = FIXADDR_USER_END; + gate_vma.vm_flags = VM_READ | VM_MAYREAD | VM_EXEC | VM_MAYEXEC; +- gate_vma.vm_page_prot = __P101; ++ gate_vma.vm_page_prot = vm_get_page_prot(gate_vma.vm_flags); + + return 0; + } +diff --git a/arch/x86/um/tls_32.c b/arch/x86/um/tls_32.c +index 80ffa5b..a33bd15 100644 +--- a/arch/x86/um/tls_32.c ++++ b/arch/x86/um/tls_32.c +@@ -260,7 +260,7 @@ out: + if (unlikely(task == current && + !t->arch.tls_array[idx - GDT_ENTRY_TLS_MIN].flushed)) { + printk(KERN_ERR "get_tls_entry: task with pid %d got here " +- "without flushed TLS.", current->pid); ++ "without flushed TLS.", task_pid_nr(current)); + } + + return 0; +diff --git a/arch/x86/vdso/Makefile b/arch/x86/vdso/Makefile +index 5a4affe..9e2d522 100644 +--- a/arch/x86/vdso/Makefile ++++ b/arch/x86/vdso/Makefile +@@ -174,7 +174,7 @@ quiet_cmd_vdso = VDSO $@ + -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) && \ + sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@' + +-VDSO_LDFLAGS = -fPIC -shared $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) \ ++VDSO_LDFLAGS = -fPIC -shared -Wl,--no-undefined $(call cc-ldoption, -Wl$(comma)--hash-style=sysv) \ + $(call cc-ldoption, -Wl$(comma)--build-id) -Wl,-Bsymbolic $(LTO_CFLAGS) + GCOV_PROFILE := n + +diff --git a/arch/x86/vdso/vdso2c.h b/arch/x86/vdso/vdso2c.h +index 0224987..c7d65a5 100644 +--- a/arch/x86/vdso/vdso2c.h ++++ b/arch/x86/vdso/vdso2c.h +@@ -12,7 +12,7 @@ static void BITSFUNC(go)(void *raw_addr, size_t raw_len, + unsigned long load_size = -1; /* Work around bogus warning */ + unsigned long mapping_size; + ELF(Ehdr) *hdr = (ELF(Ehdr) *)raw_addr; +- int i; ++ unsigned int i; + unsigned long j; + ELF(Shdr) *symtab_hdr = NULL, *strtab_hdr, *secstrings_hdr, + *alt_sec = NULL; +diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c +index e904c27..b9eaa03 100644 +--- a/arch/x86/vdso/vdso32-setup.c ++++ b/arch/x86/vdso/vdso32-setup.c +@@ -14,6 +14,7 @@ + #include <asm/cpufeature.h> + #include <asm/processor.h> + #include <asm/vdso.h> ++#include <asm/mman.h> + + #ifdef CONFIG_COMPAT_VDSO + #define VDSO_DEFAULT 0 +diff --git a/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c +index 208c220..5b89fd3f 100644 +--- a/arch/x86/vdso/vma.c ++++ b/arch/x86/vdso/vma.c +@@ -16,10 +16,9 @@ + #include <asm/vdso.h> + #include <asm/page.h> + #include <asm/hpet.h> ++#include <asm/mman.h> + + #if defined(CONFIG_X86_64) +-unsigned int __read_mostly vdso64_enabled = 1; +- + extern unsigned short vdso_sync_cpuid; + #endif + +@@ -98,6 +97,12 @@ static unsigned long vdso_addr(unsigned long start, unsigned len) + */ + addr = align_vdso_addr(addr); + ++ /* ++ * Forcibly align the final address in case we have a hardware ++ * issue that requires alignment for performance reasons. ++ */ ++ addr = align_vdso_addr(addr); ++ + return addr; + #endif + } +@@ -114,6 +119,11 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr) + .pages = no_pages, + }; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ calculate_addr = false; ++#endif ++ + if (calculate_addr) { + addr = vdso_addr(current->mm->start_stack, + image->size - image->sym_vvar_start); +@@ -124,14 +134,14 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr) + down_write(&mm->mmap_sem); + + addr = get_unmapped_area(NULL, addr, +- image->size - image->sym_vvar_start, 0, 0); ++ image->size - image->sym_vvar_start, 0, MAP_EXECUTABLE); + if (IS_ERR_VALUE(addr)) { + ret = addr; + goto up_fail; + } + + text_start = addr - image->sym_vvar_start; +- current->mm->context.vdso = (void __user *)text_start; ++ mm->context.vdso = text_start; + + /* + * MAYWRITE to allow gdb to COW and set breakpoints +@@ -176,15 +186,12 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr) + hpet_address >> PAGE_SHIFT, + PAGE_SIZE, + pgprot_noncached(PAGE_READONLY)); +- +- if (ret) +- goto up_fail; + } + #endif + + up_fail: + if (ret) +- current->mm->context.vdso = NULL; ++ current->mm->context.vdso = 0; + + up_write(&mm->mmap_sem); + return ret; +@@ -204,8 +211,8 @@ static int load_vdso32(void) + + if (selected_vdso32->sym_VDSO32_SYSENTER_RETURN) + current_thread_info()->sysenter_return = +- current->mm->context.vdso + +- selected_vdso32->sym_VDSO32_SYSENTER_RETURN; ++ (void __force_user *)(current->mm->context.vdso + ++ selected_vdso32->sym_VDSO32_SYSENTER_RETURN); + + return 0; + } +@@ -214,9 +221,6 @@ static int load_vdso32(void) + #ifdef CONFIG_X86_64 + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) + { +- if (!vdso64_enabled) +- return 0; +- + return map_vdso(&vdso_image_64, true); + } + +@@ -225,12 +229,8 @@ int compat_arch_setup_additional_pages(struct linux_binprm *bprm, + int uses_interp) + { + #ifdef CONFIG_X86_X32_ABI +- if (test_thread_flag(TIF_X32)) { +- if (!vdso64_enabled) +- return 0; +- ++ if (test_thread_flag(TIF_X32)) + return map_vdso(&vdso_image_x32, true); +- } + #endif + + return load_vdso32(); +@@ -242,12 +242,3 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) + return load_vdso32(); + } + #endif +- +-#ifdef CONFIG_X86_64 +-static __init int vdso_setup(char *s) +-{ +- vdso64_enabled = simple_strtoul(s, NULL, 0); +- return 0; +-} +-__setup("vdso=", vdso_setup); +-#endif +diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig +index e88fda8..76ce7ce 100644 +--- a/arch/x86/xen/Kconfig ++++ b/arch/x86/xen/Kconfig +@@ -9,6 +9,7 @@ config XEN + select XEN_HAVE_PVMMU + depends on X86_64 || (X86_32 && X86_PAE) + depends on X86_TSC ++ depends on !GRKERNSEC_CONFIG_AUTO || GRKERNSEC_CONFIG_VIRT_XEN + help + This is the Linux Xen port. Enabling this will allow the + kernel to boot in a paravirtualized environment under the +diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c +index fac5e4f..89c3525 100644 +--- a/arch/x86/xen/enlighten.c ++++ b/arch/x86/xen/enlighten.c +@@ -123,8 +123,6 @@ EXPORT_SYMBOL_GPL(xen_start_info); + + struct shared_info xen_dummy_shared_info; + +-void *xen_initial_gdt; +- + RESERVE_BRK(shared_info_page_brk, PAGE_SIZE); + __read_mostly int xen_have_vector_callback; + EXPORT_SYMBOL_GPL(xen_have_vector_callback); +@@ -542,8 +540,7 @@ static void xen_load_gdt(const struct desc_ptr *dtr) + { + unsigned long va = dtr->address; + unsigned int size = dtr->size + 1; +- unsigned pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; +- unsigned long frames[pages]; ++ unsigned long frames[65536 / PAGE_SIZE]; + int f; + + /* +@@ -591,8 +588,7 @@ static void __init xen_load_gdt_boot(const struct desc_ptr *dtr) + { + unsigned long va = dtr->address; + unsigned int size = dtr->size + 1; +- unsigned pages = (size + PAGE_SIZE - 1) / PAGE_SIZE; +- unsigned long frames[pages]; ++ unsigned long frames[(GDT_SIZE + PAGE_SIZE - 1) / PAGE_SIZE]; + int f; + + /* +@@ -600,7 +596,7 @@ static void __init xen_load_gdt_boot(const struct desc_ptr *dtr) + * 8-byte entries, or 16 4k pages.. + */ + +- BUG_ON(size > 65536); ++ BUG_ON(size > GDT_SIZE); + BUG_ON(va & ~PAGE_MASK); + + for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) { +@@ -989,7 +985,7 @@ static u32 xen_safe_apic_wait_icr_idle(void) + return 0; + } + +-static void set_xen_basic_apic_ops(void) ++static void __init set_xen_basic_apic_ops(void) + { + apic->read = xen_apic_read; + apic->write = xen_apic_write; +@@ -1295,30 +1291,30 @@ static const struct pv_apic_ops xen_apic_ops __initconst = { + #endif + }; + +-static void xen_reboot(int reason) ++static __noreturn void xen_reboot(int reason) + { + struct sched_shutdown r = { .reason = reason }; + +- if (HYPERVISOR_sched_op(SCHEDOP_shutdown, &r)) +- BUG(); ++ HYPERVISOR_sched_op(SCHEDOP_shutdown, &r); ++ BUG(); + } + +-static void xen_restart(char *msg) ++static __noreturn void xen_restart(char *msg) + { + xen_reboot(SHUTDOWN_reboot); + } + +-static void xen_emergency_restart(void) ++static __noreturn void xen_emergency_restart(void) + { + xen_reboot(SHUTDOWN_reboot); + } + +-static void xen_machine_halt(void) ++static __noreturn void xen_machine_halt(void) + { + xen_reboot(SHUTDOWN_poweroff); + } + +-static void xen_machine_power_off(void) ++static __noreturn void xen_machine_power_off(void) + { + if (pm_power_off) + pm_power_off(); +@@ -1456,8 +1452,11 @@ static void __ref xen_setup_gdt(int cpu) + pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot; + pv_cpu_ops.load_gdt = xen_load_gdt_boot; + +- setup_stack_canary_segment(0); +- switch_to_new_gdt(0); ++ setup_stack_canary_segment(cpu); ++#ifdef CONFIG_X86_64 ++ load_percpu_segment(cpu); ++#endif ++ switch_to_new_gdt(cpu); + + pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry; + pv_cpu_ops.load_gdt = xen_load_gdt; +@@ -1573,7 +1572,17 @@ asmlinkage __visible void __init xen_start_kernel(void) + __userpte_alloc_gfp &= ~__GFP_HIGHMEM; + + /* Work out if we support NX */ +- x86_configure_nx(); ++#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) ++ if ((cpuid_eax(0x80000000) & 0xffff0000) == 0x80000000 && ++ (cpuid_edx(0x80000001) & (1U << (X86_FEATURE_NX & 31)))) { ++ unsigned l, h; ++ ++ __supported_pte_mask |= _PAGE_NX; ++ rdmsr(MSR_EFER, l, h); ++ l |= EFER_NX; ++ wrmsr(MSR_EFER, l, h); ++ } ++#endif + + /* Get mfn list */ + xen_build_dynamic_phys_to_machine(); +@@ -1601,13 +1610,6 @@ asmlinkage __visible void __init xen_start_kernel(void) + + machine_ops = xen_machine_ops; + +- /* +- * The only reliable way to retain the initial address of the +- * percpu gdt_page is to remember it here, so we can go and +- * mark it RW later, when the initial percpu area is freed. +- */ +- xen_initial_gdt = &per_cpu(gdt_page, 0); +- + xen_smp_init(); + + #ifdef CONFIG_ACPI_NUMA +diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c +index a8a1a3d..8216142 100644 +--- a/arch/x86/xen/mmu.c ++++ b/arch/x86/xen/mmu.c +@@ -379,7 +379,7 @@ static pteval_t pte_mfn_to_pfn(pteval_t val) + return val; + } + +-static pteval_t pte_pfn_to_mfn(pteval_t val) ++static pteval_t __intentional_overflow(-1) pte_pfn_to_mfn(pteval_t val) + { + if (val & _PAGE_PRESENT) { + unsigned long pfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; +@@ -1867,7 +1867,11 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn) + * L3_k[511] -> level2_fixmap_pgt */ + convert_pfn_mfn(level3_kernel_pgt); + ++ convert_pfn_mfn(level3_vmalloc_start_pgt); ++ convert_pfn_mfn(level3_vmalloc_end_pgt); ++ convert_pfn_mfn(level3_vmemmap_pgt); + /* L3_k[511][506] -> level1_fixmap_pgt */ ++ /* L3_k[511][507] -> level1_vsyscall_pgt */ + convert_pfn_mfn(level2_fixmap_pgt); + } + /* We get [511][511] and have Xen's version of level2_kernel_pgt */ +@@ -1892,11 +1896,16 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn) + set_page_prot(init_level4_pgt, PAGE_KERNEL_RO); + set_page_prot(level3_ident_pgt, PAGE_KERNEL_RO); + set_page_prot(level3_kernel_pgt, PAGE_KERNEL_RO); ++ set_page_prot(level3_vmalloc_start_pgt, PAGE_KERNEL_RO); ++ set_page_prot(level3_vmalloc_end_pgt, PAGE_KERNEL_RO); ++ set_page_prot(level3_vmemmap_pgt, PAGE_KERNEL_RO); + set_page_prot(level3_user_vsyscall, PAGE_KERNEL_RO); + set_page_prot(level2_ident_pgt, PAGE_KERNEL_RO); ++ set_page_prot(level2_vmemmap_pgt, PAGE_KERNEL_RO); + set_page_prot(level2_kernel_pgt, PAGE_KERNEL_RO); + set_page_prot(level2_fixmap_pgt, PAGE_KERNEL_RO); + set_page_prot(level1_fixmap_pgt, PAGE_KERNEL_RO); ++ set_page_prot(level1_vsyscall_pgt, PAGE_KERNEL_RO); + + /* Pin down new L4 */ + pin_pagetable_pfn(MMUEXT_PIN_L4_TABLE, +@@ -2080,6 +2089,7 @@ static void __init xen_post_allocator_init(void) + pv_mmu_ops.set_pud = xen_set_pud; + #if PAGETABLE_LEVELS == 4 + pv_mmu_ops.set_pgd = xen_set_pgd; ++ pv_mmu_ops.set_pgd_batched = xen_set_pgd; + #endif + + /* This will work as long as patching hasn't happened yet +@@ -2158,6 +2168,7 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = { + .pud_val = PV_CALLEE_SAVE(xen_pud_val), + .make_pud = PV_CALLEE_SAVE(xen_make_pud), + .set_pgd = xen_set_pgd_hyper, ++ .set_pgd_batched = xen_set_pgd_hyper, + + .alloc_pud = xen_alloc_pmd_init, + .release_pud = xen_release_pmd_init, +diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c +index 4c071ae..00e7049 100644 +--- a/arch/x86/xen/smp.c ++++ b/arch/x86/xen/smp.c +@@ -288,17 +288,13 @@ static void __init xen_smp_prepare_boot_cpu(void) + + if (xen_pv_domain()) { + if (!xen_feature(XENFEAT_writable_page_tables)) +- /* We've switched to the "real" per-cpu gdt, so make +- * sure the old memory can be recycled. */ +- make_lowmem_page_readwrite(xen_initial_gdt); +- + #ifdef CONFIG_X86_32 + /* + * Xen starts us with XEN_FLAT_RING1_DS, but linux code + * expects __USER_DS + */ +- loadsegment(ds, __USER_DS); +- loadsegment(es, __USER_DS); ++ loadsegment(ds, __KERNEL_DS); ++ loadsegment(es, __KERNEL_DS); + #endif + + xen_filter_cpu_maps(); +@@ -379,7 +375,7 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle) + #ifdef CONFIG_X86_32 + /* Note: PVH is not yet supported on x86_32. */ + ctxt->user_regs.fs = __KERNEL_PERCPU; +- ctxt->user_regs.gs = __KERNEL_STACK_CANARY; ++ savesegment(gs, ctxt->user_regs.gs); + #endif + memset(&ctxt->fpu_ctxt, 0, sizeof(ctxt->fpu_ctxt)); + +@@ -387,8 +383,8 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle) + ctxt->user_regs.eip = (unsigned long)cpu_bringup_and_idle; + ctxt->flags = VGCF_IN_KERNEL; + ctxt->user_regs.eflags = 0x1000; /* IOPL_RING1 */ +- ctxt->user_regs.ds = __USER_DS; +- ctxt->user_regs.es = __USER_DS; ++ ctxt->user_regs.ds = __KERNEL_DS; ++ ctxt->user_regs.es = __KERNEL_DS; + ctxt->user_regs.ss = __KERNEL_DS; + + xen_copy_trap_info(ctxt->trap_ctxt); +@@ -446,14 +442,13 @@ static int xen_cpu_up(unsigned int cpu, struct task_struct *idle) + int rc; + + per_cpu(current_task, cpu) = idle; ++ per_cpu(current_tinfo, cpu) = &idle->tinfo; + #ifdef CONFIG_X86_32 + irq_ctx_init(cpu); + #else + clear_tsk_thread_flag(idle, TIF_FORK); + #endif +- per_cpu(kernel_stack, cpu) = +- (unsigned long)task_stack_page(idle) - +- KERNEL_STACK_OFFSET + THREAD_SIZE; ++ per_cpu(kernel_stack, cpu) = (unsigned long)task_stack_page(idle) - 16 + THREAD_SIZE; + + xen_setup_runstate_info(cpu); + xen_setup_timer(cpu); +@@ -732,7 +727,7 @@ static const struct smp_ops xen_smp_ops __initconst = { + + void __init xen_smp_init(void) + { +- smp_ops = xen_smp_ops; ++ memcpy((void *)&smp_ops, &xen_smp_ops, sizeof smp_ops); + xen_fill_possible_map(); + } + +diff --git a/arch/x86/xen/xen-asm_32.S b/arch/x86/xen/xen-asm_32.S +index fd92a64..1f72641 100644 +--- a/arch/x86/xen/xen-asm_32.S ++++ b/arch/x86/xen/xen-asm_32.S +@@ -99,7 +99,7 @@ ENTRY(xen_iret) + pushw %fs + movl $(__KERNEL_PERCPU), %eax + movl %eax, %fs +- movl %fs:xen_vcpu, %eax ++ mov PER_CPU_VAR(xen_vcpu), %eax + POP_FS + #else + movl %ss:xen_vcpu, %eax +diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S +index 674b2225..f1f5dc1 100644 +--- a/arch/x86/xen/xen-head.S ++++ b/arch/x86/xen/xen-head.S +@@ -39,6 +39,17 @@ ENTRY(startup_xen) + #ifdef CONFIG_X86_32 + mov %esi,xen_start_info + mov $init_thread_union+THREAD_SIZE,%esp ++#ifdef CONFIG_SMP ++ movl $cpu_gdt_table,%edi ++ movl $__per_cpu_load,%eax ++ movw %ax,__KERNEL_PERCPU + 2(%edi) ++ rorl $16,%eax ++ movb %al,__KERNEL_PERCPU + 4(%edi) ++ movb %ah,__KERNEL_PERCPU + 7(%edi) ++ movl $__per_cpu_end - 1,%eax ++ subl $__per_cpu_start,%eax ++ movw %ax,__KERNEL_PERCPU + 0(%edi) ++#endif + #else + mov %rsi,xen_start_info + mov $init_thread_union+THREAD_SIZE,%rsp +diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h +index 28c7e0b..2acfec7 100644 +--- a/arch/x86/xen/xen-ops.h ++++ b/arch/x86/xen/xen-ops.h +@@ -10,8 +10,6 @@ + extern const char xen_hypervisor_callback[]; + extern const char xen_failsafe_callback[]; + +-extern void *xen_initial_gdt; +- + struct trap_info; + void xen_copy_trap_info(struct trap_info *traps); + +diff --git a/arch/xtensa/variants/dc232b/include/variant/core.h b/arch/xtensa/variants/dc232b/include/variant/core.h +index 525bd3d..ef888b1 100644 +--- a/arch/xtensa/variants/dc232b/include/variant/core.h ++++ b/arch/xtensa/variants/dc232b/include/variant/core.h +@@ -119,9 +119,9 @@ + ----------------------------------------------------------------------*/ + + #define XCHAL_ICACHE_LINESIZE 32 /* I-cache line size in bytes */ +-#define XCHAL_DCACHE_LINESIZE 32 /* D-cache line size in bytes */ + #define XCHAL_ICACHE_LINEWIDTH 5 /* log2(I line size in bytes) */ + #define XCHAL_DCACHE_LINEWIDTH 5 /* log2(D line size in bytes) */ ++#define XCHAL_DCACHE_LINESIZE (_AC(1,UL) << XCHAL_DCACHE_LINEWIDTH) /* D-cache line size in bytes */ + + #define XCHAL_ICACHE_SIZE 16384 /* I-cache size in bytes or 0 */ + #define XCHAL_DCACHE_SIZE 16384 /* D-cache size in bytes or 0 */ +diff --git a/arch/xtensa/variants/fsf/include/variant/core.h b/arch/xtensa/variants/fsf/include/variant/core.h +index 2f33760..835e50a 100644 +--- a/arch/xtensa/variants/fsf/include/variant/core.h ++++ b/arch/xtensa/variants/fsf/include/variant/core.h +@@ -11,6 +11,7 @@ + #ifndef _XTENSA_CORE_H + #define _XTENSA_CORE_H + ++#include <linux/const.h> + + /**************************************************************************** + Parameters Useful for Any Code, USER or PRIVILEGED +@@ -112,9 +113,9 @@ + ----------------------------------------------------------------------*/ + + #define XCHAL_ICACHE_LINESIZE 16 /* I-cache line size in bytes */ +-#define XCHAL_DCACHE_LINESIZE 16 /* D-cache line size in bytes */ + #define XCHAL_ICACHE_LINEWIDTH 4 /* log2(I line size in bytes) */ + #define XCHAL_DCACHE_LINEWIDTH 4 /* log2(D line size in bytes) */ ++#define XCHAL_DCACHE_LINESIZE (_AC(1,UL) << XCHAL_DCACHE_LINEWIDTH) /* D-cache line size in bytes */ + + #define XCHAL_ICACHE_SIZE 8192 /* I-cache size in bytes or 0 */ + #define XCHAL_DCACHE_SIZE 8192 /* D-cache size in bytes or 0 */ +diff --git a/arch/xtensa/variants/s6000/include/variant/core.h b/arch/xtensa/variants/s6000/include/variant/core.h +index af00795..2bb8105 100644 +--- a/arch/xtensa/variants/s6000/include/variant/core.h ++++ b/arch/xtensa/variants/s6000/include/variant/core.h +@@ -11,6 +11,7 @@ + #ifndef _XTENSA_CORE_CONFIGURATION_H + #define _XTENSA_CORE_CONFIGURATION_H + ++#include <linux/const.h> + + /**************************************************************************** + Parameters Useful for Any Code, USER or PRIVILEGED +@@ -118,9 +119,9 @@ + ----------------------------------------------------------------------*/ + + #define XCHAL_ICACHE_LINESIZE 16 /* I-cache line size in bytes */ +-#define XCHAL_DCACHE_LINESIZE 16 /* D-cache line size in bytes */ + #define XCHAL_ICACHE_LINEWIDTH 4 /* log2(I line size in bytes) */ + #define XCHAL_DCACHE_LINEWIDTH 4 /* log2(D line size in bytes) */ ++#define XCHAL_DCACHE_LINESIZE (_AC(1,UL) << XCHAL_DCACHE_LINEWIDTH) /* D-cache line size in bytes */ + + #define XCHAL_ICACHE_SIZE 32768 /* I-cache size in bytes or 0 */ + #define XCHAL_DCACHE_SIZE 32768 /* D-cache size in bytes or 0 */ +diff --git a/block/bio.c b/block/bio.c +index 3e6e198..5c65199 100644 +--- a/block/bio.c ++++ b/block/bio.c +@@ -1163,7 +1163,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q, + /* + * Overflow, abort + */ +- if (end < start) ++ if (end < start || end - start > INT_MAX - nr_pages) + return ERR_PTR(-EINVAL); + + nr_pages += end - start; +@@ -1297,7 +1297,7 @@ static struct bio *__bio_map_user_iov(struct request_queue *q, + /* + * Overflow, abort + */ +- if (end < start) ++ if (end < start || end - start > INT_MAX - nr_pages) + return ERR_PTR(-EINVAL); + + nr_pages += end - start; +@@ -1559,7 +1559,7 @@ static void bio_copy_kern_endio(struct bio *bio, int err) + const int read = bio_data_dir(bio) == READ; + struct bio_map_data *bmd = bio->bi_private; + int i; +- char *p = bmd->sgvecs[0].iov_base; ++ char *p = (char __force_kernel *)bmd->sgvecs[0].iov_base; + + bio_for_each_segment_all(bvec, bio, i) { + char *addr = page_address(bvec->bv_page); +diff --git a/block/blk-iopoll.c b/block/blk-iopoll.c +index 0736729..2ec3b48 100644 +--- a/block/blk-iopoll.c ++++ b/block/blk-iopoll.c +@@ -74,7 +74,7 @@ void blk_iopoll_complete(struct blk_iopoll *iop) + } + EXPORT_SYMBOL(blk_iopoll_complete); + +-static void blk_iopoll_softirq(struct softirq_action *h) ++static __latent_entropy void blk_iopoll_softirq(void) + { + struct list_head *list = this_cpu_ptr(&blk_cpu_iopoll); + int rearm = 0, budget = blk_iopoll_budget; +diff --git a/block/blk-map.c b/block/blk-map.c +index f890d43..97b0482 100644 +--- a/block/blk-map.c ++++ b/block/blk-map.c +@@ -300,7 +300,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, + if (!len || !kbuf) + return -EINVAL; + +- do_copy = !blk_rq_aligned(q, addr, len) || object_is_on_stack(kbuf); ++ do_copy = !blk_rq_aligned(q, addr, len) || object_starts_on_stack(kbuf); + if (do_copy) + bio = bio_copy_kern(q, kbuf, len, gfp_mask, reading); + else +diff --git a/block/blk-mq.c b/block/blk-mq.c +index 849479d..48750dd 100644 +--- a/block/blk-mq.c ++++ b/block/blk-mq.c +@@ -1358,7 +1358,7 @@ static struct blk_mq_tags *blk_mq_init_rq_map(struct blk_mq_tag_set *set, + + do { + page = alloc_pages_node(set->numa_node, +- GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY, ++ GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY | __GFP_ZERO, + this_order); + if (page) + break; +@@ -1380,8 +1380,6 @@ static struct blk_mq_tags *blk_mq_init_rq_map(struct blk_mq_tag_set *set, + left -= to_do * rq_size; + for (j = 0; j < to_do; j++) { + tags->rqs[i] = p; +- tags->rqs[i]->atomic_flags = 0; +- tags->rqs[i]->cmd_flags = 0; + if (set->ops->init_request) { + if (set->ops->init_request(set->driver_data, + tags->rqs[i], hctx_idx, i, +diff --git a/block/blk-softirq.c b/block/blk-softirq.c +index 53b1737..08177d2 100644 +--- a/block/blk-softirq.c ++++ b/block/blk-softirq.c +@@ -18,7 +18,7 @@ static DEFINE_PER_CPU(struct list_head, blk_cpu_done); + * Softirq action handler - move entries to local list and loop over them + * while passing them to the queue registered handler. + */ +-static void blk_done_softirq(struct softirq_action *h) ++static __latent_entropy void blk_done_softirq(void) + { + struct list_head *cpu_list, local_list; + +diff --git a/block/bsg.c b/block/bsg.c +index 276e869..6fe4c61 100644 +--- a/block/bsg.c ++++ b/block/bsg.c +@@ -176,16 +176,24 @@ static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq, + struct sg_io_v4 *hdr, struct bsg_device *bd, + fmode_t has_write_perm) + { ++ unsigned char tmpcmd[sizeof(rq->__cmd)]; ++ unsigned char *cmdptr; ++ + if (hdr->request_len > BLK_MAX_CDB) { + rq->cmd = kzalloc(hdr->request_len, GFP_KERNEL); + if (!rq->cmd) + return -ENOMEM; +- } ++ cmdptr = rq->cmd; ++ } else ++ cmdptr = tmpcmd; + +- if (copy_from_user(rq->cmd, (void __user *)(unsigned long)hdr->request, ++ if (copy_from_user(cmdptr, (void __user *)(unsigned long)hdr->request, + hdr->request_len)) + return -EFAULT; + ++ if (cmdptr != rq->cmd) ++ memcpy(rq->cmd, cmdptr, hdr->request_len); ++ + if (hdr->subprotocol == BSG_SUB_PROTOCOL_SCSI_CMD) { + if (blk_verify_command(rq->cmd, has_write_perm)) + return -EPERM; +diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c +index f678c73..f35aa18 100644 +--- a/block/compat_ioctl.c ++++ b/block/compat_ioctl.c +@@ -156,7 +156,7 @@ static int compat_cdrom_generic_command(struct block_device *bdev, fmode_t mode, + cgc = compat_alloc_user_space(sizeof(*cgc)); + cgc32 = compat_ptr(arg); + +- if (copy_in_user(&cgc->cmd, &cgc32->cmd, sizeof(cgc->cmd)) || ++ if (copy_in_user(cgc->cmd, cgc32->cmd, sizeof(cgc->cmd)) || + get_user(data, &cgc32->buffer) || + put_user(compat_ptr(data), &cgc->buffer) || + copy_in_user(&cgc->buflen, &cgc32->buflen, +@@ -341,7 +341,7 @@ static int compat_fd_ioctl(struct block_device *bdev, fmode_t mode, + err |= __get_user(f->spec1, &uf->spec1); + err |= __get_user(f->fmt_gap, &uf->fmt_gap); + err |= __get_user(name, &uf->name); +- f->name = compat_ptr(name); ++ f->name = (void __force_kernel *)compat_ptr(name); + if (err) { + err = -EFAULT; + goto out; +diff --git a/block/genhd.c b/block/genhd.c +index 0a536dc..b8f7aca 100644 +--- a/block/genhd.c ++++ b/block/genhd.c +@@ -469,21 +469,24 @@ static char *bdevt_str(dev_t devt, char *buf) + + /* + * Register device numbers dev..(dev+range-1) +- * range must be nonzero ++ * Noop if @range is zero. + * The hash chain is sorted on range, so that subranges can override. + */ + void blk_register_region(dev_t devt, unsigned long range, struct module *module, + struct kobject *(*probe)(dev_t, int *, void *), + int (*lock)(dev_t, void *), void *data) + { +- kobj_map(bdev_map, devt, range, module, probe, lock, data); ++ if (range) ++ kobj_map(bdev_map, devt, range, module, probe, lock, data); + } + + EXPORT_SYMBOL(blk_register_region); + ++/* undo blk_register_region(), noop if @range is zero */ + void blk_unregister_region(dev_t devt, unsigned long range) + { +- kobj_unmap(bdev_map, devt, range); ++ if (range) ++ kobj_unmap(bdev_map, devt, range); + } + + EXPORT_SYMBOL(blk_unregister_region); +diff --git a/block/partitions/efi.c b/block/partitions/efi.c +index 56d08fd..2e07090 100644 +--- a/block/partitions/efi.c ++++ b/block/partitions/efi.c +@@ -293,14 +293,14 @@ static gpt_entry *alloc_read_gpt_entries(struct parsed_partitions *state, + if (!gpt) + return NULL; + +- count = le32_to_cpu(gpt->num_partition_entries) * +- le32_to_cpu(gpt->sizeof_partition_entry); +- if (!count) ++ if (!le32_to_cpu(gpt->num_partition_entries)) + return NULL; +- pte = kmalloc(count, GFP_KERNEL); ++ pte = kcalloc(le32_to_cpu(gpt->num_partition_entries), le32_to_cpu(gpt->sizeof_partition_entry), GFP_KERNEL); + if (!pte) + return NULL; + ++ count = le32_to_cpu(gpt->num_partition_entries) * ++ le32_to_cpu(gpt->sizeof_partition_entry); + if (read_lba(state, le64_to_cpu(gpt->partition_entry_lba), + (u8 *) pte, count) < count) { + kfree(pte); +diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c +index b0c2a61..10bb6ec 100644 +--- a/block/scsi_ioctl.c ++++ b/block/scsi_ioctl.c +@@ -67,7 +67,7 @@ static int scsi_get_bus(struct request_queue *q, int __user *p) + return put_user(0, p); + } + +-static int sg_get_timeout(struct request_queue *q) ++static int __intentional_overflow(-1) sg_get_timeout(struct request_queue *q) + { + return jiffies_to_clock_t(q->sg_timeout); + } +@@ -227,8 +227,20 @@ EXPORT_SYMBOL(blk_verify_command); + static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, + struct sg_io_hdr *hdr, fmode_t mode) + { +- if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len)) ++ unsigned char tmpcmd[sizeof(rq->__cmd)]; ++ unsigned char *cmdptr; ++ ++ if (rq->cmd != rq->__cmd) ++ cmdptr = rq->cmd; ++ else ++ cmdptr = tmpcmd; ++ ++ if (copy_from_user(cmdptr, hdr->cmdp, hdr->cmd_len)) + return -EFAULT; ++ ++ if (cmdptr != rq->cmd) ++ memcpy(rq->cmd, cmdptr, hdr->cmd_len); ++ + if (blk_verify_command(rq->cmd, mode & FMODE_WRITE)) + return -EPERM; + +@@ -431,6 +443,8 @@ int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, + int err; + unsigned int in_len, out_len, bytes, opcode, cmdlen; + char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE]; ++ unsigned char tmpcmd[sizeof(rq->__cmd)]; ++ unsigned char *cmdptr; + + if (!sic) + return -EINVAL; +@@ -469,9 +483,18 @@ int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, + */ + err = -EFAULT; + rq->cmd_len = cmdlen; +- if (copy_from_user(rq->cmd, sic->data, cmdlen)) ++ ++ if (rq->cmd != rq->__cmd) ++ cmdptr = rq->cmd; ++ else ++ cmdptr = tmpcmd; ++ ++ if (copy_from_user(cmdptr, sic->data, cmdlen)) + goto error; + ++ if (rq->cmd != cmdptr) ++ memcpy(rq->cmd, cmdptr, cmdlen); ++ + if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) + goto error; + +diff --git a/crypto/cryptd.c b/crypto/cryptd.c +index 650afac1..f3307de 100644 +--- a/crypto/cryptd.c ++++ b/crypto/cryptd.c +@@ -63,7 +63,7 @@ struct cryptd_blkcipher_ctx { + + struct cryptd_blkcipher_request_ctx { + crypto_completion_t complete; +-}; ++} __no_const; + + struct cryptd_hash_ctx { + struct crypto_shash *child; +@@ -80,7 +80,7 @@ struct cryptd_aead_ctx { + + struct cryptd_aead_request_ctx { + crypto_completion_t complete; +-}; ++} __no_const; + + static void cryptd_queue_worker(struct work_struct *work); + +diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c +index c305d41..a96de79 100644 +--- a/crypto/pcrypt.c ++++ b/crypto/pcrypt.c +@@ -440,7 +440,7 @@ static int pcrypt_sysfs_add(struct padata_instance *pinst, const char *name) + int ret; + + pinst->kobj.kset = pcrypt_kset; +- ret = kobject_add(&pinst->kobj, NULL, name); ++ ret = kobject_add(&pinst->kobj, NULL, "%s", name); + if (!ret) + kobject_uevent(&pinst->kobj, KOBJ_ADD); + +diff --git a/crypto/zlib.c b/crypto/zlib.c +index 0eefa9d..0fa3d29 100644 +--- a/crypto/zlib.c ++++ b/crypto/zlib.c +@@ -95,10 +95,10 @@ static int zlib_compress_setup(struct crypto_pcomp *tfm, void *params, + zlib_comp_exit(ctx); + + window_bits = tb[ZLIB_COMP_WINDOWBITS] +- ? nla_get_u32(tb[ZLIB_COMP_WINDOWBITS]) ++ ? nla_get_s32(tb[ZLIB_COMP_WINDOWBITS]) + : MAX_WBITS; + mem_level = tb[ZLIB_COMP_MEMLEVEL] +- ? nla_get_u32(tb[ZLIB_COMP_MEMLEVEL]) ++ ? nla_get_s32(tb[ZLIB_COMP_MEMLEVEL]) + : DEF_MEM_LEVEL; + + workspacesize = zlib_deflate_workspacesize(window_bits, mem_level); +diff --git a/drivers/acpi/acpica/hwxfsleep.c b/drivers/acpi/acpica/hwxfsleep.c +index 6921c7f..78e1af7 100644 +--- a/drivers/acpi/acpica/hwxfsleep.c ++++ b/drivers/acpi/acpica/hwxfsleep.c +@@ -63,11 +63,12 @@ static acpi_status acpi_hw_sleep_dispatch(u8 sleep_state, u32 function_id); + /* Legacy functions are optional, based upon ACPI_REDUCED_HARDWARE */ + + static struct acpi_sleep_functions acpi_sleep_dispatch[] = { +- {ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_sleep), +- acpi_hw_extended_sleep}, +- {ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_wake_prep), +- acpi_hw_extended_wake_prep}, +- {ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_wake), acpi_hw_extended_wake} ++ {.legacy_function = ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_sleep), ++ .extended_function = acpi_hw_extended_sleep}, ++ {.legacy_function = ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_wake_prep), ++ .extended_function = acpi_hw_extended_wake_prep}, ++ {.legacy_function = ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_wake), ++ .extended_function = acpi_hw_extended_wake} + }; + + /* +diff --git a/drivers/acpi/apei/apei-internal.h b/drivers/acpi/apei/apei-internal.h +index 16129c7..8b675cd 100644 +--- a/drivers/acpi/apei/apei-internal.h ++++ b/drivers/acpi/apei/apei-internal.h +@@ -19,7 +19,7 @@ typedef int (*apei_exec_ins_func_t)(struct apei_exec_context *ctx, + struct apei_exec_ins_type { + u32 flags; + apei_exec_ins_func_t run; +-}; ++} __do_const; + + struct apei_exec_context { + u32 ip; +diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c +index fc5f780..e5ac91a 100644 +--- a/drivers/acpi/apei/ghes.c ++++ b/drivers/acpi/apei/ghes.c +@@ -478,7 +478,7 @@ static void __ghes_print_estatus(const char *pfx, + const struct acpi_hest_generic *generic, + const struct acpi_hest_generic_status *estatus) + { +- static atomic_t seqno; ++ static atomic_unchecked_t seqno; + unsigned int curr_seqno; + char pfx_seq[64]; + +@@ -489,7 +489,7 @@ static void __ghes_print_estatus(const char *pfx, + else + pfx = KERN_ERR; + } +- curr_seqno = atomic_inc_return(&seqno); ++ curr_seqno = atomic_inc_return_unchecked(&seqno); + snprintf(pfx_seq, sizeof(pfx_seq), "%s{%u}" HW_ERR, pfx, curr_seqno); + printk("%s""Hardware error from APEI Generic Hardware Error Source: %d\n", + pfx_seq, generic->header.source_id); +diff --git a/drivers/acpi/bgrt.c b/drivers/acpi/bgrt.c +index a83e3c6..c3d617f 100644 +--- a/drivers/acpi/bgrt.c ++++ b/drivers/acpi/bgrt.c +@@ -86,8 +86,10 @@ static int __init bgrt_init(void) + if (!bgrt_image) + return -ENODEV; + +- bin_attr_image.private = bgrt_image; +- bin_attr_image.size = bgrt_image_size; ++ pax_open_kernel(); ++ *(void **)&bin_attr_image.private = bgrt_image; ++ *(size_t *)&bin_attr_image.size = bgrt_image_size; ++ pax_close_kernel(); + + bgrt_kobj = kobject_create_and_add("bgrt", acpi_kobj); + if (!bgrt_kobj) +diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c +index 7556e7c..89a96bd 100644 +--- a/drivers/acpi/blacklist.c ++++ b/drivers/acpi/blacklist.c +@@ -51,7 +51,7 @@ struct acpi_blacklist_item { + u32 is_critical_error; + }; + +-static struct dmi_system_id acpi_osi_dmi_table[] __initdata; ++static const struct dmi_system_id acpi_osi_dmi_table[] __initconst; + + /* + * POLICY: If *anything* doesn't work, put it on the blacklist. +@@ -163,7 +163,7 @@ static int __init dmi_disable_osi_win8(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { ++static const struct dmi_system_id acpi_osi_dmi_table[] __initconst = { + { + .callback = dmi_disable_osi_vista, + .ident = "Fujitsu Siemens", +diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c +index 8b67bd0..b59593e 100644 +--- a/drivers/acpi/bus.c ++++ b/drivers/acpi/bus.c +@@ -67,7 +67,7 @@ static int set_copy_dsdt(const struct dmi_system_id *id) + } + #endif + +-static struct dmi_system_id dsdt_dmi_table[] __initdata = { ++static const struct dmi_system_id dsdt_dmi_table[] __initconst = { + /* + * Invoke DSDT corruption work-around on all Toshiba Satellite. + * https://bugzilla.kernel.org/show_bug.cgi?id=14679 +@@ -83,7 +83,7 @@ static struct dmi_system_id dsdt_dmi_table[] __initdata = { + {} + }; + #else +-static struct dmi_system_id dsdt_dmi_table[] __initdata = { ++static const struct dmi_system_id dsdt_dmi_table[] __initconst = { + {} + }; + #endif +diff --git a/drivers/acpi/custom_method.c b/drivers/acpi/custom_method.c +index c68e724..e863008 100644 +--- a/drivers/acpi/custom_method.c ++++ b/drivers/acpi/custom_method.c +@@ -29,6 +29,10 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf, + struct acpi_table_header table; + acpi_status status; + ++#ifdef CONFIG_GRKERNSEC_KMEM ++ return -EPERM; ++#endif ++ + if (!(*ppos)) { + /* parse the table header to get the table length */ + if (count <= sizeof(struct acpi_table_header)) +diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c +index 6341e66..ebcf59c 100644 +--- a/drivers/acpi/device_pm.c ++++ b/drivers/acpi/device_pm.c +@@ -1029,6 +1029,8 @@ EXPORT_SYMBOL_GPL(acpi_subsys_freeze); + + #endif /* CONFIG_PM_SLEEP */ + ++static void acpi_dev_pm_detach(struct device *dev, bool power_off); ++ + static struct dev_pm_domain acpi_general_pm_domain = { + .ops = { + #ifdef CONFIG_PM_RUNTIME +@@ -1047,6 +1049,7 @@ static struct dev_pm_domain acpi_general_pm_domain = { + .restore_early = acpi_subsys_resume_early, + #endif + }, ++ .detach = acpi_dev_pm_detach + }; + + /** +@@ -1116,7 +1119,6 @@ int acpi_dev_pm_attach(struct device *dev, bool power_on) + acpi_device_wakeup(adev, ACPI_STATE_S0, false); + } + +- dev->pm_domain->detach = acpi_dev_pm_detach; + return 0; + } + EXPORT_SYMBOL_GPL(acpi_dev_pm_attach); +diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c +index 5f9b74b..191e103 100644 +--- a/drivers/acpi/ec.c ++++ b/drivers/acpi/ec.c +@@ -1043,7 +1043,7 @@ static int ec_clear_on_resume(const struct dmi_system_id *id) + return 0; + } + +-static struct dmi_system_id ec_dmi_table[] __initdata = { ++static const struct dmi_system_id ec_dmi_table[] __initconst = { + { + ec_skip_dsdt_scan, "Compal JFL92", { + DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"), +diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c +index 139d9e4..9a9d799 100644 +--- a/drivers/acpi/pci_slot.c ++++ b/drivers/acpi/pci_slot.c +@@ -195,7 +195,7 @@ static int do_sta_before_sun(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id acpi_pci_slot_dmi_table[] __initdata = { ++static const struct dmi_system_id acpi_pci_slot_dmi_table[] __initconst = { + /* + * Fujitsu Primequest machines will return 1023 to indicate an + * error if the _SUN method is evaluated on SxFy objects that +diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c +index d9f7158..168e742 100644 +--- a/drivers/acpi/processor_driver.c ++++ b/drivers/acpi/processor_driver.c +@@ -159,7 +159,7 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb, + return NOTIFY_OK; + } + +-static struct notifier_block __refdata acpi_cpu_notifier = { ++static struct notifier_block __refconst acpi_cpu_notifier = { + .notifier_call = acpi_cpu_soft_notify, + }; + +diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c +index fd8496a..bd2c3e3 100644 +--- a/drivers/acpi/processor_idle.c ++++ b/drivers/acpi/processor_idle.c +@@ -952,7 +952,7 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr) + { + int i, count = CPUIDLE_DRIVER_STATE_START; + struct acpi_processor_cx *cx; +- struct cpuidle_state *state; ++ cpuidle_state_no_const *state; + struct cpuidle_driver *drv = &acpi_idle_driver; + + if (!pr->flags.power_setup_done) +diff --git a/drivers/acpi/processor_pdc.c b/drivers/acpi/processor_pdc.c +index e5dd808..1eceed1 100644 +--- a/drivers/acpi/processor_pdc.c ++++ b/drivers/acpi/processor_pdc.c +@@ -176,7 +176,7 @@ static int __init set_no_mwait(const struct dmi_system_id *id) + return 0; + } + +-static struct dmi_system_id processor_idle_dmi_table[] __initdata = { ++static const struct dmi_system_id processor_idle_dmi_table[] __initconst = { + { + set_no_mwait, "Extensa 5220", { + DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), +diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c +index 05a31b5..c72c533 100644 +--- a/drivers/acpi/sleep.c ++++ b/drivers/acpi/sleep.c +@@ -148,7 +148,7 @@ static int __init init_nvs_nosave(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id acpisleep_dmi_table[] __initdata = { ++static const struct dmi_system_id acpisleep_dmi_table[] __initconst = { + { + .callback = init_old_suspend_ordering, + .ident = "Abit KN9 (nForce4 variant)", +diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c +index 13e577c..cef11ee 100644 +--- a/drivers/acpi/sysfs.c ++++ b/drivers/acpi/sysfs.c +@@ -423,11 +423,11 @@ static u32 num_counters; + static struct attribute **all_attrs; + static u32 acpi_gpe_count; + +-static struct attribute_group interrupt_stats_attr_group = { ++static attribute_group_no_const interrupt_stats_attr_group = { + .name = "interrupts", + }; + +-static struct kobj_attribute *counter_attrs; ++static kobj_attribute_no_const *counter_attrs; + + static void delete_gpe_attr_array(void) + { +diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c +index d24fa19..782f1e6 100644 +--- a/drivers/acpi/thermal.c ++++ b/drivers/acpi/thermal.c +@@ -1209,7 +1209,7 @@ static int thermal_psv(const struct dmi_system_id *d) { + return 0; + } + +-static struct dmi_system_id thermal_dmi_table[] __initdata = { ++static const struct dmi_system_id thermal_dmi_table[] __initconst = { + /* + * Award BIOS on this AOpen makes thermal control almost worthless. + * http://bugzilla.kernel.org/show_bug.cgi?id=8842 +diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c +index ff7bc22..1d5534d 100644 +--- a/drivers/acpi/video.c ++++ b/drivers/acpi/video.c +@@ -418,7 +418,7 @@ static int __init video_disable_native_backlight(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id video_dmi_table[] __initdata = { ++static const struct dmi_system_id video_dmi_table[] __initconst = { + /* + * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 + */ +diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c +index 97683e4..655f6ba 100644 +--- a/drivers/ata/libahci.c ++++ b/drivers/ata/libahci.c +@@ -1252,7 +1252,7 @@ int ahci_kick_engine(struct ata_port *ap) + } + EXPORT_SYMBOL_GPL(ahci_kick_engine); + +-static int ahci_exec_polled_cmd(struct ata_port *ap, int pmp, ++static int __intentional_overflow(-1) ahci_exec_polled_cmd(struct ata_port *ap, int pmp, + struct ata_taskfile *tf, int is_cmd, u16 flags, + unsigned long timeout_msec) + { +diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c +index 485f7ea..9a8df4a 100644 +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -99,7 +99,7 @@ static unsigned int ata_dev_set_xfermode(struct ata_device *dev); + static void ata_dev_xfermask(struct ata_device *dev); + static unsigned long ata_dev_blacklisted(const struct ata_device *dev); + +-atomic_t ata_print_id = ATOMIC_INIT(0); ++atomic_unchecked_t ata_print_id = ATOMIC_INIT(0); + + struct ata_force_param { + const char *name; +@@ -4800,7 +4800,7 @@ void ata_qc_free(struct ata_queued_cmd *qc) + struct ata_port *ap; + unsigned int tag; + +- WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ ++ BUG_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ + ap = qc->ap; + + qc->flags = 0; +@@ -4816,7 +4816,7 @@ void __ata_qc_complete(struct ata_queued_cmd *qc) + struct ata_port *ap; + struct ata_link *link; + +- WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ ++ BUG_ON(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ + WARN_ON_ONCE(!(qc->flags & ATA_QCFLAG_ACTIVE)); + ap = qc->ap; + link = qc->dev->link; +@@ -5920,6 +5920,7 @@ static void ata_finalize_port_ops(struct ata_port_operations *ops) + return; + + spin_lock(&lock); ++ pax_open_kernel(); + + for (cur = ops->inherits; cur; cur = cur->inherits) { + void **inherit = (void **)cur; +@@ -5933,8 +5934,9 @@ static void ata_finalize_port_ops(struct ata_port_operations *ops) + if (IS_ERR(*pp)) + *pp = NULL; + +- ops->inherits = NULL; ++ *(struct ata_port_operations **)&ops->inherits = NULL; + ++ pax_close_kernel(); + spin_unlock(&lock); + } + +@@ -6130,7 +6132,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) + + /* give ports names and add SCSI hosts */ + for (i = 0; i < host->n_ports; i++) { +- host->ports[i]->print_id = atomic_inc_return(&ata_print_id); ++ host->ports[i]->print_id = atomic_inc_return_unchecked(&ata_print_id); + host->ports[i]->local_port_no = i + 1; + } + +diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c +index 0586f66..1a8f74a 100644 +--- a/drivers/ata/libata-scsi.c ++++ b/drivers/ata/libata-scsi.c +@@ -4151,7 +4151,7 @@ int ata_sas_port_init(struct ata_port *ap) + + if (rc) + return rc; +- ap->print_id = atomic_inc_return(&ata_print_id); ++ ap->print_id = atomic_inc_return_unchecked(&ata_print_id); + return 0; + } + EXPORT_SYMBOL_GPL(ata_sas_port_init); +diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h +index 5f4e0cc..ff2c347 100644 +--- a/drivers/ata/libata.h ++++ b/drivers/ata/libata.h +@@ -53,7 +53,7 @@ enum { + ATA_DNXFER_QUIET = (1 << 31), + }; + +-extern atomic_t ata_print_id; ++extern atomic_unchecked_t ata_print_id; + extern int atapi_passthru16; + extern int libata_fua; + extern int libata_noacpi; +diff --git a/drivers/ata/pata_arasan_cf.c b/drivers/ata/pata_arasan_cf.c +index 38216b9..4ec6aeb 100644 +--- a/drivers/ata/pata_arasan_cf.c ++++ b/drivers/ata/pata_arasan_cf.c +@@ -865,7 +865,9 @@ static int arasan_cf_probe(struct platform_device *pdev) + /* Handle platform specific quirks */ + if (quirk) { + if (quirk & CF_BROKEN_PIO) { +- ap->ops->set_piomode = NULL; ++ pax_open_kernel(); ++ *(void **)&ap->ops->set_piomode = NULL; ++ pax_close_kernel(); + ap->pio_mask = 0; + } + if (quirk & CF_BROKEN_MWDMA) +diff --git a/drivers/atm/adummy.c b/drivers/atm/adummy.c +index f9b983a..887b9d8 100644 +--- a/drivers/atm/adummy.c ++++ b/drivers/atm/adummy.c +@@ -114,7 +114,7 @@ adummy_send(struct atm_vcc *vcc, struct sk_buff *skb) + vcc->pop(vcc, skb); + else + dev_kfree_skb_any(skb); +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + + return 0; + } +diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c +index f1a9198..f466a4a 100644 +--- a/drivers/atm/ambassador.c ++++ b/drivers/atm/ambassador.c +@@ -454,7 +454,7 @@ static void tx_complete (amb_dev * dev, tx_out * tx) { + PRINTD (DBG_FLOW|DBG_TX, "tx_complete %p %p", dev, tx); + + // VC layer stats +- atomic_inc(&ATM_SKB(skb)->vcc->stats->tx); ++ atomic_inc_unchecked(&ATM_SKB(skb)->vcc->stats->tx); + + // free the descriptor + kfree (tx_descr); +@@ -495,7 +495,7 @@ static void rx_complete (amb_dev * dev, rx_out * rx) { + dump_skb ("<<<", vc, skb); + + // VC layer stats +- atomic_inc(&atm_vcc->stats->rx); ++ atomic_inc_unchecked(&atm_vcc->stats->rx); + __net_timestamp(skb); + // end of our responsibility + atm_vcc->push (atm_vcc, skb); +@@ -510,7 +510,7 @@ static void rx_complete (amb_dev * dev, rx_out * rx) { + } else { + PRINTK (KERN_INFO, "dropped over-size frame"); + // should we count this? +- atomic_inc(&atm_vcc->stats->rx_drop); ++ atomic_inc_unchecked(&atm_vcc->stats->rx_drop); + } + + } else { +@@ -1338,7 +1338,7 @@ static int amb_send (struct atm_vcc * atm_vcc, struct sk_buff * skb) { + } + + if (check_area (skb->data, skb->len)) { +- atomic_inc(&atm_vcc->stats->tx_err); ++ atomic_inc_unchecked(&atm_vcc->stats->tx_err); + return -ENOMEM; // ? + } + +diff --git a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c +index 480fa6f..947067c 100644 +--- a/drivers/atm/atmtcp.c ++++ b/drivers/atm/atmtcp.c +@@ -206,7 +206,7 @@ static int atmtcp_v_send(struct atm_vcc *vcc,struct sk_buff *skb) + if (vcc->pop) vcc->pop(vcc,skb); + else dev_kfree_skb(skb); + if (dev_data) return 0; +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + return -ENOLINK; + } + size = skb->len+sizeof(struct atmtcp_hdr); +@@ -214,7 +214,7 @@ static int atmtcp_v_send(struct atm_vcc *vcc,struct sk_buff *skb) + if (!new_skb) { + if (vcc->pop) vcc->pop(vcc,skb); + else dev_kfree_skb(skb); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + return -ENOBUFS; + } + hdr = (void *) skb_put(new_skb,sizeof(struct atmtcp_hdr)); +@@ -225,8 +225,8 @@ static int atmtcp_v_send(struct atm_vcc *vcc,struct sk_buff *skb) + if (vcc->pop) vcc->pop(vcc,skb); + else dev_kfree_skb(skb); + out_vcc->push(out_vcc,new_skb); +- atomic_inc(&vcc->stats->tx); +- atomic_inc(&out_vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->tx); ++ atomic_inc_unchecked(&out_vcc->stats->rx); + return 0; + } + +@@ -300,7 +300,7 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb) + read_unlock(&vcc_sklist_lock); + if (!out_vcc) { + result = -EUNATCH; +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + goto done; + } + skb_pull(skb,sizeof(struct atmtcp_hdr)); +@@ -312,8 +312,8 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb) + __net_timestamp(new_skb); + skb_copy_from_linear_data(skb, skb_put(new_skb, skb->len), skb->len); + out_vcc->push(out_vcc,new_skb); +- atomic_inc(&vcc->stats->tx); +- atomic_inc(&out_vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->tx); ++ atomic_inc_unchecked(&out_vcc->stats->rx); + done: + if (vcc->pop) vcc->pop(vcc,skb); + else dev_kfree_skb(skb); +diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c +index d65975a..0b87e20 100644 +--- a/drivers/atm/eni.c ++++ b/drivers/atm/eni.c +@@ -522,7 +522,7 @@ static int rx_aal0(struct atm_vcc *vcc) + DPRINTK(DEV_LABEL "(itf %d): trashing empty cell\n", + vcc->dev->number); + length = 0; +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + } + else { + length = ATM_CELL_SIZE-1; /* no HEC */ +@@ -577,7 +577,7 @@ static int rx_aal5(struct atm_vcc *vcc) + size); + } + eff = length = 0; +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + } + else { + size = (descr & MID_RED_COUNT)*(ATM_CELL_PAYLOAD >> 2); +@@ -594,7 +594,7 @@ static int rx_aal5(struct atm_vcc *vcc) + "(VCI=%d,length=%ld,size=%ld (descr 0x%lx))\n", + vcc->dev->number,vcc->vci,length,size << 2,descr); + length = eff = 0; +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + } + } + skb = eff ? atm_alloc_charge(vcc,eff << 2,GFP_ATOMIC) : NULL; +@@ -767,7 +767,7 @@ rx_dequeued++; + vcc->push(vcc,skb); + pushed++; + } +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + } + wake_up(&eni_dev->rx_wait); + } +@@ -1227,7 +1227,7 @@ static void dequeue_tx(struct atm_dev *dev) + PCI_DMA_TODEVICE); + if (vcc->pop) vcc->pop(vcc,skb); + else dev_kfree_skb_irq(skb); +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + wake_up(&eni_dev->tx_wait); + dma_complete++; + } +diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c +index 82f2ae0..f205c02 100644 +--- a/drivers/atm/firestream.c ++++ b/drivers/atm/firestream.c +@@ -749,7 +749,7 @@ static void process_txdone_queue (struct fs_dev *dev, struct queue *q) + } + } + +- atomic_inc(&ATM_SKB(skb)->vcc->stats->tx); ++ atomic_inc_unchecked(&ATM_SKB(skb)->vcc->stats->tx); + + fs_dprintk (FS_DEBUG_TXMEM, "i"); + fs_dprintk (FS_DEBUG_ALLOC, "Free t-skb: %p\n", skb); +@@ -816,7 +816,7 @@ static void process_incoming (struct fs_dev *dev, struct queue *q) + #endif + skb_put (skb, qe->p1 & 0xffff); + ATM_SKB(skb)->vcc = atm_vcc; +- atomic_inc(&atm_vcc->stats->rx); ++ atomic_inc_unchecked(&atm_vcc->stats->rx); + __net_timestamp(skb); + fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p (pushed)\n", skb); + atm_vcc->push (atm_vcc, skb); +@@ -837,12 +837,12 @@ static void process_incoming (struct fs_dev *dev, struct queue *q) + kfree (pe); + } + if (atm_vcc) +- atomic_inc(&atm_vcc->stats->rx_drop); ++ atomic_inc_unchecked(&atm_vcc->stats->rx_drop); + break; + case 0x1f: /* Reassembly abort: no buffers. */ + /* Silently increment error counter. */ + if (atm_vcc) +- atomic_inc(&atm_vcc->stats->rx_drop); ++ atomic_inc_unchecked(&atm_vcc->stats->rx_drop); + break; + default: /* Hmm. Haven't written the code to handle the others yet... -- REW */ + printk (KERN_WARNING "Don't know what to do with RX status %x: %s.\n", +diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c +index d4725fc..2d4ea65 100644 +--- a/drivers/atm/fore200e.c ++++ b/drivers/atm/fore200e.c +@@ -931,9 +931,9 @@ fore200e_tx_irq(struct fore200e* fore200e) + #endif + /* check error condition */ + if (*entry->status & STATUS_ERROR) +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + else +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + } + } + +@@ -1082,7 +1082,7 @@ fore200e_push_rpd(struct fore200e* fore200e, struct atm_vcc* vcc, struct rpd* rp + if (skb == NULL) { + DPRINTK(2, "unable to alloc new skb, rx PDU length = %d\n", pdu_len); + +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + return -ENOMEM; + } + +@@ -1125,14 +1125,14 @@ fore200e_push_rpd(struct fore200e* fore200e, struct atm_vcc* vcc, struct rpd* rp + + dev_kfree_skb_any(skb); + +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + return -ENOMEM; + } + + ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0); + + vcc->push(vcc, skb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + + ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0); + +@@ -1210,7 +1210,7 @@ fore200e_rx_irq(struct fore200e* fore200e) + DPRINTK(2, "damaged PDU on %d.%d.%d\n", + fore200e->atm_dev->number, + entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + } + } + +@@ -1655,7 +1655,7 @@ fore200e_send(struct atm_vcc *vcc, struct sk_buff *skb) + goto retry_here; + } + +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + + fore200e->tx_sat++; + DPRINTK(2, "tx queue of device %s is saturated, PDU dropped - heartbeat is %08x\n", +diff --git a/drivers/atm/he.c b/drivers/atm/he.c +index c39702b..785b73b 100644 +--- a/drivers/atm/he.c ++++ b/drivers/atm/he.c +@@ -1689,7 +1689,7 @@ he_service_rbrq(struct he_dev *he_dev, int group) + + if (RBRQ_HBUF_ERR(he_dev->rbrq_head)) { + hprintk("HBUF_ERR! (cid 0x%x)\n", cid); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + goto return_host_buffers; + } + +@@ -1716,7 +1716,7 @@ he_service_rbrq(struct he_dev *he_dev, int group) + RBRQ_LEN_ERR(he_dev->rbrq_head) + ? "LEN_ERR" : "", + vcc->vpi, vcc->vci); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + goto return_host_buffers; + } + +@@ -1768,7 +1768,7 @@ he_service_rbrq(struct he_dev *he_dev, int group) + vcc->push(vcc, skb); + spin_lock(&he_dev->global_lock); + +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + + return_host_buffers: + ++pdus_assembled; +@@ -2094,7 +2094,7 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid) + tpd->vcc->pop(tpd->vcc, tpd->skb); + else + dev_kfree_skb_any(tpd->skb); +- atomic_inc(&tpd->vcc->stats->tx_err); ++ atomic_inc_unchecked(&tpd->vcc->stats->tx_err); + } + pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status)); + return; +@@ -2506,7 +2506,7 @@ he_send(struct atm_vcc *vcc, struct sk_buff *skb) + vcc->pop(vcc, skb); + else + dev_kfree_skb_any(skb); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + return -EINVAL; + } + +@@ -2517,7 +2517,7 @@ he_send(struct atm_vcc *vcc, struct sk_buff *skb) + vcc->pop(vcc, skb); + else + dev_kfree_skb_any(skb); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + return -EINVAL; + } + #endif +@@ -2529,7 +2529,7 @@ he_send(struct atm_vcc *vcc, struct sk_buff *skb) + vcc->pop(vcc, skb); + else + dev_kfree_skb_any(skb); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + spin_unlock_irqrestore(&he_dev->global_lock, flags); + return -ENOMEM; + } +@@ -2571,7 +2571,7 @@ he_send(struct atm_vcc *vcc, struct sk_buff *skb) + vcc->pop(vcc, skb); + else + dev_kfree_skb_any(skb); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + spin_unlock_irqrestore(&he_dev->global_lock, flags); + return -ENOMEM; + } +@@ -2602,7 +2602,7 @@ he_send(struct atm_vcc *vcc, struct sk_buff *skb) + __enqueue_tpd(he_dev, tpd, cid); + spin_unlock_irqrestore(&he_dev->global_lock, flags); + +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + + return 0; + } +diff --git a/drivers/atm/horizon.c b/drivers/atm/horizon.c +index 1dc0519..1aadaf7 100644 +--- a/drivers/atm/horizon.c ++++ b/drivers/atm/horizon.c +@@ -1034,7 +1034,7 @@ static void rx_schedule (hrz_dev * dev, int irq) { + { + struct atm_vcc * vcc = ATM_SKB(skb)->vcc; + // VC layer stats +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + __net_timestamp(skb); + // end of our responsibility + vcc->push (vcc, skb); +@@ -1186,7 +1186,7 @@ static void tx_schedule (hrz_dev * const dev, int irq) { + dev->tx_iovec = NULL; + + // VC layer stats +- atomic_inc(&ATM_SKB(skb)->vcc->stats->tx); ++ atomic_inc_unchecked(&ATM_SKB(skb)->vcc->stats->tx); + + // free the skb + hrz_kfree_skb (skb); +diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c +index 2b24ed0..b3d6acc 100644 +--- a/drivers/atm/idt77252.c ++++ b/drivers/atm/idt77252.c +@@ -810,7 +810,7 @@ drain_scq(struct idt77252_dev *card, struct vc_map *vc) + else + dev_kfree_skb(skb); + +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + } + + atomic_dec(&scq->used); +@@ -1072,13 +1072,13 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) + if ((sb = dev_alloc_skb(64)) == NULL) { + printk("%s: Can't allocate buffers for aal0.\n", + card->name); +- atomic_add(i, &vcc->stats->rx_drop); ++ atomic_add_unchecked(i, &vcc->stats->rx_drop); + break; + } + if (!atm_charge(vcc, sb->truesize)) { + RXPRINTK("%s: atm_charge() dropped aal0 packets.\n", + card->name); +- atomic_add(i - 1, &vcc->stats->rx_drop); ++ atomic_add_unchecked(i - 1, &vcc->stats->rx_drop); + dev_kfree_skb(sb); + break; + } +@@ -1095,7 +1095,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) + ATM_SKB(sb)->vcc = vcc; + __net_timestamp(sb); + vcc->push(vcc, sb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + + cell += ATM_CELL_PAYLOAD; + } +@@ -1132,13 +1132,13 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) + "(CDC: %08x)\n", + card->name, len, rpp->len, readl(SAR_REG_CDC)); + recycle_rx_pool_skb(card, rpp); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + return; + } + if (stat & SAR_RSQE_CRC) { + RXPRINTK("%s: AAL5 CRC error.\n", card->name); + recycle_rx_pool_skb(card, rpp); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + return; + } + if (skb_queue_len(&rpp->queue) > 1) { +@@ -1149,7 +1149,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) + RXPRINTK("%s: Can't alloc RX skb.\n", + card->name); + recycle_rx_pool_skb(card, rpp); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + return; + } + if (!atm_charge(vcc, skb->truesize)) { +@@ -1168,7 +1168,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) + __net_timestamp(skb); + + vcc->push(vcc, skb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + + return; + } +@@ -1190,7 +1190,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) + __net_timestamp(skb); + + vcc->push(vcc, skb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + + if (skb->truesize > SAR_FB_SIZE_3) + add_rx_skb(card, 3, SAR_FB_SIZE_3, 1); +@@ -1301,14 +1301,14 @@ idt77252_rx_raw(struct idt77252_dev *card) + if (vcc->qos.aal != ATM_AAL0) { + RPRINTK("%s: raw cell for non AAL0 vc %u.%u\n", + card->name, vpi, vci); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + goto drop; + } + + if ((sb = dev_alloc_skb(64)) == NULL) { + printk("%s: Can't allocate buffers for AAL0.\n", + card->name); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + goto drop; + } + +@@ -1327,7 +1327,7 @@ idt77252_rx_raw(struct idt77252_dev *card) + ATM_SKB(sb)->vcc = vcc; + __net_timestamp(sb); + vcc->push(vcc, sb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + + drop: + skb_pull(queue, 64); +@@ -1952,13 +1952,13 @@ idt77252_send_skb(struct atm_vcc *vcc, struct sk_buff *skb, int oam) + + if (vc == NULL) { + printk("%s: NULL connection in send().\n", card->name); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb(skb); + return -EINVAL; + } + if (!test_bit(VCF_TX, &vc->flags)) { + printk("%s: Trying to transmit on a non-tx VC.\n", card->name); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb(skb); + return -EINVAL; + } +@@ -1970,14 +1970,14 @@ idt77252_send_skb(struct atm_vcc *vcc, struct sk_buff *skb, int oam) + break; + default: + printk("%s: Unsupported AAL: %d\n", card->name, vcc->qos.aal); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb(skb); + return -EINVAL; + } + + if (skb_shinfo(skb)->nr_frags != 0) { + printk("%s: No scatter-gather yet.\n", card->name); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb(skb); + return -EINVAL; + } +@@ -1985,7 +1985,7 @@ idt77252_send_skb(struct atm_vcc *vcc, struct sk_buff *skb, int oam) + + err = queue_skb(card, vc, skb, oam); + if (err) { +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb(skb); + return err; + } +@@ -2008,7 +2008,7 @@ idt77252_send_oam(struct atm_vcc *vcc, void *cell, int flags) + skb = dev_alloc_skb(64); + if (!skb) { + printk("%s: Out of memory in send_oam().\n", card->name); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + return -ENOMEM; + } + atomic_add(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc); +diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c +index 4217f29..88f547a 100644 +--- a/drivers/atm/iphase.c ++++ b/drivers/atm/iphase.c +@@ -1145,7 +1145,7 @@ static int rx_pkt(struct atm_dev *dev) + status = (u_short) (buf_desc_ptr->desc_mode); + if (status & (RX_CER | RX_PTE | RX_OFL)) + { +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + IF_ERR(printk("IA: bad packet, dropping it");) + if (status & RX_CER) { + IF_ERR(printk(" cause: packet CRC error\n");) +@@ -1168,7 +1168,7 @@ static int rx_pkt(struct atm_dev *dev) + len = dma_addr - buf_addr; + if (len > iadev->rx_buf_sz) { + printk("Over %d bytes sdu received, dropped!!!\n", iadev->rx_buf_sz); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + goto out_free_desc; + } + +@@ -1318,7 +1318,7 @@ static void rx_dle_intr(struct atm_dev *dev) + ia_vcc = INPH_IA_VCC(vcc); + if (ia_vcc == NULL) + { +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + atm_return(vcc, skb->truesize); + dev_kfree_skb_any(skb); + goto INCR_DLE; +@@ -1330,7 +1330,7 @@ static void rx_dle_intr(struct atm_dev *dev) + if ((length > iadev->rx_buf_sz) || (length > + (skb->len - sizeof(struct cpcs_trailer)))) + { +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + IF_ERR(printk("rx_dle_intr: Bad AAL5 trailer %d (skb len %d)", + length, skb->len);) + atm_return(vcc, skb->truesize); +@@ -1346,7 +1346,7 @@ static void rx_dle_intr(struct atm_dev *dev) + + IF_RX(printk("rx_dle_intr: skb push");) + vcc->push(vcc,skb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + iadev->rx_pkt_cnt++; + } + INCR_DLE: +@@ -2826,15 +2826,15 @@ static int ia_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg) + { + struct k_sonet_stats *stats; + stats = &PRIV(_ia_dev[board])->sonet_stats; +- printk("section_bip: %d\n", atomic_read(&stats->section_bip)); +- printk("line_bip : %d\n", atomic_read(&stats->line_bip)); +- printk("path_bip : %d\n", atomic_read(&stats->path_bip)); +- printk("line_febe : %d\n", atomic_read(&stats->line_febe)); +- printk("path_febe : %d\n", atomic_read(&stats->path_febe)); +- printk("corr_hcs : %d\n", atomic_read(&stats->corr_hcs)); +- printk("uncorr_hcs : %d\n", atomic_read(&stats->uncorr_hcs)); +- printk("tx_cells : %d\n", atomic_read(&stats->tx_cells)); +- printk("rx_cells : %d\n", atomic_read(&stats->rx_cells)); ++ printk("section_bip: %d\n", atomic_read_unchecked(&stats->section_bip)); ++ printk("line_bip : %d\n", atomic_read_unchecked(&stats->line_bip)); ++ printk("path_bip : %d\n", atomic_read_unchecked(&stats->path_bip)); ++ printk("line_febe : %d\n", atomic_read_unchecked(&stats->line_febe)); ++ printk("path_febe : %d\n", atomic_read_unchecked(&stats->path_febe)); ++ printk("corr_hcs : %d\n", atomic_read_unchecked(&stats->corr_hcs)); ++ printk("uncorr_hcs : %d\n", atomic_read_unchecked(&stats->uncorr_hcs)); ++ printk("tx_cells : %d\n", atomic_read_unchecked(&stats->tx_cells)); ++ printk("rx_cells : %d\n", atomic_read_unchecked(&stats->rx_cells)); + } + ia_cmds.status = 0; + break; +@@ -2939,7 +2939,7 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { + if ((desc == 0) || (desc > iadev->num_tx_desc)) + { + IF_ERR(printk(DEV_LABEL "invalid desc for send: %d\n", desc);) +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + if (vcc->pop) + vcc->pop(vcc, skb); + else +@@ -3044,14 +3044,14 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { + ATM_DESC(skb) = vcc->vci; + skb_queue_tail(&iadev->tx_dma_q, skb); + +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + iadev->tx_pkt_cnt++; + /* Increment transaction counter */ + writel(2, iadev->dma+IPHASE5575_TX_COUNTER); + + #if 0 + /* add flow control logic */ +- if (atomic_read(&vcc->stats->tx) % 20 == 0) { ++ if (atomic_read_unchecked(&vcc->stats->tx) % 20 == 0) { + if (iavcc->vc_desc_cnt > 10) { + vcc->tx_quota = vcc->tx_quota * 3 / 4; + printk("Tx1: vcc->tx_quota = %d \n", (u32)vcc->tx_quota ); +diff --git a/drivers/atm/lanai.c b/drivers/atm/lanai.c +index 93eaf8d..b4ca7da 100644 +--- a/drivers/atm/lanai.c ++++ b/drivers/atm/lanai.c +@@ -1303,7 +1303,7 @@ static void lanai_send_one_aal5(struct lanai_dev *lanai, + vcc_tx_add_aal5_trailer(lvcc, skb->len, 0, 0); + lanai_endtx(lanai, lvcc); + lanai_free_skb(lvcc->tx.atmvcc, skb); +- atomic_inc(&lvcc->tx.atmvcc->stats->tx); ++ atomic_inc_unchecked(&lvcc->tx.atmvcc->stats->tx); + } + + /* Try to fill the buffer - don't call unless there is backlog */ +@@ -1426,7 +1426,7 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr) + ATM_SKB(skb)->vcc = lvcc->rx.atmvcc; + __net_timestamp(skb); + lvcc->rx.atmvcc->push(lvcc->rx.atmvcc, skb); +- atomic_inc(&lvcc->rx.atmvcc->stats->rx); ++ atomic_inc_unchecked(&lvcc->rx.atmvcc->stats->rx); + out: + lvcc->rx.buf.ptr = end; + cardvcc_write(lvcc, endptr, vcc_rxreadptr); +@@ -1667,7 +1667,7 @@ static int handle_service(struct lanai_dev *lanai, u32 s) + DPRINTK("(itf %d) got RX service entry 0x%X for non-AAL5 " + "vcc %d\n", lanai->number, (unsigned int) s, vci); + lanai->stats.service_rxnotaal5++; +- atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); ++ atomic_inc_unchecked(&lvcc->rx.atmvcc->stats->rx_err); + return 0; + } + if (likely(!(s & (SERVICE_TRASH | SERVICE_STREAM | SERVICE_CRCERR)))) { +@@ -1679,7 +1679,7 @@ static int handle_service(struct lanai_dev *lanai, u32 s) + int bytes; + read_unlock(&vcc_sklist_lock); + DPRINTK("got trashed rx pdu on vci %d\n", vci); +- atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); ++ atomic_inc_unchecked(&lvcc->rx.atmvcc->stats->rx_err); + lvcc->stats.x.aal5.service_trash++; + bytes = (SERVICE_GET_END(s) * 16) - + (((unsigned long) lvcc->rx.buf.ptr) - +@@ -1691,7 +1691,7 @@ static int handle_service(struct lanai_dev *lanai, u32 s) + } + if (s & SERVICE_STREAM) { + read_unlock(&vcc_sklist_lock); +- atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); ++ atomic_inc_unchecked(&lvcc->rx.atmvcc->stats->rx_err); + lvcc->stats.x.aal5.service_stream++; + printk(KERN_ERR DEV_LABEL "(itf %d): Got AAL5 stream " + "PDU on VCI %d!\n", lanai->number, vci); +@@ -1699,7 +1699,7 @@ static int handle_service(struct lanai_dev *lanai, u32 s) + return 0; + } + DPRINTK("got rx crc error on vci %d\n", vci); +- atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); ++ atomic_inc_unchecked(&lvcc->rx.atmvcc->stats->rx_err); + lvcc->stats.x.aal5.service_rxcrc++; + lvcc->rx.buf.ptr = &lvcc->rx.buf.start[SERVICE_GET_END(s) * 4]; + cardvcc_write(lvcc, SERVICE_GET_END(s), vcc_rxreadptr); +diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c +index 9988ac9..7c52585 100644 +--- a/drivers/atm/nicstar.c ++++ b/drivers/atm/nicstar.c +@@ -1640,7 +1640,7 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb) + if ((vc = (vc_map *) vcc->dev_data) == NULL) { + printk("nicstar%d: vcc->dev_data == NULL on ns_send().\n", + card->index); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EINVAL; + } +@@ -1648,7 +1648,7 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb) + if (!vc->tx) { + printk("nicstar%d: Trying to transmit on a non-tx VC.\n", + card->index); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EINVAL; + } +@@ -1656,14 +1656,14 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb) + if (vcc->qos.aal != ATM_AAL5 && vcc->qos.aal != ATM_AAL0) { + printk("nicstar%d: Only AAL0 and AAL5 are supported.\n", + card->index); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EINVAL; + } + + if (skb_shinfo(skb)->nr_frags != 0) { + printk("nicstar%d: No scatter-gather yet.\n", card->index); +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EINVAL; + } +@@ -1711,11 +1711,11 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb) + } + + if (push_scqe(card, vc, scq, &scqe, skb) != 0) { +- atomic_inc(&vcc->stats->tx_err); ++ atomic_inc_unchecked(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EIO; + } +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + + return 0; + } +@@ -2032,14 +2032,14 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + printk + ("nicstar%d: Can't allocate buffers for aal0.\n", + card->index); +- atomic_add(i, &vcc->stats->rx_drop); ++ atomic_add_unchecked(i, &vcc->stats->rx_drop); + break; + } + if (!atm_charge(vcc, sb->truesize)) { + RXPRINTK + ("nicstar%d: atm_charge() dropped aal0 packets.\n", + card->index); +- atomic_add(i - 1, &vcc->stats->rx_drop); /* already increased by 1 */ ++ atomic_add_unchecked(i - 1, &vcc->stats->rx_drop); /* already increased by 1 */ + dev_kfree_skb_any(sb); + break; + } +@@ -2054,7 +2054,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + ATM_SKB(sb)->vcc = vcc; + __net_timestamp(sb); + vcc->push(vcc, sb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + cell += ATM_CELL_PAYLOAD; + } + +@@ -2071,7 +2071,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + if (iovb == NULL) { + printk("nicstar%d: Out of iovec buffers.\n", + card->index); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + recycle_rx_buf(card, skb); + return; + } +@@ -2095,7 +2095,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + small or large buffer itself. */ + } else if (NS_PRV_IOVCNT(iovb) >= NS_MAX_IOVECS) { + printk("nicstar%d: received too big AAL5 SDU.\n", card->index); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, + NS_MAX_IOVECS); + NS_PRV_IOVCNT(iovb) = 0; +@@ -2115,7 +2115,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + ("nicstar%d: Expected a small buffer, and this is not one.\n", + card->index); + which_list(card, skb); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + recycle_rx_buf(card, skb); + vc->rx_iov = NULL; + recycle_iov_buf(card, iovb); +@@ -2128,7 +2128,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + ("nicstar%d: Expected a large buffer, and this is not one.\n", + card->index); + which_list(card, skb); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, + NS_PRV_IOVCNT(iovb)); + vc->rx_iov = NULL; +@@ -2151,7 +2151,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + printk(" - PDU size mismatch.\n"); + else + printk(".\n"); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, + NS_PRV_IOVCNT(iovb)); + vc->rx_iov = NULL; +@@ -2165,7 +2165,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + /* skb points to a small buffer */ + if (!atm_charge(vcc, skb->truesize)) { + push_rxbufs(card, skb); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + } else { + skb_put(skb, len); + dequeue_sm_buf(card, skb); +@@ -2175,7 +2175,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + ATM_SKB(skb)->vcc = vcc; + __net_timestamp(skb); + vcc->push(vcc, skb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + } + } else if (NS_PRV_IOVCNT(iovb) == 2) { /* One small plus one large buffer */ + struct sk_buff *sb; +@@ -2186,7 +2186,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + if (len <= NS_SMBUFSIZE) { + if (!atm_charge(vcc, sb->truesize)) { + push_rxbufs(card, sb); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + } else { + skb_put(sb, len); + dequeue_sm_buf(card, sb); +@@ -2196,7 +2196,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + ATM_SKB(sb)->vcc = vcc; + __net_timestamp(sb); + vcc->push(vcc, sb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + } + + push_rxbufs(card, skb); +@@ -2205,7 +2205,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + + if (!atm_charge(vcc, skb->truesize)) { + push_rxbufs(card, skb); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + } else { + dequeue_lg_buf(card, skb); + #ifdef NS_USE_DESTRUCTORS +@@ -2218,7 +2218,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + ATM_SKB(skb)->vcc = vcc; + __net_timestamp(skb); + vcc->push(vcc, skb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + } + + push_rxbufs(card, sb); +@@ -2239,7 +2239,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + printk + ("nicstar%d: Out of huge buffers.\n", + card->index); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + recycle_iovec_rx_bufs(card, + (struct iovec *) + iovb->data, +@@ -2290,7 +2290,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + card->hbpool.count++; + } else + dev_kfree_skb_any(hb); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + } else { + /* Copy the small buffer to the huge buffer */ + sb = (struct sk_buff *)iov->iov_base; +@@ -2327,7 +2327,7 @@ static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) + #endif /* NS_USE_DESTRUCTORS */ + __net_timestamp(hb); + vcc->push(vcc, hb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + } + } + +diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c +index 21b0bc6..b5f40ba 100644 +--- a/drivers/atm/solos-pci.c ++++ b/drivers/atm/solos-pci.c +@@ -838,7 +838,7 @@ static void solos_bh(unsigned long card_arg) + } + atm_charge(vcc, skb->truesize); + vcc->push(vcc, skb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + break; + + case PKT_STATUS: +@@ -1116,7 +1116,7 @@ static uint32_t fpga_tx(struct solos_card *card) + vcc = SKB_CB(oldskb)->vcc; + + if (vcc) { +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + solos_pop(vcc, oldskb); + } else { + dev_kfree_skb_irq(oldskb); +diff --git a/drivers/atm/suni.c b/drivers/atm/suni.c +index 0215934..ce9f5b1 100644 +--- a/drivers/atm/suni.c ++++ b/drivers/atm/suni.c +@@ -49,8 +49,8 @@ static DEFINE_SPINLOCK(sunis_lock); + + + #define ADD_LIMITED(s,v) \ +- atomic_add((v),&stats->s); \ +- if (atomic_read(&stats->s) < 0) atomic_set(&stats->s,INT_MAX); ++ atomic_add_unchecked((v),&stats->s); \ ++ if (atomic_read_unchecked(&stats->s) < 0) atomic_set_unchecked(&stats->s,INT_MAX); + + + static void suni_hz(unsigned long from_timer) +diff --git a/drivers/atm/uPD98402.c b/drivers/atm/uPD98402.c +index 5120a96..e2572bd 100644 +--- a/drivers/atm/uPD98402.c ++++ b/drivers/atm/uPD98402.c +@@ -42,7 +42,7 @@ static int fetch_stats(struct atm_dev *dev,struct sonet_stats __user *arg,int ze + struct sonet_stats tmp; + int error = 0; + +- atomic_add(GET(HECCT),&PRIV(dev)->sonet_stats.uncorr_hcs); ++ atomic_add_unchecked(GET(HECCT),&PRIV(dev)->sonet_stats.uncorr_hcs); + sonet_copy_stats(&PRIV(dev)->sonet_stats,&tmp); + if (arg) error = copy_to_user(arg,&tmp,sizeof(tmp)); + if (zero && !error) { +@@ -161,9 +161,9 @@ static int uPD98402_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg) + + + #define ADD_LIMITED(s,v) \ +- { atomic_add(GET(v),&PRIV(dev)->sonet_stats.s); \ +- if (atomic_read(&PRIV(dev)->sonet_stats.s) < 0) \ +- atomic_set(&PRIV(dev)->sonet_stats.s,INT_MAX); } ++ { atomic_add_unchecked(GET(v),&PRIV(dev)->sonet_stats.s); \ ++ if (atomic_read_unchecked(&PRIV(dev)->sonet_stats.s) < 0) \ ++ atomic_set_unchecked(&PRIV(dev)->sonet_stats.s,INT_MAX); } + + + static void stat_event(struct atm_dev *dev) +@@ -194,7 +194,7 @@ static void uPD98402_int(struct atm_dev *dev) + if (reason & uPD98402_INT_PFM) stat_event(dev); + if (reason & uPD98402_INT_PCO) { + (void) GET(PCOCR); /* clear interrupt cause */ +- atomic_add(GET(HECCT), ++ atomic_add_unchecked(GET(HECCT), + &PRIV(dev)->sonet_stats.uncorr_hcs); + } + if ((reason & uPD98402_INT_RFO) && +@@ -222,9 +222,9 @@ static int uPD98402_start(struct atm_dev *dev) + PUT(~(uPD98402_INT_PFM | uPD98402_INT_ALM | uPD98402_INT_RFO | + uPD98402_INT_LOS),PIMR); /* enable them */ + (void) fetch_stats(dev,NULL,1); /* clear kernel counters */ +- atomic_set(&PRIV(dev)->sonet_stats.corr_hcs,-1); +- atomic_set(&PRIV(dev)->sonet_stats.tx_cells,-1); +- atomic_set(&PRIV(dev)->sonet_stats.rx_cells,-1); ++ atomic_set_unchecked(&PRIV(dev)->sonet_stats.corr_hcs,-1); ++ atomic_set_unchecked(&PRIV(dev)->sonet_stats.tx_cells,-1); ++ atomic_set_unchecked(&PRIV(dev)->sonet_stats.rx_cells,-1); + return 0; + } + +diff --git a/drivers/atm/zatm.c b/drivers/atm/zatm.c +index 969c3c2..9b72956 100644 +--- a/drivers/atm/zatm.c ++++ b/drivers/atm/zatm.c +@@ -459,7 +459,7 @@ printk("dummy: 0x%08lx, 0x%08lx\n",dummy[0],dummy[1]); + } + if (!size) { + dev_kfree_skb_irq(skb); +- if (vcc) atomic_inc(&vcc->stats->rx_err); ++ if (vcc) atomic_inc_unchecked(&vcc->stats->rx_err); + continue; + } + if (!atm_charge(vcc,skb->truesize)) { +@@ -469,7 +469,7 @@ printk("dummy: 0x%08lx, 0x%08lx\n",dummy[0],dummy[1]); + skb->len = size; + ATM_SKB(skb)->vcc = vcc; + vcc->push(vcc,skb); +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + } + zout(pos & 0xffff,MTA(mbx)); + #if 0 /* probably a stupid idea */ +@@ -733,7 +733,7 @@ if (*ZATM_PRV_DSC(skb) != (uPD98401_TXPD_V | uPD98401_TXPD_DP | + skb_queue_head(&zatm_vcc->backlog,skb); + break; + } +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + wake_up(&zatm_vcc->tx_wait); + } + +diff --git a/drivers/base/bus.c b/drivers/base/bus.c +index 876bae5..8978785 100644 +--- a/drivers/base/bus.c ++++ b/drivers/base/bus.c +@@ -1126,7 +1126,7 @@ int subsys_interface_register(struct subsys_interface *sif) + return -EINVAL; + + mutex_lock(&subsys->p->mutex); +- list_add_tail(&sif->node, &subsys->p->interfaces); ++ pax_list_add_tail((struct list_head *)&sif->node, &subsys->p->interfaces); + if (sif->add_dev) { + subsys_dev_iter_init(&iter, subsys, NULL, NULL); + while ((dev = subsys_dev_iter_next(&iter))) +@@ -1151,7 +1151,7 @@ void subsys_interface_unregister(struct subsys_interface *sif) + subsys = sif->subsys; + + mutex_lock(&subsys->p->mutex); +- list_del_init(&sif->node); ++ pax_list_del_init((struct list_head *)&sif->node); + if (sif->remove_dev) { + subsys_dev_iter_init(&iter, subsys, NULL, NULL); + while ((dev = subsys_dev_iter_next(&iter))) +diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c +index 25798db..15f130e 100644 +--- a/drivers/base/devtmpfs.c ++++ b/drivers/base/devtmpfs.c +@@ -354,7 +354,7 @@ int devtmpfs_mount(const char *mntdir) + if (!thread) + return 0; + +- err = sys_mount("devtmpfs", (char *)mntdir, "devtmpfs", MS_SILENT, NULL); ++ err = sys_mount((char __force_user *)"devtmpfs", (char __force_user *)mntdir, (char __force_user *)"devtmpfs", MS_SILENT, NULL); + if (err) + printk(KERN_INFO "devtmpfs: error mounting %i\n", err); + else +@@ -380,11 +380,11 @@ static int devtmpfsd(void *p) + *err = sys_unshare(CLONE_NEWNS); + if (*err) + goto out; +- *err = sys_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, options); ++ *err = sys_mount((char __force_user *)"devtmpfs", (char __force_user *)"/", (char __force_user *)"devtmpfs", MS_SILENT, (char __force_user *)options); + if (*err) + goto out; +- sys_chdir("/.."); /* will traverse into overmounted root */ +- sys_chroot("."); ++ sys_chdir((char __force_user *)"/.."); /* will traverse into overmounted root */ ++ sys_chroot((char __force_user *)"."); + complete(&setup_done); + while (1) { + spin_lock(&req_lock); +diff --git a/drivers/base/node.c b/drivers/base/node.c +index 472168c..4af587e 100644 +--- a/drivers/base/node.c ++++ b/drivers/base/node.c +@@ -620,7 +620,7 @@ static ssize_t print_nodes_state(enum node_states state, char *buf) + struct node_attr { + struct device_attribute attr; + enum node_states state; +-}; ++} __do_const; + + static ssize_t show_node_state(struct device *dev, + struct device_attribute *attr, char *buf) +diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c +index fb83d4a..e1797b3 100644 +--- a/drivers/base/power/domain.c ++++ b/drivers/base/power/domain.c +@@ -1725,7 +1725,7 @@ int pm_genpd_attach_cpuidle(struct generic_pm_domain *genpd, int state) + { + struct cpuidle_driver *cpuidle_drv; + struct gpd_cpuidle_data *cpuidle_data; +- struct cpuidle_state *idle_state; ++ cpuidle_state_no_const *idle_state; + int ret = 0; + + if (IS_ERR_OR_NULL(genpd) || state < 0) +@@ -1793,7 +1793,7 @@ int pm_genpd_name_attach_cpuidle(const char *name, int state) + int pm_genpd_detach_cpuidle(struct generic_pm_domain *genpd) + { + struct gpd_cpuidle_data *cpuidle_data; +- struct cpuidle_state *idle_state; ++ cpuidle_state_no_const *idle_state; + int ret = 0; + + if (IS_ERR_OR_NULL(genpd)) +@@ -2215,7 +2215,9 @@ int genpd_dev_pm_attach(struct device *dev) + return ret; + } + +- dev->pm_domain->detach = genpd_dev_pm_detach; ++ pax_open_kernel(); ++ *(void **)&dev->pm_domain->detach = genpd_dev_pm_detach; ++ pax_close_kernel(); + + return 0; + } +diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c +index a9d26ed..74b8405 100644 +--- a/drivers/base/power/sysfs.c ++++ b/drivers/base/power/sysfs.c +@@ -182,7 +182,7 @@ static ssize_t rtpm_status_show(struct device *dev, + return -EIO; + } + } +- return sprintf(buf, p); ++ return sprintf(buf, "%s", p); + } + + static DEVICE_ATTR(runtime_status, 0444, rtpm_status_show, NULL); +diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c +index c2744b3..08fac19 100644 +--- a/drivers/base/power/wakeup.c ++++ b/drivers/base/power/wakeup.c +@@ -32,14 +32,14 @@ static bool pm_abort_suspend __read_mostly; + * They need to be modified together atomically, so it's better to use one + * atomic variable to hold them both. + */ +-static atomic_t combined_event_count = ATOMIC_INIT(0); ++static atomic_unchecked_t combined_event_count = ATOMIC_INIT(0); + + #define IN_PROGRESS_BITS (sizeof(int) * 4) + #define MAX_IN_PROGRESS ((1 << IN_PROGRESS_BITS) - 1) + + static void split_counters(unsigned int *cnt, unsigned int *inpr) + { +- unsigned int comb = atomic_read(&combined_event_count); ++ unsigned int comb = atomic_read_unchecked(&combined_event_count); + + *cnt = (comb >> IN_PROGRESS_BITS); + *inpr = comb & MAX_IN_PROGRESS; +@@ -404,7 +404,7 @@ static void wakeup_source_activate(struct wakeup_source *ws) + ws->start_prevent_time = ws->last_time; + + /* Increment the counter of events in progress. */ +- cec = atomic_inc_return(&combined_event_count); ++ cec = atomic_inc_return_unchecked(&combined_event_count); + + trace_wakeup_source_activate(ws->name, cec); + } +@@ -530,7 +530,7 @@ static void wakeup_source_deactivate(struct wakeup_source *ws) + * Increment the counter of registered wakeup events and decrement the + * couter of wakeup events in progress simultaneously. + */ +- cec = atomic_add_return(MAX_IN_PROGRESS, &combined_event_count); ++ cec = atomic_add_return_unchecked(MAX_IN_PROGRESS, &combined_event_count); + trace_wakeup_source_deactivate(ws->name, cec); + + split_counters(&cnt, &inpr); +diff --git a/drivers/base/syscore.c b/drivers/base/syscore.c +index 8d98a32..61d3165 100644 +--- a/drivers/base/syscore.c ++++ b/drivers/base/syscore.c +@@ -22,7 +22,7 @@ static DEFINE_MUTEX(syscore_ops_lock); + void register_syscore_ops(struct syscore_ops *ops) + { + mutex_lock(&syscore_ops_lock); +- list_add_tail(&ops->node, &syscore_ops_list); ++ pax_list_add_tail((struct list_head *)&ops->node, &syscore_ops_list); + mutex_unlock(&syscore_ops_lock); + } + EXPORT_SYMBOL_GPL(register_syscore_ops); +@@ -34,7 +34,7 @@ EXPORT_SYMBOL_GPL(register_syscore_ops); + void unregister_syscore_ops(struct syscore_ops *ops) + { + mutex_lock(&syscore_ops_lock); +- list_del(&ops->node); ++ pax_list_del((struct list_head *)&ops->node); + mutex_unlock(&syscore_ops_lock); + } + EXPORT_SYMBOL_GPL(unregister_syscore_ops); +diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c +index ff20f19..018f1da 100644 +--- a/drivers/block/cciss.c ++++ b/drivers/block/cciss.c +@@ -3008,7 +3008,7 @@ static void start_io(ctlr_info_t *h) + while (!list_empty(&h->reqQ)) { + c = list_entry(h->reqQ.next, CommandList_struct, list); + /* can't do anything if fifo is full */ +- if ((h->access.fifo_full(h))) { ++ if ((h->access->fifo_full(h))) { + dev_warn(&h->pdev->dev, "fifo full\n"); + break; + } +@@ -3018,7 +3018,7 @@ static void start_io(ctlr_info_t *h) + h->Qdepth--; + + /* Tell the controller execute command */ +- h->access.submit_command(h, c); ++ h->access->submit_command(h, c); + + /* Put job onto the completed Q */ + addQ(&h->cmpQ, c); +@@ -3444,17 +3444,17 @@ startio: + + static inline unsigned long get_next_completion(ctlr_info_t *h) + { +- return h->access.command_completed(h); ++ return h->access->command_completed(h); + } + + static inline int interrupt_pending(ctlr_info_t *h) + { +- return h->access.intr_pending(h); ++ return h->access->intr_pending(h); + } + + static inline long interrupt_not_for_us(ctlr_info_t *h) + { +- return ((h->access.intr_pending(h) == 0) || ++ return ((h->access->intr_pending(h) == 0) || + (h->interrupts_enabled == 0)); + } + +@@ -3487,7 +3487,7 @@ static inline u32 next_command(ctlr_info_t *h) + u32 a; + + if (unlikely(!(h->transMethod & CFGTBL_Trans_Performant))) +- return h->access.command_completed(h); ++ return h->access->command_completed(h); + + if ((*(h->reply_pool_head) & 1) == (h->reply_pool_wraparound)) { + a = *(h->reply_pool_head); /* Next cmd in ring buffer */ +@@ -4044,7 +4044,7 @@ static void cciss_put_controller_into_performant_mode(ctlr_info_t *h) + trans_support & CFGTBL_Trans_use_short_tags); + + /* Change the access methods to the performant access methods */ +- h->access = SA5_performant_access; ++ h->access = &SA5_performant_access; + h->transMethod = CFGTBL_Trans_Performant; + + return; +@@ -4318,7 +4318,7 @@ static int cciss_pci_init(ctlr_info_t *h) + if (prod_index < 0) + return -ENODEV; + h->product_name = products[prod_index].product_name; +- h->access = *(products[prod_index].access); ++ h->access = products[prod_index].access; + + if (cciss_board_disabled(h)) { + dev_warn(&h->pdev->dev, "controller appears to be disabled\n"); +@@ -5050,7 +5050,7 @@ reinit_after_soft_reset: + } + + /* make sure the board interrupts are off */ +- h->access.set_intr_mask(h, CCISS_INTR_OFF); ++ h->access->set_intr_mask(h, CCISS_INTR_OFF); + rc = cciss_request_irq(h, do_cciss_msix_intr, do_cciss_intx); + if (rc) + goto clean2; +@@ -5100,7 +5100,7 @@ reinit_after_soft_reset: + * fake ones to scoop up any residual completions. + */ + spin_lock_irqsave(&h->lock, flags); +- h->access.set_intr_mask(h, CCISS_INTR_OFF); ++ h->access->set_intr_mask(h, CCISS_INTR_OFF); + spin_unlock_irqrestore(&h->lock, flags); + free_irq(h->intr[h->intr_mode], h); + rc = cciss_request_irq(h, cciss_msix_discard_completions, +@@ -5120,9 +5120,9 @@ reinit_after_soft_reset: + dev_info(&h->pdev->dev, "Board READY.\n"); + dev_info(&h->pdev->dev, + "Waiting for stale completions to drain.\n"); +- h->access.set_intr_mask(h, CCISS_INTR_ON); ++ h->access->set_intr_mask(h, CCISS_INTR_ON); + msleep(10000); +- h->access.set_intr_mask(h, CCISS_INTR_OFF); ++ h->access->set_intr_mask(h, CCISS_INTR_OFF); + + rc = controller_reset_failed(h->cfgtable); + if (rc) +@@ -5145,7 +5145,7 @@ reinit_after_soft_reset: + cciss_scsi_setup(h); + + /* Turn the interrupts on so we can service requests */ +- h->access.set_intr_mask(h, CCISS_INTR_ON); ++ h->access->set_intr_mask(h, CCISS_INTR_ON); + + /* Get the firmware version */ + inq_buff = kzalloc(sizeof(InquiryData_struct), GFP_KERNEL); +@@ -5217,7 +5217,7 @@ static void cciss_shutdown(struct pci_dev *pdev) + kfree(flush_buf); + if (return_code != IO_OK) + dev_warn(&h->pdev->dev, "Error flushing cache\n"); +- h->access.set_intr_mask(h, CCISS_INTR_OFF); ++ h->access->set_intr_mask(h, CCISS_INTR_OFF); + free_irq(h->intr[h->intr_mode], h); + } + +diff --git a/drivers/block/cciss.h b/drivers/block/cciss.h +index 7fda30e..2f27946 100644 +--- a/drivers/block/cciss.h ++++ b/drivers/block/cciss.h +@@ -101,7 +101,7 @@ struct ctlr_info + /* information about each logical volume */ + drive_info_struct *drv[CISS_MAX_LUN]; + +- struct access_method access; ++ struct access_method *access; + + /* queue and queue Info */ + struct list_head reqQ; +@@ -402,27 +402,27 @@ static bool SA5_performant_intr_pending(ctlr_info_t *h) + } + + static struct access_method SA5_access = { +- SA5_submit_command, +- SA5_intr_mask, +- SA5_fifo_full, +- SA5_intr_pending, +- SA5_completed, ++ .submit_command = SA5_submit_command, ++ .set_intr_mask = SA5_intr_mask, ++ .fifo_full = SA5_fifo_full, ++ .intr_pending = SA5_intr_pending, ++ .command_completed = SA5_completed, + }; + + static struct access_method SA5B_access = { +- SA5_submit_command, +- SA5B_intr_mask, +- SA5_fifo_full, +- SA5B_intr_pending, +- SA5_completed, ++ .submit_command = SA5_submit_command, ++ .set_intr_mask = SA5B_intr_mask, ++ .fifo_full = SA5_fifo_full, ++ .intr_pending = SA5B_intr_pending, ++ .command_completed = SA5_completed, + }; + + static struct access_method SA5_performant_access = { +- SA5_submit_command, +- SA5_performant_intr_mask, +- SA5_fifo_full, +- SA5_performant_intr_pending, +- SA5_performant_completed, ++ .submit_command = SA5_submit_command, ++ .set_intr_mask = SA5_performant_intr_mask, ++ .fifo_full = SA5_fifo_full, ++ .intr_pending = SA5_performant_intr_pending, ++ .command_completed = SA5_performant_completed, + }; + + struct board_type { +diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c +index 2b94403..fd6ad1f 100644 +--- a/drivers/block/cpqarray.c ++++ b/drivers/block/cpqarray.c +@@ -404,7 +404,7 @@ static int cpqarray_register_ctlr(int i, struct pci_dev *pdev) + if (register_blkdev(COMPAQ_SMART2_MAJOR+i, hba[i]->devname)) { + goto Enomem4; + } +- hba[i]->access.set_intr_mask(hba[i], 0); ++ hba[i]->access->set_intr_mask(hba[i], 0); + if (request_irq(hba[i]->intr, do_ida_intr, + IRQF_DISABLED|IRQF_SHARED, hba[i]->devname, hba[i])) + { +@@ -459,7 +459,7 @@ static int cpqarray_register_ctlr(int i, struct pci_dev *pdev) + add_timer(&hba[i]->timer); + + /* Enable IRQ now that spinlock and rate limit timer are set up */ +- hba[i]->access.set_intr_mask(hba[i], FIFO_NOT_EMPTY); ++ hba[i]->access->set_intr_mask(hba[i], FIFO_NOT_EMPTY); + + for(j=0; j<NWD; j++) { + struct gendisk *disk = ida_gendisk[i][j]; +@@ -694,7 +694,7 @@ DBGINFO( + for(i=0; i<NR_PRODUCTS; i++) { + if (board_id == products[i].board_id) { + c->product_name = products[i].product_name; +- c->access = *(products[i].access); ++ c->access = products[i].access; + break; + } + } +@@ -792,7 +792,7 @@ static int cpqarray_eisa_detect(void) + hba[ctlr]->intr = intr; + sprintf(hba[ctlr]->devname, "ida%d", nr_ctlr); + hba[ctlr]->product_name = products[j].product_name; +- hba[ctlr]->access = *(products[j].access); ++ hba[ctlr]->access = products[j].access; + hba[ctlr]->ctlr = ctlr; + hba[ctlr]->board_id = board_id; + hba[ctlr]->pci_dev = NULL; /* not PCI */ +@@ -978,7 +978,7 @@ static void start_io(ctlr_info_t *h) + + while((c = h->reqQ) != NULL) { + /* Can't do anything if we're busy */ +- if (h->access.fifo_full(h) == 0) ++ if (h->access->fifo_full(h) == 0) + return; + + /* Get the first entry from the request Q */ +@@ -986,7 +986,7 @@ static void start_io(ctlr_info_t *h) + h->Qdepth--; + + /* Tell the controller to do our bidding */ +- h->access.submit_command(h, c); ++ h->access->submit_command(h, c); + + /* Get onto the completion Q */ + addQ(&h->cmpQ, c); +@@ -1048,7 +1048,7 @@ static irqreturn_t do_ida_intr(int irq, void *dev_id) + unsigned long flags; + __u32 a,a1; + +- istat = h->access.intr_pending(h); ++ istat = h->access->intr_pending(h); + /* Is this interrupt for us? */ + if (istat == 0) + return IRQ_NONE; +@@ -1059,7 +1059,7 @@ static irqreturn_t do_ida_intr(int irq, void *dev_id) + */ + spin_lock_irqsave(IDA_LOCK(h->ctlr), flags); + if (istat & FIFO_NOT_EMPTY) { +- while((a = h->access.command_completed(h))) { ++ while((a = h->access->command_completed(h))) { + a1 = a; a &= ~3; + if ((c = h->cmpQ) == NULL) + { +@@ -1448,11 +1448,11 @@ static int sendcmd( + /* + * Disable interrupt + */ +- info_p->access.set_intr_mask(info_p, 0); ++ info_p->access->set_intr_mask(info_p, 0); + /* Make sure there is room in the command FIFO */ + /* Actually it should be completely empty at this time. */ + for (i = 200000; i > 0; i--) { +- temp = info_p->access.fifo_full(info_p); ++ temp = info_p->access->fifo_full(info_p); + if (temp != 0) { + break; + } +@@ -1465,7 +1465,7 @@ DBG( + /* + * Send the cmd + */ +- info_p->access.submit_command(info_p, c); ++ info_p->access->submit_command(info_p, c); + complete = pollcomplete(ctlr); + + pci_unmap_single(info_p->pci_dev, (dma_addr_t) c->req.sg[0].addr, +@@ -1548,9 +1548,9 @@ static int revalidate_allvol(ctlr_info_t *host) + * we check the new geometry. Then turn interrupts back on when + * we're done. + */ +- host->access.set_intr_mask(host, 0); ++ host->access->set_intr_mask(host, 0); + getgeometry(ctlr); +- host->access.set_intr_mask(host, FIFO_NOT_EMPTY); ++ host->access->set_intr_mask(host, FIFO_NOT_EMPTY); + + for(i=0; i<NWD; i++) { + struct gendisk *disk = ida_gendisk[ctlr][i]; +@@ -1590,7 +1590,7 @@ static int pollcomplete(int ctlr) + /* Wait (up to 2 seconds) for a command to complete */ + + for (i = 200000; i > 0; i--) { +- done = hba[ctlr]->access.command_completed(hba[ctlr]); ++ done = hba[ctlr]->access->command_completed(hba[ctlr]); + if (done == 0) { + udelay(10); /* a short fixed delay */ + } else +diff --git a/drivers/block/cpqarray.h b/drivers/block/cpqarray.h +index be73e9d..7fbf140 100644 +--- a/drivers/block/cpqarray.h ++++ b/drivers/block/cpqarray.h +@@ -99,7 +99,7 @@ struct ctlr_info { + drv_info_t drv[NWD]; + struct proc_dir_entry *proc; + +- struct access_method access; ++ struct access_method *access; + + cmdlist_t *reqQ; + cmdlist_t *cmpQ; +diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c +index 434c77d..6d3219a 100644 +--- a/drivers/block/drbd/drbd_bitmap.c ++++ b/drivers/block/drbd/drbd_bitmap.c +@@ -1036,7 +1036,7 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho + submit_bio(rw, bio); + /* this should not count as user activity and cause the + * resync to throttle -- see drbd_rs_should_slow_down(). */ +- atomic_add(len >> 9, &device->rs_sect_ev); ++ atomic_add_unchecked(len >> 9, &device->rs_sect_ev); + } + } + +diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h +index 9b22f8f..f2932af 100644 +--- a/drivers/block/drbd/drbd_int.h ++++ b/drivers/block/drbd/drbd_int.h +@@ -385,7 +385,7 @@ struct drbd_epoch { + struct drbd_connection *connection; + struct list_head list; + unsigned int barrier_nr; +- atomic_t epoch_size; /* increased on every request added. */ ++ atomic_unchecked_t epoch_size; /* increased on every request added. */ + atomic_t active; /* increased on every req. added, and dec on every finished. */ + unsigned long flags; + }; +@@ -946,7 +946,7 @@ struct drbd_device { + unsigned int al_tr_number; + int al_tr_cycle; + wait_queue_head_t seq_wait; +- atomic_t packet_seq; ++ atomic_unchecked_t packet_seq; + unsigned int peer_seq; + spinlock_t peer_seq_lock; + unsigned long comm_bm_set; /* communicated number of set bits. */ +@@ -955,8 +955,8 @@ struct drbd_device { + struct mutex own_state_mutex; + struct mutex *state_mutex; /* either own_state_mutex or first_peer_device(device)->connection->cstate_mutex */ + char congestion_reason; /* Why we where congested... */ +- atomic_t rs_sect_in; /* for incoming resync data rate, SyncTarget */ +- atomic_t rs_sect_ev; /* for submitted resync data rate, both */ ++ atomic_unchecked_t rs_sect_in; /* for incoming resync data rate, SyncTarget */ ++ atomic_unchecked_t rs_sect_ev; /* for submitted resync data rate, both */ + int rs_last_sect_ev; /* counter to compare with */ + int rs_last_events; /* counter of read or write "events" (unit sectors) + * on the lower level device when we last looked. */ +@@ -1567,7 +1567,7 @@ static inline int drbd_setsockopt(struct socket *sock, int level, int optname, + char __user *uoptval; + int err; + +- uoptval = (char __user __force *)optval; ++ uoptval = (char __force_user *)optval; + + set_fs(KERNEL_DS); + if (level == SOL_SOCKET) +diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c +index 973c185..05d8b1a 100644 +--- a/drivers/block/drbd/drbd_main.c ++++ b/drivers/block/drbd/drbd_main.c +@@ -1328,7 +1328,7 @@ static int _drbd_send_ack(struct drbd_peer_device *peer_device, enum drbd_packet + p->sector = sector; + p->block_id = block_id; + p->blksize = blksize; +- p->seq_num = cpu_to_be32(atomic_inc_return(&peer_device->device->packet_seq)); ++ p->seq_num = cpu_to_be32(atomic_inc_return_unchecked(&peer_device->device->packet_seq)); + return drbd_send_command(peer_device, sock, cmd, sizeof(*p), NULL, 0); + } + +@@ -1634,7 +1634,7 @@ int drbd_send_dblock(struct drbd_peer_device *peer_device, struct drbd_request * + return -EIO; + p->sector = cpu_to_be64(req->i.sector); + p->block_id = (unsigned long)req; +- p->seq_num = cpu_to_be32(atomic_inc_return(&device->packet_seq)); ++ p->seq_num = cpu_to_be32(atomic_inc_return_unchecked(&device->packet_seq)); + dp_flags = bio_flags_to_wire(peer_device->connection, req->master_bio->bi_rw); + if (device->state.conn >= C_SYNC_SOURCE && + device->state.conn <= C_PAUSED_SYNC_T) +@@ -1915,8 +1915,8 @@ void drbd_init_set_defaults(struct drbd_device *device) + atomic_set(&device->unacked_cnt, 0); + atomic_set(&device->local_cnt, 0); + atomic_set(&device->pp_in_use_by_net, 0); +- atomic_set(&device->rs_sect_in, 0); +- atomic_set(&device->rs_sect_ev, 0); ++ atomic_set_unchecked(&device->rs_sect_in, 0); ++ atomic_set_unchecked(&device->rs_sect_ev, 0); + atomic_set(&device->ap_in_flight, 0); + atomic_set(&device->md_io.in_use, 0); + +@@ -2688,8 +2688,8 @@ void drbd_destroy_connection(struct kref *kref) + struct drbd_connection *connection = container_of(kref, struct drbd_connection, kref); + struct drbd_resource *resource = connection->resource; + +- if (atomic_read(&connection->current_epoch->epoch_size) != 0) +- drbd_err(connection, "epoch_size:%d\n", atomic_read(&connection->current_epoch->epoch_size)); ++ if (atomic_read_unchecked(&connection->current_epoch->epoch_size) != 0) ++ drbd_err(connection, "epoch_size:%d\n", atomic_read_unchecked(&connection->current_epoch->epoch_size)); + kfree(connection->current_epoch); + + idr_destroy(&connection->peer_devices); +diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c +index 1cd47df..57c53c0 100644 +--- a/drivers/block/drbd/drbd_nl.c ++++ b/drivers/block/drbd/drbd_nl.c +@@ -3645,13 +3645,13 @@ finish: + + void drbd_bcast_event(struct drbd_device *device, const struct sib_info *sib) + { +- static atomic_t drbd_genl_seq = ATOMIC_INIT(2); /* two. */ ++ static atomic_unchecked_t drbd_genl_seq = ATOMIC_INIT(2); /* two. */ + struct sk_buff *msg; + struct drbd_genlmsghdr *d_out; + unsigned seq; + int err = -ENOMEM; + +- seq = atomic_inc_return(&drbd_genl_seq); ++ seq = atomic_inc_return_unchecked(&drbd_genl_seq); + msg = genlmsg_new(NLMSG_GOODSIZE, GFP_NOIO); + if (!msg) + goto failed; +diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c +index 6960fb0..215d76b 100644 +--- a/drivers/block/drbd/drbd_receiver.c ++++ b/drivers/block/drbd/drbd_receiver.c +@@ -870,7 +870,7 @@ int drbd_connected(struct drbd_peer_device *peer_device) + struct drbd_device *device = peer_device->device; + int err; + +- atomic_set(&device->packet_seq, 0); ++ atomic_set_unchecked(&device->packet_seq, 0); + device->peer_seq = 0; + + device->state_mutex = peer_device->connection->agreed_pro_version < 100 ? +@@ -1233,7 +1233,7 @@ static enum finish_epoch drbd_may_finish_epoch(struct drbd_connection *connectio + do { + next_epoch = NULL; + +- epoch_size = atomic_read(&epoch->epoch_size); ++ epoch_size = atomic_read_unchecked(&epoch->epoch_size); + + switch (ev & ~EV_CLEANUP) { + case EV_PUT: +@@ -1273,7 +1273,7 @@ static enum finish_epoch drbd_may_finish_epoch(struct drbd_connection *connectio + rv = FE_DESTROYED; + } else { + epoch->flags = 0; +- atomic_set(&epoch->epoch_size, 0); ++ atomic_set_unchecked(&epoch->epoch_size, 0); + /* atomic_set(&epoch->active, 0); is already zero */ + if (rv == FE_STILL_LIVE) + rv = FE_RECYCLED; +@@ -1550,7 +1550,7 @@ static int receive_Barrier(struct drbd_connection *connection, struct packet_inf + conn_wait_active_ee_empty(connection); + drbd_flush(connection); + +- if (atomic_read(&connection->current_epoch->epoch_size)) { ++ if (atomic_read_unchecked(&connection->current_epoch->epoch_size)) { + epoch = kmalloc(sizeof(struct drbd_epoch), GFP_NOIO); + if (epoch) + break; +@@ -1564,11 +1564,11 @@ static int receive_Barrier(struct drbd_connection *connection, struct packet_inf + } + + epoch->flags = 0; +- atomic_set(&epoch->epoch_size, 0); ++ atomic_set_unchecked(&epoch->epoch_size, 0); + atomic_set(&epoch->active, 0); + + spin_lock(&connection->epoch_lock); +- if (atomic_read(&connection->current_epoch->epoch_size)) { ++ if (atomic_read_unchecked(&connection->current_epoch->epoch_size)) { + list_add(&epoch->list, &connection->current_epoch->list); + connection->current_epoch = epoch; + connection->epochs++; +@@ -1802,7 +1802,7 @@ static int recv_resync_read(struct drbd_peer_device *peer_device, sector_t secto + list_add_tail(&peer_req->w.list, &device->sync_ee); + spin_unlock_irq(&device->resource->req_lock); + +- atomic_add(pi->size >> 9, &device->rs_sect_ev); ++ atomic_add_unchecked(pi->size >> 9, &device->rs_sect_ev); + if (drbd_submit_peer_request(device, peer_req, WRITE, DRBD_FAULT_RS_WR) == 0) + return 0; + +@@ -1900,7 +1900,7 @@ static int receive_RSDataReply(struct drbd_connection *connection, struct packet + drbd_send_ack_dp(peer_device, P_NEG_ACK, p, pi->size); + } + +- atomic_add(pi->size >> 9, &device->rs_sect_in); ++ atomic_add_unchecked(pi->size >> 9, &device->rs_sect_in); + + return err; + } +@@ -2290,7 +2290,7 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * + + err = wait_for_and_update_peer_seq(peer_device, peer_seq); + drbd_send_ack_dp(peer_device, P_NEG_ACK, p, pi->size); +- atomic_inc(&connection->current_epoch->epoch_size); ++ atomic_inc_unchecked(&connection->current_epoch->epoch_size); + err2 = drbd_drain_block(peer_device, pi->size); + if (!err) + err = err2; +@@ -2334,7 +2334,7 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * + + spin_lock(&connection->epoch_lock); + peer_req->epoch = connection->current_epoch; +- atomic_inc(&peer_req->epoch->epoch_size); ++ atomic_inc_unchecked(&peer_req->epoch->epoch_size); + atomic_inc(&peer_req->epoch->active); + spin_unlock(&connection->epoch_lock); + +@@ -2479,7 +2479,7 @@ bool drbd_rs_c_min_rate_throttle(struct drbd_device *device) + + curr_events = (int)part_stat_read(&disk->part0, sectors[0]) + + (int)part_stat_read(&disk->part0, sectors[1]) - +- atomic_read(&device->rs_sect_ev); ++ atomic_read_unchecked(&device->rs_sect_ev); + + if (atomic_read(&device->ap_actlog_cnt) + || !device->rs_last_events || curr_events - device->rs_last_events > 64) { +@@ -2618,7 +2618,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet + device->use_csums = true; + } else if (pi->cmd == P_OV_REPLY) { + /* track progress, we may need to throttle */ +- atomic_add(size >> 9, &device->rs_sect_in); ++ atomic_add_unchecked(size >> 9, &device->rs_sect_in); + peer_req->w.cb = w_e_end_ov_reply; + dec_rs_pending(device); + /* drbd_rs_begin_io done when we sent this request, +@@ -2691,7 +2691,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet + goto out_free_e; + + submit_for_resync: +- atomic_add(size >> 9, &device->rs_sect_ev); ++ atomic_add_unchecked(size >> 9, &device->rs_sect_ev); + + submit: + update_receiver_timing_details(connection, drbd_submit_peer_request); +@@ -4564,7 +4564,7 @@ struct data_cmd { + int expect_payload; + size_t pkt_size; + int (*fn)(struct drbd_connection *, struct packet_info *); +-}; ++} __do_const; + + static struct data_cmd drbd_cmd_handler[] = { + [P_DATA] = { 1, sizeof(struct p_data), receive_Data }, +@@ -4678,7 +4678,7 @@ static void conn_disconnect(struct drbd_connection *connection) + if (!list_empty(&connection->current_epoch->list)) + drbd_err(connection, "ASSERTION FAILED: connection->current_epoch->list not empty\n"); + /* ok, no more ee's on the fly, it is safe to reset the epoch_size */ +- atomic_set(&connection->current_epoch->epoch_size, 0); ++ atomic_set_unchecked(&connection->current_epoch->epoch_size, 0); + connection->send.seen_any_write_yet = false; + + drbd_info(connection, "Connection closed\n"); +@@ -5182,7 +5182,7 @@ static int got_IsInSync(struct drbd_connection *connection, struct packet_info * + put_ldev(device); + } + dec_rs_pending(device); +- atomic_add(blksize >> 9, &device->rs_sect_in); ++ atomic_add_unchecked(blksize >> 9, &device->rs_sect_in); + + return 0; + } +@@ -5470,7 +5470,7 @@ static int connection_finish_peer_reqs(struct drbd_connection *connection) + struct asender_cmd { + size_t pkt_size; + int (*fn)(struct drbd_connection *connection, struct packet_info *); +-}; ++} __do_const; + + static struct asender_cmd asender_tbl[] = { + [P_PING] = { 0, got_Ping }, +diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c +index d2d1f97..6a1188f 100644 +--- a/drivers/block/drbd/drbd_worker.c ++++ b/drivers/block/drbd/drbd_worker.c +@@ -408,7 +408,7 @@ static int read_for_csum(struct drbd_peer_device *peer_device, sector_t sector, + list_add_tail(&peer_req->w.list, &device->read_ee); + spin_unlock_irq(&device->resource->req_lock); + +- atomic_add(size >> 9, &device->rs_sect_ev); ++ atomic_add_unchecked(size >> 9, &device->rs_sect_ev); + if (drbd_submit_peer_request(device, peer_req, READ, DRBD_FAULT_RS_RD) == 0) + return 0; + +@@ -553,7 +553,7 @@ static int drbd_rs_number_requests(struct drbd_device *device) + unsigned int sect_in; /* Number of sectors that came in since the last turn */ + int number, mxb; + +- sect_in = atomic_xchg(&device->rs_sect_in, 0); ++ sect_in = atomic_xchg_unchecked(&device->rs_sect_in, 0); + device->rs_in_flight -= sect_in; + + rcu_read_lock(); +@@ -1594,8 +1594,8 @@ void drbd_rs_controller_reset(struct drbd_device *device) + { + struct fifo_buffer *plan; + +- atomic_set(&device->rs_sect_in, 0); +- atomic_set(&device->rs_sect_ev, 0); ++ atomic_set_unchecked(&device->rs_sect_in, 0); ++ atomic_set_unchecked(&device->rs_sect_ev, 0); + device->rs_in_flight = 0; + + /* Updating the RCU protected object in place is necessary since +diff --git a/drivers/block/loop.c b/drivers/block/loop.c +index 6cb1beb..bf490f7 100644 +--- a/drivers/block/loop.c ++++ b/drivers/block/loop.c +@@ -232,7 +232,7 @@ static int __do_lo_send_write(struct file *file, + + file_start_write(file); + set_fs(get_ds()); +- bw = file->f_op->write(file, buf, len, &pos); ++ bw = file->f_op->write(file, (const char __force_user *)buf, len, &pos); + set_fs(old_fs); + file_end_write(file); + if (likely(bw == len)) +diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c +index e2bb8af..44b8aef 100644 +--- a/drivers/block/nvme-core.c ++++ b/drivers/block/nvme-core.c +@@ -73,7 +73,6 @@ static LIST_HEAD(dev_list); + static struct task_struct *nvme_thread; + static struct workqueue_struct *nvme_workq; + static wait_queue_head_t nvme_kthread_wait; +-static struct notifier_block nvme_nb; + + static void nvme_reset_failed_dev(struct work_struct *ws); + +@@ -2926,6 +2925,10 @@ static struct pci_driver nvme_driver = { + .err_handler = &nvme_err_handler, + }; + ++static struct notifier_block nvme_nb = { ++ .notifier_call = &nvme_cpu_notify, ++}; ++ + static int __init nvme_init(void) + { + int result; +@@ -2942,7 +2945,6 @@ static int __init nvme_init(void) + else if (result > 0) + nvme_major = result; + +- nvme_nb.notifier_call = &nvme_cpu_notify; + result = register_hotcpu_notifier(&nvme_nb); + if (result) + goto unregister_blkdev; +diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c +index 09e628da..7607aaa 100644 +--- a/drivers/block/pktcdvd.c ++++ b/drivers/block/pktcdvd.c +@@ -108,7 +108,7 @@ static int pkt_seq_show(struct seq_file *m, void *p); + + static sector_t get_zone(sector_t sector, struct pktcdvd_device *pd) + { +- return (sector + pd->offset) & ~(sector_t)(pd->settings.size - 1); ++ return (sector + pd->offset) & ~(sector_t)(pd->settings.size - 1UL); + } + + /* +@@ -1890,7 +1890,7 @@ static noinline_for_stack int pkt_probe_settings(struct pktcdvd_device *pd) + return -EROFS; + } + pd->settings.fp = ti.fp; +- pd->offset = (be32_to_cpu(ti.track_start) << 2) & (pd->settings.size - 1); ++ pd->offset = (be32_to_cpu(ti.track_start) << 2) & (pd->settings.size - 1UL); + + if (ti.nwa_v) { + pd->nwa = be32_to_cpu(ti.next_writable); +diff --git a/drivers/block/smart1,2.h b/drivers/block/smart1,2.h +index e5565fb..71be10b4 100644 +--- a/drivers/block/smart1,2.h ++++ b/drivers/block/smart1,2.h +@@ -108,11 +108,11 @@ static unsigned long smart4_intr_pending(ctlr_info_t *h) + } + + static struct access_method smart4_access = { +- smart4_submit_command, +- smart4_intr_mask, +- smart4_fifo_full, +- smart4_intr_pending, +- smart4_completed, ++ .submit_command = smart4_submit_command, ++ .set_intr_mask = smart4_intr_mask, ++ .fifo_full = smart4_fifo_full, ++ .intr_pending = smart4_intr_pending, ++ .command_completed = smart4_completed, + }; + + /* +@@ -144,11 +144,11 @@ static unsigned long smart2_intr_pending(ctlr_info_t *h) + } + + static struct access_method smart2_access = { +- smart2_submit_command, +- smart2_intr_mask, +- smart2_fifo_full, +- smart2_intr_pending, +- smart2_completed, ++ .submit_command = smart2_submit_command, ++ .set_intr_mask = smart2_intr_mask, ++ .fifo_full = smart2_fifo_full, ++ .intr_pending = smart2_intr_pending, ++ .command_completed = smart2_completed, + }; + + /* +@@ -180,11 +180,11 @@ static unsigned long smart2e_intr_pending(ctlr_info_t *h) + } + + static struct access_method smart2e_access = { +- smart2e_submit_command, +- smart2e_intr_mask, +- smart2e_fifo_full, +- smart2e_intr_pending, +- smart2e_completed, ++ .submit_command = smart2e_submit_command, ++ .set_intr_mask = smart2e_intr_mask, ++ .fifo_full = smart2e_fifo_full, ++ .intr_pending = smart2e_intr_pending, ++ .command_completed = smart2e_completed, + }; + + /* +@@ -270,9 +270,9 @@ static unsigned long smart1_intr_pending(ctlr_info_t *h) + } + + static struct access_method smart1_access = { +- smart1_submit_command, +- smart1_intr_mask, +- smart1_fifo_full, +- smart1_intr_pending, +- smart1_completed, ++ .submit_command = smart1_submit_command, ++ .set_intr_mask = smart1_intr_mask, ++ .fifo_full = smart1_fifo_full, ++ .intr_pending = smart1_intr_pending, ++ .command_completed = smart1_completed, + }; +diff --git a/drivers/bluetooth/btwilink.c b/drivers/bluetooth/btwilink.c +index f038dba..bb74c08 100644 +--- a/drivers/bluetooth/btwilink.c ++++ b/drivers/bluetooth/btwilink.c +@@ -288,7 +288,7 @@ static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb) + + static int bt_ti_probe(struct platform_device *pdev) + { +- static struct ti_st *hst; ++ struct ti_st *hst; + struct hci_dev *hdev; + int err; + +diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c +index 5d28a45..a538f90 100644 +--- a/drivers/cdrom/cdrom.c ++++ b/drivers/cdrom/cdrom.c +@@ -610,7 +610,6 @@ int register_cdrom(struct cdrom_device_info *cdi) + ENSURE(reset, CDC_RESET); + ENSURE(generic_packet, CDC_GENERIC_PACKET); + cdi->mc_flags = 0; +- cdo->n_minors = 0; + cdi->options = CDO_USE_FFLAGS; + + if (autoclose == 1 && CDROM_CAN(CDC_CLOSE_TRAY)) +@@ -630,8 +629,11 @@ int register_cdrom(struct cdrom_device_info *cdi) + else + cdi->cdda_method = CDDA_OLD; + +- if (!cdo->generic_packet) +- cdo->generic_packet = cdrom_dummy_generic_packet; ++ if (!cdo->generic_packet) { ++ pax_open_kernel(); ++ *(void **)&cdo->generic_packet = cdrom_dummy_generic_packet; ++ pax_close_kernel(); ++ } + + cd_dbg(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name); + mutex_lock(&cdrom_mutex); +@@ -652,7 +654,6 @@ void unregister_cdrom(struct cdrom_device_info *cdi) + if (cdi->exit) + cdi->exit(cdi); + +- cdi->ops->n_minors--; + cd_dbg(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name); + } + +@@ -2126,7 +2127,7 @@ static int cdrom_read_cdda_old(struct cdrom_device_info *cdi, __u8 __user *ubuf, + */ + nr = nframes; + do { +- cgc.buffer = kmalloc(CD_FRAMESIZE_RAW * nr, GFP_KERNEL); ++ cgc.buffer = kzalloc(CD_FRAMESIZE_RAW * nr, GFP_KERNEL); + if (cgc.buffer) + break; + +@@ -3434,7 +3435,7 @@ static int cdrom_print_info(const char *header, int val, char *info, + struct cdrom_device_info *cdi; + int ret; + +- ret = scnprintf(info + *pos, max_size - *pos, header); ++ ret = scnprintf(info + *pos, max_size - *pos, "%s", header); + if (!ret) + return 1; + +diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c +index 584bc31..e64a12c 100644 +--- a/drivers/cdrom/gdrom.c ++++ b/drivers/cdrom/gdrom.c +@@ -491,7 +491,6 @@ static struct cdrom_device_ops gdrom_ops = { + .audio_ioctl = gdrom_audio_ioctl, + .capability = CDC_MULTI_SESSION | CDC_MEDIA_CHANGED | + CDC_RESET | CDC_DRIVE_STATUS | CDC_CD_R, +- .n_minors = 1, + }; + + static int gdrom_bdops_open(struct block_device *bdev, fmode_t mode) +diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig +index efefd12..4f1d494 100644 +--- a/drivers/char/Kconfig ++++ b/drivers/char/Kconfig +@@ -8,7 +8,8 @@ source "drivers/tty/Kconfig" + + config DEVKMEM + bool "/dev/kmem virtual device support" +- default y ++ default n ++ depends on !GRKERNSEC_KMEM + help + Say Y here if you want to support the /dev/kmem device. The + /dev/kmem device is rarely used, but can be used for certain +@@ -577,6 +578,7 @@ config DEVPORT + bool + depends on !M68K + depends on ISA || PCI ++ depends on !GRKERNSEC_KMEM + default y + + source "drivers/s390/char/Kconfig" +diff --git a/drivers/char/agp/compat_ioctl.c b/drivers/char/agp/compat_ioctl.c +index a48e05b..6bac831 100644 +--- a/drivers/char/agp/compat_ioctl.c ++++ b/drivers/char/agp/compat_ioctl.c +@@ -108,7 +108,7 @@ static int compat_agpioc_reserve_wrap(struct agp_file_private *priv, void __user + return -ENOMEM; + } + +- if (copy_from_user(usegment, (void __user *) ureserve.seg_list, ++ if (copy_from_user(usegment, (void __force_user *) ureserve.seg_list, + sizeof(*usegment) * ureserve.seg_count)) { + kfree(usegment); + kfree(ksegment); +diff --git a/drivers/char/agp/frontend.c b/drivers/char/agp/frontend.c +index 09f17eb..8531d2f 100644 +--- a/drivers/char/agp/frontend.c ++++ b/drivers/char/agp/frontend.c +@@ -806,7 +806,7 @@ static int agpioc_reserve_wrap(struct agp_file_private *priv, void __user *arg) + if (copy_from_user(&reserve, arg, sizeof(struct agp_region))) + return -EFAULT; + +- if ((unsigned) reserve.seg_count >= ~0U/sizeof(struct agp_segment)) ++ if ((unsigned) reserve.seg_count >= ~0U/sizeof(struct agp_segment_priv)) + return -EFAULT; + + client = agp_find_client_by_pid(reserve.pid); +@@ -836,7 +836,7 @@ static int agpioc_reserve_wrap(struct agp_file_private *priv, void __user *arg) + if (segment == NULL) + return -ENOMEM; + +- if (copy_from_user(segment, (void __user *) reserve.seg_list, ++ if (copy_from_user(segment, (void __force_user *) reserve.seg_list, + sizeof(struct agp_segment) * reserve.seg_count)) { + kfree(segment); + return -EFAULT; +diff --git a/drivers/char/genrtc.c b/drivers/char/genrtc.c +index 4f94375..413694e 100644 +--- a/drivers/char/genrtc.c ++++ b/drivers/char/genrtc.c +@@ -273,6 +273,7 @@ static int gen_rtc_ioctl(struct file *file, + switch (cmd) { + + case RTC_PLL_GET: ++ memset(&pll, 0, sizeof(pll)); + if (get_rtc_pll(&pll)) + return -EINVAL; + else +diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c +index d5d4cd8..22d561d 100644 +--- a/drivers/char/hpet.c ++++ b/drivers/char/hpet.c +@@ -575,7 +575,7 @@ static inline unsigned long hpet_time_div(struct hpets *hpets, + } + + static int +-hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, ++hpet_ioctl_common(struct hpet_dev *devp, unsigned int cmd, unsigned long arg, + struct hpet_info *info) + { + struct hpet_timer __iomem *timer; +diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c +index 471f985..a03fc61 100644 +--- a/drivers/char/i8k.c ++++ b/drivers/char/i8k.c +@@ -680,7 +680,7 @@ static const struct i8k_config_data i8k_config_data[] = { + }, + }; + +-static struct dmi_system_id i8k_dmi_table[] __initdata = { ++static const struct dmi_system_id i8k_dmi_table[] __initconst = { + { + .ident = "Dell Inspiron", + .matches = { +diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c +index f816211..89eadea 100644 +--- a/drivers/char/ipmi/ipmi_msghandler.c ++++ b/drivers/char/ipmi/ipmi_msghandler.c +@@ -438,7 +438,7 @@ struct ipmi_smi { + struct proc_dir_entry *proc_dir; + char proc_dir_name[10]; + +- atomic_t stats[IPMI_NUM_STATS]; ++ atomic_unchecked_t stats[IPMI_NUM_STATS]; + + /* + * run_to_completion duplicate of smb_info, smi_info +@@ -470,9 +470,9 @@ static LIST_HEAD(smi_watchers); + static DEFINE_MUTEX(smi_watchers_mutex); + + #define ipmi_inc_stat(intf, stat) \ +- atomic_inc(&(intf)->stats[IPMI_STAT_ ## stat]) ++ atomic_inc_unchecked(&(intf)->stats[IPMI_STAT_ ## stat]) + #define ipmi_get_stat(intf, stat) \ +- ((unsigned int) atomic_read(&(intf)->stats[IPMI_STAT_ ## stat])) ++ ((unsigned int) atomic_read_unchecked(&(intf)->stats[IPMI_STAT_ ## stat])) + + static int is_lan_addr(struct ipmi_addr *addr) + { +@@ -2925,7 +2925,7 @@ int ipmi_register_smi(struct ipmi_smi_handlers *handlers, + INIT_LIST_HEAD(&intf->cmd_rcvrs); + init_waitqueue_head(&intf->waitq); + for (i = 0; i < IPMI_NUM_STATS; i++) +- atomic_set(&intf->stats[i], 0); ++ atomic_set_unchecked(&intf->stats[i], 0); + + intf->proc_dir = NULL; + +diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c +index 5c4e1f6..0ea58f9 100644 +--- a/drivers/char/ipmi/ipmi_si_intf.c ++++ b/drivers/char/ipmi/ipmi_si_intf.c +@@ -285,7 +285,7 @@ struct smi_info { + unsigned char slave_addr; + + /* Counters and things for the proc filesystem. */ +- atomic_t stats[SI_NUM_STATS]; ++ atomic_unchecked_t stats[SI_NUM_STATS]; + + struct task_struct *thread; + +@@ -294,9 +294,9 @@ struct smi_info { + }; + + #define smi_inc_stat(smi, stat) \ +- atomic_inc(&(smi)->stats[SI_STAT_ ## stat]) ++ atomic_inc_unchecked(&(smi)->stats[SI_STAT_ ## stat]) + #define smi_get_stat(smi, stat) \ +- ((unsigned int) atomic_read(&(smi)->stats[SI_STAT_ ## stat])) ++ ((unsigned int) atomic_read_unchecked(&(smi)->stats[SI_STAT_ ## stat])) + + #define SI_MAX_PARMS 4 + +@@ -3377,7 +3377,7 @@ static int try_smi_init(struct smi_info *new_smi) + atomic_set(&new_smi->req_events, 0); + new_smi->run_to_completion = false; + for (i = 0; i < SI_NUM_STATS; i++) +- atomic_set(&new_smi->stats[i], 0); ++ atomic_set_unchecked(&new_smi->stats[i], 0); + + new_smi->interrupt_disabled = true; + atomic_set(&new_smi->stop_operation, 0); +diff --git a/drivers/char/mem.c b/drivers/char/mem.c +index 524b707..62a3d70 100644 +--- a/drivers/char/mem.c ++++ b/drivers/char/mem.c +@@ -18,6 +18,7 @@ + #include <linux/raw.h> + #include <linux/tty.h> + #include <linux/capability.h> ++#include <linux/security.h> + #include <linux/ptrace.h> + #include <linux/device.h> + #include <linux/highmem.h> +@@ -36,6 +37,10 @@ + + #define DEVPORT_MINOR 4 + ++#if defined(CONFIG_GRKERNSEC) && !defined(CONFIG_GRKERNSEC_NO_RBAC) ++extern const struct file_operations grsec_fops; ++#endif ++ + static inline unsigned long size_inside_page(unsigned long start, + unsigned long size) + { +@@ -67,9 +72,13 @@ static inline int range_is_allowed(unsigned long pfn, unsigned long size) + + while (cursor < to) { + if (!devmem_is_allowed(pfn)) { ++#ifdef CONFIG_GRKERNSEC_KMEM ++ gr_handle_mem_readwrite(from, to); ++#else + printk(KERN_INFO + "Program %s tried to access /dev/mem between %Lx->%Lx.\n", + current->comm, from, to); ++#endif + return 0; + } + cursor += PAGE_SIZE; +@@ -77,6 +86,11 @@ static inline int range_is_allowed(unsigned long pfn, unsigned long size) + } + return 1; + } ++#elif defined(CONFIG_GRKERNSEC_KMEM) ++static inline int range_is_allowed(unsigned long pfn, unsigned long size) ++{ ++ return 0; ++} + #else + static inline int range_is_allowed(unsigned long pfn, unsigned long size) + { +@@ -121,7 +135,8 @@ static ssize_t read_mem(struct file *file, char __user *buf, + #endif + + while (count > 0) { +- unsigned long remaining; ++ unsigned long remaining = 0; ++ char *temp; + + sz = size_inside_page(p, count); + +@@ -137,7 +152,24 @@ static ssize_t read_mem(struct file *file, char __user *buf, + if (!ptr) + return -EFAULT; + +- remaining = copy_to_user(buf, ptr, sz); ++#ifdef CONFIG_PAX_USERCOPY ++ temp = kmalloc(sz, GFP_KERNEL|GFP_USERCOPY); ++ if (!temp) { ++ unxlate_dev_mem_ptr(p, ptr); ++ return -ENOMEM; ++ } ++ remaining = probe_kernel_read(temp, ptr, sz); ++#else ++ temp = ptr; ++#endif ++ ++ if (!remaining) ++ remaining = copy_to_user(buf, temp, sz); ++ ++#ifdef CONFIG_PAX_USERCOPY ++ kfree(temp); ++#endif ++ + unxlate_dev_mem_ptr(p, ptr); + if (remaining) + return -EFAULT; +@@ -369,9 +401,8 @@ static ssize_t read_kmem(struct file *file, char __user *buf, + size_t count, loff_t *ppos) + { + unsigned long p = *ppos; +- ssize_t low_count, read, sz; ++ ssize_t low_count, read, sz, err = 0; + char *kbuf; /* k-addr because vread() takes vmlist_lock rwlock */ +- int err = 0; + + read = 0; + if (p < (unsigned long) high_memory) { +@@ -393,6 +424,8 @@ static ssize_t read_kmem(struct file *file, char __user *buf, + } + #endif + while (low_count > 0) { ++ char *temp; ++ + sz = size_inside_page(p, low_count); + + /* +@@ -402,7 +435,23 @@ static ssize_t read_kmem(struct file *file, char __user *buf, + */ + kbuf = xlate_dev_kmem_ptr((char *)p); + +- if (copy_to_user(buf, kbuf, sz)) ++#ifdef CONFIG_PAX_USERCOPY ++ temp = kmalloc(sz, GFP_KERNEL|GFP_USERCOPY); ++ if (!temp) ++ return -ENOMEM; ++ err = probe_kernel_read(temp, kbuf, sz); ++#else ++ temp = kbuf; ++#endif ++ ++ if (!err) ++ err = copy_to_user(buf, temp, sz); ++ ++#ifdef CONFIG_PAX_USERCOPY ++ kfree(temp); ++#endif ++ ++ if (err) + return -EFAULT; + buf += sz; + p += sz; +@@ -797,6 +846,9 @@ static const struct memdev { + #ifdef CONFIG_PRINTK + [11] = { "kmsg", 0644, &kmsg_fops, NULL }, + #endif ++#if defined(CONFIG_GRKERNSEC) && !defined(CONFIG_GRKERNSEC_NO_RBAC) ++ [13] = { "grsec",S_IRUSR | S_IWUGO, &grsec_fops, NULL }, ++#endif + }; + + static int memory_open(struct inode *inode, struct file *filp) +@@ -868,7 +920,7 @@ static int __init chr_dev_init(void) + continue; + + device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor), +- NULL, devlist[minor].name); ++ NULL, "%s", devlist[minor].name); + } + + return tty_init(); +diff --git a/drivers/char/nvram.c b/drivers/char/nvram.c +index 9df78e2..01ba9ae 100644 +--- a/drivers/char/nvram.c ++++ b/drivers/char/nvram.c +@@ -247,7 +247,7 @@ static ssize_t nvram_read(struct file *file, char __user *buf, + + spin_unlock_irq(&rtc_lock); + +- if (copy_to_user(buf, contents, tmp - contents)) ++ if (tmp - contents > sizeof(contents) || copy_to_user(buf, contents, tmp - contents)) + return -EFAULT; + + *ppos = i; +diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c +index 0ea9986..e7b07e4 100644 +--- a/drivers/char/pcmcia/synclink_cs.c ++++ b/drivers/char/pcmcia/synclink_cs.c +@@ -2345,7 +2345,7 @@ static void mgslpc_close(struct tty_struct *tty, struct file * filp) + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):mgslpc_close(%s) entry, count=%d\n", +- __FILE__, __LINE__, info->device_name, port->count); ++ __FILE__, __LINE__, info->device_name, atomic_read(&port->count)); + + if (tty_port_close_start(port, tty, filp) == 0) + goto cleanup; +@@ -2363,7 +2363,7 @@ static void mgslpc_close(struct tty_struct *tty, struct file * filp) + cleanup: + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):mgslpc_close(%s) exit, count=%d\n", __FILE__, __LINE__, +- tty->driver->name, port->count); ++ tty->driver->name, atomic_read(&port->count)); + } + + /* Wait until the transmitter is empty. +@@ -2505,7 +2505,7 @@ static int mgslpc_open(struct tty_struct *tty, struct file * filp) + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):mgslpc_open(%s), old ref count = %d\n", +- __FILE__, __LINE__, tty->driver->name, port->count); ++ __FILE__, __LINE__, tty->driver->name, atomic_read(&port->count)); + + /* If port is closing, signal caller to try again */ + if (port->flags & ASYNC_CLOSING){ +@@ -2525,11 +2525,11 @@ static int mgslpc_open(struct tty_struct *tty, struct file * filp) + goto cleanup; + } + spin_lock(&port->lock); +- port->count++; ++ atomic_inc(&port->count); + spin_unlock(&port->lock); + spin_unlock_irqrestore(&info->netlock, flags); + +- if (port->count == 1) { ++ if (atomic_read(&port->count) == 1) { + /* 1st open on this device, init hardware */ + retval = startup(info, tty); + if (retval < 0) +@@ -3918,7 +3918,7 @@ static int hdlcdev_attach(struct net_device *dev, unsigned short encoding, + unsigned short new_crctype; + + /* return error if TTY interface open */ +- if (info->port.count) ++ if (atomic_read(&info->port.count)) + return -EBUSY; + + switch (encoding) +@@ -4022,7 +4022,7 @@ static int hdlcdev_open(struct net_device *dev) + + /* arbitrate between network and tty opens */ + spin_lock_irqsave(&info->netlock, flags); +- if (info->port.count != 0 || info->netcount != 0) { ++ if (atomic_read(&info->port.count) != 0 || info->netcount != 0) { + printk(KERN_WARNING "%s: hdlc_open returning busy\n", dev->name); + spin_unlock_irqrestore(&info->netlock, flags); + return -EBUSY; +@@ -4112,7 +4112,7 @@ static int hdlcdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + printk("%s:hdlcdev_ioctl(%s)\n", __FILE__, dev->name); + + /* return error if TTY interface open */ +- if (info->port.count) ++ if (atomic_read(&info->port.count)) + return -EBUSY; + + if (cmd != SIOCWANDEV) +diff --git a/drivers/char/random.c b/drivers/char/random.c +index 9cd6968..6416f00 100644 +--- a/drivers/char/random.c ++++ b/drivers/char/random.c +@@ -289,9 +289,6 @@ + /* + * To allow fractional bits to be tracked, the entropy_count field is + * denominated in units of 1/8th bits. +- * +- * 2*(ENTROPY_SHIFT + log2(poolbits)) must <= 31, or the multiply in +- * credit_entropy_bits() needs to be 64 bits wide. + */ + #define ENTROPY_SHIFT 3 + #define ENTROPY_BITS(r) ((r)->entropy_count >> ENTROPY_SHIFT) +@@ -439,9 +436,9 @@ struct entropy_store { + }; + + static void push_to_pool(struct work_struct *work); +-static __u32 input_pool_data[INPUT_POOL_WORDS]; +-static __u32 blocking_pool_data[OUTPUT_POOL_WORDS]; +-static __u32 nonblocking_pool_data[OUTPUT_POOL_WORDS]; ++static __u32 input_pool_data[INPUT_POOL_WORDS] __latent_entropy; ++static __u32 blocking_pool_data[OUTPUT_POOL_WORDS] __latent_entropy; ++static __u32 nonblocking_pool_data[OUTPUT_POOL_WORDS] __latent_entropy; + + static struct entropy_store input_pool = { + .poolinfo = &poolinfo_table[0], +@@ -635,7 +632,7 @@ retry: + /* The +2 corresponds to the /4 in the denominator */ + + do { +- unsigned int anfrac = min(pnfrac, pool_size/2); ++ u64 anfrac = min(pnfrac, pool_size/2); + unsigned int add = + ((pool_size - entropy_count)*anfrac*3) >> s; + +@@ -1207,7 +1204,7 @@ static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf, + + extract_buf(r, tmp); + i = min_t(int, nbytes, EXTRACT_SIZE); +- if (copy_to_user(buf, tmp, i)) { ++ if (i > sizeof(tmp) || copy_to_user(buf, tmp, i)) { + ret = -EFAULT; + break; + } +@@ -1590,7 +1587,7 @@ static char sysctl_bootid[16]; + static int proc_do_uuid(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table fake_table; ++ ctl_table_no_const fake_table; + unsigned char buf[64], tmp_uuid[16], *uuid; + + uuid = table->data; +@@ -1620,7 +1617,7 @@ static int proc_do_uuid(struct ctl_table *table, int write, + static int proc_do_entropy(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table fake_table; ++ ctl_table_no_const fake_table; + int entropy_count; + + entropy_count = *(int *)table->data >> ENTROPY_SHIFT; +diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c +index 7cc1fe22..e7bf59e 100644 +--- a/drivers/char/sonypi.c ++++ b/drivers/char/sonypi.c +@@ -54,6 +54,7 @@ + + #include <asm/uaccess.h> + #include <asm/io.h> ++#include <asm/local.h> + + #include <linux/sonypi.h> + +@@ -490,7 +491,7 @@ static struct sonypi_device { + spinlock_t fifo_lock; + wait_queue_head_t fifo_proc_list; + struct fasync_struct *fifo_async; +- int open_count; ++ local_t open_count; + int model; + struct input_dev *input_jog_dev; + struct input_dev *input_key_dev; +@@ -892,7 +893,7 @@ static int sonypi_misc_fasync(int fd, struct file *filp, int on) + static int sonypi_misc_release(struct inode *inode, struct file *file) + { + mutex_lock(&sonypi_device.lock); +- sonypi_device.open_count--; ++ local_dec(&sonypi_device.open_count); + mutex_unlock(&sonypi_device.lock); + return 0; + } +@@ -901,9 +902,9 @@ static int sonypi_misc_open(struct inode *inode, struct file *file) + { + mutex_lock(&sonypi_device.lock); + /* Flush input queue on first open */ +- if (!sonypi_device.open_count) ++ if (!local_read(&sonypi_device.open_count)) + kfifo_reset(&sonypi_device.fifo); +- sonypi_device.open_count++; ++ local_inc(&sonypi_device.open_count); + mutex_unlock(&sonypi_device.lock); + + return 0; +@@ -1492,7 +1493,7 @@ static struct platform_driver sonypi_driver = { + + static struct platform_device *sonypi_platform_device; + +-static struct dmi_system_id __initdata sonypi_dmi_table[] = { ++static const struct dmi_system_id __initconst sonypi_dmi_table[] = { + { + .ident = "Sony Vaio", + .matches = { +diff --git a/drivers/char/tpm/tpm_acpi.c b/drivers/char/tpm/tpm_acpi.c +index 565a947..dcdc06e 100644 +--- a/drivers/char/tpm/tpm_acpi.c ++++ b/drivers/char/tpm/tpm_acpi.c +@@ -98,11 +98,12 @@ int read_log(struct tpm_bios_log *log) + virt = acpi_os_map_iomem(start, len); + if (!virt) { + kfree(log->bios_event_log); ++ log->bios_event_log = NULL; + printk("%s: ERROR - Unable to map memory\n", __func__); + return -EIO; + } + +- memcpy_fromio(log->bios_event_log, virt, len); ++ memcpy_fromio(log->bios_event_log, (const char __force_kernel *)virt, len); + + acpi_os_unmap_iomem(virt, len); + return 0; +diff --git a/drivers/char/tpm/tpm_eventlog.c b/drivers/char/tpm/tpm_eventlog.c +index 3a56a13..f8cbd25 100644 +--- a/drivers/char/tpm/tpm_eventlog.c ++++ b/drivers/char/tpm/tpm_eventlog.c +@@ -95,7 +95,7 @@ static void *tpm_bios_measurements_start(struct seq_file *m, loff_t *pos) + event = addr; + + if ((event->event_type == 0 && event->event_size == 0) || +- ((addr + sizeof(struct tcpa_event) + event->event_size) >= limit)) ++ (event->event_size >= limit - addr - sizeof(struct tcpa_event))) + return NULL; + + return addr; +@@ -120,7 +120,7 @@ static void *tpm_bios_measurements_next(struct seq_file *m, void *v, + return NULL; + + if ((event->event_type == 0 && event->event_size == 0) || +- ((v + sizeof(struct tcpa_event) + event->event_size) >= limit)) ++ (event->event_size >= limit - v - sizeof(struct tcpa_event))) + return NULL; + + (*pos)++; +@@ -213,7 +213,8 @@ static int tpm_binary_bios_measurements_show(struct seq_file *m, void *v) + int i; + + for (i = 0; i < sizeof(struct tcpa_event) + event->event_size; i++) +- seq_putc(m, data[i]); ++ if (!seq_putc(m, data[i])) ++ return -EFAULT; + + return 0; + } +diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c +index 6e09c1d..72b2e52 100644 +--- a/drivers/char/virtio_console.c ++++ b/drivers/char/virtio_console.c +@@ -685,7 +685,7 @@ static ssize_t fill_readbuf(struct port *port, char *out_buf, size_t out_count, + if (to_user) { + ssize_t ret; + +- ret = copy_to_user(out_buf, buf->buf + buf->offset, out_count); ++ ret = copy_to_user((char __force_user *)out_buf, buf->buf + buf->offset, out_count); + if (ret) + return -EFAULT; + } else { +@@ -788,7 +788,7 @@ static ssize_t port_fops_read(struct file *filp, char __user *ubuf, + if (!port_has_data(port) && !port->host_connected) + return 0; + +- return fill_readbuf(port, ubuf, count, true); ++ return fill_readbuf(port, (char __force_kernel *)ubuf, count, true); + } + + static int wait_port_writable(struct port *port, bool nonblock) +diff --git a/drivers/clk/clk-composite.c b/drivers/clk/clk-composite.c +index b9355da..9611f4e 100644 +--- a/drivers/clk/clk-composite.c ++++ b/drivers/clk/clk-composite.c +@@ -191,7 +191,7 @@ struct clk *clk_register_composite(struct device *dev, const char *name, + struct clk *clk; + struct clk_init_data init; + struct clk_composite *composite; +- struct clk_ops *clk_composite_ops; ++ clk_ops_no_const *clk_composite_ops; + + composite = kzalloc(sizeof(*composite), GFP_KERNEL); + if (!composite) { +diff --git a/drivers/clk/socfpga/clk-gate.c b/drivers/clk/socfpga/clk-gate.c +index dd3a78c..386d49c 100644 +--- a/drivers/clk/socfpga/clk-gate.c ++++ b/drivers/clk/socfpga/clk-gate.c +@@ -22,6 +22,7 @@ + #include <linux/mfd/syscon.h> + #include <linux/of.h> + #include <linux/regmap.h> ++#include <asm/pgtable.h> + + #include "clk.h" + +@@ -174,7 +175,7 @@ static int socfpga_clk_prepare(struct clk_hw *hwclk) + return 0; + } + +-static struct clk_ops gateclk_ops = { ++static clk_ops_no_const gateclk_ops __read_only = { + .prepare = socfpga_clk_prepare, + .recalc_rate = socfpga_clk_recalc_rate, + .get_parent = socfpga_clk_get_parent, +@@ -208,8 +209,10 @@ static void __init __socfpga_gate_init(struct device_node *node, + socfpga_clk->hw.reg = clk_mgr_base_addr + clk_gate[0]; + socfpga_clk->hw.bit_idx = clk_gate[1]; + +- gateclk_ops.enable = clk_gate_ops.enable; +- gateclk_ops.disable = clk_gate_ops.disable; ++ pax_open_kernel(); ++ *(void **)&gateclk_ops.enable = clk_gate_ops.enable; ++ *(void **)&gateclk_ops.disable = clk_gate_ops.disable; ++ pax_close_kernel(); + } + + rc = of_property_read_u32(node, "fixed-divider", &fixed_div); +diff --git a/drivers/clk/socfpga/clk-pll.c b/drivers/clk/socfpga/clk-pll.c +index de6da95..c98278b 100644 +--- a/drivers/clk/socfpga/clk-pll.c ++++ b/drivers/clk/socfpga/clk-pll.c +@@ -21,6 +21,7 @@ + #include <linux/io.h> + #include <linux/of.h> + #include <linux/of_address.h> ++#include <asm/pgtable.h> + + #include "clk.h" + +@@ -76,7 +77,7 @@ static u8 clk_pll_get_parent(struct clk_hw *hwclk) + CLK_MGR_PLL_CLK_SRC_MASK; + } + +-static struct clk_ops clk_pll_ops = { ++static clk_ops_no_const clk_pll_ops __read_only = { + .recalc_rate = clk_pll_recalc_rate, + .get_parent = clk_pll_get_parent, + }; +@@ -120,8 +121,10 @@ static __init struct clk *__socfpga_pll_init(struct device_node *node, + pll_clk->hw.hw.init = &init; + + pll_clk->hw.bit_idx = SOCFPGA_PLL_EXT_ENA; +- clk_pll_ops.enable = clk_gate_ops.enable; +- clk_pll_ops.disable = clk_gate_ops.disable; ++ pax_open_kernel(); ++ *(void **)&clk_pll_ops.enable = clk_gate_ops.enable; ++ *(void **)&clk_pll_ops.disable = clk_gate_ops.disable; ++ pax_close_kernel(); + + clk = clk_register(NULL, &pll_clk->hw.hw); + if (WARN_ON(IS_ERR(clk))) { +diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c +index b0c18ed..1713a80 100644 +--- a/drivers/cpufreq/acpi-cpufreq.c ++++ b/drivers/cpufreq/acpi-cpufreq.c +@@ -675,8 +675,11 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) + data->acpi_data = per_cpu_ptr(acpi_perf_data, cpu); + per_cpu(acfreq_data, cpu) = data; + +- if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) +- acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS; ++ if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { ++ pax_open_kernel(); ++ *(u8 *)&acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS; ++ pax_close_kernel(); ++ } + + result = acpi_processor_register_performance(data->acpi_data, cpu); + if (result) +@@ -809,7 +812,9 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) + policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu); + break; + case ACPI_ADR_SPACE_FIXED_HARDWARE: +- acpi_cpufreq_driver.get = get_cur_freq_on_cpu; ++ pax_open_kernel(); ++ *(void **)&acpi_cpufreq_driver.get = get_cur_freq_on_cpu; ++ pax_close_kernel(); + break; + default: + break; +@@ -903,8 +908,10 @@ static void __init acpi_cpufreq_boost_init(void) + if (!msrs) + return; + +- acpi_cpufreq_driver.boost_supported = true; +- acpi_cpufreq_driver.boost_enabled = boost_state(0); ++ pax_open_kernel(); ++ *(bool *)&acpi_cpufreq_driver.boost_supported = true; ++ *(bool *)&acpi_cpufreq_driver.boost_enabled = boost_state(0); ++ pax_close_kernel(); + + cpu_notifier_register_begin(); + +diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c +index f657c57..31d97ae 100644 +--- a/drivers/cpufreq/cpufreq-dt.c ++++ b/drivers/cpufreq/cpufreq-dt.c +@@ -362,7 +362,9 @@ static int dt_cpufreq_probe(struct platform_device *pdev) + if (!IS_ERR(cpu_reg)) + regulator_put(cpu_reg); + +- dt_cpufreq_driver.driver_data = dev_get_platdata(&pdev->dev); ++ pax_open_kernel(); ++ *(void **)&dt_cpufreq_driver.driver_data = dev_get_platdata(&pdev->dev); ++ pax_close_kernel(); + + ret = cpufreq_register_driver(&dt_cpufreq_driver); + if (ret) +diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c +index 90e8deb..7d37ec0 100644 +--- a/drivers/cpufreq/cpufreq.c ++++ b/drivers/cpufreq/cpufreq.c +@@ -2125,7 +2125,7 @@ void cpufreq_unregister_governor(struct cpufreq_governor *governor) + } + + mutex_lock(&cpufreq_governor_mutex); +- list_del(&governor->governor_list); ++ pax_list_del(&governor->governor_list); + mutex_unlock(&cpufreq_governor_mutex); + return; + } +@@ -2341,7 +2341,7 @@ static int cpufreq_cpu_callback(struct notifier_block *nfb, + return NOTIFY_OK; + } + +-static struct notifier_block __refdata cpufreq_cpu_notifier = { ++static struct notifier_block cpufreq_cpu_notifier = { + .notifier_call = cpufreq_cpu_callback, + }; + +@@ -2381,13 +2381,17 @@ int cpufreq_boost_trigger_state(int state) + return 0; + + write_lock_irqsave(&cpufreq_driver_lock, flags); +- cpufreq_driver->boost_enabled = state; ++ pax_open_kernel(); ++ *(bool *)&cpufreq_driver->boost_enabled = state; ++ pax_close_kernel(); + write_unlock_irqrestore(&cpufreq_driver_lock, flags); + + ret = cpufreq_driver->set_boost(state); + if (ret) { + write_lock_irqsave(&cpufreq_driver_lock, flags); +- cpufreq_driver->boost_enabled = !state; ++ pax_open_kernel(); ++ *(bool *)&cpufreq_driver->boost_enabled = !state; ++ pax_close_kernel(); + write_unlock_irqrestore(&cpufreq_driver_lock, flags); + + pr_err("%s: Cannot %s BOOST\n", +@@ -2444,8 +2448,11 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) + + pr_debug("trying to register driver %s\n", driver_data->name); + +- if (driver_data->setpolicy) +- driver_data->flags |= CPUFREQ_CONST_LOOPS; ++ if (driver_data->setpolicy) { ++ pax_open_kernel(); ++ *(u8 *)&driver_data->flags |= CPUFREQ_CONST_LOOPS; ++ pax_close_kernel(); ++ } + + write_lock_irqsave(&cpufreq_driver_lock, flags); + if (cpufreq_driver) { +@@ -2460,8 +2467,11 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) + * Check if driver provides function to enable boost - + * if not, use cpufreq_boost_set_sw as default + */ +- if (!cpufreq_driver->set_boost) +- cpufreq_driver->set_boost = cpufreq_boost_set_sw; ++ if (!cpufreq_driver->set_boost) { ++ pax_open_kernel(); ++ *(void **)&cpufreq_driver->set_boost = cpufreq_boost_set_sw; ++ pax_close_kernel(); ++ } + + ret = cpufreq_sysfs_create_file(&boost.attr); + if (ret) { +diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c +index 1b44496..b80ff5e 100644 +--- a/drivers/cpufreq/cpufreq_governor.c ++++ b/drivers/cpufreq/cpufreq_governor.c +@@ -245,7 +245,7 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy, + struct dbs_data *dbs_data; + struct od_cpu_dbs_info_s *od_dbs_info = NULL; + struct cs_cpu_dbs_info_s *cs_dbs_info = NULL; +- struct od_ops *od_ops = NULL; ++ const struct od_ops *od_ops = NULL; + struct od_dbs_tuners *od_tuners = NULL; + struct cs_dbs_tuners *cs_tuners = NULL; + struct cpu_dbs_common_info *cpu_cdbs; +@@ -311,7 +311,7 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy, + + if ((cdata->governor == GOV_CONSERVATIVE) && + (!policy->governor->initialized)) { +- struct cs_ops *cs_ops = dbs_data->cdata->gov_ops; ++ const struct cs_ops *cs_ops = dbs_data->cdata->gov_ops; + + cpufreq_register_notifier(cs_ops->notifier_block, + CPUFREQ_TRANSITION_NOTIFIER); +@@ -331,7 +331,7 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy, + + if ((dbs_data->cdata->governor == GOV_CONSERVATIVE) && + (policy->governor->initialized == 1)) { +- struct cs_ops *cs_ops = dbs_data->cdata->gov_ops; ++ const struct cs_ops *cs_ops = dbs_data->cdata->gov_ops; + + cpufreq_unregister_notifier(cs_ops->notifier_block, + CPUFREQ_TRANSITION_NOTIFIER); +diff --git a/drivers/cpufreq/cpufreq_governor.h b/drivers/cpufreq/cpufreq_governor.h +index cc401d1..8197340 100644 +--- a/drivers/cpufreq/cpufreq_governor.h ++++ b/drivers/cpufreq/cpufreq_governor.h +@@ -212,7 +212,7 @@ struct common_dbs_data { + void (*exit)(struct dbs_data *dbs_data); + + /* Governor specific ops, see below */ +- void *gov_ops; ++ const void *gov_ops; + }; + + /* Governor Per policy data */ +@@ -232,7 +232,7 @@ struct od_ops { + unsigned int (*powersave_bias_target)(struct cpufreq_policy *policy, + unsigned int freq_next, unsigned int relation); + void (*freq_increase)(struct cpufreq_policy *policy, unsigned int freq); +-}; ++} __no_const; + + struct cs_ops { + struct notifier_block *notifier_block; +diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c +index ad3f38f..8f086cd 100644 +--- a/drivers/cpufreq/cpufreq_ondemand.c ++++ b/drivers/cpufreq/cpufreq_ondemand.c +@@ -524,7 +524,7 @@ static void od_exit(struct dbs_data *dbs_data) + + define_get_cpu_dbs_routines(od_cpu_dbs_info); + +-static struct od_ops od_ops = { ++static struct od_ops od_ops __read_only = { + .powersave_bias_init_cpu = ondemand_powersave_bias_init_cpu, + .powersave_bias_target = generic_powersave_bias_target, + .freq_increase = dbs_freq_increase, +@@ -579,14 +579,18 @@ void od_register_powersave_bias_handler(unsigned int (*f) + (struct cpufreq_policy *, unsigned int, unsigned int), + unsigned int powersave_bias) + { +- od_ops.powersave_bias_target = f; ++ pax_open_kernel(); ++ *(void **)&od_ops.powersave_bias_target = f; ++ pax_close_kernel(); + od_set_powersave_bias(powersave_bias); + } + EXPORT_SYMBOL_GPL(od_register_powersave_bias_handler); + + void od_unregister_powersave_bias_handler(void) + { +- od_ops.powersave_bias_target = generic_powersave_bias_target; ++ pax_open_kernel(); ++ *(void **)&od_ops.powersave_bias_target = generic_powersave_bias_target; ++ pax_close_kernel(); + od_set_powersave_bias(0); + } + EXPORT_SYMBOL_GPL(od_unregister_powersave_bias_handler); +diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c +index 27bb6d3..4cf595c 100644 +--- a/drivers/cpufreq/intel_pstate.c ++++ b/drivers/cpufreq/intel_pstate.c +@@ -133,10 +133,10 @@ struct pstate_funcs { + struct cpu_defaults { + struct pstate_adjust_policy pid_policy; + struct pstate_funcs funcs; +-}; ++} __do_const; + + static struct pstate_adjust_policy pid_params; +-static struct pstate_funcs pstate_funcs; ++static struct pstate_funcs *pstate_funcs; + + struct perf_limits { + int no_turbo; +@@ -594,18 +594,18 @@ static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate) + + cpu->pstate.current_pstate = pstate; + +- pstate_funcs.set(cpu, pstate); ++ pstate_funcs->set(cpu, pstate); + } + + static void intel_pstate_get_cpu_pstates(struct cpudata *cpu) + { +- cpu->pstate.min_pstate = pstate_funcs.get_min(); +- cpu->pstate.max_pstate = pstate_funcs.get_max(); +- cpu->pstate.turbo_pstate = pstate_funcs.get_turbo(); +- cpu->pstate.scaling = pstate_funcs.get_scaling(); ++ cpu->pstate.min_pstate = pstate_funcs->get_min(); ++ cpu->pstate.max_pstate = pstate_funcs->get_max(); ++ cpu->pstate.turbo_pstate = pstate_funcs->get_turbo(); ++ cpu->pstate.scaling = pstate_funcs->get_scaling(); + +- if (pstate_funcs.get_vid) +- pstate_funcs.get_vid(cpu); ++ if (pstate_funcs->get_vid) ++ pstate_funcs->get_vid(cpu); + intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate); + } + +@@ -875,9 +875,9 @@ static int intel_pstate_msrs_not_valid(void) + rdmsrl(MSR_IA32_APERF, aperf); + rdmsrl(MSR_IA32_MPERF, mperf); + +- if (!pstate_funcs.get_max() || +- !pstate_funcs.get_min() || +- !pstate_funcs.get_turbo()) ++ if (!pstate_funcs->get_max() || ++ !pstate_funcs->get_min() || ++ !pstate_funcs->get_turbo()) + return -ENODEV; + + rdmsrl(MSR_IA32_APERF, tmp); +@@ -891,7 +891,7 @@ static int intel_pstate_msrs_not_valid(void) + return 0; + } + +-static void copy_pid_params(struct pstate_adjust_policy *policy) ++static void copy_pid_params(const struct pstate_adjust_policy *policy) + { + pid_params.sample_rate_ms = policy->sample_rate_ms; + pid_params.p_gain_pct = policy->p_gain_pct; +@@ -903,12 +903,7 @@ static void copy_pid_params(struct pstate_adjust_policy *policy) + + static void copy_cpu_funcs(struct pstate_funcs *funcs) + { +- pstate_funcs.get_max = funcs->get_max; +- pstate_funcs.get_min = funcs->get_min; +- pstate_funcs.get_turbo = funcs->get_turbo; +- pstate_funcs.get_scaling = funcs->get_scaling; +- pstate_funcs.set = funcs->set; +- pstate_funcs.get_vid = funcs->get_vid; ++ pstate_funcs = funcs; + } + + #if IS_ENABLED(CONFIG_ACPI) +diff --git a/drivers/cpufreq/p4-clockmod.c b/drivers/cpufreq/p4-clockmod.c +index 529cfd9..0e28fff 100644 +--- a/drivers/cpufreq/p4-clockmod.c ++++ b/drivers/cpufreq/p4-clockmod.c +@@ -134,10 +134,14 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) + case 0x0F: /* Core Duo */ + case 0x16: /* Celeron Core */ + case 0x1C: /* Atom */ +- p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; ++ pax_open_kernel(); ++ *(u8 *)&p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; ++ pax_close_kernel(); + return speedstep_get_frequency(SPEEDSTEP_CPU_PCORE); + case 0x0D: /* Pentium M (Dothan) */ +- p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; ++ pax_open_kernel(); ++ *(u8 *)&p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; ++ pax_close_kernel(); + /* fall through */ + case 0x09: /* Pentium M (Banias) */ + return speedstep_get_frequency(SPEEDSTEP_CPU_PM); +@@ -149,7 +153,9 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) + + /* on P-4s, the TSC runs with constant frequency independent whether + * throttling is active or not. */ +- p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; ++ pax_open_kernel(); ++ *(u8 *)&p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; ++ pax_close_kernel(); + + if (speedstep_detect_processor() == SPEEDSTEP_CPU_P4M) { + printk(KERN_WARNING PFX "Warning: Pentium 4-M detected. " +diff --git a/drivers/cpufreq/sparc-us3-cpufreq.c b/drivers/cpufreq/sparc-us3-cpufreq.c +index 9bb42ba..b01b4a2 100644 +--- a/drivers/cpufreq/sparc-us3-cpufreq.c ++++ b/drivers/cpufreq/sparc-us3-cpufreq.c +@@ -18,14 +18,12 @@ + #include <asm/head.h> + #include <asm/timer.h> + +-static struct cpufreq_driver *cpufreq_us3_driver; +- + struct us3_freq_percpu_info { + struct cpufreq_frequency_table table[4]; + }; + + /* Indexed by cpu number. */ +-static struct us3_freq_percpu_info *us3_freq_table; ++static struct us3_freq_percpu_info us3_freq_table[NR_CPUS]; + + /* UltraSPARC-III has three dividers: 1, 2, and 32. These are controlled + * in the Safari config register. +@@ -156,16 +154,27 @@ static int __init us3_freq_cpu_init(struct cpufreq_policy *policy) + + static int us3_freq_cpu_exit(struct cpufreq_policy *policy) + { +- if (cpufreq_us3_driver) +- us3_freq_target(policy, 0); ++ us3_freq_target(policy, 0); + + return 0; + } + ++static int __init us3_freq_init(void); ++static void __exit us3_freq_exit(void); ++ ++static struct cpufreq_driver cpufreq_us3_driver = { ++ .init = us3_freq_cpu_init, ++ .verify = cpufreq_generic_frequency_table_verify, ++ .target_index = us3_freq_target, ++ .get = us3_freq_get, ++ .exit = us3_freq_cpu_exit, ++ .name = "UltraSPARC-III", ++ ++}; ++ + static int __init us3_freq_init(void) + { + unsigned long manuf, impl, ver; +- int ret; + + if (tlb_type != cheetah && tlb_type != cheetah_plus) + return -ENODEV; +@@ -178,55 +187,15 @@ static int __init us3_freq_init(void) + (impl == CHEETAH_IMPL || + impl == CHEETAH_PLUS_IMPL || + impl == JAGUAR_IMPL || +- impl == PANTHER_IMPL)) { +- struct cpufreq_driver *driver; +- +- ret = -ENOMEM; +- driver = kzalloc(sizeof(*driver), GFP_KERNEL); +- if (!driver) +- goto err_out; +- +- us3_freq_table = kzalloc((NR_CPUS * sizeof(*us3_freq_table)), +- GFP_KERNEL); +- if (!us3_freq_table) +- goto err_out; +- +- driver->init = us3_freq_cpu_init; +- driver->verify = cpufreq_generic_frequency_table_verify; +- driver->target_index = us3_freq_target; +- driver->get = us3_freq_get; +- driver->exit = us3_freq_cpu_exit; +- strcpy(driver->name, "UltraSPARC-III"); +- +- cpufreq_us3_driver = driver; +- ret = cpufreq_register_driver(driver); +- if (ret) +- goto err_out; +- +- return 0; +- +-err_out: +- if (driver) { +- kfree(driver); +- cpufreq_us3_driver = NULL; +- } +- kfree(us3_freq_table); +- us3_freq_table = NULL; +- return ret; +- } ++ impl == PANTHER_IMPL)) ++ return cpufreq_register_driver(&cpufreq_us3_driver); + + return -ENODEV; + } + + static void __exit us3_freq_exit(void) + { +- if (cpufreq_us3_driver) { +- cpufreq_unregister_driver(cpufreq_us3_driver); +- kfree(cpufreq_us3_driver); +- cpufreq_us3_driver = NULL; +- kfree(us3_freq_table); +- us3_freq_table = NULL; +- } ++ cpufreq_unregister_driver(&cpufreq_us3_driver); + } + + MODULE_AUTHOR("David S. Miller <davem@redhat.com>"); +diff --git a/drivers/cpufreq/speedstep-centrino.c b/drivers/cpufreq/speedstep-centrino.c +index 7d4a315..21bb886 100644 +--- a/drivers/cpufreq/speedstep-centrino.c ++++ b/drivers/cpufreq/speedstep-centrino.c +@@ -351,8 +351,11 @@ static int centrino_cpu_init(struct cpufreq_policy *policy) + !cpu_has(cpu, X86_FEATURE_EST)) + return -ENODEV; + +- if (cpu_has(cpu, X86_FEATURE_CONSTANT_TSC)) +- centrino_driver.flags |= CPUFREQ_CONST_LOOPS; ++ if (cpu_has(cpu, X86_FEATURE_CONSTANT_TSC)) { ++ pax_open_kernel(); ++ *(u8 *)¢rino_driver.flags |= CPUFREQ_CONST_LOOPS; ++ pax_close_kernel(); ++ } + + if (policy->cpu != 0) + return -ENODEV; +diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c +index e431d11..d0b997e 100644 +--- a/drivers/cpuidle/driver.c ++++ b/drivers/cpuidle/driver.c +@@ -194,7 +194,7 @@ static int poll_idle(struct cpuidle_device *dev, + + static void poll_idle_init(struct cpuidle_driver *drv) + { +- struct cpuidle_state *state = &drv->states[0]; ++ cpuidle_state_no_const *state = &drv->states[0]; + + snprintf(state->name, CPUIDLE_NAME_LEN, "POLL"); + snprintf(state->desc, CPUIDLE_DESC_LEN, "CPUIDLE CORE POLL IDLE"); +diff --git a/drivers/cpuidle/governor.c b/drivers/cpuidle/governor.c +index fb9f511..213e6cc 100644 +--- a/drivers/cpuidle/governor.c ++++ b/drivers/cpuidle/governor.c +@@ -87,7 +87,7 @@ int cpuidle_register_governor(struct cpuidle_governor *gov) + mutex_lock(&cpuidle_lock); + if (__cpuidle_find_governor(gov->name) == NULL) { + ret = 0; +- list_add_tail(&gov->governor_list, &cpuidle_governors); ++ pax_list_add_tail((struct list_head *)&gov->governor_list, &cpuidle_governors); + if (!cpuidle_curr_governor || + cpuidle_curr_governor->rating < gov->rating) + cpuidle_switch_governor(gov); +diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c +index 832a2c3..1794080 100644 +--- a/drivers/cpuidle/sysfs.c ++++ b/drivers/cpuidle/sysfs.c +@@ -135,7 +135,7 @@ static struct attribute *cpuidle_switch_attrs[] = { + NULL + }; + +-static struct attribute_group cpuidle_attr_group = { ++static attribute_group_no_const cpuidle_attr_group = { + .attrs = cpuidle_default_attrs, + .name = "cpuidle", + }; +diff --git a/drivers/crypto/hifn_795x.c b/drivers/crypto/hifn_795x.c +index 8d2a772..33826c9 100644 +--- a/drivers/crypto/hifn_795x.c ++++ b/drivers/crypto/hifn_795x.c +@@ -51,7 +51,7 @@ module_param_string(hifn_pll_ref, hifn_pll_ref, sizeof(hifn_pll_ref), 0444); + MODULE_PARM_DESC(hifn_pll_ref, + "PLL reference clock (pci[freq] or ext[freq], default ext)"); + +-static atomic_t hifn_dev_number; ++static atomic_unchecked_t hifn_dev_number; + + #define ACRYPTO_OP_DECRYPT 0 + #define ACRYPTO_OP_ENCRYPT 1 +@@ -2577,7 +2577,7 @@ static int hifn_probe(struct pci_dev *pdev, const struct pci_device_id *id) + goto err_out_disable_pci_device; + + snprintf(name, sizeof(name), "hifn%d", +- atomic_inc_return(&hifn_dev_number)-1); ++ atomic_inc_return_unchecked(&hifn_dev_number)-1); + + err = pci_request_regions(pdev, name); + if (err) +diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c +index 30b538d8..1610d75 100644 +--- a/drivers/devfreq/devfreq.c ++++ b/drivers/devfreq/devfreq.c +@@ -673,7 +673,7 @@ int devfreq_add_governor(struct devfreq_governor *governor) + goto err_out; + } + +- list_add(&governor->node, &devfreq_governor_list); ++ pax_list_add((struct list_head *)&governor->node, &devfreq_governor_list); + + list_for_each_entry(devfreq, &devfreq_list, node) { + int ret = 0; +@@ -761,7 +761,7 @@ int devfreq_remove_governor(struct devfreq_governor *governor) + } + } + +- list_del(&governor->node); ++ pax_list_del((struct list_head *)&governor->node); + err_out: + mutex_unlock(&devfreq_list_lock); + +diff --git a/drivers/dma/sh/shdma-base.c b/drivers/dma/sh/shdma-base.c +index 42d4974..2714f36 100644 +--- a/drivers/dma/sh/shdma-base.c ++++ b/drivers/dma/sh/shdma-base.c +@@ -228,8 +228,8 @@ static int shdma_alloc_chan_resources(struct dma_chan *chan) + schan->slave_id = -EINVAL; + } + +- schan->desc = kcalloc(NR_DESCS_PER_CHANNEL, +- sdev->desc_size, GFP_KERNEL); ++ schan->desc = kcalloc(sdev->desc_size, ++ NR_DESCS_PER_CHANNEL, GFP_KERNEL); + if (!schan->desc) { + ret = -ENOMEM; + goto edescalloc; +diff --git a/drivers/dma/sh/shdmac.c b/drivers/dma/sh/shdmac.c +index 58eb857..d7e42c8 100644 +--- a/drivers/dma/sh/shdmac.c ++++ b/drivers/dma/sh/shdmac.c +@@ -513,7 +513,7 @@ static int sh_dmae_nmi_handler(struct notifier_block *self, + return ret; + } + +-static struct notifier_block sh_dmae_nmi_notifier __read_mostly = { ++static struct notifier_block sh_dmae_nmi_notifier = { + .notifier_call = sh_dmae_nmi_handler, + + /* Run before NMI debug handler and KGDB */ +diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c +index 592af5f..bb1d583 100644 +--- a/drivers/edac/edac_device.c ++++ b/drivers/edac/edac_device.c +@@ -477,9 +477,9 @@ void edac_device_reset_delay_period(struct edac_device_ctl_info *edac_dev, + */ + int edac_device_alloc_index(void) + { +- static atomic_t device_indexes = ATOMIC_INIT(0); ++ static atomic_unchecked_t device_indexes = ATOMIC_INIT(0); + +- return atomic_inc_return(&device_indexes) - 1; ++ return atomic_inc_return_unchecked(&device_indexes) - 1; + } + EXPORT_SYMBOL_GPL(edac_device_alloc_index); + +diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c +index a6cd361..7bdbf53 100644 +--- a/drivers/edac/edac_mc_sysfs.c ++++ b/drivers/edac/edac_mc_sysfs.c +@@ -154,7 +154,7 @@ static const char * const edac_caps[] = { + struct dev_ch_attribute { + struct device_attribute attr; + int channel; +-}; ++} __do_const; + + #define DEVICE_CHANNEL(_name, _mode, _show, _store, _var) \ + struct dev_ch_attribute dev_attr_legacy_##_name = \ +@@ -1011,14 +1011,16 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci) + } + + if (mci->set_sdram_scrub_rate || mci->get_sdram_scrub_rate) { ++ pax_open_kernel(); + if (mci->get_sdram_scrub_rate) { +- dev_attr_sdram_scrub_rate.attr.mode |= S_IRUGO; +- dev_attr_sdram_scrub_rate.show = &mci_sdram_scrub_rate_show; ++ *(umode_t *)&dev_attr_sdram_scrub_rate.attr.mode |= S_IRUGO; ++ *(void **)&dev_attr_sdram_scrub_rate.show = &mci_sdram_scrub_rate_show; + } + if (mci->set_sdram_scrub_rate) { +- dev_attr_sdram_scrub_rate.attr.mode |= S_IWUSR; +- dev_attr_sdram_scrub_rate.store = &mci_sdram_scrub_rate_store; ++ *(umode_t *)&dev_attr_sdram_scrub_rate.attr.mode |= S_IWUSR; ++ *(void **)&dev_attr_sdram_scrub_rate.store = &mci_sdram_scrub_rate_store; + } ++ pax_close_kernel(); + err = device_create_file(&mci->dev, + &dev_attr_sdram_scrub_rate); + if (err) { +diff --git a/drivers/edac/edac_pci.c b/drivers/edac/edac_pci.c +index 2cf44b4d..6dd2dc7 100644 +--- a/drivers/edac/edac_pci.c ++++ b/drivers/edac/edac_pci.c +@@ -29,7 +29,7 @@ + + static DEFINE_MUTEX(edac_pci_ctls_mutex); + static LIST_HEAD(edac_pci_list); +-static atomic_t pci_indexes = ATOMIC_INIT(0); ++static atomic_unchecked_t pci_indexes = ATOMIC_INIT(0); + + /* + * edac_pci_alloc_ctl_info +@@ -315,7 +315,7 @@ EXPORT_SYMBOL_GPL(edac_pci_reset_delay_period); + */ + int edac_pci_alloc_index(void) + { +- return atomic_inc_return(&pci_indexes) - 1; ++ return atomic_inc_return_unchecked(&pci_indexes) - 1; + } + EXPORT_SYMBOL_GPL(edac_pci_alloc_index); + +diff --git a/drivers/edac/edac_pci_sysfs.c b/drivers/edac/edac_pci_sysfs.c +index e8658e4..22746d6 100644 +--- a/drivers/edac/edac_pci_sysfs.c ++++ b/drivers/edac/edac_pci_sysfs.c +@@ -26,8 +26,8 @@ static int edac_pci_log_pe = 1; /* log PCI parity errors */ + static int edac_pci_log_npe = 1; /* log PCI non-parity error errors */ + static int edac_pci_poll_msec = 1000; /* one second workq period */ + +-static atomic_t pci_parity_count = ATOMIC_INIT(0); +-static atomic_t pci_nonparity_count = ATOMIC_INIT(0); ++static atomic_unchecked_t pci_parity_count = ATOMIC_INIT(0); ++static atomic_unchecked_t pci_nonparity_count = ATOMIC_INIT(0); + + static struct kobject *edac_pci_top_main_kobj; + static atomic_t edac_pci_sysfs_refcount = ATOMIC_INIT(0); +@@ -235,7 +235,7 @@ struct edac_pci_dev_attribute { + void *value; + ssize_t(*show) (void *, char *); + ssize_t(*store) (void *, const char *, size_t); +-}; ++} __do_const; + + /* Set of show/store abstract level functions for PCI Parity object */ + static ssize_t edac_pci_dev_show(struct kobject *kobj, struct attribute *attr, +@@ -579,7 +579,7 @@ static void edac_pci_dev_parity_test(struct pci_dev *dev) + edac_printk(KERN_CRIT, EDAC_PCI, + "Signaled System Error on %s\n", + pci_name(dev)); +- atomic_inc(&pci_nonparity_count); ++ atomic_inc_unchecked(&pci_nonparity_count); + } + + if (status & (PCI_STATUS_PARITY)) { +@@ -587,7 +587,7 @@ static void edac_pci_dev_parity_test(struct pci_dev *dev) + "Master Data Parity Error on %s\n", + pci_name(dev)); + +- atomic_inc(&pci_parity_count); ++ atomic_inc_unchecked(&pci_parity_count); + } + + if (status & (PCI_STATUS_DETECTED_PARITY)) { +@@ -595,7 +595,7 @@ static void edac_pci_dev_parity_test(struct pci_dev *dev) + "Detected Parity Error on %s\n", + pci_name(dev)); + +- atomic_inc(&pci_parity_count); ++ atomic_inc_unchecked(&pci_parity_count); + } + } + +@@ -618,7 +618,7 @@ static void edac_pci_dev_parity_test(struct pci_dev *dev) + edac_printk(KERN_CRIT, EDAC_PCI, "Bridge " + "Signaled System Error on %s\n", + pci_name(dev)); +- atomic_inc(&pci_nonparity_count); ++ atomic_inc_unchecked(&pci_nonparity_count); + } + + if (status & (PCI_STATUS_PARITY)) { +@@ -626,7 +626,7 @@ static void edac_pci_dev_parity_test(struct pci_dev *dev) + "Master Data Parity Error on " + "%s\n", pci_name(dev)); + +- atomic_inc(&pci_parity_count); ++ atomic_inc_unchecked(&pci_parity_count); + } + + if (status & (PCI_STATUS_DETECTED_PARITY)) { +@@ -634,7 +634,7 @@ static void edac_pci_dev_parity_test(struct pci_dev *dev) + "Detected Parity Error on %s\n", + pci_name(dev)); + +- atomic_inc(&pci_parity_count); ++ atomic_inc_unchecked(&pci_parity_count); + } + } + } +@@ -672,7 +672,7 @@ void edac_pci_do_parity_check(void) + if (!check_pci_errors) + return; + +- before_count = atomic_read(&pci_parity_count); ++ before_count = atomic_read_unchecked(&pci_parity_count); + + /* scan all PCI devices looking for a Parity Error on devices and + * bridges. +@@ -684,7 +684,7 @@ void edac_pci_do_parity_check(void) + /* Only if operator has selected panic on PCI Error */ + if (edac_pci_get_panic_on_pe()) { + /* If the count is different 'after' from 'before' */ +- if (before_count != atomic_read(&pci_parity_count)) ++ if (before_count != atomic_read_unchecked(&pci_parity_count)) + panic("EDAC: PCI Parity Error"); + } + } +diff --git a/drivers/edac/mce_amd.h b/drivers/edac/mce_amd.h +index 51b7e3a..aa8a3e8 100644 +--- a/drivers/edac/mce_amd.h ++++ b/drivers/edac/mce_amd.h +@@ -77,7 +77,7 @@ struct amd_decoder_ops { + bool (*mc0_mce)(u16, u8); + bool (*mc1_mce)(u16, u8); + bool (*mc2_mce)(u16, u8); +-}; ++} __no_const; + + void amd_report_gart_errors(bool); + void amd_register_ecc_decoder(void (*f)(int, struct mce *)); +diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c +index 57ea7f4..af06b76 100644 +--- a/drivers/firewire/core-card.c ++++ b/drivers/firewire/core-card.c +@@ -528,9 +528,9 @@ void fw_card_initialize(struct fw_card *card, + const struct fw_card_driver *driver, + struct device *device) + { +- static atomic_t index = ATOMIC_INIT(-1); ++ static atomic_unchecked_t index = ATOMIC_INIT(-1); + +- card->index = atomic_inc_return(&index); ++ card->index = atomic_inc_return_unchecked(&index); + card->driver = driver; + card->device = device; + card->current_tlabel = 0; +@@ -680,7 +680,7 @@ EXPORT_SYMBOL_GPL(fw_card_release); + + void fw_core_remove_card(struct fw_card *card) + { +- struct fw_card_driver dummy_driver = dummy_driver_template; ++ fw_card_driver_no_const dummy_driver = dummy_driver_template; + + card->driver->update_phy_reg(card, 4, + PHY_LINK_ACTIVE | PHY_CONTENDER, 0); +diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c +index 2c6d5e1..a2cca6b 100644 +--- a/drivers/firewire/core-device.c ++++ b/drivers/firewire/core-device.c +@@ -253,7 +253,7 @@ EXPORT_SYMBOL(fw_device_enable_phys_dma); + struct config_rom_attribute { + struct device_attribute attr; + u32 key; +-}; ++} __do_const; + + static ssize_t show_immediate(struct device *dev, + struct device_attribute *dattr, char *buf) +diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-transaction.c +index eb6935c..3cc2bfa 100644 +--- a/drivers/firewire/core-transaction.c ++++ b/drivers/firewire/core-transaction.c +@@ -38,6 +38,7 @@ + #include <linux/timer.h> + #include <linux/types.h> + #include <linux/workqueue.h> ++#include <linux/sched.h> + + #include <asm/byteorder.h> + +diff --git a/drivers/firewire/core.h b/drivers/firewire/core.h +index e1480ff6..1a429bd 100644 +--- a/drivers/firewire/core.h ++++ b/drivers/firewire/core.h +@@ -111,6 +111,7 @@ struct fw_card_driver { + + int (*stop_iso)(struct fw_iso_context *ctx); + }; ++typedef struct fw_card_driver __no_const fw_card_driver_no_const; + + void fw_card_initialize(struct fw_card *card, + const struct fw_card_driver *driver, struct device *device); +diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c +index a66a321..f6caf20 100644 +--- a/drivers/firewire/ohci.c ++++ b/drivers/firewire/ohci.c +@@ -2056,10 +2056,12 @@ static void bus_reset_work(struct work_struct *work) + be32_to_cpu(ohci->next_header)); + } + ++#ifndef CONFIG_GRKERNSEC + if (param_remote_dma) { + reg_write(ohci, OHCI1394_PhyReqFilterHiSet, ~0); + reg_write(ohci, OHCI1394_PhyReqFilterLoSet, ~0); + } ++#endif + + spin_unlock_irq(&ohci->lock); + +@@ -2591,8 +2593,10 @@ static int ohci_enable_phys_dma(struct fw_card *card, + unsigned long flags; + int n, ret = 0; + ++#ifndef CONFIG_GRKERNSEC + if (param_remote_dma) + return 0; ++#endif + + /* + * FIXME: Make sure this bitmask is cleared when we clear the busReset +diff --git a/drivers/firmware/dmi-id.c b/drivers/firmware/dmi-id.c +index 94a58a0..f5eba42 100644 +--- a/drivers/firmware/dmi-id.c ++++ b/drivers/firmware/dmi-id.c +@@ -16,7 +16,7 @@ + struct dmi_device_attribute{ + struct device_attribute dev_attr; + int field; +-}; ++} __do_const; + #define to_dmi_dev_attr(_dev_attr) \ + container_of(_dev_attr, struct dmi_device_attribute, dev_attr) + +diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c +index 17afc51..0ef90cd 100644 +--- a/drivers/firmware/dmi_scan.c ++++ b/drivers/firmware/dmi_scan.c +@@ -835,7 +835,7 @@ int dmi_walk(void (*decode)(const struct dmi_header *, void *), + if (buf == NULL) + return -1; + +- dmi_table(buf, dmi_len, dmi_num, decode, private_data); ++ dmi_table((char __force_kernel *)buf, dmi_len, dmi_num, decode, private_data); + + dmi_unmap(buf); + return 0; +diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c +index 5b53d61..72cee96 100644 +--- a/drivers/firmware/efi/cper.c ++++ b/drivers/firmware/efi/cper.c +@@ -44,12 +44,12 @@ static char rcd_decode_str[CPER_REC_LEN]; + */ + u64 cper_next_record_id(void) + { +- static atomic64_t seq; ++ static atomic64_unchecked_t seq; + +- if (!atomic64_read(&seq)) +- atomic64_set(&seq, ((u64)get_seconds()) << 32); ++ if (!atomic64_read_unchecked(&seq)) ++ atomic64_set_unchecked(&seq, ((u64)get_seconds()) << 32); + +- return atomic64_inc_return(&seq); ++ return atomic64_inc_return_unchecked(&seq); + } + EXPORT_SYMBOL_GPL(cper_next_record_id); + +diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c +index 8590099..d83627a 100644 +--- a/drivers/firmware/efi/efi.c ++++ b/drivers/firmware/efi/efi.c +@@ -148,14 +148,16 @@ static struct attribute_group efi_subsys_attr_group = { + }; + + static struct efivars generic_efivars; +-static struct efivar_operations generic_ops; ++static efivar_operations_no_const generic_ops __read_only; + + static int generic_ops_register(void) + { +- generic_ops.get_variable = efi.get_variable; +- generic_ops.set_variable = efi.set_variable; +- generic_ops.get_next_variable = efi.get_next_variable; +- generic_ops.query_variable_store = efi_query_variable_store; ++ pax_open_kernel(); ++ *(void **)&generic_ops.get_variable = efi.get_variable; ++ *(void **)&generic_ops.set_variable = efi.set_variable; ++ *(void **)&generic_ops.get_next_variable = efi.get_next_variable; ++ *(void **)&generic_ops.query_variable_store = efi_query_variable_store; ++ pax_close_kernel(); + + return efivars_register(&generic_efivars, &generic_ops, efi_kobj); + } +diff --git a/drivers/firmware/efi/efivars.c b/drivers/firmware/efi/efivars.c +index f256ecd..387dcb1 100644 +--- a/drivers/firmware/efi/efivars.c ++++ b/drivers/firmware/efi/efivars.c +@@ -589,7 +589,7 @@ efivar_create_sysfs_entry(struct efivar_entry *new_var) + static int + create_efivars_bin_attributes(void) + { +- struct bin_attribute *attr; ++ bin_attribute_no_const *attr; + int error; + + /* new_var */ +diff --git a/drivers/firmware/efi/runtime-map.c b/drivers/firmware/efi/runtime-map.c +index 87b8e3b..c4afb35 100644 +--- a/drivers/firmware/efi/runtime-map.c ++++ b/drivers/firmware/efi/runtime-map.c +@@ -97,7 +97,7 @@ static void map_release(struct kobject *kobj) + kfree(entry); + } + +-static struct kobj_type __refdata map_ktype = { ++static const struct kobj_type __refconst map_ktype = { + .sysfs_ops = &map_attr_ops, + .default_attrs = def_attrs, + .release = map_release, +diff --git a/drivers/firmware/google/gsmi.c b/drivers/firmware/google/gsmi.c +index f1ab05e..ab51228 100644 +--- a/drivers/firmware/google/gsmi.c ++++ b/drivers/firmware/google/gsmi.c +@@ -709,7 +709,7 @@ static u32 __init hash_oem_table_id(char s[8]) + return local_hash_64(input, 32); + } + +-static struct dmi_system_id gsmi_dmi_table[] __initdata = { ++static const struct dmi_system_id gsmi_dmi_table[] __initconst = { + { + .ident = "Google Board", + .matches = { +diff --git a/drivers/firmware/google/memconsole.c b/drivers/firmware/google/memconsole.c +index 2f569aa..26e4f39 100644 +--- a/drivers/firmware/google/memconsole.c ++++ b/drivers/firmware/google/memconsole.c +@@ -136,7 +136,7 @@ static bool __init found_memconsole(void) + return false; + } + +-static struct dmi_system_id memconsole_dmi_table[] __initdata = { ++static const struct dmi_system_id memconsole_dmi_table[] __initconst = { + { + .ident = "Google Board", + .matches = { +@@ -155,7 +155,10 @@ static int __init memconsole_init(void) + if (!found_memconsole()) + return -ENODEV; + +- memconsole_bin_attr.size = memconsole_length; ++ pax_open_kernel(); ++ *(size_t *)&memconsole_bin_attr.size = memconsole_length; ++ pax_close_kernel(); ++ + return sysfs_create_bin_file(firmware_kobj, &memconsole_bin_attr); + } + +diff --git a/drivers/firmware/memmap.c b/drivers/firmware/memmap.c +index cc016c6..d35279e 100644 +--- a/drivers/firmware/memmap.c ++++ b/drivers/firmware/memmap.c +@@ -124,7 +124,7 @@ static void __meminit release_firmware_map_entry(struct kobject *kobj) + kfree(entry); + } + +-static struct kobj_type __refdata memmap_ktype = { ++static const struct kobj_type __refconst memmap_ktype = { + .release = release_firmware_map_entry, + .sysfs_ops = &memmap_attr_ops, + .default_attrs = def_attrs, +diff --git a/drivers/gpio/gpio-em.c b/drivers/gpio/gpio-em.c +index fe49ec3..1ade794 100644 +--- a/drivers/gpio/gpio-em.c ++++ b/drivers/gpio/gpio-em.c +@@ -278,7 +278,7 @@ static int em_gio_probe(struct platform_device *pdev) + struct em_gio_priv *p; + struct resource *io[2], *irq[2]; + struct gpio_chip *gpio_chip; +- struct irq_chip *irq_chip; ++ irq_chip_no_const *irq_chip; + const char *name = dev_name(&pdev->dev); + int ret; + +diff --git a/drivers/gpio/gpio-ich.c b/drivers/gpio/gpio-ich.c +index 3784e81..73637b5 100644 +--- a/drivers/gpio/gpio-ich.c ++++ b/drivers/gpio/gpio-ich.c +@@ -94,7 +94,7 @@ struct ichx_desc { + * this option allows driver caching written output values + */ + bool use_outlvl_cache; +-}; ++} __do_const; + + static struct { + spinlock_t lock; +diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c +index 415682f..08438b8 100644 +--- a/drivers/gpio/gpio-omap.c ++++ b/drivers/gpio/gpio-omap.c +@@ -1162,7 +1162,7 @@ static int omap_gpio_probe(struct platform_device *pdev) + const struct omap_gpio_platform_data *pdata; + struct resource *res; + struct gpio_bank *bank; +- struct irq_chip *irqc; ++ irq_chip_no_const *irqc; + int ret; + + match = of_match_device(of_match_ptr(omap_gpio_match), dev); +diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c +index bf6c094..6573caf 100644 +--- a/drivers/gpio/gpio-rcar.c ++++ b/drivers/gpio/gpio-rcar.c +@@ -357,7 +357,7 @@ static int gpio_rcar_probe(struct platform_device *pdev) + struct gpio_rcar_priv *p; + struct resource *io, *irq; + struct gpio_chip *gpio_chip; +- struct irq_chip *irq_chip; ++ irq_chip_no_const *irq_chip; + struct device *dev = &pdev->dev; + const char *name = dev_name(dev); + int ret; +diff --git a/drivers/gpio/gpio-vr41xx.c b/drivers/gpio/gpio-vr41xx.c +index dbf28fa..04dad4e 100644 +--- a/drivers/gpio/gpio-vr41xx.c ++++ b/drivers/gpio/gpio-vr41xx.c +@@ -224,7 +224,7 @@ static int giu_get_irq(unsigned int irq) + printk(KERN_ERR "spurious GIU interrupt: %04x(%04x),%04x(%04x)\n", + maskl, pendl, maskh, pendh); + +- atomic_inc(&irq_err_count); ++ atomic_inc_unchecked(&irq_err_count); + + return -EINVAL; + } +diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c +index c81bda0..a8ccd9f 100644 +--- a/drivers/gpio/gpiolib.c ++++ b/drivers/gpio/gpiolib.c +@@ -539,8 +539,10 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) + } + + if (gpiochip->irqchip) { +- gpiochip->irqchip->irq_request_resources = NULL; +- gpiochip->irqchip->irq_release_resources = NULL; ++ pax_open_kernel(); ++ *(void **)&gpiochip->irqchip->irq_request_resources = NULL; ++ *(void **)&gpiochip->irqchip->irq_release_resources = NULL; ++ pax_close_kernel(); + gpiochip->irqchip = NULL; + } + } +@@ -606,8 +608,11 @@ int gpiochip_irqchip_add(struct gpio_chip *gpiochip, + gpiochip->irqchip = NULL; + return -EINVAL; + } +- irqchip->irq_request_resources = gpiochip_irq_reqres; +- irqchip->irq_release_resources = gpiochip_irq_relres; ++ ++ pax_open_kernel(); ++ *(void **)&irqchip->irq_request_resources = gpiochip_irq_reqres; ++ *(void **)&irqchip->irq_release_resources = gpiochip_irq_relres; ++ pax_close_kernel(); + + /* + * Prepare the mapping since the irqchip shall be orthogonal to +diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c +index b7f101b..43685fd 100644 +--- a/drivers/gpu/drm/drm_crtc.c ++++ b/drivers/gpu/drm/drm_crtc.c +@@ -3892,7 +3892,7 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev, + goto done; + } + +- if (copy_to_user(&enum_ptr[copied].name, ++ if (copy_to_user(enum_ptr[copied].name, + &prop_enum->name, DRM_PROP_NAME_LEN)) { + ret = -EFAULT; + goto done; +diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c +index bc3da32..7289357 100644 +--- a/drivers/gpu/drm/drm_drv.c ++++ b/drivers/gpu/drm/drm_drv.c +@@ -443,7 +443,7 @@ void drm_unplug_dev(struct drm_device *dev) + + drm_device_set_unplugged(dev); + +- if (dev->open_count == 0) { ++ if (local_read(&dev->open_count) == 0) { + drm_put_dev(dev); + } + mutex_unlock(&drm_global_mutex); +diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c +index e9a2827..5df4716 100644 +--- a/drivers/gpu/drm/drm_fb_helper.c ++++ b/drivers/gpu/drm/drm_fb_helper.c +@@ -771,7 +771,9 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) + int i, j, rc = 0; + int start; + +- drm_modeset_lock_all(dev); ++ if (__drm_modeset_lock_all(dev, !!oops_in_progress)) { ++ return -EBUSY; ++ } + if (!drm_fb_helper_is_bound(fb_helper)) { + drm_modeset_unlock_all(dev); + return -EBUSY; +@@ -945,7 +947,9 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, + int ret = 0; + int i; + +- drm_modeset_lock_all(dev); ++ if (__drm_modeset_lock_all(dev, !!oops_in_progress)) { ++ return -EBUSY; ++ } + if (!drm_fb_helper_is_bound(fb_helper)) { + drm_modeset_unlock_all(dev); + return -EBUSY; +diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c +index ed7bc68..0d536af 100644 +--- a/drivers/gpu/drm/drm_fops.c ++++ b/drivers/gpu/drm/drm_fops.c +@@ -89,7 +89,7 @@ int drm_open(struct inode *inode, struct file *filp) + return PTR_ERR(minor); + + dev = minor->dev; +- if (!dev->open_count++) ++ if (local_inc_return(&dev->open_count) == 1) + need_setup = 1; + + /* share address_space across all char-devs of a single device */ +@@ -106,7 +106,7 @@ int drm_open(struct inode *inode, struct file *filp) + return 0; + + err_undo: +- dev->open_count--; ++ local_dec(&dev->open_count); + drm_minor_release(minor); + return retcode; + } +@@ -376,7 +376,7 @@ int drm_release(struct inode *inode, struct file *filp) + + mutex_lock(&drm_global_mutex); + +- DRM_DEBUG("open_count = %d\n", dev->open_count); ++ DRM_DEBUG("open_count = %ld\n", local_read(&dev->open_count)); + + mutex_lock(&dev->struct_mutex); + list_del(&file_priv->lhead); +@@ -389,10 +389,10 @@ int drm_release(struct inode *inode, struct file *filp) + * Begin inline drm_release + */ + +- DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n", ++ DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %ld\n", + task_pid_nr(current), + (long)old_encode_dev(file_priv->minor->kdev->devt), +- dev->open_count); ++ local_read(&dev->open_count)); + + /* Release any auth tokens that might point to this file_priv, + (do that under the drm_global_mutex) */ +@@ -465,7 +465,7 @@ int drm_release(struct inode *inode, struct file *filp) + * End inline drm_release + */ + +- if (!--dev->open_count) { ++ if (local_dec_and_test(&dev->open_count)) { + retcode = drm_lastclose(dev); + if (drm_device_is_unplugged(dev)) + drm_put_dev(dev); +diff --git a/drivers/gpu/drm/drm_global.c b/drivers/gpu/drm/drm_global.c +index 3d2e91c..d31c4c9 100644 +--- a/drivers/gpu/drm/drm_global.c ++++ b/drivers/gpu/drm/drm_global.c +@@ -36,7 +36,7 @@ + struct drm_global_item { + struct mutex mutex; + void *object; +- int refcount; ++ atomic_t refcount; + }; + + static struct drm_global_item glob[DRM_GLOBAL_NUM]; +@@ -49,7 +49,7 @@ void drm_global_init(void) + struct drm_global_item *item = &glob[i]; + mutex_init(&item->mutex); + item->object = NULL; +- item->refcount = 0; ++ atomic_set(&item->refcount, 0); + } + } + +@@ -59,7 +59,7 @@ void drm_global_release(void) + for (i = 0; i < DRM_GLOBAL_NUM; ++i) { + struct drm_global_item *item = &glob[i]; + BUG_ON(item->object != NULL); +- BUG_ON(item->refcount != 0); ++ BUG_ON(atomic_read(&item->refcount) != 0); + } + } + +@@ -69,7 +69,7 @@ int drm_global_item_ref(struct drm_global_reference *ref) + struct drm_global_item *item = &glob[ref->global_type]; + + mutex_lock(&item->mutex); +- if (item->refcount == 0) { ++ if (atomic_read(&item->refcount) == 0) { + item->object = kzalloc(ref->size, GFP_KERNEL); + if (unlikely(item->object == NULL)) { + ret = -ENOMEM; +@@ -82,7 +82,7 @@ int drm_global_item_ref(struct drm_global_reference *ref) + goto out_err; + + } +- ++item->refcount; ++ atomic_inc(&item->refcount); + ref->object = item->object; + mutex_unlock(&item->mutex); + return 0; +@@ -98,9 +98,9 @@ void drm_global_item_unref(struct drm_global_reference *ref) + struct drm_global_item *item = &glob[ref->global_type]; + + mutex_lock(&item->mutex); +- BUG_ON(item->refcount == 0); ++ BUG_ON(atomic_read(&item->refcount) == 0); + BUG_ON(ref->object != item->object); +- if (--item->refcount == 0) { ++ if (atomic_dec_and_test(&item->refcount)) { + ref->release(ref); + item->object = NULL; + } +diff --git a/drivers/gpu/drm/drm_info.c b/drivers/gpu/drm/drm_info.c +index 51efebd..2b70935 100644 +--- a/drivers/gpu/drm/drm_info.c ++++ b/drivers/gpu/drm/drm_info.c +@@ -76,10 +76,13 @@ int drm_vm_info(struct seq_file *m, void *data) + struct drm_local_map *map; + struct drm_map_list *r_list; + +- /* Hardcoded from _DRM_FRAME_BUFFER, +- _DRM_REGISTERS, _DRM_SHM, _DRM_AGP, and +- _DRM_SCATTER_GATHER and _DRM_CONSISTENT */ +- const char *types[] = { "FB", "REG", "SHM", "AGP", "SG", "PCI" }; ++ static const char * const types[] = { ++ [_DRM_FRAME_BUFFER] = "FB", ++ [_DRM_REGISTERS] = "REG", ++ [_DRM_SHM] = "SHM", ++ [_DRM_AGP] = "AGP", ++ [_DRM_SCATTER_GATHER] = "SG", ++ [_DRM_CONSISTENT] = "PCI"}; + const char *type; + int i; + +@@ -90,7 +93,7 @@ int drm_vm_info(struct seq_file *m, void *data) + map = r_list->map; + if (!map) + continue; +- if (map->type < 0 || map->type > 5) ++ if (map->type >= ARRAY_SIZE(types)) + type = "??"; + else + type = types[map->type]; +diff --git a/drivers/gpu/drm/drm_ioc32.c b/drivers/gpu/drm/drm_ioc32.c +index 2f4c4343..dd12cd2 100644 +--- a/drivers/gpu/drm/drm_ioc32.c ++++ b/drivers/gpu/drm/drm_ioc32.c +@@ -457,7 +457,7 @@ static int compat_drm_infobufs(struct file *file, unsigned int cmd, + request = compat_alloc_user_space(nbytes); + if (!access_ok(VERIFY_WRITE, request, nbytes)) + return -EFAULT; +- list = (struct drm_buf_desc *) (request + 1); ++ list = (struct drm_buf_desc __user *) (request + 1); + + if (__put_user(count, &request->count) + || __put_user(list, &request->list)) +@@ -518,7 +518,7 @@ static int compat_drm_mapbufs(struct file *file, unsigned int cmd, + request = compat_alloc_user_space(nbytes); + if (!access_ok(VERIFY_WRITE, request, nbytes)) + return -EFAULT; +- list = (struct drm_buf_pub *) (request + 1); ++ list = (struct drm_buf_pub __user *) (request + 1); + + if (__put_user(count, &request->count) + || __put_user(list, &request->list)) +@@ -1016,7 +1016,7 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd, + return 0; + } + +-drm_ioctl_compat_t *drm_compat_ioctls[] = { ++drm_ioctl_compat_t drm_compat_ioctls[] = { + [DRM_IOCTL_NR(DRM_IOCTL_VERSION32)] = compat_drm_version, + [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE32)] = compat_drm_getunique, + [DRM_IOCTL_NR(DRM_IOCTL_GET_MAP32)] = compat_drm_getmap, +@@ -1062,7 +1062,6 @@ drm_ioctl_compat_t *drm_compat_ioctls[] = { + long drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) + { + unsigned int nr = DRM_IOCTL_NR(cmd); +- drm_ioctl_compat_t *fn; + int ret; + + /* Assume that ioctls without an explicit compat routine will just +@@ -1072,10 +1071,8 @@ long drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) + if (nr >= ARRAY_SIZE(drm_compat_ioctls)) + return drm_ioctl(filp, cmd, arg); + +- fn = drm_compat_ioctls[nr]; +- +- if (fn != NULL) +- ret = (*fn) (filp, cmd, arg); ++ if (drm_compat_ioctls[nr] != NULL) ++ ret = (*drm_compat_ioctls[nr]) (filp, cmd, arg); + else + ret = drm_ioctl(filp, cmd, arg); + +diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c +index 00587a1..57a65ca 100644 +--- a/drivers/gpu/drm/drm_ioctl.c ++++ b/drivers/gpu/drm/drm_ioctl.c +@@ -642,7 +642,7 @@ long drm_ioctl(struct file *filp, + struct drm_file *file_priv = filp->private_data; + struct drm_device *dev; + const struct drm_ioctl_desc *ioctl = NULL; +- drm_ioctl_t *func; ++ drm_ioctl_no_const_t func; + unsigned int nr = DRM_IOCTL_NR(cmd); + int retcode = -EINVAL; + char stack_kdata[128]; +diff --git a/drivers/gpu/drm/i810/i810_drv.h b/drivers/gpu/drm/i810/i810_drv.h +index 93ec5dc..82acbaf 100644 +--- a/drivers/gpu/drm/i810/i810_drv.h ++++ b/drivers/gpu/drm/i810/i810_drv.h +@@ -110,8 +110,8 @@ typedef struct drm_i810_private { + int page_flipping; + + wait_queue_head_t irq_queue; +- atomic_t irq_received; +- atomic_t irq_emitted; ++ atomic_unchecked_t irq_received; ++ atomic_unchecked_t irq_emitted; + + int front_offset; + } drm_i810_private_t; +diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c +index 318ade9..1f5de55 100644 +--- a/drivers/gpu/drm/i915/i915_dma.c ++++ b/drivers/gpu/drm/i915/i915_dma.c +@@ -1294,7 +1294,7 @@ static bool i915_switcheroo_can_switch(struct pci_dev *pdev) + * locking inversion with the driver load path. And the access here is + * completely racy anyway. So don't bother with locking for now. + */ +- return dev->open_count == 0; ++ return local_read(&dev->open_count) == 0; + } + + static const struct vga_switcheroo_client_ops i915_switcheroo_ops = { +diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c +index 1a0611b..dd1fbfc 100644 +--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c ++++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c +@@ -866,12 +866,12 @@ i915_gem_check_execbuffer(struct drm_i915_gem_execbuffer2 *exec) + static int + validate_exec_list(struct drm_device *dev, + struct drm_i915_gem_exec_object2 *exec, +- int count) ++ unsigned int count) + { + unsigned relocs_total = 0; + unsigned relocs_max = UINT_MAX / sizeof(struct drm_i915_gem_relocation_entry); + unsigned invalid_flags; +- int i; ++ unsigned int i; + + invalid_flags = __EXEC_OBJECT_UNKNOWN_FLAGS; + if (USES_FULL_PPGTT(dev)) +diff --git a/drivers/gpu/drm/i915/i915_ioc32.c b/drivers/gpu/drm/i915/i915_ioc32.c +index 2e0613e..a8b94d9 100644 +--- a/drivers/gpu/drm/i915/i915_ioc32.c ++++ b/drivers/gpu/drm/i915/i915_ioc32.c +@@ -181,7 +181,7 @@ static int compat_i915_alloc(struct file *file, unsigned int cmd, + (unsigned long)request); + } + +-static drm_ioctl_compat_t *i915_compat_ioctls[] = { ++static drm_ioctl_compat_t i915_compat_ioctls[] = { + [DRM_I915_BATCHBUFFER] = compat_i915_batchbuffer, + [DRM_I915_CMDBUFFER] = compat_i915_cmdbuffer, + [DRM_I915_GETPARAM] = compat_i915_getparam, +@@ -202,18 +202,15 @@ static drm_ioctl_compat_t *i915_compat_ioctls[] = { + long i915_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) + { + unsigned int nr = DRM_IOCTL_NR(cmd); +- drm_ioctl_compat_t *fn = NULL; + int ret; + + if (nr < DRM_COMMAND_BASE) + return drm_compat_ioctl(filp, cmd, arg); + +- if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(i915_compat_ioctls)) +- fn = i915_compat_ioctls[nr - DRM_COMMAND_BASE]; +- +- if (fn != NULL) ++ if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(i915_compat_ioctls)) { ++ drm_ioctl_compat_t fn = i915_compat_ioctls[nr - DRM_COMMAND_BASE]; + ret = (*fn) (filp, cmd, arg); +- else ++ } else + ret = drm_ioctl(filp, cmd, arg); + + return ret; +diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c +index 448327f..ebcf3ad 100644 +--- a/drivers/gpu/drm/i915/intel_display.c ++++ b/drivers/gpu/drm/i915/intel_display.c +@@ -12815,13 +12815,13 @@ struct intel_quirk { + int subsystem_vendor; + int subsystem_device; + void (*hook)(struct drm_device *dev); +-}; ++} __do_const; + + /* For systems that don't have a meaningful PCI subdevice/subvendor ID */ + struct intel_dmi_quirk { + void (*hook)(struct drm_device *dev); + const struct dmi_system_id (*dmi_id_list)[]; +-}; ++} __do_const; + + static int intel_dmi_reverse_brightness(const struct dmi_system_id *id) + { +@@ -12829,18 +12829,20 @@ static int intel_dmi_reverse_brightness(const struct dmi_system_id *id) + return 1; + } + +-static const struct intel_dmi_quirk intel_dmi_quirks[] = { ++static const struct dmi_system_id intel_dmi_quirks_table[] = { + { +- .dmi_id_list = &(const struct dmi_system_id[]) { +- { +- .callback = intel_dmi_reverse_brightness, +- .ident = "NCR Corporation", +- .matches = {DMI_MATCH(DMI_SYS_VENDOR, "NCR Corporation"), +- DMI_MATCH(DMI_PRODUCT_NAME, ""), +- }, +- }, +- { } /* terminating entry */ ++ .callback = intel_dmi_reverse_brightness, ++ .ident = "NCR Corporation", ++ .matches = {DMI_MATCH(DMI_SYS_VENDOR, "NCR Corporation"), ++ DMI_MATCH(DMI_PRODUCT_NAME, ""), + }, ++ }, ++ { } /* terminating entry */ ++}; ++ ++static const struct intel_dmi_quirk intel_dmi_quirks[] = { ++ { ++ .dmi_id_list = &intel_dmi_quirks_table, + .hook = quirk_invert_brightness, + }, + }; +diff --git a/drivers/gpu/drm/mga/mga_drv.h b/drivers/gpu/drm/mga/mga_drv.h +index b4a20149..219ab78 100644 +--- a/drivers/gpu/drm/mga/mga_drv.h ++++ b/drivers/gpu/drm/mga/mga_drv.h +@@ -122,9 +122,9 @@ typedef struct drm_mga_private { + u32 clear_cmd; + u32 maccess; + +- atomic_t vbl_received; /**< Number of vblanks received. */ ++ atomic_unchecked_t vbl_received; /**< Number of vblanks received. */ + wait_queue_head_t fence_queue; +- atomic_t last_fence_retired; ++ atomic_unchecked_t last_fence_retired; + u32 next_fence_to_post; + + unsigned int fb_cpp; +diff --git a/drivers/gpu/drm/mga/mga_ioc32.c b/drivers/gpu/drm/mga/mga_ioc32.c +index 729bfd5..ead8823 100644 +--- a/drivers/gpu/drm/mga/mga_ioc32.c ++++ b/drivers/gpu/drm/mga/mga_ioc32.c +@@ -190,7 +190,7 @@ static int compat_mga_dma_bootstrap(struct file *file, unsigned int cmd, + return 0; + } + +-drm_ioctl_compat_t *mga_compat_ioctls[] = { ++drm_ioctl_compat_t mga_compat_ioctls[] = { + [DRM_MGA_INIT] = compat_mga_init, + [DRM_MGA_GETPARAM] = compat_mga_getparam, + [DRM_MGA_DMA_BOOTSTRAP] = compat_mga_dma_bootstrap, +@@ -208,18 +208,15 @@ drm_ioctl_compat_t *mga_compat_ioctls[] = { + long mga_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) + { + unsigned int nr = DRM_IOCTL_NR(cmd); +- drm_ioctl_compat_t *fn = NULL; + int ret; + + if (nr < DRM_COMMAND_BASE) + return drm_compat_ioctl(filp, cmd, arg); + +- if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls)) +- fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE]; +- +- if (fn != NULL) ++ if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls)) { ++ drm_ioctl_compat_t fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE]; + ret = (*fn) (filp, cmd, arg); +- else ++ } else + ret = drm_ioctl(filp, cmd, arg); + + return ret; +diff --git a/drivers/gpu/drm/mga/mga_irq.c b/drivers/gpu/drm/mga/mga_irq.c +index 1b071b8..de8601a 100644 +--- a/drivers/gpu/drm/mga/mga_irq.c ++++ b/drivers/gpu/drm/mga/mga_irq.c +@@ -43,7 +43,7 @@ u32 mga_get_vblank_counter(struct drm_device *dev, int crtc) + if (crtc != 0) + return 0; + +- return atomic_read(&dev_priv->vbl_received); ++ return atomic_read_unchecked(&dev_priv->vbl_received); + } + + +@@ -59,7 +59,7 @@ irqreturn_t mga_driver_irq_handler(int irq, void *arg) + /* VBLANK interrupt */ + if (status & MGA_VLINEPEN) { + MGA_WRITE(MGA_ICLEAR, MGA_VLINEICLR); +- atomic_inc(&dev_priv->vbl_received); ++ atomic_inc_unchecked(&dev_priv->vbl_received); + drm_handle_vblank(dev, 0); + handled = 1; + } +@@ -78,7 +78,7 @@ irqreturn_t mga_driver_irq_handler(int irq, void *arg) + if ((prim_start & ~0x03) != (prim_end & ~0x03)) + MGA_WRITE(MGA_PRIMEND, prim_end); + +- atomic_inc(&dev_priv->last_fence_retired); ++ atomic_inc_unchecked(&dev_priv->last_fence_retired); + wake_up(&dev_priv->fence_queue); + handled = 1; + } +@@ -129,7 +129,7 @@ int mga_driver_fence_wait(struct drm_device *dev, unsigned int *sequence) + * using fences. + */ + DRM_WAIT_ON(ret, dev_priv->fence_queue, 3 * HZ, +- (((cur_fence = atomic_read(&dev_priv->last_fence_retired)) ++ (((cur_fence = atomic_read_unchecked(&dev_priv->last_fence_retired)) + - *sequence) <= (1 << 23))); + + *sequence = cur_fence; +diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c +index dae2c96..324dbe4 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_bios.c ++++ b/drivers/gpu/drm/nouveau/nouveau_bios.c +@@ -963,7 +963,7 @@ static int parse_bit_tmds_tbl_entry(struct drm_device *dev, struct nvbios *bios, + struct bit_table { + const char id; + int (* const parse_fn)(struct drm_device *, struct nvbios *, struct bit_entry *); +-}; ++} __no_const; + + #define BIT_TABLE(id, funcid) ((struct bit_table){ id, parse_bit_##funcid##_tbl_entry }) + +diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.h b/drivers/gpu/drm/nouveau/nouveau_drm.h +index 8ae36f2..1147a30 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_drm.h ++++ b/drivers/gpu/drm/nouveau/nouveau_drm.h +@@ -121,7 +121,6 @@ struct nouveau_drm { + struct drm_global_reference mem_global_ref; + struct ttm_bo_global_ref bo_global_ref; + struct ttm_bo_device bdev; +- atomic_t validate_sequence; + int (*move)(struct nouveau_channel *, + struct ttm_buffer_object *, + struct ttm_mem_reg *, struct ttm_mem_reg *); +diff --git a/drivers/gpu/drm/nouveau/nouveau_ioc32.c b/drivers/gpu/drm/nouveau/nouveau_ioc32.c +index 462679a..88e32a7 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_ioc32.c ++++ b/drivers/gpu/drm/nouveau/nouveau_ioc32.c +@@ -50,7 +50,7 @@ long nouveau_compat_ioctl(struct file *filp, unsigned int cmd, + unsigned long arg) + { + unsigned int nr = DRM_IOCTL_NR(cmd); +- drm_ioctl_compat_t *fn = NULL; ++ drm_ioctl_compat_t fn = NULL; + int ret; + + if (nr < DRM_COMMAND_BASE) +diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c +index 3d1cfcb..0542700 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_ttm.c ++++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c +@@ -127,11 +127,11 @@ nouveau_vram_manager_debug(struct ttm_mem_type_manager *man, const char *prefix) + } + + const struct ttm_mem_type_manager_func nouveau_vram_manager = { +- nouveau_vram_manager_init, +- nouveau_vram_manager_fini, +- nouveau_vram_manager_new, +- nouveau_vram_manager_del, +- nouveau_vram_manager_debug ++ .init = nouveau_vram_manager_init, ++ .takedown = nouveau_vram_manager_fini, ++ .get_node = nouveau_vram_manager_new, ++ .put_node = nouveau_vram_manager_del, ++ .debug = nouveau_vram_manager_debug + }; + + static int +@@ -195,11 +195,11 @@ nouveau_gart_manager_debug(struct ttm_mem_type_manager *man, const char *prefix) + } + + const struct ttm_mem_type_manager_func nouveau_gart_manager = { +- nouveau_gart_manager_init, +- nouveau_gart_manager_fini, +- nouveau_gart_manager_new, +- nouveau_gart_manager_del, +- nouveau_gart_manager_debug ++ .init = nouveau_gart_manager_init, ++ .takedown = nouveau_gart_manager_fini, ++ .get_node = nouveau_gart_manager_new, ++ .put_node = nouveau_gart_manager_del, ++ .debug = nouveau_gart_manager_debug + }; + + /*XXX*/ +@@ -268,11 +268,11 @@ nv04_gart_manager_debug(struct ttm_mem_type_manager *man, const char *prefix) + } + + const struct ttm_mem_type_manager_func nv04_gart_manager = { +- nv04_gart_manager_init, +- nv04_gart_manager_fini, +- nv04_gart_manager_new, +- nv04_gart_manager_del, +- nv04_gart_manager_debug ++ .init = nv04_gart_manager_init, ++ .takedown = nv04_gart_manager_fini, ++ .get_node = nv04_gart_manager_new, ++ .put_node = nv04_gart_manager_del, ++ .debug = nv04_gart_manager_debug + }; + + int +diff --git a/drivers/gpu/drm/nouveau/nouveau_vga.c b/drivers/gpu/drm/nouveau/nouveau_vga.c +index c7592ec..dd45ebc 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_vga.c ++++ b/drivers/gpu/drm/nouveau/nouveau_vga.c +@@ -72,7 +72,7 @@ nouveau_switcheroo_can_switch(struct pci_dev *pdev) + * locking inversion with the driver load path. And the access here is + * completely racy anyway. So don't bother with locking for now. + */ +- return dev->open_count == 0; ++ return local_read(&dev->open_count) == 0; + } + + static const struct vga_switcheroo_client_ops +diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c +index 9782364..89bd954 100644 +--- a/drivers/gpu/drm/qxl/qxl_cmd.c ++++ b/drivers/gpu/drm/qxl/qxl_cmd.c +@@ -285,27 +285,27 @@ static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port, + int ret; + + mutex_lock(&qdev->async_io_mutex); +- irq_num = atomic_read(&qdev->irq_received_io_cmd); ++ irq_num = atomic_read_unchecked(&qdev->irq_received_io_cmd); + if (qdev->last_sent_io_cmd > irq_num) { + if (intr) + ret = wait_event_interruptible_timeout(qdev->io_cmd_event, +- atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); ++ atomic_read_unchecked(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); + else + ret = wait_event_timeout(qdev->io_cmd_event, +- atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); ++ atomic_read_unchecked(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); + /* 0 is timeout, just bail the "hw" has gone away */ + if (ret <= 0) + goto out; +- irq_num = atomic_read(&qdev->irq_received_io_cmd); ++ irq_num = atomic_read_unchecked(&qdev->irq_received_io_cmd); + } + outb(val, addr); + qdev->last_sent_io_cmd = irq_num + 1; + if (intr) + ret = wait_event_interruptible_timeout(qdev->io_cmd_event, +- atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); ++ atomic_read_unchecked(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); + else + ret = wait_event_timeout(qdev->io_cmd_event, +- atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); ++ atomic_read_unchecked(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); + out: + if (ret > 0) + ret = 0; +diff --git a/drivers/gpu/drm/qxl/qxl_debugfs.c b/drivers/gpu/drm/qxl/qxl_debugfs.c +index 6911b8c..89d6867 100644 +--- a/drivers/gpu/drm/qxl/qxl_debugfs.c ++++ b/drivers/gpu/drm/qxl/qxl_debugfs.c +@@ -42,10 +42,10 @@ qxl_debugfs_irq_received(struct seq_file *m, void *data) + struct drm_info_node *node = (struct drm_info_node *) m->private; + struct qxl_device *qdev = node->minor->dev->dev_private; + +- seq_printf(m, "%d\n", atomic_read(&qdev->irq_received)); +- seq_printf(m, "%d\n", atomic_read(&qdev->irq_received_display)); +- seq_printf(m, "%d\n", atomic_read(&qdev->irq_received_cursor)); +- seq_printf(m, "%d\n", atomic_read(&qdev->irq_received_io_cmd)); ++ seq_printf(m, "%d\n", atomic_read_unchecked(&qdev->irq_received)); ++ seq_printf(m, "%d\n", atomic_read_unchecked(&qdev->irq_received_display)); ++ seq_printf(m, "%d\n", atomic_read_unchecked(&qdev->irq_received_cursor)); ++ seq_printf(m, "%d\n", atomic_read_unchecked(&qdev->irq_received_io_cmd)); + seq_printf(m, "%d\n", qdev->irq_received_error); + return 0; + } +diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h +index 7c6cafe..460f542 100644 +--- a/drivers/gpu/drm/qxl/qxl_drv.h ++++ b/drivers/gpu/drm/qxl/qxl_drv.h +@@ -290,10 +290,10 @@ struct qxl_device { + unsigned int last_sent_io_cmd; + + /* interrupt handling */ +- atomic_t irq_received; +- atomic_t irq_received_display; +- atomic_t irq_received_cursor; +- atomic_t irq_received_io_cmd; ++ atomic_unchecked_t irq_received; ++ atomic_unchecked_t irq_received_display; ++ atomic_unchecked_t irq_received_cursor; ++ atomic_unchecked_t irq_received_io_cmd; + unsigned irq_received_error; + wait_queue_head_t display_event; + wait_queue_head_t cursor_event; +diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c +index b110883..dd06418 100644 +--- a/drivers/gpu/drm/qxl/qxl_ioctl.c ++++ b/drivers/gpu/drm/qxl/qxl_ioctl.c +@@ -181,7 +181,7 @@ static int qxl_process_single_command(struct qxl_device *qdev, + + /* TODO copy slow path code from i915 */ + fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_SIZE)); +- unwritten = __copy_from_user_inatomic_nocache(fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_SIZE), (void *)(unsigned long)cmd->command, cmd->command_size); ++ unwritten = __copy_from_user_inatomic_nocache(fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_SIZE), (void __force_user *)(unsigned long)cmd->command, cmd->command_size); + + { + struct qxl_drawable *draw = fb_cmd; +@@ -201,7 +201,7 @@ static int qxl_process_single_command(struct qxl_device *qdev, + struct drm_qxl_reloc reloc; + + if (copy_from_user(&reloc, +- &((struct drm_qxl_reloc *)(uintptr_t)cmd->relocs)[i], ++ &((struct drm_qxl_reloc __force_user *)(uintptr_t)cmd->relocs)[i], + sizeof(reloc))) { + ret = -EFAULT; + goto out_free_bos; +@@ -294,10 +294,10 @@ static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, + + for (cmd_num = 0; cmd_num < execbuffer->commands_num; ++cmd_num) { + +- struct drm_qxl_command *commands = +- (struct drm_qxl_command *)(uintptr_t)execbuffer->commands; ++ struct drm_qxl_command __user *commands = ++ (struct drm_qxl_command __user *)(uintptr_t)execbuffer->commands; + +- if (copy_from_user(&user_cmd, &commands[cmd_num], ++ if (copy_from_user(&user_cmd, (struct drm_qxl_command __force_user *)&commands[cmd_num], + sizeof(user_cmd))) + return -EFAULT; + +diff --git a/drivers/gpu/drm/qxl/qxl_irq.c b/drivers/gpu/drm/qxl/qxl_irq.c +index 0bf1e20..42a7310 100644 +--- a/drivers/gpu/drm/qxl/qxl_irq.c ++++ b/drivers/gpu/drm/qxl/qxl_irq.c +@@ -36,19 +36,19 @@ irqreturn_t qxl_irq_handler(int irq, void *arg) + if (!pending) + return IRQ_NONE; + +- atomic_inc(&qdev->irq_received); ++ atomic_inc_unchecked(&qdev->irq_received); + + if (pending & QXL_INTERRUPT_DISPLAY) { +- atomic_inc(&qdev->irq_received_display); ++ atomic_inc_unchecked(&qdev->irq_received_display); + wake_up_all(&qdev->display_event); + qxl_queue_garbage_collect(qdev, false); + } + if (pending & QXL_INTERRUPT_CURSOR) { +- atomic_inc(&qdev->irq_received_cursor); ++ atomic_inc_unchecked(&qdev->irq_received_cursor); + wake_up_all(&qdev->cursor_event); + } + if (pending & QXL_INTERRUPT_IO_CMD) { +- atomic_inc(&qdev->irq_received_io_cmd); ++ atomic_inc_unchecked(&qdev->irq_received_io_cmd); + wake_up_all(&qdev->io_cmd_event); + } + if (pending & QXL_INTERRUPT_ERROR) { +@@ -85,10 +85,10 @@ int qxl_irq_init(struct qxl_device *qdev) + init_waitqueue_head(&qdev->io_cmd_event); + INIT_WORK(&qdev->client_monitors_config_work, + qxl_client_monitors_config_work_func); +- atomic_set(&qdev->irq_received, 0); +- atomic_set(&qdev->irq_received_display, 0); +- atomic_set(&qdev->irq_received_cursor, 0); +- atomic_set(&qdev->irq_received_io_cmd, 0); ++ atomic_set_unchecked(&qdev->irq_received, 0); ++ atomic_set_unchecked(&qdev->irq_received_display, 0); ++ atomic_set_unchecked(&qdev->irq_received_cursor, 0); ++ atomic_set_unchecked(&qdev->irq_received_io_cmd, 0); + qdev->irq_received_error = 0; + ret = drm_irq_install(qdev->ddev, qdev->ddev->pdev->irq); + qdev->ram_header->int_mask = QXL_INTERRUPT_MASK; +diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c +index 0cbc4c9..0e46686 100644 +--- a/drivers/gpu/drm/qxl/qxl_ttm.c ++++ b/drivers/gpu/drm/qxl/qxl_ttm.c +@@ -103,7 +103,7 @@ static void qxl_ttm_global_fini(struct qxl_device *qdev) + } + } + +-static struct vm_operations_struct qxl_ttm_vm_ops; ++static vm_operations_struct_no_const qxl_ttm_vm_ops __read_only; + static const struct vm_operations_struct *ttm_vm_ops; + + static int qxl_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) +@@ -145,8 +145,10 @@ int qxl_mmap(struct file *filp, struct vm_area_struct *vma) + return r; + if (unlikely(ttm_vm_ops == NULL)) { + ttm_vm_ops = vma->vm_ops; ++ pax_open_kernel(); + qxl_ttm_vm_ops = *ttm_vm_ops; + qxl_ttm_vm_ops.fault = &qxl_ttm_fault; ++ pax_close_kernel(); + } + vma->vm_ops = &qxl_ttm_vm_ops; + return 0; +@@ -464,25 +466,23 @@ static int qxl_mm_dump_table(struct seq_file *m, void *data) + static int qxl_ttm_debugfs_init(struct qxl_device *qdev) + { + #if defined(CONFIG_DEBUG_FS) +- static struct drm_info_list qxl_mem_types_list[QXL_DEBUGFS_MEM_TYPES]; +- static char qxl_mem_types_names[QXL_DEBUGFS_MEM_TYPES][32]; +- unsigned i; +- +- for (i = 0; i < QXL_DEBUGFS_MEM_TYPES; i++) { +- if (i == 0) +- sprintf(qxl_mem_types_names[i], "qxl_mem_mm"); +- else +- sprintf(qxl_mem_types_names[i], "qxl_surf_mm"); +- qxl_mem_types_list[i].name = qxl_mem_types_names[i]; +- qxl_mem_types_list[i].show = &qxl_mm_dump_table; +- qxl_mem_types_list[i].driver_features = 0; +- if (i == 0) +- qxl_mem_types_list[i].data = qdev->mman.bdev.man[TTM_PL_VRAM].priv; +- else +- qxl_mem_types_list[i].data = qdev->mman.bdev.man[TTM_PL_PRIV0].priv; ++ static struct drm_info_list qxl_mem_types_list[QXL_DEBUGFS_MEM_TYPES] = { ++ { ++ .name = "qxl_mem_mm", ++ .show = &qxl_mm_dump_table, ++ }, ++ { ++ .name = "qxl_surf_mm", ++ .show = &qxl_mm_dump_table, ++ } ++ }; + +- } +- return qxl_debugfs_add_files(qdev, qxl_mem_types_list, i); ++ pax_open_kernel(); ++ *(void **)&qxl_mem_types_list[0].data = qdev->mman.bdev.man[TTM_PL_VRAM].priv; ++ *(void **)&qxl_mem_types_list[1].data = qdev->mman.bdev.man[TTM_PL_PRIV0].priv; ++ pax_close_kernel(); ++ ++ return qxl_debugfs_add_files(qdev, qxl_mem_types_list, QXL_DEBUGFS_MEM_TYPES); + #else + return 0; + #endif +diff --git a/drivers/gpu/drm/r128/r128_cce.c b/drivers/gpu/drm/r128/r128_cce.c +index 2c45ac9..5d740f8 100644 +--- a/drivers/gpu/drm/r128/r128_cce.c ++++ b/drivers/gpu/drm/r128/r128_cce.c +@@ -377,7 +377,7 @@ static int r128_do_init_cce(struct drm_device *dev, drm_r128_init_t *init) + + /* GH: Simple idle check. + */ +- atomic_set(&dev_priv->idle_count, 0); ++ atomic_set_unchecked(&dev_priv->idle_count, 0); + + /* We don't support anything other than bus-mastering ring mode, + * but the ring can be in either AGP or PCI space for the ring +diff --git a/drivers/gpu/drm/r128/r128_drv.h b/drivers/gpu/drm/r128/r128_drv.h +index 723e5d6..102dbaf 100644 +--- a/drivers/gpu/drm/r128/r128_drv.h ++++ b/drivers/gpu/drm/r128/r128_drv.h +@@ -93,14 +93,14 @@ typedef struct drm_r128_private { + int is_pci; + unsigned long cce_buffers_offset; + +- atomic_t idle_count; ++ atomic_unchecked_t idle_count; + + int page_flipping; + int current_page; + u32 crtc_offset; + u32 crtc_offset_cntl; + +- atomic_t vbl_received; ++ atomic_unchecked_t vbl_received; + + u32 color_fmt; + unsigned int front_offset; +diff --git a/drivers/gpu/drm/r128/r128_ioc32.c b/drivers/gpu/drm/r128/r128_ioc32.c +index 663f38c..c689495 100644 +--- a/drivers/gpu/drm/r128/r128_ioc32.c ++++ b/drivers/gpu/drm/r128/r128_ioc32.c +@@ -178,7 +178,7 @@ static int compat_r128_getparam(struct file *file, unsigned int cmd, + return drm_ioctl(file, DRM_IOCTL_R128_GETPARAM, (unsigned long)getparam); + } + +-drm_ioctl_compat_t *r128_compat_ioctls[] = { ++drm_ioctl_compat_t r128_compat_ioctls[] = { + [DRM_R128_INIT] = compat_r128_init, + [DRM_R128_DEPTH] = compat_r128_depth, + [DRM_R128_STIPPLE] = compat_r128_stipple, +@@ -197,18 +197,15 @@ drm_ioctl_compat_t *r128_compat_ioctls[] = { + long r128_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) + { + unsigned int nr = DRM_IOCTL_NR(cmd); +- drm_ioctl_compat_t *fn = NULL; + int ret; + + if (nr < DRM_COMMAND_BASE) + return drm_compat_ioctl(filp, cmd, arg); + +- if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(r128_compat_ioctls)) +- fn = r128_compat_ioctls[nr - DRM_COMMAND_BASE]; +- +- if (fn != NULL) ++ if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(r128_compat_ioctls)) { ++ drm_ioctl_compat_t fn = r128_compat_ioctls[nr - DRM_COMMAND_BASE]; + ret = (*fn) (filp, cmd, arg); +- else ++ } else + ret = drm_ioctl(filp, cmd, arg); + + return ret; +diff --git a/drivers/gpu/drm/r128/r128_irq.c b/drivers/gpu/drm/r128/r128_irq.c +index c2ae496..30b5993 100644 +--- a/drivers/gpu/drm/r128/r128_irq.c ++++ b/drivers/gpu/drm/r128/r128_irq.c +@@ -41,7 +41,7 @@ u32 r128_get_vblank_counter(struct drm_device *dev, int crtc) + if (crtc != 0) + return 0; + +- return atomic_read(&dev_priv->vbl_received); ++ return atomic_read_unchecked(&dev_priv->vbl_received); + } + + irqreturn_t r128_driver_irq_handler(int irq, void *arg) +@@ -55,7 +55,7 @@ irqreturn_t r128_driver_irq_handler(int irq, void *arg) + /* VBLANK interrupt */ + if (status & R128_CRTC_VBLANK_INT) { + R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK); +- atomic_inc(&dev_priv->vbl_received); ++ atomic_inc_unchecked(&dev_priv->vbl_received); + drm_handle_vblank(dev, 0); + return IRQ_HANDLED; + } +diff --git a/drivers/gpu/drm/r128/r128_state.c b/drivers/gpu/drm/r128/r128_state.c +index 575e986..66e62ca 100644 +--- a/drivers/gpu/drm/r128/r128_state.c ++++ b/drivers/gpu/drm/r128/r128_state.c +@@ -320,10 +320,10 @@ static void r128_clear_box(drm_r128_private_t *dev_priv, + + static void r128_cce_performance_boxes(drm_r128_private_t *dev_priv) + { +- if (atomic_read(&dev_priv->idle_count) == 0) ++ if (atomic_read_unchecked(&dev_priv->idle_count) == 0) + r128_clear_box(dev_priv, 64, 4, 8, 8, 0, 255, 0); + else +- atomic_set(&dev_priv->idle_count, 0); ++ atomic_set_unchecked(&dev_priv->idle_count, 0); + } + + #endif +diff --git a/drivers/gpu/drm/radeon/mkregtable.c b/drivers/gpu/drm/radeon/mkregtable.c +index 4a85bb6..aaea819 100644 +--- a/drivers/gpu/drm/radeon/mkregtable.c ++++ b/drivers/gpu/drm/radeon/mkregtable.c +@@ -624,14 +624,14 @@ static int parser_auth(struct table *t, const char *filename) + regex_t mask_rex; + regmatch_t match[4]; + char buf[1024]; +- size_t end; ++ long end; + int len; + int done = 0; + int r; + unsigned o; + struct offset *offset; + char last_reg_s[10]; +- int last_reg; ++ unsigned long last_reg; + + if (regcomp + (&mask_rex, "(0x[0-9a-fA-F]*) *([_a-zA-Z0-9]*)", REG_EXTENDED)) { +diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c +index bdf263a..0305446 100644 +--- a/drivers/gpu/drm/radeon/radeon_device.c ++++ b/drivers/gpu/drm/radeon/radeon_device.c +@@ -1216,7 +1216,7 @@ static bool radeon_switcheroo_can_switch(struct pci_dev *pdev) + * locking inversion with the driver load path. And the access here is + * completely racy anyway. So don't bother with locking for now. + */ +- return dev->open_count == 0; ++ return local_read(&dev->open_count) == 0; + } + + static const struct vga_switcheroo_client_ops radeon_switcheroo_ops = { +diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h +index 46bd393..6ae4719 100644 +--- a/drivers/gpu/drm/radeon/radeon_drv.h ++++ b/drivers/gpu/drm/radeon/radeon_drv.h +@@ -264,7 +264,7 @@ typedef struct drm_radeon_private { + + /* SW interrupt */ + wait_queue_head_t swi_queue; +- atomic_t swi_emitted; ++ atomic_unchecked_t swi_emitted; + int vblank_crtc; + uint32_t irq_enable_reg; + uint32_t r500_disp_irq_reg; +diff --git a/drivers/gpu/drm/radeon/radeon_ioc32.c b/drivers/gpu/drm/radeon/radeon_ioc32.c +index 0b98ea1..0881827 100644 +--- a/drivers/gpu/drm/radeon/radeon_ioc32.c ++++ b/drivers/gpu/drm/radeon/radeon_ioc32.c +@@ -358,7 +358,7 @@ static int compat_radeon_cp_setparam(struct file *file, unsigned int cmd, + request = compat_alloc_user_space(sizeof(*request)); + if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) + || __put_user(req32.param, &request->param) +- || __put_user((void __user *)(unsigned long)req32.value, ++ || __put_user((unsigned long)req32.value, + &request->value)) + return -EFAULT; + +@@ -368,7 +368,7 @@ static int compat_radeon_cp_setparam(struct file *file, unsigned int cmd, + #define compat_radeon_cp_setparam NULL + #endif /* X86_64 || IA64 */ + +-static drm_ioctl_compat_t *radeon_compat_ioctls[] = { ++static drm_ioctl_compat_t radeon_compat_ioctls[] = { + [DRM_RADEON_CP_INIT] = compat_radeon_cp_init, + [DRM_RADEON_CLEAR] = compat_radeon_cp_clear, + [DRM_RADEON_STIPPLE] = compat_radeon_cp_stipple, +@@ -393,18 +393,15 @@ static drm_ioctl_compat_t *radeon_compat_ioctls[] = { + long radeon_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) + { + unsigned int nr = DRM_IOCTL_NR(cmd); +- drm_ioctl_compat_t *fn = NULL; + int ret; + + if (nr < DRM_COMMAND_BASE) + return drm_compat_ioctl(filp, cmd, arg); + +- if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(radeon_compat_ioctls)) +- fn = radeon_compat_ioctls[nr - DRM_COMMAND_BASE]; +- +- if (fn != NULL) ++ if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(radeon_compat_ioctls)) { ++ drm_ioctl_compat_t fn = radeon_compat_ioctls[nr - DRM_COMMAND_BASE]; + ret = (*fn) (filp, cmd, arg); +- else ++ } else + ret = drm_ioctl(filp, cmd, arg); + + return ret; +diff --git a/drivers/gpu/drm/radeon/radeon_irq.c b/drivers/gpu/drm/radeon/radeon_irq.c +index 244b19b..c19226d 100644 +--- a/drivers/gpu/drm/radeon/radeon_irq.c ++++ b/drivers/gpu/drm/radeon/radeon_irq.c +@@ -226,8 +226,8 @@ static int radeon_emit_irq(struct drm_device * dev) + unsigned int ret; + RING_LOCALS; + +- atomic_inc(&dev_priv->swi_emitted); +- ret = atomic_read(&dev_priv->swi_emitted); ++ atomic_inc_unchecked(&dev_priv->swi_emitted); ++ ret = atomic_read_unchecked(&dev_priv->swi_emitted); + + BEGIN_RING(4); + OUT_RING_REG(RADEON_LAST_SWI_REG, ret); +@@ -353,7 +353,7 @@ int radeon_driver_irq_postinstall(struct drm_device *dev) + drm_radeon_private_t *dev_priv = + (drm_radeon_private_t *) dev->dev_private; + +- atomic_set(&dev_priv->swi_emitted, 0); ++ atomic_set_unchecked(&dev_priv->swi_emitted, 0); + init_waitqueue_head(&dev_priv->swi_queue); + + dev->max_vblank_count = 0x001fffff; +diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c +index 535403e..5dd655b 100644 +--- a/drivers/gpu/drm/radeon/radeon_state.c ++++ b/drivers/gpu/drm/radeon/radeon_state.c +@@ -2168,7 +2168,7 @@ static int radeon_cp_clear(struct drm_device *dev, void *data, struct drm_file * + if (sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS) + sarea_priv->nbox = RADEON_NR_SAREA_CLIPRECTS; + +- if (copy_from_user(&depth_boxes, clear->depth_boxes, ++ if (sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS || copy_from_user(&depth_boxes, clear->depth_boxes, + sarea_priv->nbox * sizeof(depth_boxes[0]))) + return -EFAULT; + +@@ -3031,7 +3031,7 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil + { + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_getparam_t *param = data; +- int value; ++ int value = 0; + + DRM_DEBUG("pid=%d\n", DRM_CURRENTPID); + +diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c +index 9ab8e26..d94c653 100644 +--- a/drivers/gpu/drm/radeon/radeon_ttm.c ++++ b/drivers/gpu/drm/radeon/radeon_ttm.c +@@ -940,7 +940,7 @@ void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size) + man->size = size >> PAGE_SHIFT; + } + +-static struct vm_operations_struct radeon_ttm_vm_ops; ++static vm_operations_struct_no_const radeon_ttm_vm_ops __read_only; + static const struct vm_operations_struct *ttm_vm_ops = NULL; + + static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) +@@ -981,8 +981,10 @@ int radeon_mmap(struct file *filp, struct vm_area_struct *vma) + } + if (unlikely(ttm_vm_ops == NULL)) { + ttm_vm_ops = vma->vm_ops; ++ pax_open_kernel(); + radeon_ttm_vm_ops = *ttm_vm_ops; + radeon_ttm_vm_ops.fault = &radeon_ttm_fault; ++ pax_close_kernel(); + } + vma->vm_ops = &radeon_ttm_vm_ops; + return 0; +diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c +index 054a79f..30d9ac4 100644 +--- a/drivers/gpu/drm/tegra/dc.c ++++ b/drivers/gpu/drm/tegra/dc.c +@@ -1242,7 +1242,7 @@ static int tegra_dc_debugfs_init(struct tegra_dc *dc, struct drm_minor *minor) + } + + for (i = 0; i < ARRAY_SIZE(debugfs_files); i++) +- dc->debugfs_files[i].data = dc; ++ *(void **)&dc->debugfs_files[i].data = dc; + + err = drm_debugfs_create_files(dc->debugfs_files, + ARRAY_SIZE(debugfs_files), +diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c +index f787445..2df2c65 100644 +--- a/drivers/gpu/drm/tegra/dsi.c ++++ b/drivers/gpu/drm/tegra/dsi.c +@@ -41,7 +41,7 @@ struct tegra_dsi { + struct clk *clk_lp; + struct clk *clk; + +- struct drm_info_list *debugfs_files; ++ drm_info_list_no_const *debugfs_files; + struct drm_minor *minor; + struct dentry *debugfs; + +diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c +index ffe2654..03c7b1c 100644 +--- a/drivers/gpu/drm/tegra/hdmi.c ++++ b/drivers/gpu/drm/tegra/hdmi.c +@@ -60,7 +60,7 @@ struct tegra_hdmi { + bool stereo; + bool dvi; + +- struct drm_info_list *debugfs_files; ++ drm_info_list_no_const *debugfs_files; + struct drm_minor *minor; + struct dentry *debugfs; + }; +diff --git a/drivers/gpu/drm/ttm/ttm_bo_manager.c b/drivers/gpu/drm/ttm/ttm_bo_manager.c +index 964387f..4eafc00 100644 +--- a/drivers/gpu/drm/ttm/ttm_bo_manager.c ++++ b/drivers/gpu/drm/ttm/ttm_bo_manager.c +@@ -146,10 +146,10 @@ static void ttm_bo_man_debug(struct ttm_mem_type_manager *man, + } + + const struct ttm_mem_type_manager_func ttm_bo_manager_func = { +- ttm_bo_man_init, +- ttm_bo_man_takedown, +- ttm_bo_man_get_node, +- ttm_bo_man_put_node, +- ttm_bo_man_debug ++ .init = ttm_bo_man_init, ++ .takedown = ttm_bo_man_takedown, ++ .get_node = ttm_bo_man_get_node, ++ .put_node = ttm_bo_man_put_node, ++ .debug = ttm_bo_man_debug + }; + EXPORT_SYMBOL(ttm_bo_manager_func); +diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c +index a1803fb..c53f6b0 100644 +--- a/drivers/gpu/drm/ttm/ttm_memory.c ++++ b/drivers/gpu/drm/ttm/ttm_memory.c +@@ -264,7 +264,7 @@ static int ttm_mem_init_kernel_zone(struct ttm_mem_global *glob, + zone->glob = glob; + glob->zone_kernel = zone; + ret = kobject_init_and_add( +- &zone->kobj, &ttm_mem_zone_kobj_type, &glob->kobj, zone->name); ++ &zone->kobj, &ttm_mem_zone_kobj_type, &glob->kobj, "%s", zone->name); + if (unlikely(ret != 0)) { + kobject_put(&zone->kobj); + return ret; +@@ -348,7 +348,7 @@ static int ttm_mem_init_dma32_zone(struct ttm_mem_global *glob, + zone->glob = glob; + glob->zone_dma32 = zone; + ret = kobject_init_and_add( +- &zone->kobj, &ttm_mem_zone_kobj_type, &glob->kobj, zone->name); ++ &zone->kobj, &ttm_mem_zone_kobj_type, &glob->kobj, "%s", zone->name); + if (unlikely(ret != 0)) { + kobject_put(&zone->kobj); + return ret; +diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c +index 025c429..314062f 100644 +--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c +@@ -54,7 +54,7 @@ + + #define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(struct page *)) + #define SMALL_ALLOCATION 16 +-#define FREE_ALL_PAGES (~0U) ++#define FREE_ALL_PAGES (~0UL) + /* times are in msecs */ + #define PAGE_FREE_INTERVAL 1000 + +@@ -299,15 +299,14 @@ static void ttm_pool_update_free_locked(struct ttm_page_pool *pool, + * @free_all: If set to true will free all pages in pool + * @use_static: Safe to use static buffer + **/ +-static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free, ++static unsigned long ttm_page_pool_free(struct ttm_page_pool *pool, unsigned long nr_free, + bool use_static) + { + static struct page *static_buf[NUM_PAGES_TO_ALLOC]; + unsigned long irq_flags; + struct page *p; + struct page **pages_to_free; +- unsigned freed_pages = 0, +- npages_to_free = nr_free; ++ unsigned long freed_pages = 0, npages_to_free = nr_free; + + if (NUM_PAGES_TO_ALLOC < nr_free) + npages_to_free = NUM_PAGES_TO_ALLOC; +@@ -371,7 +370,8 @@ restart: + __list_del(&p->lru, &pool->list); + + ttm_pool_update_free_locked(pool, freed_pages); +- nr_free -= freed_pages; ++ if (likely(nr_free != FREE_ALL_PAGES)) ++ nr_free -= freed_pages; + } + + spin_unlock_irqrestore(&pool->lock, irq_flags); +@@ -399,7 +399,7 @@ ttm_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) + unsigned i; + unsigned pool_offset; + struct ttm_page_pool *pool; +- int shrink_pages = sc->nr_to_scan; ++ unsigned long shrink_pages = sc->nr_to_scan; + unsigned long freed = 0; + + if (!mutex_trylock(&lock)) +@@ -407,7 +407,7 @@ ttm_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) + pool_offset = ++start_pool % NUM_POOLS; + /* select start pool in round robin fashion */ + for (i = 0; i < NUM_POOLS; ++i) { +- unsigned nr_free = shrink_pages; ++ unsigned long nr_free = shrink_pages; + if (shrink_pages == 0) + break; + pool = &_manager->pools[(i + pool_offset)%NUM_POOLS]; +@@ -673,7 +673,7 @@ out: + } + + /* Put all pages in pages list to correct pool to wait for reuse */ +-static void ttm_put_pages(struct page **pages, unsigned npages, int flags, ++static void ttm_put_pages(struct page **pages, unsigned long npages, int flags, + enum ttm_caching_state cstate) + { + unsigned long irq_flags; +@@ -728,7 +728,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, + struct list_head plist; + struct page *p = NULL; + gfp_t gfp_flags = GFP_USER; +- unsigned count; ++ unsigned long count; + int r; + + /* set zero flag for page allocation if required */ +diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +index 01e1d27..aaa018a 100644 +--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c ++++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c +@@ -56,7 +56,7 @@ + + #define NUM_PAGES_TO_ALLOC (PAGE_SIZE/sizeof(struct page *)) + #define SMALL_ALLOCATION 4 +-#define FREE_ALL_PAGES (~0U) ++#define FREE_ALL_PAGES (~0UL) + /* times are in msecs */ + #define IS_UNDEFINED (0) + #define IS_WC (1<<1) +@@ -413,7 +413,7 @@ static void ttm_dma_page_put(struct dma_pool *pool, struct dma_page *d_page) + * @nr_free: If set to true will free all pages in pool + * @use_static: Safe to use static buffer + **/ +-static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free, ++static unsigned long ttm_dma_page_pool_free(struct dma_pool *pool, unsigned long nr_free, + bool use_static) + { + static struct page *static_buf[NUM_PAGES_TO_ALLOC]; +@@ -421,8 +421,7 @@ static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free, + struct dma_page *dma_p, *tmp; + struct page **pages_to_free; + struct list_head d_pages; +- unsigned freed_pages = 0, +- npages_to_free = nr_free; ++ unsigned long freed_pages = 0, npages_to_free = nr_free; + + if (NUM_PAGES_TO_ALLOC < nr_free) + npages_to_free = NUM_PAGES_TO_ALLOC; +@@ -499,7 +498,8 @@ restart: + /* remove range of pages from the pool */ + if (freed_pages) { + ttm_pool_update_free_locked(pool, freed_pages); +- nr_free -= freed_pages; ++ if (likely(nr_free != FREE_ALL_PAGES)) ++ nr_free -= freed_pages; + } + + spin_unlock_irqrestore(&pool->lock, irq_flags); +@@ -936,7 +936,7 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev) + struct dma_page *d_page, *next; + enum pool_type type; + bool is_cached = false; +- unsigned count = 0, i, npages = 0; ++ unsigned long count = 0, i, npages = 0; + unsigned long irq_flags; + + type = ttm_to_type(ttm->page_flags, ttm->caching_state); +@@ -1012,7 +1012,7 @@ ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) + static unsigned start_pool; + unsigned idx = 0; + unsigned pool_offset; +- unsigned shrink_pages = sc->nr_to_scan; ++ unsigned long shrink_pages = sc->nr_to_scan; + struct device_pools *p; + unsigned long freed = 0; + +@@ -1025,7 +1025,7 @@ ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) + goto out; + pool_offset = ++start_pool % _manager->npools; + list_for_each_entry(p, &_manager->pools, pools) { +- unsigned nr_free; ++ unsigned long nr_free; + + if (!p->dev) + continue; +@@ -1039,7 +1039,7 @@ ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) + shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free, true); + freed += nr_free - shrink_pages; + +- pr_debug("%s: (%s:%d) Asked to shrink %d, have %d more to go\n", ++ pr_debug("%s: (%s:%d) Asked to shrink %lu, have %lu more to go\n", + p->pool->dev_name, p->pool->name, current->pid, + nr_free, shrink_pages); + } +diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c +index 8cbcb45..a4d9cf7 100644 +--- a/drivers/gpu/drm/udl/udl_fb.c ++++ b/drivers/gpu/drm/udl/udl_fb.c +@@ -367,7 +367,6 @@ static int udl_fb_release(struct fb_info *info, int user) + fb_deferred_io_cleanup(info); + kfree(info->fbdefio); + info->fbdefio = NULL; +- info->fbops->fb_mmap = udl_fb_mmap; + } + + pr_warn("released /dev/fb%d user=%d count=%d\n", +diff --git a/drivers/gpu/drm/via/via_drv.h b/drivers/gpu/drm/via/via_drv.h +index ef8c500..01030c8 100644 +--- a/drivers/gpu/drm/via/via_drv.h ++++ b/drivers/gpu/drm/via/via_drv.h +@@ -53,7 +53,7 @@ typedef struct drm_via_ring_buffer { + typedef uint32_t maskarray_t[5]; + + typedef struct drm_via_irq { +- atomic_t irq_received; ++ atomic_unchecked_t irq_received; + uint32_t pending_mask; + uint32_t enable_mask; + wait_queue_head_t irq_queue; +@@ -77,7 +77,7 @@ typedef struct drm_via_private { + struct timeval last_vblank; + int last_vblank_valid; + unsigned usec_per_vblank; +- atomic_t vbl_received; ++ atomic_unchecked_t vbl_received; + drm_via_state_t hc_state; + char pci_buf[VIA_PCI_BUF_SIZE]; + const uint32_t *fire_offsets[VIA_FIRE_BUF_SIZE]; +diff --git a/drivers/gpu/drm/via/via_irq.c b/drivers/gpu/drm/via/via_irq.c +index 1319433..a993b0c 100644 +--- a/drivers/gpu/drm/via/via_irq.c ++++ b/drivers/gpu/drm/via/via_irq.c +@@ -101,7 +101,7 @@ u32 via_get_vblank_counter(struct drm_device *dev, int crtc) + if (crtc != 0) + return 0; + +- return atomic_read(&dev_priv->vbl_received); ++ return atomic_read_unchecked(&dev_priv->vbl_received); + } + + irqreturn_t via_driver_irq_handler(int irq, void *arg) +@@ -116,8 +116,8 @@ irqreturn_t via_driver_irq_handler(int irq, void *arg) + + status = VIA_READ(VIA_REG_INTERRUPT); + if (status & VIA_IRQ_VBLANK_PENDING) { +- atomic_inc(&dev_priv->vbl_received); +- if (!(atomic_read(&dev_priv->vbl_received) & 0x0F)) { ++ atomic_inc_unchecked(&dev_priv->vbl_received); ++ if (!(atomic_read_unchecked(&dev_priv->vbl_received) & 0x0F)) { + do_gettimeofday(&cur_vblank); + if (dev_priv->last_vblank_valid) { + dev_priv->usec_per_vblank = +@@ -127,7 +127,7 @@ irqreturn_t via_driver_irq_handler(int irq, void *arg) + dev_priv->last_vblank = cur_vblank; + dev_priv->last_vblank_valid = 1; + } +- if (!(atomic_read(&dev_priv->vbl_received) & 0xFF)) { ++ if (!(atomic_read_unchecked(&dev_priv->vbl_received) & 0xFF)) { + DRM_DEBUG("US per vblank is: %u\n", + dev_priv->usec_per_vblank); + } +@@ -137,7 +137,7 @@ irqreturn_t via_driver_irq_handler(int irq, void *arg) + + for (i = 0; i < dev_priv->num_irqs; ++i) { + if (status & cur_irq->pending_mask) { +- atomic_inc(&cur_irq->irq_received); ++ atomic_inc_unchecked(&cur_irq->irq_received); + wake_up(&cur_irq->irq_queue); + handled = 1; + if (dev_priv->irq_map[drm_via_irq_dma0_td] == i) +@@ -242,11 +242,11 @@ via_driver_irq_wait(struct drm_device *dev, unsigned int irq, int force_sequence + DRM_WAIT_ON(ret, cur_irq->irq_queue, 3 * HZ, + ((VIA_READ(masks[irq][2]) & masks[irq][3]) == + masks[irq][4])); +- cur_irq_sequence = atomic_read(&cur_irq->irq_received); ++ cur_irq_sequence = atomic_read_unchecked(&cur_irq->irq_received); + } else { + DRM_WAIT_ON(ret, cur_irq->irq_queue, 3 * HZ, + (((cur_irq_sequence = +- atomic_read(&cur_irq->irq_received)) - ++ atomic_read_unchecked(&cur_irq->irq_received)) - + *sequence) <= (1 << 23))); + } + *sequence = cur_irq_sequence; +@@ -284,7 +284,7 @@ void via_driver_irq_preinstall(struct drm_device *dev) + } + + for (i = 0; i < dev_priv->num_irqs; ++i) { +- atomic_set(&cur_irq->irq_received, 0); ++ atomic_set_unchecked(&cur_irq->irq_received, 0); + cur_irq->enable_mask = dev_priv->irq_masks[i][0]; + cur_irq->pending_mask = dev_priv->irq_masks[i][1]; + init_waitqueue_head(&cur_irq->irq_queue); +@@ -366,7 +366,7 @@ int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv) + switch (irqwait->request.type & ~VIA_IRQ_FLAGS_MASK) { + case VIA_IRQ_RELATIVE: + irqwait->request.sequence += +- atomic_read(&cur_irq->irq_received); ++ atomic_read_unchecked(&cur_irq->irq_received); + irqwait->request.type &= ~_DRM_VBLANK_RELATIVE; + case VIA_IRQ_ABSOLUTE: + break; +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +index d26a6da..5fa41ed 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +@@ -447,7 +447,7 @@ struct vmw_private { + * Fencing and IRQs. + */ + +- atomic_t marker_seq; ++ atomic_unchecked_t marker_seq; + wait_queue_head_t fence_queue; + wait_queue_head_t fifo_queue; + spinlock_t waiter_lock; +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +index 39f2b03..d1b0a64 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +@@ -152,7 +152,7 @@ int vmw_fifo_init(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) + (unsigned int) min, + (unsigned int) fifo->capabilities); + +- atomic_set(&dev_priv->marker_seq, dev_priv->last_read_seqno); ++ atomic_set_unchecked(&dev_priv->marker_seq, dev_priv->last_read_seqno); + iowrite32(dev_priv->last_read_seqno, fifo_mem + SVGA_FIFO_FENCE); + vmw_marker_queue_init(&fifo->marker_queue); + return vmw_fifo_send_fence(dev_priv, &dummy); +@@ -372,7 +372,7 @@ void *vmw_fifo_reserve(struct vmw_private *dev_priv, uint32_t bytes) + if (reserveable) + iowrite32(bytes, fifo_mem + + SVGA_FIFO_RESERVED); +- return fifo_mem + (next_cmd >> 2); ++ return (__le32 __force_kernel *)fifo_mem + (next_cmd >> 2); + } else { + need_bounce = true; + } +@@ -492,7 +492,7 @@ int vmw_fifo_send_fence(struct vmw_private *dev_priv, uint32_t *seqno) + + fm = vmw_fifo_reserve(dev_priv, bytes); + if (unlikely(fm == NULL)) { +- *seqno = atomic_read(&dev_priv->marker_seq); ++ *seqno = atomic_read_unchecked(&dev_priv->marker_seq); + ret = -ENOMEM; + (void)vmw_fallback_wait(dev_priv, false, true, *seqno, + false, 3*HZ); +@@ -500,7 +500,7 @@ int vmw_fifo_send_fence(struct vmw_private *dev_priv, uint32_t *seqno) + } + + do { +- *seqno = atomic_add_return(1, &dev_priv->marker_seq); ++ *seqno = atomic_add_return_unchecked(1, &dev_priv->marker_seq); + } while (*seqno == 0); + + if (!(fifo_state->capabilities & SVGA_FIFO_CAP_FENCE)) { +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c +index 170b61b..fec7348 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c +@@ -164,9 +164,9 @@ static void vmw_gmrid_man_debug(struct ttm_mem_type_manager *man, + } + + const struct ttm_mem_type_manager_func vmw_gmrid_manager_func = { +- vmw_gmrid_man_init, +- vmw_gmrid_man_takedown, +- vmw_gmrid_man_get_node, +- vmw_gmrid_man_put_node, +- vmw_gmrid_man_debug ++ .init = vmw_gmrid_man_init, ++ .takedown = vmw_gmrid_man_takedown, ++ .get_node = vmw_gmrid_man_get_node, ++ .put_node = vmw_gmrid_man_put_node, ++ .debug = vmw_gmrid_man_debug + }; +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +index 69c8ce2..cacb0ab 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +@@ -235,7 +235,7 @@ int vmw_present_ioctl(struct drm_device *dev, void *data, + int ret; + + num_clips = arg->num_clips; +- clips_ptr = (struct drm_vmw_rect *)(unsigned long)arg->clips_ptr; ++ clips_ptr = (struct drm_vmw_rect __user *)(unsigned long)arg->clips_ptr; + + if (unlikely(num_clips == 0)) + return 0; +@@ -318,7 +318,7 @@ int vmw_present_readback_ioctl(struct drm_device *dev, void *data, + int ret; + + num_clips = arg->num_clips; +- clips_ptr = (struct drm_vmw_rect *)(unsigned long)arg->clips_ptr; ++ clips_ptr = (struct drm_vmw_rect __user *)(unsigned long)arg->clips_ptr; + + if (unlikely(num_clips == 0)) + return 0; +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c +index 9fe9827..0aa2fc0 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c +@@ -102,7 +102,7 @@ bool vmw_seqno_passed(struct vmw_private *dev_priv, + * emitted. Then the fence is stale and signaled. + */ + +- ret = ((atomic_read(&dev_priv->marker_seq) - seqno) ++ ret = ((atomic_read_unchecked(&dev_priv->marker_seq) - seqno) + > VMW_FENCE_WRAP); + + return ret; +@@ -133,7 +133,7 @@ int vmw_fallback_wait(struct vmw_private *dev_priv, + + if (fifo_idle) + down_read(&fifo_state->rwsem); +- signal_seq = atomic_read(&dev_priv->marker_seq); ++ signal_seq = atomic_read_unchecked(&dev_priv->marker_seq); + ret = 0; + + for (;;) { +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_marker.c b/drivers/gpu/drm/vmwgfx/vmwgfx_marker.c +index efd1ffd..0ae13ca 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_marker.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_marker.c +@@ -135,7 +135,7 @@ int vmw_wait_lag(struct vmw_private *dev_priv, + while (!vmw_lag_lt(queue, us)) { + spin_lock(&queue->lock); + if (list_empty(&queue->head)) +- seqno = atomic_read(&dev_priv->marker_seq); ++ seqno = atomic_read_unchecked(&dev_priv->marker_seq); + else { + marker = list_first_entry(&queue->head, + struct vmw_marker, head); +diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c +index 37ac7b5..d52a5c9 100644 +--- a/drivers/gpu/vga/vga_switcheroo.c ++++ b/drivers/gpu/vga/vga_switcheroo.c +@@ -644,7 +644,7 @@ static int vga_switcheroo_runtime_resume(struct device *dev) + + /* this version is for the case where the power switch is separate + to the device being powered down. */ +-int vga_switcheroo_init_domain_pm_ops(struct device *dev, struct dev_pm_domain *domain) ++int vga_switcheroo_init_domain_pm_ops(struct device *dev, dev_pm_domain_no_const *domain) + { + /* copy over all the bus versions */ + if (dev->bus && dev->bus->pm) { +@@ -695,7 +695,7 @@ static int vga_switcheroo_runtime_resume_hdmi_audio(struct device *dev) + return ret; + } + +-int vga_switcheroo_init_domain_pm_optimus_hdmi_audio(struct device *dev, struct dev_pm_domain *domain) ++int vga_switcheroo_init_domain_pm_optimus_hdmi_audio(struct device *dev, dev_pm_domain_no_const *domain) + { + /* copy over all the bus versions */ + if (dev->bus && dev->bus->pm) { +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index dfaccfc..bfea740 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -2507,7 +2507,7 @@ EXPORT_SYMBOL_GPL(hid_ignore); + + int hid_add_device(struct hid_device *hdev) + { +- static atomic_t id = ATOMIC_INIT(0); ++ static atomic_unchecked_t id = ATOMIC_INIT(0); + int ret; + + if (WARN_ON(hdev->status & HID_STAT_ADDED)) +@@ -2549,7 +2549,7 @@ int hid_add_device(struct hid_device *hdev) + /* XXX hack, any other cleaner solution after the driver core + * is converted to allow more than 20 bytes as the device name? */ + dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, +- hdev->vendor, hdev->product, atomic_inc_return(&id)); ++ hdev->vendor, hdev->product, atomic_inc_return_unchecked(&id)); + + hid_debug_register(hdev, dev_name(&hdev->dev)); + ret = device_add(&hdev->dev); +diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c +index bc4269e..b6e6102 100644 +--- a/drivers/hid/hid-sony.c ++++ b/drivers/hid/hid-sony.c +@@ -798,6 +798,12 @@ union sixaxis_output_report_01 { + __u8 buf[36]; + }; + ++#define DS4_REPORT_0x02_SIZE 37 ++#define DS4_REPORT_0x05_SIZE 32 ++#define DS4_REPORT_0x11_SIZE 78 ++#define DS4_REPORT_0x81_SIZE 7 ++#define SIXAXIS_REPORT_0xF2_SIZE 18 ++ + static spinlock_t sony_dev_list_lock; + static LIST_HEAD(sony_device_list); + static DEFINE_IDA(sony_device_id_allocator); +@@ -811,6 +817,7 @@ struct sony_sc { + struct work_struct state_worker; + struct power_supply battery; + int device_id; ++ __u8 *output_report_dmabuf; + + #ifdef CONFIG_SONY_FF + __u8 left; +@@ -1142,9 +1149,20 @@ static int sixaxis_set_operational_usb(struct hid_device *hdev) + + static int sixaxis_set_operational_bt(struct hid_device *hdev) + { +- unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 }; +- return hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf), ++ static const __u8 report[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 }; ++ __u8 *buf; ++ int ret; ++ ++ buf = kmemdup(report, sizeof(report), GFP_KERNEL); ++ if (!buf) ++ return -ENOMEM; ++ ++ ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(report), + HID_FEATURE_REPORT, HID_REQ_SET_REPORT); ++ ++ kfree(buf); ++ ++ return ret; + } + + /* +@@ -1153,10 +1171,19 @@ static int sixaxis_set_operational_bt(struct hid_device *hdev) + */ + static int dualshock4_set_operational_bt(struct hid_device *hdev) + { +- __u8 buf[37] = { 0 }; ++ __u8 *buf; ++ int ret; + +- return hid_hw_raw_request(hdev, 0x02, buf, sizeof(buf), ++ buf = kmalloc(DS4_REPORT_0x02_SIZE, GFP_KERNEL); ++ if (!buf) ++ return -ENOMEM; ++ ++ ret = hid_hw_raw_request(hdev, 0x02, buf, DS4_REPORT_0x02_SIZE, + HID_FEATURE_REPORT, HID_REQ_GET_REPORT); ++ ++ kfree(buf); ++ ++ return ret; + } + + static void sixaxis_set_leds_from_id(int id, __u8 values[MAX_LEDS]) +@@ -1471,9 +1498,7 @@ error_leds: + + static void sixaxis_state_worker(struct work_struct *work) + { +- struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); +- int n; +- union sixaxis_output_report_01 report = { ++ static const union sixaxis_output_report_01 default_report = { + .buf = { + 0x01, + 0x00, 0xff, 0x00, 0xff, 0x00, +@@ -1485,20 +1510,27 @@ static void sixaxis_state_worker(struct work_struct *work) + 0x00, 0x00, 0x00, 0x00, 0x00 + } + }; ++ struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); ++ struct sixaxis_output_report *report = ++ (struct sixaxis_output_report *)sc->output_report_dmabuf; ++ int n; ++ ++ /* Initialize the report with default values */ ++ memcpy(report, &default_report, sizeof(struct sixaxis_output_report)); + + #ifdef CONFIG_SONY_FF +- report.data.rumble.right_motor_on = sc->right ? 1 : 0; +- report.data.rumble.left_motor_force = sc->left; ++ report->rumble.right_motor_on = sc->right ? 1 : 0; ++ report->rumble.left_motor_force = sc->left; + #endif + +- report.data.leds_bitmap |= sc->led_state[0] << 1; +- report.data.leds_bitmap |= sc->led_state[1] << 2; +- report.data.leds_bitmap |= sc->led_state[2] << 3; +- report.data.leds_bitmap |= sc->led_state[3] << 4; ++ report->leds_bitmap |= sc->led_state[0] << 1; ++ report->leds_bitmap |= sc->led_state[1] << 2; ++ report->leds_bitmap |= sc->led_state[2] << 3; ++ report->leds_bitmap |= sc->led_state[3] << 4; + + /* Set flag for all leds off, required for 3rd party INTEC controller */ +- if ((report.data.leds_bitmap & 0x1E) == 0) +- report.data.leds_bitmap |= 0x20; ++ if ((report->leds_bitmap & 0x1E) == 0) ++ report->leds_bitmap |= 0x20; + + /* + * The LEDs in the report are indexed in reverse order to their +@@ -1511,28 +1543,30 @@ static void sixaxis_state_worker(struct work_struct *work) + */ + for (n = 0; n < 4; n++) { + if (sc->led_delay_on[n] || sc->led_delay_off[n]) { +- report.data.led[3 - n].duty_off = sc->led_delay_off[n]; +- report.data.led[3 - n].duty_on = sc->led_delay_on[n]; ++ report->led[3 - n].duty_off = sc->led_delay_off[n]; ++ report->led[3 - n].duty_on = sc->led_delay_on[n]; + } + } + +- hid_hw_raw_request(sc->hdev, report.data.report_id, report.buf, +- sizeof(report), HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); ++ hid_hw_raw_request(sc->hdev, report->report_id, (__u8 *)report, ++ sizeof(struct sixaxis_output_report), ++ HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); + } + + static void dualshock4_state_worker(struct work_struct *work) + { + struct sony_sc *sc = container_of(work, struct sony_sc, state_worker); + struct hid_device *hdev = sc->hdev; ++ __u8 *buf = sc->output_report_dmabuf; + int offset; + +- __u8 buf[78] = { 0 }; +- + if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) { ++ memset(buf, 0, DS4_REPORT_0x05_SIZE); + buf[0] = 0x05; + buf[1] = 0xFF; + offset = 4; + } else { ++ memset(buf, 0, DS4_REPORT_0x11_SIZE); + buf[0] = 0x11; + buf[1] = 0xB0; + buf[3] = 0x0F; +@@ -1560,12 +1594,33 @@ static void dualshock4_state_worker(struct work_struct *work) + buf[offset++] = sc->led_delay_off[3]; + + if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) +- hid_hw_output_report(hdev, buf, 32); ++ hid_hw_output_report(hdev, buf, DS4_REPORT_0x05_SIZE); + else +- hid_hw_raw_request(hdev, 0x11, buf, 78, ++ hid_hw_raw_request(hdev, 0x11, buf, DS4_REPORT_0x11_SIZE, + HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); + } + ++static int sony_allocate_output_report(struct sony_sc *sc) ++{ ++ if (sc->quirks & SIXAXIS_CONTROLLER) ++ sc->output_report_dmabuf = ++ kmalloc(sizeof(union sixaxis_output_report_01), ++ GFP_KERNEL); ++ else if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) ++ sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x11_SIZE, ++ GFP_KERNEL); ++ else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) ++ sc->output_report_dmabuf = kmalloc(DS4_REPORT_0x05_SIZE, ++ GFP_KERNEL); ++ else ++ return 0; ++ ++ if (!sc->output_report_dmabuf) ++ return -ENOMEM; ++ ++ return 0; ++} ++ + #ifdef CONFIG_SONY_FF + static int sony_play_effect(struct input_dev *dev, void *data, + struct ff_effect *effect) +@@ -1754,6 +1809,7 @@ static int sony_get_bt_devaddr(struct sony_sc *sc) + + static int sony_check_add(struct sony_sc *sc) + { ++ __u8 *buf = NULL; + int n, ret; + + if ((sc->quirks & DUALSHOCK4_CONTROLLER_BT) || +@@ -1769,36 +1825,44 @@ static int sony_check_add(struct sony_sc *sc) + return 0; + } + } else if (sc->quirks & DUALSHOCK4_CONTROLLER_USB) { +- __u8 buf[7]; ++ buf = kmalloc(DS4_REPORT_0x81_SIZE, GFP_KERNEL); ++ if (!buf) ++ return -ENOMEM; + + /* + * The MAC address of a DS4 controller connected via USB can be + * retrieved with feature report 0x81. The address begins at + * offset 1. + */ +- ret = hid_hw_raw_request(sc->hdev, 0x81, buf, sizeof(buf), +- HID_FEATURE_REPORT, HID_REQ_GET_REPORT); ++ ret = hid_hw_raw_request(sc->hdev, 0x81, buf, ++ DS4_REPORT_0x81_SIZE, HID_FEATURE_REPORT, ++ HID_REQ_GET_REPORT); + +- if (ret != 7) { ++ if (ret != DS4_REPORT_0x81_SIZE) { + hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n"); +- return ret < 0 ? ret : -EINVAL; ++ ret = ret < 0 ? ret : -EINVAL; ++ goto out_free; + } + + memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address)); + } else if (sc->quirks & SIXAXIS_CONTROLLER_USB) { +- __u8 buf[18]; ++ buf = kmalloc(SIXAXIS_REPORT_0xF2_SIZE, GFP_KERNEL); ++ if (!buf) ++ return -ENOMEM; + + /* + * The MAC address of a Sixaxis controller connected via USB can + * be retrieved with feature report 0xf2. The address begins at + * offset 4. + */ +- ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, sizeof(buf), +- HID_FEATURE_REPORT, HID_REQ_GET_REPORT); ++ ret = hid_hw_raw_request(sc->hdev, 0xf2, buf, ++ SIXAXIS_REPORT_0xF2_SIZE, HID_FEATURE_REPORT, ++ HID_REQ_GET_REPORT); + +- if (ret != 18) { ++ if (ret != SIXAXIS_REPORT_0xF2_SIZE) { + hid_err(sc->hdev, "failed to retrieve feature report 0xf2 with the Sixaxis MAC address\n"); +- return ret < 0 ? ret : -EINVAL; ++ ret = ret < 0 ? ret : -EINVAL; ++ goto out_free; + } + + /* +@@ -1811,7 +1875,13 @@ static int sony_check_add(struct sony_sc *sc) + return 0; + } + +- return sony_check_add_dev_list(sc); ++ ret = sony_check_add_dev_list(sc); ++ ++out_free: ++ ++ kfree(buf); ++ ++ return ret; + } + + static int sony_set_device_id(struct sony_sc *sc) +@@ -1895,6 +1965,12 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id) + return ret; + } + ++ ret = sony_allocate_output_report(sc); ++ if (ret < 0) { ++ hid_err(hdev, "failed to allocate the output report buffer\n"); ++ goto err_stop; ++ } ++ + ret = sony_set_device_id(sc); + if (ret < 0) { + hid_err(hdev, "failed to allocate the device id\n"); +@@ -1984,6 +2060,7 @@ err_stop: + if (sc->quirks & SONY_BATTERY_SUPPORT) + sony_battery_remove(sc); + sony_cancel_work_sync(sc); ++ kfree(sc->output_report_dmabuf); + sony_remove_dev_list(sc); + sony_release_device_id(sc); + hid_hw_stop(hdev); +@@ -2004,6 +2081,8 @@ static void sony_remove(struct hid_device *hdev) + + sony_cancel_work_sync(sc); + ++ kfree(sc->output_report_dmabuf); ++ + sony_remove_dev_list(sc); + + sony_release_device_id(sc); +diff --git a/drivers/hid/hid-wiimote-debug.c b/drivers/hid/hid-wiimote-debug.c +index c13fb5b..55a3802 100644 +--- a/drivers/hid/hid-wiimote-debug.c ++++ b/drivers/hid/hid-wiimote-debug.c +@@ -66,7 +66,7 @@ static ssize_t wiidebug_eeprom_read(struct file *f, char __user *u, size_t s, + else if (size == 0) + return -EIO; + +- if (copy_to_user(u, buf, size)) ++ if (size > sizeof(buf) || copy_to_user(u, buf, size)) + return -EFAULT; + + *off += size; +diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c +index 433f72a..2926005 100644 +--- a/drivers/hv/channel.c ++++ b/drivers/hv/channel.c +@@ -366,8 +366,8 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer, + unsigned long flags; + int ret = 0; + +- next_gpadl_handle = atomic_read(&vmbus_connection.next_gpadl_handle); +- atomic_inc(&vmbus_connection.next_gpadl_handle); ++ next_gpadl_handle = atomic_read_unchecked(&vmbus_connection.next_gpadl_handle); ++ atomic_inc_unchecked(&vmbus_connection.next_gpadl_handle); + + ret = create_gpadl_header(kbuffer, size, &msginfo, &msgcount); + if (ret) +diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c +index 3e4235c..877d0e5 100644 +--- a/drivers/hv/hv.c ++++ b/drivers/hv/hv.c +@@ -112,7 +112,7 @@ static u64 do_hypercall(u64 control, void *input, void *output) + u64 output_address = (output) ? virt_to_phys(output) : 0; + u32 output_address_hi = output_address >> 32; + u32 output_address_lo = output_address & 0xFFFFFFFF; +- void *hypercall_page = hv_context.hypercall_page; ++ void *hypercall_page = ktva_ktla(hv_context.hypercall_page); + + __asm__ __volatile__ ("call *%8" : "=d"(hv_status_hi), + "=a"(hv_status_lo) : "d" (control_hi), +@@ -156,7 +156,7 @@ int hv_init(void) + /* See if the hypercall page is already set */ + rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); + +- virtaddr = __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL_EXEC); ++ virtaddr = __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL_RX); + + if (!virtaddr) + goto cleanup; +diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c +index 5e90c5d..d8fcefb 100644 +--- a/drivers/hv/hv_balloon.c ++++ b/drivers/hv/hv_balloon.c +@@ -470,7 +470,7 @@ MODULE_PARM_DESC(hot_add, "If set attempt memory hot_add"); + + module_param(pressure_report_delay, uint, (S_IRUGO | S_IWUSR)); + MODULE_PARM_DESC(pressure_report_delay, "Delay in secs in reporting pressure"); +-static atomic_t trans_id = ATOMIC_INIT(0); ++static atomic_unchecked_t trans_id = ATOMIC_INIT(0); + + static int dm_ring_size = (5 * PAGE_SIZE); + +@@ -893,7 +893,7 @@ static void hot_add_req(struct work_struct *dummy) + pr_info("Memory hot add failed\n"); + + dm->state = DM_INITIALIZED; +- resp.hdr.trans_id = atomic_inc_return(&trans_id); ++ resp.hdr.trans_id = atomic_inc_return_unchecked(&trans_id); + vmbus_sendpacket(dm->dev->channel, &resp, + sizeof(struct dm_hot_add_response), + (unsigned long)NULL, +@@ -973,7 +973,7 @@ static void post_status(struct hv_dynmem_device *dm) + memset(&status, 0, sizeof(struct dm_status)); + status.hdr.type = DM_STATUS_REPORT; + status.hdr.size = sizeof(struct dm_status); +- status.hdr.trans_id = atomic_inc_return(&trans_id); ++ status.hdr.trans_id = atomic_inc_return_unchecked(&trans_id); + + /* + * The host expects the guest to report free memory. +@@ -993,7 +993,7 @@ static void post_status(struct hv_dynmem_device *dm) + * send the status. This can happen if we were interrupted + * after we picked our transaction ID. + */ +- if (status.hdr.trans_id != atomic_read(&trans_id)) ++ if (status.hdr.trans_id != atomic_read_unchecked(&trans_id)) + return; + + /* +@@ -1129,7 +1129,7 @@ static void balloon_up(struct work_struct *dummy) + */ + + do { +- bl_resp->hdr.trans_id = atomic_inc_return(&trans_id); ++ bl_resp->hdr.trans_id = atomic_inc_return_unchecked(&trans_id); + ret = vmbus_sendpacket(dm_device.dev->channel, + bl_resp, + bl_resp->hdr.size, +@@ -1175,7 +1175,7 @@ static void balloon_down(struct hv_dynmem_device *dm, + + memset(&resp, 0, sizeof(struct dm_unballoon_response)); + resp.hdr.type = DM_UNBALLOON_RESPONSE; +- resp.hdr.trans_id = atomic_inc_return(&trans_id); ++ resp.hdr.trans_id = atomic_inc_return_unchecked(&trans_id); + resp.hdr.size = sizeof(struct dm_unballoon_response); + + vmbus_sendpacket(dm_device.dev->channel, &resp, +@@ -1239,7 +1239,7 @@ static void version_resp(struct hv_dynmem_device *dm, + memset(&version_req, 0, sizeof(struct dm_version_request)); + version_req.hdr.type = DM_VERSION_REQUEST; + version_req.hdr.size = sizeof(struct dm_version_request); +- version_req.hdr.trans_id = atomic_inc_return(&trans_id); ++ version_req.hdr.trans_id = atomic_inc_return_unchecked(&trans_id); + version_req.version.version = DYNMEM_PROTOCOL_VERSION_WIN7; + version_req.is_last_attempt = 1; + +@@ -1409,7 +1409,7 @@ static int balloon_probe(struct hv_device *dev, + memset(&version_req, 0, sizeof(struct dm_version_request)); + version_req.hdr.type = DM_VERSION_REQUEST; + version_req.hdr.size = sizeof(struct dm_version_request); +- version_req.hdr.trans_id = atomic_inc_return(&trans_id); ++ version_req.hdr.trans_id = atomic_inc_return_unchecked(&trans_id); + version_req.version.version = DYNMEM_PROTOCOL_VERSION_WIN8; + version_req.is_last_attempt = 0; + +@@ -1440,7 +1440,7 @@ static int balloon_probe(struct hv_device *dev, + memset(&cap_msg, 0, sizeof(struct dm_capabilities)); + cap_msg.hdr.type = DM_CAPABILITIES_REPORT; + cap_msg.hdr.size = sizeof(struct dm_capabilities); +- cap_msg.hdr.trans_id = atomic_inc_return(&trans_id); ++ cap_msg.hdr.trans_id = atomic_inc_return_unchecked(&trans_id); + + cap_msg.caps.cap_bits.balloon = 1; + cap_msg.caps.cap_bits.hot_add = 1; +diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h +index c386d8d..d6004c4 100644 +--- a/drivers/hv/hyperv_vmbus.h ++++ b/drivers/hv/hyperv_vmbus.h +@@ -611,7 +611,7 @@ enum vmbus_connect_state { + struct vmbus_connection { + enum vmbus_connect_state conn_state; + +- atomic_t next_gpadl_handle; ++ atomic_unchecked_t next_gpadl_handle; + + /* + * Represents channel interrupts. Each bit position represents a +diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c +index 4d6b269..2e23b86 100644 +--- a/drivers/hv/vmbus_drv.c ++++ b/drivers/hv/vmbus_drv.c +@@ -807,10 +807,10 @@ int vmbus_device_register(struct hv_device *child_device_obj) + { + int ret = 0; + +- static atomic_t device_num = ATOMIC_INIT(0); ++ static atomic_unchecked_t device_num = ATOMIC_INIT(0); + + dev_set_name(&child_device_obj->device, "vmbus_0_%d", +- atomic_inc_return(&device_num)); ++ atomic_inc_return_unchecked(&device_num)); + + child_device_obj->device.bus = &hv_bus; + child_device_obj->device.parent = &hv_acpi_dev->dev; +diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_meter.c +index 579bdf9..0dac21d5 100644 +--- a/drivers/hwmon/acpi_power_meter.c ++++ b/drivers/hwmon/acpi_power_meter.c +@@ -116,7 +116,7 @@ struct sensor_template { + struct device_attribute *devattr, + const char *buf, size_t count); + int index; +-}; ++} __do_const; + + /* Averaging interval */ + static int update_avg_interval(struct acpi_power_meter_resource *resource) +@@ -631,7 +631,7 @@ static int register_attrs(struct acpi_power_meter_resource *resource, + struct sensor_template *attrs) + { + struct device *dev = &resource->acpi_dev->dev; +- struct sensor_device_attribute *sensors = ++ sensor_device_attribute_no_const *sensors = + &resource->sensors[resource->num_sensors]; + int res = 0; + +@@ -973,7 +973,7 @@ static int __init enable_cap_knobs(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id __initdata pm_dmi_table[] = { ++static const struct dmi_system_id __initconst pm_dmi_table[] = { + { + enable_cap_knobs, "IBM Active Energy Manager", + { +diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c +index 3288f13..71cfb4e 100644 +--- a/drivers/hwmon/applesmc.c ++++ b/drivers/hwmon/applesmc.c +@@ -1106,7 +1106,7 @@ static int applesmc_create_nodes(struct applesmc_node_group *groups, int num) + { + struct applesmc_node_group *grp; + struct applesmc_dev_attr *node; +- struct attribute *attr; ++ attribute_no_const *attr; + int ret, i; + + for (grp = groups; grp->format; grp++) { +diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c +index cccef87..06ce8ec 100644 +--- a/drivers/hwmon/asus_atk0110.c ++++ b/drivers/hwmon/asus_atk0110.c +@@ -147,10 +147,10 @@ MODULE_DEVICE_TABLE(acpi, atk_ids); + struct atk_sensor_data { + struct list_head list; + struct atk_data *data; +- struct device_attribute label_attr; +- struct device_attribute input_attr; +- struct device_attribute limit1_attr; +- struct device_attribute limit2_attr; ++ device_attribute_no_const label_attr; ++ device_attribute_no_const input_attr; ++ device_attribute_no_const limit1_attr; ++ device_attribute_no_const limit2_attr; + char label_attr_name[ATTR_NAME_SIZE]; + char input_attr_name[ATTR_NAME_SIZE]; + char limit1_attr_name[ATTR_NAME_SIZE]; +@@ -270,7 +270,7 @@ static ssize_t atk_name_show(struct device *dev, + static struct device_attribute atk_name_attr = + __ATTR(name, 0444, atk_name_show, NULL); + +-static void atk_init_attribute(struct device_attribute *attr, char *name, ++static void atk_init_attribute(device_attribute_no_const *attr, char *name, + sysfs_show_func show) + { + sysfs_attr_init(&attr->attr); +diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c +index d76f0b7..55ae976 100644 +--- a/drivers/hwmon/coretemp.c ++++ b/drivers/hwmon/coretemp.c +@@ -784,7 +784,7 @@ static int coretemp_cpu_callback(struct notifier_block *nfb, + return NOTIFY_OK; + } + +-static struct notifier_block coretemp_cpu_notifier __refdata = { ++static struct notifier_block coretemp_cpu_notifier = { + .notifier_call = coretemp_cpu_callback, + }; + +diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c +index 7a8a6fb..015c1fd 100644 +--- a/drivers/hwmon/ibmaem.c ++++ b/drivers/hwmon/ibmaem.c +@@ -924,7 +924,7 @@ static int aem_register_sensors(struct aem_data *data, + struct aem_rw_sensor_template *rw) + { + struct device *dev = &data->pdev->dev; +- struct sensor_device_attribute *sensors = data->sensors; ++ sensor_device_attribute_no_const *sensors = data->sensors; + int err; + + /* Set up read-only sensors */ +diff --git a/drivers/hwmon/iio_hwmon.c b/drivers/hwmon/iio_hwmon.c +index 14c82da..09b25d7 100644 +--- a/drivers/hwmon/iio_hwmon.c ++++ b/drivers/hwmon/iio_hwmon.c +@@ -61,7 +61,7 @@ static int iio_hwmon_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; + struct iio_hwmon_state *st; +- struct sensor_device_attribute *a; ++ sensor_device_attribute_no_const *a; + int ret, i; + int in_i = 1, temp_i = 1, curr_i = 1; + enum iio_chan_type type; +diff --git a/drivers/hwmon/nct6683.c b/drivers/hwmon/nct6683.c +index 7710f46..427a28d 100644 +--- a/drivers/hwmon/nct6683.c ++++ b/drivers/hwmon/nct6683.c +@@ -397,11 +397,11 @@ static struct attribute_group * + nct6683_create_attr_group(struct device *dev, struct sensor_template_group *tg, + int repeat) + { +- struct sensor_device_attribute_2 *a2; +- struct sensor_device_attribute *a; ++ sensor_device_attribute_2_no_const *a2; ++ sensor_device_attribute_no_const *a; + struct sensor_device_template **t; + struct sensor_device_attr_u *su; +- struct attribute_group *group; ++ attribute_group_no_const *group; + struct attribute **attrs; + int i, j, count; + +diff --git a/drivers/hwmon/nct6775.c b/drivers/hwmon/nct6775.c +index 504cbdd..35d6f25 100644 +--- a/drivers/hwmon/nct6775.c ++++ b/drivers/hwmon/nct6775.c +@@ -943,10 +943,10 @@ static struct attribute_group * + nct6775_create_attr_group(struct device *dev, struct sensor_template_group *tg, + int repeat) + { +- struct attribute_group *group; ++ attribute_group_no_const *group; + struct sensor_device_attr_u *su; +- struct sensor_device_attribute *a; +- struct sensor_device_attribute_2 *a2; ++ sensor_device_attribute_no_const *a; ++ sensor_device_attribute_2_no_const *a2; + struct attribute **attrs; + struct sensor_device_template **t; + int i, count; +diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c +index 291d11f..3f0dbbd 100644 +--- a/drivers/hwmon/pmbus/pmbus_core.c ++++ b/drivers/hwmon/pmbus/pmbus_core.c +@@ -783,7 +783,7 @@ static int pmbus_add_attribute(struct pmbus_data *data, struct attribute *attr) + return 0; + } + +-static void pmbus_dev_attr_init(struct device_attribute *dev_attr, ++static void pmbus_dev_attr_init(device_attribute_no_const *dev_attr, + const char *name, + umode_t mode, + ssize_t (*show)(struct device *dev, +@@ -800,7 +800,7 @@ static void pmbus_dev_attr_init(struct device_attribute *dev_attr, + dev_attr->store = store; + } + +-static void pmbus_attr_init(struct sensor_device_attribute *a, ++static void pmbus_attr_init(sensor_device_attribute_no_const *a, + const char *name, + umode_t mode, + ssize_t (*show)(struct device *dev, +@@ -822,7 +822,7 @@ static int pmbus_add_boolean(struct pmbus_data *data, + u16 reg, u8 mask) + { + struct pmbus_boolean *boolean; +- struct sensor_device_attribute *a; ++ sensor_device_attribute_no_const *a; + + boolean = devm_kzalloc(data->dev, sizeof(*boolean), GFP_KERNEL); + if (!boolean) +@@ -847,7 +847,7 @@ static struct pmbus_sensor *pmbus_add_sensor(struct pmbus_data *data, + bool update, bool readonly) + { + struct pmbus_sensor *sensor; +- struct device_attribute *a; ++ device_attribute_no_const *a; + + sensor = devm_kzalloc(data->dev, sizeof(*sensor), GFP_KERNEL); + if (!sensor) +@@ -878,7 +878,7 @@ static int pmbus_add_label(struct pmbus_data *data, + const char *lstring, int index) + { + struct pmbus_label *label; +- struct device_attribute *a; ++ device_attribute_no_const *a; + + label = devm_kzalloc(data->dev, sizeof(*label), GFP_KERNEL); + if (!label) +diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c +index 97cd45a..ac54d8b 100644 +--- a/drivers/hwmon/sht15.c ++++ b/drivers/hwmon/sht15.c +@@ -169,7 +169,7 @@ struct sht15_data { + int supply_uv; + bool supply_uv_valid; + struct work_struct update_supply_work; +- atomic_t interrupt_handled; ++ atomic_unchecked_t interrupt_handled; + }; + + /** +@@ -542,13 +542,13 @@ static int sht15_measurement(struct sht15_data *data, + ret = gpio_direction_input(data->pdata->gpio_data); + if (ret) + return ret; +- atomic_set(&data->interrupt_handled, 0); ++ atomic_set_unchecked(&data->interrupt_handled, 0); + + enable_irq(gpio_to_irq(data->pdata->gpio_data)); + if (gpio_get_value(data->pdata->gpio_data) == 0) { + disable_irq_nosync(gpio_to_irq(data->pdata->gpio_data)); + /* Only relevant if the interrupt hasn't occurred. */ +- if (!atomic_read(&data->interrupt_handled)) ++ if (!atomic_read_unchecked(&data->interrupt_handled)) + schedule_work(&data->read_work); + } + ret = wait_event_timeout(data->wait_queue, +@@ -820,7 +820,7 @@ static irqreturn_t sht15_interrupt_fired(int irq, void *d) + + /* First disable the interrupt */ + disable_irq_nosync(irq); +- atomic_inc(&data->interrupt_handled); ++ atomic_inc_unchecked(&data->interrupt_handled); + /* Then schedule a reading work struct */ + if (data->state != SHT15_READING_NOTHING) + schedule_work(&data->read_work); +@@ -842,11 +842,11 @@ static void sht15_bh_read_data(struct work_struct *work_s) + * If not, then start the interrupt again - care here as could + * have gone low in meantime so verify it hasn't! + */ +- atomic_set(&data->interrupt_handled, 0); ++ atomic_set_unchecked(&data->interrupt_handled, 0); + enable_irq(gpio_to_irq(data->pdata->gpio_data)); + /* If still not occurred or another handler was scheduled */ + if (gpio_get_value(data->pdata->gpio_data) +- || atomic_read(&data->interrupt_handled)) ++ || atomic_read_unchecked(&data->interrupt_handled)) + return; + } + +diff --git a/drivers/hwmon/via-cputemp.c b/drivers/hwmon/via-cputemp.c +index 8df43c5..b07b91d 100644 +--- a/drivers/hwmon/via-cputemp.c ++++ b/drivers/hwmon/via-cputemp.c +@@ -296,7 +296,7 @@ static int via_cputemp_cpu_callback(struct notifier_block *nfb, + return NOTIFY_OK; + } + +-static struct notifier_block via_cputemp_cpu_notifier __refdata = { ++static struct notifier_block via_cputemp_cpu_notifier = { + .notifier_call = via_cputemp_cpu_callback, + }; + +diff --git a/drivers/i2c/busses/i2c-amd756-s4882.c b/drivers/i2c/busses/i2c-amd756-s4882.c +index 65e3240..e6c511d 100644 +--- a/drivers/i2c/busses/i2c-amd756-s4882.c ++++ b/drivers/i2c/busses/i2c-amd756-s4882.c +@@ -39,7 +39,7 @@ + extern struct i2c_adapter amd756_smbus; + + static struct i2c_adapter *s4882_adapter; +-static struct i2c_algorithm *s4882_algo; ++static i2c_algorithm_no_const *s4882_algo; + + /* Wrapper access functions for multiplexed SMBus */ + static DEFINE_MUTEX(amd756_lock); +diff --git a/drivers/i2c/busses/i2c-diolan-u2c.c b/drivers/i2c/busses/i2c-diolan-u2c.c +index b19a310..d6eece0 100644 +--- a/drivers/i2c/busses/i2c-diolan-u2c.c ++++ b/drivers/i2c/busses/i2c-diolan-u2c.c +@@ -98,7 +98,7 @@ MODULE_PARM_DESC(frequency, "I2C clock frequency in hertz"); + /* usb layer */ + + /* Send command to device, and get response. */ +-static int diolan_usb_transfer(struct i2c_diolan_u2c *dev) ++static int __intentional_overflow(-1) diolan_usb_transfer(struct i2c_diolan_u2c *dev) + { + int ret = 0; + int actual; +diff --git a/drivers/i2c/busses/i2c-nforce2-s4985.c b/drivers/i2c/busses/i2c-nforce2-s4985.c +index 88eda09..cf40434 100644 +--- a/drivers/i2c/busses/i2c-nforce2-s4985.c ++++ b/drivers/i2c/busses/i2c-nforce2-s4985.c +@@ -37,7 +37,7 @@ + extern struct i2c_adapter *nforce2_smbus; + + static struct i2c_adapter *s4985_adapter; +-static struct i2c_algorithm *s4985_algo; ++static i2c_algorithm_no_const *s4985_algo; + + /* Wrapper access functions for multiplexed SMBus */ + static DEFINE_MUTEX(nforce2_lock); +diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c +index 71c7a39..71dd3e0 100644 +--- a/drivers/i2c/i2c-dev.c ++++ b/drivers/i2c/i2c-dev.c +@@ -272,7 +272,7 @@ static noinline int i2cdev_ioctl_rdrw(struct i2c_client *client, + break; + } + +- data_ptrs[i] = (u8 __user *)rdwr_pa[i].buf; ++ data_ptrs[i] = (u8 __force_user *)rdwr_pa[i].buf; + rdwr_pa[i].buf = memdup_user(data_ptrs[i], rdwr_pa[i].len); + if (IS_ERR(rdwr_pa[i].buf)) { + res = PTR_ERR(rdwr_pa[i].buf); +diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c +index 0b510ba..4fbb5085 100644 +--- a/drivers/ide/ide-cd.c ++++ b/drivers/ide/ide-cd.c +@@ -768,7 +768,7 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) + alignment = queue_dma_alignment(q) | q->dma_pad_mask; + if ((unsigned long)buf & alignment + || blk_rq_bytes(rq) & q->dma_pad_mask +- || object_is_on_stack(buf)) ++ || object_starts_on_stack(buf)) + drive->dma = 0; + } + } +diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c +index f009d05..d95b613 100644 +--- a/drivers/iio/industrialio-core.c ++++ b/drivers/iio/industrialio-core.c +@@ -555,7 +555,7 @@ static ssize_t iio_write_channel_info(struct device *dev, + } + + static +-int __iio_device_attr_init(struct device_attribute *dev_attr, ++int __iio_device_attr_init(device_attribute_no_const *dev_attr, + const char *postfix, + struct iio_chan_spec const *chan, + ssize_t (*readfunc)(struct device *dev, +diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c +index e28a494..f7c2671 100644 +--- a/drivers/infiniband/core/cm.c ++++ b/drivers/infiniband/core/cm.c +@@ -115,7 +115,7 @@ static char const counter_group_names[CM_COUNTER_GROUPS] + + struct cm_counter_group { + struct kobject obj; +- atomic_long_t counter[CM_ATTR_COUNT]; ++ atomic_long_unchecked_t counter[CM_ATTR_COUNT]; + }; + + struct cm_counter_attribute { +@@ -1398,7 +1398,7 @@ static void cm_dup_req_handler(struct cm_work *work, + struct ib_mad_send_buf *msg = NULL; + int ret; + +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_REQ_COUNTER]); + + /* Quick state check to discard duplicate REQs. */ +@@ -1785,7 +1785,7 @@ static void cm_dup_rep_handler(struct cm_work *work) + if (!cm_id_priv) + return; + +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_REP_COUNTER]); + ret = cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg); + if (ret) +@@ -1952,7 +1952,7 @@ static int cm_rtu_handler(struct cm_work *work) + if (cm_id_priv->id.state != IB_CM_REP_SENT && + cm_id_priv->id.state != IB_CM_MRA_REP_RCVD) { + spin_unlock_irq(&cm_id_priv->lock); +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_RTU_COUNTER]); + goto out; + } +@@ -2135,7 +2135,7 @@ static int cm_dreq_handler(struct cm_work *work) + cm_id_priv = cm_acquire_id(dreq_msg->remote_comm_id, + dreq_msg->local_comm_id); + if (!cm_id_priv) { +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_DREQ_COUNTER]); + cm_issue_drep(work->port, work->mad_recv_wc); + return -EINVAL; +@@ -2160,7 +2160,7 @@ static int cm_dreq_handler(struct cm_work *work) + case IB_CM_MRA_REP_RCVD: + break; + case IB_CM_TIMEWAIT: +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_DREQ_COUNTER]); + if (cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg)) + goto unlock; +@@ -2174,7 +2174,7 @@ static int cm_dreq_handler(struct cm_work *work) + cm_free_msg(msg); + goto deref; + case IB_CM_DREQ_RCVD: +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_DREQ_COUNTER]); + goto unlock; + default: +@@ -2541,7 +2541,7 @@ static int cm_mra_handler(struct cm_work *work) + ib_modify_mad(cm_id_priv->av.port->mad_agent, + cm_id_priv->msg, timeout)) { + if (cm_id_priv->id.lap_state == IB_CM_MRA_LAP_RCVD) +- atomic_long_inc(&work->port-> ++ atomic_long_inc_unchecked(&work->port-> + counter_group[CM_RECV_DUPLICATES]. + counter[CM_MRA_COUNTER]); + goto out; +@@ -2550,7 +2550,7 @@ static int cm_mra_handler(struct cm_work *work) + break; + case IB_CM_MRA_REQ_RCVD: + case IB_CM_MRA_REP_RCVD: +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_MRA_COUNTER]); + /* fall through */ + default: +@@ -2712,7 +2712,7 @@ static int cm_lap_handler(struct cm_work *work) + case IB_CM_LAP_IDLE: + break; + case IB_CM_MRA_LAP_SENT: +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_LAP_COUNTER]); + if (cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg)) + goto unlock; +@@ -2728,7 +2728,7 @@ static int cm_lap_handler(struct cm_work *work) + cm_free_msg(msg); + goto deref; + case IB_CM_LAP_RCVD: +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_LAP_COUNTER]); + goto unlock; + default: +@@ -3012,7 +3012,7 @@ static int cm_sidr_req_handler(struct cm_work *work) + cur_cm_id_priv = cm_insert_remote_sidr(cm_id_priv); + if (cur_cm_id_priv) { + spin_unlock_irq(&cm.lock); +- atomic_long_inc(&work->port->counter_group[CM_RECV_DUPLICATES]. ++ atomic_long_inc_unchecked(&work->port->counter_group[CM_RECV_DUPLICATES]. + counter[CM_SIDR_REQ_COUNTER]); + goto out; /* Duplicate message. */ + } +@@ -3224,10 +3224,10 @@ static void cm_send_handler(struct ib_mad_agent *mad_agent, + if (!msg->context[0] && (attr_index != CM_REJ_COUNTER)) + msg->retries = 1; + +- atomic_long_add(1 + msg->retries, ++ atomic_long_add_unchecked(1 + msg->retries, + &port->counter_group[CM_XMIT].counter[attr_index]); + if (msg->retries) +- atomic_long_add(msg->retries, ++ atomic_long_add_unchecked(msg->retries, + &port->counter_group[CM_XMIT_RETRIES]. + counter[attr_index]); + +@@ -3437,7 +3437,7 @@ static void cm_recv_handler(struct ib_mad_agent *mad_agent, + } + + attr_id = be16_to_cpu(mad_recv_wc->recv_buf.mad->mad_hdr.attr_id); +- atomic_long_inc(&port->counter_group[CM_RECV]. ++ atomic_long_inc_unchecked(&port->counter_group[CM_RECV]. + counter[attr_id - CM_ATTR_ID_OFFSET]); + + work = kmalloc(sizeof *work + sizeof(struct ib_sa_path_rec) * paths, +@@ -3668,7 +3668,7 @@ static ssize_t cm_show_counter(struct kobject *obj, struct attribute *attr, + cm_attr = container_of(attr, struct cm_counter_attribute, attr); + + return sprintf(buf, "%ld\n", +- atomic_long_read(&group->counter[cm_attr->index])); ++ atomic_long_read_unchecked(&group->counter[cm_attr->index])); + } + + static const struct sysfs_ops cm_counter_ops = { +diff --git a/drivers/infiniband/core/fmr_pool.c b/drivers/infiniband/core/fmr_pool.c +index 9f5ad7c..588cd84 100644 +--- a/drivers/infiniband/core/fmr_pool.c ++++ b/drivers/infiniband/core/fmr_pool.c +@@ -98,8 +98,8 @@ struct ib_fmr_pool { + + struct task_struct *thread; + +- atomic_t req_ser; +- atomic_t flush_ser; ++ atomic_unchecked_t req_ser; ++ atomic_unchecked_t flush_ser; + + wait_queue_head_t force_wait; + }; +@@ -179,10 +179,10 @@ static int ib_fmr_cleanup_thread(void *pool_ptr) + struct ib_fmr_pool *pool = pool_ptr; + + do { +- if (atomic_read(&pool->flush_ser) - atomic_read(&pool->req_ser) < 0) { ++ if (atomic_read_unchecked(&pool->flush_ser) - atomic_read_unchecked(&pool->req_ser) < 0) { + ib_fmr_batch_release(pool); + +- atomic_inc(&pool->flush_ser); ++ atomic_inc_unchecked(&pool->flush_ser); + wake_up_interruptible(&pool->force_wait); + + if (pool->flush_function) +@@ -190,7 +190,7 @@ static int ib_fmr_cleanup_thread(void *pool_ptr) + } + + set_current_state(TASK_INTERRUPTIBLE); +- if (atomic_read(&pool->flush_ser) - atomic_read(&pool->req_ser) >= 0 && ++ if (atomic_read_unchecked(&pool->flush_ser) - atomic_read_unchecked(&pool->req_ser) >= 0 && + !kthread_should_stop()) + schedule(); + __set_current_state(TASK_RUNNING); +@@ -282,8 +282,8 @@ struct ib_fmr_pool *ib_create_fmr_pool(struct ib_pd *pd, + pool->dirty_watermark = params->dirty_watermark; + pool->dirty_len = 0; + spin_lock_init(&pool->pool_lock); +- atomic_set(&pool->req_ser, 0); +- atomic_set(&pool->flush_ser, 0); ++ atomic_set_unchecked(&pool->req_ser, 0); ++ atomic_set_unchecked(&pool->flush_ser, 0); + init_waitqueue_head(&pool->force_wait); + + pool->thread = kthread_run(ib_fmr_cleanup_thread, +@@ -411,11 +411,11 @@ int ib_flush_fmr_pool(struct ib_fmr_pool *pool) + } + spin_unlock_irq(&pool->pool_lock); + +- serial = atomic_inc_return(&pool->req_ser); ++ serial = atomic_inc_return_unchecked(&pool->req_ser); + wake_up_process(pool->thread); + + if (wait_event_interruptible(pool->force_wait, +- atomic_read(&pool->flush_ser) - serial >= 0)) ++ atomic_read_unchecked(&pool->flush_ser) - serial >= 0)) + return -EINTR; + + return 0; +@@ -525,7 +525,7 @@ int ib_fmr_pool_unmap(struct ib_pool_fmr *fmr) + } else { + list_add_tail(&fmr->list, &pool->dirty_list); + if (++pool->dirty_len >= pool->dirty_watermark) { +- atomic_inc(&pool->req_ser); ++ atomic_inc_unchecked(&pool->req_ser); + wake_up_process(pool->thread); + } + } +diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c +index 63a9f04..cc30813 100644 +--- a/drivers/infiniband/core/uverbs_cmd.c ++++ b/drivers/infiniband/core/uverbs_cmd.c +@@ -923,6 +923,9 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file, + if (copy_from_user(&cmd, buf, sizeof cmd)) + return -EFAULT; + ++ if (!access_ok_noprefault(VERIFY_READ, cmd.start, cmd.length)) ++ return -EFAULT; ++ + INIT_UDATA(&udata, buf + sizeof cmd, + (unsigned long) cmd.response + sizeof resp, + in_len - sizeof cmd, out_len - sizeof resp); +diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c +index ec7a298..8742e59 100644 +--- a/drivers/infiniband/hw/cxgb4/mem.c ++++ b/drivers/infiniband/hw/cxgb4/mem.c +@@ -249,7 +249,7 @@ static int write_tpt_entry(struct c4iw_rdev *rdev, u32 reset_tpt_entry, + int err; + struct fw_ri_tpte tpt; + u32 stag_idx; +- static atomic_t key; ++ static atomic_unchecked_t key; + + if (c4iw_fatal_error(rdev)) + return -EIO; +@@ -270,7 +270,7 @@ static int write_tpt_entry(struct c4iw_rdev *rdev, u32 reset_tpt_entry, + if (rdev->stats.stag.cur > rdev->stats.stag.max) + rdev->stats.stag.max = rdev->stats.stag.cur; + mutex_unlock(&rdev->stats.lock); +- *stag = (stag_idx << 8) | (atomic_inc_return(&key) & 0xff); ++ *stag = (stag_idx << 8) | (atomic_inc_return_unchecked(&key) & 0xff); + } + PDBG("%s stag_state 0x%0x type 0x%0x pdid 0x%0x, stag_idx 0x%x\n", + __func__, stag_state, type, pdid, stag_idx); +diff --git a/drivers/infiniband/hw/ipath/ipath_rc.c b/drivers/infiniband/hw/ipath/ipath_rc.c +index 79b3dbc..96e5fcc 100644 +--- a/drivers/infiniband/hw/ipath/ipath_rc.c ++++ b/drivers/infiniband/hw/ipath/ipath_rc.c +@@ -1868,7 +1868,7 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, + struct ib_atomic_eth *ateth; + struct ipath_ack_entry *e; + u64 vaddr; +- atomic64_t *maddr; ++ atomic64_unchecked_t *maddr; + u64 sdata; + u32 rkey; + u8 next; +@@ -1903,11 +1903,11 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, + IB_ACCESS_REMOTE_ATOMIC))) + goto nack_acc_unlck; + /* Perform atomic OP and save result. */ +- maddr = (atomic64_t *) qp->r_sge.sge.vaddr; ++ maddr = (atomic64_unchecked_t *) qp->r_sge.sge.vaddr; + sdata = be64_to_cpu(ateth->swap_data); + e = &qp->s_ack_queue[qp->r_head_ack_queue]; + e->atomic_data = (opcode == OP(FETCH_ADD)) ? +- (u64) atomic64_add_return(sdata, maddr) - sdata : ++ (u64) atomic64_add_return_unchecked(sdata, maddr) - sdata : + (u64) cmpxchg((u64 *) qp->r_sge.sge.vaddr, + be64_to_cpu(ateth->compare_data), + sdata); +diff --git a/drivers/infiniband/hw/ipath/ipath_ruc.c b/drivers/infiniband/hw/ipath/ipath_ruc.c +index 1f95bba..9530f87 100644 +--- a/drivers/infiniband/hw/ipath/ipath_ruc.c ++++ b/drivers/infiniband/hw/ipath/ipath_ruc.c +@@ -266,7 +266,7 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp) + unsigned long flags; + struct ib_wc wc; + u64 sdata; +- atomic64_t *maddr; ++ atomic64_unchecked_t *maddr; + enum ib_wc_status send_status; + + /* +@@ -382,11 +382,11 @@ again: + IB_ACCESS_REMOTE_ATOMIC))) + goto acc_err; + /* Perform atomic OP and save result. */ +- maddr = (atomic64_t *) qp->r_sge.sge.vaddr; ++ maddr = (atomic64_unchecked_t *) qp->r_sge.sge.vaddr; + sdata = wqe->wr.wr.atomic.compare_add; + *(u64 *) sqp->s_sge.sge.vaddr = + (wqe->wr.opcode == IB_WR_ATOMIC_FETCH_AND_ADD) ? +- (u64) atomic64_add_return(sdata, maddr) - sdata : ++ (u64) atomic64_add_return_unchecked(sdata, maddr) - sdata : + (u64) cmpxchg((u64 *) qp->r_sge.sge.vaddr, + sdata, wqe->wr.wr.atomic.swap); + goto send_comp; +diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c +index 729382c..2f82b8d 100644 +--- a/drivers/infiniband/hw/mlx4/mad.c ++++ b/drivers/infiniband/hw/mlx4/mad.c +@@ -106,7 +106,7 @@ __be64 mlx4_ib_gen_node_guid(void) + + __be64 mlx4_ib_get_new_demux_tid(struct mlx4_ib_demux_ctx *ctx) + { +- return cpu_to_be64(atomic_inc_return(&ctx->tid)) | ++ return cpu_to_be64(atomic_inc_return_unchecked(&ctx->tid)) | + cpu_to_be64(0xff00000000000000LL); + } + +diff --git a/drivers/infiniband/hw/mlx4/mcg.c b/drivers/infiniband/hw/mlx4/mcg.c +index ed327e6..ca1739e 100644 +--- a/drivers/infiniband/hw/mlx4/mcg.c ++++ b/drivers/infiniband/hw/mlx4/mcg.c +@@ -1041,7 +1041,7 @@ int mlx4_ib_mcg_port_init(struct mlx4_ib_demux_ctx *ctx) + { + char name[20]; + +- atomic_set(&ctx->tid, 0); ++ atomic_set_unchecked(&ctx->tid, 0); + sprintf(name, "mlx4_ib_mcg%d", ctx->port); + ctx->mcg_wq = create_singlethread_workqueue(name); + if (!ctx->mcg_wq) +diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h +index 6eb743f..a7b0f6d 100644 +--- a/drivers/infiniband/hw/mlx4/mlx4_ib.h ++++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h +@@ -426,7 +426,7 @@ struct mlx4_ib_demux_ctx { + struct list_head mcg_mgid0_list; + struct workqueue_struct *mcg_wq; + struct mlx4_ib_demux_pv_ctx **tun; +- atomic_t tid; ++ atomic_unchecked_t tid; + int flushing; /* flushing the work queue */ + }; + +diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c +index 9d3e5c1..6f166df 100644 +--- a/drivers/infiniband/hw/mthca/mthca_cmd.c ++++ b/drivers/infiniband/hw/mthca/mthca_cmd.c +@@ -772,7 +772,7 @@ static void mthca_setup_cmd_doorbells(struct mthca_dev *dev, u64 base) + mthca_dbg(dev, "Mapped doorbell page for posting FW commands\n"); + } + +-int mthca_QUERY_FW(struct mthca_dev *dev) ++int __intentional_overflow(-1) mthca_QUERY_FW(struct mthca_dev *dev) + { + struct mthca_mailbox *mailbox; + u32 *outbox; +@@ -1612,7 +1612,7 @@ int mthca_HW2SW_MPT(struct mthca_dev *dev, struct mthca_mailbox *mailbox, + CMD_TIME_CLASS_B); + } + +-int mthca_WRITE_MTT(struct mthca_dev *dev, struct mthca_mailbox *mailbox, ++int __intentional_overflow(-1) mthca_WRITE_MTT(struct mthca_dev *dev, struct mthca_mailbox *mailbox, + int num_mtt) + { + return mthca_cmd(dev, mailbox->dma, num_mtt, 0, CMD_WRITE_MTT, +@@ -1634,7 +1634,7 @@ int mthca_MAP_EQ(struct mthca_dev *dev, u64 event_mask, int unmap, + 0, CMD_MAP_EQ, CMD_TIME_CLASS_B); + } + +-int mthca_SW2HW_EQ(struct mthca_dev *dev, struct mthca_mailbox *mailbox, ++int __intentional_overflow(-1) mthca_SW2HW_EQ(struct mthca_dev *dev, struct mthca_mailbox *mailbox, + int eq_num) + { + return mthca_cmd(dev, mailbox->dma, eq_num, 0, CMD_SW2HW_EQ, +@@ -1857,7 +1857,7 @@ int mthca_CONF_SPECIAL_QP(struct mthca_dev *dev, int type, u32 qpn) + CMD_TIME_CLASS_B); + } + +-int mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey, ++int __intentional_overflow(-1) mthca_MAD_IFC(struct mthca_dev *dev, int ignore_mkey, int ignore_bkey, + int port, struct ib_wc *in_wc, struct ib_grh *in_grh, + void *in_mad, void *response_mad) + { +diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c +index ded76c1..0cf0a08 100644 +--- a/drivers/infiniband/hw/mthca/mthca_main.c ++++ b/drivers/infiniband/hw/mthca/mthca_main.c +@@ -692,7 +692,7 @@ err_close: + return err; + } + +-static int mthca_setup_hca(struct mthca_dev *dev) ++static int __intentional_overflow(-1) mthca_setup_hca(struct mthca_dev *dev) + { + int err; + +diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c +index ed9a989..6aa5dc2 100644 +--- a/drivers/infiniband/hw/mthca/mthca_mr.c ++++ b/drivers/infiniband/hw/mthca/mthca_mr.c +@@ -81,7 +81,7 @@ struct mthca_mpt_entry { + * through the bitmaps) + */ + +-static u32 mthca_buddy_alloc(struct mthca_buddy *buddy, int order) ++static u32 __intentional_overflow(-1) mthca_buddy_alloc(struct mthca_buddy *buddy, int order) + { + int o; + int m; +@@ -426,7 +426,7 @@ static inline u32 adjust_key(struct mthca_dev *dev, u32 key) + return key; + } + +-int mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift, ++int __intentional_overflow(-1) mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift, + u64 iova, u64 total_size, u32 access, struct mthca_mr *mr) + { + struct mthca_mailbox *mailbox; +@@ -516,7 +516,7 @@ int mthca_mr_alloc_notrans(struct mthca_dev *dev, u32 pd, + return mthca_mr_alloc(dev, pd, 12, 0, ~0ULL, access, mr); + } + +-int mthca_mr_alloc_phys(struct mthca_dev *dev, u32 pd, ++int __intentional_overflow(-1) mthca_mr_alloc_phys(struct mthca_dev *dev, u32 pd, + u64 *buffer_list, int buffer_size_shift, + int list_len, u64 iova, u64 total_size, + u32 access, struct mthca_mr *mr) +diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c +index 415f8e1..e34214e 100644 +--- a/drivers/infiniband/hw/mthca/mthca_provider.c ++++ b/drivers/infiniband/hw/mthca/mthca_provider.c +@@ -764,7 +764,7 @@ unlock: + return 0; + } + +-static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) ++static int __intentional_overflow(-1) mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) + { + struct mthca_dev *dev = to_mdev(ibcq->device); + struct mthca_cq *cq = to_mcq(ibcq); +diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c +index 3b2a6dc..bce26ff 100644 +--- a/drivers/infiniband/hw/nes/nes.c ++++ b/drivers/infiniband/hw/nes/nes.c +@@ -97,7 +97,7 @@ MODULE_PARM_DESC(limit_maxrdreqsz, "Limit max read request size to 256 Bytes"); + LIST_HEAD(nes_adapter_list); + static LIST_HEAD(nes_dev_list); + +-atomic_t qps_destroyed; ++atomic_unchecked_t qps_destroyed; + + static unsigned int ee_flsh_adapter; + static unsigned int sysfs_nonidx_addr; +@@ -278,7 +278,7 @@ static void nes_cqp_rem_ref_callback(struct nes_device *nesdev, struct nes_cqp_r + struct nes_qp *nesqp = cqp_request->cqp_callback_pointer; + struct nes_adapter *nesadapter = nesdev->nesadapter; + +- atomic_inc(&qps_destroyed); ++ atomic_inc_unchecked(&qps_destroyed); + + /* Free the control structures */ + +diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h +index bd9d132..70d84f4 100644 +--- a/drivers/infiniband/hw/nes/nes.h ++++ b/drivers/infiniband/hw/nes/nes.h +@@ -180,17 +180,17 @@ extern unsigned int nes_debug_level; + extern unsigned int wqm_quanta; + extern struct list_head nes_adapter_list; + +-extern atomic_t cm_connects; +-extern atomic_t cm_accepts; +-extern atomic_t cm_disconnects; +-extern atomic_t cm_closes; +-extern atomic_t cm_connecteds; +-extern atomic_t cm_connect_reqs; +-extern atomic_t cm_rejects; +-extern atomic_t mod_qp_timouts; +-extern atomic_t qps_created; +-extern atomic_t qps_destroyed; +-extern atomic_t sw_qps_destroyed; ++extern atomic_unchecked_t cm_connects; ++extern atomic_unchecked_t cm_accepts; ++extern atomic_unchecked_t cm_disconnects; ++extern atomic_unchecked_t cm_closes; ++extern atomic_unchecked_t cm_connecteds; ++extern atomic_unchecked_t cm_connect_reqs; ++extern atomic_unchecked_t cm_rejects; ++extern atomic_unchecked_t mod_qp_timouts; ++extern atomic_unchecked_t qps_created; ++extern atomic_unchecked_t qps_destroyed; ++extern atomic_unchecked_t sw_qps_destroyed; + extern u32 mh_detected; + extern u32 mh_pauses_sent; + extern u32 cm_packets_sent; +@@ -199,16 +199,16 @@ extern u32 cm_packets_created; + extern u32 cm_packets_received; + extern u32 cm_packets_dropped; + extern u32 cm_packets_retrans; +-extern atomic_t cm_listens_created; +-extern atomic_t cm_listens_destroyed; ++extern atomic_unchecked_t cm_listens_created; ++extern atomic_unchecked_t cm_listens_destroyed; + extern u32 cm_backlog_drops; +-extern atomic_t cm_loopbacks; +-extern atomic_t cm_nodes_created; +-extern atomic_t cm_nodes_destroyed; +-extern atomic_t cm_accel_dropped_pkts; +-extern atomic_t cm_resets_recvd; +-extern atomic_t pau_qps_created; +-extern atomic_t pau_qps_destroyed; ++extern atomic_unchecked_t cm_loopbacks; ++extern atomic_unchecked_t cm_nodes_created; ++extern atomic_unchecked_t cm_nodes_destroyed; ++extern atomic_unchecked_t cm_accel_dropped_pkts; ++extern atomic_unchecked_t cm_resets_recvd; ++extern atomic_unchecked_t pau_qps_created; ++extern atomic_unchecked_t pau_qps_destroyed; + + extern u32 int_mod_timer_init; + extern u32 int_mod_cq_depth_256; +diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c +index 6f09a72..cf4399d 100644 +--- a/drivers/infiniband/hw/nes/nes_cm.c ++++ b/drivers/infiniband/hw/nes/nes_cm.c +@@ -69,14 +69,14 @@ u32 cm_packets_dropped; + u32 cm_packets_retrans; + u32 cm_packets_created; + u32 cm_packets_received; +-atomic_t cm_listens_created; +-atomic_t cm_listens_destroyed; ++atomic_unchecked_t cm_listens_created; ++atomic_unchecked_t cm_listens_destroyed; + u32 cm_backlog_drops; +-atomic_t cm_loopbacks; +-atomic_t cm_nodes_created; +-atomic_t cm_nodes_destroyed; +-atomic_t cm_accel_dropped_pkts; +-atomic_t cm_resets_recvd; ++atomic_unchecked_t cm_loopbacks; ++atomic_unchecked_t cm_nodes_created; ++atomic_unchecked_t cm_nodes_destroyed; ++atomic_unchecked_t cm_accel_dropped_pkts; ++atomic_unchecked_t cm_resets_recvd; + + static inline int mini_cm_accelerated(struct nes_cm_core *, struct nes_cm_node *); + static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *, struct nes_vnic *, struct nes_cm_info *); +@@ -135,28 +135,28 @@ static void record_ird_ord(struct nes_cm_node *, u16, u16); + /* instance of function pointers for client API */ + /* set address of this instance to cm_core->cm_ops at cm_core alloc */ + static struct nes_cm_ops nes_cm_api = { +- mini_cm_accelerated, +- mini_cm_listen, +- mini_cm_del_listen, +- mini_cm_connect, +- mini_cm_close, +- mini_cm_accept, +- mini_cm_reject, +- mini_cm_recv_pkt, +- mini_cm_dealloc_core, +- mini_cm_get, +- mini_cm_set ++ .accelerated = mini_cm_accelerated, ++ .listen = mini_cm_listen, ++ .stop_listener = mini_cm_del_listen, ++ .connect = mini_cm_connect, ++ .close = mini_cm_close, ++ .accept = mini_cm_accept, ++ .reject = mini_cm_reject, ++ .recv_pkt = mini_cm_recv_pkt, ++ .destroy_cm_core = mini_cm_dealloc_core, ++ .get = mini_cm_get, ++ .set = mini_cm_set + }; + + static struct nes_cm_core *g_cm_core; + +-atomic_t cm_connects; +-atomic_t cm_accepts; +-atomic_t cm_disconnects; +-atomic_t cm_closes; +-atomic_t cm_connecteds; +-atomic_t cm_connect_reqs; +-atomic_t cm_rejects; ++atomic_unchecked_t cm_connects; ++atomic_unchecked_t cm_accepts; ++atomic_unchecked_t cm_disconnects; ++atomic_unchecked_t cm_closes; ++atomic_unchecked_t cm_connecteds; ++atomic_unchecked_t cm_connect_reqs; ++atomic_unchecked_t cm_rejects; + + int nes_add_ref_cm_node(struct nes_cm_node *cm_node) + { +@@ -1436,7 +1436,7 @@ static int mini_cm_dec_refcnt_listen(struct nes_cm_core *cm_core, + kfree(listener); + listener = NULL; + ret = 0; +- atomic_inc(&cm_listens_destroyed); ++ atomic_inc_unchecked(&cm_listens_destroyed); + } else { + spin_unlock_irqrestore(&cm_core->listen_list_lock, flags); + } +@@ -1637,7 +1637,7 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core, + cm_node->rem_mac); + + add_hte_node(cm_core, cm_node); +- atomic_inc(&cm_nodes_created); ++ atomic_inc_unchecked(&cm_nodes_created); + + return cm_node; + } +@@ -1698,7 +1698,7 @@ static int rem_ref_cm_node(struct nes_cm_core *cm_core, + } + + atomic_dec(&cm_core->node_cnt); +- atomic_inc(&cm_nodes_destroyed); ++ atomic_inc_unchecked(&cm_nodes_destroyed); + nesqp = cm_node->nesqp; + if (nesqp) { + nesqp->cm_node = NULL; +@@ -1762,7 +1762,7 @@ static int process_options(struct nes_cm_node *cm_node, u8 *optionsloc, + + static void drop_packet(struct sk_buff *skb) + { +- atomic_inc(&cm_accel_dropped_pkts); ++ atomic_inc_unchecked(&cm_accel_dropped_pkts); + dev_kfree_skb_any(skb); + } + +@@ -1825,7 +1825,7 @@ static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb, + { + + int reset = 0; /* whether to send reset in case of err.. */ +- atomic_inc(&cm_resets_recvd); ++ atomic_inc_unchecked(&cm_resets_recvd); + nes_debug(NES_DBG_CM, "Received Reset, cm_node = %p, state = %u." + " refcnt=%d\n", cm_node, cm_node->state, + atomic_read(&cm_node->ref_count)); +@@ -2492,7 +2492,7 @@ static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *cm_core, + rem_ref_cm_node(cm_node->cm_core, cm_node); + return NULL; + } +- atomic_inc(&cm_loopbacks); ++ atomic_inc_unchecked(&cm_loopbacks); + loopbackremotenode->loopbackpartner = cm_node; + loopbackremotenode->tcp_cntxt.rcv_wscale = + NES_CM_DEFAULT_RCV_WND_SCALE; +@@ -2773,7 +2773,7 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core, + nes_queue_mgt_skbs(skb, nesvnic, cm_node->nesqp); + else { + rem_ref_cm_node(cm_core, cm_node); +- atomic_inc(&cm_accel_dropped_pkts); ++ atomic_inc_unchecked(&cm_accel_dropped_pkts); + dev_kfree_skb_any(skb); + } + break; +@@ -3081,7 +3081,7 @@ static int nes_cm_disconn_true(struct nes_qp *nesqp) + + if ((cm_id) && (cm_id->event_handler)) { + if (issue_disconn) { +- atomic_inc(&cm_disconnects); ++ atomic_inc_unchecked(&cm_disconnects); + cm_event.event = IW_CM_EVENT_DISCONNECT; + cm_event.status = disconn_status; + cm_event.local_addr = cm_id->local_addr; +@@ -3103,7 +3103,7 @@ static int nes_cm_disconn_true(struct nes_qp *nesqp) + } + + if (issue_close) { +- atomic_inc(&cm_closes); ++ atomic_inc_unchecked(&cm_closes); + nes_disconnect(nesqp, 1); + + cm_id->provider_data = nesqp; +@@ -3241,7 +3241,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) + + nes_debug(NES_DBG_CM, "QP%u, cm_node=%p, jiffies = %lu listener = %p\n", + nesqp->hwqp.qp_id, cm_node, jiffies, cm_node->listener); +- atomic_inc(&cm_accepts); ++ atomic_inc_unchecked(&cm_accepts); + + nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n", + netdev_refcnt_read(nesvnic->netdev)); +@@ -3439,7 +3439,7 @@ int nes_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len) + struct nes_cm_core *cm_core; + u8 *start_buff; + +- atomic_inc(&cm_rejects); ++ atomic_inc_unchecked(&cm_rejects); + cm_node = (struct nes_cm_node *)cm_id->provider_data; + loopback = cm_node->loopbackpartner; + cm_core = cm_node->cm_core; +@@ -3504,7 +3504,7 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) + ntohs(raddr->sin_port), ntohl(laddr->sin_addr.s_addr), + ntohs(laddr->sin_port)); + +- atomic_inc(&cm_connects); ++ atomic_inc_unchecked(&cm_connects); + nesqp->active_conn = 1; + + /* cache the cm_id in the qp */ +@@ -3649,7 +3649,7 @@ int nes_create_listen(struct iw_cm_id *cm_id, int backlog) + g_cm_core->api->stop_listener(g_cm_core, (void *)cm_node); + return err; + } +- atomic_inc(&cm_listens_created); ++ atomic_inc_unchecked(&cm_listens_created); + } + + cm_id->add_ref(cm_id); +@@ -3756,7 +3756,7 @@ static void cm_event_connected(struct nes_cm_event *event) + + if (nesqp->destroyed) + return; +- atomic_inc(&cm_connecteds); ++ atomic_inc_unchecked(&cm_connecteds); + nes_debug(NES_DBG_CM, "QP%u attempting to connect to 0x%08X:0x%04X on" + " local port 0x%04X. jiffies = %lu.\n", + nesqp->hwqp.qp_id, ntohl(raddr->sin_addr.s_addr), +@@ -3941,7 +3941,7 @@ static void cm_event_reset(struct nes_cm_event *event) + + cm_id->add_ref(cm_id); + ret = cm_id->event_handler(cm_id, &cm_event); +- atomic_inc(&cm_closes); ++ atomic_inc_unchecked(&cm_closes); + cm_event.event = IW_CM_EVENT_CLOSE; + cm_event.status = 0; + cm_event.provider_data = cm_id->provider_data; +@@ -3981,7 +3981,7 @@ static void cm_event_mpa_req(struct nes_cm_event *event) + return; + cm_id = cm_node->cm_id; + +- atomic_inc(&cm_connect_reqs); ++ atomic_inc_unchecked(&cm_connect_reqs); + nes_debug(NES_DBG_CM, "cm_node = %p - cm_id = %p, jiffies = %lu\n", + cm_node, cm_id, jiffies); + +@@ -4030,7 +4030,7 @@ static void cm_event_mpa_reject(struct nes_cm_event *event) + return; + cm_id = cm_node->cm_id; + +- atomic_inc(&cm_connect_reqs); ++ atomic_inc_unchecked(&cm_connect_reqs); + nes_debug(NES_DBG_CM, "cm_node = %p - cm_id = %p, jiffies = %lu\n", + cm_node, cm_id, jiffies); + +diff --git a/drivers/infiniband/hw/nes/nes_mgt.c b/drivers/infiniband/hw/nes/nes_mgt.c +index 4166452..fc952c3 100644 +--- a/drivers/infiniband/hw/nes/nes_mgt.c ++++ b/drivers/infiniband/hw/nes/nes_mgt.c +@@ -40,8 +40,8 @@ + #include "nes.h" + #include "nes_mgt.h" + +-atomic_t pau_qps_created; +-atomic_t pau_qps_destroyed; ++atomic_unchecked_t pau_qps_created; ++atomic_unchecked_t pau_qps_destroyed; + + static void nes_replenish_mgt_rq(struct nes_vnic_mgt *mgtvnic) + { +@@ -621,7 +621,7 @@ void nes_destroy_pau_qp(struct nes_device *nesdev, struct nes_qp *nesqp) + { + struct sk_buff *skb; + unsigned long flags; +- atomic_inc(&pau_qps_destroyed); ++ atomic_inc_unchecked(&pau_qps_destroyed); + + /* Free packets that have not yet been forwarded */ + /* Lock is acquired by skb_dequeue when removing the skb */ +@@ -810,7 +810,7 @@ static void nes_mgt_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq * + cq->cq_vbase[head].cqe_words[NES_NIC_CQE_HASH_RCVNXT]); + skb_queue_head_init(&nesqp->pau_list); + spin_lock_init(&nesqp->pau_lock); +- atomic_inc(&pau_qps_created); ++ atomic_inc_unchecked(&pau_qps_created); + nes_change_quad_hash(nesdev, mgtvnic->nesvnic, nesqp); + } + +diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c +index 49eb511..a774366 100644 +--- a/drivers/infiniband/hw/nes/nes_nic.c ++++ b/drivers/infiniband/hw/nes/nes_nic.c +@@ -1273,39 +1273,39 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev, + target_stat_values[++index] = mh_detected; + target_stat_values[++index] = mh_pauses_sent; + target_stat_values[++index] = nesvnic->endnode_ipv4_tcp_retransmits; +- target_stat_values[++index] = atomic_read(&cm_connects); +- target_stat_values[++index] = atomic_read(&cm_accepts); +- target_stat_values[++index] = atomic_read(&cm_disconnects); +- target_stat_values[++index] = atomic_read(&cm_connecteds); +- target_stat_values[++index] = atomic_read(&cm_connect_reqs); +- target_stat_values[++index] = atomic_read(&cm_rejects); +- target_stat_values[++index] = atomic_read(&mod_qp_timouts); +- target_stat_values[++index] = atomic_read(&qps_created); +- target_stat_values[++index] = atomic_read(&sw_qps_destroyed); +- target_stat_values[++index] = atomic_read(&qps_destroyed); +- target_stat_values[++index] = atomic_read(&cm_closes); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_connects); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_accepts); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_disconnects); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_connecteds); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_connect_reqs); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_rejects); ++ target_stat_values[++index] = atomic_read_unchecked(&mod_qp_timouts); ++ target_stat_values[++index] = atomic_read_unchecked(&qps_created); ++ target_stat_values[++index] = atomic_read_unchecked(&sw_qps_destroyed); ++ target_stat_values[++index] = atomic_read_unchecked(&qps_destroyed); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_closes); + target_stat_values[++index] = cm_packets_sent; + target_stat_values[++index] = cm_packets_bounced; + target_stat_values[++index] = cm_packets_created; + target_stat_values[++index] = cm_packets_received; + target_stat_values[++index] = cm_packets_dropped; + target_stat_values[++index] = cm_packets_retrans; +- target_stat_values[++index] = atomic_read(&cm_listens_created); +- target_stat_values[++index] = atomic_read(&cm_listens_destroyed); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_listens_created); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_listens_destroyed); + target_stat_values[++index] = cm_backlog_drops; +- target_stat_values[++index] = atomic_read(&cm_loopbacks); +- target_stat_values[++index] = atomic_read(&cm_nodes_created); +- target_stat_values[++index] = atomic_read(&cm_nodes_destroyed); +- target_stat_values[++index] = atomic_read(&cm_accel_dropped_pkts); +- target_stat_values[++index] = atomic_read(&cm_resets_recvd); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_loopbacks); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_nodes_created); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_nodes_destroyed); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_accel_dropped_pkts); ++ target_stat_values[++index] = atomic_read_unchecked(&cm_resets_recvd); + target_stat_values[++index] = nesadapter->free_4kpbl; + target_stat_values[++index] = nesadapter->free_256pbl; + target_stat_values[++index] = int_mod_timer_init; + target_stat_values[++index] = nesvnic->lro_mgr.stats.aggregated; + target_stat_values[++index] = nesvnic->lro_mgr.stats.flushed; + target_stat_values[++index] = nesvnic->lro_mgr.stats.no_desc; +- target_stat_values[++index] = atomic_read(&pau_qps_created); +- target_stat_values[++index] = atomic_read(&pau_qps_destroyed); ++ target_stat_values[++index] = atomic_read_unchecked(&pau_qps_created); ++ target_stat_values[++index] = atomic_read_unchecked(&pau_qps_destroyed); + } + + /** +diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c +index fef067c..6a25ccd 100644 +--- a/drivers/infiniband/hw/nes/nes_verbs.c ++++ b/drivers/infiniband/hw/nes/nes_verbs.c +@@ -46,9 +46,9 @@ + + #include <rdma/ib_umem.h> + +-atomic_t mod_qp_timouts; +-atomic_t qps_created; +-atomic_t sw_qps_destroyed; ++atomic_unchecked_t mod_qp_timouts; ++atomic_unchecked_t qps_created; ++atomic_unchecked_t sw_qps_destroyed; + + static void nes_unregister_ofa_device(struct nes_ib_device *nesibdev); + +@@ -1134,7 +1134,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, + if (init_attr->create_flags) + return ERR_PTR(-EINVAL); + +- atomic_inc(&qps_created); ++ atomic_inc_unchecked(&qps_created); + switch (init_attr->qp_type) { + case IB_QPT_RC: + if (nes_drv_opt & NES_DRV_OPT_NO_INLINE_DATA) { +@@ -1468,7 +1468,7 @@ static int nes_destroy_qp(struct ib_qp *ibqp) + struct iw_cm_event cm_event; + int ret = 0; + +- atomic_inc(&sw_qps_destroyed); ++ atomic_inc_unchecked(&sw_qps_destroyed); + nesqp->destroyed = 1; + + /* Blow away the connection if it exists. */ +diff --git a/drivers/infiniband/hw/qib/qib.h b/drivers/infiniband/hw/qib/qib.h +index b218254..1d1aa3c 100644 +--- a/drivers/infiniband/hw/qib/qib.h ++++ b/drivers/infiniband/hw/qib/qib.h +@@ -52,6 +52,7 @@ + #include <linux/kref.h> + #include <linux/sched.h> + #include <linux/kthread.h> ++#include <linux/slab.h> + + #include "qib_common.h" + #include "qib_verbs.h" +diff --git a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c +index cdc7df4..a2fdfdb 100644 +--- a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c ++++ b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c +@@ -156,7 +156,7 @@ static size_t ipoib_get_size(const struct net_device *dev) + nla_total_size(2); /* IFLA_IPOIB_UMCAST */ + } + +-static struct rtnl_link_ops ipoib_link_ops __read_mostly = { ++static struct rtnl_link_ops ipoib_link_ops = { + .kind = "ipoib", + .maxtype = IFLA_IPOIB_MAX, + .policy = ipoib_policy, +diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c +index e29c04e..adbf68c 100644 +--- a/drivers/input/gameport/gameport.c ++++ b/drivers/input/gameport/gameport.c +@@ -527,14 +527,14 @@ EXPORT_SYMBOL(gameport_set_phys); + */ + static void gameport_init_port(struct gameport *gameport) + { +- static atomic_t gameport_no = ATOMIC_INIT(0); ++ static atomic_unchecked_t gameport_no = ATOMIC_INIT(0); + + __module_get(THIS_MODULE); + + mutex_init(&gameport->drv_mutex); + device_initialize(&gameport->dev); + dev_set_name(&gameport->dev, "gameport%lu", +- (unsigned long)atomic_inc_return(&gameport_no) - 1); ++ (unsigned long)atomic_inc_return_unchecked(&gameport_no) - 1); + gameport->dev.bus = &gameport_bus; + gameport->dev.release = gameport_release_port; + if (gameport->parent) +diff --git a/drivers/input/input.c b/drivers/input/input.c +index 0f175f5..4c481c0 100644 +--- a/drivers/input/input.c ++++ b/drivers/input/input.c +@@ -1775,7 +1775,7 @@ EXPORT_SYMBOL_GPL(input_class); + */ + struct input_dev *input_allocate_device(void) + { +- static atomic_t input_no = ATOMIC_INIT(0); ++ static atomic_unchecked_t input_no = ATOMIC_INIT(0); + struct input_dev *dev; + + dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL); +@@ -1790,7 +1790,7 @@ struct input_dev *input_allocate_device(void) + INIT_LIST_HEAD(&dev->node); + + dev_set_name(&dev->dev, "input%lu", +- (unsigned long) atomic_inc_return(&input_no) - 1); ++ (unsigned long) atomic_inc_return_unchecked(&input_no) - 1); + + __module_get(THIS_MODULE); + } +diff --git a/drivers/input/joystick/sidewinder.c b/drivers/input/joystick/sidewinder.c +index 4a95b22..874c182 100644 +--- a/drivers/input/joystick/sidewinder.c ++++ b/drivers/input/joystick/sidewinder.c +@@ -30,6 +30,7 @@ + #include <linux/kernel.h> + #include <linux/module.h> + #include <linux/slab.h> ++#include <linux/sched.h> + #include <linux/input.h> + #include <linux/gameport.h> + #include <linux/jiffies.h> +diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c +index fc55f0d..11e2aa6 100644 +--- a/drivers/input/joystick/xpad.c ++++ b/drivers/input/joystick/xpad.c +@@ -886,7 +886,7 @@ static void xpad_led_set(struct led_classdev *led_cdev, + + static int xpad_led_probe(struct usb_xpad *xpad) + { +- static atomic_t led_seq = ATOMIC_INIT(0); ++ static atomic_unchecked_t led_seq = ATOMIC_INIT(0); + long led_no; + struct xpad_led *led; + struct led_classdev *led_cdev; +@@ -899,7 +899,7 @@ static int xpad_led_probe(struct usb_xpad *xpad) + if (!led) + return -ENOMEM; + +- led_no = (long)atomic_inc_return(&led_seq) - 1; ++ led_no = (long)atomic_inc_return_unchecked(&led_seq) - 1; + + snprintf(led->name, sizeof(led->name), "xpad%ld", led_no); + led->xpad = xpad; +diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c +index afed8e2..3aa8a18 100644 +--- a/drivers/input/misc/ims-pcu.c ++++ b/drivers/input/misc/ims-pcu.c +@@ -1851,7 +1851,7 @@ static int ims_pcu_identify_type(struct ims_pcu *pcu, u8 *device_id) + + static int ims_pcu_init_application_mode(struct ims_pcu *pcu) + { +- static atomic_t device_no = ATOMIC_INIT(0); ++ static atomic_unchecked_t device_no = ATOMIC_INIT(0); + + const struct ims_pcu_device_info *info; + int error; +@@ -1882,7 +1882,7 @@ static int ims_pcu_init_application_mode(struct ims_pcu *pcu) + } + + /* Device appears to be operable, complete initialization */ +- pcu->device_no = atomic_inc_return(&device_no) - 1; ++ pcu->device_no = atomic_inc_return_unchecked(&device_no) - 1; + + /* + * PCU-B devices, both GEN_1 and GEN_2 do not have OFN sensor +diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h +index f4cf664..3204fda 100644 +--- a/drivers/input/mouse/psmouse.h ++++ b/drivers/input/mouse/psmouse.h +@@ -117,7 +117,7 @@ struct psmouse_attribute { + ssize_t (*set)(struct psmouse *psmouse, void *data, + const char *buf, size_t count); + bool protect; +-}; ++} __do_const; + #define to_psmouse_attr(a) container_of((a), struct psmouse_attribute, dattr) + + ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *attr, +diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c +index b604564..3f14ae4 100644 +--- a/drivers/input/mousedev.c ++++ b/drivers/input/mousedev.c +@@ -744,7 +744,7 @@ static ssize_t mousedev_read(struct file *file, char __user *buffer, + + spin_unlock_irq(&client->packet_lock); + +- if (copy_to_user(buffer, data, count)) ++ if (count > sizeof(data) || copy_to_user(buffer, data, count)) + return -EFAULT; + + return count; +diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c +index d399b8b..4913ede 100644 +--- a/drivers/input/serio/serio.c ++++ b/drivers/input/serio/serio.c +@@ -514,7 +514,7 @@ static void serio_release_port(struct device *dev) + */ + static void serio_init_port(struct serio *serio) + { +- static atomic_t serio_no = ATOMIC_INIT(0); ++ static atomic_unchecked_t serio_no = ATOMIC_INIT(0); + + __module_get(THIS_MODULE); + +@@ -525,7 +525,7 @@ static void serio_init_port(struct serio *serio) + mutex_init(&serio->drv_mutex); + device_initialize(&serio->dev); + dev_set_name(&serio->dev, "serio%lu", +- (unsigned long)atomic_inc_return(&serio_no) - 1); ++ (unsigned long)atomic_inc_return_unchecked(&serio_no) - 1); + serio->dev.bus = &serio_bus; + serio->dev.release = serio_release_port; + serio->dev.groups = serio_device_attr_groups; +diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c +index c9a02fe..0debc75 100644 +--- a/drivers/input/serio/serio_raw.c ++++ b/drivers/input/serio/serio_raw.c +@@ -292,7 +292,7 @@ static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data, + + static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) + { +- static atomic_t serio_raw_no = ATOMIC_INIT(0); ++ static atomic_unchecked_t serio_raw_no = ATOMIC_INIT(0); + struct serio_raw *serio_raw; + int err; + +@@ -303,7 +303,7 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) + } + + snprintf(serio_raw->name, sizeof(serio_raw->name), +- "serio_raw%ld", (long)atomic_inc_return(&serio_raw_no) - 1); ++ "serio_raw%ld", (long)atomic_inc_return_unchecked(&serio_raw_no) - 1); + kref_init(&serio_raw->kref); + INIT_LIST_HEAD(&serio_raw->client_list); + init_waitqueue_head(&serio_raw->wait); +diff --git a/drivers/input/touchscreen/htcpen.c b/drivers/input/touchscreen/htcpen.c +index 92e2243..8fd9092 100644 +--- a/drivers/input/touchscreen/htcpen.c ++++ b/drivers/input/touchscreen/htcpen.c +@@ -219,7 +219,7 @@ static struct isa_driver htcpen_isa_driver = { + } + }; + +-static struct dmi_system_id htcshift_dmi_table[] __initdata = { ++static const struct dmi_system_id htcshift_dmi_table[] __initconst = { + { + .ident = "Shift", + .matches = { +diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c +index 505a9ad..356734c 100644 +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -823,11 +823,21 @@ static void copy_cmd_to_buffer(struct amd_iommu *iommu, + + static void build_completion_wait(struct iommu_cmd *cmd, u64 address) + { ++ phys_addr_t physaddr; + WARN_ON(address & 0x7ULL); + + memset(cmd, 0, sizeof(*cmd)); +- cmd->data[0] = lower_32_bits(__pa(address)) | CMD_COMPL_WAIT_STORE_MASK; +- cmd->data[1] = upper_32_bits(__pa(address)); ++ ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++ if (object_starts_on_stack((void *)address)) { ++ void *adjbuf = (void *)address - current->stack + current->lowmem_stack; ++ physaddr = __pa((u64)adjbuf); ++ } else ++#endif ++ physaddr = __pa(address); ++ ++ cmd->data[0] = lower_32_bits(physaddr) | CMD_COMPL_WAIT_STORE_MASK; ++ cmd->data[1] = upper_32_bits(physaddr); + cmd->data[2] = 1; + CMD_SET_TYPE(cmd, CMD_COMPL_WAIT); + } +diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c +index 60558f7..5a02369 100644 +--- a/drivers/iommu/arm-smmu.c ++++ b/drivers/iommu/arm-smmu.c +@@ -934,7 +934,7 @@ static int arm_smmu_init_domain_context(struct iommu_domain *domain, + cfg->irptndx = cfg->cbndx; + } + +- ACCESS_ONCE(smmu_domain->smmu) = smmu; ++ ACCESS_ONCE_RW(smmu_domain->smmu) = smmu; + arm_smmu_init_context_bank(smmu_domain); + spin_unlock_irqrestore(&smmu_domain->lock, flags); + +diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c +index ed8b048..7fbcc01 100644 +--- a/drivers/iommu/iommu.c ++++ b/drivers/iommu/iommu.c +@@ -802,7 +802,7 @@ static int iommu_bus_notifier(struct notifier_block *nb, + static int iommu_bus_init(struct bus_type *bus, const struct iommu_ops *ops) + { + int err; +- struct notifier_block *nb; ++ notifier_block_no_const *nb; + struct iommu_callback_data cb = { + .ops = ops, + }; +diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c +index 74a1767..5a359e8 100644 +--- a/drivers/iommu/irq_remapping.c ++++ b/drivers/iommu/irq_remapping.c +@@ -361,7 +361,7 @@ int setup_hpet_msi_remapped(unsigned int irq, unsigned int id) + void panic_if_irq_remap(const char *msg) + { + if (irq_remapping_enabled) +- panic(msg); ++ panic("%s", msg); + } + + static void ir_ack_apic_edge(struct irq_data *data) +@@ -382,10 +382,12 @@ static void ir_print_prefix(struct irq_data *data, struct seq_file *p) + + void irq_remap_modify_chip_defaults(struct irq_chip *chip) + { +- chip->irq_print_chip = ir_print_prefix; +- chip->irq_ack = ir_ack_apic_edge; +- chip->irq_eoi = ir_ack_apic_level; +- chip->irq_set_affinity = x86_io_apic_ops.set_affinity; ++ pax_open_kernel(); ++ *(void **)&chip->irq_print_chip = ir_print_prefix; ++ *(void **)&chip->irq_ack = ir_ack_apic_edge; ++ *(void **)&chip->irq_eoi = ir_ack_apic_level; ++ *(void **)&chip->irq_set_affinity = x86_io_apic_ops.set_affinity; ++ pax_close_kernel(); + } + + bool setup_remapped_irq(int irq, struct irq_cfg *cfg, struct irq_chip *chip) +diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c +index 38493ff..001538b 100644 +--- a/drivers/irqchip/irq-gic.c ++++ b/drivers/irqchip/irq-gic.c +@@ -84,7 +84,7 @@ static u8 gic_cpu_map[NR_GIC_CPU_IF] __read_mostly; + * Supported arch specific GIC irq extension. + * Default make them NULL. + */ +-struct irq_chip gic_arch_extn = { ++irq_chip_no_const gic_arch_extn = { + .irq_eoi = NULL, + .irq_mask = NULL, + .irq_unmask = NULL, +@@ -311,7 +311,7 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) + chained_irq_exit(chip, desc); + } + +-static struct irq_chip gic_chip = { ++static irq_chip_no_const gic_chip __read_only = { + .name = "GIC", + .irq_mask = gic_mask_irq, + .irq_unmask = gic_unmask_irq, +diff --git a/drivers/irqchip/irq-renesas-intc-irqpin.c b/drivers/irqchip/irq-renesas-intc-irqpin.c +index 542e850..1bb094c 100644 +--- a/drivers/irqchip/irq-renesas-intc-irqpin.c ++++ b/drivers/irqchip/irq-renesas-intc-irqpin.c +@@ -353,7 +353,7 @@ static int intc_irqpin_probe(struct platform_device *pdev) + struct intc_irqpin_iomem *i; + struct resource *io[INTC_IRQPIN_REG_NR]; + struct resource *irq; +- struct irq_chip *irq_chip; ++ irq_chip_no_const *irq_chip; + void (*enable_fn)(struct irq_data *d); + void (*disable_fn)(struct irq_data *d); + const char *name = dev_name(dev); +diff --git a/drivers/irqchip/irq-renesas-irqc.c b/drivers/irqchip/irq-renesas-irqc.c +index 8777065..a4a9967 100644 +--- a/drivers/irqchip/irq-renesas-irqc.c ++++ b/drivers/irqchip/irq-renesas-irqc.c +@@ -151,7 +151,7 @@ static int irqc_probe(struct platform_device *pdev) + struct irqc_priv *p; + struct resource *io; + struct resource *irq; +- struct irq_chip *irq_chip; ++ irq_chip_no_const *irq_chip; + const char *name = dev_name(&pdev->dev); + int ret; + int k; +diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c +index 6a2df32..dc962f1 100644 +--- a/drivers/isdn/capi/capi.c ++++ b/drivers/isdn/capi/capi.c +@@ -81,8 +81,8 @@ struct capiminor { + + struct capi20_appl *ap; + u32 ncci; +- atomic_t datahandle; +- atomic_t msgid; ++ atomic_unchecked_t datahandle; ++ atomic_unchecked_t msgid; + + struct tty_port port; + int ttyinstop; +@@ -391,7 +391,7 @@ gen_data_b3_resp_for(struct capiminor *mp, struct sk_buff *skb) + capimsg_setu16(s, 2, mp->ap->applid); + capimsg_setu8 (s, 4, CAPI_DATA_B3); + capimsg_setu8 (s, 5, CAPI_RESP); +- capimsg_setu16(s, 6, atomic_inc_return(&mp->msgid)); ++ capimsg_setu16(s, 6, atomic_inc_return_unchecked(&mp->msgid)); + capimsg_setu32(s, 8, mp->ncci); + capimsg_setu16(s, 12, datahandle); + } +@@ -512,14 +512,14 @@ static void handle_minor_send(struct capiminor *mp) + mp->outbytes -= len; + spin_unlock_bh(&mp->outlock); + +- datahandle = atomic_inc_return(&mp->datahandle); ++ datahandle = atomic_inc_return_unchecked(&mp->datahandle); + skb_push(skb, CAPI_DATA_B3_REQ_LEN); + memset(skb->data, 0, CAPI_DATA_B3_REQ_LEN); + capimsg_setu16(skb->data, 0, CAPI_DATA_B3_REQ_LEN); + capimsg_setu16(skb->data, 2, mp->ap->applid); + capimsg_setu8 (skb->data, 4, CAPI_DATA_B3); + capimsg_setu8 (skb->data, 5, CAPI_REQ); +- capimsg_setu16(skb->data, 6, atomic_inc_return(&mp->msgid)); ++ capimsg_setu16(skb->data, 6, atomic_inc_return_unchecked(&mp->msgid)); + capimsg_setu32(skb->data, 8, mp->ncci); /* NCCI */ + capimsg_setu32(skb->data, 12, (u32)(long)skb->data);/* Data32 */ + capimsg_setu16(skb->data, 16, len); /* Data length */ +diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c +index aecec6d..11e13c5 100644 +--- a/drivers/isdn/gigaset/bas-gigaset.c ++++ b/drivers/isdn/gigaset/bas-gigaset.c +@@ -2565,22 +2565,22 @@ static int gigaset_post_reset(struct usb_interface *intf) + + + static const struct gigaset_ops gigops = { +- gigaset_write_cmd, +- gigaset_write_room, +- gigaset_chars_in_buffer, +- gigaset_brkchars, +- gigaset_init_bchannel, +- gigaset_close_bchannel, +- gigaset_initbcshw, +- gigaset_freebcshw, +- gigaset_reinitbcshw, +- gigaset_initcshw, +- gigaset_freecshw, +- gigaset_set_modem_ctrl, +- gigaset_baud_rate, +- gigaset_set_line_ctrl, +- gigaset_isoc_send_skb, +- gigaset_isoc_input, ++ .write_cmd = gigaset_write_cmd, ++ .write_room = gigaset_write_room, ++ .chars_in_buffer = gigaset_chars_in_buffer, ++ .brkchars = gigaset_brkchars, ++ .init_bchannel = gigaset_init_bchannel, ++ .close_bchannel = gigaset_close_bchannel, ++ .initbcshw = gigaset_initbcshw, ++ .freebcshw = gigaset_freebcshw, ++ .reinitbcshw = gigaset_reinitbcshw, ++ .initcshw = gigaset_initcshw, ++ .freecshw = gigaset_freecshw, ++ .set_modem_ctrl = gigaset_set_modem_ctrl, ++ .baud_rate = gigaset_baud_rate, ++ .set_line_ctrl = gigaset_set_line_ctrl, ++ .send_skb = gigaset_isoc_send_skb, ++ .handle_input = gigaset_isoc_input, + }; + + /* bas_gigaset_init +diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c +index 600c79b..3752bab 100644 +--- a/drivers/isdn/gigaset/interface.c ++++ b/drivers/isdn/gigaset/interface.c +@@ -130,9 +130,9 @@ static int if_open(struct tty_struct *tty, struct file *filp) + } + tty->driver_data = cs; + +- ++cs->port.count; ++ atomic_inc(&cs->port.count); + +- if (cs->port.count == 1) { ++ if (atomic_read(&cs->port.count) == 1) { + tty_port_tty_set(&cs->port, tty); + cs->port.low_latency = 1; + } +@@ -156,9 +156,9 @@ static void if_close(struct tty_struct *tty, struct file *filp) + + if (!cs->connected) + gig_dbg(DEBUG_IF, "not connected"); /* nothing to do */ +- else if (!cs->port.count) ++ else if (!atomic_read(&cs->port.count)) + dev_warn(cs->dev, "%s: device not opened\n", __func__); +- else if (!--cs->port.count) ++ else if (!atomic_dec_return(&cs->port.count)) + tty_port_tty_set(&cs->port, NULL); + + mutex_unlock(&cs->mutex); +diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c +index 8c91fd5..14f13ce 100644 +--- a/drivers/isdn/gigaset/ser-gigaset.c ++++ b/drivers/isdn/gigaset/ser-gigaset.c +@@ -453,22 +453,22 @@ static int gigaset_set_line_ctrl(struct cardstate *cs, unsigned cflag) + } + + static const struct gigaset_ops ops = { +- gigaset_write_cmd, +- gigaset_write_room, +- gigaset_chars_in_buffer, +- gigaset_brkchars, +- gigaset_init_bchannel, +- gigaset_close_bchannel, +- gigaset_initbcshw, +- gigaset_freebcshw, +- gigaset_reinitbcshw, +- gigaset_initcshw, +- gigaset_freecshw, +- gigaset_set_modem_ctrl, +- gigaset_baud_rate, +- gigaset_set_line_ctrl, +- gigaset_m10x_send_skb, /* asyncdata.c */ +- gigaset_m10x_input, /* asyncdata.c */ ++ .write_cmd = gigaset_write_cmd, ++ .write_room = gigaset_write_room, ++ .chars_in_buffer = gigaset_chars_in_buffer, ++ .brkchars = gigaset_brkchars, ++ .init_bchannel = gigaset_init_bchannel, ++ .close_bchannel = gigaset_close_bchannel, ++ .initbcshw = gigaset_initbcshw, ++ .freebcshw = gigaset_freebcshw, ++ .reinitbcshw = gigaset_reinitbcshw, ++ .initcshw = gigaset_initcshw, ++ .freecshw = gigaset_freecshw, ++ .set_modem_ctrl = gigaset_set_modem_ctrl, ++ .baud_rate = gigaset_baud_rate, ++ .set_line_ctrl = gigaset_set_line_ctrl, ++ .send_skb = gigaset_m10x_send_skb, /* asyncdata.c */ ++ .handle_input = gigaset_m10x_input, /* asyncdata.c */ + }; + + +diff --git a/drivers/isdn/gigaset/usb-gigaset.c b/drivers/isdn/gigaset/usb-gigaset.c +index a8e652d..edadaa4 100644 +--- a/drivers/isdn/gigaset/usb-gigaset.c ++++ b/drivers/isdn/gigaset/usb-gigaset.c +@@ -548,7 +548,7 @@ static int gigaset_brkchars(struct cardstate *cs, const unsigned char buf[6]) + gigaset_dbg_buffer(DEBUG_USBREQ, "brkchars", 6, buf); + memcpy(cs->hw.usb->bchars, buf, 6); + return usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x19, 0x41, +- 0, 0, &buf, 6, 2000); ++ 0, 0, buf, 6, 2000); + } + + static void gigaset_freebcshw(struct bc_state *bcs) +@@ -867,22 +867,22 @@ static int gigaset_pre_reset(struct usb_interface *intf) + } + + static const struct gigaset_ops ops = { +- gigaset_write_cmd, +- gigaset_write_room, +- gigaset_chars_in_buffer, +- gigaset_brkchars, +- gigaset_init_bchannel, +- gigaset_close_bchannel, +- gigaset_initbcshw, +- gigaset_freebcshw, +- gigaset_reinitbcshw, +- gigaset_initcshw, +- gigaset_freecshw, +- gigaset_set_modem_ctrl, +- gigaset_baud_rate, +- gigaset_set_line_ctrl, +- gigaset_m10x_send_skb, +- gigaset_m10x_input, ++ .write_cmd = gigaset_write_cmd, ++ .write_room = gigaset_write_room, ++ .chars_in_buffer = gigaset_chars_in_buffer, ++ .brkchars = gigaset_brkchars, ++ .init_bchannel = gigaset_init_bchannel, ++ .close_bchannel = gigaset_close_bchannel, ++ .initbcshw = gigaset_initbcshw, ++ .freebcshw = gigaset_freebcshw, ++ .reinitbcshw = gigaset_reinitbcshw, ++ .initcshw = gigaset_initcshw, ++ .freecshw = gigaset_freecshw, ++ .set_modem_ctrl = gigaset_set_modem_ctrl, ++ .baud_rate = gigaset_baud_rate, ++ .set_line_ctrl = gigaset_set_line_ctrl, ++ .send_skb = gigaset_m10x_send_skb, ++ .handle_input = gigaset_m10x_input, + }; + + /* +diff --git a/drivers/isdn/hardware/avm/b1.c b/drivers/isdn/hardware/avm/b1.c +index 4d9b195..455075c 100644 +--- a/drivers/isdn/hardware/avm/b1.c ++++ b/drivers/isdn/hardware/avm/b1.c +@@ -176,7 +176,7 @@ int b1_load_t4file(avmcard *card, capiloaddatapart *t4file) + } + if (left) { + if (t4file->user) { +- if (copy_from_user(buf, dp, left)) ++ if (left > sizeof buf || copy_from_user(buf, dp, left)) + return -EFAULT; + } else { + memcpy(buf, dp, left); +@@ -224,7 +224,7 @@ int b1_load_config(avmcard *card, capiloaddatapart *config) + } + if (left) { + if (config->user) { +- if (copy_from_user(buf, dp, left)) ++ if (left > sizeof buf || copy_from_user(buf, dp, left)) + return -EFAULT; + } else { + memcpy(buf, dp, left); +diff --git a/drivers/isdn/hardware/eicon/message.c b/drivers/isdn/hardware/eicon/message.c +index a82e542..f766a79 100644 +--- a/drivers/isdn/hardware/eicon/message.c ++++ b/drivers/isdn/hardware/eicon/message.c +@@ -1474,7 +1474,7 @@ static byte connect_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a, + add_ai(plci, &parms[5]); + sig_req(plci, REJECT, 0); + } +- else if (Reject == 1 || Reject > 9) ++ else if (Reject == 1 || Reject >= 9) + { + add_ai(plci, &parms[5]); + sig_req(plci, HANGUP, 0); +diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c +index 9b856e1..fa03c92 100644 +--- a/drivers/isdn/i4l/isdn_common.c ++++ b/drivers/isdn/i4l/isdn_common.c +@@ -1654,6 +1654,8 @@ isdn_ioctl(struct file *file, uint cmd, ulong arg) + } else + return -EINVAL; + case IIOCDBGVAR: ++ if (!capable(CAP_SYS_RAWIO)) ++ return -EPERM; + if (arg) { + if (copy_to_user(argp, &dev, sizeof(ulong))) + return -EFAULT; +diff --git a/drivers/isdn/i4l/isdn_concap.c b/drivers/isdn/i4l/isdn_concap.c +index 91d5730..336523e 100644 +--- a/drivers/isdn/i4l/isdn_concap.c ++++ b/drivers/isdn/i4l/isdn_concap.c +@@ -80,9 +80,9 @@ static int isdn_concap_dl_disconn_req(struct concap_proto *concap) + } + + struct concap_device_ops isdn_concap_reliable_dl_dops = { +- &isdn_concap_dl_data_req, +- &isdn_concap_dl_connect_req, +- &isdn_concap_dl_disconn_req ++ .data_req = &isdn_concap_dl_data_req, ++ .connect_req = &isdn_concap_dl_connect_req, ++ .disconn_req = &isdn_concap_dl_disconn_req + }; + + /* The following should better go into a dedicated source file such that +diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c +index bc91261..2ef7e36 100644 +--- a/drivers/isdn/i4l/isdn_tty.c ++++ b/drivers/isdn/i4l/isdn_tty.c +@@ -1503,9 +1503,9 @@ isdn_tty_open(struct tty_struct *tty, struct file *filp) + + #ifdef ISDN_DEBUG_MODEM_OPEN + printk(KERN_DEBUG "isdn_tty_open %s, count = %d\n", tty->name, +- port->count); ++ atomic_read(&port->count)); + #endif +- port->count++; ++ atomic_inc(&port->count); + port->tty = tty; + /* + * Start up serial port +@@ -1549,7 +1549,7 @@ isdn_tty_close(struct tty_struct *tty, struct file *filp) + #endif + return; + } +- if ((tty->count == 1) && (port->count != 1)) { ++ if ((tty->count == 1) && (atomic_read(&port->count) != 1)) { + /* + * Uh, oh. tty->count is 1, which means that the tty + * structure will be freed. Info->count should always +@@ -1558,15 +1558,15 @@ isdn_tty_close(struct tty_struct *tty, struct file *filp) + * serial port won't be shutdown. + */ + printk(KERN_ERR "isdn_tty_close: bad port count; tty->count is 1, " +- "info->count is %d\n", port->count); +- port->count = 1; ++ "info->count is %d\n", atomic_read(&port->count)); ++ atomic_set(&port->count, 1); + } +- if (--port->count < 0) { ++ if (atomic_dec_return(&port->count) < 0) { + printk(KERN_ERR "isdn_tty_close: bad port count for ttyi%d: %d\n", +- info->line, port->count); +- port->count = 0; ++ info->line, atomic_read(&port->count)); ++ atomic_set(&port->count, 0); + } +- if (port->count) { ++ if (atomic_read(&port->count)) { + #ifdef ISDN_DEBUG_MODEM_OPEN + printk(KERN_DEBUG "isdn_tty_close after info->count != 0\n"); + #endif +@@ -1620,7 +1620,7 @@ isdn_tty_hangup(struct tty_struct *tty) + if (isdn_tty_paranoia_check(info, tty->name, "isdn_tty_hangup")) + return; + isdn_tty_shutdown(info); +- port->count = 0; ++ atomic_set(&port->count, 0); + port->flags &= ~ASYNC_NORMAL_ACTIVE; + port->tty = NULL; + wake_up_interruptible(&port->open_wait); +@@ -1965,7 +1965,7 @@ isdn_tty_find_icall(int di, int ch, setup_parm *setup) + for (i = 0; i < ISDN_MAX_CHANNELS; i++) { + modem_info *info = &dev->mdm.info[i]; + +- if (info->port.count == 0) ++ if (atomic_read(&info->port.count) == 0) + continue; + if ((info->emu.mdmreg[REG_SI1] & si2bit[si1]) && /* SI1 is matching */ + (info->emu.mdmreg[REG_SI2] == si2)) { /* SI2 is matching */ +diff --git a/drivers/isdn/i4l/isdn_x25iface.c b/drivers/isdn/i4l/isdn_x25iface.c +index e2d4e58..40cd045 100644 +--- a/drivers/isdn/i4l/isdn_x25iface.c ++++ b/drivers/isdn/i4l/isdn_x25iface.c +@@ -53,14 +53,14 @@ static int isdn_x25iface_disconn_ind(struct concap_proto *); + + + static struct concap_proto_ops ix25_pops = { +- &isdn_x25iface_proto_new, +- &isdn_x25iface_proto_del, +- &isdn_x25iface_proto_restart, +- &isdn_x25iface_proto_close, +- &isdn_x25iface_xmit, +- &isdn_x25iface_receive, +- &isdn_x25iface_connect_ind, +- &isdn_x25iface_disconn_ind ++ .proto_new = &isdn_x25iface_proto_new, ++ .proto_del = &isdn_x25iface_proto_del, ++ .restart = &isdn_x25iface_proto_restart, ++ .close = &isdn_x25iface_proto_close, ++ .encap_and_xmit = &isdn_x25iface_xmit, ++ .data_ind = &isdn_x25iface_receive, ++ .connect_ind = &isdn_x25iface_connect_ind, ++ .disconn_ind = &isdn_x25iface_disconn_ind + }; + + /* error message helper function */ +diff --git a/drivers/isdn/icn/icn.c b/drivers/isdn/icn/icn.c +index 6a7447c..b4987ea 100644 +--- a/drivers/isdn/icn/icn.c ++++ b/drivers/isdn/icn/icn.c +@@ -1045,7 +1045,7 @@ icn_writecmd(const u_char *buf, int len, int user, icn_card *card) + if (count > len) + count = len; + if (user) { +- if (copy_from_user(msg, buf, count)) ++ if (count > sizeof msg || copy_from_user(msg, buf, count)) + return -EFAULT; + } else + memcpy(msg, buf, count); +@@ -1609,7 +1609,7 @@ icn_setup(char *line) + if (ints[0] > 1) + membase = (unsigned long)ints[2]; + if (str && *str) { +- strcpy(sid, str); ++ strlcpy(sid, str, sizeof(sid)); + icn_id = sid; + if ((p = strchr(sid, ','))) { + *p++ = 0; +diff --git a/drivers/isdn/mISDN/dsp_cmx.c b/drivers/isdn/mISDN/dsp_cmx.c +index 87f7dff..7300125 100644 +--- a/drivers/isdn/mISDN/dsp_cmx.c ++++ b/drivers/isdn/mISDN/dsp_cmx.c +@@ -1625,7 +1625,7 @@ unsigned long dsp_spl_jiffies; /* calculate the next time to fire */ + static u16 dsp_count; /* last sample count */ + static int dsp_count_valid; /* if we have last sample count */ + +-void ++void __intentional_overflow(-1) + dsp_cmx_send(void *arg) + { + struct dsp_conf *conf; +diff --git a/drivers/leds/leds-clevo-mail.c b/drivers/leds/leds-clevo-mail.c +index f58a354..fbae176 100644 +--- a/drivers/leds/leds-clevo-mail.c ++++ b/drivers/leds/leds-clevo-mail.c +@@ -40,7 +40,7 @@ static int __init clevo_mail_led_dmi_callback(const struct dmi_system_id *id) + * detected as working, but in reality it is not) as low as + * possible. + */ +-static struct dmi_system_id clevo_mail_led_dmi_table[] __initdata = { ++static struct dmi_system_id clevo_mail_led_dmi_table[] __initconst = { + { + .callback = clevo_mail_led_dmi_callback, + .ident = "Clevo D410J", +diff --git a/drivers/leds/leds-ss4200.c b/drivers/leds/leds-ss4200.c +index 046cb70..6b20d39 100644 +--- a/drivers/leds/leds-ss4200.c ++++ b/drivers/leds/leds-ss4200.c +@@ -91,7 +91,7 @@ MODULE_PARM_DESC(nodetect, "Skip DMI-based hardware detection"); + * detected as working, but in reality it is not) as low as + * possible. + */ +-static struct dmi_system_id nas_led_whitelist[] __initdata = { ++static struct dmi_system_id nas_led_whitelist[] __initconst = { + { + .callback = ss4200_led_dmi_callback, + .ident = "Intel SS4200-E", +diff --git a/drivers/lguest/core.c b/drivers/lguest/core.c +index 6590558..a74c5dd 100644 +--- a/drivers/lguest/core.c ++++ b/drivers/lguest/core.c +@@ -96,9 +96,17 @@ static __init int map_switcher(void) + * The end address needs +1 because __get_vm_area allocates an + * extra guard page, so we need space for that. + */ ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ switcher_vma = __get_vm_area(TOTAL_SWITCHER_PAGES * PAGE_SIZE, ++ VM_ALLOC | VM_KERNEXEC, switcher_addr, switcher_addr ++ + (TOTAL_SWITCHER_PAGES+1) * PAGE_SIZE); ++#else + switcher_vma = __get_vm_area(TOTAL_SWITCHER_PAGES * PAGE_SIZE, + VM_ALLOC, switcher_addr, switcher_addr + + (TOTAL_SWITCHER_PAGES+1) * PAGE_SIZE); ++#endif ++ + if (!switcher_vma) { + err = -ENOMEM; + printk("lguest: could not map switcher pages high\n"); +@@ -121,7 +129,7 @@ static __init int map_switcher(void) + * Now the Switcher is mapped at the right address, we can't fail! + * Copy in the compiled-in Switcher code (from x86/switcher_32.S). + */ +- memcpy(switcher_vma->addr, start_switcher_text, ++ memcpy(switcher_vma->addr, ktla_ktva(start_switcher_text), + end_switcher_text - start_switcher_text); + + printk(KERN_INFO "lguest: mapped switcher at %p\n", +diff --git a/drivers/lguest/page_tables.c b/drivers/lguest/page_tables.c +index e8b55c3..3514c37 100644 +--- a/drivers/lguest/page_tables.c ++++ b/drivers/lguest/page_tables.c +@@ -559,7 +559,7 @@ void pin_page(struct lg_cpu *cpu, unsigned long vaddr) + /*:*/ + + #ifdef CONFIG_X86_PAE +-static void release_pmd(pmd_t *spmd) ++static void __intentional_overflow(-1) release_pmd(pmd_t *spmd) + { + /* If the entry's not present, there's nothing to release. */ + if (pmd_flags(*spmd) & _PAGE_PRESENT) { +diff --git a/drivers/lguest/x86/core.c b/drivers/lguest/x86/core.c +index 922a1ac..9dd0c2a 100644 +--- a/drivers/lguest/x86/core.c ++++ b/drivers/lguest/x86/core.c +@@ -59,7 +59,7 @@ static struct { + /* Offset from where switcher.S was compiled to where we've copied it */ + static unsigned long switcher_offset(void) + { +- return switcher_addr - (unsigned long)start_switcher_text; ++ return switcher_addr - (unsigned long)ktla_ktva(start_switcher_text); + } + + /* This cpu's struct lguest_pages (after the Switcher text page) */ +@@ -99,7 +99,13 @@ static void copy_in_guest_info(struct lg_cpu *cpu, struct lguest_pages *pages) + * These copies are pretty cheap, so we do them unconditionally: */ + /* Save the current Host top-level page directory. + */ ++ ++#ifdef CONFIG_PAX_PER_CPU_PGD ++ pages->state.host_cr3 = read_cr3(); ++#else + pages->state.host_cr3 = __pa(current->mm->pgd); ++#endif ++ + /* + * Set up the Guest's page tables to see this CPU's pages (and no + * other CPU's pages). +@@ -477,7 +483,7 @@ void __init lguest_arch_host_init(void) + * compiled-in switcher code and the high-mapped copy we just made. + */ + for (i = 0; i < IDT_ENTRIES; i++) +- default_idt_entries[i] += switcher_offset(); ++ default_idt_entries[i] = ktla_ktva(default_idt_entries[i]) + switcher_offset(); + + /* + * Set up the Switcher's per-cpu areas. +@@ -560,7 +566,7 @@ void __init lguest_arch_host_init(void) + * it will be undisturbed when we switch. To change %cs and jump we + * need this structure to feed to Intel's "lcall" instruction. + */ +- lguest_entry.offset = (long)switch_to_guest + switcher_offset(); ++ lguest_entry.offset = (long)ktla_ktva(switch_to_guest) + switcher_offset(); + lguest_entry.segment = LGUEST_CS; + + /* +diff --git a/drivers/lguest/x86/switcher_32.S b/drivers/lguest/x86/switcher_32.S +index 40634b0..4f5855e 100644 +--- a/drivers/lguest/x86/switcher_32.S ++++ b/drivers/lguest/x86/switcher_32.S +@@ -87,6 +87,7 @@ + #include <asm/page.h> + #include <asm/segment.h> + #include <asm/lguest.h> ++#include <asm/processor-flags.h> + + // We mark the start of the code to copy + // It's placed in .text tho it's never run here +@@ -149,6 +150,13 @@ ENTRY(switch_to_guest) + // Changes type when we load it: damn Intel! + // For after we switch over our page tables + // That entry will be read-only: we'd crash. ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ mov %cr0, %edx ++ xor $X86_CR0_WP, %edx ++ mov %edx, %cr0 ++#endif ++ + movl $(GDT_ENTRY_TSS*8), %edx + ltr %dx + +@@ -157,9 +165,15 @@ ENTRY(switch_to_guest) + // Let's clear it again for our return. + // The GDT descriptor of the Host + // Points to the table after two "size" bytes +- movl (LGUEST_PAGES_host_gdt_desc+2)(%eax), %edx ++ movl (LGUEST_PAGES_host_gdt_desc+2)(%eax), %eax + // Clear "used" from type field (byte 5, bit 2) +- andb $0xFD, (GDT_ENTRY_TSS*8 + 5)(%edx) ++ andb $0xFD, (GDT_ENTRY_TSS*8 + 5)(%eax) ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ mov %cr0, %eax ++ xor $X86_CR0_WP, %eax ++ mov %eax, %cr0 ++#endif + + // Once our page table's switched, the Guest is live! + // The Host fades as we run this final step. +@@ -295,13 +309,12 @@ deliver_to_host: + // I consulted gcc, and it gave + // These instructions, which I gladly credit: + leal (%edx,%ebx,8), %eax +- movzwl (%eax),%edx +- movl 4(%eax), %eax +- xorw %ax, %ax +- orl %eax, %edx ++ movl 4(%eax), %edx ++ movw (%eax), %dx + // Now the address of the handler's in %edx + // We call it now: its "iret" drops us home. +- jmp *%edx ++ ljmp $__KERNEL_CS, $1f ++1: jmp *%edx + + // Every interrupt can come to us here + // But we must truly tell each apart. +diff --git a/drivers/md/bcache/closure.h b/drivers/md/bcache/closure.h +index a08e3ee..df8ade2 100644 +--- a/drivers/md/bcache/closure.h ++++ b/drivers/md/bcache/closure.h +@@ -238,7 +238,7 @@ static inline void closure_set_stopped(struct closure *cl) + static inline void set_closure_fn(struct closure *cl, closure_fn *fn, + struct workqueue_struct *wq) + { +- BUG_ON(object_is_on_stack(cl)); ++ BUG_ON(object_starts_on_stack(cl)); + closure_set_ip(cl); + cl->fn = fn; + cl->wq = wq; +diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c +index da3604e..7789cb4 100644 +--- a/drivers/md/bitmap.c ++++ b/drivers/md/bitmap.c +@@ -1771,7 +1771,7 @@ void bitmap_status(struct seq_file *seq, struct bitmap *bitmap) + chunk_kb ? "KB" : "B"); + if (bitmap->storage.file) { + seq_printf(seq, ", file: "); +- seq_path(seq, &bitmap->storage.file->f_path, " \t\n"); ++ seq_path(seq, &bitmap->storage.file->f_path, " \t\n\\"); + } + + seq_printf(seq, "\n"); +diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c +index 0be9381..114262b 100644 +--- a/drivers/md/dm-ioctl.c ++++ b/drivers/md/dm-ioctl.c +@@ -1769,7 +1769,7 @@ static int validate_params(uint cmd, struct dm_ioctl *param) + cmd == DM_LIST_VERSIONS_CMD) + return 0; + +- if ((cmd == DM_DEV_CREATE_CMD)) { ++ if (cmd == DM_DEV_CREATE_CMD) { + if (!*param->name) { + DMWARN("name not supplied when creating device"); + return -EINVAL; +diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c +index 089d627..ef7352e 100644 +--- a/drivers/md/dm-raid1.c ++++ b/drivers/md/dm-raid1.c +@@ -40,7 +40,7 @@ enum dm_raid1_error { + + struct mirror { + struct mirror_set *ms; +- atomic_t error_count; ++ atomic_unchecked_t error_count; + unsigned long error_type; + struct dm_dev *dev; + sector_t offset; +@@ -186,7 +186,7 @@ static struct mirror *get_valid_mirror(struct mirror_set *ms) + struct mirror *m; + + for (m = ms->mirror; m < ms->mirror + ms->nr_mirrors; m++) +- if (!atomic_read(&m->error_count)) ++ if (!atomic_read_unchecked(&m->error_count)) + return m; + + return NULL; +@@ -218,7 +218,7 @@ static void fail_mirror(struct mirror *m, enum dm_raid1_error error_type) + * simple way to tell if a device has encountered + * errors. + */ +- atomic_inc(&m->error_count); ++ atomic_inc_unchecked(&m->error_count); + + if (test_and_set_bit(error_type, &m->error_type)) + return; +@@ -409,7 +409,7 @@ static struct mirror *choose_mirror(struct mirror_set *ms, sector_t sector) + struct mirror *m = get_default_mirror(ms); + + do { +- if (likely(!atomic_read(&m->error_count))) ++ if (likely(!atomic_read_unchecked(&m->error_count))) + return m; + + if (m-- == ms->mirror) +@@ -423,7 +423,7 @@ static int default_ok(struct mirror *m) + { + struct mirror *default_mirror = get_default_mirror(m->ms); + +- return !atomic_read(&default_mirror->error_count); ++ return !atomic_read_unchecked(&default_mirror->error_count); + } + + static int mirror_available(struct mirror_set *ms, struct bio *bio) +@@ -560,7 +560,7 @@ static void do_reads(struct mirror_set *ms, struct bio_list *reads) + */ + if (likely(region_in_sync(ms, region, 1))) + m = choose_mirror(ms, bio->bi_iter.bi_sector); +- else if (m && atomic_read(&m->error_count)) ++ else if (m && atomic_read_unchecked(&m->error_count)) + m = NULL; + + if (likely(m)) +@@ -936,7 +936,7 @@ static int get_mirror(struct mirror_set *ms, struct dm_target *ti, + } + + ms->mirror[mirror].ms = ms; +- atomic_set(&(ms->mirror[mirror].error_count), 0); ++ atomic_set_unchecked(&(ms->mirror[mirror].error_count), 0); + ms->mirror[mirror].error_type = 0; + ms->mirror[mirror].offset = offset; + +@@ -1351,7 +1351,7 @@ static void mirror_resume(struct dm_target *ti) + */ + static char device_status_char(struct mirror *m) + { +- if (!atomic_read(&(m->error_count))) ++ if (!atomic_read_unchecked(&(m->error_count))) + return 'A'; + + return (test_bit(DM_RAID1_FLUSH_ERROR, &(m->error_type))) ? 'F' : +diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c +index 87f86c7..a1a4100 100644 +--- a/drivers/md/dm-stats.c ++++ b/drivers/md/dm-stats.c +@@ -382,7 +382,7 @@ do_sync_free: + synchronize_rcu_expedited(); + dm_stat_free(&s->rcu_head); + } else { +- ACCESS_ONCE(dm_stat_need_rcu_barrier) = 1; ++ ACCESS_ONCE_RW(dm_stat_need_rcu_barrier) = 1; + call_rcu(&s->rcu_head, dm_stat_free); + } + return 0; +@@ -554,8 +554,8 @@ void dm_stats_account_io(struct dm_stats *stats, unsigned long bi_rw, + ((bi_rw & (REQ_WRITE | REQ_DISCARD)) == + (ACCESS_ONCE(last->last_rw) & (REQ_WRITE | REQ_DISCARD))) + )); +- ACCESS_ONCE(last->last_sector) = end_sector; +- ACCESS_ONCE(last->last_rw) = bi_rw; ++ ACCESS_ONCE_RW(last->last_sector) = end_sector; ++ ACCESS_ONCE_RW(last->last_rw) = bi_rw; + } + + rcu_read_lock(); +diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c +index f8b37d4..5c5cafd 100644 +--- a/drivers/md/dm-stripe.c ++++ b/drivers/md/dm-stripe.c +@@ -21,7 +21,7 @@ struct stripe { + struct dm_dev *dev; + sector_t physical_start; + +- atomic_t error_count; ++ atomic_unchecked_t error_count; + }; + + struct stripe_c { +@@ -188,7 +188,7 @@ static int stripe_ctr(struct dm_target *ti, unsigned int argc, char **argv) + kfree(sc); + return r; + } +- atomic_set(&(sc->stripe[i].error_count), 0); ++ atomic_set_unchecked(&(sc->stripe[i].error_count), 0); + } + + ti->private = sc; +@@ -332,7 +332,7 @@ static void stripe_status(struct dm_target *ti, status_type_t type, + DMEMIT("%d ", sc->stripes); + for (i = 0; i < sc->stripes; i++) { + DMEMIT("%s ", sc->stripe[i].dev->name); +- buffer[i] = atomic_read(&(sc->stripe[i].error_count)) ? ++ buffer[i] = atomic_read_unchecked(&(sc->stripe[i].error_count)) ? + 'D' : 'A'; + } + buffer[i] = '\0'; +@@ -377,8 +377,8 @@ static int stripe_end_io(struct dm_target *ti, struct bio *bio, int error) + */ + for (i = 0; i < sc->stripes; i++) + if (!strcmp(sc->stripe[i].dev->name, major_minor)) { +- atomic_inc(&(sc->stripe[i].error_count)); +- if (atomic_read(&(sc->stripe[i].error_count)) < ++ atomic_inc_unchecked(&(sc->stripe[i].error_count)); ++ if (atomic_read_unchecked(&(sc->stripe[i].error_count)) < + DM_IO_ERROR_THRESHOLD) + schedule_work(&sc->trigger_event); + } +diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c +index b2bd1eb..38f7a44 100644 +--- a/drivers/md/dm-table.c ++++ b/drivers/md/dm-table.c +@@ -303,7 +303,7 @@ static int device_area_is_invalid(struct dm_target *ti, struct dm_dev *dev, + if (!dev_size) + return 0; + +- if ((start >= dev_size) || (start + len > dev_size)) { ++ if ((start >= dev_size) || (len > dev_size - start)) { + DMWARN("%s: %s too small for target: " + "start=%llu, len=%llu, dev_size=%llu", + dm_device_name(ti->table->md), bdevname(bdev, b), +diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c +index e9d33ad..dae9880 100644 +--- a/drivers/md/dm-thin-metadata.c ++++ b/drivers/md/dm-thin-metadata.c +@@ -404,7 +404,7 @@ static void __setup_btree_details(struct dm_pool_metadata *pmd) + { + pmd->info.tm = pmd->tm; + pmd->info.levels = 2; +- pmd->info.value_type.context = pmd->data_sm; ++ pmd->info.value_type.context = (dm_space_map_no_const *)pmd->data_sm; + pmd->info.value_type.size = sizeof(__le64); + pmd->info.value_type.inc = data_block_inc; + pmd->info.value_type.dec = data_block_dec; +@@ -423,7 +423,7 @@ static void __setup_btree_details(struct dm_pool_metadata *pmd) + + pmd->bl_info.tm = pmd->tm; + pmd->bl_info.levels = 1; +- pmd->bl_info.value_type.context = pmd->data_sm; ++ pmd->bl_info.value_type.context = (dm_space_map_no_const *)pmd->data_sm; + pmd->bl_info.value_type.size = sizeof(__le64); + pmd->bl_info.value_type.inc = data_block_inc; + pmd->bl_info.value_type.dec = data_block_dec; +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index 042114f..9497625 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -183,9 +183,9 @@ struct mapped_device { + /* + * Event handling. + */ +- atomic_t event_nr; ++ atomic_unchecked_t event_nr; + wait_queue_head_t eventq; +- atomic_t uevent_seq; ++ atomic_unchecked_t uevent_seq; + struct list_head uevent_list; + spinlock_t uevent_lock; /* Protect access to uevent_list */ + +@@ -2071,8 +2071,8 @@ static struct mapped_device *alloc_dev(int minor) + spin_lock_init(&md->deferred_lock); + atomic_set(&md->holders, 1); + atomic_set(&md->open_count, 0); +- atomic_set(&md->event_nr, 0); +- atomic_set(&md->uevent_seq, 0); ++ atomic_set_unchecked(&md->event_nr, 0); ++ atomic_set_unchecked(&md->uevent_seq, 0); + INIT_LIST_HEAD(&md->uevent_list); + INIT_LIST_HEAD(&md->table_devices); + spin_lock_init(&md->uevent_lock); +@@ -2228,7 +2228,7 @@ static void event_callback(void *context) + + dm_send_uevents(&uevents, &disk_to_dev(md->disk)->kobj); + +- atomic_inc(&md->event_nr); ++ atomic_inc_unchecked(&md->event_nr); + wake_up(&md->eventq); + } + +@@ -2935,18 +2935,18 @@ int dm_kobject_uevent(struct mapped_device *md, enum kobject_action action, + + uint32_t dm_next_uevent_seq(struct mapped_device *md) + { +- return atomic_add_return(1, &md->uevent_seq); ++ return atomic_add_return_unchecked(1, &md->uevent_seq); + } + + uint32_t dm_get_event_nr(struct mapped_device *md) + { +- return atomic_read(&md->event_nr); ++ return atomic_read_unchecked(&md->event_nr); + } + + int dm_wait_event(struct mapped_device *md, int event_nr) + { + return wait_event_interruptible(md->eventq, +- (event_nr != atomic_read(&md->event_nr))); ++ (event_nr != atomic_read_unchecked(&md->event_nr))); + } + + void dm_uevent_add(struct mapped_device *md, struct list_head *elist) +diff --git a/drivers/md/md.c b/drivers/md/md.c +index 9233c71..ed5243a 100644 +--- a/drivers/md/md.c ++++ b/drivers/md/md.c +@@ -190,10 +190,10 @@ EXPORT_SYMBOL_GPL(bio_clone_mddev); + * start build, activate spare + */ + static DECLARE_WAIT_QUEUE_HEAD(md_event_waiters); +-static atomic_t md_event_count; ++static atomic_unchecked_t md_event_count; + void md_new_event(struct mddev *mddev) + { +- atomic_inc(&md_event_count); ++ atomic_inc_unchecked(&md_event_count); + wake_up(&md_event_waiters); + } + EXPORT_SYMBOL_GPL(md_new_event); +@@ -203,7 +203,7 @@ EXPORT_SYMBOL_GPL(md_new_event); + */ + static void md_new_event_inintr(struct mddev *mddev) + { +- atomic_inc(&md_event_count); ++ atomic_inc_unchecked(&md_event_count); + wake_up(&md_event_waiters); + } + +@@ -1426,7 +1426,7 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ + if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE) && + (le32_to_cpu(sb->feature_map) & MD_FEATURE_NEW_OFFSET)) + rdev->new_data_offset += (s32)le32_to_cpu(sb->new_offset); +- atomic_set(&rdev->corrected_errors, le32_to_cpu(sb->cnt_corrected_read)); ++ atomic_set_unchecked(&rdev->corrected_errors, le32_to_cpu(sb->cnt_corrected_read)); + + rdev->sb_size = le32_to_cpu(sb->max_dev) * 2 + 256; + bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1; +@@ -1677,7 +1677,7 @@ static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev) + else + sb->resync_offset = cpu_to_le64(0); + +- sb->cnt_corrected_read = cpu_to_le32(atomic_read(&rdev->corrected_errors)); ++ sb->cnt_corrected_read = cpu_to_le32(atomic_read_unchecked(&rdev->corrected_errors)); + + sb->raid_disks = cpu_to_le32(mddev->raid_disks); + sb->size = cpu_to_le64(mddev->dev_sectors); +@@ -2547,7 +2547,7 @@ __ATTR(state, S_IRUGO|S_IWUSR, state_show, state_store); + static ssize_t + errors_show(struct md_rdev *rdev, char *page) + { +- return sprintf(page, "%d\n", atomic_read(&rdev->corrected_errors)); ++ return sprintf(page, "%d\n", atomic_read_unchecked(&rdev->corrected_errors)); + } + + static ssize_t +@@ -2556,7 +2556,7 @@ errors_store(struct md_rdev *rdev, const char *buf, size_t len) + char *e; + unsigned long n = simple_strtoul(buf, &e, 10); + if (*buf && (*e == 0 || *e == '\n')) { +- atomic_set(&rdev->corrected_errors, n); ++ atomic_set_unchecked(&rdev->corrected_errors, n); + return len; + } + return -EINVAL; +@@ -3000,8 +3000,8 @@ int md_rdev_init(struct md_rdev *rdev) + rdev->sb_loaded = 0; + rdev->bb_page = NULL; + atomic_set(&rdev->nr_pending, 0); +- atomic_set(&rdev->read_errors, 0); +- atomic_set(&rdev->corrected_errors, 0); ++ atomic_set_unchecked(&rdev->read_errors, 0); ++ atomic_set_unchecked(&rdev->corrected_errors, 0); + + INIT_LIST_HEAD(&rdev->same_set); + init_waitqueue_head(&rdev->blocked_wait); +@@ -6855,7 +6855,7 @@ static int md_seq_show(struct seq_file *seq, void *v) + + spin_unlock(&pers_lock); + seq_printf(seq, "\n"); +- seq->poll_event = atomic_read(&md_event_count); ++ seq->poll_event = atomic_read_unchecked(&md_event_count); + return 0; + } + if (v == (void*)2) { +@@ -6958,7 +6958,7 @@ static int md_seq_open(struct inode *inode, struct file *file) + return error; + + seq = file->private_data; +- seq->poll_event = atomic_read(&md_event_count); ++ seq->poll_event = atomic_read_unchecked(&md_event_count); + return error; + } + +@@ -6975,7 +6975,7 @@ static unsigned int mdstat_poll(struct file *filp, poll_table *wait) + /* always allow read */ + mask = POLLIN | POLLRDNORM; + +- if (seq->poll_event != atomic_read(&md_event_count)) ++ if (seq->poll_event != atomic_read_unchecked(&md_event_count)) + mask |= POLLERR | POLLPRI; + return mask; + } +@@ -7022,7 +7022,7 @@ static int is_mddev_idle(struct mddev *mddev, int init) + struct gendisk *disk = rdev->bdev->bd_contains->bd_disk; + curr_events = (int)part_stat_read(&disk->part0, sectors[0]) + + (int)part_stat_read(&disk->part0, sectors[1]) - +- atomic_read(&disk->sync_io); ++ atomic_read_unchecked(&disk->sync_io); + /* sync IO will cause sync_io to increase before the disk_stats + * as sync_io is counted when a request starts, and + * disk_stats is counted when it completes. +diff --git a/drivers/md/md.h b/drivers/md/md.h +index 03cec5b..0a658c1 100644 +--- a/drivers/md/md.h ++++ b/drivers/md/md.h +@@ -94,13 +94,13 @@ struct md_rdev { + * only maintained for arrays that + * support hot removal + */ +- atomic_t read_errors; /* number of consecutive read errors that ++ atomic_unchecked_t read_errors; /* number of consecutive read errors that + * we have tried to ignore. + */ + struct timespec last_read_error; /* monotonic time since our + * last read error + */ +- atomic_t corrected_errors; /* number of corrected read errors, ++ atomic_unchecked_t corrected_errors; /* number of corrected read errors, + * for reporting to userspace and storing + * in superblock. + */ +@@ -448,7 +448,7 @@ static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev) + + static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors) + { +- atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io); ++ atomic_add_unchecked(nr_sectors, &bdev->bd_contains->bd_disk->sync_io); + } + + struct md_personality +diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c +index f4e22bc..8f83114 100644 +--- a/drivers/md/persistent-data/dm-space-map-metadata.c ++++ b/drivers/md/persistent-data/dm-space-map-metadata.c +@@ -681,7 +681,7 @@ static int sm_metadata_extend(struct dm_space_map *sm, dm_block_t extra_blocks) + * Flick into a mode where all blocks get allocated in the new area. + */ + smm->begin = old_len; +- memcpy(sm, &bootstrap_ops, sizeof(*sm)); ++ memcpy((void *)sm, &bootstrap_ops, sizeof(*sm)); + + /* + * Extend. +@@ -712,7 +712,7 @@ out: + /* + * Switch back to normal behaviour. + */ +- memcpy(sm, &ops, sizeof(*sm)); ++ memcpy((void *)sm, &ops, sizeof(*sm)); + return r; + } + +diff --git a/drivers/md/persistent-data/dm-space-map.h b/drivers/md/persistent-data/dm-space-map.h +index 3e6d115..ffecdeb 100644 +--- a/drivers/md/persistent-data/dm-space-map.h ++++ b/drivers/md/persistent-data/dm-space-map.h +@@ -71,6 +71,7 @@ struct dm_space_map { + dm_sm_threshold_fn fn, + void *context); + }; ++typedef struct dm_space_map __no_const dm_space_map_no_const; + + /*----------------------------------------------------------------*/ + +diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c +index 2f2f38f..f6a8ebe 100644 +--- a/drivers/md/raid1.c ++++ b/drivers/md/raid1.c +@@ -1932,7 +1932,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) + if (r1_sync_page_io(rdev, sect, s, + bio->bi_io_vec[idx].bv_page, + READ) != 0) +- atomic_add(s, &rdev->corrected_errors); ++ atomic_add_unchecked(s, &rdev->corrected_errors); + } + sectors -= s; + sect += s; +@@ -2165,7 +2165,7 @@ static void fix_read_error(struct r1conf *conf, int read_disk, + !test_bit(Faulty, &rdev->flags)) { + if (r1_sync_page_io(rdev, sect, s, + conf->tmppage, READ)) { +- atomic_add(s, &rdev->corrected_errors); ++ atomic_add_unchecked(s, &rdev->corrected_errors); + printk(KERN_INFO + "md/raid1:%s: read error corrected " + "(%d sectors at %llu on %s)\n", +diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c +index 32e282f..5cec803 100644 +--- a/drivers/md/raid10.c ++++ b/drivers/md/raid10.c +@@ -1944,7 +1944,7 @@ static void end_sync_read(struct bio *bio, int error) + /* The write handler will notice the lack of + * R10BIO_Uptodate and record any errors etc + */ +- atomic_add(r10_bio->sectors, ++ atomic_add_unchecked(r10_bio->sectors, + &conf->mirrors[d].rdev->corrected_errors); + + /* for reconstruct, we always reschedule after a read. +@@ -2301,7 +2301,7 @@ static void check_decay_read_errors(struct mddev *mddev, struct md_rdev *rdev) + { + struct timespec cur_time_mon; + unsigned long hours_since_last; +- unsigned int read_errors = atomic_read(&rdev->read_errors); ++ unsigned int read_errors = atomic_read_unchecked(&rdev->read_errors); + + ktime_get_ts(&cur_time_mon); + +@@ -2323,9 +2323,9 @@ static void check_decay_read_errors(struct mddev *mddev, struct md_rdev *rdev) + * overflowing the shift of read_errors by hours_since_last. + */ + if (hours_since_last >= 8 * sizeof(read_errors)) +- atomic_set(&rdev->read_errors, 0); ++ atomic_set_unchecked(&rdev->read_errors, 0); + else +- atomic_set(&rdev->read_errors, read_errors >> hours_since_last); ++ atomic_set_unchecked(&rdev->read_errors, read_errors >> hours_since_last); + } + + static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector, +@@ -2379,8 +2379,8 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 + return; + + check_decay_read_errors(mddev, rdev); +- atomic_inc(&rdev->read_errors); +- if (atomic_read(&rdev->read_errors) > max_read_errors) { ++ atomic_inc_unchecked(&rdev->read_errors); ++ if (atomic_read_unchecked(&rdev->read_errors) > max_read_errors) { + char b[BDEVNAME_SIZE]; + bdevname(rdev->bdev, b); + +@@ -2388,7 +2388,7 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 + "md/raid10:%s: %s: Raid device exceeded " + "read_error threshold [cur %d:max %d]\n", + mdname(mddev), b, +- atomic_read(&rdev->read_errors), max_read_errors); ++ atomic_read_unchecked(&rdev->read_errors), max_read_errors); + printk(KERN_NOTICE + "md/raid10:%s: %s: Failing raid device\n", + mdname(mddev), b); +@@ -2543,7 +2543,7 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 + sect + + choose_data_offset(r10_bio, rdev)), + bdevname(rdev->bdev, b)); +- atomic_add(s, &rdev->corrected_errors); ++ atomic_add_unchecked(s, &rdev->corrected_errors); + } + + rdev_dec_pending(rdev, mddev); +diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c +index 8577cc7..5779d5b 100644 +--- a/drivers/md/raid5.c ++++ b/drivers/md/raid5.c +@@ -950,23 +950,23 @@ async_copy_data(int frombio, struct bio *bio, struct page **page, + struct bio_vec bvl; + struct bvec_iter iter; + struct page *bio_page; +- int page_offset; ++ s64 page_offset; + struct async_submit_ctl submit; + enum async_tx_flags flags = 0; + + if (bio->bi_iter.bi_sector >= sector) +- page_offset = (signed)(bio->bi_iter.bi_sector - sector) * 512; ++ page_offset = (s64)(bio->bi_iter.bi_sector - sector) * 512; + else +- page_offset = (signed)(sector - bio->bi_iter.bi_sector) * -512; ++ page_offset = (s64)(sector - bio->bi_iter.bi_sector) * -512; + + if (frombio) + flags |= ASYNC_TX_FENCE; + init_async_submit(&submit, flags, tx, NULL, NULL, NULL); + + bio_for_each_segment(bvl, bio, iter) { +- int len = bvl.bv_len; +- int clen; +- int b_offset = 0; ++ s64 len = bvl.bv_len; ++ s64 clen; ++ s64 b_offset = 0; + + if (page_offset < 0) { + b_offset = -page_offset; +@@ -1730,6 +1730,10 @@ static int grow_one_stripe(struct r5conf *conf, int hash) + return 1; + } + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++static atomic_unchecked_t raid5_cache_id = ATOMIC_INIT(0); ++#endif ++ + static int grow_stripes(struct r5conf *conf, int num) + { + struct kmem_cache *sc; +@@ -1741,7 +1745,11 @@ static int grow_stripes(struct r5conf *conf, int num) + "raid%d-%s", conf->level, mdname(conf->mddev)); + else + sprintf(conf->cache_name[0], ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ "raid%d-%08lx", conf->level, atomic_inc_return_unchecked(&raid5_cache_id)); ++#else + "raid%d-%p", conf->level, conf->mddev); ++#endif + sprintf(conf->cache_name[1], "%s-alt", conf->cache_name[0]); + + conf->active_name = 0; +@@ -2017,21 +2025,21 @@ static void raid5_end_read_request(struct bio * bi, int error) + mdname(conf->mddev), STRIPE_SECTORS, + (unsigned long long)s, + bdevname(rdev->bdev, b)); +- atomic_add(STRIPE_SECTORS, &rdev->corrected_errors); ++ atomic_add_unchecked(STRIPE_SECTORS, &rdev->corrected_errors); + clear_bit(R5_ReadError, &sh->dev[i].flags); + clear_bit(R5_ReWrite, &sh->dev[i].flags); + } else if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) + clear_bit(R5_ReadNoMerge, &sh->dev[i].flags); + +- if (atomic_read(&rdev->read_errors)) +- atomic_set(&rdev->read_errors, 0); ++ if (atomic_read_unchecked(&rdev->read_errors)) ++ atomic_set_unchecked(&rdev->read_errors, 0); + } else { + const char *bdn = bdevname(rdev->bdev, b); + int retry = 0; + int set_bad = 0; + + clear_bit(R5_UPTODATE, &sh->dev[i].flags); +- atomic_inc(&rdev->read_errors); ++ atomic_inc_unchecked(&rdev->read_errors); + if (test_bit(R5_ReadRepl, &sh->dev[i].flags)) + printk_ratelimited( + KERN_WARNING +@@ -2059,7 +2067,7 @@ static void raid5_end_read_request(struct bio * bi, int error) + mdname(conf->mddev), + (unsigned long long)s, + bdn); +- } else if (atomic_read(&rdev->read_errors) ++ } else if (atomic_read_unchecked(&rdev->read_errors) + > conf->max_nr_stripes) + printk(KERN_WARNING + "md/raid:%s: Too many read errors, failing device %s.\n", +diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c +index 983db75..ef9248c 100644 +--- a/drivers/media/dvb-core/dvbdev.c ++++ b/drivers/media/dvb-core/dvbdev.c +@@ -185,7 +185,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, + const struct dvb_device *template, void *priv, int type) + { + struct dvb_device *dvbdev; +- struct file_operations *dvbdevfops; ++ file_operations_no_const *dvbdevfops; + struct device *clsdev; + int minor; + int id; +diff --git a/drivers/media/dvb-frontends/af9033.h b/drivers/media/dvb-frontends/af9033.h +index 6ad22b6..6e90e2a 100644 +--- a/drivers/media/dvb-frontends/af9033.h ++++ b/drivers/media/dvb-frontends/af9033.h +@@ -96,6 +96,6 @@ struct af9033_ops { + int (*pid_filter_ctrl)(struct dvb_frontend *fe, int onoff); + int (*pid_filter)(struct dvb_frontend *fe, int index, u16 pid, + int onoff); +-}; ++} __no_const; + + #endif /* AF9033_H */ +diff --git a/drivers/media/dvb-frontends/dib3000.h b/drivers/media/dvb-frontends/dib3000.h +index 9b6c3bb..baeb5c7 100644 +--- a/drivers/media/dvb-frontends/dib3000.h ++++ b/drivers/media/dvb-frontends/dib3000.h +@@ -39,7 +39,7 @@ struct dib_fe_xfer_ops + int (*fifo_ctrl)(struct dvb_frontend *fe, int onoff); + int (*pid_ctrl)(struct dvb_frontend *fe, int index, int pid, int onoff); + int (*tuner_pass_ctrl)(struct dvb_frontend *fe, int onoff, u8 pll_ctrl); +-}; ++} __no_const; + + #if IS_ENABLED(CONFIG_DVB_DIB3000MB) + extern struct dvb_frontend* dib3000mb_attach(const struct dib3000_config* config, +diff --git a/drivers/media/dvb-frontends/dib7000p.h b/drivers/media/dvb-frontends/dib7000p.h +index 1fea0e9..321ce8f 100644 +--- a/drivers/media/dvb-frontends/dib7000p.h ++++ b/drivers/media/dvb-frontends/dib7000p.h +@@ -64,7 +64,7 @@ struct dib7000p_ops { + int (*get_adc_power)(struct dvb_frontend *fe); + int (*slave_reset)(struct dvb_frontend *fe); + struct dvb_frontend *(*init)(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000p_config *cfg); +-}; ++} __no_const; + + #if IS_ENABLED(CONFIG_DVB_DIB7000P) + void *dib7000p_attach(struct dib7000p_ops *ops); +diff --git a/drivers/media/dvb-frontends/dib8000.h b/drivers/media/dvb-frontends/dib8000.h +index 84cc103..5780c54 100644 +--- a/drivers/media/dvb-frontends/dib8000.h ++++ b/drivers/media/dvb-frontends/dib8000.h +@@ -61,7 +61,7 @@ struct dib8000_ops { + int (*pid_filter_ctrl)(struct dvb_frontend *fe, u8 onoff); + int (*pid_filter)(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff); + struct dvb_frontend *(*init)(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg); +-}; ++} __no_const; + + #if IS_ENABLED(CONFIG_DVB_DIB8000) + void *dib8000_attach(struct dib8000_ops *ops); +diff --git a/drivers/media/pci/cx88/cx88-video.c b/drivers/media/pci/cx88/cx88-video.c +index ce27e6d..b70435a 100644 +--- a/drivers/media/pci/cx88/cx88-video.c ++++ b/drivers/media/pci/cx88/cx88-video.c +@@ -50,9 +50,9 @@ MODULE_VERSION(CX88_VERSION); + + /* ------------------------------------------------------------------ */ + +-static unsigned int video_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; +-static unsigned int vbi_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; +-static unsigned int radio_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; ++static int video_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; ++static int vbi_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; ++static int radio_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; + + module_param_array(video_nr, int, NULL, 0444); + module_param_array(vbi_nr, int, NULL, 0444); +diff --git a/drivers/media/pci/ivtv/ivtv-driver.c b/drivers/media/pci/ivtv/ivtv-driver.c +index 802642d..5534900 100644 +--- a/drivers/media/pci/ivtv/ivtv-driver.c ++++ b/drivers/media/pci/ivtv/ivtv-driver.c +@@ -83,7 +83,7 @@ static struct pci_device_id ivtv_pci_tbl[] = { + MODULE_DEVICE_TABLE(pci,ivtv_pci_tbl); + + /* ivtv instance counter */ +-static atomic_t ivtv_instance = ATOMIC_INIT(0); ++static atomic_unchecked_t ivtv_instance = ATOMIC_INIT(0); + + /* Parameter declarations */ + static int cardtype[IVTV_MAX_CARDS]; +diff --git a/drivers/media/pci/solo6x10/solo6x10-core.c b/drivers/media/pci/solo6x10/solo6x10-core.c +index 8cbe6b4..ea3601c 100644 +--- a/drivers/media/pci/solo6x10/solo6x10-core.c ++++ b/drivers/media/pci/solo6x10/solo6x10-core.c +@@ -424,7 +424,7 @@ static void solo_device_release(struct device *dev) + + static int solo_sysfs_init(struct solo_dev *solo_dev) + { +- struct bin_attribute *sdram_attr = &solo_dev->sdram_attr; ++ bin_attribute_no_const *sdram_attr = &solo_dev->sdram_attr; + struct device *dev = &solo_dev->dev; + const char *driver; + int i; +diff --git a/drivers/media/pci/solo6x10/solo6x10-g723.c b/drivers/media/pci/solo6x10/solo6x10-g723.c +index c7141f2..5301fec 100644 +--- a/drivers/media/pci/solo6x10/solo6x10-g723.c ++++ b/drivers/media/pci/solo6x10/solo6x10-g723.c +@@ -351,7 +351,7 @@ static int solo_snd_pcm_init(struct solo_dev *solo_dev) + + int solo_g723_init(struct solo_dev *solo_dev) + { +- static struct snd_device_ops ops = { NULL }; ++ static struct snd_device_ops ops = { }; + struct snd_card *card; + struct snd_kcontrol_new kctl; + char name[32]; +diff --git a/drivers/media/pci/solo6x10/solo6x10-p2m.c b/drivers/media/pci/solo6x10/solo6x10-p2m.c +index 8c84846..27b4f83 100644 +--- a/drivers/media/pci/solo6x10/solo6x10-p2m.c ++++ b/drivers/media/pci/solo6x10/solo6x10-p2m.c +@@ -73,7 +73,7 @@ int solo_p2m_dma_desc(struct solo_dev *solo_dev, + + /* Get next ID. According to Softlogic, 6110 has problems on !=0 P2M */ + if (solo_dev->type != SOLO_DEV_6110 && multi_p2m) { +- p2m_id = atomic_inc_return(&solo_dev->p2m_count) % SOLO_NR_P2M; ++ p2m_id = atomic_inc_return_unchecked(&solo_dev->p2m_count) % SOLO_NR_P2M; + if (p2m_id < 0) + p2m_id = -p2m_id; + } +diff --git a/drivers/media/pci/solo6x10/solo6x10.h b/drivers/media/pci/solo6x10/solo6x10.h +index 72017b7..dd37ae6 100644 +--- a/drivers/media/pci/solo6x10/solo6x10.h ++++ b/drivers/media/pci/solo6x10/solo6x10.h +@@ -219,7 +219,7 @@ struct solo_dev { + + /* P2M DMA Engine */ + struct solo_p2m_dev p2m_dev[SOLO_NR_P2M]; +- atomic_t p2m_count; ++ atomic_unchecked_t p2m_count; + int p2m_jiffies; + unsigned int p2m_timeouts; + +diff --git a/drivers/media/pci/tw68/tw68-core.c b/drivers/media/pci/tw68/tw68-core.c +index 63f0b64..a017c1c 100644 +--- a/drivers/media/pci/tw68/tw68-core.c ++++ b/drivers/media/pci/tw68/tw68-core.c +@@ -60,7 +60,7 @@ static unsigned int card[] = {[0 ... (TW68_MAXBOARDS - 1)] = UNSET }; + module_param_array(card, int, NULL, 0444); + MODULE_PARM_DESC(card, "card type"); + +-static atomic_t tw68_instance = ATOMIC_INIT(0); ++static atomic_unchecked_t tw68_instance = ATOMIC_INIT(0); + + /* ------------------------------------------------------------------ */ + +diff --git a/drivers/media/platform/omap/omap_vout.c b/drivers/media/platform/omap/omap_vout.c +index 64ab6fb..ef4a8b9 100644 +--- a/drivers/media/platform/omap/omap_vout.c ++++ b/drivers/media/platform/omap/omap_vout.c +@@ -63,7 +63,6 @@ enum omap_vout_channels { + OMAP_VIDEO2, + }; + +-static struct videobuf_queue_ops video_vbq_ops; + /* Variables configurable through module params*/ + static u32 video1_numbuffers = 3; + static u32 video2_numbuffers = 3; +@@ -1012,6 +1011,12 @@ static int omap_vout_open(struct file *file) + { + struct videobuf_queue *q; + struct omap_vout_device *vout = NULL; ++ static struct videobuf_queue_ops video_vbq_ops = { ++ .buf_setup = omap_vout_buffer_setup, ++ .buf_prepare = omap_vout_buffer_prepare, ++ .buf_release = omap_vout_buffer_release, ++ .buf_queue = omap_vout_buffer_queue, ++ }; + + vout = video_drvdata(file); + v4l2_dbg(1, debug, &vout->vid_dev->v4l2_dev, "Entering %s\n", __func__); +@@ -1029,10 +1034,6 @@ static int omap_vout_open(struct file *file) + vout->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + + q = &vout->vbq; +- video_vbq_ops.buf_setup = omap_vout_buffer_setup; +- video_vbq_ops.buf_prepare = omap_vout_buffer_prepare; +- video_vbq_ops.buf_release = omap_vout_buffer_release; +- video_vbq_ops.buf_queue = omap_vout_buffer_queue; + spin_lock_init(&vout->vbq_lock); + + videobuf_queue_dma_contig_init(q, &video_vbq_ops, q->dev, +diff --git a/drivers/media/platform/s5p-tv/mixer.h b/drivers/media/platform/s5p-tv/mixer.h +index fb2acc5..a2fcbdc4 100644 +--- a/drivers/media/platform/s5p-tv/mixer.h ++++ b/drivers/media/platform/s5p-tv/mixer.h +@@ -156,7 +156,7 @@ struct mxr_layer { + /** layer index (unique identifier) */ + int idx; + /** callbacks for layer methods */ +- struct mxr_layer_ops ops; ++ struct mxr_layer_ops *ops; + /** format array */ + const struct mxr_format **fmt_array; + /** size of format array */ +diff --git a/drivers/media/platform/s5p-tv/mixer_grp_layer.c b/drivers/media/platform/s5p-tv/mixer_grp_layer.c +index 74344c7..a39e70e 100644 +--- a/drivers/media/platform/s5p-tv/mixer_grp_layer.c ++++ b/drivers/media/platform/s5p-tv/mixer_grp_layer.c +@@ -235,7 +235,7 @@ struct mxr_layer *mxr_graph_layer_create(struct mxr_device *mdev, int idx) + { + struct mxr_layer *layer; + int ret; +- struct mxr_layer_ops ops = { ++ static struct mxr_layer_ops ops = { + .release = mxr_graph_layer_release, + .buffer_set = mxr_graph_buffer_set, + .stream_set = mxr_graph_stream_set, +diff --git a/drivers/media/platform/s5p-tv/mixer_reg.c b/drivers/media/platform/s5p-tv/mixer_reg.c +index b713403..53cb5ad 100644 +--- a/drivers/media/platform/s5p-tv/mixer_reg.c ++++ b/drivers/media/platform/s5p-tv/mixer_reg.c +@@ -276,7 +276,7 @@ static void mxr_irq_layer_handle(struct mxr_layer *layer) + layer->update_buf = next; + } + +- layer->ops.buffer_set(layer, layer->update_buf); ++ layer->ops->buffer_set(layer, layer->update_buf); + + if (done && done != layer->shadow_buf) + vb2_buffer_done(&done->vb, VB2_BUF_STATE_DONE); +diff --git a/drivers/media/platform/s5p-tv/mixer_video.c b/drivers/media/platform/s5p-tv/mixer_video.c +index b4d2696..91df48e 100644 +--- a/drivers/media/platform/s5p-tv/mixer_video.c ++++ b/drivers/media/platform/s5p-tv/mixer_video.c +@@ -210,7 +210,7 @@ static void mxr_layer_default_geo(struct mxr_layer *layer) + layer->geo.src.height = layer->geo.src.full_height; + + mxr_geometry_dump(mdev, &layer->geo); +- layer->ops.fix_geometry(layer, MXR_GEOMETRY_SINK, 0); ++ layer->ops->fix_geometry(layer, MXR_GEOMETRY_SINK, 0); + mxr_geometry_dump(mdev, &layer->geo); + } + +@@ -228,7 +228,7 @@ static void mxr_layer_update_output(struct mxr_layer *layer) + layer->geo.dst.full_width = mbus_fmt.width; + layer->geo.dst.full_height = mbus_fmt.height; + layer->geo.dst.field = mbus_fmt.field; +- layer->ops.fix_geometry(layer, MXR_GEOMETRY_SINK, 0); ++ layer->ops->fix_geometry(layer, MXR_GEOMETRY_SINK, 0); + + mxr_geometry_dump(mdev, &layer->geo); + } +@@ -334,7 +334,7 @@ static int mxr_s_fmt(struct file *file, void *priv, + /* set source size to highest accepted value */ + geo->src.full_width = max(geo->dst.full_width, pix->width); + geo->src.full_height = max(geo->dst.full_height, pix->height); +- layer->ops.fix_geometry(layer, MXR_GEOMETRY_SOURCE, 0); ++ layer->ops->fix_geometry(layer, MXR_GEOMETRY_SOURCE, 0); + mxr_geometry_dump(mdev, &layer->geo); + /* set cropping to total visible screen */ + geo->src.width = pix->width; +@@ -342,12 +342,12 @@ static int mxr_s_fmt(struct file *file, void *priv, + geo->src.x_offset = 0; + geo->src.y_offset = 0; + /* assure consistency of geometry */ +- layer->ops.fix_geometry(layer, MXR_GEOMETRY_CROP, MXR_NO_OFFSET); ++ layer->ops->fix_geometry(layer, MXR_GEOMETRY_CROP, MXR_NO_OFFSET); + mxr_geometry_dump(mdev, &layer->geo); + /* set full size to lowest possible value */ + geo->src.full_width = 0; + geo->src.full_height = 0; +- layer->ops.fix_geometry(layer, MXR_GEOMETRY_SOURCE, 0); ++ layer->ops->fix_geometry(layer, MXR_GEOMETRY_SOURCE, 0); + mxr_geometry_dump(mdev, &layer->geo); + + /* returning results */ +@@ -474,7 +474,7 @@ static int mxr_s_selection(struct file *file, void *fh, + target->width = s->r.width; + target->height = s->r.height; + +- layer->ops.fix_geometry(layer, stage, s->flags); ++ layer->ops->fix_geometry(layer, stage, s->flags); + + /* retrieve update selection rectangle */ + res.left = target->x_offset; +@@ -954,13 +954,13 @@ static int start_streaming(struct vb2_queue *vq, unsigned int count) + mxr_output_get(mdev); + + mxr_layer_update_output(layer); +- layer->ops.format_set(layer); ++ layer->ops->format_set(layer); + /* enabling layer in hardware */ + spin_lock_irqsave(&layer->enq_slock, flags); + layer->state = MXR_LAYER_STREAMING; + spin_unlock_irqrestore(&layer->enq_slock, flags); + +- layer->ops.stream_set(layer, MXR_ENABLE); ++ layer->ops->stream_set(layer, MXR_ENABLE); + mxr_streamer_get(mdev); + + return 0; +@@ -1030,7 +1030,7 @@ static void stop_streaming(struct vb2_queue *vq) + spin_unlock_irqrestore(&layer->enq_slock, flags); + + /* disabling layer in hardware */ +- layer->ops.stream_set(layer, MXR_DISABLE); ++ layer->ops->stream_set(layer, MXR_DISABLE); + /* remove one streamer */ + mxr_streamer_put(mdev); + /* allow changes in output configuration */ +@@ -1068,8 +1068,8 @@ void mxr_base_layer_unregister(struct mxr_layer *layer) + + void mxr_layer_release(struct mxr_layer *layer) + { +- if (layer->ops.release) +- layer->ops.release(layer); ++ if (layer->ops->release) ++ layer->ops->release(layer); + } + + void mxr_base_layer_release(struct mxr_layer *layer) +@@ -1095,7 +1095,7 @@ struct mxr_layer *mxr_base_layer_create(struct mxr_device *mdev, + + layer->mdev = mdev; + layer->idx = idx; +- layer->ops = *ops; ++ layer->ops = ops; + + spin_lock_init(&layer->enq_slock); + INIT_LIST_HEAD(&layer->enq_list); +diff --git a/drivers/media/platform/s5p-tv/mixer_vp_layer.c b/drivers/media/platform/s5p-tv/mixer_vp_layer.c +index c9388c4..ce71ece 100644 +--- a/drivers/media/platform/s5p-tv/mixer_vp_layer.c ++++ b/drivers/media/platform/s5p-tv/mixer_vp_layer.c +@@ -206,7 +206,7 @@ struct mxr_layer *mxr_vp_layer_create(struct mxr_device *mdev, int idx) + { + struct mxr_layer *layer; + int ret; +- struct mxr_layer_ops ops = { ++ static struct mxr_layer_ops ops = { + .release = mxr_vp_layer_release, + .buffer_set = mxr_vp_buffer_set, + .stream_set = mxr_vp_stream_set, +diff --git a/drivers/media/radio/radio-cadet.c b/drivers/media/radio/radio-cadet.c +index 82affae..42833ec 100644 +--- a/drivers/media/radio/radio-cadet.c ++++ b/drivers/media/radio/radio-cadet.c +@@ -333,6 +333,8 @@ static ssize_t cadet_read(struct file *file, char __user *data, size_t count, lo + unsigned char readbuf[RDS_BUFFER]; + int i = 0; + ++ if (count > RDS_BUFFER) ++ return -EFAULT; + mutex_lock(&dev->lock); + if (dev->rdsstat == 0) + cadet_start_rds(dev); +@@ -349,8 +351,9 @@ static ssize_t cadet_read(struct file *file, char __user *data, size_t count, lo + readbuf[i++] = dev->rdsbuf[dev->rdsout++]; + mutex_unlock(&dev->lock); + +- if (i && copy_to_user(data, readbuf, i)) +- return -EFAULT; ++ if (i > sizeof(readbuf) || (i && copy_to_user(data, readbuf, i))) ++ i = -EFAULT; ++ + return i; + } + +diff --git a/drivers/media/radio/radio-maxiradio.c b/drivers/media/radio/radio-maxiradio.c +index 5236035..c622c74 100644 +--- a/drivers/media/radio/radio-maxiradio.c ++++ b/drivers/media/radio/radio-maxiradio.c +@@ -61,7 +61,7 @@ MODULE_PARM_DESC(radio_nr, "Radio device number"); + /* TEA5757 pin mappings */ + static const int clk = 1, data = 2, wren = 4, mo_st = 8, power = 16; + +-static atomic_t maxiradio_instance = ATOMIC_INIT(0); ++static atomic_unchecked_t maxiradio_instance = ATOMIC_INIT(0); + + #define PCI_VENDOR_ID_GUILLEMOT 0x5046 + #define PCI_DEVICE_ID_GUILLEMOT_MAXIRADIO 0x1001 +diff --git a/drivers/media/radio/radio-shark.c b/drivers/media/radio/radio-shark.c +index 050b3bb..79f62b9 100644 +--- a/drivers/media/radio/radio-shark.c ++++ b/drivers/media/radio/radio-shark.c +@@ -79,7 +79,7 @@ struct shark_device { + u32 last_val; + }; + +-static atomic_t shark_instance = ATOMIC_INIT(0); ++static atomic_unchecked_t shark_instance = ATOMIC_INIT(0); + + static void shark_write_val(struct snd_tea575x *tea, u32 val) + { +diff --git a/drivers/media/radio/radio-shark2.c b/drivers/media/radio/radio-shark2.c +index 8654e0d..0608a64 100644 +--- a/drivers/media/radio/radio-shark2.c ++++ b/drivers/media/radio/radio-shark2.c +@@ -74,7 +74,7 @@ struct shark_device { + u8 *transfer_buffer; + }; + +-static atomic_t shark_instance = ATOMIC_INIT(0); ++static atomic_unchecked_t shark_instance = ATOMIC_INIT(0); + + static int shark_write_reg(struct radio_tea5777 *tea, u64 reg) + { +diff --git a/drivers/media/radio/radio-si476x.c b/drivers/media/radio/radio-si476x.c +index 633022b..7f10754 100644 +--- a/drivers/media/radio/radio-si476x.c ++++ b/drivers/media/radio/radio-si476x.c +@@ -1445,7 +1445,7 @@ static int si476x_radio_probe(struct platform_device *pdev) + struct si476x_radio *radio; + struct v4l2_ctrl *ctrl; + +- static atomic_t instance = ATOMIC_INIT(0); ++ static atomic_unchecked_t instance = ATOMIC_INIT(0); + + radio = devm_kzalloc(&pdev->dev, sizeof(*radio), GFP_KERNEL); + if (!radio) +diff --git a/drivers/media/radio/wl128x/fmdrv_common.c b/drivers/media/radio/wl128x/fmdrv_common.c +index 704397f..4d05977 100644 +--- a/drivers/media/radio/wl128x/fmdrv_common.c ++++ b/drivers/media/radio/wl128x/fmdrv_common.c +@@ -71,7 +71,7 @@ module_param(default_rds_buf, uint, 0444); + MODULE_PARM_DESC(rds_buf, "RDS buffer entries"); + + /* Radio Nr */ +-static u32 radio_nr = -1; ++static int radio_nr = -1; + module_param(radio_nr, int, 0444); + MODULE_PARM_DESC(radio_nr, "Radio Nr"); + +diff --git a/drivers/media/usb/dvb-usb/cinergyT2-core.c b/drivers/media/usb/dvb-usb/cinergyT2-core.c +index 9fd1527..8927230 100644 +--- a/drivers/media/usb/dvb-usb/cinergyT2-core.c ++++ b/drivers/media/usb/dvb-usb/cinergyT2-core.c +@@ -50,29 +50,73 @@ static struct dvb_usb_device_properties cinergyt2_properties; + + static int cinergyt2_streaming_ctrl(struct dvb_usb_adapter *adap, int enable) + { +- char buf[] = { CINERGYT2_EP1_CONTROL_STREAM_TRANSFER, enable ? 1 : 0 }; +- char result[64]; +- return dvb_usb_generic_rw(adap->dev, buf, sizeof(buf), result, +- sizeof(result), 0); ++ char *buf; ++ char *result; ++ int retval; ++ ++ buf = kmalloc(2, GFP_KERNEL); ++ if (buf == NULL) ++ return -ENOMEM; ++ result = kmalloc(64, GFP_KERNEL); ++ if (result == NULL) { ++ kfree(buf); ++ return -ENOMEM; ++ } ++ ++ buf[0] = CINERGYT2_EP1_CONTROL_STREAM_TRANSFER; ++ buf[1] = enable ? 1 : 0; ++ ++ retval = dvb_usb_generic_rw(adap->dev, buf, 2, result, 64, 0); ++ ++ kfree(buf); ++ kfree(result); ++ return retval; + } + + static int cinergyt2_power_ctrl(struct dvb_usb_device *d, int enable) + { +- char buf[] = { CINERGYT2_EP1_SLEEP_MODE, enable ? 0 : 1 }; +- char state[3]; +- return dvb_usb_generic_rw(d, buf, sizeof(buf), state, sizeof(state), 0); ++ char *buf; ++ char *state; ++ int retval; ++ ++ buf = kmalloc(2, GFP_KERNEL); ++ if (buf == NULL) ++ return -ENOMEM; ++ state = kmalloc(3, GFP_KERNEL); ++ if (state == NULL) { ++ kfree(buf); ++ return -ENOMEM; ++ } ++ ++ buf[0] = CINERGYT2_EP1_SLEEP_MODE; ++ buf[1] = enable ? 1 : 0; ++ ++ retval = dvb_usb_generic_rw(d, buf, 2, state, 3, 0); ++ ++ kfree(buf); ++ kfree(state); ++ return retval; + } + + static int cinergyt2_frontend_attach(struct dvb_usb_adapter *adap) + { +- char query[] = { CINERGYT2_EP1_GET_FIRMWARE_VERSION }; +- char state[3]; ++ char *query; ++ char *state; + int ret; ++ query = kmalloc(1, GFP_KERNEL); ++ if (query == NULL) ++ return -ENOMEM; ++ state = kmalloc(3, GFP_KERNEL); ++ if (state == NULL) { ++ kfree(query); ++ return -ENOMEM; ++ } ++ ++ query[0] = CINERGYT2_EP1_GET_FIRMWARE_VERSION; + + adap->fe_adap[0].fe = cinergyt2_fe_attach(adap->dev); + +- ret = dvb_usb_generic_rw(adap->dev, query, sizeof(query), state, +- sizeof(state), 0); ++ ret = dvb_usb_generic_rw(adap->dev, query, 1, state, 3, 0); + if (ret < 0) { + deb_rc("cinergyt2_power_ctrl() Failed to retrieve sleep " + "state info\n"); +@@ -80,7 +124,8 @@ static int cinergyt2_frontend_attach(struct dvb_usb_adapter *adap) + + /* Copy this pointer as we are gonna need it in the release phase */ + cinergyt2_usb_device = adap->dev; +- ++ kfree(query); ++ kfree(state); + return 0; + } + +@@ -141,12 +186,23 @@ static int repeatable_keys[] = { + static int cinergyt2_rc_query(struct dvb_usb_device *d, u32 *event, int *state) + { + struct cinergyt2_state *st = d->priv; +- u8 key[5] = {0, 0, 0, 0, 0}, cmd = CINERGYT2_EP1_GET_RC_EVENTS; ++ u8 *key, *cmd; + int i; + ++ cmd = kmalloc(1, GFP_KERNEL); ++ if (cmd == NULL) ++ return -EINVAL; ++ key = kzalloc(5, GFP_KERNEL); ++ if (key == NULL) { ++ kfree(cmd); ++ return -EINVAL; ++ } ++ ++ cmd[0] = CINERGYT2_EP1_GET_RC_EVENTS; ++ + *state = REMOTE_NO_KEY_PRESSED; + +- dvb_usb_generic_rw(d, &cmd, 1, key, sizeof(key), 0); ++ dvb_usb_generic_rw(d, cmd, 1, key, 5, 0); + if (key[4] == 0xff) { + /* key repeat */ + st->rc_counter++; +@@ -157,12 +213,12 @@ static int cinergyt2_rc_query(struct dvb_usb_device *d, u32 *event, int *state) + *event = d->last_event; + deb_rc("repeat key, event %x\n", + *event); +- return 0; ++ goto out; + } + } + deb_rc("repeated key (non repeatable)\n"); + } +- return 0; ++ goto out; + } + + /* hack to pass checksum on the custom field */ +@@ -174,6 +230,9 @@ static int cinergyt2_rc_query(struct dvb_usb_device *d, u32 *event, int *state) + + deb_rc("key: %*ph\n", 5, key); + } ++out: ++ kfree(cmd); ++ kfree(key); + return 0; + } + +diff --git a/drivers/media/usb/dvb-usb/cinergyT2-fe.c b/drivers/media/usb/dvb-usb/cinergyT2-fe.c +index c890fe4..f9b2ae6 100644 +--- a/drivers/media/usb/dvb-usb/cinergyT2-fe.c ++++ b/drivers/media/usb/dvb-usb/cinergyT2-fe.c +@@ -145,103 +145,176 @@ static int cinergyt2_fe_read_status(struct dvb_frontend *fe, + fe_status_t *status) + { + struct cinergyt2_fe_state *state = fe->demodulator_priv; +- struct dvbt_get_status_msg result; +- u8 cmd[] = { CINERGYT2_EP1_GET_TUNER_STATUS }; ++ struct dvbt_get_status_msg *result; ++ u8 *cmd; + int ret; + +- ret = dvb_usb_generic_rw(state->d, cmd, sizeof(cmd), (u8 *)&result, +- sizeof(result), 0); ++ cmd = kmalloc(1, GFP_KERNEL); ++ if (cmd == NULL) ++ return -ENOMEM; ++ result = kmalloc(sizeof(*result), GFP_KERNEL); ++ if (result == NULL) { ++ kfree(cmd); ++ return -ENOMEM; ++ } ++ ++ cmd[0] = CINERGYT2_EP1_GET_TUNER_STATUS; ++ ++ ret = dvb_usb_generic_rw(state->d, cmd, 1, (u8 *)result, ++ sizeof(*result), 0); + if (ret < 0) +- return ret; ++ goto out; + + *status = 0; + +- if (0xffff - le16_to_cpu(result.gain) > 30) ++ if (0xffff - le16_to_cpu(result->gain) > 30) + *status |= FE_HAS_SIGNAL; +- if (result.lock_bits & (1 << 6)) ++ if (result->lock_bits & (1 << 6)) + *status |= FE_HAS_LOCK; +- if (result.lock_bits & (1 << 5)) ++ if (result->lock_bits & (1 << 5)) + *status |= FE_HAS_SYNC; +- if (result.lock_bits & (1 << 4)) ++ if (result->lock_bits & (1 << 4)) + *status |= FE_HAS_CARRIER; +- if (result.lock_bits & (1 << 1)) ++ if (result->lock_bits & (1 << 1)) + *status |= FE_HAS_VITERBI; + + if ((*status & (FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC)) != + (FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC)) + *status &= ~FE_HAS_LOCK; + +- return 0; ++out: ++ kfree(cmd); ++ kfree(result); ++ return ret; + } + + static int cinergyt2_fe_read_ber(struct dvb_frontend *fe, u32 *ber) + { + struct cinergyt2_fe_state *state = fe->demodulator_priv; +- struct dvbt_get_status_msg status; +- char cmd[] = { CINERGYT2_EP1_GET_TUNER_STATUS }; ++ struct dvbt_get_status_msg *status; ++ char *cmd; + int ret; + +- ret = dvb_usb_generic_rw(state->d, cmd, sizeof(cmd), (char *)&status, +- sizeof(status), 0); ++ cmd = kmalloc(1, GFP_KERNEL); ++ if (cmd == NULL) ++ return -ENOMEM; ++ status = kmalloc(sizeof(*status), GFP_KERNEL); ++ if (status == NULL) { ++ kfree(cmd); ++ return -ENOMEM; ++ } ++ ++ cmd[0] = CINERGYT2_EP1_GET_TUNER_STATUS; ++ ++ ret = dvb_usb_generic_rw(state->d, cmd, 1, (char *)status, ++ sizeof(*status), 0); + if (ret < 0) +- return ret; ++ goto out; + +- *ber = le32_to_cpu(status.viterbi_error_rate); ++ *ber = le32_to_cpu(status->viterbi_error_rate); ++out: ++ kfree(cmd); ++ kfree(status); + return 0; + } + + static int cinergyt2_fe_read_unc_blocks(struct dvb_frontend *fe, u32 *unc) + { + struct cinergyt2_fe_state *state = fe->demodulator_priv; +- struct dvbt_get_status_msg status; +- u8 cmd[] = { CINERGYT2_EP1_GET_TUNER_STATUS }; ++ struct dvbt_get_status_msg *status; ++ u8 *cmd; + int ret; + +- ret = dvb_usb_generic_rw(state->d, cmd, sizeof(cmd), (u8 *)&status, +- sizeof(status), 0); ++ cmd = kmalloc(1, GFP_KERNEL); ++ if (cmd == NULL) ++ return -ENOMEM; ++ status = kmalloc(sizeof(*status), GFP_KERNEL); ++ if (status == NULL) { ++ kfree(cmd); ++ return -ENOMEM; ++ } ++ ++ cmd[0] = CINERGYT2_EP1_GET_TUNER_STATUS; ++ ++ ret = dvb_usb_generic_rw(state->d, cmd, 1, (u8 *)status, ++ sizeof(*status), 0); + if (ret < 0) { + err("cinergyt2_fe_read_unc_blocks() Failed! (Error=%d)\n", + ret); +- return ret; ++ goto out; + } +- *unc = le32_to_cpu(status.uncorrected_block_count); +- return 0; ++ *unc = le32_to_cpu(status->uncorrected_block_count); ++ ++out: ++ kfree(cmd); ++ kfree(status); ++ return ret; + } + + static int cinergyt2_fe_read_signal_strength(struct dvb_frontend *fe, + u16 *strength) + { + struct cinergyt2_fe_state *state = fe->demodulator_priv; +- struct dvbt_get_status_msg status; +- char cmd[] = { CINERGYT2_EP1_GET_TUNER_STATUS }; ++ struct dvbt_get_status_msg *status; ++ char *cmd; + int ret; + +- ret = dvb_usb_generic_rw(state->d, cmd, sizeof(cmd), (char *)&status, +- sizeof(status), 0); ++ cmd = kmalloc(1, GFP_KERNEL); ++ if (cmd == NULL) ++ return -ENOMEM; ++ status = kmalloc(sizeof(*status), GFP_KERNEL); ++ if (status == NULL) { ++ kfree(cmd); ++ return -ENOMEM; ++ } ++ ++ cmd[0] = CINERGYT2_EP1_GET_TUNER_STATUS; ++ ++ ret = dvb_usb_generic_rw(state->d, cmd, 1, (char *)status, ++ sizeof(*status), 0); + if (ret < 0) { + err("cinergyt2_fe_read_signal_strength() Failed!" + " (Error=%d)\n", ret); +- return ret; ++ goto out; + } +- *strength = (0xffff - le16_to_cpu(status.gain)); ++ *strength = (0xffff - le16_to_cpu(status->gain)); ++ ++out: ++ kfree(cmd); ++ kfree(status); + return 0; + } + + static int cinergyt2_fe_read_snr(struct dvb_frontend *fe, u16 *snr) + { + struct cinergyt2_fe_state *state = fe->demodulator_priv; +- struct dvbt_get_status_msg status; +- char cmd[] = { CINERGYT2_EP1_GET_TUNER_STATUS }; ++ struct dvbt_get_status_msg *status; ++ char *cmd; + int ret; + +- ret = dvb_usb_generic_rw(state->d, cmd, sizeof(cmd), (char *)&status, +- sizeof(status), 0); ++ cmd = kmalloc(1, GFP_KERNEL); ++ if (cmd == NULL) ++ return -ENOMEM; ++ status = kmalloc(sizeof(*status), GFP_KERNEL); ++ if (status == NULL) { ++ kfree(cmd); ++ return -ENOMEM; ++ } ++ ++ cmd[0] = CINERGYT2_EP1_GET_TUNER_STATUS; ++ ++ ret = dvb_usb_generic_rw(state->d, cmd, 1, (char *)status, ++ sizeof(*status), 0); + if (ret < 0) { + err("cinergyt2_fe_read_snr() Failed! (Error=%d)\n", ret); +- return ret; ++ goto out; + } +- *snr = (status.snr << 8) | status.snr; +- return 0; ++ *snr = (status->snr << 8) | status->snr; ++ ++out: ++ kfree(cmd); ++ kfree(status); ++ return ret; + } + + static int cinergyt2_fe_init(struct dvb_frontend *fe) +@@ -266,35 +339,46 @@ static int cinergyt2_fe_set_frontend(struct dvb_frontend *fe) + { + struct dtv_frontend_properties *fep = &fe->dtv_property_cache; + struct cinergyt2_fe_state *state = fe->demodulator_priv; +- struct dvbt_set_parameters_msg param; +- char result[2]; ++ struct dvbt_set_parameters_msg *param; ++ char *result; + int err; + +- param.cmd = CINERGYT2_EP1_SET_TUNER_PARAMETERS; +- param.tps = cpu_to_le16(compute_tps(fep)); +- param.freq = cpu_to_le32(fep->frequency / 1000); +- param.flags = 0; ++ result = kmalloc(2, GFP_KERNEL); ++ if (result == NULL) ++ return -ENOMEM; ++ param = kmalloc(sizeof(*param), GFP_KERNEL); ++ if (param == NULL) { ++ kfree(result); ++ return -ENOMEM; ++ } ++ ++ param->cmd = CINERGYT2_EP1_SET_TUNER_PARAMETERS; ++ param->tps = cpu_to_le16(compute_tps(fep)); ++ param->freq = cpu_to_le32(fep->frequency / 1000); ++ param->flags = 0; + + switch (fep->bandwidth_hz) { + default: + case 8000000: +- param.bandwidth = 8; ++ param->bandwidth = 8; + break; + case 7000000: +- param.bandwidth = 7; ++ param->bandwidth = 7; + break; + case 6000000: +- param.bandwidth = 6; ++ param->bandwidth = 6; + break; + } + + err = dvb_usb_generic_rw(state->d, +- (char *)¶m, sizeof(param), +- result, sizeof(result), 0); ++ (char *)param, sizeof(*param), ++ result, 2, 0); + if (err < 0) + err("cinergyt2_fe_set_frontend() Failed! err=%d\n", err); + +- return (err < 0) ? err : 0; ++ kfree(result); ++ kfree(param); ++ return err; + } + + static void cinergyt2_fe_release(struct dvb_frontend *fe) +diff --git a/drivers/media/usb/dvb-usb/dvb-usb-firmware.c b/drivers/media/usb/dvb-usb/dvb-usb-firmware.c +index 733a7ff..f8b52e3 100644 +--- a/drivers/media/usb/dvb-usb/dvb-usb-firmware.c ++++ b/drivers/media/usb/dvb-usb/dvb-usb-firmware.c +@@ -35,42 +35,57 @@ static int usb_cypress_writemem(struct usb_device *udev,u16 addr,u8 *data, u8 le + + int usb_cypress_load_firmware(struct usb_device *udev, const struct firmware *fw, int type) + { +- struct hexline hx; +- u8 reset; ++ struct hexline *hx; ++ u8 *reset; + int ret,pos=0; + ++ reset = kmalloc(1, GFP_KERNEL); ++ if (reset == NULL) ++ return -ENOMEM; ++ ++ hx = kmalloc(sizeof(struct hexline), GFP_KERNEL); ++ if (hx == NULL) { ++ kfree(reset); ++ return -ENOMEM; ++ } ++ + /* stop the CPU */ +- reset = 1; +- if ((ret = usb_cypress_writemem(udev,cypress[type].cpu_cs_register,&reset,1)) != 1) ++ reset[0] = 1; ++ if ((ret = usb_cypress_writemem(udev,cypress[type].cpu_cs_register,reset,1)) != 1) + err("could not stop the USB controller CPU."); + +- while ((ret = dvb_usb_get_hexline(fw,&hx,&pos)) > 0) { +- deb_fw("writing to address 0x%04x (buffer: 0x%02x %02x)\n",hx.addr,hx.len,hx.chk); +- ret = usb_cypress_writemem(udev,hx.addr,hx.data,hx.len); ++ while ((ret = dvb_usb_get_hexline(fw,hx,&pos)) > 0) { ++ deb_fw("writing to address 0x%04x (buffer: 0x%02x %02x)\n",hx->addr,hx->len,hx->chk); ++ ret = usb_cypress_writemem(udev,hx->addr,hx->data,hx->len); + +- if (ret != hx.len) { ++ if (ret != hx->len) { + err("error while transferring firmware " + "(transferred size: %d, block size: %d)", +- ret,hx.len); ++ ret,hx->len); + ret = -EINVAL; + break; + } + } + if (ret < 0) { + err("firmware download failed at %d with %d",pos,ret); ++ kfree(reset); ++ kfree(hx); + return ret; + } + + if (ret == 0) { + /* restart the CPU */ +- reset = 0; +- if (ret || usb_cypress_writemem(udev,cypress[type].cpu_cs_register,&reset,1) != 1) { ++ reset[0] = 0; ++ if (ret || usb_cypress_writemem(udev,cypress[type].cpu_cs_register,reset,1) != 1) { + err("could not restart the USB controller CPU."); + ret = -EINVAL; + } + } else + ret = -EIO; + ++ kfree(reset); ++ kfree(hx); ++ + return ret; + } + EXPORT_SYMBOL(usb_cypress_load_firmware); +diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c +index 1a3df10..57997a5 100644 +--- a/drivers/media/usb/dvb-usb/dw2102.c ++++ b/drivers/media/usb/dvb-usb/dw2102.c +@@ -118,7 +118,7 @@ struct su3000_state { + + struct s6x0_state { + int (*old_set_voltage)(struct dvb_frontend *f, fe_sec_voltage_t v); +-}; ++} __no_const; + + /* debug */ + static int dvb_usb_dw2102_debug; +diff --git a/drivers/media/usb/dvb-usb/technisat-usb2.c b/drivers/media/usb/dvb-usb/technisat-usb2.c +index 6b0b8b6..4038398 100644 +--- a/drivers/media/usb/dvb-usb/technisat-usb2.c ++++ b/drivers/media/usb/dvb-usb/technisat-usb2.c +@@ -87,8 +87,11 @@ struct technisat_usb2_state { + static int technisat_usb2_i2c_access(struct usb_device *udev, + u8 device_addr, u8 *tx, u8 txlen, u8 *rx, u8 rxlen) + { +- u8 b[64]; +- int ret, actual_length; ++ u8 *b = kmalloc(64, GFP_KERNEL); ++ int ret, actual_length, error = 0; ++ ++ if (b == NULL) ++ return -ENOMEM; + + deb_i2c("i2c-access: %02x, tx: ", device_addr); + debug_dump(tx, txlen, deb_i2c); +@@ -121,7 +124,8 @@ static int technisat_usb2_i2c_access(struct usb_device *udev, + + if (ret < 0) { + err("i2c-error: out failed %02x = %d", device_addr, ret); +- return -ENODEV; ++ error = -ENODEV; ++ goto out; + } + + ret = usb_bulk_msg(udev, +@@ -129,7 +133,8 @@ static int technisat_usb2_i2c_access(struct usb_device *udev, + b, 64, &actual_length, 1000); + if (ret < 0) { + err("i2c-error: in failed %02x = %d", device_addr, ret); +- return -ENODEV; ++ error = -ENODEV; ++ goto out; + } + + if (b[0] != I2C_STATUS_OK) { +@@ -137,8 +142,10 @@ static int technisat_usb2_i2c_access(struct usb_device *udev, + /* handle tuner-i2c-nak */ + if (!(b[0] == I2C_STATUS_NAK && + device_addr == 0x60 +- /* && device_is_technisat_usb2 */)) +- return -ENODEV; ++ /* && device_is_technisat_usb2 */)) { ++ error = -ENODEV; ++ goto out; ++ } + } + + deb_i2c("status: %d, ", b[0]); +@@ -152,7 +159,9 @@ static int technisat_usb2_i2c_access(struct usb_device *udev, + + deb_i2c("\n"); + +- return 0; ++out: ++ kfree(b); ++ return error; + } + + static int technisat_usb2_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, +@@ -224,14 +233,16 @@ static int technisat_usb2_set_led(struct dvb_usb_device *d, int red, enum techni + { + int ret; + +- u8 led[8] = { +- red ? SET_RED_LED_VENDOR_REQUEST : SET_GREEN_LED_VENDOR_REQUEST, +- 0 +- }; ++ u8 *led = kzalloc(8, GFP_KERNEL); ++ ++ if (led == NULL) ++ return -ENOMEM; + + if (disable_led_control && state != TECH_LED_OFF) + return 0; + ++ led[0] = red ? SET_RED_LED_VENDOR_REQUEST : SET_GREEN_LED_VENDOR_REQUEST; ++ + switch (state) { + case TECH_LED_ON: + led[1] = 0x82; +@@ -263,16 +274,22 @@ static int technisat_usb2_set_led(struct dvb_usb_device *d, int red, enum techni + red ? SET_RED_LED_VENDOR_REQUEST : SET_GREEN_LED_VENDOR_REQUEST, + USB_TYPE_VENDOR | USB_DIR_OUT, + 0, 0, +- led, sizeof(led), 500); ++ led, 8, 500); + + mutex_unlock(&d->i2c_mutex); ++ ++ kfree(led); ++ + return ret; + } + + static int technisat_usb2_set_led_timer(struct dvb_usb_device *d, u8 red, u8 green) + { + int ret; +- u8 b = 0; ++ u8 *b = kzalloc(1, GFP_KERNEL); ++ ++ if (b == NULL) ++ return -ENOMEM; + + if (mutex_lock_interruptible(&d->i2c_mutex) < 0) + return -EAGAIN; +@@ -281,10 +298,12 @@ static int technisat_usb2_set_led_timer(struct dvb_usb_device *d, u8 red, u8 gre + SET_LED_TIMER_DIVIDER_VENDOR_REQUEST, + USB_TYPE_VENDOR | USB_DIR_OUT, + (red << 8) | green, 0, +- &b, 1, 500); ++ b, 1, 500); + + mutex_unlock(&d->i2c_mutex); + ++ kfree(b); ++ + return ret; + } + +@@ -328,7 +347,7 @@ static int technisat_usb2_identify_state(struct usb_device *udev, + struct dvb_usb_device_description **desc, int *cold) + { + int ret; +- u8 version[3]; ++ u8 *version = kmalloc(3, GFP_KERNEL); + + /* first select the interface */ + if (usb_set_interface(udev, 0, 1) != 0) +@@ -338,11 +357,14 @@ static int technisat_usb2_identify_state(struct usb_device *udev, + + *cold = 0; /* by default do not download a firmware - just in case something is wrong */ + ++ if (version == NULL) ++ return 0; ++ + ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + GET_VERSION_INFO_VENDOR_REQUEST, + USB_TYPE_VENDOR | USB_DIR_IN, + 0, 0, +- version, sizeof(version), 500); ++ version, 3, 500); + + if (ret < 0) + *cold = 1; +@@ -351,6 +373,8 @@ static int technisat_usb2_identify_state(struct usb_device *udev, + *cold = 0; + } + ++ kfree(version); ++ + return 0; + } + +@@ -591,10 +615,15 @@ static int technisat_usb2_frontend_attach(struct dvb_usb_adapter *a) + + static int technisat_usb2_get_ir(struct dvb_usb_device *d) + { +- u8 buf[62], *b; ++ u8 *buf, *b; + int ret; + struct ir_raw_event ev; + ++ buf = kmalloc(62, GFP_KERNEL); ++ ++ if (buf == NULL) ++ return -ENOMEM; ++ + buf[0] = GET_IR_DATA_VENDOR_REQUEST; + buf[1] = 0x08; + buf[2] = 0x8f; +@@ -617,16 +646,20 @@ static int technisat_usb2_get_ir(struct dvb_usb_device *d) + GET_IR_DATA_VENDOR_REQUEST, + USB_TYPE_VENDOR | USB_DIR_IN, + 0x8080, 0, +- buf, sizeof(buf), 500); ++ buf, 62, 500); + + unlock: + mutex_unlock(&d->i2c_mutex); + +- if (ret < 0) ++ if (ret < 0) { ++ kfree(buf); + return ret; ++ } + +- if (ret == 1) ++ if (ret == 1) { ++ kfree(buf); + return 0; /* no key pressed */ ++ } + + /* decoding */ + b = buf+1; +@@ -653,6 +686,8 @@ unlock: + + ir_raw_event_handle(d->rc_dev); + ++ kfree(buf); ++ + return 1; + } + +diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +index e502a5f..2a27f40 100644 +--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c ++++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +@@ -427,7 +427,7 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user + * by passing a very big num_planes value */ + uplane = compat_alloc_user_space(num_planes * + sizeof(struct v4l2_plane)); +- kp->m.planes = (__force struct v4l2_plane *)uplane; ++ kp->m.planes = (__force_kernel struct v4l2_plane *)uplane; + + while (--num_planes >= 0) { + ret = get_v4l2_plane32(uplane, uplane32, kp->memory); +@@ -498,7 +498,7 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user + if (num_planes == 0) + return 0; + +- uplane = (__force struct v4l2_plane __user *)kp->m.planes; ++ uplane = (struct v4l2_plane __force_user *)kp->m.planes; + if (get_user(p, &up->m.planes)) + return -EFAULT; + uplane32 = compat_ptr(p); +@@ -562,7 +562,7 @@ static int get_v4l2_framebuffer32(struct v4l2_framebuffer *kp, struct v4l2_frame + get_user(kp->flags, &up->flags) || + copy_from_user(&kp->fmt, &up->fmt, sizeof(up->fmt))) + return -EFAULT; +- kp->base = (__force void *)compat_ptr(tmp); ++ kp->base = (__force_kernel void *)compat_ptr(tmp); + return 0; + } + +@@ -667,7 +667,7 @@ static int get_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext + n * sizeof(struct v4l2_ext_control32))) + return -EFAULT; + kcontrols = compat_alloc_user_space(n * sizeof(struct v4l2_ext_control)); +- kp->controls = (__force struct v4l2_ext_control *)kcontrols; ++ kp->controls = (__force_kernel struct v4l2_ext_control *)kcontrols; + while (--n >= 0) { + u32 id; + +@@ -694,7 +694,7 @@ static int put_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext + { + struct v4l2_ext_control32 __user *ucontrols; + struct v4l2_ext_control __user *kcontrols = +- (__force struct v4l2_ext_control __user *)kp->controls; ++ (struct v4l2_ext_control __force_user *)kp->controls; + int n = kp->count; + compat_caddr_t p; + +@@ -778,7 +778,7 @@ static int get_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up) + get_user(tmp, &up->edid) || + copy_from_user(kp->reserved, up->reserved, sizeof(kp->reserved))) + return -EFAULT; +- kp->edid = (__force u8 *)compat_ptr(tmp); ++ kp->edid = (__force_kernel u8 *)compat_ptr(tmp); + return 0; + } + +diff --git a/drivers/media/v4l2-core/v4l2-device.c b/drivers/media/v4l2-core/v4l2-device.c +index 015f92a..59e311e 100644 +--- a/drivers/media/v4l2-core/v4l2-device.c ++++ b/drivers/media/v4l2-core/v4l2-device.c +@@ -75,9 +75,9 @@ int v4l2_device_put(struct v4l2_device *v4l2_dev) + EXPORT_SYMBOL_GPL(v4l2_device_put); + + int v4l2_device_set_name(struct v4l2_device *v4l2_dev, const char *basename, +- atomic_t *instance) ++ atomic_unchecked_t *instance) + { +- int num = atomic_inc_return(instance) - 1; ++ int num = atomic_inc_return_unchecked(instance) - 1; + int len = strlen(basename); + + if (basename[len - 1] >= '0' && basename[len - 1] <= '9') +diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c +index 9ccb19a..d131468 100644 +--- a/drivers/media/v4l2-core/v4l2-ioctl.c ++++ b/drivers/media/v4l2-core/v4l2-ioctl.c +@@ -2142,7 +2142,8 @@ struct v4l2_ioctl_info { + struct file *file, void *fh, void *p); + } u; + void (*debug)(const void *arg, bool write_only); +-}; ++} __do_const; ++typedef struct v4l2_ioctl_info __no_const v4l2_ioctl_info_no_const; + + /* This control needs a priority check */ + #define INFO_FL_PRIO (1 << 0) +@@ -2326,7 +2327,7 @@ static long __video_do_ioctl(struct file *file, + struct video_device *vfd = video_devdata(file); + const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops; + bool write_only = false; +- struct v4l2_ioctl_info default_info; ++ v4l2_ioctl_info_no_const default_info; + const struct v4l2_ioctl_info *info; + void *fh = file->private_data; + struct v4l2_fh *vfh = NULL; +@@ -2413,7 +2414,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size, + ret = -EINVAL; + break; + } +- *user_ptr = (void __user *)buf->m.planes; ++ *user_ptr = (void __force_user *)buf->m.planes; + *kernel_ptr = (void **)&buf->m.planes; + *array_size = sizeof(struct v4l2_plane) * buf->length; + ret = 1; +@@ -2430,7 +2431,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size, + ret = -EINVAL; + break; + } +- *user_ptr = (void __user *)edid->edid; ++ *user_ptr = (void __force_user *)edid->edid; + *kernel_ptr = (void **)&edid->edid; + *array_size = edid->blocks * 128; + ret = 1; +@@ -2448,7 +2449,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size, + ret = -EINVAL; + break; + } +- *user_ptr = (void __user *)ctrls->controls; ++ *user_ptr = (void __force_user *)ctrls->controls; + *kernel_ptr = (void **)&ctrls->controls; + *array_size = sizeof(struct v4l2_ext_control) + * ctrls->count; +@@ -2549,7 +2550,7 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg, + } + + if (has_array_args) { +- *kernel_ptr = (void __force *)user_ptr; ++ *kernel_ptr = (void __force_kernel *)user_ptr; + if (copy_to_user(user_ptr, mbuf, array_size)) + err = -EFAULT; + goto out_array_args; +diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c +index 187f836..679544b 100644 +--- a/drivers/message/fusion/mptbase.c ++++ b/drivers/message/fusion/mptbase.c +@@ -6746,8 +6746,13 @@ static int mpt_iocinfo_proc_show(struct seq_file *m, void *v) + seq_printf(m, " MaxChainDepth = 0x%02x frames\n", ioc->facts.MaxChainDepth); + seq_printf(m, " MinBlockSize = 0x%02x bytes\n", 4*ioc->facts.BlockSize); + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ seq_printf(m, " RequestFrames @ 0x%p (Dma @ 0x%p)\n", NULL, NULL); ++#else + seq_printf(m, " RequestFrames @ 0x%p (Dma @ 0x%p)\n", + (void *)ioc->req_frames, (void *)(ulong)ioc->req_frames_dma); ++#endif ++ + /* + * Rounding UP to nearest 4-kB boundary here... + */ +@@ -6760,7 +6765,11 @@ static int mpt_iocinfo_proc_show(struct seq_file *m, void *v) + ioc->facts.GlobalCredits); + + seq_printf(m, " Frames @ 0x%p (Dma @ 0x%p)\n", ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL, NULL); ++#else + (void *)ioc->alloc, (void *)(ulong)ioc->alloc_dma); ++#endif + sz = (ioc->reply_sz * ioc->reply_depth) + 128; + seq_printf(m, " {CurRepSz=%d} x {CurRepDepth=%d} = %d bytes ^= 0x%x\n", + ioc->reply_sz, ioc->reply_depth, ioc->reply_sz*ioc->reply_depth, sz); +diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c +index 0707fa2..70ca794 100644 +--- a/drivers/message/fusion/mptsas.c ++++ b/drivers/message/fusion/mptsas.c +@@ -446,6 +446,23 @@ mptsas_is_end_device(struct mptsas_devinfo * attached) + return 0; + } + ++static inline void ++mptsas_set_rphy(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy) ++{ ++ if (phy_info->port_details) { ++ phy_info->port_details->rphy = rphy; ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_rphy_add: rphy=%p\n", ++ ioc->name, rphy)); ++ } ++ ++ if (rphy) { ++ dsaswideprintk(ioc, dev_printk(KERN_DEBUG, ++ &rphy->dev, MYIOC_s_FMT "add:", ioc->name)); ++ dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "rphy=%p release=%p\n", ++ ioc->name, rphy, rphy->dev.release)); ++ } ++} ++ + /* no mutex */ + static void + mptsas_port_delete(MPT_ADAPTER *ioc, struct mptsas_portinfo_details * port_details) +@@ -484,23 +501,6 @@ mptsas_get_rphy(struct mptsas_phyinfo *phy_info) + return NULL; + } + +-static inline void +-mptsas_set_rphy(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy) +-{ +- if (phy_info->port_details) { +- phy_info->port_details->rphy = rphy; +- dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_rphy_add: rphy=%p\n", +- ioc->name, rphy)); +- } +- +- if (rphy) { +- dsaswideprintk(ioc, dev_printk(KERN_DEBUG, +- &rphy->dev, MYIOC_s_FMT "add:", ioc->name)); +- dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "rphy=%p release=%p\n", +- ioc->name, rphy, rphy->dev.release)); +- } +-} +- + static inline struct sas_port * + mptsas_get_port(struct mptsas_phyinfo *phy_info) + { +diff --git a/drivers/message/i2o/i2o_proc.c b/drivers/message/i2o/i2o_proc.c +index b7d87cd..3fb36da 100644 +--- a/drivers/message/i2o/i2o_proc.c ++++ b/drivers/message/i2o/i2o_proc.c +@@ -255,12 +255,6 @@ static char *scsi_devices[] = { + "Array Controller Device" + }; + +-static char *chtostr(char *tmp, u8 *chars, int n) +-{ +- tmp[0] = 0; +- return strncat(tmp, (char *)chars, n); +-} +- + static int i2o_report_query_status(struct seq_file *seq, int block_status, + char *group) + { +@@ -707,9 +701,9 @@ static int i2o_seq_show_status(struct seq_file *seq, void *v) + static int i2o_seq_show_hw(struct seq_file *seq, void *v) + { + struct i2o_controller *c = (struct i2o_controller *)seq->private; +- static u32 work32[5]; +- static u8 *work8 = (u8 *) work32; +- static u16 *work16 = (u16 *) work32; ++ u32 work32[5]; ++ u8 *work8 = (u8 *) work32; ++ u16 *work16 = (u16 *) work32; + int token; + u32 hwcap; + +@@ -790,7 +784,6 @@ static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v) + } *result; + + i2o_exec_execute_ddm_table ddm_table; +- char tmp[28 + 1]; + + result = kmalloc(sizeof(*result), GFP_KERNEL); + if (!result) +@@ -825,8 +818,7 @@ static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v) + + seq_printf(seq, "%-#7x", ddm_table.i2o_vendor_id); + seq_printf(seq, "%-#8x", ddm_table.module_id); +- seq_printf(seq, "%-29s", +- chtostr(tmp, ddm_table.module_name_version, 28)); ++ seq_printf(seq, "%-.28s", ddm_table.module_name_version); + seq_printf(seq, "%9d ", ddm_table.data_size); + seq_printf(seq, "%8d", ddm_table.code_size); + +@@ -893,7 +885,6 @@ static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v) + + i2o_driver_result_table *result; + i2o_driver_store_table *dst; +- char tmp[28 + 1]; + + result = kmalloc(sizeof(i2o_driver_result_table), GFP_KERNEL); + if (result == NULL) +@@ -928,9 +919,8 @@ static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v) + + seq_printf(seq, "%-#7x", dst->i2o_vendor_id); + seq_printf(seq, "%-#8x", dst->module_id); +- seq_printf(seq, "%-29s", +- chtostr(tmp, dst->module_name_version, 28)); +- seq_printf(seq, "%-9s", chtostr(tmp, dst->date, 8)); ++ seq_printf(seq, "%-.28s", dst->module_name_version); ++ seq_printf(seq, "%-.8s", dst->date); + seq_printf(seq, "%8d ", dst->module_size); + seq_printf(seq, "%8d ", dst->mpb_size); + seq_printf(seq, "0x%04x", dst->module_flags); +@@ -1246,11 +1236,10 @@ static int i2o_seq_show_authorized_users(struct seq_file *seq, void *v) + static int i2o_seq_show_dev_identity(struct seq_file *seq, void *v) + { + struct i2o_device *d = (struct i2o_device *)seq->private; +- static u32 work32[128]; // allow for "stuff" + up to 256 byte (max) serial number ++ u32 work32[128]; // allow for "stuff" + up to 256 byte (max) serial number + // == (allow) 512d bytes (max) +- static u16 *work16 = (u16 *) work32; ++ u16 *work16 = (u16 *) work32; + int token; +- char tmp[16 + 1]; + + token = i2o_parm_field_get(d, 0xF100, -1, &work32, sizeof(work32)); + +@@ -1262,14 +1251,10 @@ static int i2o_seq_show_dev_identity(struct seq_file *seq, void *v) + seq_printf(seq, "Device Class : %s\n", i2o_get_class_name(work16[0])); + seq_printf(seq, "Owner TID : %0#5x\n", work16[2]); + seq_printf(seq, "Parent TID : %0#5x\n", work16[3]); +- seq_printf(seq, "Vendor info : %s\n", +- chtostr(tmp, (u8 *) (work32 + 2), 16)); +- seq_printf(seq, "Product info : %s\n", +- chtostr(tmp, (u8 *) (work32 + 6), 16)); +- seq_printf(seq, "Description : %s\n", +- chtostr(tmp, (u8 *) (work32 + 10), 16)); +- seq_printf(seq, "Product rev. : %s\n", +- chtostr(tmp, (u8 *) (work32 + 14), 8)); ++ seq_printf(seq, "Vendor info : %.16s\n", (u8 *) (work32 + 2)); ++ seq_printf(seq, "Product info : %.16s\n", (u8 *) (work32 + 6)); ++ seq_printf(seq, "Description : %.16s\n", (u8 *) (work32 + 10)); ++ seq_printf(seq, "Product rev. : %.8s\n", (u8 *) (work32 + 14)); + + seq_printf(seq, "Serial number : "); + print_serial_number(seq, (u8 *) (work32 + 16), +@@ -1306,8 +1291,6 @@ static int i2o_seq_show_ddm_identity(struct seq_file *seq, void *v) + u8 pad[256]; // allow up to 256 byte (max) serial number + } result; + +- char tmp[24 + 1]; +- + token = i2o_parm_field_get(d, 0xF101, -1, &result, sizeof(result)); + + if (token < 0) { +@@ -1316,10 +1299,8 @@ static int i2o_seq_show_ddm_identity(struct seq_file *seq, void *v) + } + + seq_printf(seq, "Registering DDM TID : 0x%03x\n", result.ddm_tid); +- seq_printf(seq, "Module name : %s\n", +- chtostr(tmp, result.module_name, 24)); +- seq_printf(seq, "Module revision : %s\n", +- chtostr(tmp, result.module_rev, 8)); ++ seq_printf(seq, "Module name : %.24s\n", result.module_name); ++ seq_printf(seq, "Module revision : %.8s\n", result.module_rev); + + seq_printf(seq, "Serial number : "); + print_serial_number(seq, result.serial_number, sizeof(result) - 36); +@@ -1343,8 +1324,6 @@ static int i2o_seq_show_uinfo(struct seq_file *seq, void *v) + u8 instance_number[4]; + } result; + +- char tmp[64 + 1]; +- + token = i2o_parm_field_get(d, 0xF102, -1, &result, sizeof(result)); + + if (token < 0) { +@@ -1352,14 +1331,10 @@ static int i2o_seq_show_uinfo(struct seq_file *seq, void *v) + return 0; + } + +- seq_printf(seq, "Device name : %s\n", +- chtostr(tmp, result.device_name, 64)); +- seq_printf(seq, "Service name : %s\n", +- chtostr(tmp, result.service_name, 64)); +- seq_printf(seq, "Physical name : %s\n", +- chtostr(tmp, result.physical_location, 64)); +- seq_printf(seq, "Instance number : %s\n", +- chtostr(tmp, result.instance_number, 4)); ++ seq_printf(seq, "Device name : %.64s\n", result.device_name); ++ seq_printf(seq, "Service name : %.64s\n", result.service_name); ++ seq_printf(seq, "Physical name : %.64s\n", result.physical_location); ++ seq_printf(seq, "Instance number : %.4s\n", result.instance_number); + + return 0; + } +@@ -1368,9 +1343,9 @@ static int i2o_seq_show_uinfo(struct seq_file *seq, void *v) + static int i2o_seq_show_sgl_limits(struct seq_file *seq, void *v) + { + struct i2o_device *d = (struct i2o_device *)seq->private; +- static u32 work32[12]; +- static u16 *work16 = (u16 *) work32; +- static u8 *work8 = (u8 *) work32; ++ u32 work32[12]; ++ u16 *work16 = (u16 *) work32; ++ u8 *work8 = (u8 *) work32; + int token; + + token = i2o_parm_field_get(d, 0xF103, -1, &work32, sizeof(work32)); +diff --git a/drivers/message/i2o/iop.c b/drivers/message/i2o/iop.c +index 92752fb..a7494f6 100644 +--- a/drivers/message/i2o/iop.c ++++ b/drivers/message/i2o/iop.c +@@ -111,10 +111,10 @@ u32 i2o_cntxt_list_add(struct i2o_controller * c, void *ptr) + + spin_lock_irqsave(&c->context_list_lock, flags); + +- if (unlikely(atomic_inc_and_test(&c->context_list_counter))) +- atomic_inc(&c->context_list_counter); ++ if (unlikely(atomic_inc_and_test_unchecked(&c->context_list_counter))) ++ atomic_inc_unchecked(&c->context_list_counter); + +- entry->context = atomic_read(&c->context_list_counter); ++ entry->context = atomic_read_unchecked(&c->context_list_counter); + + list_add(&entry->list, &c->context_list); + +@@ -1076,7 +1076,7 @@ struct i2o_controller *i2o_iop_alloc(void) + + #if BITS_PER_LONG == 64 + spin_lock_init(&c->context_list_lock); +- atomic_set(&c->context_list_counter, 0); ++ atomic_set_unchecked(&c->context_list_counter, 0); + INIT_LIST_HEAD(&c->context_list); + #endif + +diff --git a/drivers/mfd/ab8500-debugfs.c b/drivers/mfd/ab8500-debugfs.c +index b2c7e3b..85aa4764 100644 +--- a/drivers/mfd/ab8500-debugfs.c ++++ b/drivers/mfd/ab8500-debugfs.c +@@ -100,7 +100,7 @@ static int irq_last; + static u32 *irq_count; + static int num_irqs; + +-static struct device_attribute **dev_attr; ++static device_attribute_no_const **dev_attr; + static char **event_name; + + static u8 avg_sample = SAMPLE_16; +diff --git a/drivers/mfd/kempld-core.c b/drivers/mfd/kempld-core.c +index 177fa31..e78451f 100644 +--- a/drivers/mfd/kempld-core.c ++++ b/drivers/mfd/kempld-core.c +@@ -500,7 +500,7 @@ static struct platform_driver kempld_driver = { + .remove = kempld_remove, + }; + +-static struct dmi_system_id kempld_dmi_table[] __initdata = { ++static const struct dmi_system_id kempld_dmi_table[] __initconst = { + { + .ident = "BHL6", + .matches = { +diff --git a/drivers/mfd/max8925-i2c.c b/drivers/mfd/max8925-i2c.c +index c880c89..45a7c68 100644 +--- a/drivers/mfd/max8925-i2c.c ++++ b/drivers/mfd/max8925-i2c.c +@@ -152,7 +152,7 @@ static int max8925_probe(struct i2c_client *client, + const struct i2c_device_id *id) + { + struct max8925_platform_data *pdata = dev_get_platdata(&client->dev); +- static struct max8925_chip *chip; ++ struct max8925_chip *chip; + struct device_node *node = client->dev.of_node; + + if (node && !pdata) { +diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c +index 7612d89..70549c2 100644 +--- a/drivers/mfd/tps65910.c ++++ b/drivers/mfd/tps65910.c +@@ -230,7 +230,7 @@ static int tps65910_irq_init(struct tps65910 *tps65910, int irq, + struct tps65910_platform_data *pdata) + { + int ret = 0; +- static struct regmap_irq_chip *tps6591x_irqs_chip; ++ struct regmap_irq_chip *tps6591x_irqs_chip; + + if (!irq) { + dev_warn(tps65910->dev, "No interrupt support, no core IRQ\n"); +diff --git a/drivers/mfd/twl4030-irq.c b/drivers/mfd/twl4030-irq.c +index 1b772ef..01e77d33 100644 +--- a/drivers/mfd/twl4030-irq.c ++++ b/drivers/mfd/twl4030-irq.c +@@ -34,6 +34,7 @@ + #include <linux/of.h> + #include <linux/irqdomain.h> + #include <linux/i2c/twl.h> ++#include <asm/pgtable.h> + + #include "twl-core.h" + +@@ -729,10 +730,12 @@ int twl4030_init_irq(struct device *dev, int irq_num) + * Install an irq handler for each of the SIH modules; + * clone dummy irq_chip since PIH can't *do* anything + */ +- twl4030_irq_chip = dummy_irq_chip; +- twl4030_irq_chip.name = "twl4030"; ++ pax_open_kernel(); ++ memcpy((void *)&twl4030_irq_chip, &dummy_irq_chip, sizeof twl4030_irq_chip); ++ *(const char **)&twl4030_irq_chip.name = "twl4030"; + +- twl4030_sih_irq_chip.irq_ack = dummy_irq_chip.irq_ack; ++ *(void **)&twl4030_sih_irq_chip.irq_ack = dummy_irq_chip.irq_ack; ++ pax_close_kernel(); + + for (i = irq_base; i < irq_end; i++) { + irq_set_chip_and_handler(i, &twl4030_irq_chip, +diff --git a/drivers/misc/c2port/core.c b/drivers/misc/c2port/core.c +index 464419b..64bae8d 100644 +--- a/drivers/misc/c2port/core.c ++++ b/drivers/misc/c2port/core.c +@@ -922,7 +922,9 @@ struct c2port_device *c2port_device_register(char *name, + goto error_idr_alloc; + c2dev->id = ret; + +- bin_attr_flash_data.size = ops->blocks_num * ops->block_size; ++ pax_open_kernel(); ++ *(size_t *)&bin_attr_flash_data.size = ops->blocks_num * ops->block_size; ++ pax_close_kernel(); + + c2dev->dev = device_create(c2port_class, NULL, 0, c2dev, + "c2port%d", c2dev->id); +diff --git a/drivers/misc/eeprom/sunxi_sid.c b/drivers/misc/eeprom/sunxi_sid.c +index 3f2b625..945e179 100644 +--- a/drivers/misc/eeprom/sunxi_sid.c ++++ b/drivers/misc/eeprom/sunxi_sid.c +@@ -126,7 +126,9 @@ static int sunxi_sid_probe(struct platform_device *pdev) + + platform_set_drvdata(pdev, sid_data); + +- sid_bin_attr.size = sid_data->keysize; ++ pax_open_kernel(); ++ *(size_t *)&sid_bin_attr.size = sid_data->keysize; ++ pax_close_kernel(); + if (device_create_bin_file(&pdev->dev, &sid_bin_attr)) + return -ENODEV; + +diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c +index 36f5d52..32311c3 100644 +--- a/drivers/misc/kgdbts.c ++++ b/drivers/misc/kgdbts.c +@@ -834,7 +834,7 @@ static void run_plant_and_detach_test(int is_early) + char before[BREAK_INSTR_SIZE]; + char after[BREAK_INSTR_SIZE]; + +- probe_kernel_read(before, (char *)kgdbts_break_test, ++ probe_kernel_read(before, ktla_ktva((char *)kgdbts_break_test), + BREAK_INSTR_SIZE); + init_simple_test(); + ts.tst = plant_and_detach_test; +@@ -842,7 +842,7 @@ static void run_plant_and_detach_test(int is_early) + /* Activate test with initial breakpoint */ + if (!is_early) + kgdb_breakpoint(); +- probe_kernel_read(after, (char *)kgdbts_break_test, ++ probe_kernel_read(after, ktla_ktva((char *)kgdbts_break_test), + BREAK_INSTR_SIZE); + if (memcmp(before, after, BREAK_INSTR_SIZE)) { + printk(KERN_CRIT "kgdbts: ERROR kgdb corrupted memory\n"); +diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c +index 3ef4627..8d00486 100644 +--- a/drivers/misc/lis3lv02d/lis3lv02d.c ++++ b/drivers/misc/lis3lv02d/lis3lv02d.c +@@ -497,7 +497,7 @@ static irqreturn_t lis302dl_interrupt(int irq, void *data) + * the lid is closed. This leads to interrupts as soon as a little move + * is done. + */ +- atomic_inc(&lis3->count); ++ atomic_inc_unchecked(&lis3->count); + + wake_up_interruptible(&lis3->misc_wait); + kill_fasync(&lis3->async_queue, SIGIO, POLL_IN); +@@ -583,7 +583,7 @@ static int lis3lv02d_misc_open(struct inode *inode, struct file *file) + if (lis3->pm_dev) + pm_runtime_get_sync(lis3->pm_dev); + +- atomic_set(&lis3->count, 0); ++ atomic_set_unchecked(&lis3->count, 0); + return 0; + } + +@@ -615,7 +615,7 @@ static ssize_t lis3lv02d_misc_read(struct file *file, char __user *buf, + add_wait_queue(&lis3->misc_wait, &wait); + while (true) { + set_current_state(TASK_INTERRUPTIBLE); +- data = atomic_xchg(&lis3->count, 0); ++ data = atomic_xchg_unchecked(&lis3->count, 0); + if (data) + break; + +@@ -656,7 +656,7 @@ static unsigned int lis3lv02d_misc_poll(struct file *file, poll_table *wait) + struct lis3lv02d, miscdev); + + poll_wait(file, &lis3->misc_wait, wait); +- if (atomic_read(&lis3->count)) ++ if (atomic_read_unchecked(&lis3->count)) + return POLLIN | POLLRDNORM; + return 0; + } +diff --git a/drivers/misc/lis3lv02d/lis3lv02d.h b/drivers/misc/lis3lv02d/lis3lv02d.h +index c439c82..1f20f57 100644 +--- a/drivers/misc/lis3lv02d/lis3lv02d.h ++++ b/drivers/misc/lis3lv02d/lis3lv02d.h +@@ -297,7 +297,7 @@ struct lis3lv02d { + struct input_polled_dev *idev; /* input device */ + struct platform_device *pdev; /* platform device */ + struct regulator_bulk_data regulators[2]; +- atomic_t count; /* interrupt count after last read */ ++ atomic_unchecked_t count; /* interrupt count after last read */ + union axis_conversion ac; /* hw -> logical axis */ + int mapped_btns[3]; + +diff --git a/drivers/misc/sgi-gru/gruhandles.c b/drivers/misc/sgi-gru/gruhandles.c +index 2f30bad..c4c13d0 100644 +--- a/drivers/misc/sgi-gru/gruhandles.c ++++ b/drivers/misc/sgi-gru/gruhandles.c +@@ -44,8 +44,8 @@ static void update_mcs_stats(enum mcs_op op, unsigned long clks) + unsigned long nsec; + + nsec = CLKS2NSEC(clks); +- atomic_long_inc(&mcs_op_statistics[op].count); +- atomic_long_add(nsec, &mcs_op_statistics[op].total); ++ atomic_long_inc_unchecked(&mcs_op_statistics[op].count); ++ atomic_long_add_unchecked(nsec, &mcs_op_statistics[op].total); + if (mcs_op_statistics[op].max < nsec) + mcs_op_statistics[op].max = nsec; + } +diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c +index 4f76359..cdfcb2e 100644 +--- a/drivers/misc/sgi-gru/gruprocfs.c ++++ b/drivers/misc/sgi-gru/gruprocfs.c +@@ -32,9 +32,9 @@ + + #define printstat(s, f) printstat_val(s, &gru_stats.f, #f) + +-static void printstat_val(struct seq_file *s, atomic_long_t *v, char *id) ++static void printstat_val(struct seq_file *s, atomic_long_unchecked_t *v, char *id) + { +- unsigned long val = atomic_long_read(v); ++ unsigned long val = atomic_long_read_unchecked(v); + + seq_printf(s, "%16lu %s\n", val, id); + } +@@ -134,8 +134,8 @@ static int mcs_statistics_show(struct seq_file *s, void *p) + + seq_printf(s, "%-20s%12s%12s%12s\n", "#id", "count", "aver-clks", "max-clks"); + for (op = 0; op < mcsop_last; op++) { +- count = atomic_long_read(&mcs_op_statistics[op].count); +- total = atomic_long_read(&mcs_op_statistics[op].total); ++ count = atomic_long_read_unchecked(&mcs_op_statistics[op].count); ++ total = atomic_long_read_unchecked(&mcs_op_statistics[op].total); + max = mcs_op_statistics[op].max; + seq_printf(s, "%-20s%12ld%12ld%12ld\n", id[op], count, + count ? total / count : 0, max); +diff --git a/drivers/misc/sgi-gru/grutables.h b/drivers/misc/sgi-gru/grutables.h +index 5c3ce24..4915ccb 100644 +--- a/drivers/misc/sgi-gru/grutables.h ++++ b/drivers/misc/sgi-gru/grutables.h +@@ -167,82 +167,82 @@ extern unsigned int gru_max_gids; + * GRU statistics. + */ + struct gru_stats_s { +- atomic_long_t vdata_alloc; +- atomic_long_t vdata_free; +- atomic_long_t gts_alloc; +- atomic_long_t gts_free; +- atomic_long_t gms_alloc; +- atomic_long_t gms_free; +- atomic_long_t gts_double_allocate; +- atomic_long_t assign_context; +- atomic_long_t assign_context_failed; +- atomic_long_t free_context; +- atomic_long_t load_user_context; +- atomic_long_t load_kernel_context; +- atomic_long_t lock_kernel_context; +- atomic_long_t unlock_kernel_context; +- atomic_long_t steal_user_context; +- atomic_long_t steal_kernel_context; +- atomic_long_t steal_context_failed; +- atomic_long_t nopfn; +- atomic_long_t asid_new; +- atomic_long_t asid_next; +- atomic_long_t asid_wrap; +- atomic_long_t asid_reuse; +- atomic_long_t intr; +- atomic_long_t intr_cbr; +- atomic_long_t intr_tfh; +- atomic_long_t intr_spurious; +- atomic_long_t intr_mm_lock_failed; +- atomic_long_t call_os; +- atomic_long_t call_os_wait_queue; +- atomic_long_t user_flush_tlb; +- atomic_long_t user_unload_context; +- atomic_long_t user_exception; +- atomic_long_t set_context_option; +- atomic_long_t check_context_retarget_intr; +- atomic_long_t check_context_unload; +- atomic_long_t tlb_dropin; +- atomic_long_t tlb_preload_page; +- atomic_long_t tlb_dropin_fail_no_asid; +- atomic_long_t tlb_dropin_fail_upm; +- atomic_long_t tlb_dropin_fail_invalid; +- atomic_long_t tlb_dropin_fail_range_active; +- atomic_long_t tlb_dropin_fail_idle; +- atomic_long_t tlb_dropin_fail_fmm; +- atomic_long_t tlb_dropin_fail_no_exception; +- atomic_long_t tfh_stale_on_fault; +- atomic_long_t mmu_invalidate_range; +- atomic_long_t mmu_invalidate_page; +- atomic_long_t flush_tlb; +- atomic_long_t flush_tlb_gru; +- atomic_long_t flush_tlb_gru_tgh; +- atomic_long_t flush_tlb_gru_zero_asid; +- +- atomic_long_t copy_gpa; +- atomic_long_t read_gpa; +- +- atomic_long_t mesq_receive; +- atomic_long_t mesq_receive_none; +- atomic_long_t mesq_send; +- atomic_long_t mesq_send_failed; +- atomic_long_t mesq_noop; +- atomic_long_t mesq_send_unexpected_error; +- atomic_long_t mesq_send_lb_overflow; +- atomic_long_t mesq_send_qlimit_reached; +- atomic_long_t mesq_send_amo_nacked; +- atomic_long_t mesq_send_put_nacked; +- atomic_long_t mesq_page_overflow; +- atomic_long_t mesq_qf_locked; +- atomic_long_t mesq_qf_noop_not_full; +- atomic_long_t mesq_qf_switch_head_failed; +- atomic_long_t mesq_qf_unexpected_error; +- atomic_long_t mesq_noop_unexpected_error; +- atomic_long_t mesq_noop_lb_overflow; +- atomic_long_t mesq_noop_qlimit_reached; +- atomic_long_t mesq_noop_amo_nacked; +- atomic_long_t mesq_noop_put_nacked; +- atomic_long_t mesq_noop_page_overflow; ++ atomic_long_unchecked_t vdata_alloc; ++ atomic_long_unchecked_t vdata_free; ++ atomic_long_unchecked_t gts_alloc; ++ atomic_long_unchecked_t gts_free; ++ atomic_long_unchecked_t gms_alloc; ++ atomic_long_unchecked_t gms_free; ++ atomic_long_unchecked_t gts_double_allocate; ++ atomic_long_unchecked_t assign_context; ++ atomic_long_unchecked_t assign_context_failed; ++ atomic_long_unchecked_t free_context; ++ atomic_long_unchecked_t load_user_context; ++ atomic_long_unchecked_t load_kernel_context; ++ atomic_long_unchecked_t lock_kernel_context; ++ atomic_long_unchecked_t unlock_kernel_context; ++ atomic_long_unchecked_t steal_user_context; ++ atomic_long_unchecked_t steal_kernel_context; ++ atomic_long_unchecked_t steal_context_failed; ++ atomic_long_unchecked_t nopfn; ++ atomic_long_unchecked_t asid_new; ++ atomic_long_unchecked_t asid_next; ++ atomic_long_unchecked_t asid_wrap; ++ atomic_long_unchecked_t asid_reuse; ++ atomic_long_unchecked_t intr; ++ atomic_long_unchecked_t intr_cbr; ++ atomic_long_unchecked_t intr_tfh; ++ atomic_long_unchecked_t intr_spurious; ++ atomic_long_unchecked_t intr_mm_lock_failed; ++ atomic_long_unchecked_t call_os; ++ atomic_long_unchecked_t call_os_wait_queue; ++ atomic_long_unchecked_t user_flush_tlb; ++ atomic_long_unchecked_t user_unload_context; ++ atomic_long_unchecked_t user_exception; ++ atomic_long_unchecked_t set_context_option; ++ atomic_long_unchecked_t check_context_retarget_intr; ++ atomic_long_unchecked_t check_context_unload; ++ atomic_long_unchecked_t tlb_dropin; ++ atomic_long_unchecked_t tlb_preload_page; ++ atomic_long_unchecked_t tlb_dropin_fail_no_asid; ++ atomic_long_unchecked_t tlb_dropin_fail_upm; ++ atomic_long_unchecked_t tlb_dropin_fail_invalid; ++ atomic_long_unchecked_t tlb_dropin_fail_range_active; ++ atomic_long_unchecked_t tlb_dropin_fail_idle; ++ atomic_long_unchecked_t tlb_dropin_fail_fmm; ++ atomic_long_unchecked_t tlb_dropin_fail_no_exception; ++ atomic_long_unchecked_t tfh_stale_on_fault; ++ atomic_long_unchecked_t mmu_invalidate_range; ++ atomic_long_unchecked_t mmu_invalidate_page; ++ atomic_long_unchecked_t flush_tlb; ++ atomic_long_unchecked_t flush_tlb_gru; ++ atomic_long_unchecked_t flush_tlb_gru_tgh; ++ atomic_long_unchecked_t flush_tlb_gru_zero_asid; ++ ++ atomic_long_unchecked_t copy_gpa; ++ atomic_long_unchecked_t read_gpa; ++ ++ atomic_long_unchecked_t mesq_receive; ++ atomic_long_unchecked_t mesq_receive_none; ++ atomic_long_unchecked_t mesq_send; ++ atomic_long_unchecked_t mesq_send_failed; ++ atomic_long_unchecked_t mesq_noop; ++ atomic_long_unchecked_t mesq_send_unexpected_error; ++ atomic_long_unchecked_t mesq_send_lb_overflow; ++ atomic_long_unchecked_t mesq_send_qlimit_reached; ++ atomic_long_unchecked_t mesq_send_amo_nacked; ++ atomic_long_unchecked_t mesq_send_put_nacked; ++ atomic_long_unchecked_t mesq_page_overflow; ++ atomic_long_unchecked_t mesq_qf_locked; ++ atomic_long_unchecked_t mesq_qf_noop_not_full; ++ atomic_long_unchecked_t mesq_qf_switch_head_failed; ++ atomic_long_unchecked_t mesq_qf_unexpected_error; ++ atomic_long_unchecked_t mesq_noop_unexpected_error; ++ atomic_long_unchecked_t mesq_noop_lb_overflow; ++ atomic_long_unchecked_t mesq_noop_qlimit_reached; ++ atomic_long_unchecked_t mesq_noop_amo_nacked; ++ atomic_long_unchecked_t mesq_noop_put_nacked; ++ atomic_long_unchecked_t mesq_noop_page_overflow; + + }; + +@@ -251,8 +251,8 @@ enum mcs_op {cchop_allocate, cchop_start, cchop_interrupt, cchop_interrupt_sync, + tghop_invalidate, mcsop_last}; + + struct mcs_op_statistic { +- atomic_long_t count; +- atomic_long_t total; ++ atomic_long_unchecked_t count; ++ atomic_long_unchecked_t total; + unsigned long max; + }; + +@@ -275,7 +275,7 @@ extern struct mcs_op_statistic mcs_op_statistics[mcsop_last]; + + #define STAT(id) do { \ + if (gru_options & OPT_STATS) \ +- atomic_long_inc(&gru_stats.id); \ ++ atomic_long_inc_unchecked(&gru_stats.id); \ + } while (0) + + #ifdef CONFIG_SGI_GRU_DEBUG +diff --git a/drivers/misc/sgi-xp/xp.h b/drivers/misc/sgi-xp/xp.h +index c862cd4..0d176fe 100644 +--- a/drivers/misc/sgi-xp/xp.h ++++ b/drivers/misc/sgi-xp/xp.h +@@ -288,7 +288,7 @@ struct xpc_interface { + xpc_notify_func, void *); + void (*received) (short, int, void *); + enum xp_retval (*partid_to_nasids) (short, void *); +-}; ++} __no_const; + + extern struct xpc_interface xpc_interface; + +diff --git a/drivers/misc/sgi-xp/xp_main.c b/drivers/misc/sgi-xp/xp_main.c +index 01be66d..e3a0c7e 100644 +--- a/drivers/misc/sgi-xp/xp_main.c ++++ b/drivers/misc/sgi-xp/xp_main.c +@@ -78,13 +78,13 @@ xpc_notloaded(void) + } + + struct xpc_interface xpc_interface = { +- (void (*)(int))xpc_notloaded, +- (void (*)(int))xpc_notloaded, +- (enum xp_retval(*)(short, int, u32, void *, u16))xpc_notloaded, +- (enum xp_retval(*)(short, int, u32, void *, u16, xpc_notify_func, ++ .connect = (void (*)(int))xpc_notloaded, ++ .disconnect = (void (*)(int))xpc_notloaded, ++ .send = (enum xp_retval(*)(short, int, u32, void *, u16))xpc_notloaded, ++ .send_notify = (enum xp_retval(*)(short, int, u32, void *, u16, xpc_notify_func, + void *))xpc_notloaded, +- (void (*)(short, int, void *))xpc_notloaded, +- (enum xp_retval(*)(short, void *))xpc_notloaded ++ .received = (void (*)(short, int, void *))xpc_notloaded, ++ .partid_to_nasids = (enum xp_retval(*)(short, void *))xpc_notloaded + }; + EXPORT_SYMBOL_GPL(xpc_interface); + +diff --git a/drivers/misc/sgi-xp/xpc.h b/drivers/misc/sgi-xp/xpc.h +index b94d5f7..7f494c5 100644 +--- a/drivers/misc/sgi-xp/xpc.h ++++ b/drivers/misc/sgi-xp/xpc.h +@@ -835,6 +835,7 @@ struct xpc_arch_operations { + void (*received_payload) (struct xpc_channel *, void *); + void (*notify_senders_of_disconnect) (struct xpc_channel *); + }; ++typedef struct xpc_arch_operations __no_const xpc_arch_operations_no_const; + + /* struct xpc_partition act_state values (for XPC HB) */ + +@@ -876,7 +877,7 @@ extern struct xpc_registration xpc_registrations[]; + /* found in xpc_main.c */ + extern struct device *xpc_part; + extern struct device *xpc_chan; +-extern struct xpc_arch_operations xpc_arch_ops; ++extern xpc_arch_operations_no_const xpc_arch_ops; + extern int xpc_disengage_timelimit; + extern int xpc_disengage_timedout; + extern int xpc_activate_IRQ_rcvd; +diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c +index 82dc574..8539ab2 100644 +--- a/drivers/misc/sgi-xp/xpc_main.c ++++ b/drivers/misc/sgi-xp/xpc_main.c +@@ -166,7 +166,7 @@ static struct notifier_block xpc_die_notifier = { + .notifier_call = xpc_system_die, + }; + +-struct xpc_arch_operations xpc_arch_ops; ++xpc_arch_operations_no_const xpc_arch_ops; + + /* + * Timer function to enforce the timelimit on the partition disengage. +@@ -1210,7 +1210,7 @@ xpc_system_die(struct notifier_block *nb, unsigned long event, void *_die_args) + + if (((die_args->trapnr == X86_TRAP_MF) || + (die_args->trapnr == X86_TRAP_XF)) && +- !user_mode_vm(die_args->regs)) ++ !user_mode(die_args->regs)) + xpc_die_deactivate(); + + break; +diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c +index a11451f..9e1bbad 100644 +--- a/drivers/mmc/card/block.c ++++ b/drivers/mmc/card/block.c +@@ -574,7 +574,7 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, + if (idata->ic.postsleep_min_us) + usleep_range(idata->ic.postsleep_min_us, idata->ic.postsleep_max_us); + +- if (copy_to_user(&(ic_ptr->response), cmd.resp, sizeof(cmd.resp))) { ++ if (copy_to_user(ic_ptr->response, cmd.resp, sizeof(cmd.resp))) { + err = -EFAULT; + goto cmd_rel_host; + } +diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c +index 7911e05..d0f9dda 100644 +--- a/drivers/mmc/core/mmc_ops.c ++++ b/drivers/mmc/core/mmc_ops.c +@@ -267,7 +267,7 @@ mmc_send_cxd_data(struct mmc_card *card, struct mmc_host *host, + void *data_buf; + int is_on_stack; + +- is_on_stack = object_is_on_stack(buf); ++ is_on_stack = object_starts_on_stack(buf); + if (is_on_stack) { + /* + * dma onto stack is unsafe/nonportable, but callers to this +diff --git a/drivers/mmc/host/dw_mmc.h b/drivers/mmc/host/dw_mmc.h +index 01b99e8..5c325e3 100644 +--- a/drivers/mmc/host/dw_mmc.h ++++ b/drivers/mmc/host/dw_mmc.h +@@ -265,5 +265,5 @@ struct dw_mci_drv_data { + int (*parse_dt)(struct dw_mci *host); + int (*execute_tuning)(struct dw_mci_slot *slot, u32 opcode, + struct dw_mci_tuning_data *tuning_data); +-}; ++} __do_const; + #endif /* _DW_MMC_H_ */ +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 43af791..86f4c48 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -1628,7 +1628,9 @@ static int mmci_probe(struct amba_device *dev, + mmc->caps |= MMC_CAP_CMD23; + + if (variant->busy_detect) { +- mmci_ops.card_busy = mmci_card_busy; ++ pax_open_kernel(); ++ *(void **)&mmci_ops.card_busy = mmci_card_busy; ++ pax_close_kernel(); + mmci_write_datactrlreg(host, MCI_ST_DPSM_BUSYMODE); + mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY; + mmc->max_busy_timeout = 0; +diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c +index 9c2b9cb..cebb09a 100644 +--- a/drivers/mmc/host/omap_hsmmc.c ++++ b/drivers/mmc/host/omap_hsmmc.c +@@ -2113,7 +2113,9 @@ static int omap_hsmmc_probe(struct platform_device *pdev) + + if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) { + dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n"); +- omap_hsmmc_ops.multi_io_quirk = omap_hsmmc_multi_io_quirk; ++ pax_open_kernel(); ++ *(void **)&omap_hsmmc_ops.multi_io_quirk = omap_hsmmc_multi_io_quirk; ++ pax_close_kernel(); + } + + pm_runtime_enable(host->dev); +diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c +index 587ee0e..b3bbcab 100644 +--- a/drivers/mmc/host/sdhci-esdhc-imx.c ++++ b/drivers/mmc/host/sdhci-esdhc-imx.c +@@ -1054,9 +1054,12 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev) + host->mmc->caps |= MMC_CAP_1_8V_DDR; + } + +- if (imx_data->socdata->flags & ESDHC_FLAG_MAN_TUNING) +- sdhci_esdhc_ops.platform_execute_tuning = ++ if (imx_data->socdata->flags & ESDHC_FLAG_MAN_TUNING) { ++ pax_open_kernel(); ++ *(void **)&sdhci_esdhc_ops.platform_execute_tuning = + esdhc_executing_tuning; ++ pax_close_kernel(); ++ } + + if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) + writel(readl(host->ioaddr + ESDHC_TUNING_CTRL) | +diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c +index 0ce6eb1..8dcce1b 100644 +--- a/drivers/mmc/host/sdhci-s3c.c ++++ b/drivers/mmc/host/sdhci-s3c.c +@@ -584,9 +584,11 @@ static int sdhci_s3c_probe(struct platform_device *pdev) + * we can use overriding functions instead of default. + */ + if (sc->no_divider) { +- sdhci_s3c_ops.set_clock = sdhci_cmu_set_clock; +- sdhci_s3c_ops.get_min_clock = sdhci_cmu_get_min_clock; +- sdhci_s3c_ops.get_max_clock = sdhci_cmu_get_max_clock; ++ pax_open_kernel(); ++ *(void **)&sdhci_s3c_ops.set_clock = sdhci_cmu_set_clock; ++ *(void **)&sdhci_s3c_ops.get_min_clock = sdhci_cmu_get_min_clock; ++ *(void **)&sdhci_s3c_ops.get_max_clock = sdhci_cmu_get_max_clock; ++ pax_close_kernel(); + } + + /* It supports additional host capabilities if needed */ +diff --git a/drivers/mtd/chips/cfi_cmdset_0020.c b/drivers/mtd/chips/cfi_cmdset_0020.c +index 423666b..81ff5eb 100644 +--- a/drivers/mtd/chips/cfi_cmdset_0020.c ++++ b/drivers/mtd/chips/cfi_cmdset_0020.c +@@ -666,7 +666,7 @@ cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs, + size_t totlen = 0, thislen; + int ret = 0; + size_t buflen = 0; +- static char *buffer; ++ char *buffer; + + if (!ECCBUF_SIZE) { + /* We should fall back to a general writev implementation. +diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c +index b3b7ca1..5dd4634 100644 +--- a/drivers/mtd/nand/denali.c ++++ b/drivers/mtd/nand/denali.c +@@ -24,6 +24,7 @@ + #include <linux/slab.h> + #include <linux/mtd/mtd.h> + #include <linux/module.h> ++#include <linux/slab.h> + + #include "denali.h" + +diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +index 959cb9b..8520fe5 100644 +--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c ++++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +@@ -386,7 +386,7 @@ void prepare_data_dma(struct gpmi_nand_data *this, enum dma_data_direction dr) + + /* first try to map the upper buffer directly */ + if (virt_addr_valid(this->upper_buf) && +- !object_is_on_stack(this->upper_buf)) { ++ !object_starts_on_stack(this->upper_buf)) { + sg_init_one(sgl, this->upper_buf, this->upper_len); + ret = dma_map_sg(this->dev, sgl, 1, dr); + if (ret == 0) +diff --git a/drivers/mtd/nftlmount.c b/drivers/mtd/nftlmount.c +index 51b9d6a..52af9a7 100644 +--- a/drivers/mtd/nftlmount.c ++++ b/drivers/mtd/nftlmount.c +@@ -24,6 +24,7 @@ + #include <asm/errno.h> + #include <linux/delay.h> + #include <linux/slab.h> ++#include <linux/sched.h> + #include <linux/mtd/mtd.h> + #include <linux/mtd/nand.h> + #include <linux/mtd/nftl.h> +diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c +index c23184a..4115c41 100644 +--- a/drivers/mtd/sm_ftl.c ++++ b/drivers/mtd/sm_ftl.c +@@ -56,7 +56,7 @@ static ssize_t sm_attr_show(struct device *dev, struct device_attribute *attr, + #define SM_CIS_VENDOR_OFFSET 0x59 + static struct attribute_group *sm_create_sysfs_attributes(struct sm_ftl *ftl) + { +- struct attribute_group *attr_group; ++ attribute_group_no_const *attr_group; + struct attribute **attributes; + struct sm_sysfs_attribute *vendor_attribute; + char *vendor; +diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c +index 1cc06c0..6d25b9f 100644 +--- a/drivers/net/bonding/bond_main.c ++++ b/drivers/net/bonding/bond_main.c +@@ -3745,7 +3745,7 @@ int bond_3ad_xor_xmit(struct sk_buff *skb, struct net_device *dev) + bond_dev_queue_xmit(bond, skb, slave->dev); + } else { + dev_kfree_skb_any(skb); +- atomic_long_inc(&dev->tx_dropped); ++ atomic_long_inc_unchecked(&dev->tx_dropped); + } + + return NETDEV_TX_OK; +diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c +index 45f09a6..f154f8d 100644 +--- a/drivers/net/bonding/bond_netlink.c ++++ b/drivers/net/bonding/bond_netlink.c +@@ -585,7 +585,7 @@ nla_put_failure: + return -EMSGSIZE; + } + +-struct rtnl_link_ops bond_link_ops __read_mostly = { ++struct rtnl_link_ops bond_link_ops = { + .kind = "bond", + .priv_size = sizeof(struct bonding), + .setup = bond_setup, +diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c +index 5e40a8b..126bfda 100644 +--- a/drivers/net/caif/caif_hsi.c ++++ b/drivers/net/caif/caif_hsi.c +@@ -1445,7 +1445,7 @@ err: + return -ENODEV; + } + +-static struct rtnl_link_ops caif_hsi_link_ops __read_mostly = { ++static struct rtnl_link_ops caif_hsi_link_ops = { + .kind = "cfhsi", + .priv_size = sizeof(struct cfhsi), + .setup = cfhsi_setup, +diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig +index 98d73aa..63ef9da 100644 +--- a/drivers/net/can/Kconfig ++++ b/drivers/net/can/Kconfig +@@ -98,7 +98,7 @@ config CAN_JANZ_ICAN3 + + config CAN_FLEXCAN + tristate "Support for Freescale FLEXCAN based chips" +- depends on ARM || PPC ++ depends on (ARM && CPU_LITTLE_ENDIAN) || PPC + ---help--- + Say Y here if you want to support for Freescale FlexCAN. + +diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c +index 573b53b..b30b598 100644 +--- a/drivers/net/can/dev.c ++++ b/drivers/net/can/dev.c +@@ -880,7 +880,7 @@ static int can_newlink(struct net *src_net, struct net_device *dev, + return -EOPNOTSUPP; + } + +-static struct rtnl_link_ops can_link_ops __read_mostly = { ++static struct rtnl_link_ops can_link_ops = { + .kind = "can", + .maxtype = IFLA_CAN_MAX, + .policy = can_policy, +diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c +index 4e94057..32032ff 100644 +--- a/drivers/net/can/vcan.c ++++ b/drivers/net/can/vcan.c +@@ -166,7 +166,7 @@ static void vcan_setup(struct net_device *dev) + dev->destructor = free_netdev; + } + +-static struct rtnl_link_ops vcan_link_ops __read_mostly = { ++static struct rtnl_link_ops vcan_link_ops = { + .kind = "vcan", + .setup = vcan_setup, + }; +diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c +index ff435fb..d408b1f 100644 +--- a/drivers/net/dummy.c ++++ b/drivers/net/dummy.c +@@ -149,7 +149,7 @@ static int dummy_validate(struct nlattr *tb[], struct nlattr *data[]) + return 0; + } + +-static struct rtnl_link_ops dummy_link_ops __read_mostly = { ++static struct rtnl_link_ops dummy_link_ops = { + .kind = "dummy", + .setup = dummy_setup, + .validate = dummy_validate, +diff --git a/drivers/net/ethernet/8390/ax88796.c b/drivers/net/ethernet/8390/ax88796.c +index 1d162cc..b546a75 100644 +--- a/drivers/net/ethernet/8390/ax88796.c ++++ b/drivers/net/ethernet/8390/ax88796.c +@@ -889,9 +889,11 @@ static int ax_probe(struct platform_device *pdev) + if (ax->plat->reg_offsets) + ei_local->reg_offset = ax->plat->reg_offsets; + else { ++ resource_size_t _mem_size = mem_size; ++ do_div(_mem_size, 0x18); + ei_local->reg_offset = ax->reg_offsets; + for (ret = 0; ret < 0x18; ret++) +- ax->reg_offsets[ret] = (mem_size / 0x18) * ret; ++ ax->reg_offsets[ret] = _mem_size * ret; + } + + if (!request_mem_region(mem->start, mem_size, pdev->name)) { +diff --git a/drivers/net/ethernet/altera/altera_tse_main.c b/drivers/net/ethernet/altera/altera_tse_main.c +index 4efc435..4ab9e14 100644 +--- a/drivers/net/ethernet/altera/altera_tse_main.c ++++ b/drivers/net/ethernet/altera/altera_tse_main.c +@@ -1224,7 +1224,7 @@ static int tse_shutdown(struct net_device *dev) + return 0; + } + +-static struct net_device_ops altera_tse_netdev_ops = { ++static net_device_ops_no_const altera_tse_netdev_ops __read_only = { + .ndo_open = tse_open, + .ndo_stop = tse_shutdown, + .ndo_start_xmit = tse_start_xmit, +@@ -1461,11 +1461,13 @@ static int altera_tse_probe(struct platform_device *pdev) + ndev->netdev_ops = &altera_tse_netdev_ops; + altera_tse_set_ethtool_ops(ndev); + ++ pax_open_kernel(); + altera_tse_netdev_ops.ndo_set_rx_mode = tse_set_rx_mode; + + if (priv->hash_filter) + altera_tse_netdev_ops.ndo_set_rx_mode = + tse_set_rx_mode_hashfilter; ++ pax_close_kernel(); + + /* Scatter/gather IO is not supported, + * so it is turned off +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h +index caade30..3e257d9 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h +@@ -1072,14 +1072,14 @@ do { \ + * operations, everything works on mask values. + */ + #define XMDIO_READ(_pdata, _mmd, _reg) \ +- ((_pdata)->hw_if.read_mmd_regs((_pdata), 0, \ ++ ((_pdata)->hw_if->read_mmd_regs((_pdata), 0, \ + MII_ADDR_C45 | (_mmd << 16) | ((_reg) & 0xffff))) + + #define XMDIO_READ_BITS(_pdata, _mmd, _reg, _mask) \ + (XMDIO_READ((_pdata), _mmd, _reg) & _mask) + + #define XMDIO_WRITE(_pdata, _mmd, _reg, _val) \ +- ((_pdata)->hw_if.write_mmd_regs((_pdata), 0, \ ++ ((_pdata)->hw_if->write_mmd_regs((_pdata), 0, \ + MII_ADDR_C45 | (_mmd << 16) | ((_reg) & 0xffff), (_val))) + + #define XMDIO_WRITE_BITS(_pdata, _mmd, _reg, _mask, _val) \ +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dcb.c b/drivers/net/ethernet/amd/xgbe/xgbe-dcb.c +index 8a50b01..39c1ad0 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-dcb.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-dcb.c +@@ -187,7 +187,7 @@ static int xgbe_dcb_ieee_setets(struct net_device *netdev, + + memcpy(pdata->ets, ets, sizeof(*pdata->ets)); + +- pdata->hw_if.config_dcb_tc(pdata); ++ pdata->hw_if->config_dcb_tc(pdata); + + return 0; + } +@@ -226,7 +226,7 @@ static int xgbe_dcb_ieee_setpfc(struct net_device *netdev, + + memcpy(pdata->pfc, pfc, sizeof(*pdata->pfc)); + +- pdata->hw_if.config_dcb_pfc(pdata); ++ pdata->hw_if->config_dcb_pfc(pdata); + + return 0; + } +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-desc.c b/drivers/net/ethernet/amd/xgbe/xgbe-desc.c +index 6fc5da0..61ac2cb 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-desc.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-desc.c +@@ -235,7 +235,7 @@ err_ring: + + static void xgbe_wrapper_tx_descriptor_init(struct xgbe_prv_data *pdata) + { +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct xgbe_channel *channel; + struct xgbe_ring *ring; + struct xgbe_ring_data *rdata; +@@ -276,7 +276,7 @@ static void xgbe_wrapper_tx_descriptor_init(struct xgbe_prv_data *pdata) + + static void xgbe_wrapper_rx_descriptor_init(struct xgbe_prv_data *pdata) + { +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct xgbe_channel *channel; + struct xgbe_ring *ring; + struct xgbe_ring_desc *rdesc; +@@ -505,7 +505,7 @@ err_out: + static void xgbe_realloc_skb(struct xgbe_channel *channel) + { + struct xgbe_prv_data *pdata = channel->pdata; +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct xgbe_ring *ring = channel->rx_ring; + struct xgbe_ring_data *rdata; + struct sk_buff *skb = NULL; +@@ -546,17 +546,12 @@ static void xgbe_realloc_skb(struct xgbe_channel *channel) + DBGPR("<--xgbe_realloc_skb\n"); + } + +-void xgbe_init_function_ptrs_desc(struct xgbe_desc_if *desc_if) +-{ +- DBGPR("-->xgbe_init_function_ptrs_desc\n"); +- +- desc_if->alloc_ring_resources = xgbe_alloc_ring_resources; +- desc_if->free_ring_resources = xgbe_free_ring_resources; +- desc_if->map_tx_skb = xgbe_map_tx_skb; +- desc_if->realloc_skb = xgbe_realloc_skb; +- desc_if->unmap_skb = xgbe_unmap_skb; +- desc_if->wrapper_tx_desc_init = xgbe_wrapper_tx_descriptor_init; +- desc_if->wrapper_rx_desc_init = xgbe_wrapper_rx_descriptor_init; +- +- DBGPR("<--xgbe_init_function_ptrs_desc\n"); +-} ++const struct xgbe_desc_if default_xgbe_desc_if = { ++ .alloc_ring_resources = xgbe_alloc_ring_resources, ++ .free_ring_resources = xgbe_free_ring_resources, ++ .map_tx_skb = xgbe_map_tx_skb, ++ .realloc_skb = xgbe_realloc_skb, ++ .unmap_skb = xgbe_unmap_skb, ++ .wrapper_tx_desc_init = xgbe_wrapper_tx_descriptor_init, ++ .wrapper_rx_desc_init = xgbe_wrapper_rx_descriptor_init, ++}; +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +index 9da3a03..022f15c 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c +@@ -2462,7 +2462,7 @@ static void xgbe_powerdown_rx(struct xgbe_prv_data *pdata) + + static int xgbe_init(struct xgbe_prv_data *pdata) + { +- struct xgbe_desc_if *desc_if = &pdata->desc_if; ++ struct xgbe_desc_if *desc_if = pdata->desc_if; + int ret; + + DBGPR("-->xgbe_init\n"); +@@ -2524,101 +2524,96 @@ static int xgbe_init(struct xgbe_prv_data *pdata) + return 0; + } + +-void xgbe_init_function_ptrs_dev(struct xgbe_hw_if *hw_if) +-{ +- DBGPR("-->xgbe_init_function_ptrs\n"); +- +- hw_if->tx_complete = xgbe_tx_complete; ++const struct xgbe_hw_if default_xgbe_hw_if = { ++ .tx_complete = xgbe_tx_complete, + +- hw_if->set_promiscuous_mode = xgbe_set_promiscuous_mode; +- hw_if->set_all_multicast_mode = xgbe_set_all_multicast_mode; +- hw_if->add_mac_addresses = xgbe_add_mac_addresses; +- hw_if->set_mac_address = xgbe_set_mac_address; ++ .set_promiscuous_mode = xgbe_set_promiscuous_mode, ++ .set_all_multicast_mode = xgbe_set_all_multicast_mode, ++ .add_mac_addresses = xgbe_add_mac_addresses, ++ .set_mac_address = xgbe_set_mac_address, + +- hw_if->enable_rx_csum = xgbe_enable_rx_csum; +- hw_if->disable_rx_csum = xgbe_disable_rx_csum; ++ .enable_rx_csum = xgbe_enable_rx_csum, ++ .disable_rx_csum = xgbe_disable_rx_csum, + +- hw_if->enable_rx_vlan_stripping = xgbe_enable_rx_vlan_stripping; +- hw_if->disable_rx_vlan_stripping = xgbe_disable_rx_vlan_stripping; +- hw_if->enable_rx_vlan_filtering = xgbe_enable_rx_vlan_filtering; +- hw_if->disable_rx_vlan_filtering = xgbe_disable_rx_vlan_filtering; +- hw_if->update_vlan_hash_table = xgbe_update_vlan_hash_table; ++ .enable_rx_vlan_stripping = xgbe_enable_rx_vlan_stripping, ++ .disable_rx_vlan_stripping = xgbe_disable_rx_vlan_stripping, ++ .enable_rx_vlan_filtering = xgbe_enable_rx_vlan_filtering, ++ .disable_rx_vlan_filtering = xgbe_disable_rx_vlan_filtering, ++ .update_vlan_hash_table = xgbe_update_vlan_hash_table, + +- hw_if->read_mmd_regs = xgbe_read_mmd_regs; +- hw_if->write_mmd_regs = xgbe_write_mmd_regs; ++ .read_mmd_regs = xgbe_read_mmd_regs, ++ .write_mmd_regs = xgbe_write_mmd_regs, + +- hw_if->set_gmii_speed = xgbe_set_gmii_speed; +- hw_if->set_gmii_2500_speed = xgbe_set_gmii_2500_speed; +- hw_if->set_xgmii_speed = xgbe_set_xgmii_speed; ++ .set_gmii_speed = xgbe_set_gmii_speed, ++ .set_gmii_2500_speed = xgbe_set_gmii_2500_speed, ++ .set_xgmii_speed = xgbe_set_xgmii_speed, + +- hw_if->enable_tx = xgbe_enable_tx; +- hw_if->disable_tx = xgbe_disable_tx; +- hw_if->enable_rx = xgbe_enable_rx; +- hw_if->disable_rx = xgbe_disable_rx; ++ .enable_tx = xgbe_enable_tx, ++ .disable_tx = xgbe_disable_tx, ++ .enable_rx = xgbe_enable_rx, ++ .disable_rx = xgbe_disable_rx, + +- hw_if->powerup_tx = xgbe_powerup_tx; +- hw_if->powerdown_tx = xgbe_powerdown_tx; +- hw_if->powerup_rx = xgbe_powerup_rx; +- hw_if->powerdown_rx = xgbe_powerdown_rx; ++ .powerup_tx = xgbe_powerup_tx, ++ .powerdown_tx = xgbe_powerdown_tx, ++ .powerup_rx = xgbe_powerup_rx, ++ .powerdown_rx = xgbe_powerdown_rx, + +- hw_if->pre_xmit = xgbe_pre_xmit; +- hw_if->dev_read = xgbe_dev_read; +- hw_if->enable_int = xgbe_enable_int; +- hw_if->disable_int = xgbe_disable_int; +- hw_if->init = xgbe_init; +- hw_if->exit = xgbe_exit; ++ .pre_xmit = xgbe_pre_xmit, ++ .dev_read = xgbe_dev_read, ++ .enable_int = xgbe_enable_int, ++ .disable_int = xgbe_disable_int, ++ .init = xgbe_init, ++ .exit = xgbe_exit, + + /* Descriptor related Sequences have to be initialized here */ +- hw_if->tx_desc_init = xgbe_tx_desc_init; +- hw_if->rx_desc_init = xgbe_rx_desc_init; +- hw_if->tx_desc_reset = xgbe_tx_desc_reset; +- hw_if->rx_desc_reset = xgbe_rx_desc_reset; +- hw_if->is_last_desc = xgbe_is_last_desc; +- hw_if->is_context_desc = xgbe_is_context_desc; ++ .tx_desc_init = xgbe_tx_desc_init, ++ .rx_desc_init = xgbe_rx_desc_init, ++ .tx_desc_reset = xgbe_tx_desc_reset, ++ .rx_desc_reset = xgbe_rx_desc_reset, ++ .is_last_desc = xgbe_is_last_desc, ++ .is_context_desc = xgbe_is_context_desc, + + /* For FLOW ctrl */ +- hw_if->config_tx_flow_control = xgbe_config_tx_flow_control; +- hw_if->config_rx_flow_control = xgbe_config_rx_flow_control; ++ .config_tx_flow_control = xgbe_config_tx_flow_control, ++ .config_rx_flow_control = xgbe_config_rx_flow_control, + + /* For RX coalescing */ +- hw_if->config_rx_coalesce = xgbe_config_rx_coalesce; +- hw_if->config_tx_coalesce = xgbe_config_tx_coalesce; +- hw_if->usec_to_riwt = xgbe_usec_to_riwt; +- hw_if->riwt_to_usec = xgbe_riwt_to_usec; ++ .config_rx_coalesce = xgbe_config_rx_coalesce, ++ .config_tx_coalesce = xgbe_config_tx_coalesce, ++ .usec_to_riwt = xgbe_usec_to_riwt, ++ .riwt_to_usec = xgbe_riwt_to_usec, + + /* For RX and TX threshold config */ +- hw_if->config_rx_threshold = xgbe_config_rx_threshold; +- hw_if->config_tx_threshold = xgbe_config_tx_threshold; ++ .config_rx_threshold = xgbe_config_rx_threshold, ++ .config_tx_threshold = xgbe_config_tx_threshold, + + /* For RX and TX Store and Forward Mode config */ +- hw_if->config_rsf_mode = xgbe_config_rsf_mode; +- hw_if->config_tsf_mode = xgbe_config_tsf_mode; ++ .config_rsf_mode = xgbe_config_rsf_mode, ++ .config_tsf_mode = xgbe_config_tsf_mode, + + /* For TX DMA Operating on Second Frame config */ +- hw_if->config_osp_mode = xgbe_config_osp_mode; ++ .config_osp_mode = xgbe_config_osp_mode, + + /* For RX and TX PBL config */ +- hw_if->config_rx_pbl_val = xgbe_config_rx_pbl_val; +- hw_if->get_rx_pbl_val = xgbe_get_rx_pbl_val; +- hw_if->config_tx_pbl_val = xgbe_config_tx_pbl_val; +- hw_if->get_tx_pbl_val = xgbe_get_tx_pbl_val; +- hw_if->config_pblx8 = xgbe_config_pblx8; ++ .config_rx_pbl_val = xgbe_config_rx_pbl_val, ++ .get_rx_pbl_val = xgbe_get_rx_pbl_val, ++ .config_tx_pbl_val = xgbe_config_tx_pbl_val, ++ .get_tx_pbl_val = xgbe_get_tx_pbl_val, ++ .config_pblx8 = xgbe_config_pblx8, + + /* For MMC statistics support */ +- hw_if->tx_mmc_int = xgbe_tx_mmc_int; +- hw_if->rx_mmc_int = xgbe_rx_mmc_int; +- hw_if->read_mmc_stats = xgbe_read_mmc_stats; ++ .tx_mmc_int = xgbe_tx_mmc_int, ++ .rx_mmc_int = xgbe_rx_mmc_int, ++ .read_mmc_stats = xgbe_read_mmc_stats, + + /* For PTP config */ +- hw_if->config_tstamp = xgbe_config_tstamp; +- hw_if->update_tstamp_addend = xgbe_update_tstamp_addend; +- hw_if->set_tstamp_time = xgbe_set_tstamp_time; +- hw_if->get_tstamp_time = xgbe_get_tstamp_time; +- hw_if->get_tx_tstamp = xgbe_get_tx_tstamp; ++ .config_tstamp = xgbe_config_tstamp, ++ .update_tstamp_addend = xgbe_update_tstamp_addend, ++ .set_tstamp_time = xgbe_set_tstamp_time, ++ .get_tstamp_time = xgbe_get_tstamp_time, ++ .get_tx_tstamp = xgbe_get_tx_tstamp, + + /* For Data Center Bridging config */ +- hw_if->config_dcb_tc = xgbe_config_dcb_tc; +- hw_if->config_dcb_pfc = xgbe_config_dcb_pfc; +- +- DBGPR("<--xgbe_init_function_ptrs\n"); +-} ++ .config_dcb_tc = xgbe_config_dcb_tc, ++ .config_dcb_pfc = xgbe_config_dcb_pfc, ++}; +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +index 2349ea9..a83a677 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +@@ -154,7 +154,7 @@ static int xgbe_calc_rx_buf_size(struct net_device *netdev, unsigned int mtu) + + static void xgbe_enable_rx_tx_ints(struct xgbe_prv_data *pdata) + { +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct xgbe_channel *channel; + enum xgbe_int int_id; + unsigned int i; +@@ -176,7 +176,7 @@ static void xgbe_enable_rx_tx_ints(struct xgbe_prv_data *pdata) + + static void xgbe_disable_rx_tx_ints(struct xgbe_prv_data *pdata) + { +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct xgbe_channel *channel; + enum xgbe_int int_id; + unsigned int i; +@@ -199,7 +199,7 @@ static void xgbe_disable_rx_tx_ints(struct xgbe_prv_data *pdata) + static irqreturn_t xgbe_isr(int irq, void *data) + { + struct xgbe_prv_data *pdata = data; +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct xgbe_channel *channel; + unsigned int dma_isr, dma_ch_isr; + unsigned int mac_isr, mac_tssr; +@@ -446,7 +446,7 @@ static void xgbe_napi_disable(struct xgbe_prv_data *pdata, unsigned int del) + + void xgbe_init_tx_coalesce(struct xgbe_prv_data *pdata) + { +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + + DBGPR("-->xgbe_init_tx_coalesce\n"); + +@@ -460,7 +460,7 @@ void xgbe_init_tx_coalesce(struct xgbe_prv_data *pdata) + + void xgbe_init_rx_coalesce(struct xgbe_prv_data *pdata) + { +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + + DBGPR("-->xgbe_init_rx_coalesce\n"); + +@@ -474,7 +474,7 @@ void xgbe_init_rx_coalesce(struct xgbe_prv_data *pdata) + + static void xgbe_free_tx_skbuff(struct xgbe_prv_data *pdata) + { +- struct xgbe_desc_if *desc_if = &pdata->desc_if; ++ struct xgbe_desc_if *desc_if = pdata->desc_if; + struct xgbe_channel *channel; + struct xgbe_ring *ring; + struct xgbe_ring_data *rdata; +@@ -499,7 +499,7 @@ static void xgbe_free_tx_skbuff(struct xgbe_prv_data *pdata) + + static void xgbe_free_rx_skbuff(struct xgbe_prv_data *pdata) + { +- struct xgbe_desc_if *desc_if = &pdata->desc_if; ++ struct xgbe_desc_if *desc_if = pdata->desc_if; + struct xgbe_channel *channel; + struct xgbe_ring *ring; + struct xgbe_ring_data *rdata; +@@ -525,7 +525,7 @@ static void xgbe_free_rx_skbuff(struct xgbe_prv_data *pdata) + static void xgbe_adjust_link(struct net_device *netdev) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct phy_device *phydev = pdata->phydev; + int new_state = 0; + +@@ -633,7 +633,7 @@ static void xgbe_phy_exit(struct xgbe_prv_data *pdata) + int xgbe_powerdown(struct net_device *netdev, unsigned int caller) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + unsigned long flags; + + DBGPR("-->xgbe_powerdown\n"); +@@ -671,7 +671,7 @@ int xgbe_powerdown(struct net_device *netdev, unsigned int caller) + int xgbe_powerup(struct net_device *netdev, unsigned int caller) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + unsigned long flags; + + DBGPR("-->xgbe_powerup\n"); +@@ -708,7 +708,7 @@ int xgbe_powerup(struct net_device *netdev, unsigned int caller) + + static int xgbe_start(struct xgbe_prv_data *pdata) + { +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct net_device *netdev = pdata->netdev; + + DBGPR("-->xgbe_start\n"); +@@ -734,7 +734,7 @@ static int xgbe_start(struct xgbe_prv_data *pdata) + + static void xgbe_stop(struct xgbe_prv_data *pdata) + { +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct net_device *netdev = pdata->netdev; + + DBGPR("-->xgbe_stop\n"); +@@ -754,7 +754,7 @@ static void xgbe_stop(struct xgbe_prv_data *pdata) + + static void xgbe_restart_dev(struct xgbe_prv_data *pdata, unsigned int reset) + { +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + + DBGPR("-->xgbe_restart_dev\n"); + +@@ -951,7 +951,7 @@ static int xgbe_set_hwtstamp_settings(struct xgbe_prv_data *pdata, + return -ERANGE; + } + +- pdata->hw_if.config_tstamp(pdata, mac_tscr); ++ pdata->hw_if->config_tstamp(pdata, mac_tscr); + + memcpy(&pdata->tstamp_config, &config, sizeof(config)); + +@@ -1089,8 +1089,8 @@ static void xgbe_packet_info(struct xgbe_prv_data *pdata, + static int xgbe_open(struct net_device *netdev) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; +- struct xgbe_desc_if *desc_if = &pdata->desc_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; ++ struct xgbe_desc_if *desc_if = pdata->desc_if; + int ret; + + DBGPR("-->xgbe_open\n"); +@@ -1170,8 +1170,8 @@ err_phy_init: + static int xgbe_close(struct net_device *netdev) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; +- struct xgbe_desc_if *desc_if = &pdata->desc_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; ++ struct xgbe_desc_if *desc_if = pdata->desc_if; + + DBGPR("-->xgbe_close\n"); + +@@ -1205,8 +1205,8 @@ static int xgbe_close(struct net_device *netdev) + static int xgbe_xmit(struct sk_buff *skb, struct net_device *netdev) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; +- struct xgbe_desc_if *desc_if = &pdata->desc_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; ++ struct xgbe_desc_if *desc_if = pdata->desc_if; + struct xgbe_channel *channel; + struct xgbe_ring *ring; + struct xgbe_packet_data *packet; +@@ -1275,7 +1275,7 @@ tx_netdev_return: + static void xgbe_set_rx_mode(struct net_device *netdev) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + unsigned int pr_mode, am_mode; + + DBGPR("-->xgbe_set_rx_mode\n"); +@@ -1294,7 +1294,7 @@ static void xgbe_set_rx_mode(struct net_device *netdev) + static int xgbe_set_mac_address(struct net_device *netdev, void *addr) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct sockaddr *saddr = addr; + + DBGPR("-->xgbe_set_mac_address\n"); +@@ -1361,7 +1361,7 @@ static struct rtnl_link_stats64 *xgbe_get_stats64(struct net_device *netdev, + + DBGPR("-->%s\n", __func__); + +- pdata->hw_if.read_mmc_stats(pdata); ++ pdata->hw_if->read_mmc_stats(pdata); + + s->rx_packets = pstats->rxframecount_gb; + s->rx_bytes = pstats->rxoctetcount_gb; +@@ -1388,7 +1388,7 @@ static int xgbe_vlan_rx_add_vid(struct net_device *netdev, __be16 proto, + u16 vid) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + + DBGPR("-->%s\n", __func__); + +@@ -1404,7 +1404,7 @@ static int xgbe_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, + u16 vid) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + + DBGPR("-->%s\n", __func__); + +@@ -1464,7 +1464,7 @@ static int xgbe_set_features(struct net_device *netdev, + netdev_features_t features) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + netdev_features_t rxcsum, rxvlan, rxvlan_filter; + + rxcsum = pdata->netdev_features & NETIF_F_RXCSUM; +@@ -1520,7 +1520,7 @@ struct net_device_ops *xgbe_get_netdev_ops(void) + static void xgbe_rx_refresh(struct xgbe_channel *channel) + { + struct xgbe_prv_data *pdata = channel->pdata; +- struct xgbe_desc_if *desc_if = &pdata->desc_if; ++ struct xgbe_desc_if *desc_if = pdata->desc_if; + struct xgbe_ring *ring = channel->rx_ring; + struct xgbe_ring_data *rdata; + +@@ -1536,8 +1536,8 @@ static void xgbe_rx_refresh(struct xgbe_channel *channel) + static int xgbe_tx_poll(struct xgbe_channel *channel) + { + struct xgbe_prv_data *pdata = channel->pdata; +- struct xgbe_hw_if *hw_if = &pdata->hw_if; +- struct xgbe_desc_if *desc_if = &pdata->desc_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; ++ struct xgbe_desc_if *desc_if = pdata->desc_if; + struct xgbe_ring *ring = channel->tx_ring; + struct xgbe_ring_data *rdata; + struct xgbe_ring_desc *rdesc; +@@ -1589,7 +1589,7 @@ static int xgbe_tx_poll(struct xgbe_channel *channel) + static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) + { + struct xgbe_prv_data *pdata = channel->pdata; +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + struct xgbe_ring *ring = channel->rx_ring; + struct xgbe_ring_data *rdata; + struct xgbe_packet_data *packet; +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c +index 49508ec..2617cca 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c +@@ -203,7 +203,7 @@ static void xgbe_get_ethtool_stats(struct net_device *netdev, + + DBGPR("-->%s\n", __func__); + +- pdata->hw_if.read_mmc_stats(pdata); ++ pdata->hw_if->read_mmc_stats(pdata); + for (i = 0; i < XGBE_STATS_COUNT; i++) { + stat = (u8 *)pdata + xgbe_gstring_stats[i].stat_offset; + *data++ = *(u64 *)stat; +@@ -378,7 +378,7 @@ static int xgbe_get_coalesce(struct net_device *netdev, + struct ethtool_coalesce *ec) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + unsigned int riwt; + + DBGPR("-->xgbe_get_coalesce\n"); +@@ -401,7 +401,7 @@ static int xgbe_set_coalesce(struct net_device *netdev, + struct ethtool_coalesce *ec) + { + struct xgbe_prv_data *pdata = netdev_priv(netdev); +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + unsigned int rx_frames, rx_riwt, rx_usecs; + unsigned int tx_frames, tx_usecs; + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-main.c b/drivers/net/ethernet/amd/xgbe/xgbe-main.c +index f5a8fa0..0bb58ff 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-main.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-main.c +@@ -209,12 +209,6 @@ static void xgbe_default_config(struct xgbe_prv_data *pdata) + DBGPR("<--xgbe_default_config\n"); + } + +-static void xgbe_init_all_fptrs(struct xgbe_prv_data *pdata) +-{ +- xgbe_init_function_ptrs_dev(&pdata->hw_if); +- xgbe_init_function_ptrs_desc(&pdata->desc_if); +-} +- + static int xgbe_probe(struct platform_device *pdev) + { + struct xgbe_prv_data *pdata; +@@ -327,9 +321,8 @@ static int xgbe_probe(struct platform_device *pdev) + netdev->base_addr = (unsigned long)pdata->xgmac_regs; + + /* Set all the function pointers */ +- xgbe_init_all_fptrs(pdata); +- hw_if = &pdata->hw_if; +- desc_if = &pdata->desc_if; ++ hw_if = pdata->hw_if = &default_xgbe_hw_if; ++ desc_if = pdata->desc_if = &default_xgbe_desc_if; + + /* Issue software reset to device */ + hw_if->exit(pdata); +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +index 363b210..b241389 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +@@ -126,7 +126,7 @@ + static int xgbe_mdio_read(struct mii_bus *mii, int prtad, int mmd_reg) + { + struct xgbe_prv_data *pdata = mii->priv; +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + int mmd_data; + + DBGPR_MDIO("-->xgbe_mdio_read: prtad=%#x mmd_reg=%#x\n", +@@ -143,7 +143,7 @@ static int xgbe_mdio_write(struct mii_bus *mii, int prtad, int mmd_reg, + u16 mmd_val) + { + struct xgbe_prv_data *pdata = mii->priv; +- struct xgbe_hw_if *hw_if = &pdata->hw_if; ++ struct xgbe_hw_if *hw_if = pdata->hw_if; + int mmd_data = mmd_val; + + DBGPR_MDIO("-->xgbe_mdio_write: prtad=%#x mmd_reg=%#x mmd_data=%#x\n", +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-ptp.c b/drivers/net/ethernet/amd/xgbe/xgbe-ptp.c +index a1bf9d1c..84adcab 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-ptp.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-ptp.c +@@ -129,7 +129,7 @@ static cycle_t xgbe_cc_read(const struct cyclecounter *cc) + tstamp_cc); + u64 nsec; + +- nsec = pdata->hw_if.get_tstamp_time(pdata); ++ nsec = pdata->hw_if->get_tstamp_time(pdata); + + return nsec; + } +@@ -158,7 +158,7 @@ static int xgbe_adjfreq(struct ptp_clock_info *info, s32 delta) + + spin_lock_irqsave(&pdata->tstamp_lock, flags); + +- pdata->hw_if.update_tstamp_addend(pdata, addend); ++ pdata->hw_if->update_tstamp_addend(pdata, addend); + + spin_unlock_irqrestore(&pdata->tstamp_lock, flags); + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h +index 789957d..d7d0245 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe.h ++++ b/drivers/net/ethernet/amd/xgbe/xgbe.h +@@ -583,8 +583,8 @@ struct xgbe_prv_data { + + int irq_number; + +- struct xgbe_hw_if hw_if; +- struct xgbe_desc_if desc_if; ++ const struct xgbe_hw_if *hw_if; ++ const struct xgbe_desc_if *desc_if; + + /* AXI DMA settings */ + unsigned int axdomain; +@@ -697,6 +697,9 @@ struct xgbe_prv_data { + #endif + }; + ++extern const struct xgbe_hw_if default_xgbe_hw_if; ++extern const struct xgbe_desc_if default_xgbe_desc_if; ++ + /* Function prototypes*/ + + void xgbe_init_function_ptrs_dev(struct xgbe_hw_if *); +diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h +index adcacda..fa6e0ae 100644 +--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h ++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h +@@ -1065,7 +1065,7 @@ static inline u8 bnx2x_get_path_func_num(struct bnx2x *bp) + static inline void bnx2x_init_bp_objs(struct bnx2x *bp) + { + /* RX_MODE controlling object */ +- bnx2x_init_rx_mode_obj(bp, &bp->rx_mode_obj); ++ bnx2x_init_rx_mode_obj(bp); + + /* multicast configuration controlling object */ + bnx2x_init_mcast_obj(bp, &bp->mcast_obj, bp->fp->cl_id, bp->fp->cid, +diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +index 7bc2924..2112002 100644 +--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c ++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +@@ -2329,15 +2329,14 @@ int bnx2x_config_rx_mode(struct bnx2x *bp, + return rc; + } + +-void bnx2x_init_rx_mode_obj(struct bnx2x *bp, +- struct bnx2x_rx_mode_obj *o) ++void bnx2x_init_rx_mode_obj(struct bnx2x *bp) + { + if (CHIP_IS_E1x(bp)) { +- o->wait_comp = bnx2x_empty_rx_mode_wait; +- o->config_rx_mode = bnx2x_set_rx_mode_e1x; ++ bp->rx_mode_obj.wait_comp = bnx2x_empty_rx_mode_wait; ++ bp->rx_mode_obj.config_rx_mode = bnx2x_set_rx_mode_e1x; + } else { +- o->wait_comp = bnx2x_wait_rx_mode_comp_e2; +- o->config_rx_mode = bnx2x_set_rx_mode_e2; ++ bp->rx_mode_obj.wait_comp = bnx2x_wait_rx_mode_comp_e2; ++ bp->rx_mode_obj.config_rx_mode = bnx2x_set_rx_mode_e2; + } + } + +diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h +index e97275f..52e28bc 100644 +--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h ++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h +@@ -1409,8 +1409,7 @@ int bnx2x_vlan_mac_move(struct bnx2x *bp, + + /********************* RX MODE ****************/ + +-void bnx2x_init_rx_mode_obj(struct bnx2x *bp, +- struct bnx2x_rx_mode_obj *o); ++void bnx2x_init_rx_mode_obj(struct bnx2x *bp); + + /** + * bnx2x_config_rx_mode - Send and RX_MODE ramrod according to the provided parameters. +diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h +index 31c9f82..e65e986 100644 +--- a/drivers/net/ethernet/broadcom/tg3.h ++++ b/drivers/net/ethernet/broadcom/tg3.h +@@ -150,6 +150,7 @@ + #define CHIPREV_ID_5750_A0 0x4000 + #define CHIPREV_ID_5750_A1 0x4001 + #define CHIPREV_ID_5750_A3 0x4003 ++#define CHIPREV_ID_5750_C1 0x4201 + #define CHIPREV_ID_5750_C2 0x4202 + #define CHIPREV_ID_5752_A0_HW 0x5000 + #define CHIPREV_ID_5752_A0 0x6000 +diff --git a/drivers/net/ethernet/brocade/bna/bna_enet.c b/drivers/net/ethernet/brocade/bna/bna_enet.c +index 903466e..b285864 100644 +--- a/drivers/net/ethernet/brocade/bna/bna_enet.c ++++ b/drivers/net/ethernet/brocade/bna/bna_enet.c +@@ -1693,10 +1693,10 @@ bna_cb_ioceth_reset(void *arg) + } + + static struct bfa_ioc_cbfn bna_ioceth_cbfn = { +- bna_cb_ioceth_enable, +- bna_cb_ioceth_disable, +- bna_cb_ioceth_hbfail, +- bna_cb_ioceth_reset ++ .enable_cbfn = bna_cb_ioceth_enable, ++ .disable_cbfn = bna_cb_ioceth_disable, ++ .hbfail_cbfn = bna_cb_ioceth_hbfail, ++ .reset_cbfn = bna_cb_ioceth_reset + }; + + static void bna_attr_init(struct bna_ioceth *ioceth) +diff --git a/drivers/net/ethernet/chelsio/cxgb3/l2t.h b/drivers/net/ethernet/chelsio/cxgb3/l2t.h +index 8cffcdf..aadf043 100644 +--- a/drivers/net/ethernet/chelsio/cxgb3/l2t.h ++++ b/drivers/net/ethernet/chelsio/cxgb3/l2t.h +@@ -87,7 +87,7 @@ typedef void (*arp_failure_handler_func)(struct t3cdev * dev, + */ + struct l2t_skb_cb { + arp_failure_handler_func arp_failure_handler; +-}; ++} __no_const; + + #define L2T_SKB_CB(skb) ((struct l2t_skb_cb *)(skb)->cb) + +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +index 279873c..11e1921 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +@@ -2365,7 +2365,7 @@ static void get_regs(struct net_device *dev, struct ethtool_regs *regs, + + int i; + struct adapter *ap = netdev2adap(dev); +- static const unsigned int *reg_ranges; ++ const unsigned int *reg_ranges; + int arr_size = 0, buf_size = 0; + + if (is_t4(ap->params.chip)) { +diff --git a/drivers/net/ethernet/dec/tulip/de4x5.c b/drivers/net/ethernet/dec/tulip/de4x5.c +index cf8b6ff..274271e 100644 +--- a/drivers/net/ethernet/dec/tulip/de4x5.c ++++ b/drivers/net/ethernet/dec/tulip/de4x5.c +@@ -5387,7 +5387,7 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) + for (i=0; i<ETH_ALEN; i++) { + tmp.addr[i] = dev->dev_addr[i]; + } +- if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT; ++ if (ioc->len > sizeof tmp.addr || copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT; + break; + + case DE4X5_SET_HWADDR: /* Set the hardware address */ +@@ -5427,7 +5427,7 @@ de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) + spin_lock_irqsave(&lp->lock, flags); + memcpy(&statbuf, &lp->pktStats, ioc->len); + spin_unlock_irqrestore(&lp->lock, flags); +- if (copy_to_user(ioc->data, &statbuf, ioc->len)) ++ if (ioc->len > sizeof statbuf || copy_to_user(ioc->data, &statbuf, ioc->len)) + return -EFAULT; + break; + } +diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c +index e51faf0..75661dc 100644 +--- a/drivers/net/ethernet/emulex/benet/be_main.c ++++ b/drivers/net/ethernet/emulex/benet/be_main.c +@@ -537,7 +537,7 @@ static void accumulate_16bit_val(u32 *acc, u16 val) + + if (wrapped) + newacc += 65536; +- ACCESS_ONCE(*acc) = newacc; ++ ACCESS_ONCE_RW(*acc) = newacc; + } + + static void populate_erx_stats(struct be_adapter *adapter, +diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c +index c77fa4a..7fd42fc 100644 +--- a/drivers/net/ethernet/faraday/ftgmac100.c ++++ b/drivers/net/ethernet/faraday/ftgmac100.c +@@ -30,6 +30,8 @@ + #include <linux/netdevice.h> + #include <linux/phy.h> + #include <linux/platform_device.h> ++#include <linux/interrupt.h> ++#include <linux/irqreturn.h> + #include <net/ip.h> + + #include "ftgmac100.h" +diff --git a/drivers/net/ethernet/faraday/ftmac100.c b/drivers/net/ethernet/faraday/ftmac100.c +index 4ff1adc..0ea6bf4 100644 +--- a/drivers/net/ethernet/faraday/ftmac100.c ++++ b/drivers/net/ethernet/faraday/ftmac100.c +@@ -31,6 +31,8 @@ + #include <linux/module.h> + #include <linux/netdevice.h> + #include <linux/platform_device.h> ++#include <linux/interrupt.h> ++#include <linux/irqreturn.h> + + #include "ftmac100.h" + +diff --git a/drivers/net/ethernet/freescale/gianfar_ethtool.c b/drivers/net/ethernet/freescale/gianfar_ethtool.c +index 76d7070..f697118 100644 +--- a/drivers/net/ethernet/freescale/gianfar_ethtool.c ++++ b/drivers/net/ethernet/freescale/gianfar_ethtool.c +@@ -1581,7 +1581,7 @@ static int gfar_write_filer_table(struct gfar_private *priv, + return -EBUSY; + + /* Fill regular entries */ +- for (; i < MAX_FILER_IDX - 1 && (tab->fe[i].ctrl | tab->fe[i].ctrl); ++ for (; i < MAX_FILER_IDX - 1 && (tab->fe[i].ctrl | tab->fe[i].prop); + i++) + gfar_write_filer(priv, i, tab->fe[i].ctrl, tab->fe[i].prop); + /* Fill the rest with fall-troughs */ +diff --git a/drivers/net/ethernet/intel/i40e/i40e_ptp.c b/drivers/net/ethernet/intel/i40e/i40e_ptp.c +index 537b621..07f87ce 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_ptp.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_ptp.c +@@ -401,7 +401,7 @@ void i40e_ptp_set_increment(struct i40e_pf *pf) + wr32(hw, I40E_PRTTSYN_INC_H, incval >> 32); + + /* Update the base adjustement value. */ +- ACCESS_ONCE(pf->ptp_base_adj) = incval; ++ ACCESS_ONCE_RW(pf->ptp_base_adj) = incval; + smp_mb(); /* Force the above update. */ + } + +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c +index 5fd4b52..87aa34b 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c +@@ -794,7 +794,7 @@ void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter) + } + + /* update the base incval used to calculate frequency adjustment */ +- ACCESS_ONCE(adapter->base_incval) = incval; ++ ACCESS_ONCE_RW(adapter->base_incval) = incval; + smp_mb(); + + /* need lock to prevent incorrect read while modifying cyclecounter */ +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +index 11ff28b..375d659 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +@@ -458,8 +458,8 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev, + wmb(); + + /* we want to dirty this cache line once */ +- ACCESS_ONCE(ring->last_nr_txbb) = last_nr_txbb; +- ACCESS_ONCE(ring->cons) = ring_cons + txbbs_skipped; ++ ACCESS_ONCE_RW(ring->last_nr_txbb) = last_nr_txbb; ++ ACCESS_ONCE_RW(ring->cons) = ring_cons + txbbs_skipped; + + netdev_tx_completed_queue(ring->tx_queue, packets, bytes); + +diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h +index de10dbb..8b54f29 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h ++++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h +@@ -233,7 +233,8 @@ do { \ + extern int mlx4_log_num_mgm_entry_size; + extern int log_mtts_per_seg; + +-#define MLX4_MAX_NUM_SLAVES (MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF) ++#define MLX4_MAX_NUM_SLAVES (min(MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF, \ ++ MLX4_MFUNC_MAX)) + #define ALL_SLAVES 0xff + + struct mlx4_bitmap { +diff --git a/drivers/net/ethernet/neterion/s2io.c b/drivers/net/ethernet/neterion/s2io.c +index f5e4b82..db0c7a9 100644 +--- a/drivers/net/ethernet/neterion/s2io.c ++++ b/drivers/net/ethernet/neterion/s2io.c +@@ -6987,7 +6987,9 @@ static int s2io_add_isr(struct s2io_nic *sp) + if (sp->s2io_entries[i].in_use == MSIX_FLG) { + if (sp->s2io_entries[i].type == + MSIX_RING_TYPE) { +- sprintf(sp->desc[i], "%s:MSI-X-%d-RX", ++ snprintf(sp->desc[i], ++ sizeof(sp->desc[i]), ++ "%s:MSI-X-%d-RX", + dev->name, i); + err = request_irq(sp->entries[i].vector, + s2io_msix_ring_handle, +@@ -6996,7 +6998,9 @@ static int s2io_add_isr(struct s2io_nic *sp) + sp->s2io_entries[i].arg); + } else if (sp->s2io_entries[i].type == + MSIX_ALARM_TYPE) { +- sprintf(sp->desc[i], "%s:MSI-X-%d-TX", ++ snprintf(sp->desc[i], ++ sizeof(sp->desc[i]), ++ "%s:MSI-X-%d-TX", + dev->name, i); + err = request_irq(sp->entries[i].vector, + s2io_msix_fifo_handle, +@@ -8154,7 +8158,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) + "%s: UDP Fragmentation Offload(UFO) enabled\n", + dev->name); + /* Initialize device name */ +- sprintf(sp->name, "%s Neterion %s", dev->name, sp->product_name); ++ snprintf(sp->name, sizeof(sp->name), "%s Neterion %s", dev->name, ++ sp->product_name); + + if (vlan_tag_strip) + sp->vlan_strip_flag = 1; +diff --git a/drivers/net/ethernet/neterion/vxge/vxge-config.c b/drivers/net/ethernet/neterion/vxge/vxge-config.c +index 2bbd01f..e8baa64 100644 +--- a/drivers/net/ethernet/neterion/vxge/vxge-config.c ++++ b/drivers/net/ethernet/neterion/vxge/vxge-config.c +@@ -3457,7 +3457,10 @@ __vxge_hw_fifo_create(struct __vxge_hw_vpath_handle *vp, + struct __vxge_hw_fifo *fifo; + struct vxge_hw_fifo_config *config; + u32 txdl_size, txdl_per_memblock; +- struct vxge_hw_mempool_cbs fifo_mp_callback; ++ static struct vxge_hw_mempool_cbs fifo_mp_callback = { ++ .item_func_alloc = __vxge_hw_fifo_mempool_item_alloc, ++ }; ++ + struct __vxge_hw_virtualpath *vpath; + + if ((vp == NULL) || (attr == NULL)) { +@@ -3540,8 +3543,6 @@ __vxge_hw_fifo_create(struct __vxge_hw_vpath_handle *vp, + goto exit; + } + +- fifo_mp_callback.item_func_alloc = __vxge_hw_fifo_mempool_item_alloc; +- + fifo->mempool = + __vxge_hw_mempool_create(vpath->hldev, + fifo->config->memblock_size, +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +index 2bb48d5..d1a865d 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +@@ -2324,7 +2324,9 @@ int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter) + max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS; + } else if (ret == QLC_83XX_DEFAULT_OPMODE) { + ahw->nic_mode = QLCNIC_DEFAULT_MODE; +- adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; ++ pax_open_kernel(); ++ *(void **)&adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; ++ pax_close_kernel(); + ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; + max_sds_rings = QLCNIC_MAX_SDS_RINGS; + max_tx_rings = QLCNIC_MAX_TX_RINGS; +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c +index be7d7a6..a8983f8 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c +@@ -207,17 +207,23 @@ int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *adapter) + case QLCNIC_NON_PRIV_FUNC: + ahw->op_mode = QLCNIC_NON_PRIV_FUNC; + ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; +- nic_ops->init_driver = qlcnic_83xx_init_non_privileged_vnic; ++ pax_open_kernel(); ++ *(void **)&nic_ops->init_driver = qlcnic_83xx_init_non_privileged_vnic; ++ pax_close_kernel(); + break; + case QLCNIC_PRIV_FUNC: + ahw->op_mode = QLCNIC_PRIV_FUNC; + ahw->idc.state_entry = qlcnic_83xx_idc_vnic_pf_entry; +- nic_ops->init_driver = qlcnic_83xx_init_privileged_vnic; ++ pax_open_kernel(); ++ *(void **)&nic_ops->init_driver = qlcnic_83xx_init_privileged_vnic; ++ pax_close_kernel(); + break; + case QLCNIC_MGMT_FUNC: + ahw->op_mode = QLCNIC_MGMT_FUNC; + ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; +- nic_ops->init_driver = qlcnic_83xx_init_mgmt_vnic; ++ pax_open_kernel(); ++ *(void **)&nic_ops->init_driver = qlcnic_83xx_init_mgmt_vnic; ++ pax_close_kernel(); + break; + default: + dev_err(&adapter->pdev->dev, "Invalid Virtual NIC opmode\n"); +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +index c9f57fb..208bdc1 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +@@ -1285,7 +1285,7 @@ flash_temp: + int qlcnic_dump_fw(struct qlcnic_adapter *adapter) + { + struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; +- static const struct qlcnic_dump_operations *fw_dump_ops; ++ const struct qlcnic_dump_operations *fw_dump_ops; + struct qlcnic_83xx_dump_template_hdr *hdr_83xx; + u32 entry_offset, dump, no_entries, buf_offset = 0; + int i, k, ops_cnt, ops_index, dump_size = 0; +diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c +index 54390b3..9b8ade0 100644 +--- a/drivers/net/ethernet/realtek/r8169.c ++++ b/drivers/net/ethernet/realtek/r8169.c +@@ -788,22 +788,22 @@ struct rtl8169_private { + struct mdio_ops { + void (*write)(struct rtl8169_private *, int, int); + int (*read)(struct rtl8169_private *, int); +- } mdio_ops; ++ } __no_const mdio_ops; + + struct pll_power_ops { + void (*down)(struct rtl8169_private *); + void (*up)(struct rtl8169_private *); +- } pll_power_ops; ++ } __no_const pll_power_ops; + + struct jumbo_ops { + void (*enable)(struct rtl8169_private *); + void (*disable)(struct rtl8169_private *); +- } jumbo_ops; ++ } __no_const jumbo_ops; + + struct csi_ops { + void (*write)(struct rtl8169_private *, int, int); + u32 (*read)(struct rtl8169_private *, int); +- } csi_ops; ++ } __no_const csi_ops; + + int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv); + int (*get_settings)(struct net_device *, struct ethtool_cmd *); +diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c +index 6b861e3..204ac86 100644 +--- a/drivers/net/ethernet/sfc/ptp.c ++++ b/drivers/net/ethernet/sfc/ptp.c +@@ -822,7 +822,7 @@ static int efx_ptp_synchronize(struct efx_nic *efx, unsigned int num_readings) + ptp->start.dma_addr); + + /* Clear flag that signals MC ready */ +- ACCESS_ONCE(*start) = 0; ++ ACCESS_ONCE_RW(*start) = 0; + rc = efx_mcdi_rpc_start(efx, MC_CMD_PTP, synch_buf, + MC_CMD_PTP_IN_SYNCHRONIZE_LEN); + EFX_BUG_ON_PARANOID(rc); +diff --git a/drivers/net/ethernet/sfc/selftest.c b/drivers/net/ethernet/sfc/selftest.c +index 10b6173..b605dfd5 100644 +--- a/drivers/net/ethernet/sfc/selftest.c ++++ b/drivers/net/ethernet/sfc/selftest.c +@@ -46,7 +46,7 @@ struct efx_loopback_payload { + struct iphdr ip; + struct udphdr udp; + __be16 iteration; +- const char msg[64]; ++ char msg[64]; + } __packed; + + /* Loopback test source MAC address */ +diff --git a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c b/drivers/net/ethernet/stmicro/stmmac/mmc_core.c +index 08c483b..2c4a553 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c ++++ b/drivers/net/ethernet/stmicro/stmmac/mmc_core.c +@@ -140,8 +140,8 @@ void dwmac_mmc_ctrl(void __iomem *ioaddr, unsigned int mode) + + writel(value, ioaddr + MMC_CNTRL); + +- pr_debug("stmmac: MMC ctrl register (offset 0x%x): 0x%08x\n", +- MMC_CNTRL, value); ++// pr_debug("stmmac: MMC ctrl register (offset 0x%x): 0x%08x\n", ++// MMC_CNTRL, value); + } + + /* To mask all all interrupts.*/ +diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c +index 68c5260..b47b729 100644 +--- a/drivers/net/ethernet/via/via-rhine.c ++++ b/drivers/net/ethernet/via/via-rhine.c +@@ -2514,7 +2514,7 @@ static struct platform_driver rhine_driver_platform = { + } + }; + +-static struct dmi_system_id rhine_dmi_table[] __initdata = { ++static const struct dmi_system_id rhine_dmi_table[] __initconst = { + { + .ident = "EPIA-M", + .matches = { +diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h +index 2f48f79..8ae1a1a 100644 +--- a/drivers/net/hyperv/hyperv_net.h ++++ b/drivers/net/hyperv/hyperv_net.h +@@ -171,7 +171,7 @@ struct rndis_device { + enum rndis_device_state state; + bool link_state; + bool link_change; +- atomic_t new_req_id; ++ atomic_unchecked_t new_req_id; + + spinlock_t request_lock; + struct list_head req_list; +diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c +index 2b86f0b..ecc996f 100644 +--- a/drivers/net/hyperv/rndis_filter.c ++++ b/drivers/net/hyperv/rndis_filter.c +@@ -102,7 +102,7 @@ static struct rndis_request *get_rndis_request(struct rndis_device *dev, + * template + */ + set = &rndis_msg->msg.set_req; +- set->req_id = atomic_inc_return(&dev->new_req_id); ++ set->req_id = atomic_inc_return_unchecked(&dev->new_req_id); + + /* Add to the request list */ + spin_lock_irqsave(&dev->request_lock, flags); +@@ -911,7 +911,7 @@ static void rndis_filter_halt_device(struct rndis_device *dev) + + /* Setup the rndis set */ + halt = &request->request_msg.msg.halt_req; +- halt->req_id = atomic_inc_return(&dev->new_req_id); ++ halt->req_id = atomic_inc_return_unchecked(&dev->new_req_id); + + /* Ignore return since this msg is optional. */ + rndis_filter_send_request(dev, request); +diff --git a/drivers/net/ieee802154/fakehard.c b/drivers/net/ieee802154/fakehard.c +index 6cbc56a..5f7e6c8 100644 +--- a/drivers/net/ieee802154/fakehard.c ++++ b/drivers/net/ieee802154/fakehard.c +@@ -365,7 +365,7 @@ static int ieee802154fake_probe(struct platform_device *pdev) + phy->transmit_power = 0xbf; + + dev->netdev_ops = &fake_ops; +- dev->ml_priv = &fake_mlme; ++ dev->ml_priv = (void *)&fake_mlme; + + priv = netdev_priv(dev); + priv->phy = phy; +diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c +index 34f846b..4a0d5b1 100644 +--- a/drivers/net/ifb.c ++++ b/drivers/net/ifb.c +@@ -253,7 +253,7 @@ static int ifb_validate(struct nlattr *tb[], struct nlattr *data[]) + return 0; + } + +-static struct rtnl_link_ops ifb_link_ops __read_mostly = { ++static struct rtnl_link_ops ifb_link_ops = { + .kind = "ifb", + .priv_size = sizeof(struct ifb_private), + .setup = ifb_setup, +diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c +index bfb0b6e..5c396ce 100644 +--- a/drivers/net/macvlan.c ++++ b/drivers/net/macvlan.c +@@ -335,7 +335,7 @@ static void macvlan_broadcast_enqueue(struct macvlan_port *port, + free_nskb: + kfree_skb(nskb); + err: +- atomic_long_inc(&skb->dev->rx_dropped); ++ atomic_long_inc_unchecked(&skb->dev->rx_dropped); + } + + static void macvlan_flush_sources(struct macvlan_port *port, +@@ -1454,13 +1454,15 @@ static const struct nla_policy macvlan_policy[IFLA_MACVLAN_MAX + 1] = { + int macvlan_link_register(struct rtnl_link_ops *ops) + { + /* common fields */ +- ops->priv_size = sizeof(struct macvlan_dev); +- ops->validate = macvlan_validate; +- ops->maxtype = IFLA_MACVLAN_MAX; +- ops->policy = macvlan_policy; +- ops->changelink = macvlan_changelink; +- ops->get_size = macvlan_get_size; +- ops->fill_info = macvlan_fill_info; ++ pax_open_kernel(); ++ *(size_t *)&ops->priv_size = sizeof(struct macvlan_dev); ++ *(void **)&ops->validate = macvlan_validate; ++ *(int *)&ops->maxtype = IFLA_MACVLAN_MAX; ++ *(const void **)&ops->policy = macvlan_policy; ++ *(void **)&ops->changelink = macvlan_changelink; ++ *(void **)&ops->get_size = macvlan_get_size; ++ *(void **)&ops->fill_info = macvlan_fill_info; ++ pax_close_kernel(); + + return rtnl_link_register(ops); + }; +@@ -1540,7 +1542,7 @@ static int macvlan_device_event(struct notifier_block *unused, + return NOTIFY_DONE; + } + +-static struct notifier_block macvlan_notifier_block __read_mostly = { ++static struct notifier_block macvlan_notifier_block = { + .notifier_call = macvlan_device_event, + }; + +diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c +index 91d0c6a..764aee1 100644 +--- a/drivers/net/macvtap.c ++++ b/drivers/net/macvtap.c +@@ -422,7 +422,7 @@ static void macvtap_setup(struct net_device *dev) + dev->tx_queue_len = TUN_READQ_SIZE; + } + +-static struct rtnl_link_ops macvtap_link_ops __read_mostly = { ++static struct rtnl_link_ops macvtap_link_ops = { + .kind = "macvtap", + .setup = macvtap_setup, + .newlink = macvtap_newlink, +@@ -1023,7 +1023,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, + } + + ret = 0; +- if (copy_to_user(&ifr->ifr_name, vlan->dev->name, IFNAMSIZ) || ++ if (copy_to_user(ifr->ifr_name, vlan->dev->name, IFNAMSIZ) || + put_user(q->flags, &ifr->ifr_flags)) + ret = -EFAULT; + macvtap_put_vlan(vlan); +@@ -1193,7 +1193,7 @@ static int macvtap_device_event(struct notifier_block *unused, + return NOTIFY_DONE; + } + +-static struct notifier_block macvtap_notifier_block __read_mostly = { ++static struct notifier_block macvtap_notifier_block = { + .notifier_call = macvtap_device_event, + }; + +diff --git a/drivers/net/nlmon.c b/drivers/net/nlmon.c +index 34924df..a747360 100644 +--- a/drivers/net/nlmon.c ++++ b/drivers/net/nlmon.c +@@ -154,7 +154,7 @@ static int nlmon_validate(struct nlattr *tb[], struct nlattr *data[]) + return 0; + } + +-static struct rtnl_link_ops nlmon_link_ops __read_mostly = { ++static struct rtnl_link_ops nlmon_link_ops = { + .kind = "nlmon", + .priv_size = sizeof(struct nlmon), + .setup = nlmon_setup, +diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c +index 3fc91e8..6c36337 100644 +--- a/drivers/net/phy/phy_device.c ++++ b/drivers/net/phy/phy_device.c +@@ -218,7 +218,7 @@ EXPORT_SYMBOL(phy_device_create); + * zero on success. + * + */ +-static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id, ++static int get_phy_c45_ids(struct mii_bus *bus, int addr, int *phy_id, + struct phy_c45_device_ids *c45_ids) { + int phy_reg; + int i, reg_addr; +@@ -288,7 +288,7 @@ static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id, + * its return value is in turn returned. + * + */ +-static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id, ++static int get_phy_id(struct mii_bus *bus, int addr, int *phy_id, + bool is_c45, struct phy_c45_device_ids *c45_ids) + { + int phy_reg; +@@ -326,7 +326,7 @@ static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id, + struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45) + { + struct phy_c45_device_ids c45_ids = {0}; +- u32 phy_id = 0; ++ int phy_id = 0; + int r; + + r = get_phy_id(bus, addr, &phy_id, is_c45, &c45_ids); +diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c +index 794a473..9fd437b 100644 +--- a/drivers/net/ppp/ppp_generic.c ++++ b/drivers/net/ppp/ppp_generic.c +@@ -1020,7 +1020,6 @@ ppp_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + void __user *addr = (void __user *) ifr->ifr_ifru.ifru_data; + struct ppp_stats stats; + struct ppp_comp_stats cstats; +- char *vers; + + switch (cmd) { + case SIOCGPPPSTATS: +@@ -1042,8 +1041,7 @@ ppp_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + break; + + case SIOCGPPPVER: +- vers = PPP_VERSION; +- if (copy_to_user(addr, vers, strlen(vers) + 1)) ++ if (copy_to_user(addr, PPP_VERSION, sizeof(PPP_VERSION))) + break; + err = 0; + break; +diff --git a/drivers/net/slip/slhc.c b/drivers/net/slip/slhc.c +index 079f7ad..b2a2bfa7 100644 +--- a/drivers/net/slip/slhc.c ++++ b/drivers/net/slip/slhc.c +@@ -487,7 +487,7 @@ slhc_uncompress(struct slcompress *comp, unsigned char *icp, int isize) + register struct tcphdr *thp; + register struct iphdr *ip; + register struct cstate *cs; +- int len, hdrlen; ++ long len, hdrlen; + unsigned char *cp = icp; + + /* We've got a compressed packet; read the change byte */ +diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c +index ebc95a3..cb2cd86 100644 +--- a/drivers/net/team/team.c ++++ b/drivers/net/team/team.c +@@ -2100,7 +2100,7 @@ static unsigned int team_get_num_rx_queues(void) + return TEAM_DEFAULT_NUM_RX_QUEUES; + } + +-static struct rtnl_link_ops team_link_ops __read_mostly = { ++static struct rtnl_link_ops team_link_ops = { + .kind = DRV_NAME, + .priv_size = sizeof(struct team), + .setup = team_setup, +@@ -2890,7 +2890,7 @@ static int team_device_event(struct notifier_block *unused, + return NOTIFY_DONE; + } + +-static struct notifier_block team_notifier_block __read_mostly = { ++static struct notifier_block team_notifier_block = { + .notifier_call = team_device_event, + }; + +diff --git a/drivers/net/tun.c b/drivers/net/tun.c +index 9dd3746..74f191e 100644 +--- a/drivers/net/tun.c ++++ b/drivers/net/tun.c +@@ -1426,7 +1426,7 @@ static int tun_validate(struct nlattr *tb[], struct nlattr *data[]) + return -EINVAL; + } + +-static struct rtnl_link_ops tun_link_ops __read_mostly = { ++static struct rtnl_link_ops tun_link_ops = { + .kind = DRV_NAME, + .priv_size = sizeof(struct tun_struct), + .setup = tun_setup, +@@ -1868,7 +1868,7 @@ unlock: + } + + static long __tun_chr_ioctl(struct file *file, unsigned int cmd, +- unsigned long arg, int ifreq_len) ++ unsigned long arg, size_t ifreq_len) + { + struct tun_file *tfile = file->private_data; + struct tun_struct *tun; +@@ -1881,6 +1881,9 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd, + unsigned int ifindex; + int ret; + ++ if (ifreq_len > sizeof ifr) ++ return -EFAULT; ++ + if (cmd == TUNSETIFF || cmd == TUNSETQUEUE || _IOC_TYPE(cmd) == 0x89) { + if (copy_from_user(&ifr, argp, ifreq_len)) + return -EFAULT; +diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c +index babda7d..e40c90a 100644 +--- a/drivers/net/usb/hso.c ++++ b/drivers/net/usb/hso.c +@@ -71,7 +71,7 @@ + #include <asm/byteorder.h> + #include <linux/serial_core.h> + #include <linux/serial.h> +- ++#include <asm/local.h> + + #define MOD_AUTHOR "Option Wireless" + #define MOD_DESCRIPTION "USB High Speed Option driver" +@@ -1178,7 +1178,7 @@ static void put_rxbuf_data_and_resubmit_ctrl_urb(struct hso_serial *serial) + struct urb *urb; + + urb = serial->rx_urb[0]; +- if (serial->port.count > 0) { ++ if (atomic_read(&serial->port.count) > 0) { + count = put_rxbuf_data(urb, serial); + if (count == -1) + return; +@@ -1216,7 +1216,7 @@ static void hso_std_serial_read_bulk_callback(struct urb *urb) + DUMP1(urb->transfer_buffer, urb->actual_length); + + /* Anyone listening? */ +- if (serial->port.count == 0) ++ if (atomic_read(&serial->port.count) == 0) + return; + + if (serial->parent->port_spec & HSO_INFO_CRC_BUG) +@@ -1278,8 +1278,7 @@ static int hso_serial_open(struct tty_struct *tty, struct file *filp) + tty_port_tty_set(&serial->port, tty); + + /* check for port already opened, if not set the termios */ +- serial->port.count++; +- if (serial->port.count == 1) { ++ if (atomic_inc_return(&serial->port.count) == 1) { + serial->rx_state = RX_IDLE; + /* Force default termio settings */ + _hso_serial_set_termios(tty, NULL); +@@ -1289,7 +1288,7 @@ static int hso_serial_open(struct tty_struct *tty, struct file *filp) + result = hso_start_serial_device(serial->parent, GFP_KERNEL); + if (result) { + hso_stop_serial_device(serial->parent); +- serial->port.count--; ++ atomic_dec(&serial->port.count); + kref_put(&serial->parent->ref, hso_serial_ref_free); + } + } else { +@@ -1326,10 +1325,10 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp) + + /* reset the rts and dtr */ + /* do the actual close */ +- serial->port.count--; ++ atomic_dec(&serial->port.count); + +- if (serial->port.count <= 0) { +- serial->port.count = 0; ++ if (atomic_read(&serial->port.count) <= 0) { ++ atomic_set(&serial->port.count, 0); + tty_port_tty_set(&serial->port, NULL); + if (!usb_gone) + hso_stop_serial_device(serial->parent); +@@ -1404,7 +1403,7 @@ static void hso_serial_set_termios(struct tty_struct *tty, struct ktermios *old) + + /* the actual setup */ + spin_lock_irqsave(&serial->serial_lock, flags); +- if (serial->port.count) ++ if (atomic_read(&serial->port.count)) + _hso_serial_set_termios(tty, old); + else + tty->termios = *old; +@@ -1873,7 +1872,7 @@ static void intr_callback(struct urb *urb) + D1("Pending read interrupt on port %d\n", i); + spin_lock(&serial->serial_lock); + if (serial->rx_state == RX_IDLE && +- serial->port.count > 0) { ++ atomic_read(&serial->port.count) > 0) { + /* Setup and send a ctrl req read on + * port i */ + if (!serial->rx_urb_filled[0]) { +@@ -3047,7 +3046,7 @@ static int hso_resume(struct usb_interface *iface) + /* Start all serial ports */ + for (i = 0; i < HSO_SERIAL_TTY_MINORS; i++) { + if (serial_table[i] && (serial_table[i]->interface == iface)) { +- if (dev2ser(serial_table[i])->port.count) { ++ if (atomic_read(&dev2ser(serial_table[i])->port.count)) { + result = + hso_start_serial_device(serial_table[i], GFP_NOIO); + hso_kick_transmit(dev2ser(serial_table[i])); +diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c +index c6554c7..7e2ebd7 100644 +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -577,7 +577,7 @@ struct r8152 { + void (*unload)(struct r8152 *); + int (*eee_get)(struct r8152 *, struct ethtool_eee *); + int (*eee_set)(struct r8152 *, struct ethtool_eee *); +- } rtl_ops; ++ } __no_const rtl_ops; + + int intr_interval; + u32 saved_wolopts; +diff --git a/drivers/net/usb/sierra_net.c b/drivers/net/usb/sierra_net.c +index a2515887..6d13233 100644 +--- a/drivers/net/usb/sierra_net.c ++++ b/drivers/net/usb/sierra_net.c +@@ -51,7 +51,7 @@ static const char driver_name[] = "sierra_net"; + /* atomic counter partially included in MAC address to make sure 2 devices + * do not end up with the same MAC - concept breaks in case of > 255 ifaces + */ +-static atomic_t iface_counter = ATOMIC_INIT(0); ++static atomic_unchecked_t iface_counter = ATOMIC_INIT(0); + + /* + * SYNC Timer Delay definition used to set the expiry time +@@ -697,7 +697,7 @@ static int sierra_net_bind(struct usbnet *dev, struct usb_interface *intf) + dev->net->netdev_ops = &sierra_net_device_ops; + + /* change MAC addr to include, ifacenum, and to be unique */ +- dev->net->dev_addr[ETH_ALEN-2] = atomic_inc_return(&iface_counter); ++ dev->net->dev_addr[ETH_ALEN-2] = atomic_inc_return_unchecked(&iface_counter); + dev->net->dev_addr[ETH_ALEN-1] = ifacenum; + + /* we will have to manufacture ethernet headers, prepare template */ +diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c +index 484ecce..6f56a50 100644 +--- a/drivers/net/virtio_net.c ++++ b/drivers/net/virtio_net.c +@@ -48,7 +48,7 @@ module_param(gso, bool, 0444); + #define RECEIVE_AVG_WEIGHT 64 + + /* Minimum alignment for mergeable packet buffers. */ +-#define MERGEABLE_BUFFER_ALIGN max(L1_CACHE_BYTES, 256) ++#define MERGEABLE_BUFFER_ALIGN max(L1_CACHE_BYTES, 256UL) + + #define VIRTNET_DRIVER_VERSION "1.0.0" + +diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c +index 2826c55..28464afc 100644 +--- a/drivers/net/vxlan.c ++++ b/drivers/net/vxlan.c +@@ -2699,7 +2699,7 @@ nla_put_failure: + return -EMSGSIZE; + } + +-static struct rtnl_link_ops vxlan_link_ops __read_mostly = { ++static struct rtnl_link_ops vxlan_link_ops = { + .kind = "vxlan", + .maxtype = IFLA_VXLAN_MAX, + .policy = vxlan_policy, +@@ -2746,7 +2746,7 @@ static int vxlan_lowerdev_event(struct notifier_block *unused, + return NOTIFY_DONE; + } + +-static struct notifier_block vxlan_notifier_block __read_mostly = { ++static struct notifier_block vxlan_notifier_block = { + .notifier_call = vxlan_lowerdev_event, + }; + +diff --git a/drivers/net/wan/lmc/lmc_media.c b/drivers/net/wan/lmc/lmc_media.c +index 5920c99..ff2e4a5 100644 +--- a/drivers/net/wan/lmc/lmc_media.c ++++ b/drivers/net/wan/lmc/lmc_media.c +@@ -95,62 +95,63 @@ static inline void write_av9110_bit (lmc_softc_t *, int); + static void write_av9110(lmc_softc_t *, u32, u32, u32, u32, u32); + + lmc_media_t lmc_ds3_media = { +- lmc_ds3_init, /* special media init stuff */ +- lmc_ds3_default, /* reset to default state */ +- lmc_ds3_set_status, /* reset status to state provided */ +- lmc_dummy_set_1, /* set clock source */ +- lmc_dummy_set2_1, /* set line speed */ +- lmc_ds3_set_100ft, /* set cable length */ +- lmc_ds3_set_scram, /* set scrambler */ +- lmc_ds3_get_link_status, /* get link status */ +- lmc_dummy_set_1, /* set link status */ +- lmc_ds3_set_crc_length, /* set CRC length */ +- lmc_dummy_set_1, /* set T1 or E1 circuit type */ +- lmc_ds3_watchdog ++ .init = lmc_ds3_init, /* special media init stuff */ ++ .defaults = lmc_ds3_default, /* reset to default state */ ++ .set_status = lmc_ds3_set_status, /* reset status to state provided */ ++ .set_clock_source = lmc_dummy_set_1, /* set clock source */ ++ .set_speed = lmc_dummy_set2_1, /* set line speed */ ++ .set_cable_length = lmc_ds3_set_100ft, /* set cable length */ ++ .set_scrambler = lmc_ds3_set_scram, /* set scrambler */ ++ .get_link_status = lmc_ds3_get_link_status, /* get link status */ ++ .set_link_status = lmc_dummy_set_1, /* set link status */ ++ .set_crc_length = lmc_ds3_set_crc_length, /* set CRC length */ ++ .set_circuit_type = lmc_dummy_set_1, /* set T1 or E1 circuit type */ ++ .watchdog = lmc_ds3_watchdog + }; + + lmc_media_t lmc_hssi_media = { +- lmc_hssi_init, /* special media init stuff */ +- lmc_hssi_default, /* reset to default state */ +- lmc_hssi_set_status, /* reset status to state provided */ +- lmc_hssi_set_clock, /* set clock source */ +- lmc_dummy_set2_1, /* set line speed */ +- lmc_dummy_set_1, /* set cable length */ +- lmc_dummy_set_1, /* set scrambler */ +- lmc_hssi_get_link_status, /* get link status */ +- lmc_hssi_set_link_status, /* set link status */ +- lmc_hssi_set_crc_length, /* set CRC length */ +- lmc_dummy_set_1, /* set T1 or E1 circuit type */ +- lmc_hssi_watchdog ++ .init = lmc_hssi_init, /* special media init stuff */ ++ .defaults = lmc_hssi_default, /* reset to default state */ ++ .set_status = lmc_hssi_set_status, /* reset status to state provided */ ++ .set_clock_source = lmc_hssi_set_clock, /* set clock source */ ++ .set_speed = lmc_dummy_set2_1, /* set line speed */ ++ .set_cable_length = lmc_dummy_set_1, /* set cable length */ ++ .set_scrambler = lmc_dummy_set_1, /* set scrambler */ ++ .get_link_status = lmc_hssi_get_link_status, /* get link status */ ++ .set_link_status = lmc_hssi_set_link_status, /* set link status */ ++ .set_crc_length = lmc_hssi_set_crc_length, /* set CRC length */ ++ .set_circuit_type = lmc_dummy_set_1, /* set T1 or E1 circuit type */ ++ .watchdog = lmc_hssi_watchdog + }; + +-lmc_media_t lmc_ssi_media = { lmc_ssi_init, /* special media init stuff */ +- lmc_ssi_default, /* reset to default state */ +- lmc_ssi_set_status, /* reset status to state provided */ +- lmc_ssi_set_clock, /* set clock source */ +- lmc_ssi_set_speed, /* set line speed */ +- lmc_dummy_set_1, /* set cable length */ +- lmc_dummy_set_1, /* set scrambler */ +- lmc_ssi_get_link_status, /* get link status */ +- lmc_ssi_set_link_status, /* set link status */ +- lmc_ssi_set_crc_length, /* set CRC length */ +- lmc_dummy_set_1, /* set T1 or E1 circuit type */ +- lmc_ssi_watchdog ++lmc_media_t lmc_ssi_media = { ++ .init = lmc_ssi_init, /* special media init stuff */ ++ .defaults = lmc_ssi_default, /* reset to default state */ ++ .set_status = lmc_ssi_set_status, /* reset status to state provided */ ++ .set_clock_source = lmc_ssi_set_clock, /* set clock source */ ++ .set_speed = lmc_ssi_set_speed, /* set line speed */ ++ .set_cable_length = lmc_dummy_set_1, /* set cable length */ ++ .set_scrambler = lmc_dummy_set_1, /* set scrambler */ ++ .get_link_status = lmc_ssi_get_link_status, /* get link status */ ++ .set_link_status = lmc_ssi_set_link_status, /* set link status */ ++ .set_crc_length = lmc_ssi_set_crc_length, /* set CRC length */ ++ .set_circuit_type = lmc_dummy_set_1, /* set T1 or E1 circuit type */ ++ .watchdog = lmc_ssi_watchdog + }; + + lmc_media_t lmc_t1_media = { +- lmc_t1_init, /* special media init stuff */ +- lmc_t1_default, /* reset to default state */ +- lmc_t1_set_status, /* reset status to state provided */ +- lmc_t1_set_clock, /* set clock source */ +- lmc_dummy_set2_1, /* set line speed */ +- lmc_dummy_set_1, /* set cable length */ +- lmc_dummy_set_1, /* set scrambler */ +- lmc_t1_get_link_status, /* get link status */ +- lmc_dummy_set_1, /* set link status */ +- lmc_t1_set_crc_length, /* set CRC length */ +- lmc_t1_set_circuit_type, /* set T1 or E1 circuit type */ +- lmc_t1_watchdog ++ .init = lmc_t1_init, /* special media init stuff */ ++ .defaults = lmc_t1_default, /* reset to default state */ ++ .set_status = lmc_t1_set_status, /* reset status to state provided */ ++ .set_clock_source = lmc_t1_set_clock, /* set clock source */ ++ .set_speed = lmc_dummy_set2_1, /* set line speed */ ++ .set_cable_length = lmc_dummy_set_1, /* set cable length */ ++ .set_scrambler = lmc_dummy_set_1, /* set scrambler */ ++ .get_link_status = lmc_t1_get_link_status, /* get link status */ ++ .set_link_status = lmc_dummy_set_1, /* set link status */ ++ .set_crc_length = lmc_t1_set_crc_length, /* set CRC length */ ++ .set_circuit_type = lmc_t1_set_circuit_type, /* set T1 or E1 circuit type */ ++ .watchdog = lmc_t1_watchdog + }; + + static void +diff --git a/drivers/net/wan/z85230.c b/drivers/net/wan/z85230.c +index feacc3b..5bac0de 100644 +--- a/drivers/net/wan/z85230.c ++++ b/drivers/net/wan/z85230.c +@@ -485,9 +485,9 @@ static void z8530_status(struct z8530_channel *chan) + + struct z8530_irqhandler z8530_sync = + { +- z8530_rx, +- z8530_tx, +- z8530_status ++ .rx = z8530_rx, ++ .tx = z8530_tx, ++ .status = z8530_status + }; + + EXPORT_SYMBOL(z8530_sync); +@@ -605,15 +605,15 @@ static void z8530_dma_status(struct z8530_channel *chan) + } + + static struct z8530_irqhandler z8530_dma_sync = { +- z8530_dma_rx, +- z8530_dma_tx, +- z8530_dma_status ++ .rx = z8530_dma_rx, ++ .tx = z8530_dma_tx, ++ .status = z8530_dma_status + }; + + static struct z8530_irqhandler z8530_txdma_sync = { +- z8530_rx, +- z8530_dma_tx, +- z8530_dma_status ++ .rx = z8530_rx, ++ .tx = z8530_dma_tx, ++ .status = z8530_dma_status + }; + + /** +@@ -680,9 +680,9 @@ static void z8530_status_clear(struct z8530_channel *chan) + + struct z8530_irqhandler z8530_nop= + { +- z8530_rx_clear, +- z8530_tx_clear, +- z8530_status_clear ++ .rx = z8530_rx_clear, ++ .tx = z8530_tx_clear, ++ .status = z8530_status_clear + }; + + +diff --git a/drivers/net/wimax/i2400m/rx.c b/drivers/net/wimax/i2400m/rx.c +index 0b60295..b8bfa5b 100644 +--- a/drivers/net/wimax/i2400m/rx.c ++++ b/drivers/net/wimax/i2400m/rx.c +@@ -1359,7 +1359,7 @@ int i2400m_rx_setup(struct i2400m *i2400m) + if (i2400m->rx_roq == NULL) + goto error_roq_alloc; + +- rd = kcalloc(I2400M_RO_CIN + 1, sizeof(*i2400m->rx_roq[0].log), ++ rd = kcalloc(sizeof(*i2400m->rx_roq[0].log), I2400M_RO_CIN + 1, + GFP_KERNEL); + if (rd == NULL) { + result = -ENOMEM; +diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c +index e71a2ce..2268d61 100644 +--- a/drivers/net/wireless/airo.c ++++ b/drivers/net/wireless/airo.c +@@ -7846,7 +7846,7 @@ static int writerids(struct net_device *dev, aironet_ioctl *comp) { + struct airo_info *ai = dev->ml_priv; + int ridcode; + int enabled; +- static int (* writer)(struct airo_info *, u16 rid, const void *, int, int); ++ int (* writer)(struct airo_info *, u16 rid, const void *, int, int); + unsigned char *iobuf; + + /* Only super-user can write RIDs */ +diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c +index da92bfa..5a9001a 100644 +--- a/drivers/net/wireless/at76c50x-usb.c ++++ b/drivers/net/wireless/at76c50x-usb.c +@@ -353,7 +353,7 @@ static int at76_dfu_get_state(struct usb_device *udev, u8 *state) + } + + /* Convert timeout from the DFU status to jiffies */ +-static inline unsigned long at76_get_timeout(struct dfu_status *s) ++static inline unsigned long __intentional_overflow(-1) at76_get_timeout(struct dfu_status *s) + { + return msecs_to_jiffies((s->poll_timeout[2] << 16) + | (s->poll_timeout[1] << 8) +diff --git a/drivers/net/wireless/ath/ath10k/htc.c b/drivers/net/wireless/ath/ath10k/htc.c +index 676bd4e..0b807a3 100644 +--- a/drivers/net/wireless/ath/ath10k/htc.c ++++ b/drivers/net/wireless/ath/ath10k/htc.c +@@ -848,7 +848,10 @@ int ath10k_htc_start(struct ath10k_htc *htc) + /* registered target arrival callback from the HIF layer */ + int ath10k_htc_init(struct ath10k *ar) + { +- struct ath10k_hif_cb htc_callbacks; ++ static struct ath10k_hif_cb htc_callbacks = { ++ .rx_completion = ath10k_htc_rx_completion_handler, ++ .tx_completion = ath10k_htc_tx_completion_handler, ++ }; + struct ath10k_htc_ep *ep = NULL; + struct ath10k_htc *htc = &ar->htc; + +@@ -857,8 +860,6 @@ int ath10k_htc_init(struct ath10k *ar) + ath10k_htc_reset_endpoint_states(htc); + + /* setup HIF layer callbacks */ +- htc_callbacks.rx_completion = ath10k_htc_rx_completion_handler; +- htc_callbacks.tx_completion = ath10k_htc_tx_completion_handler; + htc->ar = ar; + + /* Get HIF default pipe for HTC message exchange */ +diff --git a/drivers/net/wireless/ath/ath10k/htc.h b/drivers/net/wireless/ath/ath10k/htc.h +index 527179c..a890150 100644 +--- a/drivers/net/wireless/ath/ath10k/htc.h ++++ b/drivers/net/wireless/ath/ath10k/htc.h +@@ -270,13 +270,13 @@ enum ath10k_htc_ep_id { + + struct ath10k_htc_ops { + void (*target_send_suspend_complete)(struct ath10k *ar); +-}; ++} __no_const; + + struct ath10k_htc_ep_ops { + void (*ep_tx_complete)(struct ath10k *, struct sk_buff *); + void (*ep_rx_complete)(struct ath10k *, struct sk_buff *); + void (*ep_tx_credits)(struct ath10k *); +-}; ++} __no_const; + + /* service connection information */ + struct ath10k_htc_svc_conn_req { +diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c +index 2a93519..7052786 100644 +--- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c ++++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c +@@ -220,8 +220,8 @@ ar9002_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i) + ads->ds_txstatus6 = ads->ds_txstatus7 = 0; + ads->ds_txstatus8 = ads->ds_txstatus9 = 0; + +- ACCESS_ONCE(ads->ds_link) = i->link; +- ACCESS_ONCE(ads->ds_data) = i->buf_addr[0]; ++ ACCESS_ONCE_RW(ads->ds_link) = i->link; ++ ACCESS_ONCE_RW(ads->ds_data) = i->buf_addr[0]; + + ctl1 = i->buf_len[0] | (i->is_last ? 0 : AR_TxMore); + ctl6 = SM(i->keytype, AR_EncrType); +@@ -235,26 +235,26 @@ ar9002_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i) + + if ((i->is_first || i->is_last) && + i->aggr != AGGR_BUF_MIDDLE && i->aggr != AGGR_BUF_LAST) { +- ACCESS_ONCE(ads->ds_ctl2) = set11nTries(i->rates, 0) ++ ACCESS_ONCE_RW(ads->ds_ctl2) = set11nTries(i->rates, 0) + | set11nTries(i->rates, 1) + | set11nTries(i->rates, 2) + | set11nTries(i->rates, 3) + | (i->dur_update ? AR_DurUpdateEna : 0) + | SM(0, AR_BurstDur); + +- ACCESS_ONCE(ads->ds_ctl3) = set11nRate(i->rates, 0) ++ ACCESS_ONCE_RW(ads->ds_ctl3) = set11nRate(i->rates, 0) + | set11nRate(i->rates, 1) + | set11nRate(i->rates, 2) + | set11nRate(i->rates, 3); + } else { +- ACCESS_ONCE(ads->ds_ctl2) = 0; +- ACCESS_ONCE(ads->ds_ctl3) = 0; ++ ACCESS_ONCE_RW(ads->ds_ctl2) = 0; ++ ACCESS_ONCE_RW(ads->ds_ctl3) = 0; + } + + if (!i->is_first) { +- ACCESS_ONCE(ads->ds_ctl0) = 0; +- ACCESS_ONCE(ads->ds_ctl1) = ctl1; +- ACCESS_ONCE(ads->ds_ctl6) = ctl6; ++ ACCESS_ONCE_RW(ads->ds_ctl0) = 0; ++ ACCESS_ONCE_RW(ads->ds_ctl1) = ctl1; ++ ACCESS_ONCE_RW(ads->ds_ctl6) = ctl6; + return; + } + +@@ -279,7 +279,7 @@ ar9002_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i) + break; + } + +- ACCESS_ONCE(ads->ds_ctl0) = (i->pkt_len & AR_FrameLen) ++ ACCESS_ONCE_RW(ads->ds_ctl0) = (i->pkt_len & AR_FrameLen) + | (i->flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) + | SM(i->txpower, AR_XmitPower0) + | (i->flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) +@@ -289,27 +289,27 @@ ar9002_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i) + | (i->flags & ATH9K_TXDESC_RTSENA ? AR_RTSEnable : + (i->flags & ATH9K_TXDESC_CTSENA ? AR_CTSEnable : 0)); + +- ACCESS_ONCE(ads->ds_ctl1) = ctl1; +- ACCESS_ONCE(ads->ds_ctl6) = ctl6; ++ ACCESS_ONCE_RW(ads->ds_ctl1) = ctl1; ++ ACCESS_ONCE_RW(ads->ds_ctl6) = ctl6; + + if (i->aggr == AGGR_BUF_MIDDLE || i->aggr == AGGR_BUF_LAST) + return; + +- ACCESS_ONCE(ads->ds_ctl4) = set11nPktDurRTSCTS(i->rates, 0) ++ ACCESS_ONCE_RW(ads->ds_ctl4) = set11nPktDurRTSCTS(i->rates, 0) + | set11nPktDurRTSCTS(i->rates, 1); + +- ACCESS_ONCE(ads->ds_ctl5) = set11nPktDurRTSCTS(i->rates, 2) ++ ACCESS_ONCE_RW(ads->ds_ctl5) = set11nPktDurRTSCTS(i->rates, 2) + | set11nPktDurRTSCTS(i->rates, 3); + +- ACCESS_ONCE(ads->ds_ctl7) = set11nRateFlags(i->rates, 0) ++ ACCESS_ONCE_RW(ads->ds_ctl7) = set11nRateFlags(i->rates, 0) + | set11nRateFlags(i->rates, 1) + | set11nRateFlags(i->rates, 2) + | set11nRateFlags(i->rates, 3) + | SM(i->rtscts_rate, AR_RTSCTSRate); + +- ACCESS_ONCE(ads->ds_ctl9) = SM(i->txpower, AR_XmitPower1); +- ACCESS_ONCE(ads->ds_ctl10) = SM(i->txpower, AR_XmitPower2); +- ACCESS_ONCE(ads->ds_ctl11) = SM(i->txpower, AR_XmitPower3); ++ ACCESS_ONCE_RW(ads->ds_ctl9) = SM(i->txpower, AR_XmitPower1); ++ ACCESS_ONCE_RW(ads->ds_ctl10) = SM(i->txpower, AR_XmitPower2); ++ ACCESS_ONCE_RW(ads->ds_ctl11) = SM(i->txpower, AR_XmitPower3); + } + + static int ar9002_hw_proc_txdesc(struct ath_hw *ah, void *ds, +diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c +index 057b165..98ae88f 100644 +--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c +@@ -39,47 +39,47 @@ ar9003_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i) + (i->qcu << AR_TxQcuNum_S) | desc_len; + + checksum += val; +- ACCESS_ONCE(ads->info) = val; ++ ACCESS_ONCE_RW(ads->info) = val; + + checksum += i->link; +- ACCESS_ONCE(ads->link) = i->link; ++ ACCESS_ONCE_RW(ads->link) = i->link; + + checksum += i->buf_addr[0]; +- ACCESS_ONCE(ads->data0) = i->buf_addr[0]; ++ ACCESS_ONCE_RW(ads->data0) = i->buf_addr[0]; + checksum += i->buf_addr[1]; +- ACCESS_ONCE(ads->data1) = i->buf_addr[1]; ++ ACCESS_ONCE_RW(ads->data1) = i->buf_addr[1]; + checksum += i->buf_addr[2]; +- ACCESS_ONCE(ads->data2) = i->buf_addr[2]; ++ ACCESS_ONCE_RW(ads->data2) = i->buf_addr[2]; + checksum += i->buf_addr[3]; +- ACCESS_ONCE(ads->data3) = i->buf_addr[3]; ++ ACCESS_ONCE_RW(ads->data3) = i->buf_addr[3]; + + checksum += (val = (i->buf_len[0] << AR_BufLen_S) & AR_BufLen); +- ACCESS_ONCE(ads->ctl3) = val; ++ ACCESS_ONCE_RW(ads->ctl3) = val; + checksum += (val = (i->buf_len[1] << AR_BufLen_S) & AR_BufLen); +- ACCESS_ONCE(ads->ctl5) = val; ++ ACCESS_ONCE_RW(ads->ctl5) = val; + checksum += (val = (i->buf_len[2] << AR_BufLen_S) & AR_BufLen); +- ACCESS_ONCE(ads->ctl7) = val; ++ ACCESS_ONCE_RW(ads->ctl7) = val; + checksum += (val = (i->buf_len[3] << AR_BufLen_S) & AR_BufLen); +- ACCESS_ONCE(ads->ctl9) = val; ++ ACCESS_ONCE_RW(ads->ctl9) = val; + + checksum = (u16) (((checksum & 0xffff) + (checksum >> 16)) & 0xffff); +- ACCESS_ONCE(ads->ctl10) = checksum; ++ ACCESS_ONCE_RW(ads->ctl10) = checksum; + + if (i->is_first || i->is_last) { +- ACCESS_ONCE(ads->ctl13) = set11nTries(i->rates, 0) ++ ACCESS_ONCE_RW(ads->ctl13) = set11nTries(i->rates, 0) + | set11nTries(i->rates, 1) + | set11nTries(i->rates, 2) + | set11nTries(i->rates, 3) + | (i->dur_update ? AR_DurUpdateEna : 0) + | SM(0, AR_BurstDur); + +- ACCESS_ONCE(ads->ctl14) = set11nRate(i->rates, 0) ++ ACCESS_ONCE_RW(ads->ctl14) = set11nRate(i->rates, 0) + | set11nRate(i->rates, 1) + | set11nRate(i->rates, 2) + | set11nRate(i->rates, 3); + } else { +- ACCESS_ONCE(ads->ctl13) = 0; +- ACCESS_ONCE(ads->ctl14) = 0; ++ ACCESS_ONCE_RW(ads->ctl13) = 0; ++ ACCESS_ONCE_RW(ads->ctl14) = 0; + } + + ads->ctl20 = 0; +@@ -89,17 +89,17 @@ ar9003_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i) + + ctl17 = SM(i->keytype, AR_EncrType); + if (!i->is_first) { +- ACCESS_ONCE(ads->ctl11) = 0; +- ACCESS_ONCE(ads->ctl12) = i->is_last ? 0 : AR_TxMore; +- ACCESS_ONCE(ads->ctl15) = 0; +- ACCESS_ONCE(ads->ctl16) = 0; +- ACCESS_ONCE(ads->ctl17) = ctl17; +- ACCESS_ONCE(ads->ctl18) = 0; +- ACCESS_ONCE(ads->ctl19) = 0; ++ ACCESS_ONCE_RW(ads->ctl11) = 0; ++ ACCESS_ONCE_RW(ads->ctl12) = i->is_last ? 0 : AR_TxMore; ++ ACCESS_ONCE_RW(ads->ctl15) = 0; ++ ACCESS_ONCE_RW(ads->ctl16) = 0; ++ ACCESS_ONCE_RW(ads->ctl17) = ctl17; ++ ACCESS_ONCE_RW(ads->ctl18) = 0; ++ ACCESS_ONCE_RW(ads->ctl19) = 0; + return; + } + +- ACCESS_ONCE(ads->ctl11) = (i->pkt_len & AR_FrameLen) ++ ACCESS_ONCE_RW(ads->ctl11) = (i->pkt_len & AR_FrameLen) + | (i->flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) + | SM(i->txpower, AR_XmitPower0) + | (i->flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) +@@ -135,26 +135,26 @@ ar9003_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i) + val = (i->flags & ATH9K_TXDESC_PAPRD) >> ATH9K_TXDESC_PAPRD_S; + ctl12 |= SM(val, AR_PAPRDChainMask); + +- ACCESS_ONCE(ads->ctl12) = ctl12; +- ACCESS_ONCE(ads->ctl17) = ctl17; ++ ACCESS_ONCE_RW(ads->ctl12) = ctl12; ++ ACCESS_ONCE_RW(ads->ctl17) = ctl17; + +- ACCESS_ONCE(ads->ctl15) = set11nPktDurRTSCTS(i->rates, 0) ++ ACCESS_ONCE_RW(ads->ctl15) = set11nPktDurRTSCTS(i->rates, 0) + | set11nPktDurRTSCTS(i->rates, 1); + +- ACCESS_ONCE(ads->ctl16) = set11nPktDurRTSCTS(i->rates, 2) ++ ACCESS_ONCE_RW(ads->ctl16) = set11nPktDurRTSCTS(i->rates, 2) + | set11nPktDurRTSCTS(i->rates, 3); + +- ACCESS_ONCE(ads->ctl18) = set11nRateFlags(i->rates, 0) ++ ACCESS_ONCE_RW(ads->ctl18) = set11nRateFlags(i->rates, 0) + | set11nRateFlags(i->rates, 1) + | set11nRateFlags(i->rates, 2) + | set11nRateFlags(i->rates, 3) + | SM(i->rtscts_rate, AR_RTSCTSRate); + +- ACCESS_ONCE(ads->ctl19) = AR_Not_Sounding; ++ ACCESS_ONCE_RW(ads->ctl19) = AR_Not_Sounding; + +- ACCESS_ONCE(ads->ctl20) = SM(i->txpower, AR_XmitPower1); +- ACCESS_ONCE(ads->ctl21) = SM(i->txpower, AR_XmitPower2); +- ACCESS_ONCE(ads->ctl22) = SM(i->txpower, AR_XmitPower3); ++ ACCESS_ONCE_RW(ads->ctl20) = SM(i->txpower, AR_XmitPower1); ++ ACCESS_ONCE_RW(ads->ctl21) = SM(i->txpower, AR_XmitPower2); ++ ACCESS_ONCE_RW(ads->ctl22) = SM(i->txpower, AR_XmitPower3); + } + + static u16 ar9003_calc_ptr_chksum(struct ar9003_txc *ads) +diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h +index e8e8dd2..030f80e 100644 +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -630,7 +630,7 @@ struct ath_hw_private_ops { + + /* ANI */ + void (*ani_cache_ini_regs)(struct ath_hw *ah); +-}; ++} __no_const; + + /** + * struct ath_spec_scan - parameters for Atheros spectral scan +@@ -708,7 +708,7 @@ struct ath_hw_ops { + #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT + void (*set_bt_ant_diversity)(struct ath_hw *hw, bool enable); + #endif +-}; ++} __no_const; + + struct ath_nf_limits { + s16 max; +diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c +index 4f18a6b..b07d92f 100644 +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -2454,16 +2454,18 @@ void ath9k_fill_chanctx_ops(void) + if (!ath9k_is_chanctx_enabled()) + return; + +- ath9k_ops.hw_scan = ath9k_hw_scan; +- ath9k_ops.cancel_hw_scan = ath9k_cancel_hw_scan; +- ath9k_ops.remain_on_channel = ath9k_remain_on_channel; +- ath9k_ops.cancel_remain_on_channel = ath9k_cancel_remain_on_channel; +- ath9k_ops.add_chanctx = ath9k_add_chanctx; +- ath9k_ops.remove_chanctx = ath9k_remove_chanctx; +- ath9k_ops.change_chanctx = ath9k_change_chanctx; +- ath9k_ops.assign_vif_chanctx = ath9k_assign_vif_chanctx; +- ath9k_ops.unassign_vif_chanctx = ath9k_unassign_vif_chanctx; +- ath9k_ops.mgd_prepare_tx = ath9k_mgd_prepare_tx; ++ pax_open_kernel(); ++ *(void **)&ath9k_ops.hw_scan = ath9k_hw_scan; ++ *(void **)&ath9k_ops.cancel_hw_scan = ath9k_cancel_hw_scan; ++ *(void **)&ath9k_ops.remain_on_channel = ath9k_remain_on_channel; ++ *(void **)&ath9k_ops.cancel_remain_on_channel = ath9k_cancel_remain_on_channel; ++ *(void **)&ath9k_ops.add_chanctx = ath9k_add_chanctx; ++ *(void **)&ath9k_ops.remove_chanctx = ath9k_remove_chanctx; ++ *(void **)&ath9k_ops.change_chanctx = ath9k_change_chanctx; ++ *(void **)&ath9k_ops.assign_vif_chanctx = ath9k_assign_vif_chanctx; ++ *(void **)&ath9k_ops.unassign_vif_chanctx = ath9k_unassign_vif_chanctx; ++ *(void **)&ath9k_ops.mgd_prepare_tx = ath9k_mgd_prepare_tx; ++ pax_close_kernel(); + } + + #endif +diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c +index 058a9f2..d5cb1ba 100644 +--- a/drivers/net/wireless/b43/phy_lp.c ++++ b/drivers/net/wireless/b43/phy_lp.c +@@ -2502,7 +2502,7 @@ static int lpphy_b2063_tune(struct b43_wldev *dev, + { + struct ssb_bus *bus = dev->dev->sdev->bus; + +- static const struct b206x_channel *chandata = NULL; ++ const struct b206x_channel *chandata = NULL; + u32 crystal_freq = bus->chipco.pmu.crystalfreq * 1000; + u32 freqref, vco_freq, val1, val2, val3, timeout, timeoutref, count; + u16 old_comm15, scale; +diff --git a/drivers/net/wireless/iwlegacy/3945-mac.c b/drivers/net/wireless/iwlegacy/3945-mac.c +index dc1d20c..f7a4f06 100644 +--- a/drivers/net/wireless/iwlegacy/3945-mac.c ++++ b/drivers/net/wireless/iwlegacy/3945-mac.c +@@ -3633,7 +3633,9 @@ il3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + */ + if (il3945_mod_params.disable_hw_scan) { + D_INFO("Disabling hw_scan\n"); +- il3945_mac_ops.hw_scan = NULL; ++ pax_open_kernel(); ++ *(void **)&il3945_mac_ops.hw_scan = NULL; ++ pax_close_kernel(); + } + + D_INFO("*** LOAD DRIVER ***\n"); +diff --git a/drivers/net/wireless/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/iwlwifi/dvm/debugfs.c +index 0ffb6ff..c0b7f0e 100644 +--- a/drivers/net/wireless/iwlwifi/dvm/debugfs.c ++++ b/drivers/net/wireless/iwlwifi/dvm/debugfs.c +@@ -188,7 +188,7 @@ static ssize_t iwl_dbgfs_sram_write(struct file *file, + { + struct iwl_priv *priv = file->private_data; + char buf[64]; +- int buf_size; ++ size_t buf_size; + u32 offset, len; + + memset(buf, 0, sizeof(buf)); +@@ -458,7 +458,7 @@ static ssize_t iwl_dbgfs_rx_handlers_write(struct file *file, + struct iwl_priv *priv = file->private_data; + + char buf[8]; +- int buf_size; ++ size_t buf_size; + u32 reset_flag; + + memset(buf, 0, sizeof(buf)); +@@ -539,7 +539,7 @@ static ssize_t iwl_dbgfs_disable_ht40_write(struct file *file, + { + struct iwl_priv *priv = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + int ht40; + + memset(buf, 0, sizeof(buf)); +@@ -591,7 +591,7 @@ static ssize_t iwl_dbgfs_sleep_level_override_write(struct file *file, + { + struct iwl_priv *priv = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + int value; + + memset(buf, 0, sizeof(buf)); +@@ -683,10 +683,10 @@ DEBUGFS_READ_FILE_OPS(temperature); + DEBUGFS_READ_WRITE_FILE_OPS(sleep_level_override); + DEBUGFS_READ_FILE_OPS(current_sleep_command); + +-static const char *fmt_value = " %-30s %10u\n"; +-static const char *fmt_hex = " %-30s 0x%02X\n"; +-static const char *fmt_table = " %-30s %10u %10u %10u %10u\n"; +-static const char *fmt_header = ++static const char fmt_value[] = " %-30s %10u\n"; ++static const char fmt_hex[] = " %-30s 0x%02X\n"; ++static const char fmt_table[] = " %-30s %10u %10u %10u %10u\n"; ++static const char fmt_header[] = + "%-32s current cumulative delta max\n"; + + static int iwl_statistics_flag(struct iwl_priv *priv, char *buf, int bufsz) +@@ -1856,7 +1856,7 @@ static ssize_t iwl_dbgfs_clear_ucode_statistics_write(struct file *file, + { + struct iwl_priv *priv = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + int clear; + + memset(buf, 0, sizeof(buf)); +@@ -1901,7 +1901,7 @@ static ssize_t iwl_dbgfs_ucode_tracing_write(struct file *file, + { + struct iwl_priv *priv = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + int trace; + + memset(buf, 0, sizeof(buf)); +@@ -1972,7 +1972,7 @@ static ssize_t iwl_dbgfs_missed_beacon_write(struct file *file, + { + struct iwl_priv *priv = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + int missed; + + memset(buf, 0, sizeof(buf)); +@@ -2013,7 +2013,7 @@ static ssize_t iwl_dbgfs_plcp_delta_write(struct file *file, + + struct iwl_priv *priv = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + int plcp; + + memset(buf, 0, sizeof(buf)); +@@ -2073,7 +2073,7 @@ static ssize_t iwl_dbgfs_txfifo_flush_write(struct file *file, + + struct iwl_priv *priv = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + int flush; + + memset(buf, 0, sizeof(buf)); +@@ -2163,7 +2163,7 @@ static ssize_t iwl_dbgfs_protection_mode_write(struct file *file, + + struct iwl_priv *priv = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + int rts; + + if (!priv->cfg->ht_params) +@@ -2204,7 +2204,7 @@ static ssize_t iwl_dbgfs_echo_test_write(struct file *file, + { + struct iwl_priv *priv = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + + memset(buf, 0, sizeof(buf)); + buf_size = min(count, sizeof(buf) - 1); +@@ -2238,7 +2238,7 @@ static ssize_t iwl_dbgfs_log_event_write(struct file *file, + struct iwl_priv *priv = file->private_data; + u32 event_log_flag; + char buf[8]; +- int buf_size; ++ size_t buf_size; + + /* check that the interface is up */ + if (!iwl_is_ready(priv)) +@@ -2292,7 +2292,7 @@ static ssize_t iwl_dbgfs_calib_disabled_write(struct file *file, + struct iwl_priv *priv = file->private_data; + char buf[8]; + u32 calib_disabled; +- int buf_size; ++ size_t buf_size; + + memset(buf, 0, sizeof(buf)); + buf_size = min(count, sizeof(buf) - 1); +diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c +index dd2f3f8..fb1ae88 100644 +--- a/drivers/net/wireless/iwlwifi/pcie/trans.c ++++ b/drivers/net/wireless/iwlwifi/pcie/trans.c +@@ -1689,7 +1689,7 @@ static ssize_t iwl_dbgfs_interrupt_write(struct file *file, + struct isr_statistics *isr_stats = &trans_pcie->isr_stats; + + char buf[8]; +- int buf_size; ++ size_t buf_size; + u32 reset_flag; + + memset(buf, 0, sizeof(buf)); +@@ -1710,7 +1710,7 @@ static ssize_t iwl_dbgfs_csr_write(struct file *file, + { + struct iwl_trans *trans = file->private_data; + char buf[8]; +- int buf_size; ++ size_t buf_size; + int csr; + + memset(buf, 0, sizeof(buf)); +diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c +index c9ad4cf..49a2fa0 100644 +--- a/drivers/net/wireless/mac80211_hwsim.c ++++ b/drivers/net/wireless/mac80211_hwsim.c +@@ -2577,20 +2577,20 @@ static int __init init_mac80211_hwsim(void) + if (channels < 1) + return -EINVAL; + +- mac80211_hwsim_mchan_ops = mac80211_hwsim_ops; +- mac80211_hwsim_mchan_ops.hw_scan = mac80211_hwsim_hw_scan; +- mac80211_hwsim_mchan_ops.cancel_hw_scan = mac80211_hwsim_cancel_hw_scan; +- mac80211_hwsim_mchan_ops.sw_scan_start = NULL; +- mac80211_hwsim_mchan_ops.sw_scan_complete = NULL; +- mac80211_hwsim_mchan_ops.remain_on_channel = mac80211_hwsim_roc; +- mac80211_hwsim_mchan_ops.cancel_remain_on_channel = mac80211_hwsim_croc; +- mac80211_hwsim_mchan_ops.add_chanctx = mac80211_hwsim_add_chanctx; +- mac80211_hwsim_mchan_ops.remove_chanctx = mac80211_hwsim_remove_chanctx; +- mac80211_hwsim_mchan_ops.change_chanctx = mac80211_hwsim_change_chanctx; +- mac80211_hwsim_mchan_ops.assign_vif_chanctx = +- mac80211_hwsim_assign_vif_chanctx; +- mac80211_hwsim_mchan_ops.unassign_vif_chanctx = +- mac80211_hwsim_unassign_vif_chanctx; ++ pax_open_kernel(); ++ memcpy((void *)&mac80211_hwsim_mchan_ops, &mac80211_hwsim_ops, sizeof mac80211_hwsim_mchan_ops); ++ *(void **)&mac80211_hwsim_mchan_ops.hw_scan = mac80211_hwsim_hw_scan; ++ *(void **)&mac80211_hwsim_mchan_ops.cancel_hw_scan = mac80211_hwsim_cancel_hw_scan; ++ *(void **)&mac80211_hwsim_mchan_ops.sw_scan_start = NULL; ++ *(void **)&mac80211_hwsim_mchan_ops.sw_scan_complete = NULL; ++ *(void **)&mac80211_hwsim_mchan_ops.remain_on_channel = mac80211_hwsim_roc; ++ *(void **)&mac80211_hwsim_mchan_ops.cancel_remain_on_channel = mac80211_hwsim_croc; ++ *(void **)&mac80211_hwsim_mchan_ops.add_chanctx = mac80211_hwsim_add_chanctx; ++ *(void **)&mac80211_hwsim_mchan_ops.remove_chanctx = mac80211_hwsim_remove_chanctx; ++ *(void **)&mac80211_hwsim_mchan_ops.change_chanctx = mac80211_hwsim_change_chanctx; ++ *(void **)&mac80211_hwsim_mchan_ops.assign_vif_chanctx = mac80211_hwsim_assign_vif_chanctx; ++ *(void **)&mac80211_hwsim_mchan_ops.unassign_vif_chanctx = mac80211_hwsim_unassign_vif_chanctx; ++ pax_close_kernel(); + + spin_lock_init(&hwsim_radio_lock); + INIT_LIST_HEAD(&hwsim_radios); +diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c +index 1a4facd..a2ecbbd 100644 +--- a/drivers/net/wireless/rndis_wlan.c ++++ b/drivers/net/wireless/rndis_wlan.c +@@ -1236,7 +1236,7 @@ static int set_rts_threshold(struct usbnet *usbdev, u32 rts_threshold) + + netdev_dbg(usbdev->net, "%s(): %i\n", __func__, rts_threshold); + +- if (rts_threshold < 0 || rts_threshold > 2347) ++ if (rts_threshold > 2347) + rts_threshold = 2347; + + tmp = cpu_to_le32(rts_threshold); +diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h +index d13f25c..2573994 100644 +--- a/drivers/net/wireless/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/rt2x00/rt2x00.h +@@ -375,7 +375,7 @@ struct rt2x00_intf { + * for hardware which doesn't support hardware + * sequence counting. + */ +- atomic_t seqno; ++ atomic_unchecked_t seqno; + }; + + static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif) +diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c +index 66ff364..3ce34f7 100644 +--- a/drivers/net/wireless/rt2x00/rt2x00queue.c ++++ b/drivers/net/wireless/rt2x00/rt2x00queue.c +@@ -224,9 +224,9 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev, + * sequence counter given by mac80211. + */ + if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)) +- seqno = atomic_add_return(0x10, &intf->seqno); ++ seqno = atomic_add_return_unchecked(0x10, &intf->seqno); + else +- seqno = atomic_read(&intf->seqno); ++ seqno = atomic_read_unchecked(&intf->seqno); + + hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); + hdr->seq_ctrl |= cpu_to_le16(seqno); +diff --git a/drivers/net/wireless/ti/wl1251/sdio.c b/drivers/net/wireless/ti/wl1251/sdio.c +index b661f896..ddf7d2b 100644 +--- a/drivers/net/wireless/ti/wl1251/sdio.c ++++ b/drivers/net/wireless/ti/wl1251/sdio.c +@@ -282,13 +282,17 @@ static int wl1251_sdio_probe(struct sdio_func *func, + + irq_set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING); + +- wl1251_sdio_ops.enable_irq = wl1251_enable_line_irq; +- wl1251_sdio_ops.disable_irq = wl1251_disable_line_irq; ++ pax_open_kernel(); ++ *(void **)&wl1251_sdio_ops.enable_irq = wl1251_enable_line_irq; ++ *(void **)&wl1251_sdio_ops.disable_irq = wl1251_disable_line_irq; ++ pax_close_kernel(); + + wl1251_info("using dedicated interrupt line"); + } else { +- wl1251_sdio_ops.enable_irq = wl1251_sdio_enable_irq; +- wl1251_sdio_ops.disable_irq = wl1251_sdio_disable_irq; ++ pax_open_kernel(); ++ *(void **)&wl1251_sdio_ops.enable_irq = wl1251_sdio_enable_irq; ++ *(void **)&wl1251_sdio_ops.disable_irq = wl1251_sdio_disable_irq; ++ pax_close_kernel(); + + wl1251_info("using SDIO interrupt"); + } +diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c +index 0bccf12..3d95068 100644 +--- a/drivers/net/wireless/ti/wl12xx/main.c ++++ b/drivers/net/wireless/ti/wl12xx/main.c +@@ -656,7 +656,9 @@ static int wl12xx_identify_chip(struct wl1271 *wl) + sizeof(wl->conf.mem)); + + /* read data preparation is only needed by wl127x */ +- wl->ops->prepare_read = wl127x_prepare_read; ++ pax_open_kernel(); ++ *(void **)&wl->ops->prepare_read = wl127x_prepare_read; ++ pax_close_kernel(); + + wlcore_set_min_fw_ver(wl, WL127X_CHIP_VER, + WL127X_IFTYPE_SR_VER, WL127X_MAJOR_SR_VER, +@@ -681,7 +683,9 @@ static int wl12xx_identify_chip(struct wl1271 *wl) + sizeof(wl->conf.mem)); + + /* read data preparation is only needed by wl127x */ +- wl->ops->prepare_read = wl127x_prepare_read; ++ pax_open_kernel(); ++ *(void **)&wl->ops->prepare_read = wl127x_prepare_read; ++ pax_close_kernel(); + + wlcore_set_min_fw_ver(wl, WL127X_CHIP_VER, + WL127X_IFTYPE_SR_VER, WL127X_MAJOR_SR_VER, +diff --git a/drivers/net/wireless/ti/wl18xx/main.c b/drivers/net/wireless/ti/wl18xx/main.c +index 7af1936..128bb35 100644 +--- a/drivers/net/wireless/ti/wl18xx/main.c ++++ b/drivers/net/wireless/ti/wl18xx/main.c +@@ -1916,8 +1916,10 @@ static int wl18xx_setup(struct wl1271 *wl) + } + + if (!checksum_param) { +- wl18xx_ops.set_rx_csum = NULL; +- wl18xx_ops.init_vif = NULL; ++ pax_open_kernel(); ++ *(void **)&wl18xx_ops.set_rx_csum = NULL; ++ *(void **)&wl18xx_ops.init_vif = NULL; ++ pax_close_kernel(); + } + + /* Enable 11a Band only if we have 5G antennas */ +diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c +index a912dc0..a8225ba 100644 +--- a/drivers/net/wireless/zd1211rw/zd_usb.c ++++ b/drivers/net/wireless/zd1211rw/zd_usb.c +@@ -385,7 +385,7 @@ static inline void handle_regs_int(struct urb *urb) + { + struct zd_usb *usb = urb->context; + struct zd_usb_interrupt *intr = &usb->intr; +- int len; ++ unsigned int len; + u16 int_num; + + ZD_ASSERT(in_interrupt()); +diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c +index d752d1c..23e3203 100644 +--- a/drivers/net/xen-netback/interface.c ++++ b/drivers/net/xen-netback/interface.c +@@ -578,6 +578,7 @@ int xenvif_connect(struct xenvif_queue *queue, unsigned long tx_ring_ref, + goto err_rx_unbind; + } + queue->task = task; ++ get_task_struct(task); + + task = kthread_create(xenvif_dealloc_kthread, + (void *)queue, "%s-dealloc", queue->name); +@@ -634,6 +635,7 @@ void xenvif_disconnect(struct xenvif *vif) + + if (queue->task) { + kthread_stop(queue->task); ++ put_task_struct(queue->task); + queue->task = NULL; + } + +diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c +index c39aace..e18728d 100644 +--- a/drivers/net/xen-netback/netback.c ++++ b/drivers/net/xen-netback/netback.c +@@ -2111,8 +2111,7 @@ int xenvif_kthread_guest_rx(void *data) + */ + if (unlikely(vif->disabled && queue->id == 0)) { + xenvif_carrier_off(vif); +- xenvif_rx_queue_purge(queue); +- continue; ++ break; + } + + if (!skb_queue_empty(&queue->rx_queue)) +diff --git a/drivers/nfc/nfcwilink.c b/drivers/nfc/nfcwilink.c +index 683671a..4519fc2 100644 +--- a/drivers/nfc/nfcwilink.c ++++ b/drivers/nfc/nfcwilink.c +@@ -497,7 +497,7 @@ static struct nci_ops nfcwilink_ops = { + + static int nfcwilink_probe(struct platform_device *pdev) + { +- static struct nfcwilink *drv; ++ struct nfcwilink *drv; + int rc; + __u32 protocols; + +diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c +index d93b2b6..ae50401 100644 +--- a/drivers/oprofile/buffer_sync.c ++++ b/drivers/oprofile/buffer_sync.c +@@ -332,7 +332,7 @@ static void add_data(struct op_entry *entry, struct mm_struct *mm) + if (cookie == NO_COOKIE) + offset = pc; + if (cookie == INVALID_COOKIE) { +- atomic_inc(&oprofile_stats.sample_lost_no_mapping); ++ atomic_inc_unchecked(&oprofile_stats.sample_lost_no_mapping); + offset = pc; + } + if (cookie != last_cookie) { +@@ -376,14 +376,14 @@ add_sample(struct mm_struct *mm, struct op_sample *s, int in_kernel) + /* add userspace sample */ + + if (!mm) { +- atomic_inc(&oprofile_stats.sample_lost_no_mm); ++ atomic_inc_unchecked(&oprofile_stats.sample_lost_no_mm); + return 0; + } + + cookie = lookup_dcookie(mm, s->eip, &offset); + + if (cookie == INVALID_COOKIE) { +- atomic_inc(&oprofile_stats.sample_lost_no_mapping); ++ atomic_inc_unchecked(&oprofile_stats.sample_lost_no_mapping); + return 0; + } + +@@ -552,7 +552,7 @@ void sync_buffer(int cpu) + /* ignore backtraces if failed to add a sample */ + if (state == sb_bt_start) { + state = sb_bt_ignore; +- atomic_inc(&oprofile_stats.bt_lost_no_mapping); ++ atomic_inc_unchecked(&oprofile_stats.bt_lost_no_mapping); + } + } + release_mm(mm); +diff --git a/drivers/oprofile/event_buffer.c b/drivers/oprofile/event_buffer.c +index c0cc4e7..44d4e54 100644 +--- a/drivers/oprofile/event_buffer.c ++++ b/drivers/oprofile/event_buffer.c +@@ -53,7 +53,7 @@ void add_event_entry(unsigned long value) + } + + if (buffer_pos == buffer_size) { +- atomic_inc(&oprofile_stats.event_lost_overflow); ++ atomic_inc_unchecked(&oprofile_stats.event_lost_overflow); + return; + } + +diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c +index ed2c3ec..deda85a 100644 +--- a/drivers/oprofile/oprof.c ++++ b/drivers/oprofile/oprof.c +@@ -110,7 +110,7 @@ static void switch_worker(struct work_struct *work) + if (oprofile_ops.switch_events()) + return; + +- atomic_inc(&oprofile_stats.multiplex_counter); ++ atomic_inc_unchecked(&oprofile_stats.multiplex_counter); + start_switch_worker(); + } + +diff --git a/drivers/oprofile/oprofile_files.c b/drivers/oprofile/oprofile_files.c +index ee2cfce..7f8f699 100644 +--- a/drivers/oprofile/oprofile_files.c ++++ b/drivers/oprofile/oprofile_files.c +@@ -27,7 +27,7 @@ unsigned long oprofile_time_slice; + + #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX + +-static ssize_t timeout_read(struct file *file, char __user *buf, ++static ssize_t __intentional_overflow(-1) timeout_read(struct file *file, char __user *buf, + size_t count, loff_t *offset) + { + return oprofilefs_ulong_to_user(jiffies_to_msecs(oprofile_time_slice), +diff --git a/drivers/oprofile/oprofile_stats.c b/drivers/oprofile/oprofile_stats.c +index 59659ce..6c860a0 100644 +--- a/drivers/oprofile/oprofile_stats.c ++++ b/drivers/oprofile/oprofile_stats.c +@@ -30,11 +30,11 @@ void oprofile_reset_stats(void) + cpu_buf->sample_invalid_eip = 0; + } + +- atomic_set(&oprofile_stats.sample_lost_no_mm, 0); +- atomic_set(&oprofile_stats.sample_lost_no_mapping, 0); +- atomic_set(&oprofile_stats.event_lost_overflow, 0); +- atomic_set(&oprofile_stats.bt_lost_no_mapping, 0); +- atomic_set(&oprofile_stats.multiplex_counter, 0); ++ atomic_set_unchecked(&oprofile_stats.sample_lost_no_mm, 0); ++ atomic_set_unchecked(&oprofile_stats.sample_lost_no_mapping, 0); ++ atomic_set_unchecked(&oprofile_stats.event_lost_overflow, 0); ++ atomic_set_unchecked(&oprofile_stats.bt_lost_no_mapping, 0); ++ atomic_set_unchecked(&oprofile_stats.multiplex_counter, 0); + } + + +diff --git a/drivers/oprofile/oprofile_stats.h b/drivers/oprofile/oprofile_stats.h +index 1fc622b..8c48fc3 100644 +--- a/drivers/oprofile/oprofile_stats.h ++++ b/drivers/oprofile/oprofile_stats.h +@@ -13,11 +13,11 @@ + #include <linux/atomic.h> + + struct oprofile_stat_struct { +- atomic_t sample_lost_no_mm; +- atomic_t sample_lost_no_mapping; +- atomic_t bt_lost_no_mapping; +- atomic_t event_lost_overflow; +- atomic_t multiplex_counter; ++ atomic_unchecked_t sample_lost_no_mm; ++ atomic_unchecked_t sample_lost_no_mapping; ++ atomic_unchecked_t bt_lost_no_mapping; ++ atomic_unchecked_t event_lost_overflow; ++ atomic_unchecked_t multiplex_counter; + }; + + extern struct oprofile_stat_struct oprofile_stats; +diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c +index 3f49345..c750d0b 100644 +--- a/drivers/oprofile/oprofilefs.c ++++ b/drivers/oprofile/oprofilefs.c +@@ -176,8 +176,8 @@ int oprofilefs_create_ro_ulong(struct dentry *root, + + static ssize_t atomic_read_file(struct file *file, char __user *buf, size_t count, loff_t *offset) + { +- atomic_t *val = file->private_data; +- return oprofilefs_ulong_to_user(atomic_read(val), buf, count, offset); ++ atomic_unchecked_t *val = file->private_data; ++ return oprofilefs_ulong_to_user(atomic_read_unchecked(val), buf, count, offset); + } + + +@@ -189,7 +189,7 @@ static const struct file_operations atomic_ro_fops = { + + + int oprofilefs_create_ro_atomic(struct dentry *root, +- char const *name, atomic_t *val) ++ char const *name, atomic_unchecked_t *val) + { + return __oprofilefs_create_file(root, name, + &atomic_ro_fops, 0444, val); +diff --git a/drivers/oprofile/timer_int.c b/drivers/oprofile/timer_int.c +index bdef916..88c7dee 100644 +--- a/drivers/oprofile/timer_int.c ++++ b/drivers/oprofile/timer_int.c +@@ -93,7 +93,7 @@ static int oprofile_cpu_notify(struct notifier_block *self, + return NOTIFY_OK; + } + +-static struct notifier_block __refdata oprofile_cpu_notifier = { ++static struct notifier_block oprofile_cpu_notifier = { + .notifier_call = oprofile_cpu_notify, + }; + +diff --git a/drivers/parport/procfs.c b/drivers/parport/procfs.c +index 3b47080..6cd05dd 100644 +--- a/drivers/parport/procfs.c ++++ b/drivers/parport/procfs.c +@@ -64,7 +64,7 @@ static int do_active_device(struct ctl_table *table, int write, + + *ppos += len; + +- return copy_to_user(result, buffer, len) ? -EFAULT : 0; ++ return (len > sizeof buffer || copy_to_user(result, buffer, len)) ? -EFAULT : 0; + } + + #ifdef CONFIG_PARPORT_1284 +@@ -106,7 +106,7 @@ static int do_autoprobe(struct ctl_table *table, int write, + + *ppos += len; + +- return copy_to_user (result, buffer, len) ? -EFAULT : 0; ++ return (len > sizeof buffer || copy_to_user (result, buffer, len)) ? -EFAULT : 0; + } + #endif /* IEEE1284.3 support. */ + +diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c +index 6ca2399..68d866b 100644 +--- a/drivers/pci/hotplug/acpiphp_ibm.c ++++ b/drivers/pci/hotplug/acpiphp_ibm.c +@@ -452,7 +452,9 @@ static int __init ibm_acpiphp_init(void) + goto init_cleanup; + } + +- ibm_apci_table_attr.size = ibm_get_table_from_acpi(NULL); ++ pax_open_kernel(); ++ *(size_t *)&ibm_apci_table_attr.size = ibm_get_table_from_acpi(NULL); ++ pax_close_kernel(); + retval = sysfs_create_bin_file(sysdir, &ibm_apci_table_attr); + + return retval; +diff --git a/drivers/pci/hotplug/cpcihp_generic.c b/drivers/pci/hotplug/cpcihp_generic.c +index 66b7bbe..26bee78 100644 +--- a/drivers/pci/hotplug/cpcihp_generic.c ++++ b/drivers/pci/hotplug/cpcihp_generic.c +@@ -73,7 +73,6 @@ static u16 port; + static unsigned int enum_bit; + static u8 enum_mask; + +-static struct cpci_hp_controller_ops generic_hpc_ops; + static struct cpci_hp_controller generic_hpc; + + static int __init validate_parameters(void) +@@ -139,6 +138,10 @@ static int query_enum(void) + return ((value & enum_mask) == enum_mask); + } + ++static struct cpci_hp_controller_ops generic_hpc_ops = { ++ .query_enum = query_enum, ++}; ++ + static int __init cpcihp_generic_init(void) + { + int status; +@@ -165,7 +168,6 @@ static int __init cpcihp_generic_init(void) + pci_dev_put(dev); + + memset(&generic_hpc, 0, sizeof (struct cpci_hp_controller)); +- generic_hpc_ops.query_enum = query_enum; + generic_hpc.ops = &generic_hpc_ops; + + status = cpci_hp_register_controller(&generic_hpc); +diff --git a/drivers/pci/hotplug/cpcihp_zt5550.c b/drivers/pci/hotplug/cpcihp_zt5550.c +index 7ecf34e..effed62 100644 +--- a/drivers/pci/hotplug/cpcihp_zt5550.c ++++ b/drivers/pci/hotplug/cpcihp_zt5550.c +@@ -59,7 +59,6 @@ + /* local variables */ + static bool debug; + static bool poll; +-static struct cpci_hp_controller_ops zt5550_hpc_ops; + static struct cpci_hp_controller zt5550_hpc; + + /* Primary cPCI bus bridge device */ +@@ -204,6 +203,10 @@ static int zt5550_hc_disable_irq(void) + return 0; + } + ++static struct cpci_hp_controller_ops zt5550_hpc_ops = { ++ .query_enum = zt5550_hc_query_enum, ++}; ++ + static int zt5550_hc_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) + { + int status; +@@ -215,16 +218,17 @@ static int zt5550_hc_init_one (struct pci_dev *pdev, const struct pci_device_id + dbg("returned from zt5550_hc_config"); + + memset(&zt5550_hpc, 0, sizeof (struct cpci_hp_controller)); +- zt5550_hpc_ops.query_enum = zt5550_hc_query_enum; + zt5550_hpc.ops = &zt5550_hpc_ops; + if (!poll) { + zt5550_hpc.irq = hc_dev->irq; + zt5550_hpc.irq_flags = IRQF_SHARED; + zt5550_hpc.dev_id = hc_dev; + +- zt5550_hpc_ops.enable_irq = zt5550_hc_enable_irq; +- zt5550_hpc_ops.disable_irq = zt5550_hc_disable_irq; +- zt5550_hpc_ops.check_irq = zt5550_hc_check_irq; ++ pax_open_kernel(); ++ *(void **)&zt5550_hpc_ops.enable_irq = zt5550_hc_enable_irq; ++ *(void **)&zt5550_hpc_ops.disable_irq = zt5550_hc_disable_irq; ++ *(void **)&zt5550_hpc_ops.check_irq = zt5550_hc_check_irq; ++ pax_open_kernel(); + } else { + info("using ENUM# polling mode"); + } +diff --git a/drivers/pci/hotplug/cpqphp_nvram.c b/drivers/pci/hotplug/cpqphp_nvram.c +index 1e08ff8..3cd145f 100644 +--- a/drivers/pci/hotplug/cpqphp_nvram.c ++++ b/drivers/pci/hotplug/cpqphp_nvram.c +@@ -425,8 +425,10 @@ static u32 store_HRT (void __iomem *rom_start) + + void compaq_nvram_init (void __iomem *rom_start) + { ++#ifndef CONFIG_PAX_KERNEXEC + if (rom_start) + compaq_int15_entry_point = (rom_start + ROM_INT15_PHY_ADDR - ROM_PHY_ADDR); ++#endif + + dbg("int15 entry = %p\n", compaq_int15_entry_point); + +diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/pci_hotplug_core.c +index 56d8486..f26113f 100644 +--- a/drivers/pci/hotplug/pci_hotplug_core.c ++++ b/drivers/pci/hotplug/pci_hotplug_core.c +@@ -436,8 +436,10 @@ int __pci_hp_register(struct hotplug_slot *slot, struct pci_bus *bus, + return -EINVAL; + } + +- slot->ops->owner = owner; +- slot->ops->mod_name = mod_name; ++ pax_open_kernel(); ++ *(struct module **)&slot->ops->owner = owner; ++ *(const char **)&slot->ops->mod_name = mod_name; ++ pax_close_kernel(); + + mutex_lock(&pci_hp_mutex); + /* +diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c +index 07aa722..84514b4 100644 +--- a/drivers/pci/hotplug/pciehp_core.c ++++ b/drivers/pci/hotplug/pciehp_core.c +@@ -92,7 +92,7 @@ static int init_slot(struct controller *ctrl) + struct slot *slot = ctrl->slot; + struct hotplug_slot *hotplug = NULL; + struct hotplug_slot_info *info = NULL; +- struct hotplug_slot_ops *ops = NULL; ++ hotplug_slot_ops_no_const *ops = NULL; + char name[SLOT_NAME_SIZE]; + int retval = -ENOMEM; + +diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c +index 084587d..4a8f9df 100644 +--- a/drivers/pci/msi.c ++++ b/drivers/pci/msi.c +@@ -488,8 +488,8 @@ static int populate_msi_sysfs(struct pci_dev *pdev) + { + struct attribute **msi_attrs; + struct attribute *msi_attr; +- struct device_attribute *msi_dev_attr; +- struct attribute_group *msi_irq_group; ++ device_attribute_no_const *msi_dev_attr; ++ attribute_group_no_const *msi_irq_group; + const struct attribute_group **msi_irq_groups; + struct msi_desc *entry; + int ret = -ENOMEM; +@@ -549,7 +549,7 @@ error_attrs: + count = 0; + msi_attr = msi_attrs[count]; + while (msi_attr) { +- msi_dev_attr = container_of(msi_attr, struct device_attribute, attr); ++ msi_dev_attr = container_of(msi_attr, device_attribute_no_const, attr); + kfree(msi_attr->name); + kfree(msi_dev_attr); + ++count; +diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c +index eb15438..250fa0c7 100644 +--- a/drivers/pci/pci-sysfs.c ++++ b/drivers/pci/pci-sysfs.c +@@ -1134,7 +1134,7 @@ static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine) + { + /* allocate attribute structure, piggyback attribute name */ + int name_len = write_combine ? 13 : 10; +- struct bin_attribute *res_attr; ++ bin_attribute_no_const *res_attr; + int retval; + + res_attr = kzalloc(sizeof(*res_attr) + name_len, GFP_ATOMIC); +@@ -1311,7 +1311,7 @@ static struct device_attribute reset_attr = __ATTR(reset, 0200, NULL, reset_stor + static int pci_create_capabilities_sysfs(struct pci_dev *dev) + { + int retval; +- struct bin_attribute *attr; ++ bin_attribute_no_const *attr; + + /* If the device has VPD, try to expose it in sysfs. */ + if (dev->vpd) { +@@ -1358,7 +1358,7 @@ int __must_check pci_create_sysfs_dev_files(struct pci_dev *pdev) + { + int retval; + int rom_size = 0; +- struct bin_attribute *attr; ++ bin_attribute_no_const *attr; + + if (!sysfs_initialized) + return -EACCES; +diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h +index b5defca..e3664cc 100644 +--- a/drivers/pci/pci.h ++++ b/drivers/pci/pci.h +@@ -93,7 +93,7 @@ struct pci_vpd_ops { + struct pci_vpd { + unsigned int len; + const struct pci_vpd_ops *ops; +- struct bin_attribute *attr; /* descriptor for sysfs VPD entry */ ++ bin_attribute_no_const *attr; /* descriptor for sysfs VPD entry */ + }; + + int pci_vpd_pci22_init(struct pci_dev *dev); +diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c +index e1e7026..d28dd33 100644 +--- a/drivers/pci/pcie/aspm.c ++++ b/drivers/pci/pcie/aspm.c +@@ -27,9 +27,9 @@ + #define MODULE_PARAM_PREFIX "pcie_aspm." + + /* Note: those are not register definitions */ +-#define ASPM_STATE_L0S_UP (1) /* Upstream direction L0s state */ +-#define ASPM_STATE_L0S_DW (2) /* Downstream direction L0s state */ +-#define ASPM_STATE_L1 (4) /* L1 state */ ++#define ASPM_STATE_L0S_UP (1U) /* Upstream direction L0s state */ ++#define ASPM_STATE_L0S_DW (2U) /* Downstream direction L0s state */ ++#define ASPM_STATE_L1 (4U) /* L1 state */ + #define ASPM_STATE_L0S (ASPM_STATE_L0S_UP | ASPM_STATE_L0S_DW) + #define ASPM_STATE_ALL (ASPM_STATE_L0S | ASPM_STATE_L1) + +diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c +index be35da2..ec16cdb 100644 +--- a/drivers/pci/pcie/portdrv_pci.c ++++ b/drivers/pci/pcie/portdrv_pci.c +@@ -324,7 +324,7 @@ static int __init dmi_pcie_pme_disable_msi(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id __initdata pcie_portdrv_dmi_table[] = { ++static const struct dmi_system_id __initconst pcie_portdrv_dmi_table[] = { + /* + * Boxes that should not use MSI for PCIe PME signaling. + */ +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index 3010ffc..5e2e133 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -177,7 +177,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, + struct pci_bus_region region, inverted_region; + bool bar_too_big = false, bar_too_high = false, bar_invalid = false; + +- mask = type ? PCI_ROM_ADDRESS_MASK : ~0; ++ mask = type ? (u32)PCI_ROM_ADDRESS_MASK : ~0; + + /* No printks while decoding is disabled! */ + if (!dev->mmio_always_on) { +diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c +index 3f155e7..0f4b1f0 100644 +--- a/drivers/pci/proc.c ++++ b/drivers/pci/proc.c +@@ -434,7 +434,16 @@ static const struct file_operations proc_bus_pci_dev_operations = { + static int __init pci_proc_init(void) + { + struct pci_dev *dev = NULL; ++ ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ proc_bus_pci_dir = proc_mkdir_mode("bus/pci", S_IRUSR | S_IXUSR, NULL); ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ proc_bus_pci_dir = proc_mkdir_mode("bus/pci", S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP, NULL); ++#endif ++#else + proc_bus_pci_dir = proc_mkdir("bus/pci", NULL); ++#endif + proc_create("devices", 0, proc_bus_pci_dir, + &proc_bus_pci_dev_operations); + proc_initialized = 1; +diff --git a/drivers/platform/chrome/chromeos_laptop.c b/drivers/platform/chrome/chromeos_laptop.c +index d866db8..c827d1f 100644 +--- a/drivers/platform/chrome/chromeos_laptop.c ++++ b/drivers/platform/chrome/chromeos_laptop.c +@@ -479,7 +479,7 @@ static struct chromeos_laptop cr48 = { + .callback = chromeos_laptop_dmi_matched, \ + .driver_data = (void *)&board_ + +-static struct dmi_system_id chromeos_laptop_dmi_table[] __initdata = { ++static struct dmi_system_id chromeos_laptop_dmi_table[] __initconst = { + { + .ident = "Samsung Series 5 550", + .matches = { +diff --git a/drivers/platform/chrome/chromeos_pstore.c b/drivers/platform/chrome/chromeos_pstore.c +index 3474920..acc9581 100644 +--- a/drivers/platform/chrome/chromeos_pstore.c ++++ b/drivers/platform/chrome/chromeos_pstore.c +@@ -13,7 +13,7 @@ + #include <linux/platform_device.h> + #include <linux/pstore_ram.h> + +-static struct dmi_system_id chromeos_pstore_dmi_table[] __initdata = { ++static const struct dmi_system_id chromeos_pstore_dmi_table[] __initconst = { + { + /* + * Today all Chromebooks/boxes ship with Google_* as version and +diff --git a/drivers/platform/x86/alienware-wmi.c b/drivers/platform/x86/alienware-wmi.c +index c5af23b..3d62d5e 100644 +--- a/drivers/platform/x86/alienware-wmi.c ++++ b/drivers/platform/x86/alienware-wmi.c +@@ -150,7 +150,7 @@ struct wmax_led_args { + } __packed; + + static struct platform_device *platform_device; +-static struct device_attribute *zone_dev_attrs; ++static device_attribute_no_const *zone_dev_attrs; + static struct attribute **zone_attrs; + static struct platform_zone *zone_data; + +@@ -161,7 +161,7 @@ static struct platform_driver platform_driver = { + } + }; + +-static struct attribute_group zone_attribute_group = { ++static attribute_group_no_const zone_attribute_group = { + .name = "rgb_zones", + }; + +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 21fc932..ee9394a 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -1590,6 +1590,10 @@ static int show_dsts(struct seq_file *m, void *data) + int err; + u32 retval = -1; + ++#ifdef CONFIG_GRKERNSEC_KMEM ++ return -EPERM; ++#endif ++ + err = asus_wmi_get_devstate(asus, asus->debug.dev_id, &retval); + + if (err < 0) +@@ -1606,6 +1610,10 @@ static int show_devs(struct seq_file *m, void *data) + int err; + u32 retval = -1; + ++#ifdef CONFIG_GRKERNSEC_KMEM ++ return -EPERM; ++#endif ++ + err = asus_wmi_set_devstate(asus->debug.dev_id, asus->debug.ctrl_param, + &retval); + +@@ -1630,6 +1638,10 @@ static int show_call(struct seq_file *m, void *data) + union acpi_object *obj; + acpi_status status; + ++#ifdef CONFIG_GRKERNSEC_KMEM ++ return -EPERM; ++#endif ++ + status = wmi_evaluate_method(ASUS_WMI_MGMT_GUID, + 1, asus->debug.method_id, + &input, &output); +diff --git a/drivers/platform/x86/compal-laptop.c b/drivers/platform/x86/compal-laptop.c +index 26bfd7b..eb4ef1f 100644 +--- a/drivers/platform/x86/compal-laptop.c ++++ b/drivers/platform/x86/compal-laptop.c +@@ -767,7 +767,7 @@ static int dmi_check_cb_extra(const struct dmi_system_id *id) + return 1; + } + +-static struct dmi_system_id __initdata compal_dmi_table[] = { ++static const struct dmi_system_id __initconst compal_dmi_table[] = { + { + .ident = "FL90/IFL90", + .matches = { +diff --git a/drivers/platform/x86/hdaps.c b/drivers/platform/x86/hdaps.c +index 777c7e3..11dcbce 100644 +--- a/drivers/platform/x86/hdaps.c ++++ b/drivers/platform/x86/hdaps.c +@@ -515,7 +515,7 @@ static int __init hdaps_dmi_match_invert(const struct dmi_system_id *id) + "ThinkPad T42p", so the order of the entries matters. + If your ThinkPad is not recognized, please update to latest + BIOS. This is especially the case for some R52 ThinkPads. */ +-static struct dmi_system_id __initdata hdaps_whitelist[] = { ++static const struct dmi_system_id __initconst hdaps_whitelist[] = { + HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad R50p", HDAPS_BOTH_AXES), + HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R50"), + HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"), +diff --git a/drivers/platform/x86/ibm_rtl.c b/drivers/platform/x86/ibm_rtl.c +index 97c2be1..2ee50ce 100644 +--- a/drivers/platform/x86/ibm_rtl.c ++++ b/drivers/platform/x86/ibm_rtl.c +@@ -227,7 +227,7 @@ static void rtl_teardown_sysfs(void) { + } + + +-static struct dmi_system_id __initdata ibm_rtl_dmi_table[] = { ++static const struct dmi_system_id __initconst ibm_rtl_dmi_table[] = { + { \ + .matches = { \ + DMI_MATCH(DMI_SYS_VENDOR, "IBM"), \ +diff --git a/drivers/platform/x86/intel_oaktrail.c b/drivers/platform/x86/intel_oaktrail.c +index 4bc9604..db855c0 100644 +--- a/drivers/platform/x86/intel_oaktrail.c ++++ b/drivers/platform/x86/intel_oaktrail.c +@@ -300,7 +300,7 @@ static int dmi_check_cb(const struct dmi_system_id *id) + return 0; + } + +-static struct dmi_system_id __initdata oaktrail_dmi_table[] = { ++static const struct dmi_system_id __initconst oaktrail_dmi_table[] = { + { + .ident = "OakTrail platform", + .matches = { +diff --git a/drivers/platform/x86/msi-laptop.c b/drivers/platform/x86/msi-laptop.c +index 62f8030..02f93f0 100644 +--- a/drivers/platform/x86/msi-laptop.c ++++ b/drivers/platform/x86/msi-laptop.c +@@ -605,7 +605,7 @@ static int dmi_check_cb(const struct dmi_system_id *dmi) + return 1; + } + +-static struct dmi_system_id __initdata msi_dmi_table[] = { ++static const struct dmi_system_id __initconst msi_dmi_table[] = { + { + .ident = "MSI S270", + .matches = { +@@ -1000,12 +1000,14 @@ static int __init load_scm_model_init(struct platform_device *sdev) + + if (!quirks->ec_read_only) { + /* allow userland write sysfs file */ +- dev_attr_bluetooth.store = store_bluetooth; +- dev_attr_wlan.store = store_wlan; +- dev_attr_threeg.store = store_threeg; +- dev_attr_bluetooth.attr.mode |= S_IWUSR; +- dev_attr_wlan.attr.mode |= S_IWUSR; +- dev_attr_threeg.attr.mode |= S_IWUSR; ++ pax_open_kernel(); ++ *(void **)&dev_attr_bluetooth.store = store_bluetooth; ++ *(void **)&dev_attr_wlan.store = store_wlan; ++ *(void **)&dev_attr_threeg.store = store_threeg; ++ *(umode_t *)&dev_attr_bluetooth.attr.mode |= S_IWUSR; ++ *(umode_t *)&dev_attr_wlan.attr.mode |= S_IWUSR; ++ *(umode_t *)&dev_attr_threeg.attr.mode |= S_IWUSR; ++ pax_close_kernel(); + } + + /* disable hardware control by fn key */ +diff --git a/drivers/platform/x86/msi-wmi.c b/drivers/platform/x86/msi-wmi.c +index 70222f2..8c8ce66 100644 +--- a/drivers/platform/x86/msi-wmi.c ++++ b/drivers/platform/x86/msi-wmi.c +@@ -183,7 +183,7 @@ static const struct backlight_ops msi_backlight_ops = { + static void msi_wmi_notify(u32 value, void *context) + { + struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL }; +- static struct key_entry *key; ++ struct key_entry *key; + union acpi_object *obj; + acpi_status status; + +diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c +index ce364a4..5074643 100644 +--- a/drivers/platform/x86/samsung-laptop.c ++++ b/drivers/platform/x86/samsung-laptop.c +@@ -1465,7 +1465,7 @@ static int __init samsung_dmi_matched(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id __initdata samsung_dmi_table[] = { ++static const struct dmi_system_id __initconst samsung_dmi_table[] = { + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, +diff --git a/drivers/platform/x86/samsung-q10.c b/drivers/platform/x86/samsung-q10.c +index 28d12bd..ecb0d5a 100644 +--- a/drivers/platform/x86/samsung-q10.c ++++ b/drivers/platform/x86/samsung-q10.c +@@ -96,7 +96,7 @@ static int __init dmi_check_callback(const struct dmi_system_id *id) + return 1; + } + +-static struct dmi_system_id __initdata samsungq10_dmi_table[] = { ++static const struct dmi_system_id __initconst samsungq10_dmi_table[] = { + { + .ident = "Samsung Q10", + .matches = { +diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c +index 26ad9ff..272c93e 100644 +--- a/drivers/platform/x86/sony-laptop.c ++++ b/drivers/platform/x86/sony-laptop.c +@@ -2527,7 +2527,7 @@ static void sony_nc_gfx_switch_cleanup(struct platform_device *pd) + } + + /* High speed charging function */ +-static struct device_attribute *hsc_handle; ++static device_attribute_no_const *hsc_handle; + + static ssize_t sony_nc_highspeed_charging_store(struct device *dev, + struct device_attribute *attr, +@@ -2601,7 +2601,7 @@ static void sony_nc_highspeed_charging_cleanup(struct platform_device *pd) + } + + /* low battery function */ +-static struct device_attribute *lowbatt_handle; ++static device_attribute_no_const *lowbatt_handle; + + static ssize_t sony_nc_lowbatt_store(struct device *dev, + struct device_attribute *attr, +@@ -2667,7 +2667,7 @@ static void sony_nc_lowbatt_cleanup(struct platform_device *pd) + } + + /* fan speed function */ +-static struct device_attribute *fan_handle, *hsf_handle; ++static device_attribute_no_const *fan_handle, *hsf_handle; + + static ssize_t sony_nc_hsfan_store(struct device *dev, + struct device_attribute *attr, +@@ -2774,7 +2774,7 @@ static void sony_nc_fanspeed_cleanup(struct platform_device *pd) + } + + /* USB charge function */ +-static struct device_attribute *uc_handle; ++static device_attribute_no_const *uc_handle; + + static ssize_t sony_nc_usb_charge_store(struct device *dev, + struct device_attribute *attr, +@@ -2848,7 +2848,7 @@ static void sony_nc_usb_charge_cleanup(struct platform_device *pd) + } + + /* Panel ID function */ +-static struct device_attribute *panel_handle; ++static device_attribute_no_const *panel_handle; + + static ssize_t sony_nc_panelid_show(struct device *dev, + struct device_attribute *attr, char *buffer) +@@ -2895,7 +2895,7 @@ static void sony_nc_panelid_cleanup(struct platform_device *pd) + } + + /* smart connect function */ +-static struct device_attribute *sc_handle; ++static device_attribute_no_const *sc_handle; + + static ssize_t sony_nc_smart_conn_store(struct device *dev, + struct device_attribute *attr, +@@ -4857,7 +4857,7 @@ static struct acpi_driver sony_pic_driver = { + .drv.pm = &sony_pic_pm, + }; + +-static struct dmi_system_id __initdata sonypi_dmi_table[] = { ++static const struct dmi_system_id __initconst sonypi_dmi_table[] = { + { + .ident = "Sony Vaio", + .matches = { +diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c +index cf0f893..5955997 100644 +--- a/drivers/platform/x86/thinkpad_acpi.c ++++ b/drivers/platform/x86/thinkpad_acpi.c +@@ -2094,7 +2094,7 @@ static int hotkey_mask_get(void) + return 0; + } + +-void static hotkey_mask_warn_incomplete_mask(void) ++static void hotkey_mask_warn_incomplete_mask(void) + { + /* log only what the user can fix... */ + const u32 wantedmask = hotkey_driver_mask & +@@ -2438,10 +2438,10 @@ static void hotkey_compare_and_issue_event(struct tp_nvram_state *oldn, + && !tp_features.bright_unkfw) + TPACPI_MAY_SEND_KEY(TP_ACPI_HOTKEYSCAN_FNHOME); + } ++} + + #undef TPACPI_COMPARE_KEY + #undef TPACPI_MAY_SEND_KEY +-} + + /* + * Polling driver +diff --git a/drivers/pnp/pnpbios/bioscalls.c b/drivers/pnp/pnpbios/bioscalls.c +index 438d4c7..ca8a2fb 100644 +--- a/drivers/pnp/pnpbios/bioscalls.c ++++ b/drivers/pnp/pnpbios/bioscalls.c +@@ -59,7 +59,7 @@ do { \ + set_desc_limit(&gdt[(selname) >> 3], (size) - 1); \ + } while(0) + +-static struct desc_struct bad_bios_desc = GDT_ENTRY_INIT(0x4092, ++static const struct desc_struct bad_bios_desc = GDT_ENTRY_INIT(0x4093, + (unsigned long)__va(0x400UL), PAGE_SIZE - 0x400 - 1); + + /* +@@ -96,7 +96,10 @@ static inline u16 call_pnp_bios(u16 func, u16 arg1, u16 arg2, u16 arg3, + + cpu = get_cpu(); + save_desc_40 = get_cpu_gdt_table(cpu)[0x40 / 8]; ++ ++ pax_open_kernel(); + get_cpu_gdt_table(cpu)[0x40 / 8] = bad_bios_desc; ++ pax_close_kernel(); + + /* On some boxes IRQ's during PnP BIOS calls are deadly. */ + spin_lock_irqsave(&pnp_bios_lock, flags); +@@ -134,7 +137,10 @@ static inline u16 call_pnp_bios(u16 func, u16 arg1, u16 arg2, u16 arg3, + :"memory"); + spin_unlock_irqrestore(&pnp_bios_lock, flags); + ++ pax_open_kernel(); + get_cpu_gdt_table(cpu)[0x40 / 8] = save_desc_40; ++ pax_close_kernel(); ++ + put_cpu(); + + /* If we get here and this is set then the PnP BIOS faulted on us. */ +@@ -468,7 +474,7 @@ int pnp_bios_read_escd(char *data, u32 nvram_base) + return status; + } + +-void pnpbios_calls_init(union pnp_bios_install_struct *header) ++void __init pnpbios_calls_init(union pnp_bios_install_struct *header) + { + int i; + +@@ -476,6 +482,8 @@ void pnpbios_calls_init(union pnp_bios_install_struct *header) + pnp_bios_callpoint.offset = header->fields.pm16offset; + pnp_bios_callpoint.segment = PNP_CS16; + ++ pax_open_kernel(); ++ + for_each_possible_cpu(i) { + struct desc_struct *gdt = get_cpu_gdt_table(i); + if (!gdt) +@@ -487,4 +495,6 @@ void pnpbios_calls_init(union pnp_bios_install_struct *header) + set_desc_base(&gdt[GDT_ENTRY_PNPBIOS_DS], + (unsigned long)__va(header->fields.pm16dseg)); + } ++ ++ pax_close_kernel(); + } +diff --git a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c +index 074569e..d807bef 100644 +--- a/drivers/pnp/pnpbios/core.c ++++ b/drivers/pnp/pnpbios/core.c +@@ -493,7 +493,7 @@ static int __init exploding_pnp_bios(const struct dmi_system_id *d) + return 0; + } + +-static struct dmi_system_id pnpbios_dmi_table[] __initdata = { ++static const struct dmi_system_id pnpbios_dmi_table[] __initconst = { + { /* PnPBIOS GPF on boot */ + .callback = exploding_pnp_bios, + .ident = "Higraded P14H", +diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c +index 0c52e2a..3421ab7 100644 +--- a/drivers/power/pda_power.c ++++ b/drivers/power/pda_power.c +@@ -37,7 +37,11 @@ static int polling; + + #if IS_ENABLED(CONFIG_USB_PHY) + static struct usb_phy *transceiver; +-static struct notifier_block otg_nb; ++static int otg_handle_notification(struct notifier_block *nb, ++ unsigned long event, void *unused); ++static struct notifier_block otg_nb = { ++ .notifier_call = otg_handle_notification ++}; + #endif + + static struct regulator *ac_draw; +@@ -369,7 +373,6 @@ static int pda_power_probe(struct platform_device *pdev) + + #if IS_ENABLED(CONFIG_USB_PHY) + if (!IS_ERR_OR_NULL(transceiver) && pdata->use_otg_notifier) { +- otg_nb.notifier_call = otg_handle_notification; + ret = usb_register_notifier(transceiver, &otg_nb); + if (ret) { + dev_err(dev, "failure to register otg notifier\n"); +diff --git a/drivers/power/power_supply.h b/drivers/power/power_supply.h +index cc439fd..8fa30df 100644 +--- a/drivers/power/power_supply.h ++++ b/drivers/power/power_supply.h +@@ -16,12 +16,12 @@ struct power_supply; + + #ifdef CONFIG_SYSFS + +-extern void power_supply_init_attrs(struct device_type *dev_type); ++extern void power_supply_init_attrs(void); + extern int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env); + + #else + +-static inline void power_supply_init_attrs(struct device_type *dev_type) {} ++static inline void power_supply_init_attrs(void) {} + #define power_supply_uevent NULL + + #endif /* CONFIG_SYSFS */ +diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c +index 694e8cd..9f03483 100644 +--- a/drivers/power/power_supply_core.c ++++ b/drivers/power/power_supply_core.c +@@ -28,7 +28,10 @@ EXPORT_SYMBOL_GPL(power_supply_class); + ATOMIC_NOTIFIER_HEAD(power_supply_notifier); + EXPORT_SYMBOL_GPL(power_supply_notifier); + +-static struct device_type power_supply_dev_type; ++extern const struct attribute_group *power_supply_attr_groups[]; ++static struct device_type power_supply_dev_type = { ++ .groups = power_supply_attr_groups, ++}; + + static bool __power_supply_is_supplied_by(struct power_supply *supplier, + struct power_supply *supply) +@@ -637,7 +640,7 @@ static int __init power_supply_class_init(void) + return PTR_ERR(power_supply_class); + + power_supply_class->dev_uevent = power_supply_uevent; +- power_supply_init_attrs(&power_supply_dev_type); ++ power_supply_init_attrs(); + + return 0; + } +diff --git a/drivers/power/power_supply_sysfs.c b/drivers/power/power_supply_sysfs.c +index 62653f5..d0bb485 100644 +--- a/drivers/power/power_supply_sysfs.c ++++ b/drivers/power/power_supply_sysfs.c +@@ -238,17 +238,15 @@ static struct attribute_group power_supply_attr_group = { + .is_visible = power_supply_attr_is_visible, + }; + +-static const struct attribute_group *power_supply_attr_groups[] = { ++const struct attribute_group *power_supply_attr_groups[] = { + &power_supply_attr_group, + NULL, + }; + +-void power_supply_init_attrs(struct device_type *dev_type) ++void power_supply_init_attrs(void) + { + int i; + +- dev_type->groups = power_supply_attr_groups; +- + for (i = 0; i < ARRAY_SIZE(power_supply_attrs); i++) + __power_supply_attrs[i] = &power_supply_attrs[i].attr; + } +diff --git a/drivers/powercap/powercap_sys.c b/drivers/powercap/powercap_sys.c +index 84419af..268ede8 100644 +--- a/drivers/powercap/powercap_sys.c ++++ b/drivers/powercap/powercap_sys.c +@@ -154,8 +154,77 @@ struct powercap_constraint_attr { + struct device_attribute name_attr; + }; + ++static ssize_t show_constraint_name(struct device *dev, ++ struct device_attribute *dev_attr, ++ char *buf); ++ + static struct powercap_constraint_attr +- constraint_attrs[MAX_CONSTRAINTS_PER_ZONE]; ++ constraint_attrs[MAX_CONSTRAINTS_PER_ZONE] = { ++ [0 ... MAX_CONSTRAINTS_PER_ZONE - 1] = { ++ .power_limit_attr = { ++ .attr = { ++ .name = NULL, ++ .mode = S_IWUSR | S_IRUGO ++ }, ++ .show = show_constraint_power_limit_uw, ++ .store = store_constraint_power_limit_uw ++ }, ++ ++ .time_window_attr = { ++ .attr = { ++ .name = NULL, ++ .mode = S_IWUSR | S_IRUGO ++ }, ++ .show = show_constraint_time_window_us, ++ .store = store_constraint_time_window_us ++ }, ++ ++ .max_power_attr = { ++ .attr = { ++ .name = NULL, ++ .mode = S_IRUGO ++ }, ++ .show = show_constraint_max_power_uw, ++ .store = NULL ++ }, ++ ++ .min_power_attr = { ++ .attr = { ++ .name = NULL, ++ .mode = S_IRUGO ++ }, ++ .show = show_constraint_min_power_uw, ++ .store = NULL ++ }, ++ ++ .max_time_window_attr = { ++ .attr = { ++ .name = NULL, ++ .mode = S_IRUGO ++ }, ++ .show = show_constraint_max_time_window_us, ++ .store = NULL ++ }, ++ ++ .min_time_window_attr = { ++ .attr = { ++ .name = NULL, ++ .mode = S_IRUGO ++ }, ++ .show = show_constraint_min_time_window_us, ++ .store = NULL ++ }, ++ ++ .name_attr = { ++ .attr = { ++ .name = NULL, ++ .mode = S_IRUGO ++ }, ++ .show = show_constraint_name, ++ .store = NULL ++ } ++ } ++}; + + /* A list of powercap control_types */ + static LIST_HEAD(powercap_cntrl_list); +@@ -193,23 +262,16 @@ static ssize_t show_constraint_name(struct device *dev, + } + + static int create_constraint_attribute(int id, const char *name, +- int mode, +- struct device_attribute *dev_attr, +- ssize_t (*show)(struct device *, +- struct device_attribute *, char *), +- ssize_t (*store)(struct device *, +- struct device_attribute *, +- const char *, size_t) +- ) ++ struct device_attribute *dev_attr) + { ++ name = kasprintf(GFP_KERNEL, "constraint_%d_%s", id, name); + +- dev_attr->attr.name = kasprintf(GFP_KERNEL, "constraint_%d_%s", +- id, name); +- if (!dev_attr->attr.name) ++ if (!name) + return -ENOMEM; +- dev_attr->attr.mode = mode; +- dev_attr->show = show; +- dev_attr->store = store; ++ ++ pax_open_kernel(); ++ *(const char **)&dev_attr->attr.name = name; ++ pax_close_kernel(); + + return 0; + } +@@ -236,49 +298,31 @@ static int seed_constraint_attributes(void) + + for (i = 0; i < MAX_CONSTRAINTS_PER_ZONE; ++i) { + ret = create_constraint_attribute(i, "power_limit_uw", +- S_IWUSR | S_IRUGO, +- &constraint_attrs[i].power_limit_attr, +- show_constraint_power_limit_uw, +- store_constraint_power_limit_uw); ++ &constraint_attrs[i].power_limit_attr); + if (ret) + goto err_alloc; + ret = create_constraint_attribute(i, "time_window_us", +- S_IWUSR | S_IRUGO, +- &constraint_attrs[i].time_window_attr, +- show_constraint_time_window_us, +- store_constraint_time_window_us); ++ &constraint_attrs[i].time_window_attr); + if (ret) + goto err_alloc; +- ret = create_constraint_attribute(i, "name", S_IRUGO, +- &constraint_attrs[i].name_attr, +- show_constraint_name, +- NULL); ++ ret = create_constraint_attribute(i, "name", ++ &constraint_attrs[i].name_attr); + if (ret) + goto err_alloc; +- ret = create_constraint_attribute(i, "max_power_uw", S_IRUGO, +- &constraint_attrs[i].max_power_attr, +- show_constraint_max_power_uw, +- NULL); ++ ret = create_constraint_attribute(i, "max_power_uw", ++ &constraint_attrs[i].max_power_attr); + if (ret) + goto err_alloc; +- ret = create_constraint_attribute(i, "min_power_uw", S_IRUGO, +- &constraint_attrs[i].min_power_attr, +- show_constraint_min_power_uw, +- NULL); ++ ret = create_constraint_attribute(i, "min_power_uw", ++ &constraint_attrs[i].min_power_attr); + if (ret) + goto err_alloc; + ret = create_constraint_attribute(i, "max_time_window_us", +- S_IRUGO, +- &constraint_attrs[i].max_time_window_attr, +- show_constraint_max_time_window_us, +- NULL); ++ &constraint_attrs[i].max_time_window_attr); + if (ret) + goto err_alloc; + ret = create_constraint_attribute(i, "min_time_window_us", +- S_IRUGO, +- &constraint_attrs[i].min_time_window_attr, +- show_constraint_min_time_window_us, +- NULL); ++ &constraint_attrs[i].min_time_window_attr); + if (ret) + goto err_alloc; + +@@ -378,10 +422,12 @@ static void create_power_zone_common_attributes( + power_zone->zone_dev_attrs[count++] = + &dev_attr_max_energy_range_uj.attr; + if (power_zone->ops->get_energy_uj) { ++ pax_open_kernel(); + if (power_zone->ops->reset_energy_uj) +- dev_attr_energy_uj.attr.mode = S_IWUSR | S_IRUGO; ++ *(umode_t *)&dev_attr_energy_uj.attr.mode = S_IWUSR | S_IRUGO; + else +- dev_attr_energy_uj.attr.mode = S_IRUGO; ++ *(umode_t *)&dev_attr_energy_uj.attr.mode = S_IRUGO; ++ pax_close_kernel(); + power_zone->zone_dev_attrs[count++] = + &dev_attr_energy_uj.attr; + } +diff --git a/drivers/ptp/ptp_private.h b/drivers/ptp/ptp_private.h +index 9c5d414..c7900ce 100644 +--- a/drivers/ptp/ptp_private.h ++++ b/drivers/ptp/ptp_private.h +@@ -51,7 +51,7 @@ struct ptp_clock { + struct mutex pincfg_mux; /* protect concurrent info->pin_config access */ + wait_queue_head_t tsev_wq; + int defunct; /* tells readers to go away when clock is being removed */ +- struct device_attribute *pin_dev_attr; ++ device_attribute_no_const *pin_dev_attr; + struct attribute **pin_attr; + struct attribute_group pin_attr_group; + }; +diff --git a/drivers/ptp/ptp_sysfs.c b/drivers/ptp/ptp_sysfs.c +index 302e626..12579af 100644 +--- a/drivers/ptp/ptp_sysfs.c ++++ b/drivers/ptp/ptp_sysfs.c +@@ -280,7 +280,7 @@ static int ptp_populate_pins(struct ptp_clock *ptp) + goto no_pin_attr; + + for (i = 0; i < n_pins; i++) { +- struct device_attribute *da = &ptp->pin_dev_attr[i]; ++ device_attribute_no_const *da = &ptp->pin_dev_attr[i]; + sysfs_attr_init(&da->attr); + da->attr.name = info->pin_config[i].name; + da->attr.mode = 0644; +diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c +index d92612c..aac18ca 100644 +--- a/drivers/regulator/core.c ++++ b/drivers/regulator/core.c +@@ -3573,7 +3573,7 @@ regulator_register(const struct regulator_desc *regulator_desc, + { + const struct regulation_constraints *constraints = NULL; + const struct regulator_init_data *init_data; +- static atomic_t regulator_no = ATOMIC_INIT(0); ++ static atomic_unchecked_t regulator_no = ATOMIC_INIT(0); + struct regulator_dev *rdev; + struct device *dev; + int ret, i; +@@ -3647,7 +3647,7 @@ regulator_register(const struct regulator_desc *regulator_desc, + rdev->dev.class = ®ulator_class; + rdev->dev.parent = dev; + dev_set_name(&rdev->dev, "regulator.%d", +- atomic_inc_return(®ulator_no) - 1); ++ atomic_inc_return_unchecked(®ulator_no) - 1); + ret = device_register(&rdev->dev); + if (ret != 0) { + put_device(&rdev->dev); +diff --git a/drivers/regulator/max8660.c b/drivers/regulator/max8660.c +index 7eee2ca..4024513 100644 +--- a/drivers/regulator/max8660.c ++++ b/drivers/regulator/max8660.c +@@ -424,8 +424,10 @@ static int max8660_probe(struct i2c_client *client, + max8660->shadow_regs[MAX8660_OVER1] = 5; + } else { + /* Otherwise devices can be toggled via software */ +- max8660_dcdc_ops.enable = max8660_dcdc_enable; +- max8660_dcdc_ops.disable = max8660_dcdc_disable; ++ pax_open_kernel(); ++ *(void **)&max8660_dcdc_ops.enable = max8660_dcdc_enable; ++ *(void **)&max8660_dcdc_ops.disable = max8660_dcdc_disable; ++ pax_close_kernel(); + } + + /* +diff --git a/drivers/regulator/max8973-regulator.c b/drivers/regulator/max8973-regulator.c +index dbedf17..18ff6b7 100644 +--- a/drivers/regulator/max8973-regulator.c ++++ b/drivers/regulator/max8973-regulator.c +@@ -403,9 +403,11 @@ static int max8973_probe(struct i2c_client *client, + if (!pdata || !pdata->enable_ext_control) { + max->desc.enable_reg = MAX8973_VOUT; + max->desc.enable_mask = MAX8973_VOUT_ENABLE; +- max->ops.enable = regulator_enable_regmap; +- max->ops.disable = regulator_disable_regmap; +- max->ops.is_enabled = regulator_is_enabled_regmap; ++ pax_open_kernel(); ++ *(void **)&max->ops.enable = regulator_enable_regmap; ++ *(void **)&max->ops.disable = regulator_disable_regmap; ++ *(void **)&max->ops.is_enabled = regulator_is_enabled_regmap; ++ pax_close_kernel(); + } + + if (pdata) { +diff --git a/drivers/regulator/mc13892-regulator.c b/drivers/regulator/mc13892-regulator.c +index 793b662..01c20fc 100644 +--- a/drivers/regulator/mc13892-regulator.c ++++ b/drivers/regulator/mc13892-regulator.c +@@ -584,10 +584,12 @@ static int mc13892_regulator_probe(struct platform_device *pdev) + mc13xxx_unlock(mc13892); + + /* update mc13892_vcam ops */ +- memcpy(&mc13892_vcam_ops, mc13892_regulators[MC13892_VCAM].desc.ops, ++ pax_open_kernel(); ++ memcpy((void *)&mc13892_vcam_ops, mc13892_regulators[MC13892_VCAM].desc.ops, + sizeof(struct regulator_ops)); +- mc13892_vcam_ops.set_mode = mc13892_vcam_set_mode, +- mc13892_vcam_ops.get_mode = mc13892_vcam_get_mode, ++ *(void **)&mc13892_vcam_ops.set_mode = mc13892_vcam_set_mode, ++ *(void **)&mc13892_vcam_ops.get_mode = mc13892_vcam_get_mode, ++ pax_close_kernel(); + mc13892_regulators[MC13892_VCAM].desc.ops = &mc13892_vcam_ops; + + mc13xxx_data = mc13xxx_parse_regulators_dt(pdev, mc13892_regulators, +diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c +index 5b2e761..c8c8a4a 100644 +--- a/drivers/rtc/rtc-cmos.c ++++ b/drivers/rtc/rtc-cmos.c +@@ -789,7 +789,9 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) + hpet_rtc_timer_init(); + + /* export at least the first block of NVRAM */ +- nvram.size = address_space - NVRAM_OFFSET; ++ pax_open_kernel(); ++ *(size_t *)&nvram.size = address_space - NVRAM_OFFSET; ++ pax_close_kernel(); + retval = sysfs_create_bin_file(&dev->kobj, &nvram); + if (retval < 0) { + dev_dbg(dev, "can't create nvram file? %d\n", retval); +diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c +index d049393..bb20be0 100644 +--- a/drivers/rtc/rtc-dev.c ++++ b/drivers/rtc/rtc-dev.c +@@ -16,6 +16,7 @@ + #include <linux/module.h> + #include <linux/rtc.h> + #include <linux/sched.h> ++#include <linux/grsecurity.h> + #include "rtc-core.h" + + static dev_t rtc_devt; +@@ -347,6 +348,8 @@ static long rtc_dev_ioctl(struct file *file, + if (copy_from_user(&tm, uarg, sizeof(tm))) + return -EFAULT; + ++ gr_log_timechange(); ++ + return rtc_set_time(rtc, &tm); + + case RTC_PIE_ON: +diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c +index bb43cf7..ee4d274 100644 +--- a/drivers/rtc/rtc-ds1307.c ++++ b/drivers/rtc/rtc-ds1307.c +@@ -107,7 +107,7 @@ struct ds1307 { + u8 offset; /* register's offset */ + u8 regs[11]; + u16 nvram_offset; +- struct bin_attribute *nvram; ++ bin_attribute_no_const *nvram; + enum ds_type type; + unsigned long flags; + #define HAS_NVRAM 0 /* bit 0 == sysfs file active */ +diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c +index 11880c1..b823aa4 100644 +--- a/drivers/rtc/rtc-m48t59.c ++++ b/drivers/rtc/rtc-m48t59.c +@@ -483,7 +483,9 @@ static int m48t59_rtc_probe(struct platform_device *pdev) + if (IS_ERR(m48t59->rtc)) + return PTR_ERR(m48t59->rtc); + +- m48t59_nvram_attr.size = pdata->offset; ++ pax_open_kernel(); ++ *(size_t *)&m48t59_nvram_attr.size = pdata->offset; ++ pax_close_kernel(); + + ret = sysfs_create_bin_file(&pdev->dev.kobj, &m48t59_nvram_attr); + if (ret) +diff --git a/drivers/scsi/bfa/bfa_fcpim.h b/drivers/scsi/bfa/bfa_fcpim.h +index e693af6..2e525b6 100644 +--- a/drivers/scsi/bfa/bfa_fcpim.h ++++ b/drivers/scsi/bfa/bfa_fcpim.h +@@ -36,7 +36,7 @@ struct bfa_iotag_s { + + struct bfa_itn_s { + bfa_isr_func_t isr; +-}; ++} __no_const; + + void bfa_itn_create(struct bfa_s *bfa, struct bfa_rport_s *rport, + void (*isr)(struct bfa_s *bfa, struct bfi_msg_s *m)); +diff --git a/drivers/scsi/bfa/bfa_fcs.c b/drivers/scsi/bfa/bfa_fcs.c +index 0f19455..ef7adb5 100644 +--- a/drivers/scsi/bfa/bfa_fcs.c ++++ b/drivers/scsi/bfa/bfa_fcs.c +@@ -38,10 +38,21 @@ struct bfa_fcs_mod_s { + #define BFA_FCS_MODULE(_mod) { _mod ## _modinit, _mod ## _modexit } + + static struct bfa_fcs_mod_s fcs_modules[] = { +- { bfa_fcs_port_attach, NULL, NULL }, +- { bfa_fcs_uf_attach, NULL, NULL }, +- { bfa_fcs_fabric_attach, bfa_fcs_fabric_modinit, +- bfa_fcs_fabric_modexit }, ++ { ++ .attach = bfa_fcs_port_attach, ++ .modinit = NULL, ++ .modexit = NULL ++ }, ++ { ++ .attach = bfa_fcs_uf_attach, ++ .modinit = NULL, ++ .modexit = NULL ++ }, ++ { ++ .attach = bfa_fcs_fabric_attach, ++ .modinit = bfa_fcs_fabric_modinit, ++ .modexit = bfa_fcs_fabric_modexit ++ }, + }; + + /* +diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c +index ff75ef8..2dfe00a 100644 +--- a/drivers/scsi/bfa/bfa_fcs_lport.c ++++ b/drivers/scsi/bfa/bfa_fcs_lport.c +@@ -89,15 +89,26 @@ static struct { + void (*offline) (struct bfa_fcs_lport_s *port); + } __port_action[] = { + { +- bfa_fcs_lport_unknown_init, bfa_fcs_lport_unknown_online, +- bfa_fcs_lport_unknown_offline}, { +- bfa_fcs_lport_fab_init, bfa_fcs_lport_fab_online, +- bfa_fcs_lport_fab_offline}, { +- bfa_fcs_lport_n2n_init, bfa_fcs_lport_n2n_online, +- bfa_fcs_lport_n2n_offline}, { +- bfa_fcs_lport_loop_init, bfa_fcs_lport_loop_online, +- bfa_fcs_lport_loop_offline}, +- }; ++ .init = bfa_fcs_lport_unknown_init, ++ .online = bfa_fcs_lport_unknown_online, ++ .offline = bfa_fcs_lport_unknown_offline ++ }, ++ { ++ .init = bfa_fcs_lport_fab_init, ++ .online = bfa_fcs_lport_fab_online, ++ .offline = bfa_fcs_lport_fab_offline ++ }, ++ { ++ .init = bfa_fcs_lport_n2n_init, ++ .online = bfa_fcs_lport_n2n_online, ++ .offline = bfa_fcs_lport_n2n_offline ++ }, ++ { ++ .init = bfa_fcs_lport_loop_init, ++ .online = bfa_fcs_lport_loop_online, ++ .offline = bfa_fcs_lport_loop_offline ++ }, ++}; + + /* + * fcs_port_sm FCS logical port state machine +diff --git a/drivers/scsi/bfa/bfa_ioc.h b/drivers/scsi/bfa/bfa_ioc.h +index a38aafa0..fe8f03b 100644 +--- a/drivers/scsi/bfa/bfa_ioc.h ++++ b/drivers/scsi/bfa/bfa_ioc.h +@@ -258,7 +258,7 @@ struct bfa_ioc_cbfn_s { + bfa_ioc_disable_cbfn_t disable_cbfn; + bfa_ioc_hbfail_cbfn_t hbfail_cbfn; + bfa_ioc_reset_cbfn_t reset_cbfn; +-}; ++} __no_const; + + /* + * IOC event notification mechanism. +@@ -352,7 +352,7 @@ struct bfa_ioc_hwif_s { + void (*ioc_set_alt_fwstate) (struct bfa_ioc_s *ioc, + enum bfi_ioc_state fwstate); + enum bfi_ioc_state (*ioc_get_alt_fwstate) (struct bfa_ioc_s *ioc); +-}; ++} __no_const; + + /* + * Queue element to wait for room in request queue. FIFO order is +diff --git a/drivers/scsi/bfa/bfa_modules.h b/drivers/scsi/bfa/bfa_modules.h +index a14c784..6de6790 100644 +--- a/drivers/scsi/bfa/bfa_modules.h ++++ b/drivers/scsi/bfa/bfa_modules.h +@@ -78,12 +78,12 @@ enum { + \ + extern struct bfa_module_s hal_mod_ ## __mod; \ + struct bfa_module_s hal_mod_ ## __mod = { \ +- bfa_ ## __mod ## _meminfo, \ +- bfa_ ## __mod ## _attach, \ +- bfa_ ## __mod ## _detach, \ +- bfa_ ## __mod ## _start, \ +- bfa_ ## __mod ## _stop, \ +- bfa_ ## __mod ## _iocdisable, \ ++ .meminfo = bfa_ ## __mod ## _meminfo, \ ++ .attach = bfa_ ## __mod ## _attach, \ ++ .detach = bfa_ ## __mod ## _detach, \ ++ .start = bfa_ ## __mod ## _start, \ ++ .stop = bfa_ ## __mod ## _stop, \ ++ .iocdisable = bfa_ ## __mod ## _iocdisable, \ + } + + #define BFA_CACHELINE_SZ (256) +diff --git a/drivers/scsi/fcoe/fcoe_sysfs.c b/drivers/scsi/fcoe/fcoe_sysfs.c +index 045c4e1..13de803 100644 +--- a/drivers/scsi/fcoe/fcoe_sysfs.c ++++ b/drivers/scsi/fcoe/fcoe_sysfs.c +@@ -33,8 +33,8 @@ + */ + #include "libfcoe.h" + +-static atomic_t ctlr_num; +-static atomic_t fcf_num; ++static atomic_unchecked_t ctlr_num; ++static atomic_unchecked_t fcf_num; + + /* + * fcoe_fcf_dev_loss_tmo: the default number of seconds that fcoe sysfs +@@ -685,7 +685,7 @@ struct fcoe_ctlr_device *fcoe_ctlr_device_add(struct device *parent, + if (!ctlr) + goto out; + +- ctlr->id = atomic_inc_return(&ctlr_num) - 1; ++ ctlr->id = atomic_inc_return_unchecked(&ctlr_num) - 1; + ctlr->f = f; + ctlr->mode = FIP_CONN_TYPE_FABRIC; + INIT_LIST_HEAD(&ctlr->fcfs); +@@ -902,7 +902,7 @@ struct fcoe_fcf_device *fcoe_fcf_device_add(struct fcoe_ctlr_device *ctlr, + fcf->dev.parent = &ctlr->dev; + fcf->dev.bus = &fcoe_bus_type; + fcf->dev.type = &fcoe_fcf_device_type; +- fcf->id = atomic_inc_return(&fcf_num) - 1; ++ fcf->id = atomic_inc_return_unchecked(&fcf_num) - 1; + fcf->state = FCOE_FCF_STATE_UNKNOWN; + + fcf->dev_loss_tmo = ctlr->fcf_dev_loss_tmo; +@@ -938,8 +938,8 @@ int __init fcoe_sysfs_setup(void) + { + int error; + +- atomic_set(&ctlr_num, 0); +- atomic_set(&fcf_num, 0); ++ atomic_set_unchecked(&ctlr_num, 0); ++ atomic_set_unchecked(&fcf_num, 0); + + error = bus_register(&fcoe_bus_type); + if (error) +diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c +index 6de80e3..a11e0ac 100644 +--- a/drivers/scsi/hosts.c ++++ b/drivers/scsi/hosts.c +@@ -42,7 +42,7 @@ + #include "scsi_logging.h" + + +-static atomic_t scsi_host_next_hn = ATOMIC_INIT(0); /* host_no for next new host */ ++static atomic_unchecked_t scsi_host_next_hn = ATOMIC_INIT(0); /* host_no for next new host */ + + + static void scsi_host_cls_release(struct device *dev) +@@ -392,7 +392,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) + * subtract one because we increment first then return, but we need to + * know what the next host number was before increment + */ +- shost->host_no = atomic_inc_return(&scsi_host_next_hn) - 1; ++ shost->host_no = atomic_inc_return_unchecked(&scsi_host_next_hn) - 1; + shost->dma_channel = 0xff; + + /* These three are default values which can be overridden */ +diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c +index cef5d49..01e280e 100644 +--- a/drivers/scsi/hpsa.c ++++ b/drivers/scsi/hpsa.c +@@ -701,10 +701,10 @@ static inline u32 next_command(struct ctlr_info *h, u8 q) + unsigned long flags; + + if (h->transMethod & CFGTBL_Trans_io_accel1) +- return h->access.command_completed(h, q); ++ return h->access->command_completed(h, q); + + if (unlikely(!(h->transMethod & CFGTBL_Trans_Performant))) +- return h->access.command_completed(h, q); ++ return h->access->command_completed(h, q); + + if ((rq->head[rq->current_entry] & 1) == rq->wraparound) { + a = rq->head[rq->current_entry]; +@@ -5454,7 +5454,7 @@ static void start_io(struct ctlr_info *h, unsigned long *flags) + while (!list_empty(&h->reqQ)) { + c = list_entry(h->reqQ.next, struct CommandList, list); + /* can't do anything if fifo is full */ +- if ((h->access.fifo_full(h))) { ++ if ((h->access->fifo_full(h))) { + h->fifo_recently_full = 1; + dev_warn(&h->pdev->dev, "fifo full\n"); + break; +@@ -5476,7 +5476,7 @@ static void start_io(struct ctlr_info *h, unsigned long *flags) + + /* Tell the controller execute command */ + spin_unlock_irqrestore(&h->lock, *flags); +- h->access.submit_command(h, c); ++ h->access->submit_command(h, c); + spin_lock_irqsave(&h->lock, *flags); + } + } +@@ -5492,17 +5492,17 @@ static void lock_and_start_io(struct ctlr_info *h) + + static inline unsigned long get_next_completion(struct ctlr_info *h, u8 q) + { +- return h->access.command_completed(h, q); ++ return h->access->command_completed(h, q); + } + + static inline bool interrupt_pending(struct ctlr_info *h) + { +- return h->access.intr_pending(h); ++ return h->access->intr_pending(h); + } + + static inline long interrupt_not_for_us(struct ctlr_info *h) + { +- return (h->access.intr_pending(h) == 0) || ++ return (h->access->intr_pending(h) == 0) || + (h->interrupts_enabled == 0); + } + +@@ -6445,7 +6445,7 @@ static int hpsa_pci_init(struct ctlr_info *h) + if (prod_index < 0) + return -ENODEV; + h->product_name = products[prod_index].product_name; +- h->access = *(products[prod_index].access); ++ h->access = products[prod_index].access; + + pci_disable_link_state(h->pdev, PCIE_LINK_STATE_L0S | + PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM); +@@ -6790,7 +6790,7 @@ static void controller_lockup_detected(struct ctlr_info *h) + unsigned long flags; + u32 lockup_detected; + +- h->access.set_intr_mask(h, HPSA_INTR_OFF); ++ h->access->set_intr_mask(h, HPSA_INTR_OFF); + spin_lock_irqsave(&h->lock, flags); + lockup_detected = readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); + if (!lockup_detected) { +@@ -7037,7 +7037,7 @@ reinit_after_soft_reset: + } + + /* make sure the board interrupts are off */ +- h->access.set_intr_mask(h, HPSA_INTR_OFF); ++ h->access->set_intr_mask(h, HPSA_INTR_OFF); + + if (hpsa_request_irq(h, do_hpsa_intr_msi, do_hpsa_intr_intx)) + goto clean2; +@@ -7072,7 +7072,7 @@ reinit_after_soft_reset: + * fake ones to scoop up any residual completions. + */ + spin_lock_irqsave(&h->lock, flags); +- h->access.set_intr_mask(h, HPSA_INTR_OFF); ++ h->access->set_intr_mask(h, HPSA_INTR_OFF); + spin_unlock_irqrestore(&h->lock, flags); + free_irqs(h); + rc = hpsa_request_irq(h, hpsa_msix_discard_completions, +@@ -7091,9 +7091,9 @@ reinit_after_soft_reset: + dev_info(&h->pdev->dev, "Board READY.\n"); + dev_info(&h->pdev->dev, + "Waiting for stale completions to drain.\n"); +- h->access.set_intr_mask(h, HPSA_INTR_ON); ++ h->access->set_intr_mask(h, HPSA_INTR_ON); + msleep(10000); +- h->access.set_intr_mask(h, HPSA_INTR_OFF); ++ h->access->set_intr_mask(h, HPSA_INTR_OFF); + + rc = controller_reset_failed(h->cfgtable); + if (rc) +@@ -7119,7 +7119,7 @@ reinit_after_soft_reset: + h->drv_req_rescan = 0; + + /* Turn the interrupts on so we can service requests */ +- h->access.set_intr_mask(h, HPSA_INTR_ON); ++ h->access->set_intr_mask(h, HPSA_INTR_ON); + + hpsa_hba_inquiry(h); + hpsa_register_scsi(h); /* hook ourselves into SCSI subsystem */ +@@ -7184,7 +7184,7 @@ static void hpsa_shutdown(struct pci_dev *pdev) + * To write all data in the battery backed cache to disks + */ + hpsa_flush_cache(h); +- h->access.set_intr_mask(h, HPSA_INTR_OFF); ++ h->access->set_intr_mask(h, HPSA_INTR_OFF); + hpsa_free_irqs_and_disable_msix(h); + } + +@@ -7302,7 +7302,7 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 trans_support) + CFGTBL_Trans_enable_directed_msix | + (trans_support & (CFGTBL_Trans_io_accel1 | + CFGTBL_Trans_io_accel2)); +- struct access_method access = SA5_performant_access; ++ struct access_method *access = &SA5_performant_access; + + /* This is a bit complicated. There are 8 registers on + * the controller which we write to to tell it 8 different +@@ -7344,7 +7344,7 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 trans_support) + * perform the superfluous readl() after each command submission. + */ + if (trans_support & (CFGTBL_Trans_io_accel1 | CFGTBL_Trans_io_accel2)) +- access = SA5_performant_access_no_read; ++ access = &SA5_performant_access_no_read; + + /* Controller spec: zero out this buffer. */ + for (i = 0; i < h->nreply_queues; i++) +@@ -7374,12 +7374,12 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 trans_support) + * enable outbound interrupt coalescing in accelerator mode; + */ + if (trans_support & CFGTBL_Trans_io_accel1) { +- access = SA5_ioaccel_mode1_access; ++ access = &SA5_ioaccel_mode1_access; + writel(10, &h->cfgtable->HostWrite.CoalIntDelay); + writel(4, &h->cfgtable->HostWrite.CoalIntCount); + } else { + if (trans_support & CFGTBL_Trans_io_accel2) { +- access = SA5_ioaccel_mode2_access; ++ access = &SA5_ioaccel_mode2_access; + writel(10, &h->cfgtable->HostWrite.CoalIntDelay); + writel(4, &h->cfgtable->HostWrite.CoalIntCount); + } +diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h +index 24472ce..8782caf 100644 +--- a/drivers/scsi/hpsa.h ++++ b/drivers/scsi/hpsa.h +@@ -127,7 +127,7 @@ struct ctlr_info { + unsigned int msix_vector; + unsigned int msi_vector; + int intr_mode; /* either PERF_MODE_INT or SIMPLE_MODE_INT */ +- struct access_method access; ++ struct access_method *access; + char hba_mode_enabled; + + /* queue and queue Info */ +@@ -536,43 +536,43 @@ static unsigned long SA5_ioaccel_mode1_completed(struct ctlr_info *h, u8 q) + } + + static struct access_method SA5_access = { +- SA5_submit_command, +- SA5_intr_mask, +- SA5_fifo_full, +- SA5_intr_pending, +- SA5_completed, ++ .submit_command = SA5_submit_command, ++ .set_intr_mask = SA5_intr_mask, ++ .fifo_full = SA5_fifo_full, ++ .intr_pending = SA5_intr_pending, ++ .command_completed = SA5_completed, + }; + + static struct access_method SA5_ioaccel_mode1_access = { +- SA5_submit_command, +- SA5_performant_intr_mask, +- SA5_fifo_full, +- SA5_ioaccel_mode1_intr_pending, +- SA5_ioaccel_mode1_completed, ++ .submit_command = SA5_submit_command, ++ .set_intr_mask = SA5_performant_intr_mask, ++ .fifo_full = SA5_fifo_full, ++ .intr_pending = SA5_ioaccel_mode1_intr_pending, ++ .command_completed = SA5_ioaccel_mode1_completed, + }; + + static struct access_method SA5_ioaccel_mode2_access = { +- SA5_submit_command_ioaccel2, +- SA5_performant_intr_mask, +- SA5_fifo_full, +- SA5_performant_intr_pending, +- SA5_performant_completed, ++ .submit_command = SA5_submit_command_ioaccel2, ++ .set_intr_mask = SA5_performant_intr_mask, ++ .fifo_full = SA5_fifo_full, ++ .intr_pending = SA5_performant_intr_pending, ++ .command_completed = SA5_performant_completed, + }; + + static struct access_method SA5_performant_access = { +- SA5_submit_command, +- SA5_performant_intr_mask, +- SA5_fifo_full, +- SA5_performant_intr_pending, +- SA5_performant_completed, ++ .submit_command = SA5_submit_command, ++ .set_intr_mask = SA5_performant_intr_mask, ++ .fifo_full = SA5_fifo_full, ++ .intr_pending = SA5_performant_intr_pending, ++ .command_completed = SA5_performant_completed, + }; + + static struct access_method SA5_performant_access_no_read = { +- SA5_submit_command_no_read, +- SA5_performant_intr_mask, +- SA5_fifo_full, +- SA5_performant_intr_pending, +- SA5_performant_completed, ++ .submit_command = SA5_submit_command_no_read, ++ .set_intr_mask = SA5_performant_intr_mask, ++ .fifo_full = SA5_fifo_full, ++ .intr_pending = SA5_performant_intr_pending, ++ .command_completed = SA5_performant_completed, + }; + + struct board_type { +diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c +index 1b3a094..068e683 100644 +--- a/drivers/scsi/libfc/fc_exch.c ++++ b/drivers/scsi/libfc/fc_exch.c +@@ -101,12 +101,12 @@ struct fc_exch_mgr { + u16 pool_max_index; + + struct { +- atomic_t no_free_exch; +- atomic_t no_free_exch_xid; +- atomic_t xid_not_found; +- atomic_t xid_busy; +- atomic_t seq_not_found; +- atomic_t non_bls_resp; ++ atomic_unchecked_t no_free_exch; ++ atomic_unchecked_t no_free_exch_xid; ++ atomic_unchecked_t xid_not_found; ++ atomic_unchecked_t xid_busy; ++ atomic_unchecked_t seq_not_found; ++ atomic_unchecked_t non_bls_resp; + } stats; + }; + +@@ -811,7 +811,7 @@ static struct fc_exch *fc_exch_em_alloc(struct fc_lport *lport, + /* allocate memory for exchange */ + ep = mempool_alloc(mp->ep_pool, GFP_ATOMIC); + if (!ep) { +- atomic_inc(&mp->stats.no_free_exch); ++ atomic_inc_unchecked(&mp->stats.no_free_exch); + goto out; + } + memset(ep, 0, sizeof(*ep)); +@@ -874,7 +874,7 @@ out: + return ep; + err: + spin_unlock_bh(&pool->lock); +- atomic_inc(&mp->stats.no_free_exch_xid); ++ atomic_inc_unchecked(&mp->stats.no_free_exch_xid); + mempool_free(ep, mp->ep_pool); + return NULL; + } +@@ -1023,7 +1023,7 @@ static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_lport *lport, + xid = ntohs(fh->fh_ox_id); /* we originated exch */ + ep = fc_exch_find(mp, xid); + if (!ep) { +- atomic_inc(&mp->stats.xid_not_found); ++ atomic_inc_unchecked(&mp->stats.xid_not_found); + reject = FC_RJT_OX_ID; + goto out; + } +@@ -1053,7 +1053,7 @@ static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_lport *lport, + ep = fc_exch_find(mp, xid); + if ((f_ctl & FC_FC_FIRST_SEQ) && fc_sof_is_init(fr_sof(fp))) { + if (ep) { +- atomic_inc(&mp->stats.xid_busy); ++ atomic_inc_unchecked(&mp->stats.xid_busy); + reject = FC_RJT_RX_ID; + goto rel; + } +@@ -1064,7 +1064,7 @@ static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_lport *lport, + } + xid = ep->xid; /* get our XID */ + } else if (!ep) { +- atomic_inc(&mp->stats.xid_not_found); ++ atomic_inc_unchecked(&mp->stats.xid_not_found); + reject = FC_RJT_RX_ID; /* XID not found */ + goto out; + } +@@ -1082,7 +1082,7 @@ static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_lport *lport, + } else { + sp = &ep->seq; + if (sp->id != fh->fh_seq_id) { +- atomic_inc(&mp->stats.seq_not_found); ++ atomic_inc_unchecked(&mp->stats.seq_not_found); + if (f_ctl & FC_FC_END_SEQ) { + /* + * Update sequence_id based on incoming last +@@ -1533,22 +1533,22 @@ static void fc_exch_recv_seq_resp(struct fc_exch_mgr *mp, struct fc_frame *fp) + + ep = fc_exch_find(mp, ntohs(fh->fh_ox_id)); + if (!ep) { +- atomic_inc(&mp->stats.xid_not_found); ++ atomic_inc_unchecked(&mp->stats.xid_not_found); + goto out; + } + if (ep->esb_stat & ESB_ST_COMPLETE) { +- atomic_inc(&mp->stats.xid_not_found); ++ atomic_inc_unchecked(&mp->stats.xid_not_found); + goto rel; + } + if (ep->rxid == FC_XID_UNKNOWN) + ep->rxid = ntohs(fh->fh_rx_id); + if (ep->sid != 0 && ep->sid != ntoh24(fh->fh_d_id)) { +- atomic_inc(&mp->stats.xid_not_found); ++ atomic_inc_unchecked(&mp->stats.xid_not_found); + goto rel; + } + if (ep->did != ntoh24(fh->fh_s_id) && + ep->did != FC_FID_FLOGI) { +- atomic_inc(&mp->stats.xid_not_found); ++ atomic_inc_unchecked(&mp->stats.xid_not_found); + goto rel; + } + sof = fr_sof(fp); +@@ -1557,7 +1557,7 @@ static void fc_exch_recv_seq_resp(struct fc_exch_mgr *mp, struct fc_frame *fp) + sp->ssb_stat |= SSB_ST_RESP; + sp->id = fh->fh_seq_id; + } else if (sp->id != fh->fh_seq_id) { +- atomic_inc(&mp->stats.seq_not_found); ++ atomic_inc_unchecked(&mp->stats.seq_not_found); + goto rel; + } + +@@ -1619,9 +1619,9 @@ static void fc_exch_recv_resp(struct fc_exch_mgr *mp, struct fc_frame *fp) + sp = fc_seq_lookup_orig(mp, fp); /* doesn't hold sequence */ + + if (!sp) +- atomic_inc(&mp->stats.xid_not_found); ++ atomic_inc_unchecked(&mp->stats.xid_not_found); + else +- atomic_inc(&mp->stats.non_bls_resp); ++ atomic_inc_unchecked(&mp->stats.non_bls_resp); + + fc_frame_free(fp); + } +@@ -2261,13 +2261,13 @@ void fc_exch_update_stats(struct fc_lport *lport) + + list_for_each_entry(ema, &lport->ema_list, ema_list) { + mp = ema->mp; +- st->fc_no_free_exch += atomic_read(&mp->stats.no_free_exch); ++ st->fc_no_free_exch += atomic_read_unchecked(&mp->stats.no_free_exch); + st->fc_no_free_exch_xid += +- atomic_read(&mp->stats.no_free_exch_xid); +- st->fc_xid_not_found += atomic_read(&mp->stats.xid_not_found); +- st->fc_xid_busy += atomic_read(&mp->stats.xid_busy); +- st->fc_seq_not_found += atomic_read(&mp->stats.seq_not_found); +- st->fc_non_bls_resp += atomic_read(&mp->stats.non_bls_resp); ++ atomic_read_unchecked(&mp->stats.no_free_exch_xid); ++ st->fc_xid_not_found += atomic_read_unchecked(&mp->stats.xid_not_found); ++ st->fc_xid_busy += atomic_read_unchecked(&mp->stats.xid_busy); ++ st->fc_seq_not_found += atomic_read_unchecked(&mp->stats.seq_not_found); ++ st->fc_non_bls_resp += atomic_read_unchecked(&mp->stats.non_bls_resp); + } + } + EXPORT_SYMBOL(fc_exch_update_stats); +diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c +index 766098a..1c6c971 100644 +--- a/drivers/scsi/libsas/sas_ata.c ++++ b/drivers/scsi/libsas/sas_ata.c +@@ -554,7 +554,7 @@ static struct ata_port_operations sas_sata_ops = { + .postreset = ata_std_postreset, + .error_handler = ata_std_error_handler, + .post_internal_cmd = sas_ata_post_internal, +- .qc_defer = ata_std_qc_defer, ++ .qc_defer = ata_std_qc_defer, + .qc_prep = ata_noop_qc_prep, + .qc_issue = sas_ata_qc_issue, + .qc_fill_rtf = sas_ata_qc_fill_rtf, +diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h +index 434e903..5a4a79b 100644 +--- a/drivers/scsi/lpfc/lpfc.h ++++ b/drivers/scsi/lpfc/lpfc.h +@@ -430,7 +430,7 @@ struct lpfc_vport { + struct dentry *debug_nodelist; + struct dentry *vport_debugfs_root; + struct lpfc_debugfs_trc *disc_trc; +- atomic_t disc_trc_cnt; ++ atomic_unchecked_t disc_trc_cnt; + #endif + uint8_t stat_data_enabled; + uint8_t stat_data_blocked; +@@ -880,8 +880,8 @@ struct lpfc_hba { + struct timer_list fabric_block_timer; + unsigned long bit_flags; + #define FABRIC_COMANDS_BLOCKED 0 +- atomic_t num_rsrc_err; +- atomic_t num_cmd_success; ++ atomic_unchecked_t num_rsrc_err; ++ atomic_unchecked_t num_cmd_success; + unsigned long last_rsrc_error_time; + unsigned long last_ramp_down_time; + #ifdef CONFIG_SCSI_LPFC_DEBUG_FS +@@ -916,7 +916,7 @@ struct lpfc_hba { + + struct dentry *debug_slow_ring_trc; + struct lpfc_debugfs_trc *slow_ring_trc; +- atomic_t slow_ring_trc_cnt; ++ atomic_unchecked_t slow_ring_trc_cnt; + /* iDiag debugfs sub-directory */ + struct dentry *idiag_root; + struct dentry *idiag_pci_cfg; +diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c +index 786a2af..562c6a2 100644 +--- a/drivers/scsi/lpfc/lpfc_debugfs.c ++++ b/drivers/scsi/lpfc/lpfc_debugfs.c +@@ -106,7 +106,7 @@ MODULE_PARM_DESC(lpfc_debugfs_mask_disc_trc, + + #include <linux/debugfs.h> + +-static atomic_t lpfc_debugfs_seq_trc_cnt = ATOMIC_INIT(0); ++static atomic_unchecked_t lpfc_debugfs_seq_trc_cnt = ATOMIC_INIT(0); + static unsigned long lpfc_debugfs_start_time = 0L; + + /* iDiag */ +@@ -147,7 +147,7 @@ lpfc_debugfs_disc_trc_data(struct lpfc_vport *vport, char *buf, int size) + lpfc_debugfs_enable = 0; + + len = 0; +- index = (atomic_read(&vport->disc_trc_cnt) + 1) & ++ index = (atomic_read_unchecked(&vport->disc_trc_cnt) + 1) & + (lpfc_debugfs_max_disc_trc - 1); + for (i = index; i < lpfc_debugfs_max_disc_trc; i++) { + dtp = vport->disc_trc + i; +@@ -213,7 +213,7 @@ lpfc_debugfs_slow_ring_trc_data(struct lpfc_hba *phba, char *buf, int size) + lpfc_debugfs_enable = 0; + + len = 0; +- index = (atomic_read(&phba->slow_ring_trc_cnt) + 1) & ++ index = (atomic_read_unchecked(&phba->slow_ring_trc_cnt) + 1) & + (lpfc_debugfs_max_slow_ring_trc - 1); + for (i = index; i < lpfc_debugfs_max_slow_ring_trc; i++) { + dtp = phba->slow_ring_trc + i; +@@ -646,14 +646,14 @@ lpfc_debugfs_disc_trc(struct lpfc_vport *vport, int mask, char *fmt, + !vport || !vport->disc_trc) + return; + +- index = atomic_inc_return(&vport->disc_trc_cnt) & ++ index = atomic_inc_return_unchecked(&vport->disc_trc_cnt) & + (lpfc_debugfs_max_disc_trc - 1); + dtp = vport->disc_trc + index; + dtp->fmt = fmt; + dtp->data1 = data1; + dtp->data2 = data2; + dtp->data3 = data3; +- dtp->seq_cnt = atomic_inc_return(&lpfc_debugfs_seq_trc_cnt); ++ dtp->seq_cnt = atomic_inc_return_unchecked(&lpfc_debugfs_seq_trc_cnt); + dtp->jif = jiffies; + #endif + return; +@@ -684,14 +684,14 @@ lpfc_debugfs_slow_ring_trc(struct lpfc_hba *phba, char *fmt, + !phba || !phba->slow_ring_trc) + return; + +- index = atomic_inc_return(&phba->slow_ring_trc_cnt) & ++ index = atomic_inc_return_unchecked(&phba->slow_ring_trc_cnt) & + (lpfc_debugfs_max_slow_ring_trc - 1); + dtp = phba->slow_ring_trc + index; + dtp->fmt = fmt; + dtp->data1 = data1; + dtp->data2 = data2; + dtp->data3 = data3; +- dtp->seq_cnt = atomic_inc_return(&lpfc_debugfs_seq_trc_cnt); ++ dtp->seq_cnt = atomic_inc_return_unchecked(&lpfc_debugfs_seq_trc_cnt); + dtp->jif = jiffies; + #endif + return; +@@ -4268,7 +4268,7 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport) + "slow_ring buffer\n"); + goto debug_failed; + } +- atomic_set(&phba->slow_ring_trc_cnt, 0); ++ atomic_set_unchecked(&phba->slow_ring_trc_cnt, 0); + memset(phba->slow_ring_trc, 0, + (sizeof(struct lpfc_debugfs_trc) * + lpfc_debugfs_max_slow_ring_trc)); +@@ -4314,7 +4314,7 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport) + "buffer\n"); + goto debug_failed; + } +- atomic_set(&vport->disc_trc_cnt, 0); ++ atomic_set_unchecked(&vport->disc_trc_cnt, 0); + + snprintf(name, sizeof(name), "discovery_trace"); + vport->debug_disc_trc = +diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c +index 0b2c53a..aec2b45 100644 +--- a/drivers/scsi/lpfc/lpfc_init.c ++++ b/drivers/scsi/lpfc/lpfc_init.c +@@ -11290,8 +11290,10 @@ lpfc_init(void) + "misc_register returned with status %d", error); + + if (lpfc_enable_npiv) { +- lpfc_transport_functions.vport_create = lpfc_vport_create; +- lpfc_transport_functions.vport_delete = lpfc_vport_delete; ++ pax_open_kernel(); ++ *(void **)&lpfc_transport_functions.vport_create = lpfc_vport_create; ++ *(void **)&lpfc_transport_functions.vport_delete = lpfc_vport_delete; ++ pax_close_kernel(); + } + lpfc_transport_template = + fc_attach_transport(&lpfc_transport_functions); +diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c +index b99399f..d29dc75 100644 +--- a/drivers/scsi/lpfc/lpfc_scsi.c ++++ b/drivers/scsi/lpfc/lpfc_scsi.c +@@ -383,7 +383,7 @@ lpfc_rampdown_queue_depth(struct lpfc_hba *phba) + unsigned long expires; + + spin_lock_irqsave(&phba->hbalock, flags); +- atomic_inc(&phba->num_rsrc_err); ++ atomic_inc_unchecked(&phba->num_rsrc_err); + phba->last_rsrc_error_time = jiffies; + + expires = phba->last_ramp_down_time + QUEUE_RAMP_DOWN_INTERVAL; +@@ -425,8 +425,8 @@ lpfc_ramp_down_queue_handler(struct lpfc_hba *phba) + unsigned long num_rsrc_err, num_cmd_success; + int i; + +- num_rsrc_err = atomic_read(&phba->num_rsrc_err); +- num_cmd_success = atomic_read(&phba->num_cmd_success); ++ num_rsrc_err = atomic_read_unchecked(&phba->num_rsrc_err); ++ num_cmd_success = atomic_read_unchecked(&phba->num_cmd_success); + + /* + * The error and success command counters are global per +@@ -454,8 +454,8 @@ lpfc_ramp_down_queue_handler(struct lpfc_hba *phba) + } + } + lpfc_destroy_vport_work_array(phba, vports); +- atomic_set(&phba->num_rsrc_err, 0); +- atomic_set(&phba->num_cmd_success, 0); ++ atomic_set_unchecked(&phba->num_rsrc_err, 0); ++ atomic_set_unchecked(&phba->num_cmd_success, 0); + } + + /** +diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c +index c80ed04..e674f01 100644 +--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c ++++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c +@@ -1561,7 +1561,7 @@ _scsih_get_resync(struct device *dev) + { + struct scsi_device *sdev = to_scsi_device(dev); + struct MPT2SAS_ADAPTER *ioc = shost_priv(sdev->host); +- static struct _raid_device *raid_device; ++ struct _raid_device *raid_device; + unsigned long flags; + Mpi2RaidVolPage0_t vol_pg0; + Mpi2ConfigReply_t mpi_reply; +@@ -1613,7 +1613,7 @@ _scsih_get_state(struct device *dev) + { + struct scsi_device *sdev = to_scsi_device(dev); + struct MPT2SAS_ADAPTER *ioc = shost_priv(sdev->host); +- static struct _raid_device *raid_device; ++ struct _raid_device *raid_device; + unsigned long flags; + Mpi2RaidVolPage0_t vol_pg0; + Mpi2ConfigReply_t mpi_reply; +@@ -6663,7 +6663,7 @@ _scsih_sas_ir_operation_status_event(struct MPT2SAS_ADAPTER *ioc, + Mpi2EventDataIrOperationStatus_t *event_data = + (Mpi2EventDataIrOperationStatus_t *) + fw_event->event_data; +- static struct _raid_device *raid_device; ++ struct _raid_device *raid_device; + unsigned long flags; + u16 handle; + +@@ -7134,7 +7134,7 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) + u64 sas_address; + struct _sas_device *sas_device; + struct _sas_node *expander_device; +- static struct _raid_device *raid_device; ++ struct _raid_device *raid_device; + u8 retry_count; + unsigned long flags; + +diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c +index bcb64eb..f08cf71 100644 +--- a/drivers/scsi/pmcraid.c ++++ b/drivers/scsi/pmcraid.c +@@ -200,8 +200,8 @@ static int pmcraid_slave_alloc(struct scsi_device *scsi_dev) + res->scsi_dev = scsi_dev; + scsi_dev->hostdata = res; + res->change_detected = 0; +- atomic_set(&res->read_failures, 0); +- atomic_set(&res->write_failures, 0); ++ atomic_set_unchecked(&res->read_failures, 0); ++ atomic_set_unchecked(&res->write_failures, 0); + rc = 0; + } + spin_unlock_irqrestore(&pinstance->resource_lock, lock_flags); +@@ -2687,9 +2687,9 @@ static int pmcraid_error_handler(struct pmcraid_cmd *cmd) + + /* If this was a SCSI read/write command keep count of errors */ + if (SCSI_CMD_TYPE(scsi_cmd->cmnd[0]) == SCSI_READ_CMD) +- atomic_inc(&res->read_failures); ++ atomic_inc_unchecked(&res->read_failures); + else if (SCSI_CMD_TYPE(scsi_cmd->cmnd[0]) == SCSI_WRITE_CMD) +- atomic_inc(&res->write_failures); ++ atomic_inc_unchecked(&res->write_failures); + + if (!RES_IS_GSCSI(res->cfg_entry) && + masked_ioasc != PMCRAID_IOASC_HW_DEVICE_BUS_STATUS_ERROR) { +@@ -3545,7 +3545,7 @@ static int pmcraid_queuecommand_lck( + * block of scsi_cmd which is re-used (e.g. cancel/abort), which uses + * hrrq_id assigned here in queuecommand + */ +- ioarcb->hrrq_id = atomic_add_return(1, &(pinstance->last_message_id)) % ++ ioarcb->hrrq_id = atomic_add_return_unchecked(1, &(pinstance->last_message_id)) % + pinstance->num_hrrq; + cmd->cmd_done = pmcraid_io_done; + +@@ -3857,7 +3857,7 @@ static long pmcraid_ioctl_passthrough( + * block of scsi_cmd which is re-used (e.g. cancel/abort), which uses + * hrrq_id assigned here in queuecommand + */ +- ioarcb->hrrq_id = atomic_add_return(1, &(pinstance->last_message_id)) % ++ ioarcb->hrrq_id = atomic_add_return_unchecked(1, &(pinstance->last_message_id)) % + pinstance->num_hrrq; + + if (request_size) { +@@ -4495,7 +4495,7 @@ static void pmcraid_worker_function(struct work_struct *workp) + + pinstance = container_of(workp, struct pmcraid_instance, worker_q); + /* add resources only after host is added into system */ +- if (!atomic_read(&pinstance->expose_resources)) ++ if (!atomic_read_unchecked(&pinstance->expose_resources)) + return; + + fw_version = be16_to_cpu(pinstance->inq_data->fw_version); +@@ -5312,8 +5312,8 @@ static int pmcraid_init_instance(struct pci_dev *pdev, struct Scsi_Host *host, + init_waitqueue_head(&pinstance->reset_wait_q); + + atomic_set(&pinstance->outstanding_cmds, 0); +- atomic_set(&pinstance->last_message_id, 0); +- atomic_set(&pinstance->expose_resources, 0); ++ atomic_set_unchecked(&pinstance->last_message_id, 0); ++ atomic_set_unchecked(&pinstance->expose_resources, 0); + + INIT_LIST_HEAD(&pinstance->free_res_q); + INIT_LIST_HEAD(&pinstance->used_res_q); +@@ -6026,7 +6026,7 @@ static int pmcraid_probe(struct pci_dev *pdev, + /* Schedule worker thread to handle CCN and take care of adding and + * removing devices to OS + */ +- atomic_set(&pinstance->expose_resources, 1); ++ atomic_set_unchecked(&pinstance->expose_resources, 1); + schedule_work(&pinstance->worker_q); + return rc; + +diff --git a/drivers/scsi/pmcraid.h b/drivers/scsi/pmcraid.h +index e1d150f..6c6df44 100644 +--- a/drivers/scsi/pmcraid.h ++++ b/drivers/scsi/pmcraid.h +@@ -748,7 +748,7 @@ struct pmcraid_instance { + struct pmcraid_isr_param hrrq_vector[PMCRAID_NUM_MSIX_VECTORS]; + + /* Message id as filled in last fired IOARCB, used to identify HRRQ */ +- atomic_t last_message_id; ++ atomic_unchecked_t last_message_id; + + /* configuration table */ + struct pmcraid_config_table *cfg_table; +@@ -777,7 +777,7 @@ struct pmcraid_instance { + atomic_t outstanding_cmds; + + /* should add/delete resources to mid-layer now ?*/ +- atomic_t expose_resources; ++ atomic_unchecked_t expose_resources; + + + +@@ -813,8 +813,8 @@ struct pmcraid_resource_entry { + struct pmcraid_config_table_entry_ext cfg_entry_ext; + }; + struct scsi_device *scsi_dev; /* Link scsi_device structure */ +- atomic_t read_failures; /* count of failed READ commands */ +- atomic_t write_failures; /* count of failed WRITE commands */ ++ atomic_unchecked_t read_failures; /* count of failed READ commands */ ++ atomic_unchecked_t write_failures; /* count of failed WRITE commands */ + + /* To indicate add/delete/modify during CCN */ + u8 change_detected; +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 82b92c4..3178171 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -2192,7 +2192,7 @@ qla24xx_vport_disable(struct fc_vport *fc_vport, bool disable) + return 0; + } + +-struct fc_function_template qla2xxx_transport_functions = { ++fc_function_template_no_const qla2xxx_transport_functions = { + + .show_host_node_name = 1, + .show_host_port_name = 1, +@@ -2240,7 +2240,7 @@ struct fc_function_template qla2xxx_transport_functions = { + .bsg_timeout = qla24xx_bsg_timeout, + }; + +-struct fc_function_template qla2xxx_transport_vport_functions = { ++fc_function_template_no_const qla2xxx_transport_vport_functions = { + + .show_host_node_name = 1, + .show_host_port_name = 1, +diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h +index b1865a7..a7723d3 100644 +--- a/drivers/scsi/qla2xxx/qla_gbl.h ++++ b/drivers/scsi/qla2xxx/qla_gbl.h +@@ -571,8 +571,8 @@ extern void qla2x00_get_sym_node_name(scsi_qla_host_t *, uint8_t *, size_t); + struct device_attribute; + extern struct device_attribute *qla2x00_host_attrs[]; + struct fc_function_template; +-extern struct fc_function_template qla2xxx_transport_functions; +-extern struct fc_function_template qla2xxx_transport_vport_functions; ++extern fc_function_template_no_const qla2xxx_transport_functions; ++extern fc_function_template_no_const qla2xxx_transport_vport_functions; + extern void qla2x00_alloc_sysfs_attr(scsi_qla_host_t *); + extern void qla2x00_free_sysfs_attr(scsi_qla_host_t *, bool); + extern void qla2x00_init_host_attr(scsi_qla_host_t *); +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index db3dbd9..2492392 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1507,8 +1507,10 @@ qla2x00_config_dma_addressing(struct qla_hw_data *ha) + !pci_set_consistent_dma_mask(ha->pdev, DMA_BIT_MASK(64))) { + /* Ok, a 64bit DMA mask is applicable. */ + ha->flags.enable_64bit_addressing = 1; +- ha->isp_ops->calc_req_entries = qla2x00_calc_iocbs_64; +- ha->isp_ops->build_iocbs = qla2x00_build_scsi_iocbs_64; ++ pax_open_kernel(); ++ *(void **)&ha->isp_ops->calc_req_entries = qla2x00_calc_iocbs_64; ++ *(void **)&ha->isp_ops->build_iocbs = qla2x00_build_scsi_iocbs_64; ++ pax_close_kernel(); + return; + } + } +diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h +index 8f6d0fb..1b21097 100644 +--- a/drivers/scsi/qla4xxx/ql4_def.h ++++ b/drivers/scsi/qla4xxx/ql4_def.h +@@ -305,7 +305,7 @@ struct ddb_entry { + * (4000 only) */ + atomic_t relogin_timer; /* Max Time to wait for + * relogin to complete */ +- atomic_t relogin_retry_count; /* Num of times relogin has been ++ atomic_unchecked_t relogin_retry_count; /* Num of times relogin has been + * retried */ + uint32_t default_time2wait; /* Default Min time between + * relogins (+aens) */ +diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c +index 199fcf7..3c3a918 100644 +--- a/drivers/scsi/qla4xxx/ql4_os.c ++++ b/drivers/scsi/qla4xxx/ql4_os.c +@@ -4496,12 +4496,12 @@ static void qla4xxx_check_relogin_flash_ddb(struct iscsi_cls_session *cls_sess) + */ + if (!iscsi_is_session_online(cls_sess)) { + /* Reset retry relogin timer */ +- atomic_inc(&ddb_entry->relogin_retry_count); ++ atomic_inc_unchecked(&ddb_entry->relogin_retry_count); + DEBUG2(ql4_printk(KERN_INFO, ha, + "%s: index[%d] relogin timed out-retrying" + " relogin (%d), retry (%d)\n", __func__, + ddb_entry->fw_ddb_index, +- atomic_read(&ddb_entry->relogin_retry_count), ++ atomic_read_unchecked(&ddb_entry->relogin_retry_count), + ddb_entry->default_time2wait + 4)); + set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); + atomic_set(&ddb_entry->retry_relogin_timer, +@@ -6609,7 +6609,7 @@ static void qla4xxx_setup_flash_ddb_entry(struct scsi_qla_host *ha, + + atomic_set(&ddb_entry->retry_relogin_timer, INVALID_ENTRY); + atomic_set(&ddb_entry->relogin_timer, 0); +- atomic_set(&ddb_entry->relogin_retry_count, 0); ++ atomic_set_unchecked(&ddb_entry->relogin_retry_count, 0); + def_timeout = le16_to_cpu(ddb_entry->fw_ddb_entry.def_timeout); + ddb_entry->default_relogin_timeout = + (def_timeout > LOGIN_TOV) && (def_timeout < LOGIN_TOV * 10) ? +diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c +index 79c77b4..ef6ec0b 100644 +--- a/drivers/scsi/scsi.c ++++ b/drivers/scsi/scsi.c +@@ -645,7 +645,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd) + struct Scsi_Host *host = cmd->device->host; + int rtn = 0; + +- atomic_inc(&cmd->device->iorequest_cnt); ++ atomic_inc_unchecked(&cmd->device->iorequest_cnt); + + /* check if the device is still usable */ + if (unlikely(cmd->device->sdev_state == SDEV_DEL)) { +diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c +index b1ab509..889552e 100644 +--- a/drivers/scsi/scsi_lib.c ++++ b/drivers/scsi/scsi_lib.c +@@ -1585,7 +1585,7 @@ static void scsi_kill_request(struct request *req, struct request_queue *q) + shost = sdev->host; + scsi_init_cmd_errh(cmd); + cmd->result = DID_NO_CONNECT << 16; +- atomic_inc(&cmd->device->iorequest_cnt); ++ atomic_inc_unchecked(&cmd->device->iorequest_cnt); + + /* + * SCSI request completion path will do scsi_device_unbusy(), +@@ -1608,9 +1608,9 @@ static void scsi_softirq_done(struct request *rq) + + INIT_LIST_HEAD(&cmd->eh_entry); + +- atomic_inc(&cmd->device->iodone_cnt); ++ atomic_inc_unchecked(&cmd->device->iodone_cnt); + if (cmd->result) +- atomic_inc(&cmd->device->ioerr_cnt); ++ atomic_inc_unchecked(&cmd->device->ioerr_cnt); + + disposition = scsi_decide_disposition(cmd); + if (disposition != SUCCESS && +diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c +index f4cb7b3..dfa79c4 100644 +--- a/drivers/scsi/scsi_sysfs.c ++++ b/drivers/scsi/scsi_sysfs.c +@@ -805,7 +805,7 @@ show_iostat_##field(struct device *dev, struct device_attribute *attr, \ + char *buf) \ + { \ + struct scsi_device *sdev = to_scsi_device(dev); \ +- unsigned long long count = atomic_read(&sdev->field); \ ++ unsigned long long count = atomic_read_unchecked(&sdev->field); \ + return snprintf(buf, 20, "0x%llx\n", count); \ + } \ + static DEVICE_ATTR(field, S_IRUGO, show_iostat_##field, NULL) +diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c +index 5d6f348..18778a6b 100644 +--- a/drivers/scsi/scsi_transport_fc.c ++++ b/drivers/scsi/scsi_transport_fc.c +@@ -501,7 +501,7 @@ static DECLARE_TRANSPORT_CLASS(fc_vport_class, + * Netlink Infrastructure + */ + +-static atomic_t fc_event_seq; ++static atomic_unchecked_t fc_event_seq; + + /** + * fc_get_event_number - Obtain the next sequential FC event number +@@ -514,7 +514,7 @@ static atomic_t fc_event_seq; + u32 + fc_get_event_number(void) + { +- return atomic_add_return(1, &fc_event_seq); ++ return atomic_add_return_unchecked(1, &fc_event_seq); + } + EXPORT_SYMBOL(fc_get_event_number); + +@@ -658,7 +658,7 @@ static __init int fc_transport_init(void) + { + int error; + +- atomic_set(&fc_event_seq, 0); ++ atomic_set_unchecked(&fc_event_seq, 0); + + error = transport_class_register(&fc_host_class); + if (error) +@@ -848,7 +848,7 @@ static int fc_str_to_dev_loss(const char *buf, unsigned long *val) + char *cp; + + *val = simple_strtoul(buf, &cp, 0); +- if ((*cp && (*cp != '\n')) || (*val < 0)) ++ if (*cp && (*cp != '\n')) + return -EINVAL; + /* + * Check for overflow; dev_loss_tmo is u32 +diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c +index 67d43e3..8cee73c 100644 +--- a/drivers/scsi/scsi_transport_iscsi.c ++++ b/drivers/scsi/scsi_transport_iscsi.c +@@ -79,7 +79,7 @@ struct iscsi_internal { + struct transport_container session_cont; + }; + +-static atomic_t iscsi_session_nr; /* sysfs session id for next new session */ ++static atomic_unchecked_t iscsi_session_nr; /* sysfs session id for next new session */ + static struct workqueue_struct *iscsi_eh_timer_workq; + + static DEFINE_IDA(iscsi_sess_ida); +@@ -2071,7 +2071,7 @@ int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id) + int err; + + ihost = shost->shost_data; +- session->sid = atomic_add_return(1, &iscsi_session_nr); ++ session->sid = atomic_add_return_unchecked(1, &iscsi_session_nr); + + if (target_id == ISCSI_MAX_TARGET) { + id = ida_simple_get(&iscsi_sess_ida, 0, 0, GFP_KERNEL); +@@ -4515,7 +4515,7 @@ static __init int iscsi_transport_init(void) + printk(KERN_INFO "Loading iSCSI transport class v%s.\n", + ISCSI_TRANSPORT_VERSION); + +- atomic_set(&iscsi_session_nr, 0); ++ atomic_set_unchecked(&iscsi_session_nr, 0); + + err = class_register(&iscsi_transport_class); + if (err) +diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c +index ae45bd9..c32a586 100644 +--- a/drivers/scsi/scsi_transport_srp.c ++++ b/drivers/scsi/scsi_transport_srp.c +@@ -35,7 +35,7 @@ + #include "scsi_priv.h" + + struct srp_host_attrs { +- atomic_t next_port_id; ++ atomic_unchecked_t next_port_id; + }; + #define to_srp_host_attrs(host) ((struct srp_host_attrs *)(host)->shost_data) + +@@ -100,7 +100,7 @@ static int srp_host_setup(struct transport_container *tc, struct device *dev, + struct Scsi_Host *shost = dev_to_shost(dev); + struct srp_host_attrs *srp_host = to_srp_host_attrs(shost); + +- atomic_set(&srp_host->next_port_id, 0); ++ atomic_set_unchecked(&srp_host->next_port_id, 0); + return 0; + } + +@@ -734,7 +734,7 @@ struct srp_rport *srp_rport_add(struct Scsi_Host *shost, + rport_fast_io_fail_timedout); + INIT_DELAYED_WORK(&rport->dev_loss_work, rport_dev_loss_timedout); + +- id = atomic_inc_return(&to_srp_host_attrs(shost)->next_port_id); ++ id = atomic_inc_return_unchecked(&to_srp_host_attrs(shost)->next_port_id); + dev_set_name(&rport->dev, "port-%d:%d", shost->host_no, id); + + transport_setup_device(&rport->dev); +diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c +index dd8c8d6..4cdf6a1 100644 +--- a/drivers/scsi/sd.c ++++ b/drivers/scsi/sd.c +@@ -3024,7 +3024,7 @@ static int sd_probe(struct device *dev) + sdkp->disk = gd; + sdkp->index = index; + atomic_set(&sdkp->openers, 0); +- atomic_set(&sdkp->device->ioerr_cnt, 0); ++ atomic_set_unchecked(&sdkp->device->ioerr_cnt, 0); + + if (!sdp->request_queue->rq_timeout) { + if (sdp->type != TYPE_MOD) +diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c +index 07b2ea1..e35f364 100644 +--- a/drivers/scsi/sg.c ++++ b/drivers/scsi/sg.c +@@ -1138,7 +1138,7 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) + sdp->disk->disk_name, + MKDEV(SCSI_GENERIC_MAJOR, sdp->index), + NULL, +- (char *)arg); ++ (char __user *)arg); + case BLKTRACESTART: + return blk_trace_startstop(sdp->device->request_queue, 1); + case BLKTRACESTOP: +diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c +index 11a5043..e36f04c 100644 +--- a/drivers/soc/tegra/fuse/fuse-tegra.c ++++ b/drivers/soc/tegra/fuse/fuse-tegra.c +@@ -70,7 +70,7 @@ static ssize_t fuse_read(struct file *fd, struct kobject *kobj, + return i; + } + +-static struct bin_attribute fuse_bin_attr = { ++static bin_attribute_no_const fuse_bin_attr = { + .attr = { .name = "fuse", .mode = S_IRUGO, }, + .read = fuse_read, + }; +diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c +index 1c72be1..e6f36af 100644 +--- a/drivers/spi/spi.c ++++ b/drivers/spi/spi.c +@@ -2225,7 +2225,7 @@ int spi_bus_unlock(struct spi_master *master) + EXPORT_SYMBOL_GPL(spi_bus_unlock); + + /* portable code must never pass more than 32 bytes */ +-#define SPI_BUFSIZ max(32, SMP_CACHE_BYTES) ++#define SPI_BUFSIZ max(32UL, SMP_CACHE_BYTES) + + static u8 *buf; + +diff --git a/drivers/staging/android/timed_output.c b/drivers/staging/android/timed_output.c +index b41429f..2de5373 100644 +--- a/drivers/staging/android/timed_output.c ++++ b/drivers/staging/android/timed_output.c +@@ -25,7 +25,7 @@ + #include "timed_output.h" + + static struct class *timed_output_class; +-static atomic_t device_count; ++static atomic_unchecked_t device_count; + + static ssize_t enable_show(struct device *dev, struct device_attribute *attr, + char *buf) +@@ -65,7 +65,7 @@ static int create_timed_output_class(void) + timed_output_class = class_create(THIS_MODULE, "timed_output"); + if (IS_ERR(timed_output_class)) + return PTR_ERR(timed_output_class); +- atomic_set(&device_count, 0); ++ atomic_set_unchecked(&device_count, 0); + timed_output_class->dev_groups = timed_output_groups; + } + +@@ -83,7 +83,7 @@ int timed_output_dev_register(struct timed_output_dev *tdev) + if (ret < 0) + return ret; + +- tdev->index = atomic_inc_return(&device_count); ++ tdev->index = atomic_inc_return_unchecked(&device_count); + tdev->dev = device_create(timed_output_class, NULL, + MKDEV(0, tdev->index), NULL, "%s", tdev->name); + if (IS_ERR(tdev->dev)) +diff --git a/drivers/staging/gdm724x/gdm_tty.c b/drivers/staging/gdm724x/gdm_tty.c +index 001348c..cfaac8a 100644 +--- a/drivers/staging/gdm724x/gdm_tty.c ++++ b/drivers/staging/gdm724x/gdm_tty.c +@@ -44,7 +44,7 @@ + #define gdm_tty_send_control(n, r, v, d, l) (\ + n->tty_dev->send_control(n->tty_dev->priv_dev, r, v, d, l)) + +-#define GDM_TTY_READY(gdm) (gdm && gdm->tty_dev && gdm->port.count) ++#define GDM_TTY_READY(gdm) (gdm && gdm->tty_dev && atomic_read(&gdm->port.count)) + + static struct tty_driver *gdm_driver[TTY_MAX_COUNT]; + static struct gdm *gdm_table[TTY_MAX_COUNT][GDM_TTY_MINOR]; +diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c +index 9cb222e..8766f26 100644 +--- a/drivers/staging/imx-drm/imx-drm-core.c ++++ b/drivers/staging/imx-drm/imx-drm-core.c +@@ -357,7 +357,7 @@ int imx_drm_add_crtc(struct drm_device *drm, struct drm_crtc *crtc, + if (imxdrm->pipes >= MAX_CRTC) + return -EINVAL; + +- if (imxdrm->drm->open_count) ++ if (local_read(&imxdrm->drm->open_count)) + return -EBUSY; + + imx_drm_crtc = kzalloc(sizeof(*imx_drm_crtc), GFP_KERNEL); +diff --git a/drivers/staging/line6/driver.c b/drivers/staging/line6/driver.c +index 503b2d7..c904931 100644 +--- a/drivers/staging/line6/driver.c ++++ b/drivers/staging/line6/driver.c +@@ -463,7 +463,7 @@ int line6_read_data(struct usb_line6 *line6, int address, void *data, + { + struct usb_device *usbdev = line6->usbdev; + int ret; +- unsigned char len; ++ unsigned char *plen; + + /* query the serial number: */ + ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, +@@ -476,27 +476,34 @@ int line6_read_data(struct usb_line6 *line6, int address, void *data, + return ret; + } + ++ plen = kmalloc(1, GFP_KERNEL); ++ if (plen == NULL) ++ return -ENOMEM; ++ + /* Wait for data length. We'll get 0xff until length arrives. */ + do { + ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | + USB_DIR_IN, +- 0x0012, 0x0000, &len, 1, ++ 0x0012, 0x0000, plen, 1, + LINE6_TIMEOUT * HZ); + if (ret < 0) { + dev_err(line6->ifcdev, + "receive length failed (error %d)\n", ret); ++ kfree(plen); + return ret; + } +- } while (len == 0xff); ++ } while (*plen == 0xff); + +- if (len != datalen) { ++ if (*plen != datalen) { + /* should be equal or something went wrong */ + dev_err(line6->ifcdev, + "length mismatch (expected %d, got %d)\n", +- (int)datalen, (int)len); ++ (int)datalen, (int)*plen); ++ kfree(plen); + return -EINVAL; + } ++ kfree(plen); + + /* receive the result: */ + ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67, +@@ -520,7 +527,7 @@ int line6_write_data(struct usb_line6 *line6, int address, void *data, + { + struct usb_device *usbdev = line6->usbdev; + int ret; +- unsigned char status; ++ unsigned char *status; + + ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, +@@ -533,26 +540,34 @@ int line6_write_data(struct usb_line6 *line6, int address, void *data, + return ret; + } + ++ status = kmalloc(1, GFP_KERNEL); ++ if (status == NULL) ++ return -ENOMEM; ++ + do { + ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), + 0x67, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | + USB_DIR_IN, + 0x0012, 0x0000, +- &status, 1, LINE6_TIMEOUT * HZ); ++ status, 1, LINE6_TIMEOUT * HZ); + + if (ret < 0) { + dev_err(line6->ifcdev, + "receiving status failed (error %d)\n", ret); ++ kfree(status); + return ret; + } +- } while (status == 0xff); ++ } while (*status == 0xff); + +- if (status != 0) { ++ if (*status != 0) { + dev_err(line6->ifcdev, "write failed (error %d)\n", ret); ++ kfree(status); + return -EINVAL; + } + ++ kfree(status); ++ + return 0; + } + +diff --git a/drivers/staging/line6/toneport.c b/drivers/staging/line6/toneport.c +index 6943715..0a93632 100644 +--- a/drivers/staging/line6/toneport.c ++++ b/drivers/staging/line6/toneport.c +@@ -11,6 +11,7 @@ + */ + + #include <linux/wait.h> ++#include <linux/slab.h> + #include <sound/control.h> + + #include "audio.h" +@@ -307,14 +308,20 @@ static void toneport_destruct(struct usb_interface *interface) + */ + static void toneport_setup(struct usb_line6_toneport *toneport) + { +- int ticks; ++ int *ticks; + struct usb_line6 *line6 = &toneport->line6; + struct usb_device *usbdev = line6->usbdev; + u16 idProduct = le16_to_cpu(usbdev->descriptor.idProduct); + ++ ticks = kmalloc(sizeof(int), GFP_KERNEL); ++ if (ticks == NULL) ++ return; ++ + /* sync time on device with host: */ +- ticks = (int)get_seconds(); +- line6_write_data(line6, 0x80c6, &ticks, 4); ++ *ticks = (int)get_seconds(); ++ line6_write_data(line6, 0x80c6, ticks, sizeof(int)); ++ ++ kfree(ticks); + + /* enable device: */ + toneport_send_cmd(usbdev, 0x0301, 0x0000); +diff --git a/drivers/staging/lustre/lnet/selftest/brw_test.c b/drivers/staging/lustre/lnet/selftest/brw_test.c +index a94f336..6a1924d 100644 +--- a/drivers/staging/lustre/lnet/selftest/brw_test.c ++++ b/drivers/staging/lustre/lnet/selftest/brw_test.c +@@ -488,13 +488,11 @@ brw_server_handle(struct srpc_server_rpc *rpc) + return 0; + } + +-sfw_test_client_ops_t brw_test_client; +-void brw_init_test_client(void) +-{ +- brw_test_client.tso_init = brw_client_init; +- brw_test_client.tso_fini = brw_client_fini; +- brw_test_client.tso_prep_rpc = brw_client_prep_rpc; +- brw_test_client.tso_done_rpc = brw_client_done_rpc; ++sfw_test_client_ops_t brw_test_client = { ++ .tso_init = brw_client_init, ++ .tso_fini = brw_client_fini, ++ .tso_prep_rpc = brw_client_prep_rpc, ++ .tso_done_rpc = brw_client_done_rpc, + }; + + srpc_service_t brw_test_service; +diff --git a/drivers/staging/lustre/lnet/selftest/framework.c b/drivers/staging/lustre/lnet/selftest/framework.c +index df04ab7..1deb1ac 100644 +--- a/drivers/staging/lustre/lnet/selftest/framework.c ++++ b/drivers/staging/lustre/lnet/selftest/framework.c +@@ -1632,12 +1632,10 @@ static srpc_service_t sfw_services[] = { + + extern sfw_test_client_ops_t ping_test_client; + extern srpc_service_t ping_test_service; +-extern void ping_init_test_client(void); + extern void ping_init_test_service(void); + + extern sfw_test_client_ops_t brw_test_client; + extern srpc_service_t brw_test_service; +-extern void brw_init_test_client(void); + extern void brw_init_test_service(void); + + +@@ -1681,12 +1679,10 @@ sfw_startup (void) + INIT_LIST_HEAD(&sfw_data.fw_zombie_rpcs); + INIT_LIST_HEAD(&sfw_data.fw_zombie_sessions); + +- brw_init_test_client(); + brw_init_test_service(); + rc = sfw_register_test(&brw_test_service, &brw_test_client); + LASSERT (rc == 0); + +- ping_init_test_client(); + ping_init_test_service(); + rc = sfw_register_test(&ping_test_service, &ping_test_client); + LASSERT (rc == 0); +diff --git a/drivers/staging/lustre/lnet/selftest/ping_test.c b/drivers/staging/lustre/lnet/selftest/ping_test.c +index 750cac4..e4d751f 100644 +--- a/drivers/staging/lustre/lnet/selftest/ping_test.c ++++ b/drivers/staging/lustre/lnet/selftest/ping_test.c +@@ -211,14 +211,12 @@ ping_server_handle(struct srpc_server_rpc *rpc) + return 0; + } + +-sfw_test_client_ops_t ping_test_client; +-void ping_init_test_client(void) +-{ +- ping_test_client.tso_init = ping_client_init; +- ping_test_client.tso_fini = ping_client_fini; +- ping_test_client.tso_prep_rpc = ping_client_prep_rpc; +- ping_test_client.tso_done_rpc = ping_client_done_rpc; +-} ++sfw_test_client_ops_t ping_test_client = { ++ .tso_init = ping_client_init, ++ .tso_fini = ping_client_fini, ++ .tso_prep_rpc = ping_client_prep_rpc, ++ .tso_done_rpc = ping_client_done_rpc, ++}; + + srpc_service_t ping_test_service; + void ping_init_test_service(void) +diff --git a/drivers/staging/lustre/lustre/include/lustre_dlm.h b/drivers/staging/lustre/lustre/include/lustre_dlm.h +index 14ac46f..eca2c16 100644 +--- a/drivers/staging/lustre/lustre/include/lustre_dlm.h ++++ b/drivers/staging/lustre/lustre/include/lustre_dlm.h +@@ -1139,7 +1139,7 @@ struct ldlm_callback_suite { + ldlm_completion_callback lcs_completion; + ldlm_blocking_callback lcs_blocking; + ldlm_glimpse_callback lcs_glimpse; +-}; ++} __no_const; + + /* ldlm_lockd.c */ + int ldlm_del_waiting_lock(struct ldlm_lock *lock); +diff --git a/drivers/staging/lustre/lustre/include/obd.h b/drivers/staging/lustre/lustre/include/obd.h +index 2a88b80..62e7e5f 100644 +--- a/drivers/staging/lustre/lustre/include/obd.h ++++ b/drivers/staging/lustre/lustre/include/obd.h +@@ -1362,7 +1362,7 @@ struct md_ops { + * lprocfs_alloc_md_stats() in obdclass/lprocfs_status.c. Also, add a + * wrapper function in include/linux/obd_class.h. + */ +-}; ++} __no_const; + + struct lsm_operations { + void (*lsm_free)(struct lov_stripe_md *); +diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c b/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c +index b798daa..b28ca8f 100644 +--- a/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c ++++ b/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c +@@ -258,7 +258,7 @@ ldlm_process_flock_lock(struct ldlm_lock *req, __u64 *flags, int first_enq, + int added = (mode == LCK_NL); + int overlaps = 0; + int splitted = 0; +- const struct ldlm_callback_suite null_cbs = { NULL }; ++ const struct ldlm_callback_suite null_cbs = { }; + + CDEBUG(D_DLMTRACE, "flags %#llx owner %llu pid %u mode %u start %llu end %llu\n", + *flags, new->l_policy_data.l_flock.owner, +diff --git a/drivers/staging/lustre/lustre/libcfs/linux/linux-proc.c b/drivers/staging/lustre/lustre/libcfs/linux/linux-proc.c +index bbe2c68..c6b4275 100644 +--- a/drivers/staging/lustre/lustre/libcfs/linux/linux-proc.c ++++ b/drivers/staging/lustre/lustre/libcfs/linux/linux-proc.c +@@ -236,7 +236,7 @@ int proc_console_max_delay_cs(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { + int rc, max_delay_cs; +- struct ctl_table dummy = *table; ++ ctl_table_no_const dummy = *table; + long d; + + dummy.data = &max_delay_cs; +@@ -268,7 +268,7 @@ int proc_console_min_delay_cs(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { + int rc, min_delay_cs; +- struct ctl_table dummy = *table; ++ ctl_table_no_const dummy = *table; + long d; + + dummy.data = &min_delay_cs; +@@ -300,7 +300,7 @@ int proc_console_backoff(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { + int rc, backoff; +- struct ctl_table dummy = *table; ++ ctl_table_no_const dummy = *table; + + dummy.data = &backoff; + dummy.proc_handler = &proc_dointvec; +diff --git a/drivers/staging/lustre/lustre/libcfs/module.c b/drivers/staging/lustre/lustre/libcfs/module.c +index 2c4fc74..b04ca79 100644 +--- a/drivers/staging/lustre/lustre/libcfs/module.c ++++ b/drivers/staging/lustre/lustre/libcfs/module.c +@@ -315,11 +315,11 @@ out: + + + struct cfs_psdev_ops libcfs_psdev_ops = { +- libcfs_psdev_open, +- libcfs_psdev_release, +- NULL, +- NULL, +- libcfs_ioctl ++ .p_open = libcfs_psdev_open, ++ .p_close = libcfs_psdev_release, ++ .p_read = NULL, ++ .p_write = NULL, ++ .p_ioctl = libcfs_ioctl + }; + + extern int insert_proc(void); +diff --git a/drivers/staging/lustre/lustre/llite/dir.c b/drivers/staging/lustre/lustre/llite/dir.c +index b0bb709..0117c96 100644 +--- a/drivers/staging/lustre/lustre/llite/dir.c ++++ b/drivers/staging/lustre/lustre/llite/dir.c +@@ -661,7 +661,7 @@ int ll_dir_setdirstripe(struct inode *dir, struct lmv_user_md *lump, + int mode; + int err; + +- mode = (0755 & (S_IRWXUGO|S_ISVTX) & ~current->fs->umask) | S_IFDIR; ++ mode = (0755 & (S_IRWXUGO|S_ISVTX) & ~current_umask()) | S_IFDIR; + op_data = ll_prep_md_op_data(NULL, dir, NULL, filename, + strlen(filename), mode, LUSTRE_OPC_MKDIR, + lump); +diff --git a/drivers/staging/octeon/ethernet-rx.c b/drivers/staging/octeon/ethernet-rx.c +index b2b6c3c..302e4e4 100644 +--- a/drivers/staging/octeon/ethernet-rx.c ++++ b/drivers/staging/octeon/ethernet-rx.c +@@ -416,11 +416,11 @@ static int cvm_oct_napi_poll(struct napi_struct *napi, int budget) + /* Increment RX stats for virtual ports */ + if (work->ipprt >= CVMX_PIP_NUM_INPUT_PORTS) { + #ifdef CONFIG_64BIT +- atomic64_add(1, (atomic64_t *)&priv->stats.rx_packets); +- atomic64_add(skb->len, (atomic64_t *)&priv->stats.rx_bytes); ++ atomic64_add_unchecked(1, (atomic64_unchecked_t *)&priv->stats.rx_packets); ++ atomic64_add_unchecked(skb->len, (atomic64_unchecked_t *)&priv->stats.rx_bytes); + #else +- atomic_add(1, (atomic_t *)&priv->stats.rx_packets); +- atomic_add(skb->len, (atomic_t *)&priv->stats.rx_bytes); ++ atomic_add_unchecked(1, (atomic_unchecked_t *)&priv->stats.rx_packets); ++ atomic_add_unchecked(skb->len, (atomic_unchecked_t *)&priv->stats.rx_bytes); + #endif + } + netif_receive_skb(skb); +@@ -431,9 +431,9 @@ static int cvm_oct_napi_poll(struct napi_struct *napi, int budget) + dev->name); + */ + #ifdef CONFIG_64BIT +- atomic64_add(1, (atomic64_t *)&priv->stats.rx_dropped); ++ atomic64_add_unchecked(1, (atomic64_unchecked_t *)&priv->stats.rx_dropped); + #else +- atomic_add(1, (atomic_t *)&priv->stats.rx_dropped); ++ atomic_add_unchecked(1, (atomic_unchecked_t *)&priv->stats.rx_dropped); + #endif + dev_kfree_skb_irq(skb); + } +diff --git a/drivers/staging/octeon/ethernet.c b/drivers/staging/octeon/ethernet.c +index 8f9e3fb..d283fb9 100644 +--- a/drivers/staging/octeon/ethernet.c ++++ b/drivers/staging/octeon/ethernet.c +@@ -247,11 +247,11 @@ static struct net_device_stats *cvm_oct_common_get_stats(struct net_device *dev) + * since the RX tasklet also increments it. + */ + #ifdef CONFIG_64BIT +- atomic64_add(rx_status.dropped_packets, +- (atomic64_t *)&priv->stats.rx_dropped); ++ atomic64_add_unchecked(rx_status.dropped_packets, ++ (atomic64_unchecked_t *)&priv->stats.rx_dropped); + #else +- atomic_add(rx_status.dropped_packets, +- (atomic_t *)&priv->stats.rx_dropped); ++ atomic_add_unchecked(rx_status.dropped_packets, ++ (atomic_unchecked_t *)&priv->stats.rx_dropped); + #endif + } + +diff --git a/drivers/staging/rtl8188eu/include/hal_intf.h b/drivers/staging/rtl8188eu/include/hal_intf.h +index 9191993..30e9817 100644 +--- a/drivers/staging/rtl8188eu/include/hal_intf.h ++++ b/drivers/staging/rtl8188eu/include/hal_intf.h +@@ -225,7 +225,7 @@ struct hal_ops { + + void (*hal_notch_filter)(struct adapter *adapter, bool enable); + void (*hal_reset_security_engine)(struct adapter *adapter); +-}; ++} __no_const; + + enum rt_eeprom_type { + EEPROM_93C46, +diff --git a/drivers/staging/rtl8712/rtl871x_io.h b/drivers/staging/rtl8712/rtl871x_io.h +index 070cc03..6806e37 100644 +--- a/drivers/staging/rtl8712/rtl871x_io.h ++++ b/drivers/staging/rtl8712/rtl871x_io.h +@@ -108,7 +108,7 @@ struct _io_ops { + u8 *pmem); + u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, + u8 *pmem); +-}; ++} __no_const; + + struct io_req { + struct list_head list; +diff --git a/drivers/staging/unisys/visorchipset/visorchipset.h b/drivers/staging/unisys/visorchipset/visorchipset.h +index 2bf2e2f..84421c9 100644 +--- a/drivers/staging/unisys/visorchipset/visorchipset.h ++++ b/drivers/staging/unisys/visorchipset/visorchipset.h +@@ -228,7 +228,7 @@ typedef struct { + void (*device_resume)(ulong busNo, ulong devNo); + int (*get_channel_info)(uuid_le typeGuid, ulong *minSize, + ulong *maxSize); +-} VISORCHIPSET_BUSDEV_NOTIFIERS; ++} __no_const VISORCHIPSET_BUSDEV_NOTIFIERS; + + /* These functions live inside visorchipset, and will be called to indicate + * responses to specific events (by code outside of visorchipset). +@@ -243,7 +243,7 @@ typedef struct { + void (*device_destroy)(ulong busNo, ulong devNo, int response); + void (*device_pause)(ulong busNo, ulong devNo, int response); + void (*device_resume)(ulong busNo, ulong devNo, int response); +-} VISORCHIPSET_BUSDEV_RESPONDERS; ++} __no_const VISORCHIPSET_BUSDEV_RESPONDERS; + + /** Register functions (in the bus driver) to get called by visorchipset + * whenever a bus or device appears for which this service partition is +diff --git a/drivers/staging/vt6655/hostap.c b/drivers/staging/vt6655/hostap.c +index ae0dade..803d53a 100644 +--- a/drivers/staging/vt6655/hostap.c ++++ b/drivers/staging/vt6655/hostap.c +@@ -65,14 +65,13 @@ + * + */ + ++static net_device_ops_no_const apdev_netdev_ops; ++ + static int hostap_enable_hostapd(struct vnt_private *pDevice, int rtnl_locked) + { + struct vnt_private *apdev_priv; + struct net_device *dev = pDevice->dev; + int ret; +- const struct net_device_ops apdev_netdev_ops = { +- .ndo_start_xmit = pDevice->tx_80211, +- }; + + pr_debug("%s: Enabling hostapd mode\n", dev->name); + +@@ -84,6 +83,8 @@ static int hostap_enable_hostapd(struct vnt_private *pDevice, int rtnl_locked) + *apdev_priv = *pDevice; + eth_hw_addr_inherit(pDevice->apdev, dev); + ++ /* only half broken now */ ++ apdev_netdev_ops.ndo_start_xmit = pDevice->tx_80211; + pDevice->apdev->netdev_ops = &apdev_netdev_ops; + + pDevice->apdev->type = ARPHRD_IEEE80211; +diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c +index e7e9372..161f530 100644 +--- a/drivers/target/sbp/sbp_target.c ++++ b/drivers/target/sbp/sbp_target.c +@@ -62,7 +62,7 @@ static const u32 sbp_unit_directory_template[] = { + + #define SESSION_MAINTENANCE_INTERVAL HZ + +-static atomic_t login_id = ATOMIC_INIT(0); ++static atomic_unchecked_t login_id = ATOMIC_INIT(0); + + static void session_maintenance_work(struct work_struct *); + static int sbp_run_transaction(struct fw_card *, int, int, int, int, +@@ -444,7 +444,7 @@ static void sbp_management_request_login( + login->lun = se_lun; + login->status_fifo_addr = sbp2_pointer_to_addr(&req->orb.status_fifo); + login->exclusive = LOGIN_ORB_EXCLUSIVE(be32_to_cpu(req->orb.misc)); +- login->login_id = atomic_inc_return(&login_id); ++ login->login_id = atomic_inc_return_unchecked(&login_id); + + login->tgt_agt = sbp_target_agent_register(login); + if (IS_ERR(login->tgt_agt)) { +diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c +index 9e0f5d3..0aada02 100644 +--- a/drivers/target/target_core_device.c ++++ b/drivers/target/target_core_device.c +@@ -1532,7 +1532,7 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name) + spin_lock_init(&dev->se_tmr_lock); + spin_lock_init(&dev->qf_cmd_lock); + sema_init(&dev->caw_sem, 1); +- atomic_set(&dev->dev_ordered_id, 0); ++ atomic_set_unchecked(&dev->dev_ordered_id, 0); + INIT_LIST_HEAD(&dev->t10_wwn.t10_vpd_list); + spin_lock_init(&dev->t10_wwn.t10_vpd_lock); + INIT_LIST_HEAD(&dev->t10_pr.registration_list); +diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c +index 2e09984..9803039 100644 +--- a/drivers/target/target_core_transport.c ++++ b/drivers/target/target_core_transport.c +@@ -1168,7 +1168,7 @@ transport_check_alloc_task_attr(struct se_cmd *cmd) + * Used to determine when ORDERED commands should go from + * Dormant to Active status. + */ +- cmd->se_ordered_id = atomic_inc_return(&dev->dev_ordered_id); ++ cmd->se_ordered_id = atomic_inc_return_unchecked(&dev->dev_ordered_id); + pr_debug("Allocated se_ordered_id: %u for Task Attr: 0x%02x on %s\n", + cmd->se_ordered_id, cmd->sam_task_attr, + dev->transport->name); +diff --git a/drivers/thermal/int340x_thermal/int3400_thermal.c b/drivers/thermal/int340x_thermal/int3400_thermal.c +index edc1cce..769e4cb 100644 +--- a/drivers/thermal/int340x_thermal/int3400_thermal.c ++++ b/drivers/thermal/int340x_thermal/int3400_thermal.c +@@ -209,8 +209,10 @@ static int int3400_thermal_probe(struct platform_device *pdev) + platform_set_drvdata(pdev, priv); + + if (priv->uuid_bitmap & 1 << INT3400_THERMAL_PASSIVE_1) { +- int3400_thermal_ops.get_mode = int3400_thermal_get_mode; +- int3400_thermal_ops.set_mode = int3400_thermal_set_mode; ++ pax_open_kernel(); ++ *(void **)&int3400_thermal_ops.get_mode = int3400_thermal_get_mode; ++ *(void **)&int3400_thermal_ops.set_mode = int3400_thermal_set_mode; ++ pax_close_kernel(); + } + priv->thermal = thermal_zone_device_register("INT3400 Thermal", 0, 0, + priv, &int3400_thermal_ops, +diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c +index 62143ba..ae21165 100644 +--- a/drivers/thermal/of-thermal.c ++++ b/drivers/thermal/of-thermal.c +@@ -30,6 +30,7 @@ + #include <linux/err.h> + #include <linux/export.h> + #include <linux/string.h> ++#include <linux/mm.h> + + #include "thermal_core.h" + +@@ -341,8 +342,10 @@ thermal_zone_of_add_sensor(struct device_node *zone, + tz->get_trend = get_trend; + tz->sensor_data = data; + +- tzd->ops->get_temp = of_thermal_get_temp; +- tzd->ops->get_trend = of_thermal_get_trend; ++ pax_open_kernel(); ++ *(void **)&tzd->ops->get_temp = of_thermal_get_temp; ++ *(void **)&tzd->ops->get_trend = of_thermal_get_trend; ++ pax_close_kernel(); + mutex_unlock(&tzd->lock); + + return tzd; +@@ -473,8 +476,10 @@ void thermal_zone_of_sensor_unregister(struct device *dev, + return; + + mutex_lock(&tzd->lock); +- tzd->ops->get_temp = NULL; +- tzd->ops->get_trend = NULL; ++ pax_open_kernel(); ++ *(void **)&tzd->ops->get_temp = NULL; ++ *(void **)&tzd->ops->get_trend = NULL; ++ pax_close_kernel(); + + tz->get_temp = NULL; + tz->get_trend = NULL; +diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c +index 9ea3d9d..53e8792 100644 +--- a/drivers/thermal/x86_pkg_temp_thermal.c ++++ b/drivers/thermal/x86_pkg_temp_thermal.c +@@ -567,7 +567,7 @@ static int pkg_temp_thermal_cpu_callback(struct notifier_block *nfb, + return NOTIFY_OK; + } + +-static struct notifier_block pkg_temp_thermal_notifier __refdata = { ++static struct notifier_block pkg_temp_thermal_notifier __refconst = { + .notifier_call = pkg_temp_thermal_cpu_callback, + }; + +diff --git a/drivers/tty/cyclades.c b/drivers/tty/cyclades.c +index fd66f57..48e6376 100644 +--- a/drivers/tty/cyclades.c ++++ b/drivers/tty/cyclades.c +@@ -1570,10 +1570,10 @@ static int cy_open(struct tty_struct *tty, struct file *filp) + printk(KERN_DEBUG "cyc:cy_open ttyC%d, count = %d\n", info->line, + info->port.count); + #endif +- info->port.count++; ++ atomic_inc(&info->port.count); + #ifdef CY_DEBUG_COUNT + printk(KERN_DEBUG "cyc:cy_open (%d): incrementing count to %d\n", +- current->pid, info->port.count); ++ current->pid, atomic_read(&info->port.count)); + #endif + + /* +@@ -3974,7 +3974,7 @@ static int cyclades_proc_show(struct seq_file *m, void *v) + for (j = 0; j < cy_card[i].nports; j++) { + info = &cy_card[i].ports[j]; + +- if (info->port.count) { ++ if (atomic_read(&info->port.count)) { + /* XXX is the ldisc num worth this? */ + struct tty_struct *tty; + struct tty_ldisc *ld; +diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c +index 4fcec1d..5a036f7 100644 +--- a/drivers/tty/hvc/hvc_console.c ++++ b/drivers/tty/hvc/hvc_console.c +@@ -342,7 +342,7 @@ static int hvc_open(struct tty_struct *tty, struct file * filp) + + spin_lock_irqsave(&hp->port.lock, flags); + /* Check and then increment for fast path open. */ +- if (hp->port.count++ > 0) { ++ if (atomic_inc_return(&hp->port.count) > 1) { + spin_unlock_irqrestore(&hp->port.lock, flags); + hvc_kick(); + return 0; +@@ -397,7 +397,7 @@ static void hvc_close(struct tty_struct *tty, struct file * filp) + + spin_lock_irqsave(&hp->port.lock, flags); + +- if (--hp->port.count == 0) { ++ if (atomic_dec_return(&hp->port.count) == 0) { + spin_unlock_irqrestore(&hp->port.lock, flags); + /* We are done with the tty pointer now. */ + tty_port_tty_set(&hp->port, NULL); +@@ -419,9 +419,9 @@ static void hvc_close(struct tty_struct *tty, struct file * filp) + */ + tty_wait_until_sent_from_close(tty, HVC_CLOSE_WAIT); + } else { +- if (hp->port.count < 0) ++ if (atomic_read(&hp->port.count) < 0) + printk(KERN_ERR "hvc_close %X: oops, count is %d\n", +- hp->vtermno, hp->port.count); ++ hp->vtermno, atomic_read(&hp->port.count)); + spin_unlock_irqrestore(&hp->port.lock, flags); + } + } +@@ -451,12 +451,12 @@ static void hvc_hangup(struct tty_struct *tty) + * open->hangup case this can be called after the final close so prevent + * that from happening for now. + */ +- if (hp->port.count <= 0) { ++ if (atomic_read(&hp->port.count) <= 0) { + spin_unlock_irqrestore(&hp->port.lock, flags); + return; + } + +- hp->port.count = 0; ++ atomic_set(&hp->port.count, 0); + spin_unlock_irqrestore(&hp->port.lock, flags); + tty_port_tty_set(&hp->port, NULL); + +@@ -504,7 +504,7 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count + return -EPIPE; + + /* FIXME what's this (unprotected) check for? */ +- if (hp->port.count <= 0) ++ if (atomic_read(&hp->port.count) <= 0) + return -EIO; + + spin_lock_irqsave(&hp->lock, flags); +diff --git a/drivers/tty/hvc/hvcs.c b/drivers/tty/hvc/hvcs.c +index 81e939e..95ead10 100644 +--- a/drivers/tty/hvc/hvcs.c ++++ b/drivers/tty/hvc/hvcs.c +@@ -83,6 +83,7 @@ + #include <asm/hvcserver.h> + #include <asm/uaccess.h> + #include <asm/vio.h> ++#include <asm/local.h> + + /* + * 1.3.0 -> 1.3.1 In hvcs_open memset(..,0x00,..) instead of memset(..,0x3F,00). +@@ -416,7 +417,7 @@ static ssize_t hvcs_vterm_state_store(struct device *dev, struct device_attribut + + spin_lock_irqsave(&hvcsd->lock, flags); + +- if (hvcsd->port.count > 0) { ++ if (atomic_read(&hvcsd->port.count) > 0) { + spin_unlock_irqrestore(&hvcsd->lock, flags); + printk(KERN_INFO "HVCS: vterm state unchanged. " + "The hvcs device node is still in use.\n"); +@@ -1127,7 +1128,7 @@ static int hvcs_install(struct tty_driver *driver, struct tty_struct *tty) + } + } + +- hvcsd->port.count = 0; ++ atomic_set(&hvcsd->port.count, 0); + hvcsd->port.tty = tty; + tty->driver_data = hvcsd; + +@@ -1180,7 +1181,7 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp) + unsigned long flags; + + spin_lock_irqsave(&hvcsd->lock, flags); +- hvcsd->port.count++; ++ atomic_inc(&hvcsd->port.count); + hvcsd->todo_mask |= HVCS_SCHED_READ; + spin_unlock_irqrestore(&hvcsd->lock, flags); + +@@ -1216,7 +1217,7 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp) + hvcsd = tty->driver_data; + + spin_lock_irqsave(&hvcsd->lock, flags); +- if (--hvcsd->port.count == 0) { ++ if (atomic_dec_and_test(&hvcsd->port.count)) { + + vio_disable_interrupts(hvcsd->vdev); + +@@ -1241,10 +1242,10 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp) + + free_irq(irq, hvcsd); + return; +- } else if (hvcsd->port.count < 0) { ++ } else if (atomic_read(&hvcsd->port.count) < 0) { + printk(KERN_ERR "HVCS: vty-server@%X open_count: %d" + " is missmanaged.\n", +- hvcsd->vdev->unit_address, hvcsd->port.count); ++ hvcsd->vdev->unit_address, atomic_read(&hvcsd->port.count)); + } + + spin_unlock_irqrestore(&hvcsd->lock, flags); +@@ -1266,7 +1267,7 @@ static void hvcs_hangup(struct tty_struct * tty) + + spin_lock_irqsave(&hvcsd->lock, flags); + /* Preserve this so that we know how many kref refs to put */ +- temp_open_count = hvcsd->port.count; ++ temp_open_count = atomic_read(&hvcsd->port.count); + + /* + * Don't kref put inside the spinlock because the destruction +@@ -1281,7 +1282,7 @@ static void hvcs_hangup(struct tty_struct * tty) + tty->driver_data = NULL; + hvcsd->port.tty = NULL; + +- hvcsd->port.count = 0; ++ atomic_set(&hvcsd->port.count, 0); + + /* This will drop any buffered data on the floor which is OK in a hangup + * scenario. */ +@@ -1352,7 +1353,7 @@ static int hvcs_write(struct tty_struct *tty, + * the middle of a write operation? This is a crummy place to do this + * but we want to keep it all in the spinlock. + */ +- if (hvcsd->port.count <= 0) { ++ if (atomic_read(&hvcsd->port.count) <= 0) { + spin_unlock_irqrestore(&hvcsd->lock, flags); + return -ENODEV; + } +@@ -1426,7 +1427,7 @@ static int hvcs_write_room(struct tty_struct *tty) + { + struct hvcs_struct *hvcsd = tty->driver_data; + +- if (!hvcsd || hvcsd->port.count <= 0) ++ if (!hvcsd || atomic_read(&hvcsd->port.count) <= 0) + return 0; + + return HVCS_BUFF_LEN - hvcsd->chars_in_buffer; +diff --git a/drivers/tty/hvc/hvsi.c b/drivers/tty/hvc/hvsi.c +index 4190199..06d5bfa 100644 +--- a/drivers/tty/hvc/hvsi.c ++++ b/drivers/tty/hvc/hvsi.c +@@ -85,7 +85,7 @@ struct hvsi_struct { + int n_outbuf; + uint32_t vtermno; + uint32_t virq; +- atomic_t seqno; /* HVSI packet sequence number */ ++ atomic_unchecked_t seqno; /* HVSI packet sequence number */ + uint16_t mctrl; + uint8_t state; /* HVSI protocol state */ + uint8_t flags; +@@ -295,7 +295,7 @@ static int hvsi_version_respond(struct hvsi_struct *hp, uint16_t query_seqno) + + packet.hdr.type = VS_QUERY_RESPONSE_PACKET_HEADER; + packet.hdr.len = sizeof(struct hvsi_query_response); +- packet.hdr.seqno = atomic_inc_return(&hp->seqno); ++ packet.hdr.seqno = atomic_inc_return_unchecked(&hp->seqno); + packet.verb = VSV_SEND_VERSION_NUMBER; + packet.u.version = HVSI_VERSION; + packet.query_seqno = query_seqno+1; +@@ -555,7 +555,7 @@ static int hvsi_query(struct hvsi_struct *hp, uint16_t verb) + + packet.hdr.type = VS_QUERY_PACKET_HEADER; + packet.hdr.len = sizeof(struct hvsi_query); +- packet.hdr.seqno = atomic_inc_return(&hp->seqno); ++ packet.hdr.seqno = atomic_inc_return_unchecked(&hp->seqno); + packet.verb = verb; + + pr_debug("%s: sending %i bytes\n", __func__, packet.hdr.len); +@@ -597,7 +597,7 @@ static int hvsi_set_mctrl(struct hvsi_struct *hp, uint16_t mctrl) + int wrote; + + packet.hdr.type = VS_CONTROL_PACKET_HEADER, +- packet.hdr.seqno = atomic_inc_return(&hp->seqno); ++ packet.hdr.seqno = atomic_inc_return_unchecked(&hp->seqno); + packet.hdr.len = sizeof(struct hvsi_control); + packet.verb = VSV_SET_MODEM_CTL; + packet.mask = HVSI_TSDTR; +@@ -680,7 +680,7 @@ static int hvsi_put_chars(struct hvsi_struct *hp, const char *buf, int count) + BUG_ON(count > HVSI_MAX_OUTGOING_DATA); + + packet.hdr.type = VS_DATA_PACKET_HEADER; +- packet.hdr.seqno = atomic_inc_return(&hp->seqno); ++ packet.hdr.seqno = atomic_inc_return_unchecked(&hp->seqno); + packet.hdr.len = count + sizeof(struct hvsi_header); + memcpy(&packet.data, buf, count); + +@@ -697,7 +697,7 @@ static void hvsi_close_protocol(struct hvsi_struct *hp) + struct hvsi_control packet __ALIGNED__; + + packet.hdr.type = VS_CONTROL_PACKET_HEADER; +- packet.hdr.seqno = atomic_inc_return(&hp->seqno); ++ packet.hdr.seqno = atomic_inc_return_unchecked(&hp->seqno); + packet.hdr.len = 6; + packet.verb = VSV_CLOSE_PROTOCOL; + +@@ -725,7 +725,7 @@ static int hvsi_open(struct tty_struct *tty, struct file *filp) + + tty_port_tty_set(&hp->port, tty); + spin_lock_irqsave(&hp->lock, flags); +- hp->port.count++; ++ atomic_inc(&hp->port.count); + atomic_set(&hp->seqno, 0); + h_vio_signal(hp->vtermno, VIO_IRQ_ENABLE); + spin_unlock_irqrestore(&hp->lock, flags); +@@ -782,7 +782,7 @@ static void hvsi_close(struct tty_struct *tty, struct file *filp) + + spin_lock_irqsave(&hp->lock, flags); + +- if (--hp->port.count == 0) { ++ if (atomic_dec_return(&hp->port.count) == 0) { + tty_port_tty_set(&hp->port, NULL); + hp->inbuf_end = hp->inbuf; /* discard remaining partial packets */ + +@@ -815,9 +815,9 @@ static void hvsi_close(struct tty_struct *tty, struct file *filp) + + spin_lock_irqsave(&hp->lock, flags); + } +- } else if (hp->port.count < 0) ++ } else if (atomic_read(&hp->port.count) < 0) + printk(KERN_ERR "hvsi_close %lu: oops, count is %d\n", +- hp - hvsi_ports, hp->port.count); ++ hp - hvsi_ports, atomic_read(&hp->port.count)); + + spin_unlock_irqrestore(&hp->lock, flags); + } +@@ -832,7 +832,7 @@ static void hvsi_hangup(struct tty_struct *tty) + tty_port_tty_set(&hp->port, NULL); + + spin_lock_irqsave(&hp->lock, flags); +- hp->port.count = 0; ++ atomic_set(&hp->port.count, 0); + hp->n_outbuf = 0; + spin_unlock_irqrestore(&hp->lock, flags); + } +diff --git a/drivers/tty/hvc/hvsi_lib.c b/drivers/tty/hvc/hvsi_lib.c +index 7ae6c29..05c6dba 100644 +--- a/drivers/tty/hvc/hvsi_lib.c ++++ b/drivers/tty/hvc/hvsi_lib.c +@@ -8,7 +8,7 @@ + + static int hvsi_send_packet(struct hvsi_priv *pv, struct hvsi_header *packet) + { +- packet->seqno = cpu_to_be16(atomic_inc_return(&pv->seqno)); ++ packet->seqno = cpu_to_be16(atomic_inc_return_unchecked(&pv->seqno)); + + /* Assumes that always succeeds, works in practice */ + return pv->put_chars(pv->termno, (char *)packet, packet->len); +@@ -20,7 +20,7 @@ static void hvsi_start_handshake(struct hvsi_priv *pv) + + /* Reset state */ + pv->established = 0; +- atomic_set(&pv->seqno, 0); ++ atomic_set_unchecked(&pv->seqno, 0); + + pr_devel("HVSI@%x: Handshaking started\n", pv->termno); + +diff --git a/drivers/tty/ipwireless/tty.c b/drivers/tty/ipwireless/tty.c +index 345cebb..d5a1e9e 100644 +--- a/drivers/tty/ipwireless/tty.c ++++ b/drivers/tty/ipwireless/tty.c +@@ -28,6 +28,7 @@ + #include <linux/tty_driver.h> + #include <linux/tty_flip.h> + #include <linux/uaccess.h> ++#include <asm/local.h> + + #include "tty.h" + #include "network.h" +@@ -93,10 +94,10 @@ static int ipw_open(struct tty_struct *linux_tty, struct file *filp) + return -ENODEV; + + mutex_lock(&tty->ipw_tty_mutex); +- if (tty->port.count == 0) ++ if (atomic_read(&tty->port.count) == 0) + tty->tx_bytes_queued = 0; + +- tty->port.count++; ++ atomic_inc(&tty->port.count); + + tty->port.tty = linux_tty; + linux_tty->driver_data = tty; +@@ -112,9 +113,7 @@ static int ipw_open(struct tty_struct *linux_tty, struct file *filp) + + static void do_ipw_close(struct ipw_tty *tty) + { +- tty->port.count--; +- +- if (tty->port.count == 0) { ++ if (atomic_dec_return(&tty->port.count) == 0) { + struct tty_struct *linux_tty = tty->port.tty; + + if (linux_tty != NULL) { +@@ -135,7 +134,7 @@ static void ipw_hangup(struct tty_struct *linux_tty) + return; + + mutex_lock(&tty->ipw_tty_mutex); +- if (tty->port.count == 0) { ++ if (atomic_read(&tty->port.count) == 0) { + mutex_unlock(&tty->ipw_tty_mutex); + return; + } +@@ -158,7 +157,7 @@ void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data, + + mutex_lock(&tty->ipw_tty_mutex); + +- if (!tty->port.count) { ++ if (!atomic_read(&tty->port.count)) { + mutex_unlock(&tty->ipw_tty_mutex); + return; + } +@@ -197,7 +196,7 @@ static int ipw_write(struct tty_struct *linux_tty, + return -ENODEV; + + mutex_lock(&tty->ipw_tty_mutex); +- if (!tty->port.count) { ++ if (!atomic_read(&tty->port.count)) { + mutex_unlock(&tty->ipw_tty_mutex); + return -EINVAL; + } +@@ -237,7 +236,7 @@ static int ipw_write_room(struct tty_struct *linux_tty) + if (!tty) + return -ENODEV; + +- if (!tty->port.count) ++ if (!atomic_read(&tty->port.count)) + return -EINVAL; + + room = IPWIRELESS_TX_QUEUE_SIZE - tty->tx_bytes_queued; +@@ -279,7 +278,7 @@ static int ipw_chars_in_buffer(struct tty_struct *linux_tty) + if (!tty) + return 0; + +- if (!tty->port.count) ++ if (!atomic_read(&tty->port.count)) + return 0; + + return tty->tx_bytes_queued; +@@ -360,7 +359,7 @@ static int ipw_tiocmget(struct tty_struct *linux_tty) + if (!tty) + return -ENODEV; + +- if (!tty->port.count) ++ if (!atomic_read(&tty->port.count)) + return -EINVAL; + + return get_control_lines(tty); +@@ -376,7 +375,7 @@ ipw_tiocmset(struct tty_struct *linux_tty, + if (!tty) + return -ENODEV; + +- if (!tty->port.count) ++ if (!atomic_read(&tty->port.count)) + return -EINVAL; + + return set_control_lines(tty, set, clear); +@@ -390,7 +389,7 @@ static int ipw_ioctl(struct tty_struct *linux_tty, + if (!tty) + return -ENODEV; + +- if (!tty->port.count) ++ if (!atomic_read(&tty->port.count)) + return -EINVAL; + + /* FIXME: Exactly how is the tty object locked here .. */ +@@ -546,7 +545,7 @@ void ipwireless_tty_free(struct ipw_tty *tty) + * are gone */ + mutex_lock(&ttyj->ipw_tty_mutex); + } +- while (ttyj->port.count) ++ while (atomic_read(&ttyj->port.count)) + do_ipw_close(ttyj); + ipwireless_disassociate_network_ttys(network, + ttyj->channel_idx); +diff --git a/drivers/tty/moxa.c b/drivers/tty/moxa.c +index 14c54e0..1efd4f2 100644 +--- a/drivers/tty/moxa.c ++++ b/drivers/tty/moxa.c +@@ -1189,7 +1189,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp) + } + + ch = &brd->ports[port % MAX_PORTS_PER_BOARD]; +- ch->port.count++; ++ atomic_inc(&ch->port.count); + tty->driver_data = ch; + tty_port_tty_set(&ch->port, tty); + mutex_lock(&ch->port.mutex); +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index c434376..114ce13 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -1644,7 +1644,7 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr) + spin_lock_init(&dlci->lock); + mutex_init(&dlci->mutex); + dlci->fifo = &dlci->_fifo; +- if (kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL) < 0) { ++ if (kfifo_alloc(&dlci->_fifo, 4096, GFP_KERNEL)) { + kfree(dlci); + return NULL; + } +@@ -2958,7 +2958,7 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp) + struct gsm_dlci *dlci = tty->driver_data; + struct tty_port *port = &dlci->port; + +- port->count++; ++ atomic_inc(&port->count); + tty_port_tty_set(port, tty); + + dlci->modem_rx = 0; +diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c +index 7282465..92b64ea 100644 +--- a/drivers/tty/n_tty.c ++++ b/drivers/tty/n_tty.c +@@ -115,7 +115,7 @@ struct n_tty_data { + int minimum_to_wake; + + /* consumer-published */ +- size_t read_tail; ++ size_t read_tail __intentional_overflow(-1); + size_t line_start; + + /* protected by output lock */ +@@ -2575,6 +2575,7 @@ void n_tty_inherit_ops(struct tty_ldisc_ops *ops) + { + *ops = tty_ldisc_N_TTY; + ops->owner = NULL; +- ops->refcount = ops->flags = 0; ++ atomic_set(&ops->refcount, 0); ++ ops->flags = 0; + } + EXPORT_SYMBOL_GPL(n_tty_inherit_ops); +diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c +index 082304d..d8360ec 100644 +--- a/drivers/tty/pty.c ++++ b/drivers/tty/pty.c +@@ -833,8 +833,10 @@ static void __init unix98_pty_init(void) + panic("Couldn't register Unix98 pts driver"); + + /* Now create the /dev/ptmx special device */ ++ pax_open_kernel(); + tty_default_fops(&ptmx_fops); +- ptmx_fops.open = ptmx_open; ++ *(void **)&ptmx_fops.open = ptmx_open; ++ pax_close_kernel(); + + cdev_init(&ptmx_cdev, &ptmx_fops); + if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) || +diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c +index 383c4c7..d408e21 100644 +--- a/drivers/tty/rocket.c ++++ b/drivers/tty/rocket.c +@@ -914,7 +914,7 @@ static int rp_open(struct tty_struct *tty, struct file *filp) + tty->driver_data = info; + tty_port_tty_set(port, tty); + +- if (port->count++ == 0) { ++ if (atomic_inc_return(&port->count) == 1) { + atomic_inc(&rp_num_ports_open); + + #ifdef ROCKET_DEBUG_OPEN +@@ -923,7 +923,7 @@ static int rp_open(struct tty_struct *tty, struct file *filp) + #endif + } + #ifdef ROCKET_DEBUG_OPEN +- printk(KERN_INFO "rp_open ttyR%d, count=%d\n", info->line, info->port.count); ++ printk(KERN_INFO "rp_open ttyR%d, count=%d\n", info->line, atomic-read(&info->port.count)); + #endif + + /* +@@ -1515,7 +1515,7 @@ static void rp_hangup(struct tty_struct *tty) + spin_unlock_irqrestore(&info->port.lock, flags); + return; + } +- if (info->port.count) ++ if (atomic_read(&info->port.count)) + atomic_dec(&rp_num_ports_open); + clear_bit((info->aiop * 8) + info->chan, (void *) &xmit_flags[info->board]); + spin_unlock_irqrestore(&info->port.lock, flags); +diff --git a/drivers/tty/serial/ioc4_serial.c b/drivers/tty/serial/ioc4_serial.c +index aa28209..e08fb85 100644 +--- a/drivers/tty/serial/ioc4_serial.c ++++ b/drivers/tty/serial/ioc4_serial.c +@@ -437,7 +437,7 @@ struct ioc4_soft { + } is_intr_info[MAX_IOC4_INTR_ENTS]; + + /* Number of entries active in the above array */ +- atomic_t is_num_intrs; ++ atomic_unchecked_t is_num_intrs; + } is_intr_type[IOC4_NUM_INTR_TYPES]; + + /* is_ir_lock must be held while +@@ -974,7 +974,7 @@ intr_connect(struct ioc4_soft *soft, int type, + BUG_ON(!((type == IOC4_SIO_INTR_TYPE) + || (type == IOC4_OTHER_INTR_TYPE))); + +- i = atomic_inc_return(&soft-> is_intr_type[type].is_num_intrs) - 1; ++ i = atomic_inc_return_unchecked(&soft-> is_intr_type[type].is_num_intrs) - 1; + BUG_ON(!(i < MAX_IOC4_INTR_ENTS || (printk("i %d\n", i), 0))); + + /* Save off the lower level interrupt handler */ +@@ -1001,7 +1001,7 @@ static irqreturn_t ioc4_intr(int irq, void *arg) + + soft = arg; + for (intr_type = 0; intr_type < IOC4_NUM_INTR_TYPES; intr_type++) { +- num_intrs = (int)atomic_read( ++ num_intrs = (int)atomic_read_unchecked( + &soft->is_intr_type[intr_type].is_num_intrs); + + this_mir = this_ir = pending_intrs(soft, intr_type); +diff --git a/drivers/tty/serial/kgdb_nmi.c b/drivers/tty/serial/kgdb_nmi.c +index 129dc5b..1da5bb8 100644 +--- a/drivers/tty/serial/kgdb_nmi.c ++++ b/drivers/tty/serial/kgdb_nmi.c +@@ -53,7 +53,9 @@ static int kgdb_nmi_console_setup(struct console *co, char *options) + * I/O utilities that messages sent to the console will automatically + * be displayed on the dbg_io. + */ +- dbg_io_ops->is_console = true; ++ pax_open_kernel(); ++ *(int *)&dbg_io_ops->is_console = true; ++ pax_close_kernel(); + + return 0; + } +diff --git a/drivers/tty/serial/kgdboc.c b/drivers/tty/serial/kgdboc.c +index a260cde..6b2b5ce 100644 +--- a/drivers/tty/serial/kgdboc.c ++++ b/drivers/tty/serial/kgdboc.c +@@ -24,8 +24,9 @@ + #define MAX_CONFIG_LEN 40 + + static struct kgdb_io kgdboc_io_ops; ++static struct kgdb_io kgdboc_io_ops_console; + +-/* -1 = init not run yet, 0 = unconfigured, 1 = configured. */ ++/* -1 = init not run yet, 0 = unconfigured, 1/2 = configured. */ + static int configured = -1; + + static char config[MAX_CONFIG_LEN]; +@@ -151,6 +152,8 @@ static void cleanup_kgdboc(void) + kgdboc_unregister_kbd(); + if (configured == 1) + kgdb_unregister_io_module(&kgdboc_io_ops); ++ else if (configured == 2) ++ kgdb_unregister_io_module(&kgdboc_io_ops_console); + } + + static int configure_kgdboc(void) +@@ -160,13 +163,13 @@ static int configure_kgdboc(void) + int err; + char *cptr = config; + struct console *cons; ++ int is_console = 0; + + err = kgdboc_option_setup(config); + if (err || !strlen(config) || isspace(config[0])) + goto noconfig; + + err = -ENODEV; +- kgdboc_io_ops.is_console = 0; + kgdb_tty_driver = NULL; + + kgdboc_use_kms = 0; +@@ -187,7 +190,7 @@ static int configure_kgdboc(void) + int idx; + if (cons->device && cons->device(cons, &idx) == p && + idx == tty_line) { +- kgdboc_io_ops.is_console = 1; ++ is_console = 1; + break; + } + cons = cons->next; +@@ -197,7 +200,13 @@ static int configure_kgdboc(void) + kgdb_tty_line = tty_line; + + do_register: +- err = kgdb_register_io_module(&kgdboc_io_ops); ++ if (is_console) { ++ err = kgdb_register_io_module(&kgdboc_io_ops_console); ++ configured = 2; ++ } else { ++ err = kgdb_register_io_module(&kgdboc_io_ops); ++ configured = 1; ++ } + if (err) + goto noconfig; + +@@ -205,8 +214,6 @@ do_register: + if (err) + goto nmi_con_failed; + +- configured = 1; +- + return 0; + + nmi_con_failed: +@@ -223,7 +230,7 @@ noconfig: + static int __init init_kgdboc(void) + { + /* Already configured? */ +- if (configured == 1) ++ if (configured >= 1) + return 0; + + return configure_kgdboc(); +@@ -272,7 +279,7 @@ static int param_set_kgdboc_var(const char *kmessage, struct kernel_param *kp) + if (config[len - 1] == '\n') + config[len - 1] = '\0'; + +- if (configured == 1) ++ if (configured >= 1) + cleanup_kgdboc(); + + /* Go and configure with the new params. */ +@@ -312,6 +319,15 @@ static struct kgdb_io kgdboc_io_ops = { + .post_exception = kgdboc_post_exp_handler, + }; + ++static struct kgdb_io kgdboc_io_ops_console = { ++ .name = "kgdboc", ++ .read_char = kgdboc_get_char, ++ .write_char = kgdboc_put_char, ++ .pre_exception = kgdboc_pre_exp_handler, ++ .post_exception = kgdboc_post_exp_handler, ++ .is_console = 1 ++}; ++ + #ifdef CONFIG_KGDB_SERIAL_CONSOLE + /* This is only available if kgdboc is a built in for early debugging */ + static int __init kgdboc_early_init(char *opt) +diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c +index 4b6c783..9a19db3 100644 +--- a/drivers/tty/serial/msm_serial.c ++++ b/drivers/tty/serial/msm_serial.c +@@ -1028,7 +1028,7 @@ static struct uart_driver msm_uart_driver = { + .cons = MSM_CONSOLE, + }; + +-static atomic_t msm_uart_next_id = ATOMIC_INIT(0); ++static atomic_unchecked_t msm_uart_next_id = ATOMIC_INIT(0); + + static const struct of_device_id msm_uartdm_table[] = { + { .compatible = "qcom,msm-uartdm-v1.1", .data = (void *)UARTDM_1P1 }, +@@ -1047,7 +1047,7 @@ static int msm_serial_probe(struct platform_device *pdev) + int irq; + + if (pdev->id == -1) +- pdev->id = atomic_inc_return(&msm_uart_next_id) - 1; ++ pdev->id = atomic_inc_return_unchecked(&msm_uart_next_id) - 1; + + if (unlikely(pdev->id < 0 || pdev->id >= UART_NR)) + return -ENXIO; +diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c +index 587d63b..48423a6 100644 +--- a/drivers/tty/serial/samsung.c ++++ b/drivers/tty/serial/samsung.c +@@ -478,11 +478,16 @@ static void s3c24xx_serial_shutdown(struct uart_port *port) + } + } + ++static int s3c64xx_serial_startup(struct uart_port *port); + static int s3c24xx_serial_startup(struct uart_port *port) + { + struct s3c24xx_uart_port *ourport = to_ourport(port); + int ret; + ++ /* Startup sequence is different for s3c64xx and higher SoC's */ ++ if (s3c24xx_serial_has_interrupt_mask(port)) ++ return s3c64xx_serial_startup(port); ++ + dbg("s3c24xx_serial_startup: port=%p (%08llx,%p)\n", + port, (unsigned long long)port->mapbase, port->membase); + +@@ -1159,10 +1164,6 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, + /* setup info for port */ + port->dev = &platdev->dev; + +- /* Startup sequence is different for s3c64xx and higher SoC's */ +- if (s3c24xx_serial_has_interrupt_mask(port)) +- s3c24xx_serial_ops.startup = s3c64xx_serial_startup; +- + port->uartclk = 1; + + if (cfg->uart_flags & UPF_CONS_FLOW) { +diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c +index a28dee9..168ba47 100644 +--- a/drivers/tty/serial/serial_core.c ++++ b/drivers/tty/serial/serial_core.c +@@ -1339,7 +1339,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp) + + pr_debug("uart_close(%d) called\n", uport ? uport->line : -1); + +- if (!port->count || tty_port_close_start(port, tty, filp) == 0) ++ if (!atomic_read(&port->count) || tty_port_close_start(port, tty, filp) == 0) + return; + + /* +@@ -1466,7 +1466,7 @@ static void uart_hangup(struct tty_struct *tty) + uart_flush_buffer(tty); + uart_shutdown(tty, state); + spin_lock_irqsave(&port->lock, flags); +- port->count = 0; ++ atomic_set(&port->count, 0); + clear_bit(ASYNCB_NORMAL_ACTIVE, &port->flags); + spin_unlock_irqrestore(&port->lock, flags); + tty_port_tty_set(port, NULL); +@@ -1564,7 +1564,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp) + goto end; + } + +- port->count++; ++ atomic_inc(&port->count); + if (!state->uart_port || state->uart_port->flags & UPF_DEAD) { + retval = -ENXIO; + goto err_dec_count; +@@ -1596,7 +1596,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp) + end: + return retval; + err_dec_count: +- port->count--; ++ atomic_dec(&port->count); + mutex_unlock(&port->mutex); + goto end; + } +diff --git a/drivers/tty/synclink.c b/drivers/tty/synclink.c +index b799170..87dafd5 100644 +--- a/drivers/tty/synclink.c ++++ b/drivers/tty/synclink.c +@@ -3090,7 +3090,7 @@ static void mgsl_close(struct tty_struct *tty, struct file * filp) + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):mgsl_close(%s) entry, count=%d\n", +- __FILE__,__LINE__, info->device_name, info->port.count); ++ __FILE__,__LINE__, info->device_name, atomic_read(&info->port.count)); + + if (tty_port_close_start(&info->port, tty, filp) == 0) + goto cleanup; +@@ -3108,7 +3108,7 @@ static void mgsl_close(struct tty_struct *tty, struct file * filp) + cleanup: + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):mgsl_close(%s) exit, count=%d\n", __FILE__,__LINE__, +- tty->driver->name, info->port.count); ++ tty->driver->name, atomic_read(&info->port.count)); + + } /* end of mgsl_close() */ + +@@ -3207,8 +3207,8 @@ static void mgsl_hangup(struct tty_struct *tty) + + mgsl_flush_buffer(tty); + shutdown(info); +- +- info->port.count = 0; ++ ++ atomic_set(&info->port.count, 0); + info->port.flags &= ~ASYNC_NORMAL_ACTIVE; + info->port.tty = NULL; + +@@ -3296,10 +3296,10 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):block_til_ready before block on %s count=%d\n", +- __FILE__,__LINE__, tty->driver->name, port->count ); ++ __FILE__,__LINE__, tty->driver->name, atomic_read(&port->count)); + + spin_lock_irqsave(&info->irq_spinlock, flags); +- port->count--; ++ atomic_dec(&port->count); + spin_unlock_irqrestore(&info->irq_spinlock, flags); + port->blocked_open++; + +@@ -3327,7 +3327,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):block_til_ready blocking on %s count=%d\n", +- __FILE__,__LINE__, tty->driver->name, port->count ); ++ __FILE__,__LINE__, tty->driver->name, atomic_read(&port->count)); + + tty_unlock(tty); + schedule(); +@@ -3339,12 +3339,12 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, + + /* FIXME: Racy on hangup during close wait */ + if (!tty_hung_up_p(filp)) +- port->count++; ++ atomic_inc(&port->count); + port->blocked_open--; + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):block_til_ready after blocking on %s count=%d\n", +- __FILE__,__LINE__, tty->driver->name, port->count ); ++ __FILE__,__LINE__, tty->driver->name, atomic_read(&port->count)); + + if (!retval) + port->flags |= ASYNC_NORMAL_ACTIVE; +@@ -3396,7 +3396,7 @@ static int mgsl_open(struct tty_struct *tty, struct file * filp) + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):mgsl_open(%s), old ref count = %d\n", +- __FILE__,__LINE__,tty->driver->name, info->port.count); ++ __FILE__,__LINE__,tty->driver->name, atomic_read(&info->port.count)); + + /* If port is closing, signal caller to try again */ + if (info->port.flags & ASYNC_CLOSING){ +@@ -3415,10 +3415,10 @@ static int mgsl_open(struct tty_struct *tty, struct file * filp) + spin_unlock_irqrestore(&info->netlock, flags); + goto cleanup; + } +- info->port.count++; ++ atomic_inc(&info->port.count); + spin_unlock_irqrestore(&info->netlock, flags); + +- if (info->port.count == 1) { ++ if (atomic_read(&info->port.count) == 1) { + /* 1st open on this device, init hardware */ + retval = startup(info); + if (retval < 0) +@@ -3442,8 +3442,8 @@ cleanup: + if (retval) { + if (tty->count == 1) + info->port.tty = NULL; /* tty layer will release tty struct */ +- if(info->port.count) +- info->port.count--; ++ if (atomic_read(&info->port.count)) ++ atomic_dec(&info->port.count); + } + + return retval; +@@ -7661,7 +7661,7 @@ static int hdlcdev_attach(struct net_device *dev, unsigned short encoding, + unsigned short new_crctype; + + /* return error if TTY interface open */ +- if (info->port.count) ++ if (atomic_read(&info->port.count)) + return -EBUSY; + + switch (encoding) +@@ -7756,7 +7756,7 @@ static int hdlcdev_open(struct net_device *dev) + + /* arbitrate between network and tty opens */ + spin_lock_irqsave(&info->netlock, flags); +- if (info->port.count != 0 || info->netcount != 0) { ++ if (atomic_read(&info->port.count) != 0 || info->netcount != 0) { + printk(KERN_WARNING "%s: hdlc_open returning busy\n", dev->name); + spin_unlock_irqrestore(&info->netlock, flags); + return -EBUSY; +@@ -7842,7 +7842,7 @@ static int hdlcdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + printk("%s:hdlcdev_ioctl(%s)\n",__FILE__,dev->name); + + /* return error if TTY interface open */ +- if (info->port.count) ++ if (atomic_read(&info->port.count)) + return -EBUSY; + + if (cmd != SIOCWANDEV) +diff --git a/drivers/tty/synclink_gt.c b/drivers/tty/synclink_gt.c +index 0e8c39b..e0cb171 100644 +--- a/drivers/tty/synclink_gt.c ++++ b/drivers/tty/synclink_gt.c +@@ -670,7 +670,7 @@ static int open(struct tty_struct *tty, struct file *filp) + tty->driver_data = info; + info->port.tty = tty; + +- DBGINFO(("%s open, old ref count = %d\n", info->device_name, info->port.count)); ++ DBGINFO(("%s open, old ref count = %d\n", info->device_name, atomic_read(&info->port.count))); + + /* If port is closing, signal caller to try again */ + if (info->port.flags & ASYNC_CLOSING){ +@@ -691,10 +691,10 @@ static int open(struct tty_struct *tty, struct file *filp) + mutex_unlock(&info->port.mutex); + goto cleanup; + } +- info->port.count++; ++ atomic_inc(&info->port.count); + spin_unlock_irqrestore(&info->netlock, flags); + +- if (info->port.count == 1) { ++ if (atomic_read(&info->port.count) == 1) { + /* 1st open on this device, init hardware */ + retval = startup(info); + if (retval < 0) { +@@ -715,8 +715,8 @@ cleanup: + if (retval) { + if (tty->count == 1) + info->port.tty = NULL; /* tty layer will release tty struct */ +- if(info->port.count) +- info->port.count--; ++ if(atomic_read(&info->port.count)) ++ atomic_dec(&info->port.count); + } + + DBGINFO(("%s open rc=%d\n", info->device_name, retval)); +@@ -729,7 +729,7 @@ static void close(struct tty_struct *tty, struct file *filp) + + if (sanity_check(info, tty->name, "close")) + return; +- DBGINFO(("%s close entry, count=%d\n", info->device_name, info->port.count)); ++ DBGINFO(("%s close entry, count=%d\n", info->device_name, atomic_read(&info->port.count))); + + if (tty_port_close_start(&info->port, tty, filp) == 0) + goto cleanup; +@@ -746,7 +746,7 @@ static void close(struct tty_struct *tty, struct file *filp) + tty_port_close_end(&info->port, tty); + info->port.tty = NULL; + cleanup: +- DBGINFO(("%s close exit, count=%d\n", tty->driver->name, info->port.count)); ++ DBGINFO(("%s close exit, count=%d\n", tty->driver->name, atomic_read(&info->port.count))); + } + + static void hangup(struct tty_struct *tty) +@@ -764,7 +764,7 @@ static void hangup(struct tty_struct *tty) + shutdown(info); + + spin_lock_irqsave(&info->port.lock, flags); +- info->port.count = 0; ++ atomic_set(&info->port.count, 0); + info->port.flags &= ~ASYNC_NORMAL_ACTIVE; + info->port.tty = NULL; + spin_unlock_irqrestore(&info->port.lock, flags); +@@ -1449,7 +1449,7 @@ static int hdlcdev_attach(struct net_device *dev, unsigned short encoding, + unsigned short new_crctype; + + /* return error if TTY interface open */ +- if (info->port.count) ++ if (atomic_read(&info->port.count)) + return -EBUSY; + + DBGINFO(("%s hdlcdev_attach\n", info->device_name)); +@@ -1544,7 +1544,7 @@ static int hdlcdev_open(struct net_device *dev) + + /* arbitrate between network and tty opens */ + spin_lock_irqsave(&info->netlock, flags); +- if (info->port.count != 0 || info->netcount != 0) { ++ if (atomic_read(&info->port.count) != 0 || info->netcount != 0) { + DBGINFO(("%s hdlc_open busy\n", dev->name)); + spin_unlock_irqrestore(&info->netlock, flags); + return -EBUSY; +@@ -1629,7 +1629,7 @@ static int hdlcdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + DBGINFO(("%s hdlcdev_ioctl\n", dev->name)); + + /* return error if TTY interface open */ +- if (info->port.count) ++ if (atomic_read(&info->port.count)) + return -EBUSY; + + if (cmd != SIOCWANDEV) +@@ -2413,7 +2413,7 @@ static irqreturn_t slgt_interrupt(int dummy, void *dev_id) + if (port == NULL) + continue; + spin_lock(&port->lock); +- if ((port->port.count || port->netcount) && ++ if ((atomic_read(&port->port.count) || port->netcount) && + port->pending_bh && !port->bh_running && + !port->bh_requested) { + DBGISR(("%s bh queued\n", port->device_name)); +@@ -3299,7 +3299,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, + add_wait_queue(&port->open_wait, &wait); + + spin_lock_irqsave(&info->lock, flags); +- port->count--; ++ atomic_dec(&port->count); + spin_unlock_irqrestore(&info->lock, flags); + port->blocked_open++; + +@@ -3335,7 +3335,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, + remove_wait_queue(&port->open_wait, &wait); + + if (!tty_hung_up_p(filp)) +- port->count++; ++ atomic_inc(&port->count); + port->blocked_open--; + + if (!retval) +diff --git a/drivers/tty/synclinkmp.c b/drivers/tty/synclinkmp.c +index c3f9091..abe4601 100644 +--- a/drivers/tty/synclinkmp.c ++++ b/drivers/tty/synclinkmp.c +@@ -750,7 +750,7 @@ static int open(struct tty_struct *tty, struct file *filp) + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):%s open(), old ref count = %d\n", +- __FILE__,__LINE__,tty->driver->name, info->port.count); ++ __FILE__,__LINE__,tty->driver->name, atomic_read(&info->port.count)); + + /* If port is closing, signal caller to try again */ + if (info->port.flags & ASYNC_CLOSING){ +@@ -769,10 +769,10 @@ static int open(struct tty_struct *tty, struct file *filp) + spin_unlock_irqrestore(&info->netlock, flags); + goto cleanup; + } +- info->port.count++; ++ atomic_inc(&info->port.count); + spin_unlock_irqrestore(&info->netlock, flags); + +- if (info->port.count == 1) { ++ if (atomic_read(&info->port.count) == 1) { + /* 1st open on this device, init hardware */ + retval = startup(info); + if (retval < 0) +@@ -796,8 +796,8 @@ cleanup: + if (retval) { + if (tty->count == 1) + info->port.tty = NULL; /* tty layer will release tty struct */ +- if(info->port.count) +- info->port.count--; ++ if(atomic_read(&info->port.count)) ++ atomic_dec(&info->port.count); + } + + return retval; +@@ -815,7 +815,7 @@ static void close(struct tty_struct *tty, struct file *filp) + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):%s close() entry, count=%d\n", +- __FILE__,__LINE__, info->device_name, info->port.count); ++ __FILE__,__LINE__, info->device_name, atomic_read(&info->port.count)); + + if (tty_port_close_start(&info->port, tty, filp) == 0) + goto cleanup; +@@ -834,7 +834,7 @@ static void close(struct tty_struct *tty, struct file *filp) + cleanup: + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):%s close() exit, count=%d\n", __FILE__,__LINE__, +- tty->driver->name, info->port.count); ++ tty->driver->name, atomic_read(&info->port.count)); + } + + /* Called by tty_hangup() when a hangup is signaled. +@@ -857,7 +857,7 @@ static void hangup(struct tty_struct *tty) + shutdown(info); + + spin_lock_irqsave(&info->port.lock, flags); +- info->port.count = 0; ++ atomic_set(&info->port.count, 0); + info->port.flags &= ~ASYNC_NORMAL_ACTIVE; + info->port.tty = NULL; + spin_unlock_irqrestore(&info->port.lock, flags); +@@ -1565,7 +1565,7 @@ static int hdlcdev_attach(struct net_device *dev, unsigned short encoding, + unsigned short new_crctype; + + /* return error if TTY interface open */ +- if (info->port.count) ++ if (atomic_read(&info->port.count)) + return -EBUSY; + + switch (encoding) +@@ -1660,7 +1660,7 @@ static int hdlcdev_open(struct net_device *dev) + + /* arbitrate between network and tty opens */ + spin_lock_irqsave(&info->netlock, flags); +- if (info->port.count != 0 || info->netcount != 0) { ++ if (atomic_read(&info->port.count) != 0 || info->netcount != 0) { + printk(KERN_WARNING "%s: hdlc_open returning busy\n", dev->name); + spin_unlock_irqrestore(&info->netlock, flags); + return -EBUSY; +@@ -1746,7 +1746,7 @@ static int hdlcdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + printk("%s:hdlcdev_ioctl(%s)\n",__FILE__,dev->name); + + /* return error if TTY interface open */ +- if (info->port.count) ++ if (atomic_read(&info->port.count)) + return -EBUSY; + + if (cmd != SIOCWANDEV) +@@ -2621,7 +2621,7 @@ static irqreturn_t synclinkmp_interrupt(int dummy, void *dev_id) + * do not request bottom half processing if the + * device is not open in a normal mode. + */ +- if ( port && (port->port.count || port->netcount) && ++ if ( port && (atomic_read(&port->port.count) || port->netcount) && + port->pending_bh && !port->bh_running && + !port->bh_requested ) { + if ( debug_level >= DEBUG_LEVEL_ISR ) +@@ -3318,10 +3318,10 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):%s block_til_ready() before block, count=%d\n", +- __FILE__,__LINE__, tty->driver->name, port->count ); ++ __FILE__,__LINE__, tty->driver->name, atomic_read(&port->count)); + + spin_lock_irqsave(&info->lock, flags); +- port->count--; ++ atomic_dec(&port->count); + spin_unlock_irqrestore(&info->lock, flags); + port->blocked_open++; + +@@ -3349,7 +3349,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):%s block_til_ready() count=%d\n", +- __FILE__,__LINE__, tty->driver->name, port->count ); ++ __FILE__,__LINE__, tty->driver->name, atomic_read(&port->count)); + + tty_unlock(tty); + schedule(); +@@ -3359,12 +3359,12 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp, + set_current_state(TASK_RUNNING); + remove_wait_queue(&port->open_wait, &wait); + if (!tty_hung_up_p(filp)) +- port->count++; ++ atomic_inc(&port->count); + port->blocked_open--; + + if (debug_level >= DEBUG_LEVEL_INFO) + printk("%s(%d):%s block_til_ready() after, count=%d\n", +- __FILE__,__LINE__, tty->driver->name, port->count ); ++ __FILE__,__LINE__, tty->driver->name, atomic_read(&port->count)); + + if (!retval) + port->flags |= ASYNC_NORMAL_ACTIVE; +diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c +index 42bad18..447d7a2 100644 +--- a/drivers/tty/sysrq.c ++++ b/drivers/tty/sysrq.c +@@ -1084,7 +1084,7 @@ EXPORT_SYMBOL(unregister_sysrq_key); + static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) + { +- if (count) { ++ if (count && capable(CAP_SYS_ADMIN)) { + char c; + + if (get_user(c, buf)) +diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c +index 0a0a630..7a01cdf 100644 +--- a/drivers/tty/tty_io.c ++++ b/drivers/tty/tty_io.c +@@ -3498,7 +3498,7 @@ EXPORT_SYMBOL_GPL(get_current_tty); + + void tty_default_fops(struct file_operations *fops) + { +- *fops = tty_fops; ++ memcpy((void *)fops, &tty_fops, sizeof(tty_fops)); + } + + /* +diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c +index 2d822aa..a566234 100644 +--- a/drivers/tty/tty_ldisc.c ++++ b/drivers/tty/tty_ldisc.c +@@ -71,7 +71,7 @@ int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc) + raw_spin_lock_irqsave(&tty_ldiscs_lock, flags); + tty_ldiscs[disc] = new_ldisc; + new_ldisc->num = disc; +- new_ldisc->refcount = 0; ++ atomic_set(&new_ldisc->refcount, 0); + raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags); + + return ret; +@@ -99,7 +99,7 @@ int tty_unregister_ldisc(int disc) + return -EINVAL; + + raw_spin_lock_irqsave(&tty_ldiscs_lock, flags); +- if (tty_ldiscs[disc]->refcount) ++ if (atomic_read(&tty_ldiscs[disc]->refcount)) + ret = -EBUSY; + else + tty_ldiscs[disc] = NULL; +@@ -120,7 +120,7 @@ static struct tty_ldisc_ops *get_ldops(int disc) + if (ldops) { + ret = ERR_PTR(-EAGAIN); + if (try_module_get(ldops->owner)) { +- ldops->refcount++; ++ atomic_inc(&ldops->refcount); + ret = ldops; + } + } +@@ -133,7 +133,7 @@ static void put_ldops(struct tty_ldisc_ops *ldops) + unsigned long flags; + + raw_spin_lock_irqsave(&tty_ldiscs_lock, flags); +- ldops->refcount--; ++ atomic_dec(&ldops->refcount); + module_put(ldops->owner); + raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags); + } +diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c +index 1b93357..ea9f82c 100644 +--- a/drivers/tty/tty_port.c ++++ b/drivers/tty/tty_port.c +@@ -237,7 +237,7 @@ void tty_port_hangup(struct tty_port *port) + unsigned long flags; + + spin_lock_irqsave(&port->lock, flags); +- port->count = 0; ++ atomic_set(&port->count, 0); + port->flags &= ~ASYNC_NORMAL_ACTIVE; + tty = port->tty; + if (tty) +@@ -399,7 +399,7 @@ int tty_port_block_til_ready(struct tty_port *port, + + /* The port lock protects the port counts */ + spin_lock_irqsave(&port->lock, flags); +- port->count--; ++ atomic_dec(&port->count); + port->blocked_open++; + spin_unlock_irqrestore(&port->lock, flags); + +@@ -441,7 +441,7 @@ int tty_port_block_til_ready(struct tty_port *port, + we must not mess that up further */ + spin_lock_irqsave(&port->lock, flags); + if (!tty_hung_up_p(filp)) +- port->count++; ++ atomic_inc(&port->count); + port->blocked_open--; + if (retval == 0) + port->flags |= ASYNC_NORMAL_ACTIVE; +@@ -479,19 +479,19 @@ int tty_port_close_start(struct tty_port *port, + return 0; + } + +- if (tty->count == 1 && port->count != 1) { ++ if (tty->count == 1 && atomic_read(&port->count) != 1) { + printk(KERN_WARNING + "tty_port_close_start: tty->count = 1 port count = %d.\n", +- port->count); +- port->count = 1; ++ atomic_read(&port->count)); ++ atomic_set(&port->count, 1); + } +- if (--port->count < 0) { ++ if (atomic_dec_return(&port->count) < 0) { + printk(KERN_WARNING "tty_port_close_start: count = %d\n", +- port->count); +- port->count = 0; ++ atomic_read(&port->count)); ++ atomic_set(&port->count, 0); + } + +- if (port->count) { ++ if (atomic_read(&port->count)) { + spin_unlock_irqrestore(&port->lock, flags); + return 0; + } +@@ -592,7 +592,7 @@ int tty_port_open(struct tty_port *port, struct tty_struct *tty, + struct file *filp) + { + spin_lock_irq(&port->lock); +- ++port->count; ++ atomic_inc(&port->count); + spin_unlock_irq(&port->lock); + tty_port_tty_set(port, tty); + +diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c +index c039cfe..0b463b0 100644 +--- a/drivers/tty/vt/keyboard.c ++++ b/drivers/tty/vt/keyboard.c +@@ -641,6 +641,16 @@ static void k_spec(struct vc_data *vc, unsigned char value, char up_flag) + kbd->kbdmode == VC_OFF) && + value != KVAL(K_SAK)) + return; /* SAK is allowed even in raw mode */ ++ ++#if defined(CONFIG_GRKERNSEC_PROC) || defined(CONFIG_GRKERNSEC_PROC_MEMMAP) ++ { ++ void *func = fn_handler[value]; ++ if (func == fn_show_state || func == fn_show_ptregs || ++ func == fn_show_mem) ++ return; ++ } ++#endif ++ + fn_handler[value](vc); + } + +@@ -1776,9 +1786,6 @@ int vt_do_kdsk_ioctl(int cmd, struct kbentry __user *user_kbe, int perm, + if (copy_from_user(&tmp, user_kbe, sizeof(struct kbentry))) + return -EFAULT; + +- if (!capable(CAP_SYS_TTY_CONFIG)) +- perm = 0; +- + switch (cmd) { + case KDGKBENT: + /* Ensure another thread doesn't free it under us */ +@@ -1793,6 +1800,9 @@ int vt_do_kdsk_ioctl(int cmd, struct kbentry __user *user_kbe, int perm, + spin_unlock_irqrestore(&kbd_event_lock, flags); + return put_user(val, &user_kbe->kb_value); + case KDSKBENT: ++ if (!capable(CAP_SYS_TTY_CONFIG)) ++ perm = 0; ++ + if (!perm) + return -EPERM; + if (!i && v == K_NOSUCHMAP) { +@@ -1883,9 +1893,6 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user *user_kdgkb, int perm) + int i, j, k; + int ret; + +- if (!capable(CAP_SYS_TTY_CONFIG)) +- perm = 0; +- + kbs = kmalloc(sizeof(*kbs), GFP_KERNEL); + if (!kbs) { + ret = -ENOMEM; +@@ -1919,6 +1926,9 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user *user_kdgkb, int perm) + kfree(kbs); + return ((p && *p) ? -EOVERFLOW : 0); + case KDSKBSENT: ++ if (!capable(CAP_SYS_TTY_CONFIG)) ++ perm = 0; ++ + if (!perm) { + ret = -EPERM; + goto reterr; +diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c +index 60fa627..7214965 100644 +--- a/drivers/uio/uio.c ++++ b/drivers/uio/uio.c +@@ -25,6 +25,7 @@ + #include <linux/kobject.h> + #include <linux/cdev.h> + #include <linux/uio_driver.h> ++#include <asm/local.h> + + #define UIO_MAX_DEVICES (1U << MINORBITS) + +@@ -231,7 +232,7 @@ static ssize_t event_show(struct device *dev, + struct device_attribute *attr, char *buf) + { + struct uio_device *idev = dev_get_drvdata(dev); +- return sprintf(buf, "%u\n", (unsigned int)atomic_read(&idev->event)); ++ return sprintf(buf, "%u\n", (unsigned int)atomic_read_unchecked(&idev->event)); + } + static DEVICE_ATTR_RO(event); + +@@ -393,7 +394,7 @@ void uio_event_notify(struct uio_info *info) + { + struct uio_device *idev = info->uio_dev; + +- atomic_inc(&idev->event); ++ atomic_inc_unchecked(&idev->event); + wake_up_interruptible(&idev->wait); + kill_fasync(&idev->async_queue, SIGIO, POLL_IN); + } +@@ -446,7 +447,7 @@ static int uio_open(struct inode *inode, struct file *filep) + } + + listener->dev = idev; +- listener->event_count = atomic_read(&idev->event); ++ listener->event_count = atomic_read_unchecked(&idev->event); + filep->private_data = listener; + + if (idev->info->open) { +@@ -497,7 +498,7 @@ static unsigned int uio_poll(struct file *filep, poll_table *wait) + return -EIO; + + poll_wait(filep, &idev->wait, wait); +- if (listener->event_count != atomic_read(&idev->event)) ++ if (listener->event_count != atomic_read_unchecked(&idev->event)) + return POLLIN | POLLRDNORM; + return 0; + } +@@ -522,7 +523,7 @@ static ssize_t uio_read(struct file *filep, char __user *buf, + do { + set_current_state(TASK_INTERRUPTIBLE); + +- event_count = atomic_read(&idev->event); ++ event_count = atomic_read_unchecked(&idev->event); + if (event_count != listener->event_count) { + if (copy_to_user(buf, &event_count, count)) + retval = -EFAULT; +@@ -579,9 +580,13 @@ static ssize_t uio_write(struct file *filep, const char __user *buf, + static int uio_find_mem_index(struct vm_area_struct *vma) + { + struct uio_device *idev = vma->vm_private_data; ++ unsigned long size; + + if (vma->vm_pgoff < MAX_UIO_MAPS) { +- if (idev->info->mem[vma->vm_pgoff].size == 0) ++ size = idev->info->mem[vma->vm_pgoff].size; ++ if (size == 0) ++ return -1; ++ if (vma->vm_end - vma->vm_start > size) + return -1; + return (int)vma->vm_pgoff; + } +@@ -813,7 +818,7 @@ int __uio_register_device(struct module *owner, + idev->owner = owner; + idev->info = info; + init_waitqueue_head(&idev->wait); +- atomic_set(&idev->event, 0); ++ atomic_set_unchecked(&idev->event, 0); + + ret = uio_get_minor(idev); + if (ret) +diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c +index 813d4d3..a71934f 100644 +--- a/drivers/usb/atm/cxacru.c ++++ b/drivers/usb/atm/cxacru.c +@@ -472,7 +472,7 @@ static ssize_t cxacru_sysfs_store_adsl_config(struct device *dev, + ret = sscanf(buf + pos, "%x=%x%n", &index, &value, &tmp); + if (ret < 2) + return -EINVAL; +- if (index < 0 || index > 0x7f) ++ if (index > 0x7f) + return -EINVAL; + pos += tmp; + +diff --git a/drivers/usb/atm/usbatm.c b/drivers/usb/atm/usbatm.c +index dada014..1d0d517 100644 +--- a/drivers/usb/atm/usbatm.c ++++ b/drivers/usb/atm/usbatm.c +@@ -331,7 +331,7 @@ static void usbatm_extract_one_cell(struct usbatm_data *instance, unsigned char + if (printk_ratelimit()) + atm_warn(instance, "%s: OAM not supported (vpi %d, vci %d)!\n", + __func__, vpi, vci); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + return; + } + +@@ -358,7 +358,7 @@ static void usbatm_extract_one_cell(struct usbatm_data *instance, unsigned char + if (length > ATM_MAX_AAL5_PDU) { + atm_rldbg(instance, "%s: bogus length %u (vcc: 0x%p)!\n", + __func__, length, vcc); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + goto out; + } + +@@ -367,14 +367,14 @@ static void usbatm_extract_one_cell(struct usbatm_data *instance, unsigned char + if (sarb->len < pdu_length) { + atm_rldbg(instance, "%s: bogus pdu_length %u (sarb->len: %u, vcc: 0x%p)!\n", + __func__, pdu_length, sarb->len, vcc); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + goto out; + } + + if (crc32_be(~0, skb_tail_pointer(sarb) - pdu_length, pdu_length) != 0xc704dd7b) { + atm_rldbg(instance, "%s: packet failed crc check (vcc: 0x%p)!\n", + __func__, vcc); +- atomic_inc(&vcc->stats->rx_err); ++ atomic_inc_unchecked(&vcc->stats->rx_err); + goto out; + } + +@@ -386,7 +386,7 @@ static void usbatm_extract_one_cell(struct usbatm_data *instance, unsigned char + if (printk_ratelimit()) + atm_err(instance, "%s: no memory for skb (length: %u)!\n", + __func__, length); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + goto out; + } + +@@ -414,7 +414,7 @@ static void usbatm_extract_one_cell(struct usbatm_data *instance, unsigned char + + vcc->push(vcc, skb); + +- atomic_inc(&vcc->stats->rx); ++ atomic_inc_unchecked(&vcc->stats->rx); + out: + skb_trim(sarb, 0); + } +@@ -612,7 +612,7 @@ static void usbatm_tx_process(unsigned long data) + struct atm_vcc *vcc = UDSL_SKB(skb)->atm.vcc; + + usbatm_pop(vcc, skb); +- atomic_inc(&vcc->stats->tx); ++ atomic_inc_unchecked(&vcc->stats->tx); + + skb = skb_dequeue(&instance->sndqueue); + } +@@ -756,11 +756,11 @@ static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t *pos, char *page + if (!left--) + return sprintf(page, + "AAL5: tx %d ( %d err ), rx %d ( %d err, %d drop )\n", +- atomic_read(&atm_dev->stats.aal5.tx), +- atomic_read(&atm_dev->stats.aal5.tx_err), +- atomic_read(&atm_dev->stats.aal5.rx), +- atomic_read(&atm_dev->stats.aal5.rx_err), +- atomic_read(&atm_dev->stats.aal5.rx_drop)); ++ atomic_read_unchecked(&atm_dev->stats.aal5.tx), ++ atomic_read_unchecked(&atm_dev->stats.aal5.tx_err), ++ atomic_read_unchecked(&atm_dev->stats.aal5.rx), ++ atomic_read_unchecked(&atm_dev->stats.aal5.rx_err), ++ atomic_read_unchecked(&atm_dev->stats.aal5.rx_drop)); + + if (!left--) { + if (instance->disconnected) +diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c +index 2a3bbdf..91d72cf 100644 +--- a/drivers/usb/core/devices.c ++++ b/drivers/usb/core/devices.c +@@ -126,7 +126,7 @@ static const char format_endpt[] = + * time it gets called. + */ + static struct device_connect_event { +- atomic_t count; ++ atomic_unchecked_t count; + wait_queue_head_t wait; + } device_event = { + .count = ATOMIC_INIT(1), +@@ -164,7 +164,7 @@ static const struct class_info clas_info[] = { + + void usbfs_conn_disc_event(void) + { +- atomic_add(2, &device_event.count); ++ atomic_add_unchecked(2, &device_event.count); + wake_up(&device_event.wait); + } + +@@ -652,7 +652,7 @@ static unsigned int usb_device_poll(struct file *file, + + poll_wait(file, &device_event.wait, wait); + +- event_count = atomic_read(&device_event.count); ++ event_count = atomic_read_unchecked(&device_event.count); + if (file->f_version != event_count) { + file->f_version = event_count; + return POLLIN | POLLRDNORM; +diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c +index e500243..401300f 100644 +--- a/drivers/usb/core/devio.c ++++ b/drivers/usb/core/devio.c +@@ -187,7 +187,7 @@ static ssize_t usbdev_read(struct file *file, char __user *buf, size_t nbytes, + struct usb_dev_state *ps = file->private_data; + struct usb_device *dev = ps->dev; + ssize_t ret = 0; +- unsigned len; ++ size_t len; + loff_t pos; + int i; + +@@ -229,22 +229,22 @@ static ssize_t usbdev_read(struct file *file, char __user *buf, size_t nbytes, + for (i = 0; nbytes && i < dev->descriptor.bNumConfigurations; i++) { + struct usb_config_descriptor *config = + (struct usb_config_descriptor *)dev->rawdescriptors[i]; +- unsigned int length = le16_to_cpu(config->wTotalLength); ++ size_t length = le16_to_cpu(config->wTotalLength); + + if (*ppos < pos + length) { + + /* The descriptor may claim to be longer than it + * really is. Here is the actual allocated length. */ +- unsigned alloclen = ++ size_t alloclen = + le16_to_cpu(dev->config[i].desc.wTotalLength); + +- len = length - (*ppos - pos); ++ len = length + pos - *ppos; + if (len > nbytes) + len = nbytes; + + /* Simply don't write (skip over) unallocated parts */ + if (alloclen > (*ppos - pos)) { +- alloclen -= (*ppos - pos); ++ alloclen = alloclen + pos - *ppos; + if (copy_to_user(buf, + dev->rawdescriptors[i] + (*ppos - pos), + min(len, alloclen))) { +diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c +index 0009fc8..483f7e5 100644 +--- a/drivers/usb/core/hcd.c ++++ b/drivers/usb/core/hcd.c +@@ -1551,7 +1551,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags) + */ + usb_get_urb(urb); + atomic_inc(&urb->use_count); +- atomic_inc(&urb->dev->urbnum); ++ atomic_inc_unchecked(&urb->dev->urbnum); + usbmon_urb_submit(&hcd->self, urb); + + /* NOTE requirements on root-hub callers (usbfs and the hub +@@ -1578,7 +1578,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags) + urb->hcpriv = NULL; + INIT_LIST_HEAD(&urb->urb_list); + atomic_dec(&urb->use_count); +- atomic_dec(&urb->dev->urbnum); ++ atomic_dec_unchecked(&urb->dev->urbnum); + if (atomic_read(&urb->reject)) + wake_up(&usb_kill_urb_queue); + usb_put_urb(urb); +diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c +index 2246954..d75b0b1 100644 +--- a/drivers/usb/core/hub.c ++++ b/drivers/usb/core/hub.c +@@ -26,6 +26,7 @@ + #include <linux/mutex.h> + #include <linux/random.h> + #include <linux/pm_qos.h> ++#include <linux/grsecurity.h> + + #include <asm/uaccess.h> + #include <asm/byteorder.h> +@@ -4666,6 +4667,10 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, + goto done; + return; + } ++ ++ if (gr_handle_new_usb()) ++ goto done; ++ + if (hub_is_superspeed(hub->hdev)) + unit_load = 150; + else +diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c +index f368d20..0c30ac5 100644 +--- a/drivers/usb/core/message.c ++++ b/drivers/usb/core/message.c +@@ -128,7 +128,7 @@ static int usb_internal_control_msg(struct usb_device *usb_dev, + * Return: If successful, the number of bytes transferred. Otherwise, a negative + * error number. + */ +-int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, ++int __intentional_overflow(-1) usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, + __u8 requesttype, __u16 value, __u16 index, void *data, + __u16 size, int timeout) + { +@@ -180,7 +180,7 @@ EXPORT_SYMBOL_GPL(usb_control_msg); + * If successful, 0. Otherwise a negative error number. The number of actual + * bytes transferred will be stored in the @actual_length parameter. + */ +-int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, ++int __intentional_overflow(-1) usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, + void *data, int len, int *actual_length, int timeout) + { + return usb_bulk_msg(usb_dev, pipe, data, len, actual_length, timeout); +@@ -220,7 +220,7 @@ EXPORT_SYMBOL_GPL(usb_interrupt_msg); + * bytes transferred will be stored in the @actual_length parameter. + * + */ +-int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, ++int __intentional_overflow(-1) usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, + void *data, int len, int *actual_length, int timeout) + { + struct urb *urb; +diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c +index 1236c60..d47a51c 100644 +--- a/drivers/usb/core/sysfs.c ++++ b/drivers/usb/core/sysfs.c +@@ -244,7 +244,7 @@ static ssize_t urbnum_show(struct device *dev, struct device_attribute *attr, + struct usb_device *udev; + + udev = to_usb_device(dev); +- return sprintf(buf, "%d\n", atomic_read(&udev->urbnum)); ++ return sprintf(buf, "%d\n", atomic_read_unchecked(&udev->urbnum)); + } + static DEVICE_ATTR_RO(urbnum); + +diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c +index 29ee936..55e3f99 100644 +--- a/drivers/usb/core/usb.c ++++ b/drivers/usb/core/usb.c +@@ -433,7 +433,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, + set_dev_node(&dev->dev, dev_to_node(bus->controller)); + dev->state = USB_STATE_ATTACHED; + dev->lpm_disable_count = 1; +- atomic_set(&dev->urbnum, 0); ++ atomic_set_unchecked(&dev->urbnum, 0); + + INIT_LIST_HEAD(&dev->ep0.urb_list); + dev->ep0.desc.bLength = USB_DT_ENDPOINT_SIZE; +diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c +index 8cfc319..4868255 100644 +--- a/drivers/usb/early/ehci-dbgp.c ++++ b/drivers/usb/early/ehci-dbgp.c +@@ -98,7 +98,8 @@ static inline u32 dbgp_len_update(u32 x, u32 len) + + #ifdef CONFIG_KGDB + static struct kgdb_io kgdbdbgp_io_ops; +-#define dbgp_kgdb_mode (dbg_io_ops == &kgdbdbgp_io_ops) ++static struct kgdb_io kgdbdbgp_io_ops_console; ++#define dbgp_kgdb_mode (dbg_io_ops == &kgdbdbgp_io_ops || dbg_io_ops == &kgdbdbgp_io_ops_console) + #else + #define dbgp_kgdb_mode (0) + #endif +@@ -1043,6 +1044,13 @@ static struct kgdb_io kgdbdbgp_io_ops = { + .write_char = kgdbdbgp_write_char, + }; + ++static struct kgdb_io kgdbdbgp_io_ops_console = { ++ .name = "kgdbdbgp", ++ .read_char = kgdbdbgp_read_char, ++ .write_char = kgdbdbgp_write_char, ++ .is_console = 1 ++}; ++ + static int kgdbdbgp_wait_time; + + static int __init kgdbdbgp_parse_config(char *str) +@@ -1058,8 +1066,10 @@ static int __init kgdbdbgp_parse_config(char *str) + ptr++; + kgdbdbgp_wait_time = simple_strtoul(ptr, &ptr, 10); + } +- kgdb_register_io_module(&kgdbdbgp_io_ops); +- kgdbdbgp_io_ops.is_console = early_dbgp_console.index != -1; ++ if (early_dbgp_console.index != -1) ++ kgdb_register_io_module(&kgdbdbgp_io_ops_console); ++ else ++ kgdb_register_io_module(&kgdbdbgp_io_ops); + + return 0; + } +diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c +index f7b2032..fbb340c 100644 +--- a/drivers/usb/gadget/function/f_uac1.c ++++ b/drivers/usb/gadget/function/f_uac1.c +@@ -14,6 +14,7 @@ + #include <linux/module.h> + #include <linux/device.h> + #include <linux/atomic.h> ++#include <linux/module.h> + + #include "u_uac1.h" + +diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c +index 491082a..dfd7d17 100644 +--- a/drivers/usb/gadget/function/u_serial.c ++++ b/drivers/usb/gadget/function/u_serial.c +@@ -729,9 +729,9 @@ static int gs_open(struct tty_struct *tty, struct file *file) + spin_lock_irq(&port->port_lock); + + /* already open? Great. */ +- if (port->port.count) { ++ if (atomic_read(&port->port.count)) { + status = 0; +- port->port.count++; ++ atomic_inc(&port->port.count); + + /* currently opening/closing? wait ... */ + } else if (port->openclose) { +@@ -790,7 +790,7 @@ static int gs_open(struct tty_struct *tty, struct file *file) + tty->driver_data = port; + port->port.tty = tty; + +- port->port.count = 1; ++ atomic_set(&port->port.count, 1); + port->openclose = false; + + /* if connected, start the I/O stream */ +@@ -832,11 +832,11 @@ static void gs_close(struct tty_struct *tty, struct file *file) + + spin_lock_irq(&port->port_lock); + +- if (port->port.count != 1) { +- if (port->port.count == 0) ++ if (atomic_read(&port->port.count) != 1) { ++ if (atomic_read(&port->port.count) == 0) + WARN_ON(1); + else +- --port->port.count; ++ atomic_dec(&port->port.count); + goto exit; + } + +@@ -846,7 +846,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) + * and sleep if necessary + */ + port->openclose = true; +- port->port.count = 0; ++ atomic_set(&port->port.count, 0); + + gser = port->port_usb; + if (gser && gser->disconnect) +@@ -1062,7 +1062,7 @@ static int gs_closed(struct gs_port *port) + int cond; + + spin_lock_irq(&port->port_lock); +- cond = (port->port.count == 0) && !port->openclose; ++ cond = (atomic_read(&port->port.count) == 0) && !port->openclose; + spin_unlock_irq(&port->port_lock); + return cond; + } +@@ -1205,7 +1205,7 @@ int gserial_connect(struct gserial *gser, u8 port_num) + /* if it's already open, start I/O ... and notify the serial + * protocol about open/close status (connect/disconnect). + */ +- if (port->port.count) { ++ if (atomic_read(&port->port.count)) { + pr_debug("gserial_connect: start ttyGS%d\n", port->port_num); + gs_start_io(port); + if (gser->connect) +@@ -1252,7 +1252,7 @@ void gserial_disconnect(struct gserial *gser) + + port->port_usb = NULL; + gser->ioport = NULL; +- if (port->port.count > 0 || port->openclose) { ++ if (atomic_read(&port->port.count) > 0 || port->openclose) { + wake_up_interruptible(&port->drain_wait); + if (port->port.tty) + tty_hangup(port->port.tty); +@@ -1268,7 +1268,7 @@ void gserial_disconnect(struct gserial *gser) + + /* finally, free any unused/unusable I/O buffers */ + spin_lock_irqsave(&port->port_lock, flags); +- if (port->port.count == 0 && !port->openclose) ++ if (atomic_read(&port->port.count) == 0 && !port->openclose) + gs_buf_free(&port->port_write_buf); + gs_free_requests(gser->out, &port->read_pool, NULL); + gs_free_requests(gser->out, &port->read_queue, NULL); +diff --git a/drivers/usb/gadget/function/u_uac1.c b/drivers/usb/gadget/function/u_uac1.c +index a44a07f..ecea924 100644 +--- a/drivers/usb/gadget/function/u_uac1.c ++++ b/drivers/usb/gadget/function/u_uac1.c +@@ -17,6 +17,7 @@ + #include <linux/ctype.h> + #include <linux/random.h> + #include <linux/syscalls.h> ++#include <linux/module.h> + + #include "u_uac1.h" + +diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c +index 5728829..fefc6bf 100644 +--- a/drivers/usb/host/ehci-hub.c ++++ b/drivers/usb/host/ehci-hub.c +@@ -771,7 +771,7 @@ static struct urb *request_single_step_set_feature_urb( + urb->transfer_flags = URB_DIR_IN; + usb_get_urb(urb); + atomic_inc(&urb->use_count); +- atomic_inc(&urb->dev->urbnum); ++ atomic_inc_unchecked(&urb->dev->urbnum); + urb->setup_dma = dma_map_single( + hcd->self.controller, + urb->setup_packet, +@@ -838,7 +838,7 @@ static int ehset_single_step_set_feature(struct usb_hcd *hcd, int port) + urb->status = -EINPROGRESS; + usb_get_urb(urb); + atomic_inc(&urb->use_count); +- atomic_inc(&urb->dev->urbnum); ++ atomic_inc_unchecked(&urb->dev->urbnum); + retval = submit_single_step_set_feature(hcd, urb, 0); + if (!retval && !wait_for_completion_timeout(&done, + msecs_to_jiffies(2000))) { +diff --git a/drivers/usb/host/hwa-hc.c b/drivers/usb/host/hwa-hc.c +index 1db0626..4948782 100644 +--- a/drivers/usb/host/hwa-hc.c ++++ b/drivers/usb/host/hwa-hc.c +@@ -337,7 +337,10 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 stream_index, + struct hwahc *hwahc = container_of(wusbhc, struct hwahc, wusbhc); + struct wahc *wa = &hwahc->wa; + struct device *dev = &wa->usb_iface->dev; +- u8 mas_le[UWB_NUM_MAS/8]; ++ u8 *mas_le = kmalloc(UWB_NUM_MAS/8, GFP_KERNEL); ++ ++ if (mas_le == NULL) ++ return -ENOMEM; + + /* Set the stream index */ + result = usb_control_msg(wa->usb_dev, usb_sndctrlpipe(wa->usb_dev, 0), +@@ -356,10 +359,12 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 stream_index, + WUSB_REQ_SET_WUSB_MAS, + USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, +- mas_le, 32, USB_CTRL_SET_TIMEOUT); ++ mas_le, UWB_NUM_MAS/8, USB_CTRL_SET_TIMEOUT); + if (result < 0) + dev_err(dev, "Cannot set WUSB MAS allocation: %d\n", result); + out: ++ kfree(mas_le); ++ + return result; + } + +diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c +index b3d245e..99549ed 100644 +--- a/drivers/usb/misc/appledisplay.c ++++ b/drivers/usb/misc/appledisplay.c +@@ -84,7 +84,7 @@ struct appledisplay { + struct mutex sysfslock; /* concurrent read and write */ + }; + +-static atomic_t count_displays = ATOMIC_INIT(0); ++static atomic_unchecked_t count_displays = ATOMIC_INIT(0); + static struct workqueue_struct *wq; + + static void appledisplay_complete(struct urb *urb) +@@ -288,7 +288,7 @@ static int appledisplay_probe(struct usb_interface *iface, + + /* Register backlight device */ + snprintf(bl_name, sizeof(bl_name), "appledisplay%d", +- atomic_inc_return(&count_displays) - 1); ++ atomic_inc_return_unchecked(&count_displays) - 1); + memset(&props, 0, sizeof(struct backlight_properties)); + props.type = BACKLIGHT_RAW; + props.max_brightness = 0xff; +diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c +index 29fa1c3..a57b08e 100644 +--- a/drivers/usb/serial/console.c ++++ b/drivers/usb/serial/console.c +@@ -125,7 +125,7 @@ static int usb_console_setup(struct console *co, char *options) + + info->port = port; + +- ++port->port.count; ++ atomic_inc(&port->port.count); + if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags)) { + if (serial->type->set_termios) { + /* +@@ -173,7 +173,7 @@ static int usb_console_setup(struct console *co, char *options) + } + /* Now that any required fake tty operations are completed restore + * the tty port count */ +- --port->port.count; ++ atomic_dec(&port->port.count); + /* The console is special in terms of closing the device so + * indicate this port is now acting as a system console. */ + port->port.console = 1; +@@ -186,7 +186,7 @@ static int usb_console_setup(struct console *co, char *options) + put_tty: + tty_kref_put(tty); + reset_open_count: +- port->port.count = 0; ++ atomic_set(&port->port.count, 0); + usb_autopm_put_interface(serial->interface); + error_get_interface: + usb_serial_put(serial); +@@ -197,7 +197,7 @@ static int usb_console_setup(struct console *co, char *options) + static void usb_console_write(struct console *co, + const char *buf, unsigned count) + { +- static struct usbcons_info *info = &usbcons_info; ++ struct usbcons_info *info = &usbcons_info; + struct usb_serial_port *port = info->port; + struct usb_serial *serial; + int retval = -ENODEV; +diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h +index 307e339..6aa97cb 100644 +--- a/drivers/usb/storage/usb.h ++++ b/drivers/usb/storage/usb.h +@@ -63,7 +63,7 @@ struct us_unusual_dev { + __u8 useProtocol; + __u8 useTransport; + int (*initFunction)(struct us_data *); +-}; ++} __do_const; + + + /* Dynamic bitflag definitions (us->dflags): used in set_bit() etc. */ +diff --git a/drivers/usb/usbip/vhci.h b/drivers/usb/usbip/vhci.h +index a863a98..d272795 100644 +--- a/drivers/usb/usbip/vhci.h ++++ b/drivers/usb/usbip/vhci.h +@@ -83,7 +83,7 @@ struct vhci_hcd { + unsigned resuming:1; + unsigned long re_timeout; + +- atomic_t seqnum; ++ atomic_unchecked_t seqnum; + + /* + * NOTE: +diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c +index c02374b..32d47a9 100644 +--- a/drivers/usb/usbip/vhci_hcd.c ++++ b/drivers/usb/usbip/vhci_hcd.c +@@ -439,7 +439,7 @@ static void vhci_tx_urb(struct urb *urb) + + spin_lock(&vdev->priv_lock); + +- priv->seqnum = atomic_inc_return(&the_controller->seqnum); ++ priv->seqnum = atomic_inc_return_unchecked(&the_controller->seqnum); + if (priv->seqnum == 0xffff) + dev_info(&urb->dev->dev, "seqnum max\n"); + +@@ -686,7 +686,7 @@ static int vhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) + return -ENOMEM; + } + +- unlink->seqnum = atomic_inc_return(&the_controller->seqnum); ++ unlink->seqnum = atomic_inc_return_unchecked(&the_controller->seqnum); + if (unlink->seqnum == 0xffff) + pr_info("seqnum max\n"); + +@@ -891,7 +891,7 @@ static int vhci_start(struct usb_hcd *hcd) + vdev->rhport = rhport; + } + +- atomic_set(&vhci->seqnum, 0); ++ atomic_set_unchecked(&vhci->seqnum, 0); + spin_lock_init(&vhci->lock); + + hcd->power_budget = 0; /* no limit */ +diff --git a/drivers/usb/usbip/vhci_rx.c b/drivers/usb/usbip/vhci_rx.c +index 00e4a54..d676f85 100644 +--- a/drivers/usb/usbip/vhci_rx.c ++++ b/drivers/usb/usbip/vhci_rx.c +@@ -80,7 +80,7 @@ static void vhci_recv_ret_submit(struct vhci_device *vdev, + if (!urb) { + pr_err("cannot find a urb of seqnum %u\n", pdu->base.seqnum); + pr_info("max seqnum %d\n", +- atomic_read(&the_controller->seqnum)); ++ atomic_read_unchecked(&the_controller->seqnum)); + usbip_event_add(ud, VDEV_EVENT_ERROR_TCP); + return; + } +diff --git a/drivers/usb/wusbcore/wa-hc.h b/drivers/usb/wusbcore/wa-hc.h +index edc7267..9f65ce2 100644 +--- a/drivers/usb/wusbcore/wa-hc.h ++++ b/drivers/usb/wusbcore/wa-hc.h +@@ -240,7 +240,7 @@ struct wahc { + spinlock_t xfer_list_lock; + struct work_struct xfer_enqueue_work; + struct work_struct xfer_error_work; +- atomic_t xfer_id_count; ++ atomic_unchecked_t xfer_id_count; + + kernel_ulong_t quirks; + }; +@@ -305,7 +305,7 @@ static inline void wa_init(struct wahc *wa) + INIT_WORK(&wa->xfer_enqueue_work, wa_urb_enqueue_run); + INIT_WORK(&wa->xfer_error_work, wa_process_errored_transfers_run); + wa->dto_in_use = 0; +- atomic_set(&wa->xfer_id_count, 1); ++ atomic_set_unchecked(&wa->xfer_id_count, 1); + /* init the buf in URBs */ + for (index = 0; index < WA_MAX_BUF_IN_URBS; ++index) + usb_init_urb(&(wa->buf_in_urbs[index])); +diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c +index 69af4fd..da390d7 100644 +--- a/drivers/usb/wusbcore/wa-xfer.c ++++ b/drivers/usb/wusbcore/wa-xfer.c +@@ -314,7 +314,7 @@ static void wa_xfer_completion(struct wa_xfer *xfer) + */ + static void wa_xfer_id_init(struct wa_xfer *xfer) + { +- xfer->id = atomic_add_return(1, &xfer->wa->xfer_id_count); ++ xfer->id = atomic_add_return_unchecked(1, &xfer->wa->xfer_id_count); + } + + /* Return the xfer's ID. */ +diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c +index f018d8d..ccab63f 100644 +--- a/drivers/vfio/vfio.c ++++ b/drivers/vfio/vfio.c +@@ -481,7 +481,7 @@ static int vfio_group_nb_add_dev(struct vfio_group *group, struct device *dev) + return 0; + + /* TODO Prevent device auto probing */ +- WARN("Device %s added to live group %d!\n", dev_name(dev), ++ WARN(1, "Device %s added to live group %d!\n", dev_name(dev), + iommu_group_id(group->iommu_group)); + + return 0; +diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c +index 5174eba..451e6bc 100644 +--- a/drivers/vhost/vringh.c ++++ b/drivers/vhost/vringh.c +@@ -530,17 +530,17 @@ static inline void __vringh_notify_disable(struct vringh *vrh, + /* Userspace access helpers: in this case, addresses are really userspace. */ + static inline int getu16_user(u16 *val, const u16 *p) + { +- return get_user(*val, (__force u16 __user *)p); ++ return get_user(*val, (u16 __force_user *)p); + } + + static inline int putu16_user(u16 *p, u16 val) + { +- return put_user(val, (__force u16 __user *)p); ++ return put_user(val, (u16 __force_user *)p); + } + + static inline int copydesc_user(void *dst, const void *src, size_t len) + { +- return copy_from_user(dst, (__force void __user *)src, len) ? ++ return copy_from_user(dst, (void __force_user *)src, len) ? + -EFAULT : 0; + } + +@@ -548,19 +548,19 @@ static inline int putused_user(struct vring_used_elem *dst, + const struct vring_used_elem *src, + unsigned int num) + { +- return copy_to_user((__force void __user *)dst, src, ++ return copy_to_user((void __force_user *)dst, src, + sizeof(*dst) * num) ? -EFAULT : 0; + } + + static inline int xfer_from_user(void *src, void *dst, size_t len) + { +- return copy_from_user(dst, (__force void __user *)src, len) ? ++ return copy_from_user(dst, (void __force_user *)src, len) ? + -EFAULT : 0; + } + + static inline int xfer_to_user(void *dst, void *src, size_t len) + { +- return copy_to_user((__force void __user *)dst, src, len) ? ++ return copy_to_user((void __force_user *)dst, src, len) ? + -EFAULT : 0; + } + +@@ -596,9 +596,9 @@ int vringh_init_user(struct vringh *vrh, u32 features, + vrh->last_used_idx = 0; + vrh->vring.num = num; + /* vring expects kernel addresses, but only used via accessors. */ +- vrh->vring.desc = (__force struct vring_desc *)desc; +- vrh->vring.avail = (__force struct vring_avail *)avail; +- vrh->vring.used = (__force struct vring_used *)used; ++ vrh->vring.desc = (__force_kernel struct vring_desc *)desc; ++ vrh->vring.avail = (__force_kernel struct vring_avail *)avail; ++ vrh->vring.used = (__force_kernel struct vring_used *)used; + return 0; + } + EXPORT_SYMBOL(vringh_init_user); +@@ -800,7 +800,7 @@ static inline int getu16_kern(u16 *val, const u16 *p) + + static inline int putu16_kern(u16 *p, u16 val) + { +- ACCESS_ONCE(*p) = val; ++ ACCESS_ONCE_RW(*p) = val; + return 0; + } + +diff --git a/drivers/video/backlight/kb3886_bl.c b/drivers/video/backlight/kb3886_bl.c +index 84a110a..96312c3 100644 +--- a/drivers/video/backlight/kb3886_bl.c ++++ b/drivers/video/backlight/kb3886_bl.c +@@ -78,7 +78,7 @@ static struct kb3886bl_machinfo *bl_machinfo; + static unsigned long kb3886bl_flags; + #define KB3886BL_SUSPENDED 0x01 + +-static struct dmi_system_id kb3886bl_device_table[] __initdata = { ++static const struct dmi_system_id kb3886bl_device_table[] __initconst = { + { + .ident = "Sahara Touch-iT", + .matches = { +diff --git a/drivers/video/fbdev/arcfb.c b/drivers/video/fbdev/arcfb.c +index 1b0b233..6f34c2c 100644 +--- a/drivers/video/fbdev/arcfb.c ++++ b/drivers/video/fbdev/arcfb.c +@@ -458,7 +458,7 @@ static ssize_t arcfb_write(struct fb_info *info, const char __user *buf, + return -ENOSPC; + + err = 0; +- if ((count + p) > fbmemlength) { ++ if (count > (fbmemlength - p)) { + count = fbmemlength - p; + err = -ENOSPC; + } +diff --git a/drivers/video/fbdev/aty/aty128fb.c b/drivers/video/fbdev/aty/aty128fb.c +index aedf2fb..47c9aca 100644 +--- a/drivers/video/fbdev/aty/aty128fb.c ++++ b/drivers/video/fbdev/aty/aty128fb.c +@@ -149,7 +149,7 @@ enum { + }; + + /* Must match above enum */ +-static char * const r128_family[] = { ++static const char * const r128_family[] = { + "AGP", + "PCI", + "PRO AGP", +diff --git a/drivers/video/fbdev/aty/atyfb_base.c b/drivers/video/fbdev/aty/atyfb_base.c +index 37ec09b..98f8862 100644 +--- a/drivers/video/fbdev/aty/atyfb_base.c ++++ b/drivers/video/fbdev/aty/atyfb_base.c +@@ -1326,10 +1326,14 @@ static int atyfb_set_par(struct fb_info *info) + par->accel_flags = var->accel_flags; /* hack */ + + if (var->accel_flags) { +- info->fbops->fb_sync = atyfb_sync; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_sync = atyfb_sync; ++ pax_close_kernel(); + info->flags &= ~FBINFO_HWACCEL_DISABLED; + } else { +- info->fbops->fb_sync = NULL; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_sync = NULL; ++ pax_close_kernel(); + info->flags |= FBINFO_HWACCEL_DISABLED; + } + +diff --git a/drivers/video/fbdev/aty/mach64_cursor.c b/drivers/video/fbdev/aty/mach64_cursor.c +index 2fa0317..4983f2a 100644 +--- a/drivers/video/fbdev/aty/mach64_cursor.c ++++ b/drivers/video/fbdev/aty/mach64_cursor.c +@@ -8,6 +8,7 @@ + #include "../core/fb_draw.h" + + #include <asm/io.h> ++#include <asm/pgtable.h> + + #ifdef __sparc__ + #include <asm/fbio.h> +@@ -218,7 +219,9 @@ int aty_init_cursor(struct fb_info *info) + info->sprite.buf_align = 16; /* and 64 lines tall. */ + info->sprite.flags = FB_PIXMAP_IO; + +- info->fbops->fb_cursor = atyfb_cursor; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_cursor = atyfb_cursor; ++ pax_close_kernel(); + + return 0; + } +diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c +index d6cab1f..112f680 100644 +--- a/drivers/video/fbdev/core/fb_defio.c ++++ b/drivers/video/fbdev/core/fb_defio.c +@@ -207,7 +207,9 @@ void fb_deferred_io_init(struct fb_info *info) + + BUG_ON(!fbdefio); + mutex_init(&fbdefio->lock); +- info->fbops->fb_mmap = fb_deferred_io_mmap; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_mmap = fb_deferred_io_mmap; ++ pax_close_kernel(); + INIT_DELAYED_WORK(&info->deferred_work, fb_deferred_io_work); + INIT_LIST_HEAD(&fbdefio->pagelist); + if (fbdefio->delay == 0) /* set a default of 1 s */ +@@ -238,7 +240,7 @@ void fb_deferred_io_cleanup(struct fb_info *info) + page->mapping = NULL; + } + +- info->fbops->fb_mmap = NULL; ++ *(void **)&info->fbops->fb_mmap = NULL; + mutex_destroy(&fbdefio->lock); + } + EXPORT_SYMBOL_GPL(fb_deferred_io_cleanup); +diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c +index 0705d88..d9429bf 100644 +--- a/drivers/video/fbdev/core/fbmem.c ++++ b/drivers/video/fbdev/core/fbmem.c +@@ -1301,7 +1301,7 @@ static int do_fscreeninfo_to_user(struct fb_fix_screeninfo *fix, + __u32 data; + int err; + +- err = copy_to_user(&fix32->id, &fix->id, sizeof(fix32->id)); ++ err = copy_to_user(fix32->id, &fix->id, sizeof(fix32->id)); + + data = (__u32) (unsigned long) fix->smem_start; + err |= put_user(data, &fix32->smem_start); +diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c +index 4254336..282567e 100644 +--- a/drivers/video/fbdev/hyperv_fb.c ++++ b/drivers/video/fbdev/hyperv_fb.c +@@ -240,7 +240,7 @@ static uint screen_fb_size; + static inline int synthvid_send(struct hv_device *hdev, + struct synthvid_msg *msg) + { +- static atomic64_t request_id = ATOMIC64_INIT(0); ++ static atomic64_unchecked_t request_id = ATOMIC64_INIT(0); + int ret; + + msg->pipe_hdr.type = PIPE_MSG_DATA; +@@ -248,7 +248,7 @@ static inline int synthvid_send(struct hv_device *hdev, + + ret = vmbus_sendpacket(hdev->channel, msg, + msg->vid_hdr.size + sizeof(struct pipe_msg_hdr), +- atomic64_inc_return(&request_id), ++ atomic64_inc_return_unchecked(&request_id), + VM_PKT_DATA_INBAND, 0); + + if (ret) +diff --git a/drivers/video/fbdev/i810/i810_accel.c b/drivers/video/fbdev/i810/i810_accel.c +index 7672d2e..b56437f 100644 +--- a/drivers/video/fbdev/i810/i810_accel.c ++++ b/drivers/video/fbdev/i810/i810_accel.c +@@ -73,6 +73,7 @@ static inline int wait_for_space(struct fb_info *info, u32 space) + } + } + printk("ringbuffer lockup!!!\n"); ++ printk("head:%u tail:%u iring.size:%u space:%u\n", head, tail, par->iring.size, space); + i810_report_error(mmio); + par->dev_flags |= LOCKUP; + info->pixmap.scan_align = 1; +diff --git a/drivers/video/fbdev/matrox/matroxfb_DAC1064.c b/drivers/video/fbdev/matrox/matroxfb_DAC1064.c +index a01147f..5d896f8 100644 +--- a/drivers/video/fbdev/matrox/matroxfb_DAC1064.c ++++ b/drivers/video/fbdev/matrox/matroxfb_DAC1064.c +@@ -1088,14 +1088,20 @@ static void MGAG100_restore(struct matrox_fb_info *minfo) + + #ifdef CONFIG_FB_MATROX_MYSTIQUE + struct matrox_switch matrox_mystique = { +- MGA1064_preinit, MGA1064_reset, MGA1064_init, MGA1064_restore, ++ .preinit = MGA1064_preinit, ++ .reset = MGA1064_reset, ++ .init = MGA1064_init, ++ .restore = MGA1064_restore, + }; + EXPORT_SYMBOL(matrox_mystique); + #endif + + #ifdef CONFIG_FB_MATROX_G + struct matrox_switch matrox_G100 = { +- MGAG100_preinit, MGAG100_reset, MGAG100_init, MGAG100_restore, ++ .preinit = MGAG100_preinit, ++ .reset = MGAG100_reset, ++ .init = MGAG100_init, ++ .restore = MGAG100_restore, + }; + EXPORT_SYMBOL(matrox_G100); + #endif +diff --git a/drivers/video/fbdev/matrox/matroxfb_Ti3026.c b/drivers/video/fbdev/matrox/matroxfb_Ti3026.c +index 195ad7c..09743fc 100644 +--- a/drivers/video/fbdev/matrox/matroxfb_Ti3026.c ++++ b/drivers/video/fbdev/matrox/matroxfb_Ti3026.c +@@ -738,7 +738,10 @@ static int Ti3026_preinit(struct matrox_fb_info *minfo) + } + + struct matrox_switch matrox_millennium = { +- Ti3026_preinit, Ti3026_reset, Ti3026_init, Ti3026_restore ++ .preinit = Ti3026_preinit, ++ .reset = Ti3026_reset, ++ .init = Ti3026_init, ++ .restore = Ti3026_restore + }; + EXPORT_SYMBOL(matrox_millennium); + #endif +diff --git a/drivers/video/fbdev/mb862xx/mb862xxfb_accel.c b/drivers/video/fbdev/mb862xx/mb862xxfb_accel.c +index fe92eed..106e085 100644 +--- a/drivers/video/fbdev/mb862xx/mb862xxfb_accel.c ++++ b/drivers/video/fbdev/mb862xx/mb862xxfb_accel.c +@@ -312,14 +312,18 @@ void mb862xxfb_init_accel(struct fb_info *info, int xres) + struct mb862xxfb_par *par = info->par; + + if (info->var.bits_per_pixel == 32) { +- info->fbops->fb_fillrect = cfb_fillrect; +- info->fbops->fb_copyarea = cfb_copyarea; +- info->fbops->fb_imageblit = cfb_imageblit; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_fillrect = cfb_fillrect; ++ *(void **)&info->fbops->fb_copyarea = cfb_copyarea; ++ *(void **)&info->fbops->fb_imageblit = cfb_imageblit; ++ pax_close_kernel(); + } else { + outreg(disp, GC_L0EM, 3); +- info->fbops->fb_fillrect = mb86290fb_fillrect; +- info->fbops->fb_copyarea = mb86290fb_copyarea; +- info->fbops->fb_imageblit = mb86290fb_imageblit; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_fillrect = mb86290fb_fillrect; ++ *(void **)&info->fbops->fb_copyarea = mb86290fb_copyarea; ++ *(void **)&info->fbops->fb_imageblit = mb86290fb_imageblit; ++ pax_close_kernel(); + } + outreg(draw, GDC_REG_DRAW_BASE, 0); + outreg(draw, GDC_REG_MODE_MISC, 0x8000); +diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c +index def0412..fed6529 100644 +--- a/drivers/video/fbdev/nvidia/nvidia.c ++++ b/drivers/video/fbdev/nvidia/nvidia.c +@@ -669,19 +669,23 @@ static int nvidiafb_set_par(struct fb_info *info) + info->fix.line_length = (info->var.xres_virtual * + info->var.bits_per_pixel) >> 3; + if (info->var.accel_flags) { +- info->fbops->fb_imageblit = nvidiafb_imageblit; +- info->fbops->fb_fillrect = nvidiafb_fillrect; +- info->fbops->fb_copyarea = nvidiafb_copyarea; +- info->fbops->fb_sync = nvidiafb_sync; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_imageblit = nvidiafb_imageblit; ++ *(void **)&info->fbops->fb_fillrect = nvidiafb_fillrect; ++ *(void **)&info->fbops->fb_copyarea = nvidiafb_copyarea; ++ *(void **)&info->fbops->fb_sync = nvidiafb_sync; ++ pax_close_kernel(); + info->pixmap.scan_align = 4; + info->flags &= ~FBINFO_HWACCEL_DISABLED; + info->flags |= FBINFO_READS_FAST; + NVResetGraphics(info); + } else { +- info->fbops->fb_imageblit = cfb_imageblit; +- info->fbops->fb_fillrect = cfb_fillrect; +- info->fbops->fb_copyarea = cfb_copyarea; +- info->fbops->fb_sync = NULL; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_imageblit = cfb_imageblit; ++ *(void **)&info->fbops->fb_fillrect = cfb_fillrect; ++ *(void **)&info->fbops->fb_copyarea = cfb_copyarea; ++ *(void **)&info->fbops->fb_sync = NULL; ++ pax_close_kernel(); + info->pixmap.scan_align = 1; + info->flags |= FBINFO_HWACCEL_DISABLED; + info->flags &= ~FBINFO_READS_FAST; +@@ -1173,8 +1177,11 @@ static int nvidia_set_fbinfo(struct fb_info *info) + info->pixmap.size = 8 * 1024; + info->pixmap.flags = FB_PIXMAP_SYSTEM; + +- if (!hwcur) +- info->fbops->fb_cursor = NULL; ++ if (!hwcur) { ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_cursor = NULL; ++ pax_close_kernel(); ++ } + + info->var.accel_flags = (!noaccel); + +diff --git a/drivers/video/fbdev/omap2/dss/display.c b/drivers/video/fbdev/omap2/dss/display.c +index 2412a0d..294215b 100644 +--- a/drivers/video/fbdev/omap2/dss/display.c ++++ b/drivers/video/fbdev/omap2/dss/display.c +@@ -161,12 +161,14 @@ int omapdss_register_display(struct omap_dss_device *dssdev) + if (dssdev->name == NULL) + dssdev->name = dssdev->alias; + ++ pax_open_kernel(); + if (drv && drv->get_resolution == NULL) +- drv->get_resolution = omapdss_default_get_resolution; ++ *(void **)&drv->get_resolution = omapdss_default_get_resolution; + if (drv && drv->get_recommended_bpp == NULL) +- drv->get_recommended_bpp = omapdss_default_get_recommended_bpp; ++ *(void **)&drv->get_recommended_bpp = omapdss_default_get_recommended_bpp; + if (drv && drv->get_timings == NULL) +- drv->get_timings = omapdss_default_get_timings; ++ *(void **)&drv->get_timings = omapdss_default_get_timings; ++ pax_close_kernel(); + + mutex_lock(&panel_list_mutex); + list_add_tail(&dssdev->panel_list, &panel_list); +diff --git a/drivers/video/fbdev/s1d13xxxfb.c b/drivers/video/fbdev/s1d13xxxfb.c +index 83433cb..71e9b98 100644 +--- a/drivers/video/fbdev/s1d13xxxfb.c ++++ b/drivers/video/fbdev/s1d13xxxfb.c +@@ -881,8 +881,10 @@ static int s1d13xxxfb_probe(struct platform_device *pdev) + + switch(prod_id) { + case S1D13506_PROD_ID: /* activate acceleration */ +- s1d13xxxfb_fbops.fb_fillrect = s1d13xxxfb_bitblt_solidfill; +- s1d13xxxfb_fbops.fb_copyarea = s1d13xxxfb_bitblt_copyarea; ++ pax_open_kernel(); ++ *(void **)&s1d13xxxfb_fbops.fb_fillrect = s1d13xxxfb_bitblt_solidfill; ++ *(void **)&s1d13xxxfb_fbops.fb_copyarea = s1d13xxxfb_bitblt_copyarea; ++ pax_close_kernel(); + info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN | + FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_COPYAREA; + break; +diff --git a/drivers/video/fbdev/sh_mobile_lcdcfb.c b/drivers/video/fbdev/sh_mobile_lcdcfb.c +index 2bcc84a..29dd1ea 100644 +--- a/drivers/video/fbdev/sh_mobile_lcdcfb.c ++++ b/drivers/video/fbdev/sh_mobile_lcdcfb.c +@@ -439,9 +439,9 @@ static unsigned long lcdc_sys_read_data(void *handle) + } + + static struct sh_mobile_lcdc_sys_bus_ops sh_mobile_lcdc_sys_bus_ops = { +- lcdc_sys_write_index, +- lcdc_sys_write_data, +- lcdc_sys_read_data, ++ .write_index = lcdc_sys_write_index, ++ .write_data = lcdc_sys_write_data, ++ .read_data = lcdc_sys_read_data, + }; + + static int sh_mobile_lcdc_sginit(struct fb_info *info, +diff --git a/drivers/video/fbdev/smscufx.c b/drivers/video/fbdev/smscufx.c +index d513ed6..90b0de9 100644 +--- a/drivers/video/fbdev/smscufx.c ++++ b/drivers/video/fbdev/smscufx.c +@@ -1175,7 +1175,9 @@ static int ufx_ops_release(struct fb_info *info, int user) + fb_deferred_io_cleanup(info); + kfree(info->fbdefio); + info->fbdefio = NULL; +- info->fbops->fb_mmap = ufx_ops_mmap; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_mmap = ufx_ops_mmap; ++ pax_close_kernel(); + } + + pr_debug("released /dev/fb%d user=%d count=%d", +diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c +index 046d51d..be564da 100644 +--- a/drivers/video/fbdev/udlfb.c ++++ b/drivers/video/fbdev/udlfb.c +@@ -623,11 +623,11 @@ static int dlfb_handle_damage(struct dlfb_data *dev, int x, int y, + dlfb_urb_completion(urb); + + error: +- atomic_add(bytes_sent, &dev->bytes_sent); +- atomic_add(bytes_identical, &dev->bytes_identical); +- atomic_add(width*height*2, &dev->bytes_rendered); ++ atomic_add_unchecked(bytes_sent, &dev->bytes_sent); ++ atomic_add_unchecked(bytes_identical, &dev->bytes_identical); ++ atomic_add_unchecked(width*height*2, &dev->bytes_rendered); + end_cycles = get_cycles(); +- atomic_add(((unsigned int) ((end_cycles - start_cycles) ++ atomic_add_unchecked(((unsigned int) ((end_cycles - start_cycles) + >> 10)), /* Kcycles */ + &dev->cpu_kcycles_used); + +@@ -748,11 +748,11 @@ static void dlfb_dpy_deferred_io(struct fb_info *info, + dlfb_urb_completion(urb); + + error: +- atomic_add(bytes_sent, &dev->bytes_sent); +- atomic_add(bytes_identical, &dev->bytes_identical); +- atomic_add(bytes_rendered, &dev->bytes_rendered); ++ atomic_add_unchecked(bytes_sent, &dev->bytes_sent); ++ atomic_add_unchecked(bytes_identical, &dev->bytes_identical); ++ atomic_add_unchecked(bytes_rendered, &dev->bytes_rendered); + end_cycles = get_cycles(); +- atomic_add(((unsigned int) ((end_cycles - start_cycles) ++ atomic_add_unchecked(((unsigned int) ((end_cycles - start_cycles) + >> 10)), /* Kcycles */ + &dev->cpu_kcycles_used); + } +@@ -993,7 +993,9 @@ static int dlfb_ops_release(struct fb_info *info, int user) + fb_deferred_io_cleanup(info); + kfree(info->fbdefio); + info->fbdefio = NULL; +- info->fbops->fb_mmap = dlfb_ops_mmap; ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_mmap = dlfb_ops_mmap; ++ pax_close_kernel(); + } + + pr_warn("released /dev/fb%d user=%d count=%d\n", +@@ -1376,7 +1378,7 @@ static ssize_t metrics_bytes_rendered_show(struct device *fbdev, + struct fb_info *fb_info = dev_get_drvdata(fbdev); + struct dlfb_data *dev = fb_info->par; + return snprintf(buf, PAGE_SIZE, "%u\n", +- atomic_read(&dev->bytes_rendered)); ++ atomic_read_unchecked(&dev->bytes_rendered)); + } + + static ssize_t metrics_bytes_identical_show(struct device *fbdev, +@@ -1384,7 +1386,7 @@ static ssize_t metrics_bytes_identical_show(struct device *fbdev, + struct fb_info *fb_info = dev_get_drvdata(fbdev); + struct dlfb_data *dev = fb_info->par; + return snprintf(buf, PAGE_SIZE, "%u\n", +- atomic_read(&dev->bytes_identical)); ++ atomic_read_unchecked(&dev->bytes_identical)); + } + + static ssize_t metrics_bytes_sent_show(struct device *fbdev, +@@ -1392,7 +1394,7 @@ static ssize_t metrics_bytes_sent_show(struct device *fbdev, + struct fb_info *fb_info = dev_get_drvdata(fbdev); + struct dlfb_data *dev = fb_info->par; + return snprintf(buf, PAGE_SIZE, "%u\n", +- atomic_read(&dev->bytes_sent)); ++ atomic_read_unchecked(&dev->bytes_sent)); + } + + static ssize_t metrics_cpu_kcycles_used_show(struct device *fbdev, +@@ -1400,7 +1402,7 @@ static ssize_t metrics_cpu_kcycles_used_show(struct device *fbdev, + struct fb_info *fb_info = dev_get_drvdata(fbdev); + struct dlfb_data *dev = fb_info->par; + return snprintf(buf, PAGE_SIZE, "%u\n", +- atomic_read(&dev->cpu_kcycles_used)); ++ atomic_read_unchecked(&dev->cpu_kcycles_used)); + } + + static ssize_t edid_show( +@@ -1460,10 +1462,10 @@ static ssize_t metrics_reset_store(struct device *fbdev, + struct fb_info *fb_info = dev_get_drvdata(fbdev); + struct dlfb_data *dev = fb_info->par; + +- atomic_set(&dev->bytes_rendered, 0); +- atomic_set(&dev->bytes_identical, 0); +- atomic_set(&dev->bytes_sent, 0); +- atomic_set(&dev->cpu_kcycles_used, 0); ++ atomic_set_unchecked(&dev->bytes_rendered, 0); ++ atomic_set_unchecked(&dev->bytes_identical, 0); ++ atomic_set_unchecked(&dev->bytes_sent, 0); ++ atomic_set_unchecked(&dev->cpu_kcycles_used, 0); + + return count; + } +diff --git a/drivers/video/fbdev/uvesafb.c b/drivers/video/fbdev/uvesafb.c +index 509d452..7c9d2de 100644 +--- a/drivers/video/fbdev/uvesafb.c ++++ b/drivers/video/fbdev/uvesafb.c +@@ -19,6 +19,7 @@ + #include <linux/io.h> + #include <linux/mutex.h> + #include <linux/slab.h> ++#include <linux/moduleloader.h> + #include <video/edid.h> + #include <video/uvesafb.h> + #ifdef CONFIG_X86 +@@ -565,10 +566,32 @@ static int uvesafb_vbe_getpmi(struct uvesafb_ktask *task, + if ((task->t.regs.eax & 0xffff) != 0x4f || task->t.regs.es < 0xc000) { + par->pmi_setpal = par->ypan = 0; + } else { ++ ++#ifdef CONFIG_PAX_KERNEXEC ++#ifdef CONFIG_MODULES ++ par->pmi_code = module_alloc_exec((u16)task->t.regs.ecx); ++#endif ++ if (!par->pmi_code) { ++ par->pmi_setpal = par->ypan = 0; ++ return 0; ++ } ++#endif ++ + par->pmi_base = (u16 *)phys_to_virt(((u32)task->t.regs.es << 4) + + task->t.regs.edi); ++ ++#if defined(CONFIG_MODULES) && defined(CONFIG_PAX_KERNEXEC) ++ pax_open_kernel(); ++ memcpy(par->pmi_code, par->pmi_base, (u16)task->t.regs.ecx); ++ pax_close_kernel(); ++ ++ par->pmi_start = ktva_ktla(par->pmi_code + par->pmi_base[1]); ++ par->pmi_pal = ktva_ktla(par->pmi_code + par->pmi_base[2]); ++#else + par->pmi_start = (u8 *)par->pmi_base + par->pmi_base[1]; + par->pmi_pal = (u8 *)par->pmi_base + par->pmi_base[2]; ++#endif ++ + printk(KERN_INFO "uvesafb: protected mode interface info at " + "%04x:%04x\n", + (u16)task->t.regs.es, (u16)task->t.regs.edi); +@@ -813,13 +836,14 @@ static int uvesafb_vbe_init(struct fb_info *info) + par->ypan = ypan; + + if (par->pmi_setpal || par->ypan) { ++#if !defined(CONFIG_MODULES) || !defined(CONFIG_PAX_KERNEXEC) + if (__supported_pte_mask & _PAGE_NX) { + par->pmi_setpal = par->ypan = 0; + printk(KERN_WARNING "uvesafb: NX protection is active, " + "better not use the PMI.\n"); +- } else { ++ } else ++#endif + uvesafb_vbe_getpmi(task, par); +- } + } + #else + /* The protected mode interface is not available on non-x86. */ +@@ -1453,8 +1477,11 @@ static void uvesafb_init_info(struct fb_info *info, struct vbe_mode_ib *mode) + info->fix.ywrapstep = (par->ypan > 1) ? 1 : 0; + + /* Disable blanking if the user requested so. */ +- if (!blank) +- info->fbops->fb_blank = NULL; ++ if (!blank) { ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_blank = NULL; ++ pax_close_kernel(); ++ } + + /* + * Find out how much IO memory is required for the mode with +@@ -1525,8 +1552,11 @@ static void uvesafb_init_info(struct fb_info *info, struct vbe_mode_ib *mode) + info->flags = FBINFO_FLAG_DEFAULT | + (par->ypan ? FBINFO_HWACCEL_YPAN : 0); + +- if (!par->ypan) +- info->fbops->fb_pan_display = NULL; ++ if (!par->ypan) { ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_pan_display = NULL; ++ pax_close_kernel(); ++ } + } + + static void uvesafb_init_mtrr(struct fb_info *info) +@@ -1787,6 +1817,11 @@ out_mode: + out: + kfree(par->vbe_modes); + ++#if defined(CONFIG_MODULES) && defined(CONFIG_PAX_KERNEXEC) ++ if (par->pmi_code) ++ module_free_exec(NULL, par->pmi_code); ++#endif ++ + framebuffer_release(info); + return err; + } +@@ -1811,6 +1846,11 @@ static int uvesafb_remove(struct platform_device *dev) + kfree(par->vbe_state_orig); + kfree(par->vbe_state_saved); + ++#if defined(CONFIG_MODULES) && defined(CONFIG_PAX_KERNEXEC) ++ if (par->pmi_code) ++ module_free_exec(NULL, par->pmi_code); ++#endif ++ + framebuffer_release(info); + } + return 0; +diff --git a/drivers/video/fbdev/vesafb.c b/drivers/video/fbdev/vesafb.c +index 6170e7f..dd63031 100644 +--- a/drivers/video/fbdev/vesafb.c ++++ b/drivers/video/fbdev/vesafb.c +@@ -9,6 +9,7 @@ + */ + + #include <linux/module.h> ++#include <linux/moduleloader.h> + #include <linux/kernel.h> + #include <linux/errno.h> + #include <linux/string.h> +@@ -52,8 +53,8 @@ static int vram_remap; /* Set amount of memory to be used */ + static int vram_total; /* Set total amount of memory */ + static int pmi_setpal __read_mostly = 1; /* pmi for palette changes ??? */ + static int ypan __read_mostly; /* 0..nothing, 1..ypan, 2..ywrap */ +-static void (*pmi_start)(void) __read_mostly; +-static void (*pmi_pal) (void) __read_mostly; ++static void (*pmi_start)(void) __read_only; ++static void (*pmi_pal) (void) __read_only; + static int depth __read_mostly; + static int vga_compat __read_mostly; + /* --------------------------------------------------------------------- */ +@@ -233,6 +234,7 @@ static int vesafb_probe(struct platform_device *dev) + unsigned int size_remap; + unsigned int size_total; + char *option = NULL; ++ void *pmi_code = NULL; + + /* ignore error return of fb_get_options */ + fb_get_options("vesafb", &option); +@@ -279,10 +281,6 @@ static int vesafb_probe(struct platform_device *dev) + size_remap = size_total; + vesafb_fix.smem_len = size_remap; + +-#ifndef __i386__ +- screen_info.vesapm_seg = 0; +-#endif +- + if (!request_mem_region(vesafb_fix.smem_start, size_total, "vesafb")) { + printk(KERN_WARNING + "vesafb: cannot reserve video memory at 0x%lx\n", +@@ -312,9 +310,21 @@ static int vesafb_probe(struct platform_device *dev) + printk(KERN_INFO "vesafb: mode is %dx%dx%d, linelength=%d, pages=%d\n", + vesafb_defined.xres, vesafb_defined.yres, vesafb_defined.bits_per_pixel, vesafb_fix.line_length, screen_info.pages); + ++#ifdef __i386__ ++ ++#if defined(CONFIG_MODULES) && defined(CONFIG_PAX_KERNEXEC) ++ pmi_code = module_alloc_exec(screen_info.vesapm_size); ++ if (!pmi_code) ++#elif !defined(CONFIG_PAX_KERNEXEC) ++ if (0) ++#endif ++ ++#endif ++ screen_info.vesapm_seg = 0; ++ + if (screen_info.vesapm_seg) { +- printk(KERN_INFO "vesafb: protected mode interface info at %04x:%04x\n", +- screen_info.vesapm_seg,screen_info.vesapm_off); ++ printk(KERN_INFO "vesafb: protected mode interface info at %04x:%04x %04x bytes\n", ++ screen_info.vesapm_seg,screen_info.vesapm_off,screen_info.vesapm_size); + } + + if (screen_info.vesapm_seg < 0xc000) +@@ -322,9 +332,25 @@ static int vesafb_probe(struct platform_device *dev) + + if (ypan || pmi_setpal) { + unsigned short *pmi_base; ++ + pmi_base = (unsigned short*)phys_to_virt(((unsigned long)screen_info.vesapm_seg << 4) + screen_info.vesapm_off); +- pmi_start = (void*)((char*)pmi_base + pmi_base[1]); +- pmi_pal = (void*)((char*)pmi_base + pmi_base[2]); ++ ++#if defined(CONFIG_MODULES) && defined(CONFIG_PAX_KERNEXEC) ++ pax_open_kernel(); ++ memcpy(pmi_code, pmi_base, screen_info.vesapm_size); ++#else ++ pmi_code = pmi_base; ++#endif ++ ++ pmi_start = (void*)((char*)pmi_code + pmi_base[1]); ++ pmi_pal = (void*)((char*)pmi_code + pmi_base[2]); ++ ++#if defined(CONFIG_MODULES) && defined(CONFIG_PAX_KERNEXEC) ++ pmi_start = ktva_ktla(pmi_start); ++ pmi_pal = ktva_ktla(pmi_pal); ++ pax_close_kernel(); ++#endif ++ + printk(KERN_INFO "vesafb: pmi: set display start = %p, set palette = %p\n",pmi_start,pmi_pal); + if (pmi_base[3]) { + printk(KERN_INFO "vesafb: pmi: ports = "); +@@ -477,8 +503,11 @@ static int vesafb_probe(struct platform_device *dev) + info->flags = FBINFO_FLAG_DEFAULT | FBINFO_MISC_FIRMWARE | + (ypan ? FBINFO_HWACCEL_YPAN : 0); + +- if (!ypan) +- info->fbops->fb_pan_display = NULL; ++ if (!ypan) { ++ pax_open_kernel(); ++ *(void **)&info->fbops->fb_pan_display = NULL; ++ pax_close_kernel(); ++ } + + if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { + err = -ENOMEM; +@@ -492,6 +521,11 @@ static int vesafb_probe(struct platform_device *dev) + fb_info(info, "%s frame buffer device\n", info->fix.id); + return 0; + err: ++ ++#if defined(__i386__) && defined(CONFIG_MODULES) && defined(CONFIG_PAX_KERNEXEC) ++ module_free_exec(NULL, pmi_code); ++#endif ++ + if (info->screen_base) + iounmap(info->screen_base); + framebuffer_release(info); +diff --git a/drivers/video/fbdev/via/via_clock.h b/drivers/video/fbdev/via/via_clock.h +index 88714ae..16c2e11 100644 +--- a/drivers/video/fbdev/via/via_clock.h ++++ b/drivers/video/fbdev/via/via_clock.h +@@ -56,7 +56,7 @@ struct via_clock { + + void (*set_engine_pll_state)(u8 state); + void (*set_engine_pll)(struct via_pll_config config); +-}; ++} __no_const; + + + static inline u32 get_pll_internal_frequency(u32 ref_freq, +diff --git a/drivers/video/logo/logo_linux_clut224.ppm b/drivers/video/logo/logo_linux_clut224.ppm +index 3c14e43..2630570 100644 +--- a/drivers/video/logo/logo_linux_clut224.ppm ++++ b/drivers/video/logo/logo_linux_clut224.ppm +@@ -2,1603 +2,1123 @@ P3 + # Standard 224-color Linux logo + 80 80 + 255 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 6 6 6 10 10 10 10 10 10 +- 10 10 10 6 6 6 6 6 6 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 6 6 6 10 10 10 14 14 14 +- 22 22 22 26 26 26 30 30 30 34 34 34 +- 30 30 30 30 30 30 26 26 26 18 18 18 +- 14 14 14 10 10 10 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 1 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 14 14 14 26 26 26 42 42 42 +- 54 54 54 66 66 66 78 78 78 78 78 78 +- 78 78 78 74 74 74 66 66 66 54 54 54 +- 42 42 42 26 26 26 18 18 18 10 10 10 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 1 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 22 22 22 42 42 42 66 66 66 86 86 86 +- 66 66 66 38 38 38 38 38 38 22 22 22 +- 26 26 26 34 34 34 54 54 54 66 66 66 +- 86 86 86 70 70 70 46 46 46 26 26 26 +- 14 14 14 6 6 6 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 1 0 0 1 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 10 10 10 26 26 26 +- 50 50 50 82 82 82 58 58 58 6 6 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 6 6 6 54 54 54 86 86 86 66 66 66 +- 38 38 38 18 18 18 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 6 6 6 22 22 22 50 50 50 +- 78 78 78 34 34 34 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 6 6 6 70 70 70 +- 78 78 78 46 46 46 22 22 22 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 1 0 0 1 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 18 18 18 42 42 42 82 82 82 +- 26 26 26 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 14 14 14 +- 46 46 46 34 34 34 6 6 6 2 2 6 +- 42 42 42 78 78 78 42 42 42 18 18 18 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 1 0 0 0 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 10 10 10 30 30 30 66 66 66 58 58 58 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 26 26 26 +- 86 86 86 101 101 101 46 46 46 10 10 10 +- 2 2 6 58 58 58 70 70 70 34 34 34 +- 10 10 10 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 1 0 0 1 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 14 14 14 42 42 42 86 86 86 10 10 10 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 30 30 30 +- 94 94 94 94 94 94 58 58 58 26 26 26 +- 2 2 6 6 6 6 78 78 78 54 54 54 +- 22 22 22 6 6 6 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 22 22 22 62 62 62 62 62 62 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 26 26 26 +- 54 54 54 38 38 38 18 18 18 10 10 10 +- 2 2 6 2 2 6 34 34 34 82 82 82 +- 38 38 38 14 14 14 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 1 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 30 30 30 78 78 78 30 30 30 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 10 10 10 +- 10 10 10 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 78 78 78 +- 50 50 50 18 18 18 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 1 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 38 38 38 86 86 86 14 14 14 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 54 54 54 +- 66 66 66 26 26 26 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 1 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 42 42 42 82 82 82 2 2 6 2 2 6 +- 2 2 6 6 6 6 10 10 10 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 6 6 6 +- 14 14 14 10 10 10 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 18 18 18 +- 82 82 82 34 34 34 10 10 10 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 1 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 46 46 46 86 86 86 2 2 6 2 2 6 +- 6 6 6 6 6 6 22 22 22 34 34 34 +- 6 6 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 18 18 18 34 34 34 +- 10 10 10 50 50 50 22 22 22 2 2 6 +- 2 2 6 2 2 6 2 2 6 10 10 10 +- 86 86 86 42 42 42 14 14 14 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 1 0 0 1 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 46 46 46 86 86 86 2 2 6 2 2 6 +- 38 38 38 116 116 116 94 94 94 22 22 22 +- 22 22 22 2 2 6 2 2 6 2 2 6 +- 14 14 14 86 86 86 138 138 138 162 162 162 +-154 154 154 38 38 38 26 26 26 6 6 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 86 86 86 46 46 46 14 14 14 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 46 46 46 86 86 86 2 2 6 14 14 14 +-134 134 134 198 198 198 195 195 195 116 116 116 +- 10 10 10 2 2 6 2 2 6 6 6 6 +-101 98 89 187 187 187 210 210 210 218 218 218 +-214 214 214 134 134 134 14 14 14 6 6 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 86 86 86 50 50 50 18 18 18 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 1 0 0 0 +- 0 0 1 0 0 1 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 46 46 46 86 86 86 2 2 6 54 54 54 +-218 218 218 195 195 195 226 226 226 246 246 246 +- 58 58 58 2 2 6 2 2 6 30 30 30 +-210 210 210 253 253 253 174 174 174 123 123 123 +-221 221 221 234 234 234 74 74 74 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 70 70 70 58 58 58 22 22 22 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 46 46 46 82 82 82 2 2 6 106 106 106 +-170 170 170 26 26 26 86 86 86 226 226 226 +-123 123 123 10 10 10 14 14 14 46 46 46 +-231 231 231 190 190 190 6 6 6 70 70 70 +- 90 90 90 238 238 238 158 158 158 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 70 70 70 58 58 58 22 22 22 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 1 0 0 0 +- 0 0 1 0 0 1 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 42 42 42 86 86 86 6 6 6 116 116 116 +-106 106 106 6 6 6 70 70 70 149 149 149 +-128 128 128 18 18 18 38 38 38 54 54 54 +-221 221 221 106 106 106 2 2 6 14 14 14 +- 46 46 46 190 190 190 198 198 198 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 74 74 74 62 62 62 22 22 22 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 1 0 0 0 +- 0 0 1 0 0 0 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 42 42 42 94 94 94 14 14 14 101 101 101 +-128 128 128 2 2 6 18 18 18 116 116 116 +-118 98 46 121 92 8 121 92 8 98 78 10 +-162 162 162 106 106 106 2 2 6 2 2 6 +- 2 2 6 195 195 195 195 195 195 6 6 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 74 74 74 62 62 62 22 22 22 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 1 0 0 1 +- 0 0 1 0 0 0 0 0 1 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 38 38 38 90 90 90 14 14 14 58 58 58 +-210 210 210 26 26 26 54 38 6 154 114 10 +-226 170 11 236 186 11 225 175 15 184 144 12 +-215 174 15 175 146 61 37 26 9 2 2 6 +- 70 70 70 246 246 246 138 138 138 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 70 70 70 66 66 66 26 26 26 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 38 38 38 86 86 86 14 14 14 10 10 10 +-195 195 195 188 164 115 192 133 9 225 175 15 +-239 182 13 234 190 10 232 195 16 232 200 30 +-245 207 45 241 208 19 232 195 16 184 144 12 +-218 194 134 211 206 186 42 42 42 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 50 50 50 74 74 74 30 30 30 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 34 34 34 86 86 86 14 14 14 2 2 6 +-121 87 25 192 133 9 219 162 10 239 182 13 +-236 186 11 232 195 16 241 208 19 244 214 54 +-246 218 60 246 218 38 246 215 20 241 208 19 +-241 208 19 226 184 13 121 87 25 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 50 50 50 82 82 82 34 34 34 10 10 10 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 34 34 34 82 82 82 30 30 30 61 42 6 +-180 123 7 206 145 10 230 174 11 239 182 13 +-234 190 10 238 202 15 241 208 19 246 218 74 +-246 218 38 246 215 20 246 215 20 246 215 20 +-226 184 13 215 174 15 184 144 12 6 6 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 26 26 26 94 94 94 42 42 42 14 14 14 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 30 30 30 78 78 78 50 50 50 104 69 6 +-192 133 9 216 158 10 236 178 12 236 186 11 +-232 195 16 241 208 19 244 214 54 245 215 43 +-246 215 20 246 215 20 241 208 19 198 155 10 +-200 144 11 216 158 10 156 118 10 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 6 6 6 90 90 90 54 54 54 18 18 18 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 30 30 30 78 78 78 46 46 46 22 22 22 +-137 92 6 210 162 10 239 182 13 238 190 10 +-238 202 15 241 208 19 246 215 20 246 215 20 +-241 208 19 203 166 17 185 133 11 210 150 10 +-216 158 10 210 150 10 102 78 10 2 2 6 +- 6 6 6 54 54 54 14 14 14 2 2 6 +- 2 2 6 62 62 62 74 74 74 30 30 30 +- 10 10 10 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 34 34 34 78 78 78 50 50 50 6 6 6 +- 94 70 30 139 102 15 190 146 13 226 184 13 +-232 200 30 232 195 16 215 174 15 190 146 13 +-168 122 10 192 133 9 210 150 10 213 154 11 +-202 150 34 182 157 106 101 98 89 2 2 6 +- 2 2 6 78 78 78 116 116 116 58 58 58 +- 2 2 6 22 22 22 90 90 90 46 46 46 +- 18 18 18 6 6 6 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 38 38 38 86 86 86 50 50 50 6 6 6 +-128 128 128 174 154 114 156 107 11 168 122 10 +-198 155 10 184 144 12 197 138 11 200 144 11 +-206 145 10 206 145 10 197 138 11 188 164 115 +-195 195 195 198 198 198 174 174 174 14 14 14 +- 2 2 6 22 22 22 116 116 116 116 116 116 +- 22 22 22 2 2 6 74 74 74 70 70 70 +- 30 30 30 10 10 10 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 18 18 18 +- 50 50 50 101 101 101 26 26 26 10 10 10 +-138 138 138 190 190 190 174 154 114 156 107 11 +-197 138 11 200 144 11 197 138 11 192 133 9 +-180 123 7 190 142 34 190 178 144 187 187 187 +-202 202 202 221 221 221 214 214 214 66 66 66 +- 2 2 6 2 2 6 50 50 50 62 62 62 +- 6 6 6 2 2 6 10 10 10 90 90 90 +- 50 50 50 18 18 18 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 10 10 10 34 34 34 +- 74 74 74 74 74 74 2 2 6 6 6 6 +-144 144 144 198 198 198 190 190 190 178 166 146 +-154 121 60 156 107 11 156 107 11 168 124 44 +-174 154 114 187 187 187 190 190 190 210 210 210 +-246 246 246 253 253 253 253 253 253 182 182 182 +- 6 6 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 62 62 62 +- 74 74 74 34 34 34 14 14 14 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 10 10 10 22 22 22 54 54 54 +- 94 94 94 18 18 18 2 2 6 46 46 46 +-234 234 234 221 221 221 190 190 190 190 190 190 +-190 190 190 187 187 187 187 187 187 190 190 190 +-190 190 190 195 195 195 214 214 214 242 242 242 +-253 253 253 253 253 253 253 253 253 253 253 253 +- 82 82 82 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 14 14 14 +- 86 86 86 54 54 54 22 22 22 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 18 18 18 46 46 46 90 90 90 +- 46 46 46 18 18 18 6 6 6 182 182 182 +-253 253 253 246 246 246 206 206 206 190 190 190 +-190 190 190 190 190 190 190 190 190 190 190 190 +-206 206 206 231 231 231 250 250 250 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-202 202 202 14 14 14 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 42 42 42 86 86 86 42 42 42 18 18 18 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 14 14 14 38 38 38 74 74 74 66 66 66 +- 2 2 6 6 6 6 90 90 90 250 250 250 +-253 253 253 253 253 253 238 238 238 198 198 198 +-190 190 190 190 190 190 195 195 195 221 221 221 +-246 246 246 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 82 82 82 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 78 78 78 70 70 70 34 34 34 +- 14 14 14 6 6 6 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 34 34 34 66 66 66 78 78 78 6 6 6 +- 2 2 6 18 18 18 218 218 218 253 253 253 +-253 253 253 253 253 253 253 253 253 246 246 246 +-226 226 226 231 231 231 246 246 246 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 178 178 178 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 18 18 18 90 90 90 62 62 62 +- 30 30 30 10 10 10 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 10 10 10 26 26 26 +- 58 58 58 90 90 90 18 18 18 2 2 6 +- 2 2 6 110 110 110 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-250 250 250 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 231 231 231 18 18 18 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 18 18 18 94 94 94 +- 54 54 54 26 26 26 10 10 10 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 6 6 6 22 22 22 50 50 50 +- 90 90 90 26 26 26 2 2 6 2 2 6 +- 14 14 14 195 195 195 250 250 250 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-250 250 250 242 242 242 54 54 54 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 38 38 38 +- 86 86 86 50 50 50 22 22 22 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 14 14 14 38 38 38 82 82 82 +- 34 34 34 2 2 6 2 2 6 2 2 6 +- 42 42 42 195 195 195 246 246 246 253 253 253 +-253 253 253 253 253 253 253 253 253 250 250 250 +-242 242 242 242 242 242 250 250 250 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 250 250 250 246 246 246 238 238 238 +-226 226 226 231 231 231 101 101 101 6 6 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 38 38 38 82 82 82 42 42 42 14 14 14 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 10 10 10 26 26 26 62 62 62 66 66 66 +- 2 2 6 2 2 6 2 2 6 6 6 6 +- 70 70 70 170 170 170 206 206 206 234 234 234 +-246 246 246 250 250 250 250 250 250 238 238 238 +-226 226 226 231 231 231 238 238 238 250 250 250 +-250 250 250 250 250 250 246 246 246 231 231 231 +-214 214 214 206 206 206 202 202 202 202 202 202 +-198 198 198 202 202 202 182 182 182 18 18 18 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 62 62 62 66 66 66 30 30 30 +- 10 10 10 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 14 14 14 42 42 42 82 82 82 18 18 18 +- 2 2 6 2 2 6 2 2 6 10 10 10 +- 94 94 94 182 182 182 218 218 218 242 242 242 +-250 250 250 253 253 253 253 253 253 250 250 250 +-234 234 234 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 246 246 246 +-238 238 238 226 226 226 210 210 210 202 202 202 +-195 195 195 195 195 195 210 210 210 158 158 158 +- 6 6 6 14 14 14 50 50 50 14 14 14 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 6 6 6 86 86 86 46 46 46 +- 18 18 18 6 6 6 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 22 22 22 54 54 54 70 70 70 2 2 6 +- 2 2 6 10 10 10 2 2 6 22 22 22 +-166 166 166 231 231 231 250 250 250 253 253 253 +-253 253 253 253 253 253 253 253 253 250 250 250 +-242 242 242 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 246 246 246 +-231 231 231 206 206 206 198 198 198 226 226 226 +- 94 94 94 2 2 6 6 6 6 38 38 38 +- 30 30 30 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 62 62 62 66 66 66 +- 26 26 26 10 10 10 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 30 30 30 74 74 74 50 50 50 2 2 6 +- 26 26 26 26 26 26 2 2 6 106 106 106 +-238 238 238 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 246 246 246 218 218 218 202 202 202 +-210 210 210 14 14 14 2 2 6 2 2 6 +- 30 30 30 22 22 22 2 2 6 2 2 6 +- 2 2 6 2 2 6 18 18 18 86 86 86 +- 42 42 42 14 14 14 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 42 42 42 90 90 90 22 22 22 2 2 6 +- 42 42 42 2 2 6 18 18 18 218 218 218 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 250 250 250 221 221 221 +-218 218 218 101 101 101 2 2 6 14 14 14 +- 18 18 18 38 38 38 10 10 10 2 2 6 +- 2 2 6 2 2 6 2 2 6 78 78 78 +- 58 58 58 22 22 22 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 18 18 18 +- 54 54 54 82 82 82 2 2 6 26 26 26 +- 22 22 22 2 2 6 123 123 123 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 250 250 250 +-238 238 238 198 198 198 6 6 6 38 38 38 +- 58 58 58 26 26 26 38 38 38 2 2 6 +- 2 2 6 2 2 6 2 2 6 46 46 46 +- 78 78 78 30 30 30 10 10 10 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 10 10 10 30 30 30 +- 74 74 74 58 58 58 2 2 6 42 42 42 +- 2 2 6 22 22 22 231 231 231 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 250 250 250 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 246 246 246 46 46 46 38 38 38 +- 42 42 42 14 14 14 38 38 38 14 14 14 +- 2 2 6 2 2 6 2 2 6 6 6 6 +- 86 86 86 46 46 46 14 14 14 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 6 6 6 14 14 14 42 42 42 +- 90 90 90 18 18 18 18 18 18 26 26 26 +- 2 2 6 116 116 116 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 250 250 250 238 238 238 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 94 94 94 6 6 6 +- 2 2 6 2 2 6 10 10 10 34 34 34 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 74 74 74 58 58 58 22 22 22 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 10 10 10 26 26 26 66 66 66 +- 82 82 82 2 2 6 38 38 38 6 6 6 +- 14 14 14 210 210 210 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 246 246 246 242 242 242 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 144 144 144 2 2 6 +- 2 2 6 2 2 6 2 2 6 46 46 46 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 42 42 42 74 74 74 30 30 30 10 10 10 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 14 14 14 42 42 42 90 90 90 +- 26 26 26 6 6 6 42 42 42 2 2 6 +- 74 74 74 250 250 250 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 242 242 242 242 242 242 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 182 182 182 2 2 6 +- 2 2 6 2 2 6 2 2 6 46 46 46 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 10 10 10 86 86 86 38 38 38 10 10 10 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 10 10 10 26 26 26 66 66 66 82 82 82 +- 2 2 6 22 22 22 18 18 18 2 2 6 +-149 149 149 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 234 234 234 242 242 242 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 206 206 206 2 2 6 +- 2 2 6 2 2 6 2 2 6 38 38 38 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 6 6 6 86 86 86 46 46 46 14 14 14 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 18 18 18 46 46 46 86 86 86 18 18 18 +- 2 2 6 34 34 34 10 10 10 6 6 6 +-210 210 210 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 234 234 234 242 242 242 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 221 221 221 6 6 6 +- 2 2 6 2 2 6 6 6 6 30 30 30 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 82 82 82 54 54 54 18 18 18 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 26 26 26 66 66 66 62 62 62 2 2 6 +- 2 2 6 38 38 38 10 10 10 26 26 26 +-238 238 238 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 231 231 231 238 238 238 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 231 231 231 6 6 6 +- 2 2 6 2 2 6 10 10 10 30 30 30 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 66 66 66 58 58 58 22 22 22 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 38 38 38 78 78 78 6 6 6 2 2 6 +- 2 2 6 46 46 46 14 14 14 42 42 42 +-246 246 246 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 231 231 231 242 242 242 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 234 234 234 10 10 10 +- 2 2 6 2 2 6 22 22 22 14 14 14 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 66 66 66 62 62 62 22 22 22 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 18 18 18 +- 50 50 50 74 74 74 2 2 6 2 2 6 +- 14 14 14 70 70 70 34 34 34 62 62 62 +-250 250 250 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 231 231 231 246 246 246 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 234 234 234 14 14 14 +- 2 2 6 2 2 6 30 30 30 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 66 66 66 62 62 62 22 22 22 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 18 18 18 +- 54 54 54 62 62 62 2 2 6 2 2 6 +- 2 2 6 30 30 30 46 46 46 70 70 70 +-250 250 250 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 231 231 231 246 246 246 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 226 226 226 10 10 10 +- 2 2 6 6 6 6 30 30 30 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 66 66 66 58 58 58 22 22 22 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 22 22 22 +- 58 58 58 62 62 62 2 2 6 2 2 6 +- 2 2 6 2 2 6 30 30 30 78 78 78 +-250 250 250 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 231 231 231 246 246 246 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 206 206 206 2 2 6 +- 22 22 22 34 34 34 18 14 6 22 22 22 +- 26 26 26 18 18 18 6 6 6 2 2 6 +- 2 2 6 82 82 82 54 54 54 18 18 18 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 26 26 26 +- 62 62 62 106 106 106 74 54 14 185 133 11 +-210 162 10 121 92 8 6 6 6 62 62 62 +-238 238 238 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 231 231 231 246 246 246 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 158 158 158 18 18 18 +- 14 14 14 2 2 6 2 2 6 2 2 6 +- 6 6 6 18 18 18 66 66 66 38 38 38 +- 6 6 6 94 94 94 50 50 50 18 18 18 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 10 10 10 10 10 10 18 18 18 38 38 38 +- 78 78 78 142 134 106 216 158 10 242 186 14 +-246 190 14 246 190 14 156 118 10 10 10 10 +- 90 90 90 238 238 238 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 231 231 231 250 250 250 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 246 230 190 +-238 204 91 238 204 91 181 142 44 37 26 9 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 38 38 38 46 46 46 +- 26 26 26 106 106 106 54 54 54 18 18 18 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 6 6 6 14 14 14 22 22 22 +- 30 30 30 38 38 38 50 50 50 70 70 70 +-106 106 106 190 142 34 226 170 11 242 186 14 +-246 190 14 246 190 14 246 190 14 154 114 10 +- 6 6 6 74 74 74 226 226 226 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 231 231 231 250 250 250 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 228 184 62 +-241 196 14 241 208 19 232 195 16 38 30 10 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 6 6 6 30 30 30 26 26 26 +-203 166 17 154 142 90 66 66 66 26 26 26 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 18 18 18 38 38 38 58 58 58 +- 78 78 78 86 86 86 101 101 101 123 123 123 +-175 146 61 210 150 10 234 174 13 246 186 14 +-246 190 14 246 190 14 246 190 14 238 190 10 +-102 78 10 2 2 6 46 46 46 198 198 198 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 234 234 234 242 242 242 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 224 178 62 +-242 186 14 241 196 14 210 166 10 22 18 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 6 6 6 121 92 8 +-238 202 15 232 195 16 82 82 82 34 34 34 +- 10 10 10 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 14 14 14 38 38 38 70 70 70 154 122 46 +-190 142 34 200 144 11 197 138 11 197 138 11 +-213 154 11 226 170 11 242 186 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-225 175 15 46 32 6 2 2 6 22 22 22 +-158 158 158 250 250 250 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 250 250 250 242 242 242 224 178 62 +-239 182 13 236 186 11 213 154 11 46 32 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 61 42 6 225 175 15 +-238 190 10 236 186 11 112 100 78 42 42 42 +- 14 14 14 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 22 22 22 54 54 54 154 122 46 213 154 11 +-226 170 11 230 174 11 226 170 11 226 170 11 +-236 178 12 242 186 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-241 196 14 184 144 12 10 10 10 2 2 6 +- 6 6 6 116 116 116 242 242 242 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 231 231 231 198 198 198 214 170 54 +-236 178 12 236 178 12 210 150 10 137 92 6 +- 18 14 6 2 2 6 2 2 6 2 2 6 +- 6 6 6 70 47 6 200 144 11 236 178 12 +-239 182 13 239 182 13 124 112 88 58 58 58 +- 22 22 22 6 6 6 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 30 30 30 70 70 70 180 133 36 226 170 11 +-239 182 13 242 186 14 242 186 14 246 186 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 232 195 16 98 70 6 2 2 6 +- 2 2 6 2 2 6 66 66 66 221 221 221 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 206 206 206 198 198 198 214 166 58 +-230 174 11 230 174 11 216 158 10 192 133 9 +-163 110 8 116 81 8 102 78 10 116 81 8 +-167 114 7 197 138 11 226 170 11 239 182 13 +-242 186 14 242 186 14 162 146 94 78 78 78 +- 34 34 34 14 14 14 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 30 30 30 78 78 78 190 142 34 226 170 11 +-239 182 13 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 241 196 14 203 166 17 22 18 6 +- 2 2 6 2 2 6 2 2 6 38 38 38 +-218 218 218 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-250 250 250 206 206 206 198 198 198 202 162 69 +-226 170 11 236 178 12 224 166 10 210 150 10 +-200 144 11 197 138 11 192 133 9 197 138 11 +-210 150 10 226 170 11 242 186 14 246 190 14 +-246 190 14 246 186 14 225 175 15 124 112 88 +- 62 62 62 30 30 30 14 14 14 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 30 30 30 78 78 78 174 135 50 224 166 10 +-239 182 13 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 241 196 14 139 102 15 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 78 78 78 250 250 250 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-250 250 250 214 214 214 198 198 198 190 150 46 +-219 162 10 236 178 12 234 174 13 224 166 10 +-216 158 10 213 154 11 213 154 11 216 158 10 +-226 170 11 239 182 13 246 190 14 246 190 14 +-246 190 14 246 190 14 242 186 14 206 162 42 +-101 101 101 58 58 58 30 30 30 14 14 14 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 30 30 30 74 74 74 174 135 50 216 158 10 +-236 178 12 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 241 196 14 226 184 13 +- 61 42 6 2 2 6 2 2 6 2 2 6 +- 22 22 22 238 238 238 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 226 226 226 187 187 187 180 133 36 +-216 158 10 236 178 12 239 182 13 236 178 12 +-230 174 11 226 170 11 226 170 11 230 174 11 +-236 178 12 242 186 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 186 14 239 182 13 +-206 162 42 106 106 106 66 66 66 34 34 34 +- 14 14 14 6 6 6 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 26 26 26 70 70 70 163 133 67 213 154 11 +-236 178 12 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 241 196 14 +-190 146 13 18 14 6 2 2 6 2 2 6 +- 46 46 46 246 246 246 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 221 221 221 86 86 86 156 107 11 +-216 158 10 236 178 12 242 186 14 246 186 14 +-242 186 14 239 182 13 239 182 13 242 186 14 +-242 186 14 246 186 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-242 186 14 225 175 15 142 122 72 66 66 66 +- 30 30 30 10 10 10 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 26 26 26 70 70 70 163 133 67 210 150 10 +-236 178 12 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-232 195 16 121 92 8 34 34 34 106 106 106 +-221 221 221 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-242 242 242 82 82 82 18 14 6 163 110 8 +-216 158 10 236 178 12 242 186 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 242 186 14 163 133 67 +- 46 46 46 18 18 18 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 10 10 10 +- 30 30 30 78 78 78 163 133 67 210 150 10 +-236 178 12 246 186 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-241 196 14 215 174 15 190 178 144 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 218 218 218 +- 58 58 58 2 2 6 22 18 6 167 114 7 +-216 158 10 236 178 12 246 186 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 186 14 242 186 14 190 150 46 +- 54 54 54 22 22 22 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 38 38 38 86 86 86 180 133 36 213 154 11 +-236 178 12 246 186 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 232 195 16 190 146 13 214 214 214 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 250 250 250 170 170 170 26 26 26 +- 2 2 6 2 2 6 37 26 9 163 110 8 +-219 162 10 239 182 13 246 186 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 186 14 236 178 12 224 166 10 142 122 72 +- 46 46 46 18 18 18 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 18 18 18 +- 50 50 50 109 106 95 192 133 9 224 166 10 +-242 186 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-242 186 14 226 184 13 210 162 10 142 110 46 +-226 226 226 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-253 253 253 253 253 253 253 253 253 253 253 253 +-198 198 198 66 66 66 2 2 6 2 2 6 +- 2 2 6 2 2 6 50 34 6 156 107 11 +-219 162 10 239 182 13 246 186 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 242 186 14 +-234 174 13 213 154 11 154 122 46 66 66 66 +- 30 30 30 10 10 10 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 22 22 22 +- 58 58 58 154 121 60 206 145 10 234 174 13 +-242 186 14 246 186 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 186 14 236 178 12 210 162 10 163 110 8 +- 61 42 6 138 138 138 218 218 218 250 250 250 +-253 253 253 253 253 253 253 253 253 250 250 250 +-242 242 242 210 210 210 144 144 144 66 66 66 +- 6 6 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 61 42 6 163 110 8 +-216 158 10 236 178 12 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 239 182 13 230 174 11 216 158 10 +-190 142 34 124 112 88 70 70 70 38 38 38 +- 18 18 18 6 6 6 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 22 22 22 +- 62 62 62 168 124 44 206 145 10 224 166 10 +-236 178 12 239 182 13 242 186 14 242 186 14 +-246 186 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 236 178 12 216 158 10 175 118 6 +- 80 54 7 2 2 6 6 6 6 30 30 30 +- 54 54 54 62 62 62 50 50 50 38 38 38 +- 14 14 14 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 6 6 6 80 54 7 167 114 7 +-213 154 11 236 178 12 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 190 14 242 186 14 239 182 13 239 182 13 +-230 174 11 210 150 10 174 135 50 124 112 88 +- 82 82 82 54 54 54 34 34 34 18 18 18 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 18 18 18 +- 50 50 50 158 118 36 192 133 9 200 144 11 +-216 158 10 219 162 10 224 166 10 226 170 11 +-230 174 11 236 178 12 239 182 13 239 182 13 +-242 186 14 246 186 14 246 190 14 246 190 14 +-246 190 14 246 190 14 246 190 14 246 190 14 +-246 186 14 230 174 11 210 150 10 163 110 8 +-104 69 6 10 10 10 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 6 6 6 91 60 6 167 114 7 +-206 145 10 230 174 11 242 186 14 246 190 14 +-246 190 14 246 190 14 246 186 14 242 186 14 +-239 182 13 230 174 11 224 166 10 213 154 11 +-180 133 36 124 112 88 86 86 86 58 58 58 +- 38 38 38 22 22 22 10 10 10 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 14 14 14 +- 34 34 34 70 70 70 138 110 50 158 118 36 +-167 114 7 180 123 7 192 133 9 197 138 11 +-200 144 11 206 145 10 213 154 11 219 162 10 +-224 166 10 230 174 11 239 182 13 242 186 14 +-246 186 14 246 186 14 246 186 14 246 186 14 +-239 182 13 216 158 10 185 133 11 152 99 6 +-104 69 6 18 14 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 2 2 6 2 2 6 2 2 6 +- 2 2 6 6 6 6 80 54 7 152 99 6 +-192 133 9 219 162 10 236 178 12 239 182 13 +-246 186 14 242 186 14 239 182 13 236 178 12 +-224 166 10 206 145 10 192 133 9 154 121 60 +- 94 94 94 62 62 62 42 42 42 22 22 22 +- 14 14 14 6 6 6 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 18 18 18 34 34 34 58 58 58 78 78 78 +-101 98 89 124 112 88 142 110 46 156 107 11 +-163 110 8 167 114 7 175 118 6 180 123 7 +-185 133 11 197 138 11 210 150 10 219 162 10 +-226 170 11 236 178 12 236 178 12 234 174 13 +-219 162 10 197 138 11 163 110 8 130 83 6 +- 91 60 6 10 10 10 2 2 6 2 2 6 +- 18 18 18 38 38 38 38 38 38 38 38 38 +- 38 38 38 38 38 38 38 38 38 38 38 38 +- 38 38 38 38 38 38 26 26 26 2 2 6 +- 2 2 6 6 6 6 70 47 6 137 92 6 +-175 118 6 200 144 11 219 162 10 230 174 11 +-234 174 13 230 174 11 219 162 10 210 150 10 +-192 133 9 163 110 8 124 112 88 82 82 82 +- 50 50 50 30 30 30 14 14 14 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 14 14 14 22 22 22 34 34 34 +- 42 42 42 58 58 58 74 74 74 86 86 86 +-101 98 89 122 102 70 130 98 46 121 87 25 +-137 92 6 152 99 6 163 110 8 180 123 7 +-185 133 11 197 138 11 206 145 10 200 144 11 +-180 123 7 156 107 11 130 83 6 104 69 6 +- 50 34 6 54 54 54 110 110 110 101 98 89 +- 86 86 86 82 82 82 78 78 78 78 78 78 +- 78 78 78 78 78 78 78 78 78 78 78 78 +- 78 78 78 82 82 82 86 86 86 94 94 94 +-106 106 106 101 101 101 86 66 34 124 80 6 +-156 107 11 180 123 7 192 133 9 200 144 11 +-206 145 10 200 144 11 192 133 9 175 118 6 +-139 102 15 109 106 95 70 70 70 42 42 42 +- 22 22 22 10 10 10 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 6 6 6 10 10 10 +- 14 14 14 22 22 22 30 30 30 38 38 38 +- 50 50 50 62 62 62 74 74 74 90 90 90 +-101 98 89 112 100 78 121 87 25 124 80 6 +-137 92 6 152 99 6 152 99 6 152 99 6 +-138 86 6 124 80 6 98 70 6 86 66 30 +-101 98 89 82 82 82 58 58 58 46 46 46 +- 38 38 38 34 34 34 34 34 34 34 34 34 +- 34 34 34 34 34 34 34 34 34 34 34 34 +- 34 34 34 34 34 34 38 38 38 42 42 42 +- 54 54 54 82 82 82 94 86 76 91 60 6 +-134 86 6 156 107 11 167 114 7 175 118 6 +-175 118 6 167 114 7 152 99 6 121 87 25 +-101 98 89 62 62 62 34 34 34 18 18 18 +- 6 6 6 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 6 6 6 6 6 6 10 10 10 +- 18 18 18 22 22 22 30 30 30 42 42 42 +- 50 50 50 66 66 66 86 86 86 101 98 89 +-106 86 58 98 70 6 104 69 6 104 69 6 +-104 69 6 91 60 6 82 62 34 90 90 90 +- 62 62 62 38 38 38 22 22 22 14 14 14 +- 10 10 10 10 10 10 10 10 10 10 10 10 +- 10 10 10 10 10 10 6 6 6 10 10 10 +- 10 10 10 10 10 10 10 10 10 14 14 14 +- 22 22 22 42 42 42 70 70 70 89 81 66 +- 80 54 7 104 69 6 124 80 6 137 92 6 +-134 86 6 116 81 8 100 82 52 86 86 86 +- 58 58 58 30 30 30 14 14 14 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 6 6 6 10 10 10 14 14 14 +- 18 18 18 26 26 26 38 38 38 54 54 54 +- 70 70 70 86 86 86 94 86 76 89 81 66 +- 89 81 66 86 86 86 74 74 74 50 50 50 +- 30 30 30 14 14 14 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 18 18 18 34 34 34 58 58 58 +- 82 82 82 89 81 66 89 81 66 89 81 66 +- 94 86 66 94 86 76 74 74 74 50 50 50 +- 26 26 26 14 14 14 6 6 6 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 6 6 6 6 6 6 14 14 14 18 18 18 +- 30 30 30 38 38 38 46 46 46 54 54 54 +- 50 50 50 42 42 42 30 30 30 18 18 18 +- 10 10 10 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 6 6 6 14 14 14 26 26 26 +- 38 38 38 50 50 50 58 58 58 58 58 58 +- 54 54 54 42 42 42 30 30 30 18 18 18 +- 10 10 10 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 6 6 6 10 10 10 14 14 14 18 18 18 +- 18 18 18 14 14 14 10 10 10 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 6 6 6 +- 14 14 14 18 18 18 22 22 22 22 22 22 +- 18 18 18 14 14 14 10 10 10 6 6 6 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 +- 0 0 0 0 0 0 0 0 0 0 0 0 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 3 3 3 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 1 1 1 0 0 0 ++0 0 0 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 2 1 0 2 1 0 3 2 2 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 2 2 2 0 0 0 3 4 3 26 28 28 ++37 38 37 37 38 37 14 17 19 2 2 2 0 0 0 2 2 2 ++5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 3 3 3 0 0 0 1 1 1 6 6 6 ++2 2 2 0 0 0 3 3 3 4 4 4 4 4 4 4 4 4 ++4 4 5 3 3 3 1 0 0 0 0 0 1 0 0 0 0 0 ++1 1 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++2 2 2 0 0 0 0 0 0 14 17 19 60 74 84 137 136 137 ++153 152 153 137 136 137 125 124 125 60 73 81 6 6 6 3 1 0 ++0 0 0 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 0 0 0 4 4 4 41 54 63 125 124 125 ++60 73 81 6 6 6 4 0 0 3 3 3 4 4 4 4 4 4 ++4 4 4 0 0 0 6 9 11 41 54 63 41 65 82 22 30 35 ++2 2 2 2 1 0 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 5 5 5 5 5 5 2 2 2 0 0 0 ++4 0 0 6 6 6 41 54 63 137 136 137 174 174 174 167 166 167 ++165 164 165 165 164 165 163 162 163 163 162 163 125 124 125 41 54 63 ++1 1 1 0 0 0 0 0 0 3 3 3 5 5 5 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 ++3 3 3 2 0 0 4 0 0 60 73 81 156 155 156 167 166 167 ++163 162 163 85 115 134 5 7 8 0 0 0 4 4 4 5 5 5 ++0 0 0 2 5 5 55 98 126 90 154 193 90 154 193 72 125 159 ++37 51 59 2 0 0 1 1 1 4 5 5 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 5 5 5 4 4 4 1 1 1 0 0 0 3 3 3 ++37 38 37 125 124 125 163 162 163 174 174 174 158 157 158 158 157 158 ++156 155 156 156 155 156 158 157 158 165 164 165 174 174 174 166 165 166 ++125 124 125 16 19 21 1 0 0 0 0 0 0 0 0 4 4 4 ++5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 1 1 1 ++0 0 0 0 0 0 37 38 37 153 152 153 174 174 174 158 157 158 ++174 174 174 163 162 163 37 38 37 4 3 3 4 0 0 1 1 1 ++0 0 0 22 40 52 101 161 196 101 161 196 90 154 193 101 161 196 ++64 123 161 14 17 19 0 0 0 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 ++5 5 5 2 2 2 0 0 0 4 0 0 24 26 27 85 115 134 ++156 155 156 174 174 174 167 166 167 156 155 156 154 153 154 157 156 157 ++156 155 156 156 155 156 155 154 155 153 152 153 158 157 158 167 166 167 ++174 174 174 156 155 156 60 74 84 16 19 21 0 0 0 0 0 0 ++1 1 1 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 5 5 5 6 6 6 3 3 3 0 0 0 4 0 0 ++13 16 17 60 73 81 137 136 137 165 164 165 156 155 156 153 152 153 ++174 174 174 177 184 187 60 73 81 3 1 0 0 0 0 1 1 2 ++22 30 35 64 123 161 136 185 209 90 154 193 90 154 193 90 154 193 ++90 154 193 21 29 34 0 0 0 3 2 2 4 4 5 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 3 3 3 ++0 0 0 0 0 0 10 13 16 60 74 84 157 156 157 174 174 174 ++174 174 174 158 157 158 153 152 153 154 153 154 156 155 156 155 154 155 ++156 155 156 155 154 155 154 153 154 157 156 157 154 153 154 153 152 153 ++163 162 163 174 174 174 177 184 187 137 136 137 60 73 81 13 16 17 ++4 0 0 0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 ++5 5 5 4 4 4 1 1 1 0 0 0 3 3 3 41 54 63 ++131 129 131 174 174 174 174 174 174 174 174 174 167 166 167 174 174 174 ++190 197 201 137 136 137 24 26 27 4 0 0 16 21 25 50 82 103 ++90 154 193 136 185 209 90 154 193 101 161 196 101 161 196 101 161 196 ++31 91 132 3 6 7 0 0 0 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 2 2 2 0 0 0 4 0 0 ++4 0 0 43 57 68 137 136 137 177 184 187 174 174 174 163 162 163 ++155 154 155 155 154 155 156 155 156 155 154 155 158 157 158 165 164 165 ++167 166 167 166 165 166 163 162 163 157 156 157 155 154 155 155 154 155 ++153 152 153 156 155 156 167 166 167 174 174 174 174 174 174 131 129 131 ++41 54 63 5 5 5 0 0 0 0 0 0 3 3 3 4 4 4 ++1 1 1 0 0 0 1 0 0 26 28 28 125 124 125 174 174 174 ++177 184 187 174 174 174 174 174 174 156 155 156 131 129 131 137 136 137 ++125 124 125 24 26 27 4 0 0 41 65 82 90 154 193 136 185 209 ++136 185 209 101 161 196 53 118 160 37 112 160 90 154 193 34 86 122 ++7 12 15 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 3 3 3 0 0 0 0 0 0 5 5 5 37 38 37 ++125 124 125 167 166 167 174 174 174 167 166 167 158 157 158 155 154 155 ++156 155 156 156 155 156 156 155 156 163 162 163 167 166 167 155 154 155 ++137 136 137 153 152 153 156 155 156 165 164 165 163 162 163 156 155 156 ++156 155 156 156 155 156 155 154 155 158 157 158 166 165 166 174 174 174 ++167 166 167 125 124 125 37 38 37 1 0 0 0 0 0 0 0 0 ++0 0 0 24 26 27 60 74 84 158 157 158 174 174 174 174 174 174 ++166 165 166 158 157 158 125 124 125 41 54 63 13 16 17 6 6 6 ++6 6 6 37 38 37 80 127 157 136 185 209 101 161 196 101 161 196 ++90 154 193 28 67 93 6 10 14 13 20 25 13 20 25 6 10 14 ++1 1 2 4 3 3 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++1 1 1 1 0 0 4 3 3 37 38 37 60 74 84 153 152 153 ++167 166 167 167 166 167 158 157 158 154 153 154 155 154 155 156 155 156 ++157 156 157 158 157 158 167 166 167 167 166 167 131 129 131 43 57 68 ++26 28 28 37 38 37 60 73 81 131 129 131 165 164 165 166 165 166 ++158 157 158 155 154 155 156 155 156 156 155 156 156 155 156 158 157 158 ++165 164 165 174 174 174 163 162 163 60 74 84 16 19 21 13 16 17 ++60 73 81 131 129 131 174 174 174 174 174 174 167 166 167 165 164 165 ++137 136 137 60 73 81 24 26 27 4 0 0 4 0 0 16 19 21 ++52 104 138 101 161 196 136 185 209 136 185 209 90 154 193 27 99 146 ++13 20 25 4 5 7 2 5 5 4 5 7 1 1 2 0 0 0 ++4 4 4 4 4 4 3 3 3 2 2 2 2 2 2 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 0 0 0 ++0 0 0 13 16 17 60 73 81 137 136 137 174 174 174 166 165 166 ++158 157 158 156 155 156 157 156 157 156 155 156 155 154 155 158 157 158 ++167 166 167 174 174 174 153 152 153 60 73 81 16 19 21 4 0 0 ++4 0 0 4 0 0 6 6 6 26 28 28 60 74 84 158 157 158 ++174 174 174 166 165 166 157 156 157 155 154 155 156 155 156 156 155 156 ++155 154 155 158 157 158 167 166 167 167 166 167 131 129 131 125 124 125 ++137 136 137 167 166 167 167 166 167 174 174 174 158 157 158 125 124 125 ++16 19 21 4 0 0 4 0 0 10 13 16 49 76 92 107 159 188 ++136 185 209 136 185 209 90 154 193 26 108 161 22 40 52 6 10 14 ++2 3 3 1 1 2 1 1 2 4 4 5 4 4 5 4 4 5 ++4 4 5 2 2 1 0 0 0 0 0 0 0 0 0 2 2 2 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 5 5 5 3 3 3 0 0 0 1 0 0 4 0 0 ++37 51 59 131 129 131 167 166 167 167 166 167 163 162 163 157 156 157 ++157 156 157 155 154 155 153 152 153 157 156 157 167 166 167 174 174 174 ++153 152 153 125 124 125 37 38 37 4 0 0 4 0 0 4 0 0 ++4 3 3 4 3 3 4 0 0 6 6 6 4 0 0 37 38 37 ++125 124 125 174 174 174 174 174 174 165 164 165 156 155 156 154 153 154 ++156 155 156 156 155 156 155 154 155 163 162 163 158 157 158 163 162 163 ++174 174 174 174 174 174 174 174 174 125 124 125 37 38 37 0 0 0 ++4 0 0 6 9 11 41 54 63 90 154 193 136 185 209 146 190 211 ++136 185 209 37 112 160 22 40 52 6 10 14 3 6 7 1 1 2 ++1 1 2 3 3 3 1 1 2 3 3 3 4 4 4 4 4 4 ++2 2 2 2 0 0 16 19 21 37 38 37 24 26 27 0 0 0 ++0 0 0 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 ++4 4 4 0 0 0 0 0 0 0 0 0 26 28 28 120 125 127 ++158 157 158 174 174 174 165 164 165 157 156 157 155 154 155 156 155 156 ++153 152 153 153 152 153 167 166 167 174 174 174 174 174 174 125 124 125 ++37 38 37 4 0 0 0 0 0 4 0 0 4 3 3 4 4 4 ++4 4 4 4 4 4 5 5 5 4 0 0 4 0 0 4 0 0 ++4 3 3 43 57 68 137 136 137 174 174 174 174 174 174 165 164 165 ++154 153 154 153 152 153 153 152 153 153 152 153 163 162 163 174 174 174 ++174 174 174 153 152 153 60 73 81 6 6 6 4 0 0 4 3 3 ++32 43 50 80 127 157 136 185 209 146 190 211 146 190 211 90 154 193 ++28 67 93 28 67 93 40 71 93 3 6 7 1 1 2 2 5 5 ++50 82 103 79 117 143 26 37 45 0 0 0 3 3 3 1 1 1 ++0 0 0 41 54 63 137 136 137 174 174 174 153 152 153 60 73 81 ++2 0 0 0 0 0 ++4 4 4 4 4 4 4 4 4 4 4 4 6 6 6 2 2 2 ++0 0 0 2 0 0 24 26 27 60 74 84 153 152 153 174 174 174 ++174 174 174 157 156 157 154 153 154 156 155 156 154 153 154 153 152 153 ++165 164 165 174 174 174 177 184 187 137 136 137 43 57 68 6 6 6 ++4 0 0 2 0 0 3 3 3 5 5 5 5 5 5 4 4 4 ++4 4 4 4 4 4 4 4 4 5 5 5 6 6 6 4 3 3 ++4 0 0 4 0 0 24 26 27 60 73 81 153 152 153 174 174 174 ++174 174 174 158 157 158 158 157 158 174 174 174 174 174 174 158 157 158 ++60 74 84 24 26 27 4 0 0 4 0 0 17 23 27 59 113 148 ++136 185 209 191 222 234 146 190 211 136 185 209 31 91 132 7 11 13 ++22 40 52 101 161 196 90 154 193 6 9 11 3 4 4 43 95 132 ++136 185 209 172 205 220 55 98 126 0 0 0 0 0 0 2 0 0 ++26 28 28 153 152 153 177 184 187 167 166 167 177 184 187 165 164 165 ++37 38 37 0 0 0 ++4 4 4 4 4 4 5 5 5 5 5 5 1 1 1 0 0 0 ++13 16 17 60 73 81 137 136 137 174 174 174 174 174 174 165 164 165 ++153 152 153 153 152 153 155 154 155 154 153 154 158 157 158 174 174 174 ++177 184 187 163 162 163 60 73 81 16 19 21 4 0 0 4 0 0 ++4 3 3 4 4 4 5 5 5 5 5 5 4 4 4 5 5 5 ++5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 5 5 5 ++6 6 6 4 0 0 4 0 0 4 0 0 24 26 27 60 74 84 ++166 165 166 174 174 174 177 184 187 165 164 165 125 124 125 24 26 27 ++4 0 0 4 0 0 5 5 5 50 82 103 136 185 209 172 205 220 ++146 190 211 136 185 209 26 108 161 22 40 52 7 12 15 44 81 103 ++71 116 144 28 67 93 37 51 59 41 65 82 100 139 164 101 161 196 ++90 154 193 90 154 193 28 67 93 0 0 0 0 0 0 26 28 28 ++125 124 125 167 166 167 163 162 163 153 152 153 163 162 163 174 174 174 ++85 115 134 4 0 0 ++4 4 4 5 5 5 4 4 4 1 0 0 4 0 0 34 47 55 ++125 124 125 174 174 174 174 174 174 167 166 167 157 156 157 153 152 153 ++155 154 155 155 154 155 158 157 158 166 165 166 167 166 167 154 153 154 ++125 124 125 26 28 28 4 0 0 4 0 0 4 0 0 5 5 5 ++5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 1 1 1 ++0 0 0 0 0 0 1 1 1 4 4 4 4 4 4 4 4 4 ++5 5 5 5 5 5 4 3 3 4 0 0 4 0 0 6 6 6 ++37 38 37 131 129 131 137 136 137 37 38 37 0 0 0 4 0 0 ++4 5 5 43 61 72 90 154 193 172 205 220 146 190 211 136 185 209 ++90 154 193 28 67 93 13 20 25 43 61 72 71 116 144 44 81 103 ++2 5 5 7 11 13 59 113 148 101 161 196 90 154 193 28 67 93 ++13 20 25 6 10 14 0 0 0 13 16 17 60 73 81 137 136 137 ++166 165 166 158 157 158 156 155 156 154 153 154 167 166 167 174 174 174 ++60 73 81 4 0 0 ++4 4 4 4 4 4 0 0 0 3 3 3 60 74 84 174 174 174 ++174 174 174 167 166 167 163 162 163 155 154 155 157 156 157 155 154 155 ++156 155 156 163 162 163 167 166 167 158 157 158 125 124 125 37 38 37 ++4 3 3 4 0 0 4 0 0 6 6 6 6 6 6 5 5 5 ++4 4 4 4 4 4 4 4 4 1 1 1 0 0 0 2 3 3 ++10 13 16 7 11 13 1 0 0 0 0 0 2 2 1 4 4 4 ++4 4 4 4 4 4 4 4 4 5 5 5 4 3 3 4 0 0 ++4 0 0 7 11 13 13 16 17 4 0 0 3 3 3 34 47 55 ++80 127 157 146 190 211 172 205 220 136 185 209 136 185 209 136 185 209 ++28 67 93 22 40 52 55 98 126 55 98 126 21 29 34 7 11 13 ++50 82 103 101 161 196 101 161 196 35 83 115 13 20 25 2 2 1 ++1 1 2 1 1 2 37 51 59 131 129 131 174 174 174 174 174 174 ++167 166 167 163 162 163 163 162 163 167 166 167 174 174 174 125 124 125 ++16 19 21 4 0 0 ++4 4 4 4 0 0 4 0 0 60 74 84 174 174 174 174 174 174 ++158 157 158 155 154 155 155 154 155 156 155 156 155 154 155 158 157 158 ++167 166 167 165 164 165 131 129 131 60 73 81 13 16 17 4 0 0 ++4 0 0 4 3 3 6 6 6 4 3 3 5 5 5 4 4 4 ++4 4 4 3 2 2 0 0 0 0 0 0 7 11 13 45 69 86 ++80 127 157 71 116 144 43 61 72 7 11 13 0 0 0 1 1 1 ++4 3 3 4 4 4 4 4 4 4 4 4 6 6 6 5 5 5 ++3 2 2 4 0 0 1 0 0 21 29 34 59 113 148 136 185 209 ++146 190 211 136 185 209 136 185 209 136 185 209 136 185 209 136 185 209 ++68 124 159 44 81 103 22 40 52 13 16 17 43 61 72 90 154 193 ++136 185 209 59 113 148 21 29 34 3 4 3 1 1 1 0 0 0 ++24 26 27 125 124 125 163 162 163 174 174 174 166 165 166 165 164 165 ++163 162 163 125 124 125 125 124 125 125 124 125 125 124 125 26 28 28 ++4 0 0 4 3 3 ++3 3 3 0 0 0 24 26 27 153 152 153 177 184 187 158 157 158 ++156 155 156 156 155 156 155 154 155 155 154 155 165 164 165 174 174 174 ++155 154 155 60 74 84 26 28 28 4 0 0 4 0 0 3 1 0 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 ++2 0 0 0 0 0 0 0 0 32 43 50 72 125 159 101 161 196 ++136 185 209 101 161 196 101 161 196 79 117 143 32 43 50 0 0 0 ++0 0 0 2 2 2 4 4 4 4 4 4 3 3 3 1 0 0 ++0 0 0 4 5 5 49 76 92 101 161 196 146 190 211 146 190 211 ++136 185 209 136 185 209 136 185 209 136 185 209 136 185 209 90 154 193 ++28 67 93 13 16 17 37 51 59 80 127 157 136 185 209 90 154 193 ++22 40 52 6 9 11 3 4 3 2 2 1 16 19 21 60 73 81 ++137 136 137 163 162 163 158 157 158 166 165 166 167 166 167 153 152 153 ++60 74 84 37 38 37 6 6 6 13 16 17 4 0 0 1 0 0 ++3 2 2 4 4 4 ++3 2 2 4 0 0 37 38 37 137 136 137 167 166 167 158 157 158 ++157 156 157 154 153 154 157 156 157 167 166 167 174 174 174 125 124 125 ++37 38 37 4 0 0 4 0 0 4 0 0 4 3 3 4 4 4 ++4 4 4 4 4 4 5 5 5 5 5 5 1 1 1 0 0 0 ++0 0 0 16 21 25 55 98 126 90 154 193 136 185 209 101 161 196 ++101 161 196 101 161 196 136 185 209 136 185 209 101 161 196 55 98 126 ++14 17 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++22 40 52 90 154 193 146 190 211 146 190 211 136 185 209 136 185 209 ++136 185 209 136 185 209 136 185 209 101 161 196 35 83 115 7 11 13 ++17 23 27 59 113 148 136 185 209 101 161 196 34 86 122 7 12 15 ++2 5 5 3 4 3 6 6 6 60 73 81 131 129 131 163 162 163 ++166 165 166 174 174 174 174 174 174 163 162 163 125 124 125 41 54 63 ++13 16 17 4 0 0 4 0 0 4 0 0 1 0 0 2 2 2 ++4 4 4 4 4 4 ++1 1 1 2 1 0 43 57 68 137 136 137 153 152 153 153 152 153 ++163 162 163 156 155 156 165 164 165 167 166 167 60 74 84 6 6 6 ++4 0 0 4 0 0 5 5 5 4 4 4 4 4 4 4 4 4 ++4 5 5 6 6 6 4 3 3 0 0 0 0 0 0 11 15 18 ++40 71 93 100 139 164 101 161 196 101 161 196 101 161 196 101 161 196 ++101 161 196 101 161 196 101 161 196 101 161 196 136 185 209 136 185 209 ++101 161 196 45 69 86 6 6 6 0 0 0 17 23 27 55 98 126 ++136 185 209 146 190 211 136 185 209 136 185 209 136 185 209 136 185 209 ++136 185 209 136 185 209 90 154 193 22 40 52 7 11 13 50 82 103 ++136 185 209 136 185 209 53 118 160 22 40 52 7 11 13 2 5 5 ++3 4 3 37 38 37 125 124 125 157 156 157 166 165 166 167 166 167 ++174 174 174 174 174 174 137 136 137 60 73 81 4 0 0 4 0 0 ++4 0 0 4 0 0 5 5 5 3 3 3 3 3 3 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 41 54 63 137 136 137 125 124 125 131 129 131 ++155 154 155 167 166 167 174 174 174 60 74 84 6 6 6 4 0 0 ++4 3 3 6 6 6 4 4 4 4 4 4 4 4 4 5 5 5 ++4 4 4 1 1 1 0 0 0 3 6 7 41 65 82 72 125 159 ++101 161 196 101 161 196 101 161 196 90 154 193 90 154 193 101 161 196 ++101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 136 185 209 ++136 185 209 136 185 209 80 127 157 55 98 126 101 161 196 146 190 211 ++136 185 209 136 185 209 136 185 209 101 161 196 136 185 209 101 161 196 ++136 185 209 101 161 196 35 83 115 22 30 35 101 161 196 172 205 220 ++90 154 193 28 67 93 7 11 13 2 5 5 3 4 3 13 16 17 ++85 115 134 167 166 167 174 174 174 174 174 174 174 174 174 174 174 174 ++167 166 167 60 74 84 13 16 17 4 0 0 4 0 0 4 3 3 ++6 6 6 5 5 5 4 4 4 5 5 5 4 4 4 5 5 5 ++5 5 5 5 5 5 ++1 1 1 4 0 0 41 54 63 137 136 137 137 136 137 125 124 125 ++131 129 131 167 166 167 157 156 157 37 38 37 6 6 6 4 0 0 ++6 6 6 5 5 5 4 4 4 4 4 4 4 5 5 2 2 1 ++0 0 0 0 0 0 26 37 45 58 111 146 101 161 196 101 161 196 ++101 161 196 90 154 193 90 154 193 90 154 193 101 161 196 101 161 196 ++101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 ++101 161 196 136 185 209 136 185 209 136 185 209 146 190 211 136 185 209 ++136 185 209 101 161 196 136 185 209 136 185 209 101 161 196 136 185 209 ++101 161 196 136 185 209 136 185 209 136 185 209 136 185 209 16 89 141 ++7 11 13 2 5 5 2 5 5 13 16 17 60 73 81 154 154 154 ++174 174 174 174 174 174 174 174 174 174 174 174 163 162 163 125 124 125 ++24 26 27 4 0 0 4 0 0 4 0 0 5 5 5 5 5 5 ++4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 ++5 5 5 4 4 4 ++4 0 0 6 6 6 37 38 37 137 136 137 137 136 137 131 129 131 ++131 129 131 153 152 153 131 129 131 26 28 28 4 0 0 4 3 3 ++6 6 6 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 ++13 20 25 51 88 114 90 154 193 101 161 196 101 161 196 90 154 193 ++90 154 193 90 154 193 90 154 193 90 154 193 90 154 193 101 161 196 ++101 161 196 101 161 196 101 161 196 101 161 196 136 185 209 101 161 196 ++101 161 196 136 185 209 101 161 196 136 185 209 136 185 209 101 161 196 ++136 185 209 101 161 196 136 185 209 101 161 196 101 161 196 101 161 196 ++136 185 209 136 185 209 136 185 209 37 112 160 21 29 34 5 7 8 ++2 5 5 13 16 17 43 57 68 131 129 131 174 174 174 174 174 174 ++174 174 174 167 166 167 157 156 157 125 124 125 37 38 37 4 0 0 ++4 0 0 4 0 0 5 5 5 5 5 5 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++1 1 1 4 0 0 41 54 63 153 152 153 137 136 137 137 136 137 ++137 136 137 153 152 153 125 124 125 24 26 27 4 0 0 3 2 2 ++4 4 4 4 4 4 4 3 3 4 0 0 3 6 7 43 61 72 ++64 123 161 101 161 196 90 154 193 90 154 193 90 154 193 90 154 193 ++90 154 193 90 154 193 90 154 193 90 154 193 101 161 196 90 154 193 ++101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 ++101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 ++136 185 209 101 161 196 101 161 196 136 185 209 136 185 209 101 161 196 ++101 161 196 90 154 193 28 67 93 13 16 17 7 11 13 3 6 7 ++37 51 59 125 124 125 163 162 163 174 174 174 167 166 167 166 165 166 ++167 166 167 131 129 131 60 73 81 4 0 0 4 0 0 4 0 0 ++3 3 3 5 5 5 6 6 6 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 41 54 63 137 136 137 153 152 153 137 136 137 ++153 152 153 157 156 157 125 124 125 24 26 27 0 0 0 2 2 2 ++4 4 4 4 4 4 2 0 0 0 0 0 28 67 93 90 154 193 ++90 154 193 90 154 193 90 154 193 90 154 193 64 123 161 90 154 193 ++90 154 193 90 154 193 90 154 193 90 154 193 90 154 193 101 161 196 ++90 154 193 101 161 196 101 161 196 101 161 196 90 154 193 136 185 209 ++101 161 196 101 161 196 136 185 209 101 161 196 136 185 209 101 161 196 ++101 161 196 101 161 196 136 185 209 101 161 196 101 161 196 90 154 193 ++35 83 115 13 16 17 3 6 7 2 5 5 13 16 17 60 74 84 ++154 154 154 166 165 166 165 164 165 158 157 158 163 162 163 157 156 157 ++60 74 84 13 16 17 4 0 0 4 0 0 3 2 2 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++1 1 1 4 0 0 41 54 63 157 156 157 155 154 155 137 136 137 ++153 152 153 158 157 158 137 136 137 26 28 28 2 0 0 2 2 2 ++4 4 4 4 4 4 1 0 0 6 10 14 34 86 122 90 154 193 ++64 123 161 90 154 193 64 123 161 90 154 193 90 154 193 90 154 193 ++64 123 161 90 154 193 90 154 193 90 154 193 90 154 193 90 154 193 ++101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 ++101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 ++136 185 209 101 161 196 136 185 209 90 154 193 26 108 161 22 40 52 ++13 16 17 5 7 8 2 5 5 2 5 5 37 38 37 165 164 165 ++174 174 174 163 162 163 154 154 154 165 164 165 167 166 167 60 73 81 ++6 6 6 4 0 0 4 0 0 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 6 6 6 41 54 63 156 155 156 158 157 158 153 152 153 ++156 155 156 165 164 165 137 136 137 26 28 28 0 0 0 2 2 2 ++4 4 5 4 4 4 2 0 0 7 12 15 31 96 139 64 123 161 ++90 154 193 64 123 161 90 154 193 90 154 193 64 123 161 90 154 193 ++90 154 193 90 154 193 90 154 193 90 154 193 90 154 193 90 154 193 ++90 154 193 90 154 193 90 154 193 101 161 196 101 161 196 101 161 196 ++101 161 196 101 161 196 101 161 196 101 161 196 101 161 196 136 185 209 ++101 161 196 136 185 209 26 108 161 22 40 52 7 11 13 5 7 8 ++2 5 5 2 5 5 2 5 5 2 2 1 37 38 37 158 157 158 ++174 174 174 154 154 154 156 155 156 167 166 167 165 164 165 37 38 37 ++4 0 0 4 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++3 1 0 4 0 0 60 73 81 157 156 157 163 162 163 153 152 153 ++158 157 158 167 166 167 137 136 137 26 28 28 2 0 0 2 2 2 ++4 5 5 4 4 4 4 0 0 7 12 15 24 86 132 26 108 161 ++37 112 160 64 123 161 90 154 193 64 123 161 90 154 193 90 154 193 ++90 154 193 90 154 193 90 154 193 90 154 193 90 154 193 90 154 193 ++90 154 193 101 161 196 90 154 193 101 161 196 101 161 196 101 161 196 ++101 161 196 101 161 196 101 161 196 136 185 209 101 161 196 136 185 209 ++90 154 193 35 83 115 13 16 17 13 16 17 7 11 13 3 6 7 ++5 7 8 6 6 6 3 4 3 2 2 1 30 32 34 154 154 154 ++167 166 167 154 154 154 154 154 154 174 174 174 165 164 165 37 38 37 ++6 6 6 4 0 0 6 6 6 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 41 54 63 163 162 163 166 165 166 154 154 154 ++163 162 163 174 174 174 137 136 137 26 28 28 0 0 0 2 2 2 ++4 5 5 4 4 5 1 1 2 6 10 14 28 67 93 18 97 151 ++18 97 151 18 97 151 26 108 161 37 112 160 37 112 160 90 154 193 ++64 123 161 90 154 193 90 154 193 90 154 193 90 154 193 101 161 196 ++90 154 193 101 161 196 101 161 196 90 154 193 101 161 196 101 161 196 ++101 161 196 101 161 196 101 161 196 136 185 209 90 154 193 16 89 141 ++13 20 25 7 11 13 5 7 8 5 7 8 2 5 5 4 5 5 ++3 4 3 4 5 5 3 4 3 0 0 0 37 38 37 158 157 158 ++174 174 174 158 157 158 158 157 158 167 166 167 174 174 174 41 54 63 ++4 0 0 3 2 2 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++1 1 1 4 0 0 60 73 81 165 164 165 174 174 174 158 157 158 ++167 166 167 174 174 174 153 152 153 26 28 28 2 0 0 2 2 2 ++4 5 5 4 4 4 4 0 0 7 12 15 10 87 144 10 87 144 ++18 97 151 18 97 151 18 97 151 26 108 161 26 108 161 26 108 161 ++26 108 161 37 112 160 53 118 160 90 154 193 90 154 193 90 154 193 ++90 154 193 90 154 193 101 161 196 101 161 196 101 161 196 101 161 196 ++101 161 196 136 185 209 90 154 193 26 108 161 22 40 52 13 16 17 ++7 11 13 3 6 7 5 7 8 5 7 8 2 5 5 4 5 5 ++4 5 5 6 6 6 3 4 3 0 0 0 30 32 34 158 157 158 ++174 174 174 156 155 156 155 154 155 165 164 165 154 153 154 37 38 37 ++4 0 0 4 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 60 73 81 167 166 167 174 174 174 163 162 163 ++174 174 174 174 174 174 153 152 153 26 28 28 0 0 0 3 3 3 ++5 5 5 4 4 4 1 1 2 7 12 15 28 67 93 18 97 151 ++18 97 151 18 97 151 18 97 151 18 97 151 18 97 151 26 108 161 ++26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 ++90 154 193 26 108 161 90 154 193 90 154 193 90 154 193 101 161 196 ++101 161 196 26 108 161 22 40 52 13 16 17 7 11 13 2 5 5 ++2 5 5 6 6 6 2 5 5 4 5 5 4 5 5 4 5 5 ++3 4 3 5 5 5 3 4 3 2 0 0 30 32 34 137 136 137 ++153 152 153 137 136 137 131 129 131 137 136 137 131 129 131 37 38 37 ++4 0 0 4 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++1 1 1 4 0 0 60 73 81 167 166 167 174 174 174 166 165 166 ++174 174 174 177 184 187 153 152 153 30 32 34 1 0 0 3 3 3 ++5 5 5 4 3 3 4 0 0 7 12 15 10 87 144 10 87 144 ++18 97 151 18 97 151 18 97 151 26 108 161 26 108 161 26 108 161 ++26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 ++26 108 161 26 108 161 26 108 161 90 154 193 90 154 193 26 108 161 ++35 83 115 13 16 17 7 11 13 5 7 8 3 6 7 5 7 8 ++2 5 5 6 6 6 4 5 5 4 5 5 3 4 3 4 5 5 ++3 4 3 6 6 6 3 4 3 0 0 0 26 28 28 125 124 125 ++131 129 131 125 124 125 125 124 125 131 129 131 131 129 131 37 38 37 ++4 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++3 1 0 4 0 0 60 73 81 174 174 174 177 184 187 167 166 167 ++174 174 174 177 184 187 153 152 153 30 32 34 0 0 0 3 3 3 ++5 5 5 4 4 4 1 1 2 6 10 14 28 67 93 18 97 151 ++18 97 151 18 97 151 18 97 151 18 97 151 18 97 151 26 108 161 ++26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 ++26 108 161 90 154 193 26 108 161 26 108 161 24 86 132 13 20 25 ++7 11 13 13 20 25 22 40 52 5 7 8 3 4 3 3 4 3 ++4 5 5 3 4 3 4 5 5 3 4 3 4 5 5 3 4 3 ++4 4 4 5 5 5 3 3 3 2 0 0 26 28 28 125 124 125 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++1 1 1 4 0 0 60 73 81 174 174 174 177 184 187 174 174 174 ++174 174 174 190 197 201 157 156 157 30 32 34 1 0 0 3 3 3 ++5 5 5 4 3 3 4 0 0 7 12 15 10 87 144 10 87 144 ++18 97 151 19 95 150 19 95 150 18 97 151 18 97 151 26 108 161 ++18 97 151 26 108 161 26 108 161 26 108 161 26 108 161 90 154 193 ++26 108 161 26 108 161 26 108 161 22 40 52 2 5 5 3 4 3 ++28 67 93 37 112 160 34 86 122 2 5 5 3 4 3 3 4 3 ++3 4 3 3 4 3 3 4 3 2 2 1 3 4 3 4 4 4 ++4 5 5 5 5 5 3 3 3 0 0 0 26 28 28 131 129 131 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 60 73 81 174 174 174 177 184 187 174 174 174 ++174 174 174 190 197 201 158 157 158 30 32 34 0 0 0 2 2 2 ++5 5 5 4 4 4 1 1 2 6 10 14 28 67 93 18 97 151 ++10 87 144 19 95 150 19 95 150 18 97 151 18 97 151 18 97 151 ++26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 ++18 97 151 22 40 52 2 5 5 2 2 1 22 40 52 26 108 161 ++90 154 193 37 112 160 22 40 52 3 4 3 13 20 25 22 30 35 ++3 6 7 1 1 1 2 2 2 6 9 11 5 5 5 4 3 3 ++4 4 4 5 5 5 3 3 3 2 0 0 26 28 28 131 129 131 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++1 1 1 4 0 0 60 73 81 177 184 187 193 200 203 174 174 174 ++177 184 187 193 200 203 163 162 163 30 32 34 4 0 0 2 2 2 ++5 5 5 4 3 3 4 0 0 6 10 14 24 86 132 10 87 144 ++10 87 144 10 87 144 19 95 150 19 95 150 19 95 150 18 97 151 ++26 108 161 26 108 161 26 108 161 90 154 193 26 108 161 28 67 93 ++6 10 14 2 5 5 13 20 25 24 86 132 37 112 160 90 154 193 ++10 87 144 7 12 15 2 5 5 28 67 93 37 112 160 28 67 93 ++2 2 1 7 12 15 35 83 115 28 67 93 3 6 7 1 0 0 ++4 4 4 5 5 5 3 3 3 0 0 0 26 28 28 131 129 131 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 60 73 81 174 174 174 190 197 201 174 174 174 ++177 184 187 193 200 203 163 162 163 30 32 34 0 0 0 2 2 2 ++5 5 5 4 4 4 1 1 2 6 10 14 28 67 93 10 87 144 ++10 87 144 16 89 141 19 95 150 10 87 144 26 108 161 26 108 161 ++26 108 161 26 108 161 26 108 161 28 67 93 6 10 14 1 1 2 ++7 12 15 28 67 93 26 108 161 16 89 141 24 86 132 21 29 34 ++3 4 3 21 29 34 37 112 160 37 112 160 27 99 146 21 29 34 ++21 29 34 26 108 161 90 154 193 35 83 115 1 1 2 2 0 0 ++4 4 4 5 5 5 3 3 3 2 0 0 26 28 28 125 124 125 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++3 1 0 4 0 0 60 73 81 193 200 203 193 200 203 174 174 174 ++190 197 201 193 200 203 165 164 165 37 38 37 4 0 0 2 2 2 ++5 5 5 4 3 3 4 0 0 6 10 14 24 86 132 10 87 144 ++10 87 144 10 87 144 16 89 141 18 97 151 18 97 151 10 87 144 ++24 86 132 24 86 132 13 20 25 4 5 7 4 5 7 22 40 52 ++18 97 151 37 112 160 26 108 161 7 12 15 1 1 1 0 0 0 ++28 67 93 37 112 160 26 108 161 28 67 93 22 40 52 28 67 93 ++26 108 161 90 154 193 26 108 161 10 87 144 0 0 0 2 0 0 ++4 4 4 5 5 5 3 3 3 0 0 0 26 28 28 131 129 131 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 6 6 6 60 73 81 174 174 174 193 200 203 174 174 174 ++190 197 201 193 200 203 165 164 165 30 32 34 0 0 0 2 2 2 ++5 5 5 4 4 4 1 1 2 6 10 14 28 67 93 10 87 144 ++10 87 144 10 87 144 10 87 144 18 97 151 28 67 93 6 10 14 ++0 0 0 1 1 2 4 5 7 13 20 25 16 89 141 26 108 161 ++26 108 161 26 108 161 24 86 132 6 9 11 2 3 3 22 40 52 ++37 112 160 16 89 141 22 40 52 28 67 93 26 108 161 26 108 161 ++90 154 193 26 108 161 26 108 161 28 67 93 1 1 1 4 0 0 ++4 4 4 5 5 5 3 3 3 4 0 0 26 28 28 124 126 130 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 60 73 81 193 200 203 193 200 203 174 174 174 ++193 200 203 193 200 203 167 166 167 37 38 37 4 0 0 2 2 2 ++5 5 5 4 4 4 4 0 0 6 10 14 28 67 93 10 87 144 ++10 87 144 10 87 144 18 97 151 10 87 144 13 20 25 4 5 7 ++1 1 2 1 1 1 22 40 52 26 108 161 26 108 161 26 108 161 ++26 108 161 26 108 161 26 108 161 24 86 132 22 40 52 22 40 52 ++22 40 52 22 40 52 10 87 144 26 108 161 26 108 161 26 108 161 ++26 108 161 26 108 161 90 154 193 10 87 144 0 0 0 4 0 0 ++4 4 4 5 5 5 3 3 3 0 0 0 26 28 28 131 129 131 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 6 6 6 60 73 81 174 174 174 220 221 221 174 174 174 ++190 197 201 205 212 215 167 166 167 30 32 34 0 0 0 2 2 2 ++5 5 5 4 4 4 1 1 2 6 10 14 28 67 93 10 87 144 ++10 87 144 10 87 144 10 87 144 10 87 144 22 40 52 1 1 2 ++2 0 0 1 1 2 24 86 132 26 108 161 26 108 161 26 108 161 ++26 108 161 19 95 150 16 89 141 10 87 144 22 40 52 22 40 52 ++10 87 144 26 108 161 37 112 160 26 108 161 26 108 161 26 108 161 ++26 108 161 26 108 161 26 108 161 28 67 93 2 0 0 3 1 0 ++4 4 4 5 5 5 3 3 3 2 0 0 26 28 28 131 129 131 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 60 73 81 220 221 221 190 197 201 174 174 174 ++193 200 203 193 200 203 174 174 174 37 38 37 4 0 0 2 2 2 ++5 5 5 4 4 4 3 2 2 1 1 2 13 20 25 10 87 144 ++10 87 144 10 87 144 10 87 144 10 87 144 10 87 144 13 20 25 ++13 20 25 22 40 52 10 87 144 18 97 151 18 97 151 26 108 161 ++10 87 144 13 20 25 6 10 14 21 29 34 24 86 132 18 97 151 ++26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 ++26 108 161 90 154 193 18 97 151 13 20 25 0 0 0 4 3 3 ++4 4 4 5 5 5 3 3 3 0 0 0 26 28 28 131 129 131 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 6 6 6 60 73 81 174 174 174 220 221 221 174 174 174 ++190 197 201 220 221 221 167 166 167 30 32 34 1 0 0 2 2 2 ++5 5 5 4 4 4 4 4 5 2 5 5 4 5 7 13 20 25 ++28 67 93 10 87 144 10 87 144 10 87 144 10 87 144 10 87 144 ++10 87 144 10 87 144 18 97 151 10 87 144 18 97 151 18 97 151 ++28 67 93 2 3 3 0 0 0 28 67 93 26 108 161 26 108 161 ++26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 26 108 161 ++26 108 161 10 87 144 13 20 25 1 1 2 3 2 2 4 4 4 ++4 4 4 5 5 5 3 3 3 2 0 0 26 28 28 131 129 131 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 60 73 81 220 221 221 190 197 201 174 174 174 ++193 200 203 193 200 203 174 174 174 26 28 28 4 0 0 4 3 3 ++5 5 5 4 4 4 4 4 4 4 4 5 1 1 2 2 5 5 ++4 5 7 22 40 52 10 87 144 10 87 144 18 97 151 10 87 144 ++10 87 144 10 87 144 10 87 144 10 87 144 10 87 144 18 97 151 ++10 87 144 28 67 93 22 40 52 10 87 144 26 108 161 18 97 151 ++18 97 151 18 97 151 26 108 161 26 108 161 26 108 161 26 108 161 ++22 40 52 1 1 2 0 0 0 2 3 3 4 4 4 4 4 4 ++4 4 4 5 5 5 4 4 4 0 0 0 26 28 28 131 129 131 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 6 6 6 60 73 81 174 174 174 220 221 221 174 174 174 ++190 197 201 220 221 221 190 197 201 41 54 63 4 0 0 2 2 2 ++6 6 6 4 4 4 4 4 4 4 4 5 4 4 5 3 3 3 ++1 1 2 1 1 2 6 10 14 22 40 52 10 87 144 18 97 151 ++18 97 151 10 87 144 10 87 144 10 87 144 18 97 151 10 87 144 ++10 87 144 18 97 151 26 108 161 18 97 151 18 97 151 10 87 144 ++26 108 161 26 108 161 26 108 161 10 87 144 28 67 93 6 10 14 ++1 1 2 1 1 2 4 3 3 4 4 5 4 4 4 4 4 4 ++5 5 5 5 5 5 1 1 1 4 0 0 37 51 59 137 136 137 ++137 136 137 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 4 0 0 60 73 81 220 221 221 193 200 203 174 174 174 ++193 200 203 193 200 203 220 221 221 137 136 137 13 16 17 4 0 0 ++2 2 2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 ++4 4 5 4 3 3 1 1 2 4 5 7 13 20 25 28 67 93 ++10 87 144 10 87 144 10 87 144 10 87 144 10 87 144 10 87 144 ++10 87 144 18 97 151 18 97 151 10 87 144 18 97 151 26 108 161 ++26 108 161 18 97 151 28 67 93 6 10 14 0 0 0 0 0 0 ++2 3 3 4 5 5 4 4 5 4 4 4 4 4 4 5 5 5 ++3 3 3 1 1 1 0 0 0 16 19 21 125 124 125 137 136 137 ++131 129 131 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 6 6 6 60 73 81 174 174 174 220 221 221 174 174 174 ++193 200 203 190 197 201 220 221 221 220 221 221 153 152 153 30 32 34 ++0 0 0 0 0 0 2 2 2 4 4 4 4 4 4 4 4 4 ++4 4 4 4 5 5 4 5 7 1 1 2 1 1 2 4 5 7 ++13 20 25 28 67 93 10 87 144 18 97 151 10 87 144 10 87 144 ++10 87 144 10 87 144 10 87 144 18 97 151 26 108 161 18 97 151 ++28 67 93 7 12 15 0 0 0 0 0 0 2 2 1 4 4 4 ++4 5 5 4 5 5 4 4 4 4 4 4 3 3 3 0 0 0 ++0 0 0 0 0 0 37 38 37 125 124 125 158 157 158 131 129 131 ++125 124 125 125 124 125 125 124 125 137 136 137 131 129 131 37 38 37 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 3 3 4 0 0 41 54 63 193 200 203 220 221 221 174 174 174 ++193 200 203 193 200 203 193 200 203 220 221 221 244 246 246 193 200 203 ++120 125 127 5 5 5 1 0 0 0 0 0 1 1 1 4 4 4 ++4 4 4 4 4 4 4 5 5 4 5 5 4 4 5 1 1 2 ++4 5 7 4 5 7 22 40 52 10 87 144 10 87 144 10 87 144 ++10 87 144 10 87 144 18 97 151 10 87 144 10 87 144 13 20 25 ++4 5 7 2 3 3 1 1 2 4 4 4 4 5 5 4 4 4 ++4 4 4 4 4 4 4 4 4 1 1 1 0 0 0 1 1 2 ++24 26 27 60 74 84 153 152 153 163 162 163 137 136 137 125 124 125 ++125 124 125 125 124 125 125 124 125 137 136 137 125 124 125 26 28 28 ++0 0 0 3 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 0 0 6 6 6 26 28 28 156 155 156 220 221 221 220 221 221 ++174 174 174 193 200 203 193 200 203 193 200 203 205 212 215 220 221 221 ++220 221 221 167 166 167 60 73 81 7 11 13 0 0 0 0 0 0 ++3 3 3 4 4 4 4 4 4 4 4 4 4 4 5 4 4 5 ++4 4 5 1 1 2 1 1 2 4 5 7 22 40 52 10 87 144 ++10 87 144 10 87 144 10 87 144 22 40 52 4 5 7 1 1 2 ++1 1 2 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4 ++5 5 5 2 2 2 0 0 0 4 0 0 16 19 21 60 73 81 ++137 136 137 167 166 167 158 157 158 137 136 137 131 129 131 131 129 131 ++125 124 125 125 124 125 131 129 131 155 154 155 60 74 84 5 7 8 ++0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++5 5 5 4 0 0 4 0 0 60 73 81 193 200 203 220 221 221 ++193 200 203 193 200 203 193 200 203 193 200 203 205 212 215 220 221 221 ++220 221 221 220 221 221 220 221 221 137 136 137 43 57 68 6 6 6 ++4 0 0 1 1 1 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 5 4 4 5 3 2 2 1 1 2 2 5 5 13 20 25 ++22 40 52 22 40 52 13 20 25 2 3 3 1 1 2 3 3 3 ++4 5 7 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++1 1 1 0 0 0 2 3 3 41 54 63 131 129 131 166 165 166 ++166 165 166 155 154 155 153 152 153 137 136 137 137 136 137 125 124 125 ++125 124 125 137 136 137 137 136 137 125 124 125 37 38 37 4 3 3 ++4 3 3 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 3 3 6 6 6 6 6 6 13 16 17 60 73 81 167 166 167 ++220 221 221 220 221 221 220 221 221 193 200 203 193 200 203 193 200 203 ++205 212 215 220 221 221 220 221 221 244 246 246 205 212 215 125 124 125 ++24 26 27 0 0 0 0 0 0 2 2 2 5 5 5 5 5 5 ++4 4 4 4 4 4 4 4 4 4 4 5 1 1 2 4 5 7 ++4 5 7 4 5 7 1 1 2 3 2 2 4 4 5 4 4 4 ++4 4 4 4 4 4 5 5 5 4 4 4 0 0 0 0 0 0 ++2 0 0 26 28 28 125 124 125 174 174 174 174 174 174 166 165 166 ++156 155 156 153 152 153 137 136 137 137 136 137 131 129 131 137 136 137 ++137 136 137 137 136 137 60 74 84 30 32 34 4 0 0 4 0 0 ++5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++5 5 5 6 6 6 4 0 0 4 0 0 6 6 6 26 28 28 ++125 124 125 174 174 174 220 221 221 220 221 221 220 221 221 193 200 203 ++205 212 215 220 221 221 205 212 215 220 221 221 220 221 221 244 246 246 ++193 200 203 60 74 84 13 16 17 4 0 0 0 0 0 3 3 3 ++5 5 5 5 5 5 4 4 4 4 4 4 4 4 5 3 3 3 ++1 1 2 3 3 3 4 4 5 4 4 5 4 4 4 4 4 4 ++5 5 5 5 5 5 2 2 2 0 0 0 0 0 0 13 16 17 ++60 74 84 174 174 174 193 200 203 174 174 174 167 166 167 163 162 163 ++153 152 153 153 152 153 137 136 137 137 136 137 153 152 153 137 136 137 ++125 124 125 41 54 63 24 26 27 4 0 0 4 0 0 5 5 5 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 3 3 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ++6 6 6 37 38 37 131 129 131 220 221 221 220 221 221 220 221 221 ++193 200 203 193 200 203 220 221 221 205 212 215 220 221 221 244 246 246 ++244 246 246 244 246 246 174 174 174 41 54 63 0 0 0 0 0 0 ++0 0 0 4 4 4 5 5 5 5 5 5 4 4 4 4 4 5 ++4 4 5 4 4 5 4 4 4 4 4 4 6 6 6 6 6 6 ++3 3 3 0 0 0 2 0 0 13 16 17 60 73 81 156 155 156 ++220 221 221 193 200 203 174 174 174 165 164 165 163 162 163 154 153 154 ++153 152 153 153 152 153 158 157 158 163 162 163 137 136 137 60 73 81 ++13 16 17 4 0 0 4 0 0 4 3 3 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++5 5 5 4 3 3 4 3 3 6 6 6 6 6 6 6 6 6 ++6 6 6 6 6 6 6 6 6 37 38 37 167 166 167 244 246 246 ++244 246 246 220 221 221 205 212 215 205 212 215 220 221 221 193 200 203 ++220 221 221 244 246 246 244 246 246 244 246 246 137 136 137 37 38 37 ++3 2 2 0 0 0 1 1 1 5 5 5 5 5 5 4 4 4 ++4 4 4 4 4 4 4 4 4 5 5 5 4 4 4 1 1 1 ++0 0 0 5 5 5 43 57 68 153 152 153 193 200 203 220 221 221 ++177 184 187 174 174 174 167 166 167 166 165 166 158 157 158 157 156 157 ++158 157 158 166 165 166 156 155 156 85 115 134 13 16 17 4 0 0 ++4 0 0 4 0 0 5 5 5 5 5 5 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++5 5 5 4 3 3 6 6 6 6 6 6 4 0 0 6 6 6 ++6 6 6 6 6 6 6 6 6 6 6 6 13 16 17 60 73 81 ++177 184 187 220 221 221 220 221 221 220 221 221 205 212 215 220 221 221 ++220 221 221 205 212 215 220 221 221 244 246 246 244 246 246 205 212 215 ++125 124 125 30 32 34 0 0 0 0 0 0 2 2 2 5 5 5 ++4 4 4 4 4 4 4 4 4 1 1 1 0 0 0 1 0 0 ++37 38 37 131 129 131 205 212 215 220 221 221 193 200 203 174 174 174 ++174 174 174 174 174 174 167 166 167 165 164 165 166 165 166 167 166 167 ++158 157 158 125 124 125 37 38 37 4 0 0 4 0 0 4 0 0 ++4 3 3 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 5 5 5 4 3 3 4 3 3 6 6 6 6 6 6 ++4 0 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ++26 28 28 125 124 125 205 212 215 220 221 221 220 221 221 220 221 221 ++205 212 215 220 221 221 205 212 215 220 221 221 220 221 221 244 246 246 ++244 246 246 190 197 201 60 74 84 16 19 21 4 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 16 19 21 120 125 127 ++177 184 187 220 221 221 205 212 215 177 184 187 174 174 174 177 184 187 ++174 174 174 174 174 174 167 166 167 174 174 174 166 165 166 137 136 137 ++60 73 81 13 16 17 4 0 0 4 0 0 4 3 3 6 6 6 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++5 5 5 4 3 3 5 5 5 4 3 3 6 6 6 4 0 0 ++6 6 6 6 6 6 4 0 0 6 6 6 4 0 0 6 6 6 ++6 6 6 6 6 6 37 38 37 137 136 137 193 200 203 220 221 221 ++220 221 221 205 212 215 220 221 221 205 212 215 205 212 215 220 221 221 ++220 221 221 220 221 221 244 246 246 166 165 166 43 57 68 2 2 2 ++0 0 0 4 0 0 16 19 21 60 73 81 157 156 157 202 210 214 ++220 221 221 193 200 203 177 184 187 177 184 187 177 184 187 174 174 174 ++174 174 174 174 174 174 174 174 174 157 156 157 60 74 84 24 26 27 ++4 0 0 4 0 0 4 0 0 6 6 6 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 5 5 5 4 3 3 5 5 5 6 6 6 ++6 6 6 4 0 0 6 6 6 6 6 6 6 6 6 4 0 0 ++4 0 0 4 0 0 6 6 6 24 26 27 60 73 81 167 166 167 ++220 221 221 220 221 221 220 221 221 205 212 215 205 212 215 205 212 215 ++205 212 215 220 221 221 220 221 221 220 221 221 205 212 215 137 136 137 ++60 74 84 125 124 125 137 136 137 190 197 201 220 221 221 193 200 203 ++177 184 187 177 184 187 177 184 187 174 174 174 174 174 174 177 184 187 ++190 197 201 174 174 174 125 124 125 37 38 37 6 6 6 4 0 0 ++4 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 5 5 5 5 5 5 4 3 3 6 6 6 ++4 0 0 6 6 6 6 6 6 6 6 6 4 0 0 6 6 6 ++6 6 6 6 6 6 4 0 0 4 0 0 6 6 6 6 6 6 ++125 124 125 193 200 203 244 246 246 220 221 221 205 212 215 205 212 215 ++205 212 215 193 200 203 205 212 215 205 212 215 220 221 221 220 221 221 ++193 200 203 193 200 203 205 212 215 193 200 203 193 200 203 177 184 187 ++190 197 201 190 197 201 174 174 174 190 197 201 193 200 203 190 197 201 ++153 152 153 60 73 81 4 0 0 4 0 0 4 0 0 3 2 2 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 4 3 3 ++6 6 6 4 3 3 4 3 3 4 3 3 6 6 6 6 6 6 ++4 0 0 6 6 6 6 6 6 6 6 6 4 0 0 4 0 0 ++4 0 0 26 28 28 131 129 131 220 221 221 244 246 246 220 221 221 ++205 212 215 193 200 203 205 212 215 193 200 203 193 200 203 205 212 215 ++220 221 221 193 200 203 193 200 203 193 200 203 190 197 201 174 174 174 ++174 174 174 190 197 201 193 200 203 193 200 203 167 166 167 125 124 125 ++6 6 6 4 0 0 4 0 0 4 3 3 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 ++5 5 5 4 3 3 5 5 5 6 6 6 4 3 3 5 5 5 ++6 6 6 6 6 6 4 0 0 6 6 6 6 6 6 6 6 6 ++4 0 0 4 0 0 6 6 6 41 54 63 158 157 158 220 221 221 ++220 221 221 220 221 221 193 200 203 193 200 203 193 200 203 190 197 201 ++190 197 201 190 197 201 190 197 201 190 197 201 174 174 174 193 200 203 ++193 200 203 220 221 221 174 174 174 125 124 125 37 38 37 4 0 0 ++4 0 0 4 3 3 6 6 6 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 5 5 5 4 3 3 4 3 3 4 3 3 5 5 5 ++4 3 3 6 6 6 5 5 5 4 3 3 6 6 6 6 6 6 ++6 6 6 6 6 6 4 0 0 4 0 0 13 16 17 60 73 81 ++174 174 174 220 221 221 220 221 221 205 212 215 190 197 201 174 174 174 ++193 200 203 174 174 174 190 197 201 174 174 174 193 200 203 220 221 221 ++193 200 203 131 129 131 37 38 37 6 6 6 4 0 0 4 0 0 ++6 6 6 6 6 6 4 3 3 5 5 5 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 ++5 5 5 4 3 3 4 3 3 5 5 5 4 3 3 4 3 3 ++5 5 5 6 6 6 6 6 6 4 0 0 6 6 6 6 6 6 ++6 6 6 125 124 125 174 174 174 220 221 221 220 221 221 193 200 203 ++193 200 203 193 200 203 193 200 203 193 200 203 220 221 221 158 157 158 ++60 73 81 6 6 6 4 0 0 4 0 0 5 5 5 6 6 6 ++5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 5 5 5 5 5 5 4 3 3 5 5 5 4 3 3 ++5 5 5 5 5 5 6 6 6 6 6 6 4 0 0 4 0 0 ++4 0 0 4 0 0 26 28 28 125 124 125 174 174 174 193 200 203 ++193 200 203 174 174 174 193 200 203 167 166 167 125 124 125 6 6 6 ++6 6 6 6 6 6 4 0 0 6 6 6 6 6 6 5 5 5 ++4 3 3 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 ++4 3 3 6 6 6 4 0 0 6 6 6 6 6 6 6 6 6 ++6 6 6 4 0 0 4 0 0 6 6 6 37 38 37 125 124 125 ++153 152 153 131 129 131 125 124 125 37 38 37 6 6 6 6 6 6 ++6 6 6 4 0 0 6 6 6 6 6 6 4 3 3 5 5 5 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 5 5 5 5 5 5 4 3 3 5 5 5 4 3 3 ++6 6 6 6 6 6 4 0 0 4 0 0 6 6 6 6 6 6 ++24 26 27 24 26 27 6 6 6 6 6 6 6 6 6 4 0 0 ++6 6 6 6 6 6 4 0 0 6 6 6 5 5 5 4 3 3 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 5 5 5 4 3 3 5 5 5 6 6 6 ++4 0 0 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ++6 6 6 6 6 6 6 6 6 4 0 0 6 6 6 6 6 6 ++4 0 0 6 6 6 6 6 6 4 3 3 5 5 5 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 5 5 5 4 3 3 5 5 5 ++5 5 5 5 5 5 4 0 0 6 6 6 4 0 0 6 6 6 ++6 6 6 6 6 6 6 6 6 4 0 0 6 6 6 4 0 0 ++6 6 6 4 3 3 5 5 5 4 3 3 5 5 5 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 ++4 3 3 6 6 6 4 3 3 6 6 6 6 6 6 6 6 6 ++4 0 0 6 6 6 4 0 0 6 6 6 6 6 6 6 6 6 ++6 6 6 4 3 3 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 5 5 5 4 3 3 5 5 5 4 0 0 6 6 6 ++6 6 6 4 0 0 6 6 6 6 6 6 4 0 0 6 6 6 ++4 3 3 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 5 5 5 4 3 3 5 5 5 6 6 6 4 3 3 ++4 3 3 6 6 6 6 6 6 4 3 3 6 6 6 4 3 3 ++5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 5 5 5 4 3 3 6 6 6 ++5 5 5 4 3 3 4 3 3 4 3 3 5 5 5 5 5 5 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 4 3 3 ++5 5 5 4 3 3 5 5 5 5 5 5 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ++4 4 4 4 4 4 +diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c +index 70fba97..8ec7f86 100644 +--- a/drivers/xen/events/events_base.c ++++ b/drivers/xen/events/events_base.c +@@ -1563,7 +1563,7 @@ void xen_irq_resume(void) + restore_pirqs(); + } + +-static struct irq_chip xen_dynamic_chip __read_mostly = { ++static struct irq_chip xen_dynamic_chip = { + .name = "xen-dyn", + + .irq_disable = disable_dynirq, +@@ -1577,7 +1577,7 @@ static struct irq_chip xen_dynamic_chip __read_mostly = { + .irq_retrigger = retrigger_dynirq, + }; + +-static struct irq_chip xen_pirq_chip __read_mostly = { ++static struct irq_chip xen_pirq_chip = { + .name = "xen-pirq", + + .irq_startup = startup_pirq, +@@ -1597,7 +1597,7 @@ static struct irq_chip xen_pirq_chip __read_mostly = { + .irq_retrigger = retrigger_dynirq, + }; + +-static struct irq_chip xen_percpu_chip __read_mostly = { ++static struct irq_chip xen_percpu_chip = { + .name = "xen-percpu", + + .irq_disable = disable_dynirq, +diff --git a/drivers/xen/xenfs/xenstored.c b/drivers/xen/xenfs/xenstored.c +index fef20db..d28b1ab 100644 +--- a/drivers/xen/xenfs/xenstored.c ++++ b/drivers/xen/xenfs/xenstored.c +@@ -24,7 +24,12 @@ static int xsd_release(struct inode *inode, struct file *file) + static int xsd_kva_open(struct inode *inode, struct file *file) + { + file->private_data = (void *)kasprintf(GFP_KERNEL, "0x%p", ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ NULL); ++#else + xen_store_interface); ++#endif ++ + if (!file->private_data) + return -ENOMEM; + return 0; +diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c +index eb14e05..5156de7 100644 +--- a/fs/9p/vfs_addr.c ++++ b/fs/9p/vfs_addr.c +@@ -187,7 +187,7 @@ static int v9fs_vfs_writepage_locked(struct page *page) + + retval = v9fs_file_write_internal(inode, + v9inode->writeback_fid, +- (__force const char __user *)buffer, ++ (const char __force_user *)buffer, + len, &offset, 0); + if (retval > 0) + retval = 0; +diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c +index 296482f..183ddc3 100644 +--- a/fs/9p/vfs_inode.c ++++ b/fs/9p/vfs_inode.c +@@ -1312,7 +1312,7 @@ static void *v9fs_vfs_follow_link(struct dentry *dentry, struct nameidata *nd) + void + v9fs_vfs_put_link(struct dentry *dentry, struct nameidata *nd, void *p) + { +- char *s = nd_get_link(nd); ++ const char *s = nd_get_link(nd); + + p9_debug(P9_DEBUG_VFS, " %pd %s\n", + dentry, IS_ERR(s) ? "<error>" : s); +diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt +index 370b24c..ff0be7b 100644 +--- a/fs/Kconfig.binfmt ++++ b/fs/Kconfig.binfmt +@@ -103,7 +103,7 @@ config HAVE_AOUT + + config BINFMT_AOUT + tristate "Kernel support for a.out and ECOFF binaries" +- depends on HAVE_AOUT ++ depends on HAVE_AOUT && BROKEN + ---help--- + A.out (Assembler.OUTput) is a set of formats for libraries and + executables used in the earliest versions of UNIX. Linux used +diff --git a/fs/afs/inode.c b/fs/afs/inode.c +index 2946712..f737435 100644 +--- a/fs/afs/inode.c ++++ b/fs/afs/inode.c +@@ -141,7 +141,7 @@ struct inode *afs_iget_autocell(struct inode *dir, const char *dev_name, + struct afs_vnode *vnode; + struct super_block *sb; + struct inode *inode; +- static atomic_t afs_autocell_ino; ++ static atomic_unchecked_t afs_autocell_ino; + + _enter("{%x:%u},%*.*s,", + AFS_FS_I(dir)->fid.vid, AFS_FS_I(dir)->fid.vnode, +@@ -154,7 +154,7 @@ struct inode *afs_iget_autocell(struct inode *dir, const char *dev_name, + data.fid.unique = 0; + data.fid.vnode = 0; + +- inode = iget5_locked(sb, atomic_inc_return(&afs_autocell_ino), ++ inode = iget5_locked(sb, atomic_inc_return_unchecked(&afs_autocell_ino), + afs_iget5_autocell_test, afs_iget5_set, + &data); + if (!inode) { +diff --git a/fs/aio.c b/fs/aio.c +index 58caa7e..0e8159b 100644 +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -388,7 +388,7 @@ static int aio_setup_ring(struct kioctx *ctx) + size += sizeof(struct io_event) * nr_events; + + nr_pages = PFN_UP(size); +- if (nr_pages < 0) ++ if (nr_pages <= 0) + return -EINVAL; + + file = aio_private_file(ctx, nr_pages); +diff --git a/fs/attr.c b/fs/attr.c +index 6530ced..4a827e2 100644 +--- a/fs/attr.c ++++ b/fs/attr.c +@@ -102,6 +102,7 @@ int inode_newsize_ok(const struct inode *inode, loff_t offset) + unsigned long limit; + + limit = rlimit(RLIMIT_FSIZE); ++ gr_learn_resource(current, RLIMIT_FSIZE, (unsigned long)offset, 1); + if (limit != RLIM_INFINITY && offset > limit) + goto out_sig; + if (offset > inode->i_sb->s_maxbytes) +diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c +index 116fd38..c04182da 100644 +--- a/fs/autofs4/waitq.c ++++ b/fs/autofs4/waitq.c +@@ -59,7 +59,7 @@ static int autofs4_write(struct autofs_sb_info *sbi, + { + unsigned long sigpipe, flags; + mm_segment_t fs; +- const char *data = (const char *)addr; ++ const char __user *data = (const char __force_user *)addr; + ssize_t wr = 0; + + sigpipe = sigismember(¤t->pending.signal, SIGPIPE); +@@ -340,6 +340,10 @@ static int validate_request(struct autofs_wait_queue **wait, + return 1; + } + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++static atomic_unchecked_t autofs_dummy_name_id = ATOMIC_INIT(0); ++#endif ++ + int autofs4_wait(struct autofs_sb_info *sbi, struct dentry *dentry, + enum autofs_notify notify) + { +@@ -385,7 +389,12 @@ int autofs4_wait(struct autofs_sb_info *sbi, struct dentry *dentry, + + /* If this is a direct mount request create a dummy name */ + if (IS_ROOT(dentry) && autofs_type_trigger(sbi->type)) ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ /* this name does get written to userland via autofs4_write() */ ++ qstr.len = sprintf(name, "%08x", atomic_inc_return_unchecked(&autofs_dummy_name_id)); ++#else + qstr.len = sprintf(name, "%p", dentry); ++#endif + else { + qstr.len = autofs4_getpath(sbi, dentry, &name); + if (!qstr.len) { +diff --git a/fs/befs/endian.h b/fs/befs/endian.h +index 2722387..56059b5 100644 +--- a/fs/befs/endian.h ++++ b/fs/befs/endian.h +@@ -11,7 +11,7 @@ + + #include <asm/byteorder.h> + +-static inline u64 ++static inline u64 __intentional_overflow(-1) + fs64_to_cpu(const struct super_block *sb, fs64 n) + { + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) +@@ -29,7 +29,7 @@ cpu_to_fs64(const struct super_block *sb, u64 n) + return (__force fs64)cpu_to_be64(n); + } + +-static inline u32 ++static inline u32 __intentional_overflow(-1) + fs32_to_cpu(const struct super_block *sb, fs32 n) + { + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) +@@ -47,7 +47,7 @@ cpu_to_fs32(const struct super_block *sb, u32 n) + return (__force fs32)cpu_to_be32(n); + } + +-static inline u16 ++static inline u16 __intentional_overflow(-1) + fs16_to_cpu(const struct super_block *sb, fs16 n) + { + if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) +diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c +index 929dec0..84bd914 100644 +--- a/fs/binfmt_aout.c ++++ b/fs/binfmt_aout.c +@@ -16,6 +16,7 @@ + #include <linux/string.h> + #include <linux/fs.h> + #include <linux/file.h> ++#include <linux/security.h> + #include <linux/stat.h> + #include <linux/fcntl.h> + #include <linux/ptrace.h> +@@ -58,6 +59,8 @@ static int aout_core_dump(struct coredump_params *cprm) + #endif + # define START_STACK(u) ((void __user *)u.start_stack) + ++ memset(&dump, 0, sizeof(dump)); ++ + fs = get_fs(); + set_fs(KERNEL_DS); + has_dumped = 1; +@@ -68,10 +71,12 @@ static int aout_core_dump(struct coredump_params *cprm) + + /* If the size of the dump file exceeds the rlimit, then see what would happen + if we wrote the stack, but not the data area. */ ++ gr_learn_resource(current, RLIMIT_CORE, (dump.u_dsize + dump.u_ssize+1) * PAGE_SIZE, 1); + if ((dump.u_dsize + dump.u_ssize+1) * PAGE_SIZE > cprm->limit) + dump.u_dsize = 0; + + /* Make sure we have enough room to write the stack and data areas. */ ++ gr_learn_resource(current, RLIMIT_CORE, (dump.u_ssize + 1) * PAGE_SIZE, 1); + if ((dump.u_ssize + 1) * PAGE_SIZE > cprm->limit) + dump.u_ssize = 0; + +@@ -232,6 +237,8 @@ static int load_aout_binary(struct linux_binprm * bprm) + rlim = rlimit(RLIMIT_DATA); + if (rlim >= RLIM_INFINITY) + rlim = ~0; ++ ++ gr_learn_resource(current, RLIMIT_DATA, ex.a_data + ex.a_bss, 1); + if (ex.a_data + ex.a_bss > rlim) + return -ENOMEM; + +@@ -261,6 +268,27 @@ static int load_aout_binary(struct linux_binprm * bprm) + + install_exec_creds(bprm); + ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++ current->mm->pax_flags = 0UL; ++#endif ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!(N_FLAGS(ex) & F_PAX_PAGEEXEC)) { ++ current->mm->pax_flags |= MF_PAX_PAGEEXEC; ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ if (N_FLAGS(ex) & F_PAX_EMUTRAMP) ++ current->mm->pax_flags |= MF_PAX_EMUTRAMP; ++#endif ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (!(N_FLAGS(ex) & F_PAX_MPROTECT)) ++ current->mm->pax_flags |= MF_PAX_MPROTECT; ++#endif ++ ++ } ++#endif ++ + if (N_MAGIC(ex) == OMAGIC) { + unsigned long text_addr, map_size; + loff_t pos; +@@ -312,7 +340,7 @@ static int load_aout_binary(struct linux_binprm * bprm) + return error; + + error = vm_mmap(bprm->file, N_DATADDR(ex), ex.a_data, +- PROT_READ | PROT_WRITE | PROT_EXEC, ++ PROT_READ | PROT_WRITE, + MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, + fd_offset + ex.a_text); + if (error != N_DATADDR(ex)) +diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c +index e1efcaa..ff55158 100644 +--- a/fs/binfmt_elf.c ++++ b/fs/binfmt_elf.c +@@ -34,6 +34,7 @@ + #include <linux/utsname.h> + #include <linux/coredump.h> + #include <linux/sched.h> ++#include <linux/xattr.h> + #include <asm/uaccess.h> + #include <asm/param.h> + #include <asm/page.h> +@@ -47,7 +48,7 @@ + + static int load_elf_binary(struct linux_binprm *bprm); + static unsigned long elf_map(struct file *, unsigned long, struct elf_phdr *, +- int, int, unsigned long); ++ int, int, unsigned long) __intentional_overflow(-1); + + #ifdef CONFIG_USELIB + static int load_elf_library(struct file *); +@@ -65,6 +66,14 @@ static int elf_core_dump(struct coredump_params *cprm); + #define elf_core_dump NULL + #endif + ++#ifdef CONFIG_PAX_MPROTECT ++static void elf_handle_mprotect(struct vm_area_struct *vma, unsigned long newflags); ++#endif ++ ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++static void elf_handle_mmap(struct file *file); ++#endif ++ + #if ELF_EXEC_PAGESIZE > PAGE_SIZE + #define ELF_MIN_ALIGN ELF_EXEC_PAGESIZE + #else +@@ -84,6 +93,15 @@ static struct linux_binfmt elf_format = { + .load_binary = load_elf_binary, + .load_shlib = load_elf_library, + .core_dump = elf_core_dump, ++ ++#ifdef CONFIG_PAX_MPROTECT ++ .handle_mprotect= elf_handle_mprotect, ++#endif ++ ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++ .handle_mmap = elf_handle_mmap, ++#endif ++ + .min_coredump = ELF_EXEC_PAGESIZE, + }; + +@@ -91,6 +109,8 @@ static struct linux_binfmt elf_format = { + + static int set_brk(unsigned long start, unsigned long end) + { ++ unsigned long e = end; ++ + start = ELF_PAGEALIGN(start); + end = ELF_PAGEALIGN(end); + if (end > start) { +@@ -99,7 +119,7 @@ static int set_brk(unsigned long start, unsigned long end) + if (BAD_ADDR(addr)) + return addr; + } +- current->mm->start_brk = current->mm->brk = end; ++ current->mm->start_brk = current->mm->brk = e; + return 0; + } + +@@ -160,12 +180,13 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, + elf_addr_t __user *u_rand_bytes; + const char *k_platform = ELF_PLATFORM; + const char *k_base_platform = ELF_BASE_PLATFORM; +- unsigned char k_rand_bytes[16]; ++ u32 k_rand_bytes[4]; + int items; + elf_addr_t *elf_info; + int ei_index = 0; + const struct cred *cred = current_cred(); + struct vm_area_struct *vma; ++ unsigned long saved_auxv[AT_VECTOR_SIZE]; + + /* + * In some cases (e.g. Hyper-Threading), we want to avoid L1 +@@ -207,8 +228,12 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, + * Generate 16 random bytes for userspace PRNG seeding. + */ + get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes)); +- u_rand_bytes = (elf_addr_t __user *) +- STACK_ALLOC(p, sizeof(k_rand_bytes)); ++ prandom_seed(k_rand_bytes[0] ^ prandom_u32()); ++ prandom_seed(k_rand_bytes[1] ^ prandom_u32()); ++ prandom_seed(k_rand_bytes[2] ^ prandom_u32()); ++ prandom_seed(k_rand_bytes[3] ^ prandom_u32()); ++ p = STACK_ROUND(p, sizeof(k_rand_bytes)); ++ u_rand_bytes = (elf_addr_t __user *) p; + if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes))) + return -EFAULT; + +@@ -323,9 +348,11 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, + return -EFAULT; + current->mm->env_end = p; + ++ memcpy(saved_auxv, elf_info, ei_index * sizeof(elf_addr_t)); ++ + /* Put the elf_info on the stack in the right place. */ + sp = (elf_addr_t __user *)envp + 1; +- if (copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t))) ++ if (copy_to_user(sp, saved_auxv, ei_index * sizeof(elf_addr_t))) + return -EFAULT; + return 0; + } +@@ -393,15 +420,14 @@ static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr) + an ELF header */ + + static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, +- struct file *interpreter, unsigned long *interp_map_addr, +- unsigned long no_base) ++ struct file *interpreter, unsigned long no_base) + { + struct elf_phdr *elf_phdata; + struct elf_phdr *eppnt; +- unsigned long load_addr = 0; ++ unsigned long load_addr = 0, pax_task_size = TASK_SIZE; + int load_addr_set = 0; + unsigned long last_bss = 0, elf_bss = 0; +- unsigned long error = ~0UL; ++ unsigned long error = -EINVAL; + unsigned long total_size; + int retval, i, size; + +@@ -447,6 +473,11 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, + goto out_close; + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (current->mm->pax_flags & MF_PAX_SEGMEXEC) ++ pax_task_size = SEGMEXEC_TASK_SIZE; ++#endif ++ + eppnt = elf_phdata; + for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) { + if (eppnt->p_type == PT_LOAD) { +@@ -470,8 +501,6 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, + map_addr = elf_map(interpreter, load_addr + vaddr, + eppnt, elf_prot, elf_type, total_size); + total_size = 0; +- if (!*interp_map_addr) +- *interp_map_addr = map_addr; + error = map_addr; + if (BAD_ADDR(map_addr)) + goto out_close; +@@ -490,8 +519,8 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, + k = load_addr + eppnt->p_vaddr; + if (BAD_ADDR(k) || + eppnt->p_filesz > eppnt->p_memsz || +- eppnt->p_memsz > TASK_SIZE || +- TASK_SIZE - eppnt->p_memsz < k) { ++ eppnt->p_memsz > pax_task_size || ++ pax_task_size - eppnt->p_memsz < k) { + error = -ENOMEM; + goto out_close; + } +@@ -530,9 +559,11 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, + elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); + + /* Map the last of the bss segment */ +- error = vm_brk(elf_bss, last_bss - elf_bss); +- if (BAD_ADDR(error)) +- goto out_close; ++ if (last_bss > elf_bss) { ++ error = vm_brk(elf_bss, last_bss - elf_bss); ++ if (BAD_ADDR(error)) ++ goto out_close; ++ } + } + + error = load_addr; +@@ -543,6 +574,336 @@ out: + return error; + } + ++#ifdef CONFIG_PAX_PT_PAX_FLAGS ++#ifdef CONFIG_PAX_SOFTMODE ++static unsigned long pax_parse_pt_pax_softmode(const struct elf_phdr * const elf_phdata) ++{ ++ unsigned long pax_flags = 0UL; ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (elf_phdata->p_flags & PF_PAGEEXEC) ++ pax_flags |= MF_PAX_PAGEEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (elf_phdata->p_flags & PF_SEGMEXEC) ++ pax_flags |= MF_PAX_SEGMEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ if ((elf_phdata->p_flags & PF_EMUTRAMP) && (pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC))) ++ pax_flags |= MF_PAX_EMUTRAMP; ++#endif ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (elf_phdata->p_flags & PF_MPROTECT) ++ pax_flags |= MF_PAX_MPROTECT; ++#endif ++ ++#if defined(CONFIG_PAX_RANDMMAP) || defined(CONFIG_PAX_RANDUSTACK) ++ if (randomize_va_space && (elf_phdata->p_flags & PF_RANDMMAP)) ++ pax_flags |= MF_PAX_RANDMMAP; ++#endif ++ ++ return pax_flags; ++} ++#endif ++ ++static unsigned long pax_parse_pt_pax_hardmode(const struct elf_phdr * const elf_phdata) ++{ ++ unsigned long pax_flags = 0UL; ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!(elf_phdata->p_flags & PF_NOPAGEEXEC)) ++ pax_flags |= MF_PAX_PAGEEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (!(elf_phdata->p_flags & PF_NOSEGMEXEC)) ++ pax_flags |= MF_PAX_SEGMEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ if (!(elf_phdata->p_flags & PF_NOEMUTRAMP)) ++ pax_flags |= MF_PAX_EMUTRAMP; ++#endif ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (!(elf_phdata->p_flags & PF_NOMPROTECT)) ++ pax_flags |= MF_PAX_MPROTECT; ++#endif ++ ++#if defined(CONFIG_PAX_RANDMMAP) || defined(CONFIG_PAX_RANDUSTACK) ++ if (randomize_va_space && !(elf_phdata->p_flags & PF_NORANDMMAP)) ++ pax_flags |= MF_PAX_RANDMMAP; ++#endif ++ ++ return pax_flags; ++} ++#endif ++ ++#ifdef CONFIG_PAX_XATTR_PAX_FLAGS ++#ifdef CONFIG_PAX_SOFTMODE ++static unsigned long pax_parse_xattr_pax_softmode(unsigned long pax_flags_softmode) ++{ ++ unsigned long pax_flags = 0UL; ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (pax_flags_softmode & MF_PAX_PAGEEXEC) ++ pax_flags |= MF_PAX_PAGEEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (pax_flags_softmode & MF_PAX_SEGMEXEC) ++ pax_flags |= MF_PAX_SEGMEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ if ((pax_flags_softmode & MF_PAX_EMUTRAMP) && (pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC))) ++ pax_flags |= MF_PAX_EMUTRAMP; ++#endif ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (pax_flags_softmode & MF_PAX_MPROTECT) ++ pax_flags |= MF_PAX_MPROTECT; ++#endif ++ ++#if defined(CONFIG_PAX_RANDMMAP) || defined(CONFIG_PAX_RANDUSTACK) ++ if (randomize_va_space && (pax_flags_softmode & MF_PAX_RANDMMAP)) ++ pax_flags |= MF_PAX_RANDMMAP; ++#endif ++ ++ return pax_flags; ++} ++#endif ++ ++static unsigned long pax_parse_xattr_pax_hardmode(unsigned long pax_flags_hardmode) ++{ ++ unsigned long pax_flags = 0UL; ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!(pax_flags_hardmode & MF_PAX_PAGEEXEC)) ++ pax_flags |= MF_PAX_PAGEEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (!(pax_flags_hardmode & MF_PAX_SEGMEXEC)) ++ pax_flags |= MF_PAX_SEGMEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ if (!(pax_flags_hardmode & MF_PAX_EMUTRAMP)) ++ pax_flags |= MF_PAX_EMUTRAMP; ++#endif ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (!(pax_flags_hardmode & MF_PAX_MPROTECT)) ++ pax_flags |= MF_PAX_MPROTECT; ++#endif ++ ++#if defined(CONFIG_PAX_RANDMMAP) || defined(CONFIG_PAX_RANDUSTACK) ++ if (randomize_va_space && !(pax_flags_hardmode & MF_PAX_RANDMMAP)) ++ pax_flags |= MF_PAX_RANDMMAP; ++#endif ++ ++ return pax_flags; ++} ++#endif ++ ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++static unsigned long pax_parse_defaults(void) ++{ ++ unsigned long pax_flags = 0UL; ++ ++#ifdef CONFIG_PAX_SOFTMODE ++ if (pax_softmode) ++ return pax_flags; ++#endif ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ pax_flags |= MF_PAX_PAGEEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_flags |= MF_PAX_SEGMEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_MPROTECT ++ pax_flags |= MF_PAX_MPROTECT; ++#endif ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (randomize_va_space) ++ pax_flags |= MF_PAX_RANDMMAP; ++#endif ++ ++ return pax_flags; ++} ++ ++static unsigned long pax_parse_ei_pax(const struct elfhdr * const elf_ex) ++{ ++ unsigned long pax_flags = PAX_PARSE_FLAGS_FALLBACK; ++ ++#ifdef CONFIG_PAX_EI_PAX ++ ++#ifdef CONFIG_PAX_SOFTMODE ++ if (pax_softmode) ++ return pax_flags; ++#endif ++ ++ pax_flags = 0UL; ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ if (!(elf_ex->e_ident[EI_PAX] & EF_PAX_PAGEEXEC)) ++ pax_flags |= MF_PAX_PAGEEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (!(elf_ex->e_ident[EI_PAX] & EF_PAX_SEGMEXEC)) ++ pax_flags |= MF_PAX_SEGMEXEC; ++#endif ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ if ((pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) && (elf_ex->e_ident[EI_PAX] & EF_PAX_EMUTRAMP)) ++ pax_flags |= MF_PAX_EMUTRAMP; ++#endif ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if ((pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) && !(elf_ex->e_ident[EI_PAX] & EF_PAX_MPROTECT)) ++ pax_flags |= MF_PAX_MPROTECT; ++#endif ++ ++#ifdef CONFIG_PAX_ASLR ++ if (randomize_va_space && !(elf_ex->e_ident[EI_PAX] & EF_PAX_RANDMMAP)) ++ pax_flags |= MF_PAX_RANDMMAP; ++#endif ++ ++#endif ++ ++ return pax_flags; ++ ++} ++ ++static unsigned long pax_parse_pt_pax(const struct elfhdr * const elf_ex, const struct elf_phdr * const elf_phdata) ++{ ++ ++#ifdef CONFIG_PAX_PT_PAX_FLAGS ++ unsigned long i; ++ ++ for (i = 0UL; i < elf_ex->e_phnum; i++) ++ if (elf_phdata[i].p_type == PT_PAX_FLAGS) { ++ if (((elf_phdata[i].p_flags & PF_PAGEEXEC) && (elf_phdata[i].p_flags & PF_NOPAGEEXEC)) || ++ ((elf_phdata[i].p_flags & PF_SEGMEXEC) && (elf_phdata[i].p_flags & PF_NOSEGMEXEC)) || ++ ((elf_phdata[i].p_flags & PF_EMUTRAMP) && (elf_phdata[i].p_flags & PF_NOEMUTRAMP)) || ++ ((elf_phdata[i].p_flags & PF_MPROTECT) && (elf_phdata[i].p_flags & PF_NOMPROTECT)) || ++ ((elf_phdata[i].p_flags & PF_RANDMMAP) && (elf_phdata[i].p_flags & PF_NORANDMMAP))) ++ return PAX_PARSE_FLAGS_FALLBACK; ++ ++#ifdef CONFIG_PAX_SOFTMODE ++ if (pax_softmode) ++ return pax_parse_pt_pax_softmode(&elf_phdata[i]); ++ else ++#endif ++ ++ return pax_parse_pt_pax_hardmode(&elf_phdata[i]); ++ break; ++ } ++#endif ++ ++ return PAX_PARSE_FLAGS_FALLBACK; ++} ++ ++static unsigned long pax_parse_xattr_pax(struct file * const file) ++{ ++ ++#ifdef CONFIG_PAX_XATTR_PAX_FLAGS ++ ssize_t xattr_size, i; ++ unsigned char xattr_value[sizeof("pemrs") - 1]; ++ unsigned long pax_flags_hardmode = 0UL, pax_flags_softmode = 0UL; ++ ++ xattr_size = pax_getxattr(file->f_path.dentry, xattr_value, sizeof xattr_value); ++ if (xattr_size < 0 || xattr_size > sizeof xattr_value) ++ return PAX_PARSE_FLAGS_FALLBACK; ++ ++ for (i = 0; i < xattr_size; i++) ++ switch (xattr_value[i]) { ++ default: ++ return PAX_PARSE_FLAGS_FALLBACK; ++ ++#define parse_flag(option1, option2, flag) \ ++ case option1: \ ++ if (pax_flags_hardmode & MF_PAX_##flag) \ ++ return PAX_PARSE_FLAGS_FALLBACK;\ ++ pax_flags_hardmode |= MF_PAX_##flag; \ ++ break; \ ++ case option2: \ ++ if (pax_flags_softmode & MF_PAX_##flag) \ ++ return PAX_PARSE_FLAGS_FALLBACK;\ ++ pax_flags_softmode |= MF_PAX_##flag; \ ++ break; ++ ++ parse_flag('p', 'P', PAGEEXEC); ++ parse_flag('e', 'E', EMUTRAMP); ++ parse_flag('m', 'M', MPROTECT); ++ parse_flag('r', 'R', RANDMMAP); ++ parse_flag('s', 'S', SEGMEXEC); ++ ++#undef parse_flag ++ } ++ ++ if (pax_flags_hardmode & pax_flags_softmode) ++ return PAX_PARSE_FLAGS_FALLBACK; ++ ++#ifdef CONFIG_PAX_SOFTMODE ++ if (pax_softmode) ++ return pax_parse_xattr_pax_softmode(pax_flags_softmode); ++ else ++#endif ++ ++ return pax_parse_xattr_pax_hardmode(pax_flags_hardmode); ++#else ++ return PAX_PARSE_FLAGS_FALLBACK; ++#endif ++ ++} ++ ++static long pax_parse_pax_flags(const struct elfhdr * const elf_ex, const struct elf_phdr * const elf_phdata, struct file * const file) ++{ ++ unsigned long pax_flags, ei_pax_flags, pt_pax_flags, xattr_pax_flags; ++ ++ pax_flags = pax_parse_defaults(); ++ ei_pax_flags = pax_parse_ei_pax(elf_ex); ++ pt_pax_flags = pax_parse_pt_pax(elf_ex, elf_phdata); ++ xattr_pax_flags = pax_parse_xattr_pax(file); ++ ++ if (pt_pax_flags != PAX_PARSE_FLAGS_FALLBACK && ++ xattr_pax_flags != PAX_PARSE_FLAGS_FALLBACK && ++ pt_pax_flags != xattr_pax_flags) ++ return -EINVAL; ++ if (xattr_pax_flags != PAX_PARSE_FLAGS_FALLBACK) ++ pax_flags = xattr_pax_flags; ++ else if (pt_pax_flags != PAX_PARSE_FLAGS_FALLBACK) ++ pax_flags = pt_pax_flags; ++ else if (ei_pax_flags != PAX_PARSE_FLAGS_FALLBACK) ++ pax_flags = ei_pax_flags; ++ ++#if defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_PAX_SEGMEXEC) ++ if ((pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) == (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) { ++ if ((__supported_pte_mask & _PAGE_NX)) ++ pax_flags &= ~MF_PAX_SEGMEXEC; ++ else ++ pax_flags &= ~MF_PAX_PAGEEXEC; ++ } ++#endif ++ ++ if (0 > pax_check_flags(&pax_flags)) ++ return -EINVAL; ++ ++ current->mm->pax_flags = pax_flags; ++ return 0; ++} ++#endif ++ + /* + * These are the functions used to load ELF style executables and shared + * libraries. There is no binary dependent code anywhere else. +@@ -556,6 +917,11 @@ static unsigned long randomize_stack_top(unsigned long stack_top) + { + unsigned long random_variable = 0; + ++#ifdef CONFIG_PAX_RANDUSTACK ++ if (current->mm->pax_flags & MF_PAX_RANDMMAP) ++ return stack_top - current->mm->delta_stack; ++#endif ++ + if ((current->flags & PF_RANDOMIZE) && + !(current->personality & ADDR_NO_RANDOMIZE)) { + random_variable = (unsigned long) get_random_int(); +@@ -575,7 +941,7 @@ static int load_elf_binary(struct linux_binprm *bprm) + unsigned long load_addr = 0, load_bias = 0; + int load_addr_set = 0; + char * elf_interpreter = NULL; +- unsigned long error; ++ unsigned long error = 0; + struct elf_phdr *elf_ppnt, *elf_phdata; + unsigned long elf_bss, elf_brk; + int retval, i; +@@ -590,6 +956,7 @@ static int load_elf_binary(struct linux_binprm *bprm) + struct elfhdr elf_ex; + struct elfhdr interp_elf_ex; + } *loc; ++ unsigned long pax_task_size; + + loc = kmalloc(sizeof(*loc), GFP_KERNEL); + if (!loc) { +@@ -727,6 +1094,77 @@ static int load_elf_binary(struct linux_binprm *bprm) + /* Do this immediately, since STACK_TOP as used in setup_arg_pages + may depend on the personality. */ + SET_PERSONALITY(loc->elf_ex); ++ ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++ current->mm->pax_flags = 0UL; ++#endif ++ ++#ifdef CONFIG_PAX_DLRESOLVE ++ current->mm->call_dl_resolve = 0UL; ++#endif ++ ++#if defined(CONFIG_PPC32) && defined(CONFIG_PAX_EMUSIGRT) ++ current->mm->call_syscall = 0UL; ++#endif ++ ++#ifdef CONFIG_PAX_ASLR ++ current->mm->delta_mmap = 0UL; ++ current->mm->delta_stack = 0UL; ++#endif ++ ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++ if (0 > pax_parse_pax_flags(&loc->elf_ex, elf_phdata, bprm->file)) { ++ send_sig(SIGKILL, current, 0); ++ goto out_free_dentry; ++ } ++#endif ++ ++#ifdef CONFIG_PAX_HAVE_ACL_FLAGS ++ pax_set_initial_flags(bprm); ++#elif defined(CONFIG_PAX_HOOK_ACL_FLAGS) ++ if (pax_set_initial_flags_func) ++ (pax_set_initial_flags_func)(bprm); ++#endif ++ ++#ifdef CONFIG_ARCH_TRACK_EXEC_LIMIT ++ if ((current->mm->pax_flags & MF_PAX_PAGEEXEC) && !(__supported_pte_mask & _PAGE_NX)) { ++ current->mm->context.user_cs_limit = PAGE_SIZE; ++ current->mm->def_flags |= VM_PAGEEXEC | VM_NOHUGEPAGE; ++ } ++#endif ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (current->mm->pax_flags & MF_PAX_SEGMEXEC) { ++ current->mm->context.user_cs_base = SEGMEXEC_TASK_SIZE; ++ current->mm->context.user_cs_limit = TASK_SIZE-SEGMEXEC_TASK_SIZE; ++ pax_task_size = SEGMEXEC_TASK_SIZE; ++ current->mm->def_flags |= VM_NOHUGEPAGE; ++ } else ++#endif ++ ++ pax_task_size = TASK_SIZE; ++ ++#if defined(CONFIG_ARCH_TRACK_EXEC_LIMIT) || defined(CONFIG_PAX_SEGMEXEC) ++ if (current->mm->pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) { ++ set_user_cs(current->mm->context.user_cs_base, current->mm->context.user_cs_limit, get_cpu()); ++ put_cpu(); ++ } ++#endif ++ ++#ifdef CONFIG_PAX_ASLR ++ if (current->mm->pax_flags & MF_PAX_RANDMMAP) { ++ current->mm->delta_mmap = (pax_get_random_long() & ((1UL << PAX_DELTA_MMAP_LEN)-1)) << PAGE_SHIFT; ++ current->mm->delta_stack = (pax_get_random_long() & ((1UL << PAX_DELTA_STACK_LEN)-1)) << PAGE_SHIFT; ++ } ++#endif ++ ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++ if (current->mm->pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) { ++ executable_stack = EXSTACK_DISABLE_X; ++ current->personality &= ~READ_IMPLIES_EXEC; ++ } else ++#endif ++ + if (elf_read_implies_exec(loc->elf_ex, executable_stack)) + current->personality |= READ_IMPLIES_EXEC; + +@@ -812,6 +1250,20 @@ static int load_elf_binary(struct linux_binprm *bprm) + #else + load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); + #endif ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ /* PaX: randomize base address at the default exe base if requested */ ++ if ((current->mm->pax_flags & MF_PAX_RANDMMAP) && elf_interpreter) { ++#ifdef CONFIG_SPARC64 ++ load_bias = (pax_get_random_long() & ((1UL << PAX_DELTA_MMAP_LEN) - 1)) << (PAGE_SHIFT+1); ++#else ++ load_bias = (pax_get_random_long() & ((1UL << PAX_DELTA_MMAP_LEN) - 1)) << PAGE_SHIFT; ++#endif ++ load_bias = ELF_PAGESTART(PAX_ELF_ET_DYN_BASE - vaddr + load_bias); ++ elf_flags |= MAP_FIXED; ++ } ++#endif ++ + } + + error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, +@@ -843,9 +1295,9 @@ static int load_elf_binary(struct linux_binprm *bprm) + * allowed task size. Note that p_filesz must always be + * <= p_memsz so it is only necessary to check p_memsz. + */ +- if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz || +- elf_ppnt->p_memsz > TASK_SIZE || +- TASK_SIZE - elf_ppnt->p_memsz < k) { ++ if (k >= pax_task_size || elf_ppnt->p_filesz > elf_ppnt->p_memsz || ++ elf_ppnt->p_memsz > pax_task_size || ++ pax_task_size - elf_ppnt->p_memsz < k) { + /* set_brk can never work. Avoid overflows. */ + retval = -EINVAL; + goto out_free_dentry; +@@ -881,16 +1333,43 @@ static int load_elf_binary(struct linux_binprm *bprm) + if (retval) + goto out_free_dentry; + if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) { +- retval = -EFAULT; /* Nobody gets to see this, but.. */ +- goto out_free_dentry; ++ /* ++ * This bss-zeroing can fail if the ELF ++ * file specifies odd protections. So ++ * we don't check the return value ++ */ + } + +- if (elf_interpreter) { +- unsigned long interp_map_addr = 0; ++#ifdef CONFIG_PAX_RANDMMAP ++ if (current->mm->pax_flags & MF_PAX_RANDMMAP) { ++ unsigned long start, size, flags; ++ vm_flags_t vm_flags; ++ ++ start = ELF_PAGEALIGN(elf_brk); ++ size = PAGE_SIZE + ((pax_get_random_long() & ((1UL << 22) - 1UL)) << 4); ++ flags = MAP_FIXED | MAP_PRIVATE; ++ vm_flags = VM_DONTEXPAND | VM_DONTDUMP; + ++ down_write(¤t->mm->mmap_sem); ++ start = get_unmapped_area(NULL, start, PAGE_ALIGN(size), 0, flags); ++ retval = -ENOMEM; ++ if (!IS_ERR_VALUE(start) && !find_vma_intersection(current->mm, start, start + size + PAGE_SIZE)) { ++// if (current->personality & ADDR_NO_RANDOMIZE) ++// vm_flags |= VM_READ | VM_MAYREAD; ++ start = mmap_region(NULL, start, PAGE_ALIGN(size), vm_flags, 0); ++ retval = IS_ERR_VALUE(start) ? start : 0; ++ } ++ up_write(¤t->mm->mmap_sem); ++ if (retval == 0) ++ retval = set_brk(start + size, start + size + PAGE_SIZE); ++ if (retval < 0) ++ goto out_free_dentry; ++ } ++#endif ++ ++ if (elf_interpreter) { + elf_entry = load_elf_interp(&loc->interp_elf_ex, + interpreter, +- &interp_map_addr, + load_bias); + if (!IS_ERR((void *)elf_entry)) { + /* +@@ -1116,7 +1595,7 @@ static bool always_dump_vma(struct vm_area_struct *vma) + * Decide what to dump of a segment, part, all or none. + */ + static unsigned long vma_dump_size(struct vm_area_struct *vma, +- unsigned long mm_flags) ++ unsigned long mm_flags, long signr) + { + #define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type)) + +@@ -1154,7 +1633,7 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma, + if (vma->vm_file == NULL) + return 0; + +- if (FILTER(MAPPED_PRIVATE)) ++ if (signr == SIGKILL || FILTER(MAPPED_PRIVATE)) + goto whole; + + /* +@@ -1361,9 +1840,9 @@ static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm) + { + elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv; + int i = 0; +- do ++ do { + i += 2; +- while (auxv[i - 2] != AT_NULL); ++ } while (auxv[i - 2] != AT_NULL); + fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv); + } + +@@ -1372,7 +1851,7 @@ static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata, + { + mm_segment_t old_fs = get_fs(); + set_fs(KERNEL_DS); +- copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo); ++ copy_siginfo_to_user((user_siginfo_t __force_user *) csigdata, siginfo); + set_fs(old_fs); + fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata); + } +@@ -1996,14 +2475,14 @@ static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum, + } + + static size_t elf_core_vma_data_size(struct vm_area_struct *gate_vma, +- unsigned long mm_flags) ++ struct coredump_params *cprm) + { + struct vm_area_struct *vma; + size_t size = 0; + + for (vma = first_vma(current, gate_vma); vma != NULL; + vma = next_vma(vma, gate_vma)) +- size += vma_dump_size(vma, mm_flags); ++ size += vma_dump_size(vma, cprm->mm_flags, cprm->siginfo->si_signo); + return size; + } + +@@ -2094,7 +2573,7 @@ static int elf_core_dump(struct coredump_params *cprm) + + dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE); + +- offset += elf_core_vma_data_size(gate_vma, cprm->mm_flags); ++ offset += elf_core_vma_data_size(gate_vma, cprm); + offset += elf_core_extra_data_size(); + e_shoff = offset; + +@@ -2122,7 +2601,7 @@ static int elf_core_dump(struct coredump_params *cprm) + phdr.p_offset = offset; + phdr.p_vaddr = vma->vm_start; + phdr.p_paddr = 0; +- phdr.p_filesz = vma_dump_size(vma, cprm->mm_flags); ++ phdr.p_filesz = vma_dump_size(vma, cprm->mm_flags, cprm->siginfo->si_signo); + phdr.p_memsz = vma->vm_end - vma->vm_start; + offset += phdr.p_filesz; + phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0; +@@ -2155,7 +2634,7 @@ static int elf_core_dump(struct coredump_params *cprm) + unsigned long addr; + unsigned long end; + +- end = vma->vm_start + vma_dump_size(vma, cprm->mm_flags); ++ end = vma->vm_start + vma_dump_size(vma, cprm->mm_flags, cprm->siginfo->si_signo); + + for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) { + struct page *page; +@@ -2196,6 +2675,167 @@ out: + + #endif /* CONFIG_ELF_CORE */ + ++#ifdef CONFIG_PAX_MPROTECT ++/* PaX: non-PIC ELF libraries need relocations on their executable segments ++ * therefore we'll grant them VM_MAYWRITE once during their life. Similarly ++ * we'll remove VM_MAYWRITE for good on RELRO segments. ++ * ++ * The checks favour ld-linux.so behaviour which operates on a per ELF segment ++ * basis because we want to allow the common case and not the special ones. ++ */ ++static void elf_handle_mprotect(struct vm_area_struct *vma, unsigned long newflags) ++{ ++ struct elfhdr elf_h; ++ struct elf_phdr elf_p; ++ unsigned long i; ++ unsigned long oldflags; ++ bool is_textrel_rw, is_textrel_rx, is_relro; ++ ++ if (!(vma->vm_mm->pax_flags & MF_PAX_MPROTECT) || !vma->vm_file) ++ return; ++ ++ oldflags = vma->vm_flags & (VM_MAYEXEC | VM_MAYWRITE | VM_MAYREAD | VM_EXEC | VM_WRITE | VM_READ); ++ newflags &= VM_MAYEXEC | VM_MAYWRITE | VM_MAYREAD | VM_EXEC | VM_WRITE | VM_READ; ++ ++#ifdef CONFIG_PAX_ELFRELOCS ++ /* possible TEXTREL */ ++ is_textrel_rw = !vma->anon_vma && oldflags == (VM_MAYEXEC | VM_MAYREAD | VM_EXEC | VM_READ) && newflags == (VM_WRITE | VM_READ); ++ is_textrel_rx = vma->anon_vma && oldflags == (VM_MAYEXEC | VM_MAYWRITE | VM_MAYREAD | VM_WRITE | VM_READ) && newflags == (VM_EXEC | VM_READ); ++#else ++ is_textrel_rw = false; ++ is_textrel_rx = false; ++#endif ++ ++ /* possible RELRO */ ++ is_relro = vma->anon_vma && oldflags == (VM_MAYWRITE | VM_MAYREAD | VM_READ) && newflags == (VM_MAYWRITE | VM_MAYREAD | VM_READ); ++ ++ if (!is_textrel_rw && !is_textrel_rx && !is_relro) ++ return; ++ ++ if (sizeof(elf_h) != kernel_read(vma->vm_file, 0UL, (char *)&elf_h, sizeof(elf_h)) || ++ memcmp(elf_h.e_ident, ELFMAG, SELFMAG) || ++ ++#ifdef CONFIG_PAX_ETEXECRELOCS ++ ((is_textrel_rw || is_textrel_rx) && (elf_h.e_type != ET_DYN && elf_h.e_type != ET_EXEC)) || ++#else ++ ((is_textrel_rw || is_textrel_rx) && elf_h.e_type != ET_DYN) || ++#endif ++ ++ (is_relro && (elf_h.e_type != ET_DYN && elf_h.e_type != ET_EXEC)) || ++ !elf_check_arch(&elf_h) || ++ elf_h.e_phentsize != sizeof(struct elf_phdr) || ++ elf_h.e_phnum > 65536UL / sizeof(struct elf_phdr)) ++ return; ++ ++ for (i = 0UL; i < elf_h.e_phnum; i++) { ++ if (sizeof(elf_p) != kernel_read(vma->vm_file, elf_h.e_phoff + i*sizeof(elf_p), (char *)&elf_p, sizeof(elf_p))) ++ return; ++ switch (elf_p.p_type) { ++ case PT_DYNAMIC: ++ if (!is_textrel_rw && !is_textrel_rx) ++ continue; ++ i = 0UL; ++ while ((i+1) * sizeof(elf_dyn) <= elf_p.p_filesz) { ++ elf_dyn dyn; ++ ++ if (sizeof(dyn) != kernel_read(vma->vm_file, elf_p.p_offset + i*sizeof(dyn), (char *)&dyn, sizeof(dyn))) ++ break; ++ if (dyn.d_tag == DT_NULL) ++ break; ++ if (dyn.d_tag == DT_TEXTREL || (dyn.d_tag == DT_FLAGS && (dyn.d_un.d_val & DF_TEXTREL))) { ++ gr_log_textrel(vma); ++ if (is_textrel_rw) ++ vma->vm_flags |= VM_MAYWRITE; ++ else ++ /* PaX: disallow write access after relocs are done, hopefully noone else needs it... */ ++ vma->vm_flags &= ~VM_MAYWRITE; ++ break; ++ } ++ i++; ++ } ++ is_textrel_rw = false; ++ is_textrel_rx = false; ++ continue; ++ ++ case PT_GNU_RELRO: ++ if (!is_relro) ++ continue; ++ if ((elf_p.p_offset >> PAGE_SHIFT) == vma->vm_pgoff && ELF_PAGEALIGN(elf_p.p_memsz) == vma->vm_end - vma->vm_start) ++ vma->vm_flags &= ~VM_MAYWRITE; ++ is_relro = false; ++ continue; ++ ++#ifdef CONFIG_PAX_PT_PAX_FLAGS ++ case PT_PAX_FLAGS: { ++ const char *msg_mprotect = "", *msg_emutramp = ""; ++ char *buffer_lib, *buffer_exe; ++ ++ if (elf_p.p_flags & PF_NOMPROTECT) ++ msg_mprotect = "MPROTECT disabled"; ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ if (!(vma->vm_mm->pax_flags & MF_PAX_EMUTRAMP) && !(elf_p.p_flags & PF_NOEMUTRAMP)) ++ msg_emutramp = "EMUTRAMP enabled"; ++#endif ++ ++ if (!msg_mprotect[0] && !msg_emutramp[0]) ++ continue; ++ ++ if (!printk_ratelimit()) ++ continue; ++ ++ buffer_lib = (char *)__get_free_page(GFP_KERNEL); ++ buffer_exe = (char *)__get_free_page(GFP_KERNEL); ++ if (buffer_lib && buffer_exe) { ++ char *path_lib, *path_exe; ++ ++ path_lib = pax_get_path(&vma->vm_file->f_path, buffer_lib, PAGE_SIZE); ++ path_exe = pax_get_path(&vma->vm_mm->exe_file->f_path, buffer_exe, PAGE_SIZE); ++ ++ pr_info("PAX: %s wants %s%s%s on %s\n", path_lib, msg_mprotect, ++ (msg_mprotect[0] && msg_emutramp[0] ? " and " : ""), msg_emutramp, path_exe); ++ ++ } ++ free_page((unsigned long)buffer_exe); ++ free_page((unsigned long)buffer_lib); ++ continue; ++ } ++#endif ++ ++ } ++ } ++} ++#endif ++ ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++ ++extern int grsec_enable_log_rwxmaps; ++ ++static void elf_handle_mmap(struct file *file) ++{ ++ struct elfhdr elf_h; ++ struct elf_phdr elf_p; ++ unsigned long i; ++ ++ if (!grsec_enable_log_rwxmaps) ++ return; ++ ++ if (sizeof(elf_h) != kernel_read(file, 0UL, (char *)&elf_h, sizeof(elf_h)) || ++ memcmp(elf_h.e_ident, ELFMAG, SELFMAG) || ++ (elf_h.e_type != ET_DYN && elf_h.e_type != ET_EXEC) || !elf_check_arch(&elf_h) || ++ elf_h.e_phentsize != sizeof(struct elf_phdr) || ++ elf_h.e_phnum > 65536UL / sizeof(struct elf_phdr)) ++ return; ++ ++ for (i = 0UL; i < elf_h.e_phnum; i++) { ++ if (sizeof(elf_p) != kernel_read(file, elf_h.e_phoff + i*sizeof(elf_p), (char *)&elf_p, sizeof(elf_p))) ++ return; ++ if (elf_p.p_type == PT_GNU_STACK && (elf_p.p_flags & PF_X)) ++ gr_log_ptgnustack(file); ++ } ++} ++#endif ++ + static int __init init_elf_binfmt(void) + { + register_binfmt(&elf_format); +diff --git a/fs/block_dev.c b/fs/block_dev.c +index 1d9c9f3..2905786 100644 +--- a/fs/block_dev.c ++++ b/fs/block_dev.c +@@ -697,7 +697,7 @@ static bool bd_may_claim(struct block_device *bdev, struct block_device *whole, + else if (bdev->bd_contains == bdev) + return true; /* is a whole device which isn't held */ + +- else if (whole->bd_holder == bd_may_claim) ++ else if (whole->bd_holder == (void *)bd_may_claim) + return true; /* is a partition of a device that is being partitioned */ + else if (whole->bd_holder != NULL) + return false; /* is a partition of a held device */ +diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c +index c81ce0c..0d23e5c 100644 +--- a/fs/btrfs/ctree.c ++++ b/fs/btrfs/ctree.c +@@ -1173,9 +1173,12 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, + free_extent_buffer(buf); + add_root_to_dirty_list(root); + } else { +- if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) +- parent_start = parent->start; +- else ++ if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) { ++ if (parent) ++ parent_start = parent->start; ++ else ++ parent_start = 0; ++ } else + parent_start = 0; + + WARN_ON(trans->transid != btrfs_header_generation(parent)); +diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c +index de4e70f..b41dc45 100644 +--- a/fs/btrfs/delayed-inode.c ++++ b/fs/btrfs/delayed-inode.c +@@ -462,7 +462,7 @@ static int __btrfs_add_delayed_deletion_item(struct btrfs_delayed_node *node, + + static void finish_one_item(struct btrfs_delayed_root *delayed_root) + { +- int seq = atomic_inc_return(&delayed_root->items_seq); ++ int seq = atomic_inc_return_unchecked(&delayed_root->items_seq); + if ((atomic_dec_return(&delayed_root->items) < + BTRFS_DELAYED_BACKGROUND || seq % BTRFS_DELAYED_BATCH == 0) && + waitqueue_active(&delayed_root->wait)) +@@ -1412,7 +1412,7 @@ void btrfs_assert_delayed_root_empty(struct btrfs_root *root) + + static int could_end_wait(struct btrfs_delayed_root *delayed_root, int seq) + { +- int val = atomic_read(&delayed_root->items_seq); ++ int val = atomic_read_unchecked(&delayed_root->items_seq); + + if (val < seq || val >= seq + BTRFS_DELAYED_BATCH) + return 1; +@@ -1436,7 +1436,7 @@ void btrfs_balance_delayed_items(struct btrfs_root *root) + int seq; + int ret; + +- seq = atomic_read(&delayed_root->items_seq); ++ seq = atomic_read_unchecked(&delayed_root->items_seq); + + ret = btrfs_wq_run_delayed_node(delayed_root, root, 0); + if (ret) +diff --git a/fs/btrfs/delayed-inode.h b/fs/btrfs/delayed-inode.h +index f70119f..ab5894d 100644 +--- a/fs/btrfs/delayed-inode.h ++++ b/fs/btrfs/delayed-inode.h +@@ -43,7 +43,7 @@ struct btrfs_delayed_root { + */ + struct list_head prepare_list; + atomic_t items; /* for delayed items */ +- atomic_t items_seq; /* for delayed items */ ++ atomic_unchecked_t items_seq; /* for delayed items */ + int nodes; /* for delayed nodes */ + wait_queue_head_t wait; + }; +@@ -90,7 +90,7 @@ static inline void btrfs_init_delayed_root( + struct btrfs_delayed_root *delayed_root) + { + atomic_set(&delayed_root->items, 0); +- atomic_set(&delayed_root->items_seq, 0); ++ atomic_set_unchecked(&delayed_root->items_seq, 0); + delayed_root->nodes = 0; + spin_lock_init(&delayed_root->lock); + init_waitqueue_head(&delayed_root->wait); +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index cde9c03..ad4d4db 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -271,7 +271,7 @@ void __btrfs_abort_transaction(struct btrfs_trans_handle *trans, + function, line, errstr); + return; + } +- ACCESS_ONCE(trans->transaction->aborted) = errno; ++ ACCESS_ONCE_RW(trans->transaction->aborted) = errno; + /* Wake up anybody who may be waiting on this transaction */ + wake_up(&root->fs_info->transaction_wait); + wake_up(&root->fs_info->transaction_blocked_wait); +diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c +index b2e7bb4..3719201 100644 +--- a/fs/btrfs/sysfs.c ++++ b/fs/btrfs/sysfs.c +@@ -480,7 +480,7 @@ static int addrm_unknown_feature_attrs(struct btrfs_fs_info *fs_info, bool add) + for (set = 0; set < FEAT_MAX; set++) { + int i; + struct attribute *attrs[2]; +- struct attribute_group agroup = { ++ attribute_group_no_const agroup = { + .name = "features", + .attrs = attrs, + }; +diff --git a/fs/btrfs/tests/free-space-tests.c b/fs/btrfs/tests/free-space-tests.c +index 2299bfd..4098e72 100644 +--- a/fs/btrfs/tests/free-space-tests.c ++++ b/fs/btrfs/tests/free-space-tests.c +@@ -463,7 +463,9 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) + * extent entry. + */ + use_bitmap_op = cache->free_space_ctl->op->use_bitmap; +- cache->free_space_ctl->op->use_bitmap = test_use_bitmap; ++ pax_open_kernel(); ++ *(void **)&cache->free_space_ctl->op->use_bitmap = test_use_bitmap; ++ pax_close_kernel(); + + /* + * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[ +@@ -870,7 +872,9 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) + if (ret) + return ret; + +- cache->free_space_ctl->op->use_bitmap = use_bitmap_op; ++ pax_open_kernel(); ++ *(void **)&cache->free_space_ctl->op->use_bitmap = use_bitmap_op; ++ pax_close_kernel(); + __btrfs_remove_free_space_cache(cache->free_space_ctl); + + return 0; +diff --git a/fs/btrfs/tree-log.h b/fs/btrfs/tree-log.h +index 154990c..d0cf699 100644 +--- a/fs/btrfs/tree-log.h ++++ b/fs/btrfs/tree-log.h +@@ -43,7 +43,7 @@ static inline void btrfs_init_log_ctx(struct btrfs_log_ctx *ctx) + static inline void btrfs_set_log_full_commit(struct btrfs_fs_info *fs_info, + struct btrfs_trans_handle *trans) + { +- ACCESS_ONCE(fs_info->last_trans_log_full_commit) = trans->transid; ++ ACCESS_ONCE_RW(fs_info->last_trans_log_full_commit) = trans->transid; + } + + static inline int btrfs_need_log_full_commit(struct btrfs_fs_info *fs_info, +diff --git a/fs/buffer.c b/fs/buffer.c +index 20805db..2e8fc69 100644 +--- a/fs/buffer.c ++++ b/fs/buffer.c +@@ -3417,7 +3417,7 @@ void __init buffer_init(void) + bh_cachep = kmem_cache_create("buffer_head", + sizeof(struct buffer_head), 0, + (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC| +- SLAB_MEM_SPREAD), ++ SLAB_MEM_SPREAD|SLAB_NO_SANITIZE), + NULL); + + /* +diff --git a/fs/cachefiles/bind.c b/fs/cachefiles/bind.c +index fbb08e9..0fda764 100644 +--- a/fs/cachefiles/bind.c ++++ b/fs/cachefiles/bind.c +@@ -39,13 +39,11 @@ int cachefiles_daemon_bind(struct cachefiles_cache *cache, char *args) + args); + + /* start by checking things over */ +- ASSERT(cache->fstop_percent >= 0 && +- cache->fstop_percent < cache->fcull_percent && ++ ASSERT(cache->fstop_percent < cache->fcull_percent && + cache->fcull_percent < cache->frun_percent && + cache->frun_percent < 100); + +- ASSERT(cache->bstop_percent >= 0 && +- cache->bstop_percent < cache->bcull_percent && ++ ASSERT(cache->bstop_percent < cache->bcull_percent && + cache->bcull_percent < cache->brun_percent && + cache->brun_percent < 100); + +diff --git a/fs/cachefiles/daemon.c b/fs/cachefiles/daemon.c +index ce1b115..4a6852c 100644 +--- a/fs/cachefiles/daemon.c ++++ b/fs/cachefiles/daemon.c +@@ -196,7 +196,7 @@ static ssize_t cachefiles_daemon_read(struct file *file, char __user *_buffer, + if (n > buflen) + return -EMSGSIZE; + +- if (copy_to_user(_buffer, buffer, n) != 0) ++ if (n > sizeof(buffer) || copy_to_user(_buffer, buffer, n) != 0) + return -EFAULT; + + return n; +@@ -222,7 +222,7 @@ static ssize_t cachefiles_daemon_write(struct file *file, + if (test_bit(CACHEFILES_DEAD, &cache->flags)) + return -EIO; + +- if (datalen < 0 || datalen > PAGE_SIZE - 1) ++ if (datalen > PAGE_SIZE - 1) + return -EOPNOTSUPP; + + /* drag the command string into the kernel so we can parse it */ +@@ -385,7 +385,7 @@ static int cachefiles_daemon_fstop(struct cachefiles_cache *cache, char *args) + if (args[0] != '%' || args[1] != '\0') + return -EINVAL; + +- if (fstop < 0 || fstop >= cache->fcull_percent) ++ if (fstop >= cache->fcull_percent) + return cachefiles_daemon_range_error(cache, args); + + cache->fstop_percent = fstop; +@@ -457,7 +457,7 @@ static int cachefiles_daemon_bstop(struct cachefiles_cache *cache, char *args) + if (args[0] != '%' || args[1] != '\0') + return -EINVAL; + +- if (bstop < 0 || bstop >= cache->bcull_percent) ++ if (bstop >= cache->bcull_percent) + return cachefiles_daemon_range_error(cache, args); + + cache->bstop_percent = bstop; +diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h +index 8c52472..c4e3a69 100644 +--- a/fs/cachefiles/internal.h ++++ b/fs/cachefiles/internal.h +@@ -66,7 +66,7 @@ struct cachefiles_cache { + wait_queue_head_t daemon_pollwq; /* poll waitqueue for daemon */ + struct rb_root active_nodes; /* active nodes (can't be culled) */ + rwlock_t active_lock; /* lock for active_nodes */ +- atomic_t gravecounter; /* graveyard uniquifier */ ++ atomic_unchecked_t gravecounter; /* graveyard uniquifier */ + unsigned frun_percent; /* when to stop culling (% files) */ + unsigned fcull_percent; /* when to start culling (% files) */ + unsigned fstop_percent; /* when to stop allocating (% files) */ +@@ -178,19 +178,19 @@ extern int cachefiles_check_in_use(struct cachefiles_cache *cache, + * proc.c + */ + #ifdef CONFIG_CACHEFILES_HISTOGRAM +-extern atomic_t cachefiles_lookup_histogram[HZ]; +-extern atomic_t cachefiles_mkdir_histogram[HZ]; +-extern atomic_t cachefiles_create_histogram[HZ]; ++extern atomic_unchecked_t cachefiles_lookup_histogram[HZ]; ++extern atomic_unchecked_t cachefiles_mkdir_histogram[HZ]; ++extern atomic_unchecked_t cachefiles_create_histogram[HZ]; + + extern int __init cachefiles_proc_init(void); + extern void cachefiles_proc_cleanup(void); + static inline +-void cachefiles_hist(atomic_t histogram[], unsigned long start_jif) ++void cachefiles_hist(atomic_unchecked_t histogram[], unsigned long start_jif) + { + unsigned long jif = jiffies - start_jif; + if (jif >= HZ) + jif = HZ - 1; +- atomic_inc(&histogram[jif]); ++ atomic_inc_unchecked(&histogram[jif]); + } + + #else +diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c +index e12f189..ed17244 100644 +--- a/fs/cachefiles/namei.c ++++ b/fs/cachefiles/namei.c +@@ -312,7 +312,7 @@ try_again: + /* first step is to make up a grave dentry in the graveyard */ + sprintf(nbuffer, "%08x%08x", + (uint32_t) get_seconds(), +- (uint32_t) atomic_inc_return(&cache->gravecounter)); ++ (uint32_t) atomic_inc_return_unchecked(&cache->gravecounter)); + + /* do the multiway lock magic */ + trap = lock_rename(cache->graveyard, dir); +diff --git a/fs/cachefiles/proc.c b/fs/cachefiles/proc.c +index eccd339..4c1d995 100644 +--- a/fs/cachefiles/proc.c ++++ b/fs/cachefiles/proc.c +@@ -14,9 +14,9 @@ + #include <linux/seq_file.h> + #include "internal.h" + +-atomic_t cachefiles_lookup_histogram[HZ]; +-atomic_t cachefiles_mkdir_histogram[HZ]; +-atomic_t cachefiles_create_histogram[HZ]; ++atomic_unchecked_t cachefiles_lookup_histogram[HZ]; ++atomic_unchecked_t cachefiles_mkdir_histogram[HZ]; ++atomic_unchecked_t cachefiles_create_histogram[HZ]; + + /* + * display the latency histogram +@@ -35,9 +35,9 @@ static int cachefiles_histogram_show(struct seq_file *m, void *v) + return 0; + default: + index = (unsigned long) v - 3; +- x = atomic_read(&cachefiles_lookup_histogram[index]); +- y = atomic_read(&cachefiles_mkdir_histogram[index]); +- z = atomic_read(&cachefiles_create_histogram[index]); ++ x = atomic_read_unchecked(&cachefiles_lookup_histogram[index]); ++ y = atomic_read_unchecked(&cachefiles_mkdir_histogram[index]); ++ z = atomic_read_unchecked(&cachefiles_create_histogram[index]); + if (x == 0 && y == 0 && z == 0) + return 0; + +diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c +index 695e788..f4a9d4d 100644 +--- a/fs/ceph/dir.c ++++ b/fs/ceph/dir.c +@@ -129,6 +129,8 @@ static int __dcache_readdir(struct file *file, struct dir_context *ctx, + struct dentry *dentry, *last; + struct ceph_dentry_info *di; + int err = 0; ++ char d_name[DNAME_INLINE_LEN]; ++ const unsigned char *name; + + /* claim ref on last dentry we returned */ + last = fi->dentry; +@@ -192,7 +194,12 @@ more: + + dout(" %llu (%llu) dentry %p %.*s %p\n", di->offset, ctx->pos, + dentry, dentry->d_name.len, dentry->d_name.name, dentry->d_inode); +- if (!dir_emit(ctx, dentry->d_name.name, ++ name = dentry->d_name.name; ++ if (name == dentry->d_iname) { ++ memcpy(d_name, name, dentry->d_name.len); ++ name = d_name; ++ } ++ if (!dir_emit(ctx, name, + dentry->d_name.len, + ceph_translate_ino(dentry->d_sb, dentry->d_inode->i_ino), + dentry->d_inode->i_mode >> 12)) { +@@ -250,7 +257,7 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) + struct ceph_fs_client *fsc = ceph_inode_to_client(inode); + struct ceph_mds_client *mdsc = fsc->mdsc; + unsigned frag = fpos_frag(ctx->pos); +- int off = fpos_off(ctx->pos); ++ unsigned int off = fpos_off(ctx->pos); + int err; + u32 ftype; + struct ceph_mds_reply_info_parsed *rinfo; +diff --git a/fs/ceph/super.c b/fs/ceph/super.c +index f6e1237..796ffd1 100644 +--- a/fs/ceph/super.c ++++ b/fs/ceph/super.c +@@ -895,7 +895,7 @@ static int ceph_compare_super(struct super_block *sb, void *data) + /* + * construct our own bdi so we can control readahead, etc. + */ +-static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); ++static atomic_long_unchecked_t bdi_seq = ATOMIC_LONG_INIT(0); + + static int ceph_register_bdi(struct super_block *sb, + struct ceph_fs_client *fsc) +@@ -912,7 +912,7 @@ static int ceph_register_bdi(struct super_block *sb, + default_backing_dev_info.ra_pages; + + err = bdi_register(&fsc->backing_dev_info, NULL, "ceph-%ld", +- atomic_long_inc_return(&bdi_seq)); ++ atomic_long_inc_return_unchecked(&bdi_seq)); + if (!err) + sb->s_bdi = &fsc->backing_dev_info; + return err; +diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c +index 44ec726..11a056f 100644 +--- a/fs/cifs/cifs_debug.c ++++ b/fs/cifs/cifs_debug.c +@@ -286,8 +286,8 @@ static ssize_t cifs_stats_proc_write(struct file *file, + + if (c == '1' || c == 'y' || c == 'Y' || c == '0') { + #ifdef CONFIG_CIFS_STATS2 +- atomic_set(&totBufAllocCount, 0); +- atomic_set(&totSmBufAllocCount, 0); ++ atomic_set_unchecked(&totBufAllocCount, 0); ++ atomic_set_unchecked(&totSmBufAllocCount, 0); + #endif /* CONFIG_CIFS_STATS2 */ + spin_lock(&cifs_tcp_ses_lock); + list_for_each(tmp1, &cifs_tcp_ses_list) { +@@ -300,7 +300,7 @@ static ssize_t cifs_stats_proc_write(struct file *file, + tcon = list_entry(tmp3, + struct cifs_tcon, + tcon_list); +- atomic_set(&tcon->num_smbs_sent, 0); ++ atomic_set_unchecked(&tcon->num_smbs_sent, 0); + if (server->ops->clear_stats) + server->ops->clear_stats(tcon); + } +@@ -332,8 +332,8 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v) + smBufAllocCount.counter, cifs_min_small); + #ifdef CONFIG_CIFS_STATS2 + seq_printf(m, "Total Large %d Small %d Allocations\n", +- atomic_read(&totBufAllocCount), +- atomic_read(&totSmBufAllocCount)); ++ atomic_read_unchecked(&totBufAllocCount), ++ atomic_read_unchecked(&totSmBufAllocCount)); + #endif /* CONFIG_CIFS_STATS2 */ + + seq_printf(m, "Operations (MIDs): %d\n", atomic_read(&midCount)); +@@ -362,7 +362,7 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v) + if (tcon->need_reconnect) + seq_puts(m, "\tDISCONNECTED "); + seq_printf(m, "\nSMBs: %d", +- atomic_read(&tcon->num_smbs_sent)); ++ atomic_read_unchecked(&tcon->num_smbs_sent)); + if (server->ops->print_stats) + server->ops->print_stats(m, tcon); + } +@@ -615,9 +615,11 @@ cifs_security_flags_handle_must_flags(unsigned int *flags) + *flags = CIFSSEC_MUST_NTLMV2; + else if ((*flags & CIFSSEC_MUST_NTLM) == CIFSSEC_MUST_NTLM) + *flags = CIFSSEC_MUST_NTLM; +- else if ((*flags & CIFSSEC_MUST_LANMAN) == CIFSSEC_MUST_LANMAN) ++ else if (CIFSSEC_MUST_LANMAN && ++ (*flags & CIFSSEC_MUST_LANMAN) == CIFSSEC_MUST_LANMAN) + *flags = CIFSSEC_MUST_LANMAN; +- else if ((*flags & CIFSSEC_MUST_PLNTXT) == CIFSSEC_MUST_PLNTXT) ++ else if (CIFSSEC_MUST_PLNTXT && ++ (*flags & CIFSSEC_MUST_PLNTXT) == CIFSSEC_MUST_PLNTXT) + *flags = CIFSSEC_MUST_PLNTXT; + + *flags |= signflags; +diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c +index 9d7996e..35ad5cf4 100644 +--- a/fs/cifs/cifsfs.c ++++ b/fs/cifs/cifsfs.c +@@ -1093,7 +1093,7 @@ cifs_init_request_bufs(void) + */ + cifs_req_cachep = kmem_cache_create("cifs_request", + CIFSMaxBufSize + max_hdr_size, 0, +- SLAB_HWCACHE_ALIGN, NULL); ++ SLAB_HWCACHE_ALIGN | SLAB_USERCOPY, NULL); + if (cifs_req_cachep == NULL) + return -ENOMEM; + +@@ -1120,7 +1120,7 @@ cifs_init_request_bufs(void) + efficient to alloc 1 per page off the slab compared to 17K (5page) + alloc of large cifs buffers even when page debugging is on */ + cifs_sm_req_cachep = kmem_cache_create("cifs_small_rq", +- MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN, ++ MAX_CIFS_SMALL_BUFFER_SIZE, 0, SLAB_HWCACHE_ALIGN | SLAB_USERCOPY, + NULL); + if (cifs_sm_req_cachep == NULL) { + mempool_destroy(cifs_req_poolp); +@@ -1205,8 +1205,8 @@ init_cifs(void) + atomic_set(&bufAllocCount, 0); + atomic_set(&smBufAllocCount, 0); + #ifdef CONFIG_CIFS_STATS2 +- atomic_set(&totBufAllocCount, 0); +- atomic_set(&totSmBufAllocCount, 0); ++ atomic_set_unchecked(&totBufAllocCount, 0); ++ atomic_set_unchecked(&totSmBufAllocCount, 0); + #endif /* CONFIG_CIFS_STATS2 */ + + atomic_set(&midCount, 0); +diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h +index 02a33e5..3a28b5a 100644 +--- a/fs/cifs/cifsglob.h ++++ b/fs/cifs/cifsglob.h +@@ -823,35 +823,35 @@ struct cifs_tcon { + __u16 Flags; /* optional support bits */ + enum statusEnum tidStatus; + #ifdef CONFIG_CIFS_STATS +- atomic_t num_smbs_sent; ++ atomic_unchecked_t num_smbs_sent; + union { + struct { +- atomic_t num_writes; +- atomic_t num_reads; +- atomic_t num_flushes; +- atomic_t num_oplock_brks; +- atomic_t num_opens; +- atomic_t num_closes; +- atomic_t num_deletes; +- atomic_t num_mkdirs; +- atomic_t num_posixopens; +- atomic_t num_posixmkdirs; +- atomic_t num_rmdirs; +- atomic_t num_renames; +- atomic_t num_t2renames; +- atomic_t num_ffirst; +- atomic_t num_fnext; +- atomic_t num_fclose; +- atomic_t num_hardlinks; +- atomic_t num_symlinks; +- atomic_t num_locks; +- atomic_t num_acl_get; +- atomic_t num_acl_set; ++ atomic_unchecked_t num_writes; ++ atomic_unchecked_t num_reads; ++ atomic_unchecked_t num_flushes; ++ atomic_unchecked_t num_oplock_brks; ++ atomic_unchecked_t num_opens; ++ atomic_unchecked_t num_closes; ++ atomic_unchecked_t num_deletes; ++ atomic_unchecked_t num_mkdirs; ++ atomic_unchecked_t num_posixopens; ++ atomic_unchecked_t num_posixmkdirs; ++ atomic_unchecked_t num_rmdirs; ++ atomic_unchecked_t num_renames; ++ atomic_unchecked_t num_t2renames; ++ atomic_unchecked_t num_ffirst; ++ atomic_unchecked_t num_fnext; ++ atomic_unchecked_t num_fclose; ++ atomic_unchecked_t num_hardlinks; ++ atomic_unchecked_t num_symlinks; ++ atomic_unchecked_t num_locks; ++ atomic_unchecked_t num_acl_get; ++ atomic_unchecked_t num_acl_set; + } cifs_stats; + #ifdef CONFIG_CIFS_SMB2 + struct { +- atomic_t smb2_com_sent[NUMBER_OF_SMB2_COMMANDS]; +- atomic_t smb2_com_failed[NUMBER_OF_SMB2_COMMANDS]; ++ atomic_unchecked_t smb2_com_sent[NUMBER_OF_SMB2_COMMANDS]; ++ atomic_unchecked_t smb2_com_failed[NUMBER_OF_SMB2_COMMANDS]; + } smb2_stats; + #endif /* CONFIG_CIFS_SMB2 */ + } stats; +@@ -1192,7 +1192,7 @@ convert_delimiter(char *path, char delim) + } + + #ifdef CONFIG_CIFS_STATS +-#define cifs_stats_inc atomic_inc ++#define cifs_stats_inc atomic_inc_unchecked + + static inline void cifs_stats_bytes_written(struct cifs_tcon *tcon, + unsigned int bytes) +@@ -1559,8 +1559,8 @@ GLOBAL_EXTERN atomic_t tconInfoReconnectCount; + /* Various Debug counters */ + GLOBAL_EXTERN atomic_t bufAllocCount; /* current number allocated */ + #ifdef CONFIG_CIFS_STATS2 +-GLOBAL_EXTERN atomic_t totBufAllocCount; /* total allocated over all time */ +-GLOBAL_EXTERN atomic_t totSmBufAllocCount; ++GLOBAL_EXTERN atomic_unchecked_t totBufAllocCount; /* total allocated over all time */ ++GLOBAL_EXTERN atomic_unchecked_t totSmBufAllocCount; + #endif + GLOBAL_EXTERN atomic_t smBufAllocCount; + GLOBAL_EXTERN atomic_t midCount; +diff --git a/fs/cifs/file.c b/fs/cifs/file.c +index 9431449..6e9a96a 100644 +--- a/fs/cifs/file.c ++++ b/fs/cifs/file.c +@@ -2061,10 +2061,14 @@ static int cifs_writepages(struct address_space *mapping, + index = mapping->writeback_index; /* Start from prev offset */ + end = -1; + } else { +- index = wbc->range_start >> PAGE_CACHE_SHIFT; +- end = wbc->range_end >> PAGE_CACHE_SHIFT; +- if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) ++ if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) { + range_whole = true; ++ index = 0; ++ end = ULONG_MAX; ++ } else { ++ index = wbc->range_start >> PAGE_CACHE_SHIFT; ++ end = wbc->range_end >> PAGE_CACHE_SHIFT; ++ } + scanned = true; + } + server = cifs_sb_master_tcon(cifs_sb)->ses->server; +diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c +index b7415d5..3984ec0 100644 +--- a/fs/cifs/misc.c ++++ b/fs/cifs/misc.c +@@ -170,7 +170,7 @@ cifs_buf_get(void) + memset(ret_buf, 0, buf_size + 3); + atomic_inc(&bufAllocCount); + #ifdef CONFIG_CIFS_STATS2 +- atomic_inc(&totBufAllocCount); ++ atomic_inc_unchecked(&totBufAllocCount); + #endif /* CONFIG_CIFS_STATS2 */ + } + +@@ -205,7 +205,7 @@ cifs_small_buf_get(void) + /* memset(ret_buf, 0, sizeof(struct smb_hdr) + 27);*/ + atomic_inc(&smBufAllocCount); + #ifdef CONFIG_CIFS_STATS2 +- atomic_inc(&totSmBufAllocCount); ++ atomic_inc_unchecked(&totSmBufAllocCount); + #endif /* CONFIG_CIFS_STATS2 */ + + } +diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c +index d297903..1cb7516 100644 +--- a/fs/cifs/smb1ops.c ++++ b/fs/cifs/smb1ops.c +@@ -622,27 +622,27 @@ static void + cifs_clear_stats(struct cifs_tcon *tcon) + { + #ifdef CONFIG_CIFS_STATS +- atomic_set(&tcon->stats.cifs_stats.num_writes, 0); +- atomic_set(&tcon->stats.cifs_stats.num_reads, 0); +- atomic_set(&tcon->stats.cifs_stats.num_flushes, 0); +- atomic_set(&tcon->stats.cifs_stats.num_oplock_brks, 0); +- atomic_set(&tcon->stats.cifs_stats.num_opens, 0); +- atomic_set(&tcon->stats.cifs_stats.num_posixopens, 0); +- atomic_set(&tcon->stats.cifs_stats.num_posixmkdirs, 0); +- atomic_set(&tcon->stats.cifs_stats.num_closes, 0); +- atomic_set(&tcon->stats.cifs_stats.num_deletes, 0); +- atomic_set(&tcon->stats.cifs_stats.num_mkdirs, 0); +- atomic_set(&tcon->stats.cifs_stats.num_rmdirs, 0); +- atomic_set(&tcon->stats.cifs_stats.num_renames, 0); +- atomic_set(&tcon->stats.cifs_stats.num_t2renames, 0); +- atomic_set(&tcon->stats.cifs_stats.num_ffirst, 0); +- atomic_set(&tcon->stats.cifs_stats.num_fnext, 0); +- atomic_set(&tcon->stats.cifs_stats.num_fclose, 0); +- atomic_set(&tcon->stats.cifs_stats.num_hardlinks, 0); +- atomic_set(&tcon->stats.cifs_stats.num_symlinks, 0); +- atomic_set(&tcon->stats.cifs_stats.num_locks, 0); +- atomic_set(&tcon->stats.cifs_stats.num_acl_get, 0); +- atomic_set(&tcon->stats.cifs_stats.num_acl_set, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_writes, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_reads, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_flushes, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_oplock_brks, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_opens, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_posixopens, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_posixmkdirs, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_closes, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_deletes, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_mkdirs, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_rmdirs, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_renames, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_t2renames, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_ffirst, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_fnext, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_fclose, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_hardlinks, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_symlinks, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_locks, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_acl_get, 0); ++ atomic_set_unchecked(&tcon->stats.cifs_stats.num_acl_set, 0); + #endif + } + +@@ -651,36 +651,36 @@ cifs_print_stats(struct seq_file *m, struct cifs_tcon *tcon) + { + #ifdef CONFIG_CIFS_STATS + seq_printf(m, " Oplocks breaks: %d", +- atomic_read(&tcon->stats.cifs_stats.num_oplock_brks)); ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_oplock_brks)); + seq_printf(m, "\nReads: %d Bytes: %llu", +- atomic_read(&tcon->stats.cifs_stats.num_reads), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_reads), + (long long)(tcon->bytes_read)); + seq_printf(m, "\nWrites: %d Bytes: %llu", +- atomic_read(&tcon->stats.cifs_stats.num_writes), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_writes), + (long long)(tcon->bytes_written)); + seq_printf(m, "\nFlushes: %d", +- atomic_read(&tcon->stats.cifs_stats.num_flushes)); ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_flushes)); + seq_printf(m, "\nLocks: %d HardLinks: %d Symlinks: %d", +- atomic_read(&tcon->stats.cifs_stats.num_locks), +- atomic_read(&tcon->stats.cifs_stats.num_hardlinks), +- atomic_read(&tcon->stats.cifs_stats.num_symlinks)); ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_locks), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_hardlinks), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_symlinks)); + seq_printf(m, "\nOpens: %d Closes: %d Deletes: %d", +- atomic_read(&tcon->stats.cifs_stats.num_opens), +- atomic_read(&tcon->stats.cifs_stats.num_closes), +- atomic_read(&tcon->stats.cifs_stats.num_deletes)); ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_opens), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_closes), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_deletes)); + seq_printf(m, "\nPosix Opens: %d Posix Mkdirs: %d", +- atomic_read(&tcon->stats.cifs_stats.num_posixopens), +- atomic_read(&tcon->stats.cifs_stats.num_posixmkdirs)); ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_posixopens), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_posixmkdirs)); + seq_printf(m, "\nMkdirs: %d Rmdirs: %d", +- atomic_read(&tcon->stats.cifs_stats.num_mkdirs), +- atomic_read(&tcon->stats.cifs_stats.num_rmdirs)); ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_mkdirs), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_rmdirs)); + seq_printf(m, "\nRenames: %d T2 Renames %d", +- atomic_read(&tcon->stats.cifs_stats.num_renames), +- atomic_read(&tcon->stats.cifs_stats.num_t2renames)); ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_renames), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_t2renames)); + seq_printf(m, "\nFindFirst: %d FNext %d FClose %d", +- atomic_read(&tcon->stats.cifs_stats.num_ffirst), +- atomic_read(&tcon->stats.cifs_stats.num_fnext), +- atomic_read(&tcon->stats.cifs_stats.num_fclose)); ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_ffirst), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_fnext), ++ atomic_read_unchecked(&tcon->stats.cifs_stats.num_fclose)); + #endif + } + +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index cc93a7f..8a588cc 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -417,8 +417,8 @@ smb2_clear_stats(struct cifs_tcon *tcon) + #ifdef CONFIG_CIFS_STATS + int i; + for (i = 0; i < NUMBER_OF_SMB2_COMMANDS; i++) { +- atomic_set(&tcon->stats.smb2_stats.smb2_com_sent[i], 0); +- atomic_set(&tcon->stats.smb2_stats.smb2_com_failed[i], 0); ++ atomic_set_unchecked(&tcon->stats.smb2_stats.smb2_com_sent[i], 0); ++ atomic_set_unchecked(&tcon->stats.smb2_stats.smb2_com_failed[i], 0); + } + #endif + } +@@ -458,65 +458,65 @@ static void + smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon) + { + #ifdef CONFIG_CIFS_STATS +- atomic_t *sent = tcon->stats.smb2_stats.smb2_com_sent; +- atomic_t *failed = tcon->stats.smb2_stats.smb2_com_failed; ++ atomic_unchecked_t *sent = tcon->stats.smb2_stats.smb2_com_sent; ++ atomic_unchecked_t *failed = tcon->stats.smb2_stats.smb2_com_failed; + seq_printf(m, "\nNegotiates: %d sent %d failed", +- atomic_read(&sent[SMB2_NEGOTIATE_HE]), +- atomic_read(&failed[SMB2_NEGOTIATE_HE])); ++ atomic_read_unchecked(&sent[SMB2_NEGOTIATE_HE]), ++ atomic_read_unchecked(&failed[SMB2_NEGOTIATE_HE])); + seq_printf(m, "\nSessionSetups: %d sent %d failed", +- atomic_read(&sent[SMB2_SESSION_SETUP_HE]), +- atomic_read(&failed[SMB2_SESSION_SETUP_HE])); ++ atomic_read_unchecked(&sent[SMB2_SESSION_SETUP_HE]), ++ atomic_read_unchecked(&failed[SMB2_SESSION_SETUP_HE])); + seq_printf(m, "\nLogoffs: %d sent %d failed", +- atomic_read(&sent[SMB2_LOGOFF_HE]), +- atomic_read(&failed[SMB2_LOGOFF_HE])); ++ atomic_read_unchecked(&sent[SMB2_LOGOFF_HE]), ++ atomic_read_unchecked(&failed[SMB2_LOGOFF_HE])); + seq_printf(m, "\nTreeConnects: %d sent %d failed", +- atomic_read(&sent[SMB2_TREE_CONNECT_HE]), +- atomic_read(&failed[SMB2_TREE_CONNECT_HE])); ++ atomic_read_unchecked(&sent[SMB2_TREE_CONNECT_HE]), ++ atomic_read_unchecked(&failed[SMB2_TREE_CONNECT_HE])); + seq_printf(m, "\nTreeDisconnects: %d sent %d failed", +- atomic_read(&sent[SMB2_TREE_DISCONNECT_HE]), +- atomic_read(&failed[SMB2_TREE_DISCONNECT_HE])); ++ atomic_read_unchecked(&sent[SMB2_TREE_DISCONNECT_HE]), ++ atomic_read_unchecked(&failed[SMB2_TREE_DISCONNECT_HE])); + seq_printf(m, "\nCreates: %d sent %d failed", +- atomic_read(&sent[SMB2_CREATE_HE]), +- atomic_read(&failed[SMB2_CREATE_HE])); ++ atomic_read_unchecked(&sent[SMB2_CREATE_HE]), ++ atomic_read_unchecked(&failed[SMB2_CREATE_HE])); + seq_printf(m, "\nCloses: %d sent %d failed", +- atomic_read(&sent[SMB2_CLOSE_HE]), +- atomic_read(&failed[SMB2_CLOSE_HE])); ++ atomic_read_unchecked(&sent[SMB2_CLOSE_HE]), ++ atomic_read_unchecked(&failed[SMB2_CLOSE_HE])); + seq_printf(m, "\nFlushes: %d sent %d failed", +- atomic_read(&sent[SMB2_FLUSH_HE]), +- atomic_read(&failed[SMB2_FLUSH_HE])); ++ atomic_read_unchecked(&sent[SMB2_FLUSH_HE]), ++ atomic_read_unchecked(&failed[SMB2_FLUSH_HE])); + seq_printf(m, "\nReads: %d sent %d failed", +- atomic_read(&sent[SMB2_READ_HE]), +- atomic_read(&failed[SMB2_READ_HE])); ++ atomic_read_unchecked(&sent[SMB2_READ_HE]), ++ atomic_read_unchecked(&failed[SMB2_READ_HE])); + seq_printf(m, "\nWrites: %d sent %d failed", +- atomic_read(&sent[SMB2_WRITE_HE]), +- atomic_read(&failed[SMB2_WRITE_HE])); ++ atomic_read_unchecked(&sent[SMB2_WRITE_HE]), ++ atomic_read_unchecked(&failed[SMB2_WRITE_HE])); + seq_printf(m, "\nLocks: %d sent %d failed", +- atomic_read(&sent[SMB2_LOCK_HE]), +- atomic_read(&failed[SMB2_LOCK_HE])); ++ atomic_read_unchecked(&sent[SMB2_LOCK_HE]), ++ atomic_read_unchecked(&failed[SMB2_LOCK_HE])); + seq_printf(m, "\nIOCTLs: %d sent %d failed", +- atomic_read(&sent[SMB2_IOCTL_HE]), +- atomic_read(&failed[SMB2_IOCTL_HE])); ++ atomic_read_unchecked(&sent[SMB2_IOCTL_HE]), ++ atomic_read_unchecked(&failed[SMB2_IOCTL_HE])); + seq_printf(m, "\nCancels: %d sent %d failed", +- atomic_read(&sent[SMB2_CANCEL_HE]), +- atomic_read(&failed[SMB2_CANCEL_HE])); ++ atomic_read_unchecked(&sent[SMB2_CANCEL_HE]), ++ atomic_read_unchecked(&failed[SMB2_CANCEL_HE])); + seq_printf(m, "\nEchos: %d sent %d failed", +- atomic_read(&sent[SMB2_ECHO_HE]), +- atomic_read(&failed[SMB2_ECHO_HE])); ++ atomic_read_unchecked(&sent[SMB2_ECHO_HE]), ++ atomic_read_unchecked(&failed[SMB2_ECHO_HE])); + seq_printf(m, "\nQueryDirectories: %d sent %d failed", +- atomic_read(&sent[SMB2_QUERY_DIRECTORY_HE]), +- atomic_read(&failed[SMB2_QUERY_DIRECTORY_HE])); ++ atomic_read_unchecked(&sent[SMB2_QUERY_DIRECTORY_HE]), ++ atomic_read_unchecked(&failed[SMB2_QUERY_DIRECTORY_HE])); + seq_printf(m, "\nChangeNotifies: %d sent %d failed", +- atomic_read(&sent[SMB2_CHANGE_NOTIFY_HE]), +- atomic_read(&failed[SMB2_CHANGE_NOTIFY_HE])); ++ atomic_read_unchecked(&sent[SMB2_CHANGE_NOTIFY_HE]), ++ atomic_read_unchecked(&failed[SMB2_CHANGE_NOTIFY_HE])); + seq_printf(m, "\nQueryInfos: %d sent %d failed", +- atomic_read(&sent[SMB2_QUERY_INFO_HE]), +- atomic_read(&failed[SMB2_QUERY_INFO_HE])); ++ atomic_read_unchecked(&sent[SMB2_QUERY_INFO_HE]), ++ atomic_read_unchecked(&failed[SMB2_QUERY_INFO_HE])); + seq_printf(m, "\nSetInfos: %d sent %d failed", +- atomic_read(&sent[SMB2_SET_INFO_HE]), +- atomic_read(&failed[SMB2_SET_INFO_HE])); ++ atomic_read_unchecked(&sent[SMB2_SET_INFO_HE]), ++ atomic_read_unchecked(&failed[SMB2_SET_INFO_HE])); + seq_printf(m, "\nOplockBreaks: %d sent %d failed", +- atomic_read(&sent[SMB2_OPLOCK_BREAK_HE]), +- atomic_read(&failed[SMB2_OPLOCK_BREAK_HE])); ++ atomic_read_unchecked(&sent[SMB2_OPLOCK_BREAK_HE]), ++ atomic_read_unchecked(&failed[SMB2_OPLOCK_BREAK_HE])); + #endif + } + +diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c +index 8f1672b..af339c07 100644 +--- a/fs/cifs/smb2pdu.c ++++ b/fs/cifs/smb2pdu.c +@@ -2145,8 +2145,7 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon, + default: + cifs_dbg(VFS, "info level %u isn't supported\n", + srch_inf->info_level); +- rc = -EINVAL; +- goto qdir_exit; ++ return -EINVAL; + } + + req->FileIndex = cpu_to_le32(index); +diff --git a/fs/cifs/smbencrypt.c b/fs/cifs/smbencrypt.c +index 6c15663..a4232ec 100644 +--- a/fs/cifs/smbencrypt.c ++++ b/fs/cifs/smbencrypt.c +@@ -221,7 +221,7 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16, + } + + rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__le16)); +- memset(wpwd, 0, 129 * sizeof(__le16)); ++ memzero_explicit(wpwd, sizeof(wpwd)); + + return rc; + } +diff --git a/fs/coda/cache.c b/fs/coda/cache.c +index 46ee6f2..89a9e7f 100644 +--- a/fs/coda/cache.c ++++ b/fs/coda/cache.c +@@ -24,7 +24,7 @@ + #include "coda_linux.h" + #include "coda_cache.h" + +-static atomic_t permission_epoch = ATOMIC_INIT(0); ++static atomic_unchecked_t permission_epoch = ATOMIC_INIT(0); + + /* replace or extend an acl cache hit */ + void coda_cache_enter(struct inode *inode, int mask) +@@ -32,7 +32,7 @@ void coda_cache_enter(struct inode *inode, int mask) + struct coda_inode_info *cii = ITOC(inode); + + spin_lock(&cii->c_lock); +- cii->c_cached_epoch = atomic_read(&permission_epoch); ++ cii->c_cached_epoch = atomic_read_unchecked(&permission_epoch); + if (!uid_eq(cii->c_uid, current_fsuid())) { + cii->c_uid = current_fsuid(); + cii->c_cached_perm = mask; +@@ -46,14 +46,14 @@ void coda_cache_clear_inode(struct inode *inode) + { + struct coda_inode_info *cii = ITOC(inode); + spin_lock(&cii->c_lock); +- cii->c_cached_epoch = atomic_read(&permission_epoch) - 1; ++ cii->c_cached_epoch = atomic_read_unchecked(&permission_epoch) - 1; + spin_unlock(&cii->c_lock); + } + + /* remove all acl caches */ + void coda_cache_clear_all(struct super_block *sb) + { +- atomic_inc(&permission_epoch); ++ atomic_inc_unchecked(&permission_epoch); + } + + +@@ -66,7 +66,7 @@ int coda_cache_check(struct inode *inode, int mask) + spin_lock(&cii->c_lock); + hit = (mask & cii->c_cached_perm) == mask && + uid_eq(cii->c_uid, current_fsuid()) && +- cii->c_cached_epoch == atomic_read(&permission_epoch); ++ cii->c_cached_epoch == atomic_read_unchecked(&permission_epoch); + spin_unlock(&cii->c_lock); + + return hit; +diff --git a/fs/compat.c b/fs/compat.c +index b13df99..6f6f4a3 100644 +--- a/fs/compat.c ++++ b/fs/compat.c +@@ -54,7 +54,7 @@ + #include <asm/ioctls.h> + #include "internal.h" + +-int compat_log = 1; ++int compat_log = 0; + + int compat_printk(const char *fmt, ...) + { +@@ -512,7 +512,7 @@ COMPAT_SYSCALL_DEFINE2(io_setup, unsigned, nr_reqs, u32 __user *, ctx32p) + + set_fs(KERNEL_DS); + /* The __user pointer cast is valid because of the set_fs() */ +- ret = sys_io_setup(nr_reqs, (aio_context_t __user *) &ctx64); ++ ret = sys_io_setup(nr_reqs, (aio_context_t __force_user *) &ctx64); + set_fs(oldfs); + /* truncating is ok because it's a user address */ + if (!ret) +@@ -562,7 +562,7 @@ ssize_t compat_rw_copy_check_uvector(int type, + goto out; + + ret = -EINVAL; +- if (nr_segs > UIO_MAXIOV || nr_segs < 0) ++ if (nr_segs > UIO_MAXIOV) + goto out; + if (nr_segs > fast_segs) { + ret = -ENOMEM; +@@ -844,6 +844,7 @@ struct compat_old_linux_dirent { + struct compat_readdir_callback { + struct dir_context ctx; + struct compat_old_linux_dirent __user *dirent; ++ struct file * file; + int result; + }; + +@@ -861,6 +862,10 @@ static int compat_fillonedir(void *__buf, const char *name, int namlen, + buf->result = -EOVERFLOW; + return -EOVERFLOW; + } ++ ++ if (!gr_acl_handle_filldir(buf->file, name, namlen, ino)) ++ return 0; ++ + buf->result++; + dirent = buf->dirent; + if (!access_ok(VERIFY_WRITE, dirent, +@@ -892,6 +897,7 @@ COMPAT_SYSCALL_DEFINE3(old_readdir, unsigned int, fd, + if (!f.file) + return -EBADF; + ++ buf.file = f.file; + error = iterate_dir(f.file, &buf.ctx); + if (buf.result) + error = buf.result; +@@ -911,6 +917,7 @@ struct compat_getdents_callback { + struct dir_context ctx; + struct compat_linux_dirent __user *current_dir; + struct compat_linux_dirent __user *previous; ++ struct file * file; + int count; + int error; + }; +@@ -932,6 +939,10 @@ static int compat_filldir(void *__buf, const char *name, int namlen, + buf->error = -EOVERFLOW; + return -EOVERFLOW; + } ++ ++ if (!gr_acl_handle_filldir(buf->file, name, namlen, ino)) ++ return 0; ++ + dirent = buf->previous; + if (dirent) { + if (__put_user(offset, &dirent->d_off)) +@@ -977,6 +988,7 @@ COMPAT_SYSCALL_DEFINE3(getdents, unsigned int, fd, + if (!f.file) + return -EBADF; + ++ buf.file = f.file; + error = iterate_dir(f.file, &buf.ctx); + if (error >= 0) + error = buf.error; +@@ -997,6 +1009,7 @@ struct compat_getdents_callback64 { + struct dir_context ctx; + struct linux_dirent64 __user *current_dir; + struct linux_dirent64 __user *previous; ++ struct file * file; + int count; + int error; + }; +@@ -1013,6 +1026,10 @@ static int compat_filldir64(void * __buf, const char * name, int namlen, loff_t + buf->error = -EINVAL; /* only used if we fail.. */ + if (reclen > buf->count) + return -EINVAL; ++ ++ if (!gr_acl_handle_filldir(buf->file, name, namlen, ino)) ++ return 0; ++ + dirent = buf->previous; + + if (dirent) { +@@ -1062,6 +1079,7 @@ COMPAT_SYSCALL_DEFINE3(getdents64, unsigned int, fd, + if (!f.file) + return -EBADF; + ++ buf.file = f.file; + error = iterate_dir(f.file, &buf.ctx); + if (error >= 0) + error = buf.error; +diff --git a/fs/compat_binfmt_elf.c b/fs/compat_binfmt_elf.c +index 4d24d17..4f8c09e 100644 +--- a/fs/compat_binfmt_elf.c ++++ b/fs/compat_binfmt_elf.c +@@ -30,11 +30,13 @@ + #undef elf_phdr + #undef elf_shdr + #undef elf_note ++#undef elf_dyn + #undef elf_addr_t + #define elfhdr elf32_hdr + #define elf_phdr elf32_phdr + #define elf_shdr elf32_shdr + #define elf_note elf32_note ++#define elf_dyn Elf32_Dyn + #define elf_addr_t Elf32_Addr + + /* +diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c +index afec645..9c65620 100644 +--- a/fs/compat_ioctl.c ++++ b/fs/compat_ioctl.c +@@ -621,7 +621,7 @@ static int serial_struct_ioctl(unsigned fd, unsigned cmd, + return -EFAULT; + if (__get_user(udata, &ss32->iomem_base)) + return -EFAULT; +- ss.iomem_base = compat_ptr(udata); ++ ss.iomem_base = (unsigned char __force_kernel *)compat_ptr(udata); + if (__get_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift) || + __get_user(ss.port_high, &ss32->port_high)) + return -EFAULT; +@@ -703,8 +703,8 @@ static int do_i2c_rdwr_ioctl(unsigned int fd, unsigned int cmd, + for (i = 0; i < nmsgs; i++) { + if (copy_in_user(&tmsgs[i].addr, &umsgs[i].addr, 3*sizeof(u16))) + return -EFAULT; +- if (get_user(datap, &umsgs[i].buf) || +- put_user(compat_ptr(datap), &tmsgs[i].buf)) ++ if (get_user(datap, (compat_caddr_t __user *)&umsgs[i].buf) || ++ put_user(compat_ptr(datap), (u8 __user * __user *)&tmsgs[i].buf)) + return -EFAULT; + } + return sys_ioctl(fd, cmd, (unsigned long)tdata); +@@ -797,7 +797,7 @@ static int compat_ioctl_preallocate(struct file *file, + copy_in_user(&p->l_len, &p32->l_len, sizeof(s64)) || + copy_in_user(&p->l_sysid, &p32->l_sysid, sizeof(s32)) || + copy_in_user(&p->l_pid, &p32->l_pid, sizeof(u32)) || +- copy_in_user(&p->l_pad, &p32->l_pad, 4*sizeof(u32))) ++ copy_in_user(p->l_pad, p32->l_pad, 4*sizeof(u32))) + return -EFAULT; + + return ioctl_preallocate(file, p); +@@ -1618,8 +1618,8 @@ COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, + static int __init init_sys32_ioctl_cmp(const void *p, const void *q) + { + unsigned int a, b; +- a = *(unsigned int *)p; +- b = *(unsigned int *)q; ++ a = *(const unsigned int *)p; ++ b = *(const unsigned int *)q; + if (a > b) + return 1; + if (a < b) +diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c +index 668dcab..daebcd6 100644 +--- a/fs/configfs/dir.c ++++ b/fs/configfs/dir.c +@@ -1548,7 +1548,8 @@ static int configfs_readdir(struct file *file, struct dir_context *ctx) + } + for (p = q->next; p != &parent_sd->s_children; p = p->next) { + struct configfs_dirent *next; +- const char *name; ++ const unsigned char * name; ++ char d_name[sizeof(next->s_dentry->d_iname)]; + int len; + struct inode *inode = NULL; + +@@ -1557,7 +1558,12 @@ static int configfs_readdir(struct file *file, struct dir_context *ctx) + continue; + + name = configfs_get_name(next); +- len = strlen(name); ++ if (next->s_dentry && name == next->s_dentry->d_iname) { ++ len = next->s_dentry->d_name.len; ++ memcpy(d_name, name, len); ++ name = d_name; ++ } else ++ len = strlen(name); + + /* + * We'll have a dentry and an inode for +diff --git a/fs/coredump.c b/fs/coredump.c +index b5c86ff..0dac262 100644 +--- a/fs/coredump.c ++++ b/fs/coredump.c +@@ -450,8 +450,8 @@ static void wait_for_dump_helpers(struct file *file) + struct pipe_inode_info *pipe = file->private_data; + + pipe_lock(pipe); +- pipe->readers++; +- pipe->writers--; ++ atomic_inc(&pipe->readers); ++ atomic_dec(&pipe->writers); + wake_up_interruptible_sync(&pipe->wait); + kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); + pipe_unlock(pipe); +@@ -460,11 +460,11 @@ static void wait_for_dump_helpers(struct file *file) + * We actually want wait_event_freezable() but then we need + * to clear TIF_SIGPENDING and improve dump_interrupted(). + */ +- wait_event_interruptible(pipe->wait, pipe->readers == 1); ++ wait_event_interruptible(pipe->wait, atomic_read(&pipe->readers) == 1); + + pipe_lock(pipe); +- pipe->readers--; +- pipe->writers++; ++ atomic_dec(&pipe->readers); ++ atomic_inc(&pipe->writers); + pipe_unlock(pipe); + } + +@@ -511,7 +511,9 @@ void do_coredump(const siginfo_t *siginfo) + struct files_struct *displaced; + bool need_nonrelative = false; + bool core_dumped = false; +- static atomic_t core_dump_count = ATOMIC_INIT(0); ++ static atomic_unchecked_t core_dump_count = ATOMIC_INIT(0); ++ long signr = siginfo->si_signo; ++ int dumpable; + struct coredump_params cprm = { + .siginfo = siginfo, + .regs = signal_pt_regs(), +@@ -524,12 +526,17 @@ void do_coredump(const siginfo_t *siginfo) + .mm_flags = mm->flags, + }; + +- audit_core_dumps(siginfo->si_signo); ++ audit_core_dumps(signr); ++ ++ dumpable = __get_dumpable(cprm.mm_flags); ++ ++ if (signr == SIGSEGV || signr == SIGBUS || signr == SIGKILL || signr == SIGILL) ++ gr_handle_brute_attach(dumpable); + + binfmt = mm->binfmt; + if (!binfmt || !binfmt->core_dump) + goto fail; +- if (!__get_dumpable(cprm.mm_flags)) ++ if (!dumpable) + goto fail; + + cred = prepare_creds(); +@@ -548,7 +555,7 @@ void do_coredump(const siginfo_t *siginfo) + need_nonrelative = true; + } + +- retval = coredump_wait(siginfo->si_signo, &core_state); ++ retval = coredump_wait(signr, &core_state); + if (retval < 0) + goto fail_creds; + +@@ -591,7 +598,7 @@ void do_coredump(const siginfo_t *siginfo) + } + cprm.limit = RLIM_INFINITY; + +- dump_count = atomic_inc_return(&core_dump_count); ++ dump_count = atomic_inc_return_unchecked(&core_dump_count); + if (core_pipe_limit && (core_pipe_limit < dump_count)) { + printk(KERN_WARNING "Pid %d(%s) over core_pipe_limit\n", + task_tgid_vnr(current), current->comm); +@@ -623,6 +630,8 @@ void do_coredump(const siginfo_t *siginfo) + } else { + struct inode *inode; + ++ gr_learn_resource(current, RLIMIT_CORE, binfmt->min_coredump, 1); ++ + if (cprm.limit < binfmt->min_coredump) + goto fail_unlock; + +@@ -681,7 +690,7 @@ close_fail: + filp_close(cprm.file, NULL); + fail_dropcount: + if (ispipe) +- atomic_dec(&core_dump_count); ++ atomic_dec_unchecked(&core_dump_count); + fail_unlock: + kfree(cn.corename); + coredump_finish(mm, core_dumped); +@@ -702,6 +711,8 @@ int dump_emit(struct coredump_params *cprm, const void *addr, int nr) + struct file *file = cprm->file; + loff_t pos = file->f_pos; + ssize_t n; ++ ++ gr_learn_resource(current, RLIMIT_CORE, cprm->written + nr, 1); + if (cprm->written + nr > cprm->limit) + return 0; + while (nr) { +diff --git a/fs/dcache.c b/fs/dcache.c +index 03dca3c..15f326d 100644 +--- a/fs/dcache.c ++++ b/fs/dcache.c +@@ -508,7 +508,7 @@ static void __dentry_kill(struct dentry *dentry) + * dentry_iput drops the locks, at which point nobody (except + * transient RCU lookups) can reach this dentry. + */ +- BUG_ON((int)dentry->d_lockref.count > 0); ++ BUG_ON((int)__lockref_read(&dentry->d_lockref) > 0); + this_cpu_dec(nr_dentry); + if (dentry->d_op && dentry->d_op->d_release) + dentry->d_op->d_release(dentry); +@@ -561,7 +561,7 @@ static inline struct dentry *lock_parent(struct dentry *dentry) + struct dentry *parent = dentry->d_parent; + if (IS_ROOT(dentry)) + return NULL; +- if (unlikely((int)dentry->d_lockref.count < 0)) ++ if (unlikely((int)__lockref_read(&dentry->d_lockref) < 0)) + return NULL; + if (likely(spin_trylock(&parent->d_lock))) + return parent; +@@ -638,7 +638,7 @@ repeat: + dentry->d_flags |= DCACHE_REFERENCED; + dentry_lru_add(dentry); + +- dentry->d_lockref.count--; ++ __lockref_dec(&dentry->d_lockref); + spin_unlock(&dentry->d_lock); + return; + +@@ -653,7 +653,7 @@ EXPORT_SYMBOL(dput); + /* This must be called with d_lock held */ + static inline void __dget_dlock(struct dentry *dentry) + { +- dentry->d_lockref.count++; ++ __lockref_inc(&dentry->d_lockref); + } + + static inline void __dget(struct dentry *dentry) +@@ -694,8 +694,8 @@ repeat: + goto repeat; + } + rcu_read_unlock(); +- BUG_ON(!ret->d_lockref.count); +- ret->d_lockref.count++; ++ BUG_ON(!__lockref_read(&ret->d_lockref)); ++ __lockref_inc(&ret->d_lockref); + spin_unlock(&ret->d_lock); + return ret; + } +@@ -773,9 +773,9 @@ restart: + spin_lock(&inode->i_lock); + hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) { + spin_lock(&dentry->d_lock); +- if (!dentry->d_lockref.count) { ++ if (!__lockref_read(&dentry->d_lockref)) { + struct dentry *parent = lock_parent(dentry); +- if (likely(!dentry->d_lockref.count)) { ++ if (likely(!__lockref_read(&dentry->d_lockref))) { + __dentry_kill(dentry); + dput(parent); + goto restart; +@@ -810,7 +810,7 @@ static void shrink_dentry_list(struct list_head *list) + * We found an inuse dentry which was not removed from + * the LRU because of laziness during lookup. Do not free it. + */ +- if ((int)dentry->d_lockref.count > 0) { ++ if ((int)__lockref_read(&dentry->d_lockref) > 0) { + spin_unlock(&dentry->d_lock); + if (parent) + spin_unlock(&parent->d_lock); +@@ -848,8 +848,8 @@ static void shrink_dentry_list(struct list_head *list) + dentry = parent; + while (dentry && !lockref_put_or_lock(&dentry->d_lockref)) { + parent = lock_parent(dentry); +- if (dentry->d_lockref.count != 1) { +- dentry->d_lockref.count--; ++ if (__lockref_read(&dentry->d_lockref) != 1) { ++ __lockref_inc(&dentry->d_lockref); + spin_unlock(&dentry->d_lock); + if (parent) + spin_unlock(&parent->d_lock); +@@ -889,7 +889,7 @@ dentry_lru_isolate(struct list_head *item, spinlock_t *lru_lock, void *arg) + * counts, just remove them from the LRU. Otherwise give them + * another pass through the LRU. + */ +- if (dentry->d_lockref.count) { ++ if (__lockref_read(&dentry->d_lockref) > 0) { + d_lru_isolate(dentry); + spin_unlock(&dentry->d_lock); + return LRU_REMOVED; +@@ -1225,7 +1225,7 @@ static enum d_walk_ret select_collect(void *_data, struct dentry *dentry) + } else { + if (dentry->d_flags & DCACHE_LRU_LIST) + d_lru_del(dentry); +- if (!dentry->d_lockref.count) { ++ if (!__lockref_read(&dentry->d_lockref)) { + d_shrink_add(dentry, &data->dispose); + data->found++; + } +@@ -1273,7 +1273,7 @@ static enum d_walk_ret umount_check(void *_data, struct dentry *dentry) + return D_WALK_CONTINUE; + + /* root with refcount 1 is fine */ +- if (dentry == _data && dentry->d_lockref.count == 1) ++ if (dentry == _data && __lockref_read(&dentry->d_lockref) == 1) + return D_WALK_CONTINUE; + + printk(KERN_ERR "BUG: Dentry %p{i=%lx,n=%pd} " +@@ -1282,7 +1282,7 @@ static enum d_walk_ret umount_check(void *_data, struct dentry *dentry) + dentry->d_inode ? + dentry->d_inode->i_ino : 0UL, + dentry, +- dentry->d_lockref.count, ++ __lockref_read(&dentry->d_lockref), + dentry->d_sb->s_type->name, + dentry->d_sb->s_id); + WARN_ON(1); +@@ -1423,7 +1423,7 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name) + dentry->d_iname[DNAME_INLINE_LEN-1] = 0; + if (name->len > DNAME_INLINE_LEN-1) { + size_t size = offsetof(struct external_name, name[1]); +- struct external_name *p = kmalloc(size + name->len, GFP_KERNEL); ++ struct external_name *p = kmalloc(round_up(size + name->len, sizeof(unsigned long)), GFP_KERNEL); + if (!p) { + kmem_cache_free(dentry_cache, dentry); + return NULL; +@@ -1443,7 +1443,7 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name) + smp_wmb(); + dentry->d_name.name = dname; + +- dentry->d_lockref.count = 1; ++ __lockref_set(&dentry->d_lockref, 1); + dentry->d_flags = 0; + spin_lock_init(&dentry->d_lock); + seqcount_init(&dentry->d_seq); +@@ -1452,6 +1452,9 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name) + dentry->d_sb = sb; + dentry->d_op = NULL; + dentry->d_fsdata = NULL; ++#ifdef CONFIG_GRKERNSEC_CHROOT_RENAME ++ atomic_set(&dentry->chroot_refcnt, 0); ++#endif + INIT_HLIST_BL_NODE(&dentry->d_hash); + INIT_LIST_HEAD(&dentry->d_lru); + INIT_LIST_HEAD(&dentry->d_subdirs); +@@ -2183,7 +2186,7 @@ struct dentry *__d_lookup(const struct dentry *parent, const struct qstr *name) + goto next; + } + +- dentry->d_lockref.count++; ++ __lockref_inc(&dentry->d_lockref); + found = dentry; + spin_unlock(&dentry->d_lock); + break; +@@ -2282,7 +2285,7 @@ again: + spin_lock(&dentry->d_lock); + inode = dentry->d_inode; + isdir = S_ISDIR(inode->i_mode); +- if (dentry->d_lockref.count == 1) { ++ if (__lockref_read(&dentry->d_lockref) == 1) { + if (!spin_trylock(&inode->i_lock)) { + spin_unlock(&dentry->d_lock); + cpu_relax(); +@@ -3308,7 +3311,7 @@ static enum d_walk_ret d_genocide_kill(void *data, struct dentry *dentry) + + if (!(dentry->d_flags & DCACHE_GENOCIDE)) { + dentry->d_flags |= DCACHE_GENOCIDE; +- dentry->d_lockref.count--; ++ __lockref_dec(&dentry->d_lockref); + } + } + return D_WALK_CONTINUE; +@@ -3424,7 +3427,8 @@ void __init vfs_caches_init(unsigned long mempages) + mempages -= reserve; + + names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0, +- SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL); ++ SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_USERCOPY| ++ SLAB_NO_SANITIZE, NULL); + + dcache_init(); + inode_init(); +diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c +index 6f0ce53..92bba36 100644 +--- a/fs/debugfs/inode.c ++++ b/fs/debugfs/inode.c +@@ -423,10 +423,20 @@ EXPORT_SYMBOL_GPL(debugfs_create_file); + * If debugfs is not enabled in the kernel, the value -%ENODEV will be + * returned. + */ ++#ifdef CONFIG_GRKERNSEC_SYSFS_RESTRICT ++extern int grsec_enable_sysfs_restrict; ++#endif ++ + struct dentry *debugfs_create_dir(const char *name, struct dentry *parent) + { +- return __create_file(name, S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, +- parent, NULL, NULL); ++ umode_t mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO; ++ ++#ifdef CONFIG_GRKERNSEC_SYSFS_RESTRICT ++ if (grsec_enable_sysfs_restrict) ++ mode = S_IFDIR | S_IRWXU; ++#endif ++ ++ return __create_file(name, mode, parent, NULL, NULL); + } + EXPORT_SYMBOL_GPL(debugfs_create_dir); + +diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c +index 1686dc2..9611c50 100644 +--- a/fs/ecryptfs/inode.c ++++ b/fs/ecryptfs/inode.c +@@ -664,7 +664,7 @@ static char *ecryptfs_readlink_lower(struct dentry *dentry, size_t *bufsiz) + old_fs = get_fs(); + set_fs(get_ds()); + rc = lower_dentry->d_inode->i_op->readlink(lower_dentry, +- (char __user *)lower_buf, ++ (char __force_user *)lower_buf, + PATH_MAX); + set_fs(old_fs); + if (rc < 0) +diff --git a/fs/ecryptfs/miscdev.c b/fs/ecryptfs/miscdev.c +index e4141f2..d8263e8 100644 +--- a/fs/ecryptfs/miscdev.c ++++ b/fs/ecryptfs/miscdev.c +@@ -304,7 +304,7 @@ check_list: + goto out_unlock_msg_ctx; + i = PKT_TYPE_SIZE + PKT_CTR_SIZE; + if (msg_ctx->msg) { +- if (copy_to_user(&buf[i], packet_length, packet_length_size)) ++ if (packet_length_size > sizeof(packet_length) || copy_to_user(&buf[i], packet_length, packet_length_size)) + goto out_unlock_msg_ctx; + i += packet_length_size; + if (copy_to_user(&buf[i], msg_ctx->msg, msg_ctx->msg_size)) +diff --git a/fs/exec.c b/fs/exec.c +index 7302b75..17e4eb1 100644 +--- a/fs/exec.c ++++ b/fs/exec.c +@@ -56,8 +56,20 @@ + #include <linux/pipe_fs_i.h> + #include <linux/oom.h> + #include <linux/compat.h> ++#include <linux/random.h> ++#include <linux/seq_file.h> ++#include <linux/coredump.h> ++#include <linux/mman.h> ++ ++#ifdef CONFIG_PAX_REFCOUNT ++#include <linux/kallsyms.h> ++#include <linux/kdebug.h> ++#endif ++ ++#include <trace/events/fs.h> + + #include <asm/uaccess.h> ++#include <asm/sections.h> + #include <asm/mmu_context.h> + #include <asm/tlb.h> + +@@ -66,19 +78,34 @@ + + #include <trace/events/sched.h> + ++#ifdef CONFIG_PAX_HAVE_ACL_FLAGS ++void __weak pax_set_initial_flags(struct linux_binprm *bprm) ++{ ++ pr_warn_once("PAX: PAX_HAVE_ACL_FLAGS was enabled without providing the pax_set_initial_flags callback, this is probably not what you wanted.\n"); ++} ++#endif ++ ++#ifdef CONFIG_PAX_HOOK_ACL_FLAGS ++void (*pax_set_initial_flags_func)(struct linux_binprm *bprm); ++EXPORT_SYMBOL(pax_set_initial_flags_func); ++#endif ++ + int suid_dumpable = 0; + + static LIST_HEAD(formats); + static DEFINE_RWLOCK(binfmt_lock); + ++extern int gr_process_kernel_exec_ban(void); ++extern int gr_process_suid_exec_ban(const struct linux_binprm *bprm); ++ + void __register_binfmt(struct linux_binfmt * fmt, int insert) + { + BUG_ON(!fmt); + if (WARN_ON(!fmt->load_binary)) + return; + write_lock(&binfmt_lock); +- insert ? list_add(&fmt->lh, &formats) : +- list_add_tail(&fmt->lh, &formats); ++ insert ? pax_list_add((struct list_head *)&fmt->lh, &formats) : ++ pax_list_add_tail((struct list_head *)&fmt->lh, &formats); + write_unlock(&binfmt_lock); + } + +@@ -87,7 +114,7 @@ EXPORT_SYMBOL(__register_binfmt); + void unregister_binfmt(struct linux_binfmt * fmt) + { + write_lock(&binfmt_lock); +- list_del(&fmt->lh); ++ pax_list_del((struct list_head *)&fmt->lh); + write_unlock(&binfmt_lock); + } + +@@ -183,18 +210,10 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, + int write) + { + struct page *page; +- int ret; + +-#ifdef CONFIG_STACK_GROWSUP +- if (write) { +- ret = expand_downwards(bprm->vma, pos); +- if (ret < 0) +- return NULL; +- } +-#endif +- ret = get_user_pages(current, bprm->mm, pos, +- 1, write, 1, &page, NULL); +- if (ret <= 0) ++ if (0 > expand_downwards(bprm->vma, pos)) ++ return NULL; ++ if (0 >= get_user_pages(current, bprm->mm, pos, 1, write, 1, &page, NULL)) + return NULL; + + if (write) { +@@ -210,6 +229,17 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, + if (size <= ARG_MAX) + return page; + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ // only allow 512KB for argv+env on suid/sgid binaries ++ // to prevent easy ASLR exhaustion ++ if (((!uid_eq(bprm->cred->euid, current_euid())) || ++ (!gid_eq(bprm->cred->egid, current_egid()))) && ++ (size > (512 * 1024))) { ++ put_page(page); ++ return NULL; ++ } ++#endif ++ + /* + * Limit to 1/4-th the stack size for the argv+env strings. + * This ensures that: +@@ -269,6 +299,11 @@ static int __bprm_mm_init(struct linux_binprm *bprm) + vma->vm_end = STACK_TOP_MAX; + vma->vm_start = vma->vm_end - PAGE_SIZE; + vma->vm_flags = VM_SOFTDIRTY | VM_STACK_FLAGS | VM_STACK_INCOMPLETE_SETUP; ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ vma->vm_flags &= ~(VM_EXEC | VM_MAYEXEC); ++#endif ++ + vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); + INIT_LIST_HEAD(&vma->anon_vma_chain); + +@@ -279,6 +314,12 @@ static int __bprm_mm_init(struct linux_binprm *bprm) + mm->stack_vm = mm->total_vm = 1; + up_write(&mm->mmap_sem); + bprm->p = vma->vm_end - sizeof(void *); ++ ++#ifdef CONFIG_PAX_RANDUSTACK ++ if (randomize_va_space) ++ bprm->p ^= prandom_u32() & ~PAGE_MASK; ++#endif ++ + return 0; + err: + up_write(&mm->mmap_sem); +@@ -395,7 +436,7 @@ struct user_arg_ptr { + } ptr; + }; + +-static const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr) ++const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr) + { + const char __user *native; + +@@ -404,14 +445,14 @@ static const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr) + compat_uptr_t compat; + + if (get_user(compat, argv.ptr.compat + nr)) +- return ERR_PTR(-EFAULT); ++ return (const char __force_user *)ERR_PTR(-EFAULT); + + return compat_ptr(compat); + } + #endif + + if (get_user(native, argv.ptr.native + nr)) +- return ERR_PTR(-EFAULT); ++ return (const char __force_user *)ERR_PTR(-EFAULT); + + return native; + } +@@ -430,7 +471,7 @@ static int count(struct user_arg_ptr argv, int max) + if (!p) + break; + +- if (IS_ERR(p)) ++ if (IS_ERR((const char __force_kernel *)p)) + return -EFAULT; + + if (i >= max) +@@ -465,7 +506,7 @@ static int copy_strings(int argc, struct user_arg_ptr argv, + + ret = -EFAULT; + str = get_user_arg_ptr(argv, argc); +- if (IS_ERR(str)) ++ if (IS_ERR((const char __force_kernel *)str)) + goto out; + + len = strnlen_user(str, MAX_ARG_STRLEN); +@@ -547,7 +588,7 @@ int copy_strings_kernel(int argc, const char *const *__argv, + int r; + mm_segment_t oldfs = get_fs(); + struct user_arg_ptr argv = { +- .ptr.native = (const char __user *const __user *)__argv, ++ .ptr.native = (const char __user * const __force_user *)__argv, + }; + + set_fs(KERNEL_DS); +@@ -582,7 +623,8 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) + unsigned long new_end = old_end - shift; + struct mmu_gather tlb; + +- BUG_ON(new_start > new_end); ++ if (new_start >= new_end || new_start < mmap_min_addr) ++ return -ENOMEM; + + /* + * ensure there are no vmas between where we want to go +@@ -591,6 +633,10 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) + if (vma != find_vma(mm, new_start)) + return -EFAULT; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ BUG_ON(pax_find_mirror_vma(vma)); ++#endif ++ + /* + * cover the whole range: [new_start, old_end) + */ +@@ -671,10 +717,6 @@ int setup_arg_pages(struct linux_binprm *bprm, + stack_top = arch_align_stack(stack_top); + stack_top = PAGE_ALIGN(stack_top); + +- if (unlikely(stack_top < mmap_min_addr) || +- unlikely(vma->vm_end - vma->vm_start >= stack_top - mmap_min_addr)) +- return -ENOMEM; +- + stack_shift = vma->vm_end - stack_top; + + bprm->p -= stack_shift; +@@ -686,8 +728,28 @@ int setup_arg_pages(struct linux_binprm *bprm, + bprm->exec -= stack_shift; + + down_write(&mm->mmap_sem); ++ ++ /* Move stack pages down in memory. */ ++ if (stack_shift) { ++ ret = shift_arg_pages(vma, stack_shift); ++ if (ret) ++ goto out_unlock; ++ } ++ + vm_flags = VM_STACK_FLAGS; + ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++ if (mm->pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) { ++ vm_flags &= ~VM_EXEC; ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (mm->pax_flags & MF_PAX_MPROTECT) ++ vm_flags &= ~VM_MAYEXEC; ++#endif ++ ++ } ++#endif ++ + /* + * Adjust stack execute permissions; explicitly enable for + * EXSTACK_ENABLE_X, disable for EXSTACK_DISABLE_X and leave alone +@@ -706,13 +768,6 @@ int setup_arg_pages(struct linux_binprm *bprm, + goto out_unlock; + BUG_ON(prev != vma); + +- /* Move stack pages down in memory. */ +- if (stack_shift) { +- ret = shift_arg_pages(vma, stack_shift); +- if (ret) +- goto out_unlock; +- } +- + /* mprotect_fixup is overkill to remove the temporary stack flags */ + vma->vm_flags &= ~VM_STACK_INCOMPLETE_SETUP; + +@@ -736,6 +791,27 @@ int setup_arg_pages(struct linux_binprm *bprm, + #endif + current->mm->start_stack = bprm->p; + ret = expand_stack(vma, stack_base); ++ ++#if !defined(CONFIG_STACK_GROWSUP) && defined(CONFIG_PAX_RANDMMAP) ++ if (!ret && (mm->pax_flags & MF_PAX_RANDMMAP) && STACK_TOP <= 0xFFFFFFFFU && STACK_TOP > vma->vm_end) { ++ unsigned long size; ++ vm_flags_t vm_flags; ++ ++ size = STACK_TOP - vma->vm_end; ++ vm_flags = VM_NONE | VM_DONTEXPAND | VM_DONTDUMP; ++ ++ ret = vma->vm_end != mmap_region(NULL, vma->vm_end, size, vm_flags, 0); ++ ++#ifdef CONFIG_X86 ++ if (!ret) { ++ size = PAGE_SIZE + mmap_min_addr + ((mm->delta_mmap ^ mm->delta_stack) & (0xFFUL << PAGE_SHIFT)); ++ ret = 0 != mmap_region(NULL, 0, PAGE_ALIGN(size), vm_flags, 0); ++ } ++#endif ++ ++ } ++#endif ++ + if (ret) + ret = -EFAULT; + +@@ -771,6 +847,8 @@ static struct file *do_open_exec(struct filename *name) + + fsnotify_open(file); + ++ trace_open_exec(name->name); ++ + err = deny_write_access(file); + if (err) + goto exit; +@@ -800,7 +878,7 @@ int kernel_read(struct file *file, loff_t offset, + old_fs = get_fs(); + set_fs(get_ds()); + /* The cast to a user pointer is valid due to the set_fs() */ +- result = vfs_read(file, (void __user *)addr, count, &pos); ++ result = vfs_read(file, (void __force_user *)addr, count, &pos); + set_fs(old_fs); + return result; + } +@@ -845,6 +923,7 @@ static int exec_mmap(struct mm_struct *mm) + tsk->mm = mm; + tsk->active_mm = mm; + activate_mm(active_mm, mm); ++ populate_stack(); + tsk->mm->vmacache_seqnum = 0; + vmacache_flush(tsk); + task_unlock(tsk); +@@ -911,10 +990,14 @@ static int de_thread(struct task_struct *tsk) + if (!thread_group_leader(tsk)) { + struct task_struct *leader = tsk->group_leader; + +- sig->notify_count = -1; /* for exit_notify() */ + for (;;) { + threadgroup_change_begin(tsk); + write_lock_irq(&tasklist_lock); ++ /* ++ * Do this under tasklist_lock to ensure that ++ * exit_notify() can't miss ->group_exit_task ++ */ ++ sig->notify_count = -1; + if (likely(leader->exit_state)) + break; + __set_current_state(TASK_KILLABLE); +@@ -1243,7 +1326,7 @@ static void check_unsafe_exec(struct linux_binprm *bprm) + } + rcu_read_unlock(); + +- if (p->fs->users > n_fs) ++ if (atomic_read(&p->fs->users) > n_fs) + bprm->unsafe |= LSM_UNSAFE_SHARE; + else + p->fs->in_exec = 1; +@@ -1424,6 +1507,31 @@ static int exec_binprm(struct linux_binprm *bprm) + return ret; + } + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++static DEFINE_PER_CPU(u64, exec_counter); ++static int __init init_exec_counters(void) ++{ ++ unsigned int cpu; ++ ++ for_each_possible_cpu(cpu) { ++ per_cpu(exec_counter, cpu) = (u64)cpu; ++ } ++ ++ return 0; ++} ++early_initcall(init_exec_counters); ++static inline void increment_exec_counter(void) ++{ ++ BUILD_BUG_ON(NR_CPUS > (1 << 16)); ++ current->exec_id = this_cpu_add_return(exec_counter, 1 << 16); ++} ++#else ++static inline void increment_exec_counter(void) {} ++#endif ++ ++extern void gr_handle_exec_args(struct linux_binprm *bprm, ++ struct user_arg_ptr argv); ++ + /* + * sys_execve() executes a new program. + */ +@@ -1431,6 +1539,11 @@ static int do_execve_common(struct filename *filename, + struct user_arg_ptr argv, + struct user_arg_ptr envp) + { ++#ifdef CONFIG_GRKERNSEC ++ struct file *old_exec_file; ++ struct acl_subject_label *old_acl; ++ struct rlimit old_rlim[RLIM_NLIMITS]; ++#endif + struct linux_binprm *bprm; + struct file *file; + struct files_struct *displaced; +@@ -1439,6 +1552,8 @@ static int do_execve_common(struct filename *filename, + if (IS_ERR(filename)) + return PTR_ERR(filename); + ++ gr_learn_resource(current, RLIMIT_NPROC, atomic_read(¤t_user()->processes), 1); ++ + /* + * We move the actual failure in case of RLIMIT_NPROC excess from + * set*uid() to execve() because too many poorly written programs +@@ -1476,11 +1591,21 @@ static int do_execve_common(struct filename *filename, + if (IS_ERR(file)) + goto out_unmark; + ++ if (gr_ptrace_readexec(file, bprm->unsafe)) { ++ retval = -EPERM; ++ goto out_unmark; ++ } ++ + sched_exec(); + + bprm->file = file; + bprm->filename = bprm->interp = filename->name; + ++ if (!gr_acl_handle_execve(file->f_path.dentry, file->f_path.mnt)) { ++ retval = -EACCES; ++ goto out_unmark; ++ } ++ + retval = bprm_mm_init(bprm); + if (retval) + goto out_unmark; +@@ -1497,24 +1622,70 @@ static int do_execve_common(struct filename *filename, + if (retval < 0) + goto out; + ++#ifdef CONFIG_GRKERNSEC ++ old_acl = current->acl; ++ memcpy(old_rlim, current->signal->rlim, sizeof(old_rlim)); ++ old_exec_file = current->exec_file; ++ get_file(file); ++ current->exec_file = file; ++#endif ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ /* limit suid stack to 8MB ++ * we saved the old limits above and will restore them if this exec fails ++ */ ++ if (((!uid_eq(bprm->cred->euid, current_euid())) || (!gid_eq(bprm->cred->egid, current_egid()))) && ++ (old_rlim[RLIMIT_STACK].rlim_cur > (8 * 1024 * 1024))) ++ current->signal->rlim[RLIMIT_STACK].rlim_cur = 8 * 1024 * 1024; ++#endif ++ ++ if (gr_process_kernel_exec_ban() || gr_process_suid_exec_ban(bprm)) { ++ retval = -EPERM; ++ goto out_fail; ++ } ++ ++ if (!gr_tpe_allow(file)) { ++ retval = -EACCES; ++ goto out_fail; ++ } ++ ++ if (gr_check_crash_exec(file)) { ++ retval = -EACCES; ++ goto out_fail; ++ } ++ ++ retval = gr_set_proc_label(file->f_path.dentry, file->f_path.mnt, ++ bprm->unsafe); ++ if (retval < 0) ++ goto out_fail; ++ + retval = copy_strings_kernel(1, &bprm->filename, bprm); + if (retval < 0) +- goto out; ++ goto out_fail; + + bprm->exec = bprm->p; + retval = copy_strings(bprm->envc, envp, bprm); + if (retval < 0) +- goto out; ++ goto out_fail; + + retval = copy_strings(bprm->argc, argv, bprm); + if (retval < 0) +- goto out; ++ goto out_fail; ++ ++ gr_log_chroot_exec(file->f_path.dentry, file->f_path.mnt); ++ ++ gr_handle_exec_args(bprm, argv); + + retval = exec_binprm(bprm); + if (retval < 0) +- goto out; ++ goto out_fail; ++#ifdef CONFIG_GRKERNSEC ++ if (old_exec_file) ++ fput(old_exec_file); ++#endif + + /* execve succeeded */ ++ ++ increment_exec_counter(); + current->fs->in_exec = 0; + current->in_execve = 0; + acct_update_integrals(current); +@@ -1525,6 +1696,14 @@ static int do_execve_common(struct filename *filename, + put_files_struct(displaced); + return retval; + ++out_fail: ++#ifdef CONFIG_GRKERNSEC ++ current->acl = old_acl; ++ memcpy(current->signal->rlim, old_rlim, sizeof(old_rlim)); ++ fput(current->exec_file); ++ current->exec_file = old_exec_file; ++#endif ++ + out: + if (bprm->mm) { + acct_arg_size(bprm, 0); +@@ -1616,3 +1795,312 @@ COMPAT_SYSCALL_DEFINE3(execve, const char __user *, filename, + return compat_do_execve(getname(filename), argv, envp); + } + #endif ++ ++int pax_check_flags(unsigned long *flags) ++{ ++ int retval = 0; ++ ++#if !defined(CONFIG_X86_32) || !defined(CONFIG_PAX_SEGMEXEC) ++ if (*flags & MF_PAX_SEGMEXEC) ++ { ++ *flags &= ~MF_PAX_SEGMEXEC; ++ retval = -EINVAL; ++ } ++#endif ++ ++ if ((*flags & MF_PAX_PAGEEXEC) ++ ++#ifdef CONFIG_PAX_PAGEEXEC ++ && (*flags & MF_PAX_SEGMEXEC) ++#endif ++ ++ ) ++ { ++ *flags &= ~MF_PAX_PAGEEXEC; ++ retval = -EINVAL; ++ } ++ ++ if ((*flags & MF_PAX_MPROTECT) ++ ++#ifdef CONFIG_PAX_MPROTECT ++ && !(*flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) ++#endif ++ ++ ) ++ { ++ *flags &= ~MF_PAX_MPROTECT; ++ retval = -EINVAL; ++ } ++ ++ if ((*flags & MF_PAX_EMUTRAMP) ++ ++#ifdef CONFIG_PAX_EMUTRAMP ++ && !(*flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) ++#endif ++ ++ ) ++ { ++ *flags &= ~MF_PAX_EMUTRAMP; ++ retval = -EINVAL; ++ } ++ ++ return retval; ++} ++ ++EXPORT_SYMBOL(pax_check_flags); ++ ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++char *pax_get_path(const struct path *path, char *buf, int buflen) ++{ ++ char *pathname = d_path(path, buf, buflen); ++ ++ if (IS_ERR(pathname)) ++ goto toolong; ++ ++ pathname = mangle_path(buf, pathname, "\t\n\\"); ++ if (!pathname) ++ goto toolong; ++ ++ *pathname = 0; ++ return buf; ++ ++toolong: ++ return "<path too long>"; ++} ++EXPORT_SYMBOL(pax_get_path); ++ ++void pax_report_fault(struct pt_regs *regs, void *pc, void *sp) ++{ ++ struct task_struct *tsk = current; ++ struct mm_struct *mm = current->mm; ++ char *buffer_exec = (char *)__get_free_page(GFP_KERNEL); ++ char *buffer_fault = (char *)__get_free_page(GFP_KERNEL); ++ char *path_exec = NULL; ++ char *path_fault = NULL; ++ unsigned long start = 0UL, end = 0UL, offset = 0UL; ++ siginfo_t info = { }; ++ ++ if (buffer_exec && buffer_fault) { ++ struct vm_area_struct *vma, *vma_exec = NULL, *vma_fault = NULL; ++ ++ down_read(&mm->mmap_sem); ++ vma = mm->mmap; ++ while (vma && (!vma_exec || !vma_fault)) { ++ if (vma->vm_file && mm->exe_file == vma->vm_file && (vma->vm_flags & VM_EXEC)) ++ vma_exec = vma; ++ if (vma->vm_start <= (unsigned long)pc && (unsigned long)pc < vma->vm_end) ++ vma_fault = vma; ++ vma = vma->vm_next; ++ } ++ if (vma_exec) ++ path_exec = pax_get_path(&vma_exec->vm_file->f_path, buffer_exec, PAGE_SIZE); ++ if (vma_fault) { ++ start = vma_fault->vm_start; ++ end = vma_fault->vm_end; ++ offset = vma_fault->vm_pgoff << PAGE_SHIFT; ++ if (vma_fault->vm_file) ++ path_fault = pax_get_path(&vma_fault->vm_file->f_path, buffer_fault, PAGE_SIZE); ++ else if ((unsigned long)pc >= mm->start_brk && (unsigned long)pc < mm->brk) ++ path_fault = "<heap>"; ++ else if (vma_fault->vm_flags & (VM_GROWSDOWN | VM_GROWSUP)) ++ path_fault = "<stack>"; ++ else ++ path_fault = "<anonymous mapping>"; ++ } ++ up_read(&mm->mmap_sem); ++ } ++ if (tsk->signal->curr_ip) ++ printk(KERN_ERR "PAX: From %pI4: execution attempt in: %s, %08lx-%08lx %08lx\n", &tsk->signal->curr_ip, path_fault, start, end, offset); ++ else ++ printk(KERN_ERR "PAX: execution attempt in: %s, %08lx-%08lx %08lx\n", path_fault, start, end, offset); ++ printk(KERN_ERR "PAX: terminating task: %s(%s):%d, uid/euid: %u/%u, PC: %p, SP: %p\n", path_exec, tsk->comm, task_pid_nr(tsk), ++ from_kuid_munged(&init_user_ns, task_uid(tsk)), from_kuid_munged(&init_user_ns, task_euid(tsk)), pc, sp); ++ free_page((unsigned long)buffer_exec); ++ free_page((unsigned long)buffer_fault); ++ pax_report_insns(regs, pc, sp); ++ info.si_signo = SIGKILL; ++ info.si_errno = 0; ++ info.si_code = SI_KERNEL; ++ info.si_pid = 0; ++ info.si_uid = 0; ++ do_coredump(&info); ++} ++#endif ++ ++#ifdef CONFIG_PAX_REFCOUNT ++void pax_report_refcount_overflow(struct pt_regs *regs) ++{ ++ if (current->signal->curr_ip) ++ printk(KERN_ERR "PAX: From %pI4: refcount overflow detected in: %s:%d, uid/euid: %u/%u\n", ++ ¤t->signal->curr_ip, current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid())); ++ else ++ printk(KERN_ERR "PAX: refcount overflow detected in: %s:%d, uid/euid: %u/%u\n", current->comm, task_pid_nr(current), ++ from_kuid_munged(&init_user_ns, current_uid()), from_kuid_munged(&init_user_ns, current_euid())); ++ print_symbol(KERN_ERR "PAX: refcount overflow occured at: %s\n", instruction_pointer(regs)); ++ preempt_disable(); ++ show_regs(regs); ++ preempt_enable(); ++ force_sig_info(SIGKILL, SEND_SIG_FORCED, current); ++} ++#endif ++ ++#ifdef CONFIG_PAX_USERCOPY ++/* 0: not at all, 1: fully, 2: fully inside frame, -1: partially (implies an error) */ ++static noinline int check_stack_object(const void *obj, unsigned long len) ++{ ++ const void * const stack = task_stack_page(current); ++ const void * const stackend = stack + THREAD_SIZE; ++ ++#if defined(CONFIG_FRAME_POINTER) && defined(CONFIG_X86) ++ const void *frame = NULL; ++ const void *oldframe; ++#endif ++ ++ if (obj + len < obj) ++ return -1; ++ ++ if (obj + len <= stack || stackend <= obj) ++ return 0; ++ ++ if (obj < stack || stackend < obj + len) ++ return -1; ++ ++#if defined(CONFIG_FRAME_POINTER) && defined(CONFIG_X86) ++ oldframe = __builtin_frame_address(1); ++ if (oldframe) ++ frame = __builtin_frame_address(2); ++ /* ++ low ----------------------------------------------> high ++ [saved bp][saved ip][args][local vars][saved bp][saved ip] ++ ^----------------^ ++ allow copies only within here ++ */ ++ while (stack <= frame && frame < stackend) { ++ /* if obj + len extends past the last frame, this ++ check won't pass and the next frame will be 0, ++ causing us to bail out and correctly report ++ the copy as invalid ++ */ ++ if (obj + len <= frame) ++ return obj >= oldframe + 2 * sizeof(void *) ? 2 : -1; ++ oldframe = frame; ++ frame = *(const void * const *)frame; ++ } ++ return -1; ++#else ++ return 1; ++#endif ++} ++ ++static __noreturn void pax_report_usercopy(const void *ptr, unsigned long len, bool to_user, const char *type) ++{ ++ if (current->signal->curr_ip) ++ printk(KERN_ERR "PAX: From %pI4: kernel memory %s attempt detected %s %p (%s) (%lu bytes)\n", ++ ¤t->signal->curr_ip, to_user ? "leak" : "overwrite", to_user ? "from" : "to", ptr, type ? : "unknown", len); ++ else ++ printk(KERN_ERR "PAX: kernel memory %s attempt detected %s %p (%s) (%lu bytes)\n", ++ to_user ? "leak" : "overwrite", to_user ? "from" : "to", ptr, type ? : "unknown", len); ++ dump_stack(); ++ gr_handle_kernel_exploit(); ++ do_group_exit(SIGKILL); ++} ++#endif ++ ++#ifdef CONFIG_PAX_USERCOPY ++ ++static inline bool check_kernel_text_object(unsigned long low, unsigned long high) ++{ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ unsigned long textlow = ktla_ktva((unsigned long)_stext); ++#ifdef CONFIG_MODULES ++ unsigned long texthigh = (unsigned long)MODULES_EXEC_VADDR; ++#else ++ unsigned long texthigh = ktla_ktva((unsigned long)_etext); ++#endif ++ ++#else ++ unsigned long textlow = (unsigned long)_stext; ++ unsigned long texthigh = (unsigned long)_etext; ++ ++#ifdef CONFIG_X86_64 ++ /* check against linear mapping as well */ ++ if (high > (unsigned long)__va(__pa(textlow)) && ++ low < (unsigned long)__va(__pa(texthigh))) ++ return true; ++#endif ++ ++#endif ++ ++ if (high <= textlow || low >= texthigh) ++ return false; ++ else ++ return true; ++} ++#endif ++ ++void __check_object_size(const void *ptr, unsigned long n, bool to_user, bool const_size) ++{ ++#ifdef CONFIG_PAX_USERCOPY ++ const char *type; ++#endif ++ ++#if !defined(CONFIG_STACK_GROWSUP) && !defined(CONFIG_X86_64) ++ unsigned long stackstart = (unsigned long)task_stack_page(current); ++ unsigned long currentsp = (unsigned long)&stackstart; ++ if (unlikely((currentsp < stackstart + 512 || ++ currentsp >= stackstart + THREAD_SIZE) && !in_interrupt())) ++ BUG(); ++#endif ++ ++#ifndef CONFIG_PAX_USERCOPY_DEBUG ++ if (const_size) ++ return; ++#endif ++ ++#ifdef CONFIG_PAX_USERCOPY ++ if (!n) ++ return; ++ ++ type = check_heap_object(ptr, n); ++ if (!type) { ++ int ret = check_stack_object(ptr, n); ++ if (ret == 1 || ret == 2) ++ return; ++ if (ret == 0) { ++ if (check_kernel_text_object((unsigned long)ptr, (unsigned long)ptr + n)) ++ type = "<kernel text>"; ++ else ++ return; ++ } else ++ type = "<process stack>"; ++ } ++ ++ pax_report_usercopy(ptr, n, to_user, type); ++#endif ++ ++} ++EXPORT_SYMBOL(__check_object_size); ++ ++#ifdef CONFIG_PAX_MEMORY_STACKLEAK ++void pax_track_stack(void) ++{ ++ unsigned long sp = (unsigned long)&sp; ++ if (sp < current_thread_info()->lowest_stack && ++ sp >= (unsigned long)task_stack_page(current) + 2 * sizeof(unsigned long)) ++ current_thread_info()->lowest_stack = sp; ++ if (unlikely((sp & ~(THREAD_SIZE - 1)) < (THREAD_SIZE/16))) ++ BUG(); ++} ++EXPORT_SYMBOL(pax_track_stack); ++#endif ++ ++#ifdef CONFIG_PAX_SIZE_OVERFLOW ++void report_size_overflow(const char *file, unsigned int line, const char *func, const char *ssa_name) ++{ ++ printk(KERN_ERR "PAX: size overflow detected in function %s %s:%u %s", func, file, line, ssa_name); ++ dump_stack(); ++ do_group_exit(SIGKILL); ++} ++EXPORT_SYMBOL(report_size_overflow); ++#endif +diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c +index 9f9992b..8b59411 100644 +--- a/fs/ext2/balloc.c ++++ b/fs/ext2/balloc.c +@@ -1184,10 +1184,10 @@ static int ext2_has_free_blocks(struct ext2_sb_info *sbi) + + free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); + root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count); +- if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) && ++ if (free_blocks < root_blocks + 1 && + !uid_eq(sbi->s_resuid, current_fsuid()) && + (gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) || +- !in_group_p (sbi->s_resgid))) { ++ !in_group_p (sbi->s_resgid)) && !capable_nolog(CAP_SYS_RESOURCE)) { + return 0; + } + return 1; +diff --git a/fs/ext2/super.c b/fs/ext2/super.c +index 170dc41..62f6b18 100644 +--- a/fs/ext2/super.c ++++ b/fs/ext2/super.c +@@ -264,10 +264,8 @@ static int ext2_show_options(struct seq_file *seq, struct dentry *root) + #ifdef CONFIG_EXT2_FS_XATTR + if (test_opt(sb, XATTR_USER)) + seq_puts(seq, ",user_xattr"); +- if (!test_opt(sb, XATTR_USER) && +- (def_mount_opts & EXT2_DEFM_XATTR_USER)) { ++ if (!test_opt(sb, XATTR_USER)) + seq_puts(seq, ",nouser_xattr"); +- } + #endif + + #ifdef CONFIG_EXT2_FS_POSIX_ACL +@@ -841,8 +839,8 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) + if (def_mount_opts & EXT2_DEFM_UID16) + set_opt(sbi->s_mount_opt, NO_UID32); + #ifdef CONFIG_EXT2_FS_XATTR +- if (def_mount_opts & EXT2_DEFM_XATTR_USER) +- set_opt(sbi->s_mount_opt, XATTR_USER); ++ /* always enable user xattrs */ ++ set_opt(sbi->s_mount_opt, XATTR_USER); + #endif + #ifdef CONFIG_EXT2_FS_POSIX_ACL + if (def_mount_opts & EXT2_DEFM_ACL) +diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c +index 9142614..97484fa 100644 +--- a/fs/ext2/xattr.c ++++ b/fs/ext2/xattr.c +@@ -247,7 +247,7 @@ ext2_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size) + struct buffer_head *bh = NULL; + struct ext2_xattr_entry *entry; + char *end; +- size_t rest = buffer_size; ++ size_t rest = buffer_size, total_size = 0; + int error; + + ea_idebug(inode, "buffer=%p, buffer_size=%ld", +@@ -305,9 +305,10 @@ bad_block: ext2_error(inode->i_sb, "ext2_xattr_list", + buffer += size; + } + rest -= size; ++ total_size += size; + } + } +- error = buffer_size - rest; /* total size */ ++ error = total_size; + + cleanup: + brelse(bh); +diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c +index 158b5d4..2432610 100644 +--- a/fs/ext3/balloc.c ++++ b/fs/ext3/balloc.c +@@ -1438,10 +1438,10 @@ static int ext3_has_free_blocks(struct ext3_sb_info *sbi, int use_reservation) + + free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); + root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count); +- if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) && ++ if (free_blocks < root_blocks + 1 && + !use_reservation && !uid_eq(sbi->s_resuid, current_fsuid()) && + (gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) || +- !in_group_p (sbi->s_resgid))) { ++ !in_group_p (sbi->s_resgid)) && !capable_nolog(CAP_SYS_RESOURCE)) { + return 0; + } + return 1; +diff --git a/fs/ext3/super.c b/fs/ext3/super.c +index eb742d0..c19f705 100644 +--- a/fs/ext3/super.c ++++ b/fs/ext3/super.c +@@ -649,10 +649,8 @@ static int ext3_show_options(struct seq_file *seq, struct dentry *root) + #ifdef CONFIG_EXT3_FS_XATTR + if (test_opt(sb, XATTR_USER)) + seq_puts(seq, ",user_xattr"); +- if (!test_opt(sb, XATTR_USER) && +- (def_mount_opts & EXT3_DEFM_XATTR_USER)) { ++ if (!test_opt(sb, XATTR_USER)) + seq_puts(seq, ",nouser_xattr"); +- } + #endif + #ifdef CONFIG_EXT3_FS_POSIX_ACL + if (test_opt(sb, POSIX_ACL)) +@@ -1749,8 +1747,8 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) + if (def_mount_opts & EXT3_DEFM_UID16) + set_opt(sbi->s_mount_opt, NO_UID32); + #ifdef CONFIG_EXT3_FS_XATTR +- if (def_mount_opts & EXT3_DEFM_XATTR_USER) +- set_opt(sbi->s_mount_opt, XATTR_USER); ++ /* always enable user xattrs */ ++ set_opt(sbi->s_mount_opt, XATTR_USER); + #endif + #ifdef CONFIG_EXT3_FS_POSIX_ACL + if (def_mount_opts & EXT3_DEFM_ACL) +diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c +index c6874be..f8a6ae8 100644 +--- a/fs/ext3/xattr.c ++++ b/fs/ext3/xattr.c +@@ -330,7 +330,7 @@ static int + ext3_xattr_list_entries(struct dentry *dentry, struct ext3_xattr_entry *entry, + char *buffer, size_t buffer_size) + { +- size_t rest = buffer_size; ++ size_t rest = buffer_size, total_size = 0; + + for (; !IS_LAST_ENTRY(entry); entry = EXT3_XATTR_NEXT(entry)) { + const struct xattr_handler *handler = +@@ -347,9 +347,10 @@ ext3_xattr_list_entries(struct dentry *dentry, struct ext3_xattr_entry *entry, + buffer += size; + } + rest -= size; ++ total_size += size; + } + } +- return buffer_size - rest; ++ return total_size; + } + + static int +diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c +index 83a6f49..d4e4d03 100644 +--- a/fs/ext4/balloc.c ++++ b/fs/ext4/balloc.c +@@ -557,8 +557,8 @@ static int ext4_has_free_clusters(struct ext4_sb_info *sbi, + /* Hm, nope. Are (enough) root reserved clusters available? */ + if (uid_eq(sbi->s_resuid, current_fsuid()) || + (!gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) && in_group_p(sbi->s_resgid)) || +- capable(CAP_SYS_RESOURCE) || +- (flags & EXT4_MB_USE_ROOT_BLOCKS)) { ++ (flags & EXT4_MB_USE_ROOT_BLOCKS) || ++ capable_nolog(CAP_SYS_RESOURCE)) { + + if (free_clusters >= (nclusters + dirty_clusters + + resv_clusters)) +diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h +index c55a1fa..9904ebb 100644 +--- a/fs/ext4/ext4.h ++++ b/fs/ext4/ext4.h +@@ -1279,19 +1279,19 @@ struct ext4_sb_info { + unsigned long s_mb_last_start; + + /* stats for buddy allocator */ +- atomic_t s_bal_reqs; /* number of reqs with len > 1 */ +- atomic_t s_bal_success; /* we found long enough chunks */ +- atomic_t s_bal_allocated; /* in blocks */ +- atomic_t s_bal_ex_scanned; /* total extents scanned */ +- atomic_t s_bal_goals; /* goal hits */ +- atomic_t s_bal_breaks; /* too long searches */ +- atomic_t s_bal_2orders; /* 2^order hits */ ++ atomic_unchecked_t s_bal_reqs; /* number of reqs with len > 1 */ ++ atomic_unchecked_t s_bal_success; /* we found long enough chunks */ ++ atomic_unchecked_t s_bal_allocated; /* in blocks */ ++ atomic_unchecked_t s_bal_ex_scanned; /* total extents scanned */ ++ atomic_unchecked_t s_bal_goals; /* goal hits */ ++ atomic_unchecked_t s_bal_breaks; /* too long searches */ ++ atomic_unchecked_t s_bal_2orders; /* 2^order hits */ + spinlock_t s_bal_lock; + unsigned long s_mb_buddies_generated; + unsigned long long s_mb_generation_time; +- atomic_t s_mb_lost_chunks; +- atomic_t s_mb_preallocated; +- atomic_t s_mb_discarded; ++ atomic_unchecked_t s_mb_lost_chunks; ++ atomic_unchecked_t s_mb_preallocated; ++ atomic_unchecked_t s_mb_discarded; + atomic_t s_lock_busy; + + /* locality groups */ +diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c +index dbfe15c..9a6ee8d 100644 +--- a/fs/ext4/mballoc.c ++++ b/fs/ext4/mballoc.c +@@ -1901,7 +1901,7 @@ void ext4_mb_simple_scan_group(struct ext4_allocation_context *ac, + BUG_ON(ac->ac_b_ex.fe_len != ac->ac_g_ex.fe_len); + + if (EXT4_SB(sb)->s_mb_stats) +- atomic_inc(&EXT4_SB(sb)->s_bal_2orders); ++ atomic_inc_unchecked(&EXT4_SB(sb)->s_bal_2orders); + + break; + } +@@ -2211,7 +2211,7 @@ repeat: + ac->ac_status = AC_STATUS_CONTINUE; + ac->ac_flags |= EXT4_MB_HINT_FIRST; + cr = 3; +- atomic_inc(&sbi->s_mb_lost_chunks); ++ atomic_inc_unchecked(&sbi->s_mb_lost_chunks); + goto repeat; + } + } +@@ -2717,25 +2717,25 @@ int ext4_mb_release(struct super_block *sb) + if (sbi->s_mb_stats) { + ext4_msg(sb, KERN_INFO, + "mballoc: %u blocks %u reqs (%u success)", +- atomic_read(&sbi->s_bal_allocated), +- atomic_read(&sbi->s_bal_reqs), +- atomic_read(&sbi->s_bal_success)); ++ atomic_read_unchecked(&sbi->s_bal_allocated), ++ atomic_read_unchecked(&sbi->s_bal_reqs), ++ atomic_read_unchecked(&sbi->s_bal_success)); + ext4_msg(sb, KERN_INFO, + "mballoc: %u extents scanned, %u goal hits, " + "%u 2^N hits, %u breaks, %u lost", +- atomic_read(&sbi->s_bal_ex_scanned), +- atomic_read(&sbi->s_bal_goals), +- atomic_read(&sbi->s_bal_2orders), +- atomic_read(&sbi->s_bal_breaks), +- atomic_read(&sbi->s_mb_lost_chunks)); ++ atomic_read_unchecked(&sbi->s_bal_ex_scanned), ++ atomic_read_unchecked(&sbi->s_bal_goals), ++ atomic_read_unchecked(&sbi->s_bal_2orders), ++ atomic_read_unchecked(&sbi->s_bal_breaks), ++ atomic_read_unchecked(&sbi->s_mb_lost_chunks)); + ext4_msg(sb, KERN_INFO, + "mballoc: %lu generated and it took %Lu", + sbi->s_mb_buddies_generated, + sbi->s_mb_generation_time); + ext4_msg(sb, KERN_INFO, + "mballoc: %u preallocated, %u discarded", +- atomic_read(&sbi->s_mb_preallocated), +- atomic_read(&sbi->s_mb_discarded)); ++ atomic_read_unchecked(&sbi->s_mb_preallocated), ++ atomic_read_unchecked(&sbi->s_mb_discarded)); + } + + free_percpu(sbi->s_locality_groups); +@@ -3191,16 +3191,16 @@ static void ext4_mb_collect_stats(struct ext4_allocation_context *ac) + struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb); + + if (sbi->s_mb_stats && ac->ac_g_ex.fe_len > 1) { +- atomic_inc(&sbi->s_bal_reqs); +- atomic_add(ac->ac_b_ex.fe_len, &sbi->s_bal_allocated); ++ atomic_inc_unchecked(&sbi->s_bal_reqs); ++ atomic_add_unchecked(ac->ac_b_ex.fe_len, &sbi->s_bal_allocated); + if (ac->ac_b_ex.fe_len >= ac->ac_o_ex.fe_len) +- atomic_inc(&sbi->s_bal_success); +- atomic_add(ac->ac_found, &sbi->s_bal_ex_scanned); ++ atomic_inc_unchecked(&sbi->s_bal_success); ++ atomic_add_unchecked(ac->ac_found, &sbi->s_bal_ex_scanned); + if (ac->ac_g_ex.fe_start == ac->ac_b_ex.fe_start && + ac->ac_g_ex.fe_group == ac->ac_b_ex.fe_group) +- atomic_inc(&sbi->s_bal_goals); ++ atomic_inc_unchecked(&sbi->s_bal_goals); + if (ac->ac_found > sbi->s_mb_max_to_scan) +- atomic_inc(&sbi->s_bal_breaks); ++ atomic_inc_unchecked(&sbi->s_bal_breaks); + } + + if (ac->ac_op == EXT4_MB_HISTORY_ALLOC) +@@ -3627,7 +3627,7 @@ ext4_mb_new_inode_pa(struct ext4_allocation_context *ac) + trace_ext4_mb_new_inode_pa(ac, pa); + + ext4_mb_use_inode_pa(ac, pa); +- atomic_add(pa->pa_free, &sbi->s_mb_preallocated); ++ atomic_add_unchecked(pa->pa_free, &sbi->s_mb_preallocated); + + ei = EXT4_I(ac->ac_inode); + grp = ext4_get_group_info(sb, ac->ac_b_ex.fe_group); +@@ -3687,7 +3687,7 @@ ext4_mb_new_group_pa(struct ext4_allocation_context *ac) + trace_ext4_mb_new_group_pa(ac, pa); + + ext4_mb_use_group_pa(ac, pa); +- atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); ++ atomic_add_unchecked(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated); + + grp = ext4_get_group_info(sb, ac->ac_b_ex.fe_group); + lg = ac->ac_lg; +@@ -3776,7 +3776,7 @@ ext4_mb_release_inode_pa(struct ext4_buddy *e4b, struct buffer_head *bitmap_bh, + * from the bitmap and continue. + */ + } +- atomic_add(free, &sbi->s_mb_discarded); ++ atomic_add_unchecked(free, &sbi->s_mb_discarded); + + return err; + } +@@ -3794,7 +3794,7 @@ ext4_mb_release_group_pa(struct ext4_buddy *e4b, + ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit); + BUG_ON(group != e4b->bd_group && pa->pa_len != 0); + mb_free_blocks(pa->pa_inode, e4b, bit, pa->pa_len); +- atomic_add(pa->pa_len, &EXT4_SB(sb)->s_mb_discarded); ++ atomic_add_unchecked(pa->pa_len, &EXT4_SB(sb)->s_mb_discarded); + trace_ext4_mballoc_discard(sb, NULL, group, bit, pa->pa_len); + + return 0; +diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c +index 8313ca3..8a37d08 100644 +--- a/fs/ext4/mmp.c ++++ b/fs/ext4/mmp.c +@@ -111,7 +111,7 @@ static int read_mmp_block(struct super_block *sb, struct buffer_head **bh, + void __dump_mmp_msg(struct super_block *sb, struct mmp_struct *mmp, + const char *function, unsigned int line, const char *msg) + { +- __ext4_warning(sb, function, line, msg); ++ __ext4_warning(sb, function, line, "%s", msg); + __ext4_warning(sb, function, line, + "MMP failure info: last update time: %llu, last update " + "node: %s, last update device: %s\n", +diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c +index ca45883..0999029 100644 +--- a/fs/ext4/resize.c ++++ b/fs/ext4/resize.c +@@ -401,7 +401,7 @@ static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle, + + ext4_debug("mark blocks [%llu/%u] used\n", block, count); + for (count2 = count; count > 0; count -= count2, block += count2) { +- ext4_fsblk_t start; ++ ext4_fsblk_t start, diff; + struct buffer_head *bh; + ext4_group_t group; + int err; +@@ -410,10 +410,6 @@ static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle, + start = ext4_group_first_block_no(sb, group); + group -= flex_gd->groups[0].group; + +- count2 = EXT4_BLOCKS_PER_GROUP(sb) - (block - start); +- if (count2 > count) +- count2 = count; +- + if (flex_gd->bg_flags[group] & EXT4_BG_BLOCK_UNINIT) { + BUG_ON(flex_gd->count > 1); + continue; +@@ -431,9 +427,15 @@ static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle, + err = ext4_journal_get_write_access(handle, bh); + if (err) + return err; ++ ++ diff = block - start; ++ count2 = EXT4_BLOCKS_PER_GROUP(sb) - diff; ++ if (count2 > count) ++ count2 = count; ++ + ext4_debug("mark block bitmap %#04llx (+%llu/%u)\n", block, +- block - start, count2); +- ext4_set_bits(bh->b_data, block - start, count2); ++ diff, count2); ++ ext4_set_bits(bh->b_data, diff, count2); + + err = ext4_handle_dirty_metadata(handle, NULL, bh); + if (unlikely(err)) +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index fc7391e..1927b04 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -1254,7 +1254,7 @@ static ext4_fsblk_t get_sb_block(void **data) + } + + #define DEFAULT_JOURNAL_IOPRIO (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 3)) +-static char deprecated_msg[] = "Mount option \"%s\" will be removed by %s\n" ++static const char deprecated_msg[] = "Mount option \"%s\" will be removed by %s\n" + "Contact linux-ext4@vger.kernel.org if you think we should keep it.\n"; + + #ifdef CONFIG_QUOTA +@@ -2434,7 +2434,7 @@ struct ext4_attr { + int offset; + int deprecated_val; + } u; +-}; ++} __do_const; + + static int parse_strtoull(const char *buf, + unsigned long long max, unsigned long long *value) +diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c +index 1e09fc7..0400dd4 100644 +--- a/fs/ext4/xattr.c ++++ b/fs/ext4/xattr.c +@@ -399,7 +399,7 @@ static int + ext4_xattr_list_entries(struct dentry *dentry, struct ext4_xattr_entry *entry, + char *buffer, size_t buffer_size) + { +- size_t rest = buffer_size; ++ size_t rest = buffer_size, total_size = 0; + + for (; !IS_LAST_ENTRY(entry); entry = EXT4_XATTR_NEXT(entry)) { + const struct xattr_handler *handler = +@@ -416,9 +416,10 @@ ext4_xattr_list_entries(struct dentry *dentry, struct ext4_xattr_entry *entry, + buffer += size; + } + rest -= size; ++ total_size += size; + } + } +- return buffer_size - rest; ++ return total_size; + } + + static int +diff --git a/fs/fcntl.c b/fs/fcntl.c +index 99d440a..eb979d1 100644 +--- a/fs/fcntl.c ++++ b/fs/fcntl.c +@@ -102,6 +102,10 @@ void __f_setown(struct file *filp, struct pid *pid, enum pid_type type, + int force) + { + security_file_set_fowner(filp); ++ if (gr_handle_chroot_fowner(pid, type)) ++ return; ++ if (gr_check_protected_task_fowner(pid, type)) ++ return; + f_modown(filp, pid, type, force); + } + EXPORT_SYMBOL(__f_setown); +diff --git a/fs/fhandle.c b/fs/fhandle.c +index 999ff5c..2281df9 100644 +--- a/fs/fhandle.c ++++ b/fs/fhandle.c +@@ -8,6 +8,7 @@ + #include <linux/fs_struct.h> + #include <linux/fsnotify.h> + #include <linux/personality.h> ++#include <linux/grsecurity.h> + #include <asm/uaccess.h> + #include "internal.h" + #include "mount.h" +@@ -67,8 +68,7 @@ static long do_sys_name_to_handle(struct path *path, + } else + retval = 0; + /* copy the mount id */ +- if (copy_to_user(mnt_id, &real_mount(path->mnt)->mnt_id, +- sizeof(*mnt_id)) || ++ if (put_user(real_mount(path->mnt)->mnt_id, mnt_id) || + copy_to_user(ufh, handle, + sizeof(struct file_handle) + handle_bytes)) + retval = -EFAULT; +@@ -175,7 +175,7 @@ static int handle_to_path(int mountdirfd, struct file_handle __user *ufh, + * the directory. Ideally we would like CAP_DAC_SEARCH. + * But we don't have that + */ +- if (!capable(CAP_DAC_READ_SEARCH)) { ++ if (!capable(CAP_DAC_READ_SEARCH) || !gr_chroot_fhandle()) { + retval = -EPERM; + goto out_err; + } +@@ -195,8 +195,9 @@ static int handle_to_path(int mountdirfd, struct file_handle __user *ufh, + goto out_err; + } + /* copy the full handle */ +- if (copy_from_user(handle, ufh, +- sizeof(struct file_handle) + ++ *handle = f_handle; ++ if (copy_from_user(&handle->f_handle, ++ &ufh->f_handle, + f_handle.handle_bytes)) { + retval = -EFAULT; + goto out_handle; +diff --git a/fs/file.c b/fs/file.c +index ab3eb6a..8de2392 100644 +--- a/fs/file.c ++++ b/fs/file.c +@@ -16,6 +16,7 @@ + #include <linux/slab.h> + #include <linux/vmalloc.h> + #include <linux/file.h> ++#include <linux/security.h> + #include <linux/fdtable.h> + #include <linux/bitops.h> + #include <linux/interrupt.h> +@@ -139,7 +140,7 @@ out: + * Return <0 error code on error; 1 on successful completion. + * The files->file_lock should be held on entry, and will be held on exit. + */ +-static int expand_fdtable(struct files_struct *files, int nr) ++static int expand_fdtable(struct files_struct *files, unsigned int nr) + __releases(files->file_lock) + __acquires(files->file_lock) + { +@@ -184,7 +185,7 @@ static int expand_fdtable(struct files_struct *files, int nr) + * expanded and execution may have blocked. + * The files->file_lock should be held on entry, and will be held on exit. + */ +-static int expand_files(struct files_struct *files, int nr) ++static int expand_files(struct files_struct *files, unsigned int nr) + { + struct fdtable *fdt; + +@@ -800,6 +801,7 @@ int replace_fd(unsigned fd, struct file *file, unsigned flags) + if (!file) + return __close_fd(files, fd); + ++ gr_learn_resource(current, RLIMIT_NOFILE, fd, 0); + if (fd >= rlimit(RLIMIT_NOFILE)) + return -EBADF; + +@@ -826,6 +828,7 @@ SYSCALL_DEFINE3(dup3, unsigned int, oldfd, unsigned int, newfd, int, flags) + if (unlikely(oldfd == newfd)) + return -EINVAL; + ++ gr_learn_resource(current, RLIMIT_NOFILE, newfd, 0); + if (newfd >= rlimit(RLIMIT_NOFILE)) + return -EBADF; + +@@ -881,6 +884,7 @@ SYSCALL_DEFINE1(dup, unsigned int, fildes) + int f_dupfd(unsigned int from, struct file *file, unsigned flags) + { + int err; ++ gr_learn_resource(current, RLIMIT_NOFILE, from, 0); + if (from >= rlimit(RLIMIT_NOFILE)) + return -EINVAL; + err = alloc_fd(from, flags); +diff --git a/fs/filesystems.c b/fs/filesystems.c +index 5797d45..7d7d79a 100644 +--- a/fs/filesystems.c ++++ b/fs/filesystems.c +@@ -275,7 +275,11 @@ struct file_system_type *get_fs_type(const char *name) + int len = dot ? dot - name : strlen(name); + + fs = __get_fs_type(name, len); ++#ifdef CONFIG_GRKERNSEC_MODHARDEN ++ if (!fs && (___request_module(true, "grsec_modharden_fs", "fs-%.*s", len, name) == 0)) ++#else + if (!fs && (request_module("fs-%.*s", len, name) == 0)) ++#endif + fs = __get_fs_type(name, len); + + if (dot && fs && !(fs->fs_flags & FS_HAS_SUBTYPE)) { +diff --git a/fs/fs_struct.c b/fs/fs_struct.c +index 7dca743..1ff87ae 100644 +--- a/fs/fs_struct.c ++++ b/fs/fs_struct.c +@@ -4,6 +4,7 @@ + #include <linux/path.h> + #include <linux/slab.h> + #include <linux/fs_struct.h> ++#include <linux/grsecurity.h> + #include "internal.h" + + /* +@@ -15,14 +16,18 @@ void set_fs_root(struct fs_struct *fs, const struct path *path) + struct path old_root; + + path_get(path); ++ gr_inc_chroot_refcnts(path->dentry, path->mnt); + spin_lock(&fs->lock); + write_seqcount_begin(&fs->seq); + old_root = fs->root; + fs->root = *path; ++ gr_set_chroot_entries(current, path); + write_seqcount_end(&fs->seq); + spin_unlock(&fs->lock); +- if (old_root.dentry) ++ if (old_root.dentry) { ++ gr_dec_chroot_refcnts(old_root.dentry, old_root.mnt); + path_put(&old_root); ++ } + } + + /* +@@ -67,6 +72,10 @@ void chroot_fs_refs(const struct path *old_root, const struct path *new_root) + int hits = 0; + spin_lock(&fs->lock); + write_seqcount_begin(&fs->seq); ++ /* this root replacement is only done by pivot_root, ++ leave grsec's chroot tagging alone for this task ++ so that a pivoted root isn't treated as a chroot ++ */ + hits += replace_path(&fs->root, old_root, new_root); + hits += replace_path(&fs->pwd, old_root, new_root); + write_seqcount_end(&fs->seq); +@@ -85,6 +94,7 @@ void chroot_fs_refs(const struct path *old_root, const struct path *new_root) + + void free_fs_struct(struct fs_struct *fs) + { ++ gr_dec_chroot_refcnts(fs->root.dentry, fs->root.mnt); + path_put(&fs->root); + path_put(&fs->pwd); + kmem_cache_free(fs_cachep, fs); +@@ -99,7 +109,8 @@ void exit_fs(struct task_struct *tsk) + task_lock(tsk); + spin_lock(&fs->lock); + tsk->fs = NULL; +- kill = !--fs->users; ++ gr_clear_chroot_entries(tsk); ++ kill = !atomic_dec_return(&fs->users); + spin_unlock(&fs->lock); + task_unlock(tsk); + if (kill) +@@ -112,7 +123,7 @@ struct fs_struct *copy_fs_struct(struct fs_struct *old) + struct fs_struct *fs = kmem_cache_alloc(fs_cachep, GFP_KERNEL); + /* We don't need to lock fs - think why ;-) */ + if (fs) { +- fs->users = 1; ++ atomic_set(&fs->users, 1); + fs->in_exec = 0; + spin_lock_init(&fs->lock); + seqcount_init(&fs->seq); +@@ -121,9 +132,13 @@ struct fs_struct *copy_fs_struct(struct fs_struct *old) + spin_lock(&old->lock); + fs->root = old->root; + path_get(&fs->root); ++ /* instead of calling gr_set_chroot_entries here, ++ we call it from every caller of this function ++ */ + fs->pwd = old->pwd; + path_get(&fs->pwd); + spin_unlock(&old->lock); ++ gr_inc_chroot_refcnts(fs->root.dentry, fs->root.mnt); + } + return fs; + } +@@ -139,8 +154,9 @@ int unshare_fs_struct(void) + + task_lock(current); + spin_lock(&fs->lock); +- kill = !--fs->users; ++ kill = !atomic_dec_return(&fs->users); + current->fs = new_fs; ++ gr_set_chroot_entries(current, &new_fs->root); + spin_unlock(&fs->lock); + task_unlock(current); + +@@ -153,13 +169,13 @@ EXPORT_SYMBOL_GPL(unshare_fs_struct); + + int current_umask(void) + { +- return current->fs->umask; ++ return current->fs->umask | gr_acl_umask(); + } + EXPORT_SYMBOL(current_umask); + + /* to be mentioned only in INIT_TASK */ + struct fs_struct init_fs = { +- .users = 1, ++ .users = ATOMIC_INIT(1), + .lock = __SPIN_LOCK_UNLOCKED(init_fs.lock), + .seq = SEQCNT_ZERO(init_fs.seq), + .umask = 0022, +diff --git a/fs/fscache/cookie.c b/fs/fscache/cookie.c +index 89acec7..a575262 100644 +--- a/fs/fscache/cookie.c ++++ b/fs/fscache/cookie.c +@@ -19,7 +19,7 @@ + + struct kmem_cache *fscache_cookie_jar; + +-static atomic_t fscache_object_debug_id = ATOMIC_INIT(0); ++static atomic_unchecked_t fscache_object_debug_id = ATOMIC_INIT(0); + + static int fscache_acquire_non_index_cookie(struct fscache_cookie *cookie); + static int fscache_alloc_object(struct fscache_cache *cache, +@@ -69,11 +69,11 @@ struct fscache_cookie *__fscache_acquire_cookie( + parent ? (char *) parent->def->name : "<no-parent>", + def->name, netfs_data, enable); + +- fscache_stat(&fscache_n_acquires); ++ fscache_stat_unchecked(&fscache_n_acquires); + + /* if there's no parent cookie, then we don't create one here either */ + if (!parent) { +- fscache_stat(&fscache_n_acquires_null); ++ fscache_stat_unchecked(&fscache_n_acquires_null); + _leave(" [no parent]"); + return NULL; + } +@@ -88,7 +88,7 @@ struct fscache_cookie *__fscache_acquire_cookie( + /* allocate and initialise a cookie */ + cookie = kmem_cache_alloc(fscache_cookie_jar, GFP_KERNEL); + if (!cookie) { +- fscache_stat(&fscache_n_acquires_oom); ++ fscache_stat_unchecked(&fscache_n_acquires_oom); + _leave(" [ENOMEM]"); + return NULL; + } +@@ -115,13 +115,13 @@ struct fscache_cookie *__fscache_acquire_cookie( + + switch (cookie->def->type) { + case FSCACHE_COOKIE_TYPE_INDEX: +- fscache_stat(&fscache_n_cookie_index); ++ fscache_stat_unchecked(&fscache_n_cookie_index); + break; + case FSCACHE_COOKIE_TYPE_DATAFILE: +- fscache_stat(&fscache_n_cookie_data); ++ fscache_stat_unchecked(&fscache_n_cookie_data); + break; + default: +- fscache_stat(&fscache_n_cookie_special); ++ fscache_stat_unchecked(&fscache_n_cookie_special); + break; + } + +@@ -135,7 +135,7 @@ struct fscache_cookie *__fscache_acquire_cookie( + } else { + atomic_dec(&parent->n_children); + __fscache_cookie_put(cookie); +- fscache_stat(&fscache_n_acquires_nobufs); ++ fscache_stat_unchecked(&fscache_n_acquires_nobufs); + _leave(" = NULL"); + return NULL; + } +@@ -144,7 +144,7 @@ struct fscache_cookie *__fscache_acquire_cookie( + } + } + +- fscache_stat(&fscache_n_acquires_ok); ++ fscache_stat_unchecked(&fscache_n_acquires_ok); + _leave(" = %p", cookie); + return cookie; + } +@@ -213,7 +213,7 @@ static int fscache_acquire_non_index_cookie(struct fscache_cookie *cookie) + cache = fscache_select_cache_for_object(cookie->parent); + if (!cache) { + up_read(&fscache_addremove_sem); +- fscache_stat(&fscache_n_acquires_no_cache); ++ fscache_stat_unchecked(&fscache_n_acquires_no_cache); + _leave(" = -ENOMEDIUM [no cache]"); + return -ENOMEDIUM; + } +@@ -297,14 +297,14 @@ static int fscache_alloc_object(struct fscache_cache *cache, + object = cache->ops->alloc_object(cache, cookie); + fscache_stat_d(&fscache_n_cop_alloc_object); + if (IS_ERR(object)) { +- fscache_stat(&fscache_n_object_no_alloc); ++ fscache_stat_unchecked(&fscache_n_object_no_alloc); + ret = PTR_ERR(object); + goto error; + } + +- fscache_stat(&fscache_n_object_alloc); ++ fscache_stat_unchecked(&fscache_n_object_alloc); + +- object->debug_id = atomic_inc_return(&fscache_object_debug_id); ++ object->debug_id = atomic_inc_return_unchecked(&fscache_object_debug_id); + + _debug("ALLOC OBJ%x: %s {%lx}", + object->debug_id, cookie->def->name, object->events); +@@ -418,7 +418,7 @@ void __fscache_invalidate(struct fscache_cookie *cookie) + + _enter("{%s}", cookie->def->name); + +- fscache_stat(&fscache_n_invalidates); ++ fscache_stat_unchecked(&fscache_n_invalidates); + + /* Only permit invalidation of data files. Invalidating an index will + * require the caller to release all its attachments to the tree rooted +@@ -476,10 +476,10 @@ void __fscache_update_cookie(struct fscache_cookie *cookie) + { + struct fscache_object *object; + +- fscache_stat(&fscache_n_updates); ++ fscache_stat_unchecked(&fscache_n_updates); + + if (!cookie) { +- fscache_stat(&fscache_n_updates_null); ++ fscache_stat_unchecked(&fscache_n_updates_null); + _leave(" [no cookie]"); + return; + } +@@ -580,12 +580,12 @@ EXPORT_SYMBOL(__fscache_disable_cookie); + */ + void __fscache_relinquish_cookie(struct fscache_cookie *cookie, bool retire) + { +- fscache_stat(&fscache_n_relinquishes); ++ fscache_stat_unchecked(&fscache_n_relinquishes); + if (retire) +- fscache_stat(&fscache_n_relinquishes_retire); ++ fscache_stat_unchecked(&fscache_n_relinquishes_retire); + + if (!cookie) { +- fscache_stat(&fscache_n_relinquishes_null); ++ fscache_stat_unchecked(&fscache_n_relinquishes_null); + _leave(" [no cookie]"); + return; + } +@@ -686,7 +686,7 @@ int __fscache_check_consistency(struct fscache_cookie *cookie) + if (test_bit(FSCACHE_IOERROR, &object->cache->flags)) + goto inconsistent; + +- op->debug_id = atomic_inc_return(&fscache_op_debug_id); ++ op->debug_id = atomic_inc_return_unchecked(&fscache_op_debug_id); + + __fscache_use_cookie(cookie); + if (fscache_submit_op(object, op) < 0) +diff --git a/fs/fscache/internal.h b/fs/fscache/internal.h +index 7872a62..d91b19f 100644 +--- a/fs/fscache/internal.h ++++ b/fs/fscache/internal.h +@@ -137,8 +137,8 @@ extern void fscache_operation_gc(struct work_struct *); + extern int fscache_wait_for_deferred_lookup(struct fscache_cookie *); + extern int fscache_wait_for_operation_activation(struct fscache_object *, + struct fscache_operation *, +- atomic_t *, +- atomic_t *, ++ atomic_unchecked_t *, ++ atomic_unchecked_t *, + void (*)(struct fscache_operation *)); + extern void fscache_invalidate_writes(struct fscache_cookie *); + +@@ -157,101 +157,101 @@ extern void fscache_proc_cleanup(void); + * stats.c + */ + #ifdef CONFIG_FSCACHE_STATS +-extern atomic_t fscache_n_ops_processed[FSCACHE_MAX_THREADS]; +-extern atomic_t fscache_n_objs_processed[FSCACHE_MAX_THREADS]; +- +-extern atomic_t fscache_n_op_pend; +-extern atomic_t fscache_n_op_run; +-extern atomic_t fscache_n_op_enqueue; +-extern atomic_t fscache_n_op_deferred_release; +-extern atomic_t fscache_n_op_release; +-extern atomic_t fscache_n_op_gc; +-extern atomic_t fscache_n_op_cancelled; +-extern atomic_t fscache_n_op_rejected; +- +-extern atomic_t fscache_n_attr_changed; +-extern atomic_t fscache_n_attr_changed_ok; +-extern atomic_t fscache_n_attr_changed_nobufs; +-extern atomic_t fscache_n_attr_changed_nomem; +-extern atomic_t fscache_n_attr_changed_calls; +- +-extern atomic_t fscache_n_allocs; +-extern atomic_t fscache_n_allocs_ok; +-extern atomic_t fscache_n_allocs_wait; +-extern atomic_t fscache_n_allocs_nobufs; +-extern atomic_t fscache_n_allocs_intr; +-extern atomic_t fscache_n_allocs_object_dead; +-extern atomic_t fscache_n_alloc_ops; +-extern atomic_t fscache_n_alloc_op_waits; +- +-extern atomic_t fscache_n_retrievals; +-extern atomic_t fscache_n_retrievals_ok; +-extern atomic_t fscache_n_retrievals_wait; +-extern atomic_t fscache_n_retrievals_nodata; +-extern atomic_t fscache_n_retrievals_nobufs; +-extern atomic_t fscache_n_retrievals_intr; +-extern atomic_t fscache_n_retrievals_nomem; +-extern atomic_t fscache_n_retrievals_object_dead; +-extern atomic_t fscache_n_retrieval_ops; +-extern atomic_t fscache_n_retrieval_op_waits; +- +-extern atomic_t fscache_n_stores; +-extern atomic_t fscache_n_stores_ok; +-extern atomic_t fscache_n_stores_again; +-extern atomic_t fscache_n_stores_nobufs; +-extern atomic_t fscache_n_stores_oom; +-extern atomic_t fscache_n_store_ops; +-extern atomic_t fscache_n_store_calls; +-extern atomic_t fscache_n_store_pages; +-extern atomic_t fscache_n_store_radix_deletes; +-extern atomic_t fscache_n_store_pages_over_limit; +- +-extern atomic_t fscache_n_store_vmscan_not_storing; +-extern atomic_t fscache_n_store_vmscan_gone; +-extern atomic_t fscache_n_store_vmscan_busy; +-extern atomic_t fscache_n_store_vmscan_cancelled; +-extern atomic_t fscache_n_store_vmscan_wait; +- +-extern atomic_t fscache_n_marks; +-extern atomic_t fscache_n_uncaches; +- +-extern atomic_t fscache_n_acquires; +-extern atomic_t fscache_n_acquires_null; +-extern atomic_t fscache_n_acquires_no_cache; +-extern atomic_t fscache_n_acquires_ok; +-extern atomic_t fscache_n_acquires_nobufs; +-extern atomic_t fscache_n_acquires_oom; +- +-extern atomic_t fscache_n_invalidates; +-extern atomic_t fscache_n_invalidates_run; +- +-extern atomic_t fscache_n_updates; +-extern atomic_t fscache_n_updates_null; +-extern atomic_t fscache_n_updates_run; +- +-extern atomic_t fscache_n_relinquishes; +-extern atomic_t fscache_n_relinquishes_null; +-extern atomic_t fscache_n_relinquishes_waitcrt; +-extern atomic_t fscache_n_relinquishes_retire; +- +-extern atomic_t fscache_n_cookie_index; +-extern atomic_t fscache_n_cookie_data; +-extern atomic_t fscache_n_cookie_special; +- +-extern atomic_t fscache_n_object_alloc; +-extern atomic_t fscache_n_object_no_alloc; +-extern atomic_t fscache_n_object_lookups; +-extern atomic_t fscache_n_object_lookups_negative; +-extern atomic_t fscache_n_object_lookups_positive; +-extern atomic_t fscache_n_object_lookups_timed_out; +-extern atomic_t fscache_n_object_created; +-extern atomic_t fscache_n_object_avail; +-extern atomic_t fscache_n_object_dead; +- +-extern atomic_t fscache_n_checkaux_none; +-extern atomic_t fscache_n_checkaux_okay; +-extern atomic_t fscache_n_checkaux_update; +-extern atomic_t fscache_n_checkaux_obsolete; ++extern atomic_unchecked_t fscache_n_ops_processed[FSCACHE_MAX_THREADS]; ++extern atomic_unchecked_t fscache_n_objs_processed[FSCACHE_MAX_THREADS]; ++ ++extern atomic_unchecked_t fscache_n_op_pend; ++extern atomic_unchecked_t fscache_n_op_run; ++extern atomic_unchecked_t fscache_n_op_enqueue; ++extern atomic_unchecked_t fscache_n_op_deferred_release; ++extern atomic_unchecked_t fscache_n_op_release; ++extern atomic_unchecked_t fscache_n_op_gc; ++extern atomic_unchecked_t fscache_n_op_cancelled; ++extern atomic_unchecked_t fscache_n_op_rejected; ++ ++extern atomic_unchecked_t fscache_n_attr_changed; ++extern atomic_unchecked_t fscache_n_attr_changed_ok; ++extern atomic_unchecked_t fscache_n_attr_changed_nobufs; ++extern atomic_unchecked_t fscache_n_attr_changed_nomem; ++extern atomic_unchecked_t fscache_n_attr_changed_calls; ++ ++extern atomic_unchecked_t fscache_n_allocs; ++extern atomic_unchecked_t fscache_n_allocs_ok; ++extern atomic_unchecked_t fscache_n_allocs_wait; ++extern atomic_unchecked_t fscache_n_allocs_nobufs; ++extern atomic_unchecked_t fscache_n_allocs_intr; ++extern atomic_unchecked_t fscache_n_allocs_object_dead; ++extern atomic_unchecked_t fscache_n_alloc_ops; ++extern atomic_unchecked_t fscache_n_alloc_op_waits; ++ ++extern atomic_unchecked_t fscache_n_retrievals; ++extern atomic_unchecked_t fscache_n_retrievals_ok; ++extern atomic_unchecked_t fscache_n_retrievals_wait; ++extern atomic_unchecked_t fscache_n_retrievals_nodata; ++extern atomic_unchecked_t fscache_n_retrievals_nobufs; ++extern atomic_unchecked_t fscache_n_retrievals_intr; ++extern atomic_unchecked_t fscache_n_retrievals_nomem; ++extern atomic_unchecked_t fscache_n_retrievals_object_dead; ++extern atomic_unchecked_t fscache_n_retrieval_ops; ++extern atomic_unchecked_t fscache_n_retrieval_op_waits; ++ ++extern atomic_unchecked_t fscache_n_stores; ++extern atomic_unchecked_t fscache_n_stores_ok; ++extern atomic_unchecked_t fscache_n_stores_again; ++extern atomic_unchecked_t fscache_n_stores_nobufs; ++extern atomic_unchecked_t fscache_n_stores_oom; ++extern atomic_unchecked_t fscache_n_store_ops; ++extern atomic_unchecked_t fscache_n_store_calls; ++extern atomic_unchecked_t fscache_n_store_pages; ++extern atomic_unchecked_t fscache_n_store_radix_deletes; ++extern atomic_unchecked_t fscache_n_store_pages_over_limit; ++ ++extern atomic_unchecked_t fscache_n_store_vmscan_not_storing; ++extern atomic_unchecked_t fscache_n_store_vmscan_gone; ++extern atomic_unchecked_t fscache_n_store_vmscan_busy; ++extern atomic_unchecked_t fscache_n_store_vmscan_cancelled; ++extern atomic_unchecked_t fscache_n_store_vmscan_wait; ++ ++extern atomic_unchecked_t fscache_n_marks; ++extern atomic_unchecked_t fscache_n_uncaches; ++ ++extern atomic_unchecked_t fscache_n_acquires; ++extern atomic_unchecked_t fscache_n_acquires_null; ++extern atomic_unchecked_t fscache_n_acquires_no_cache; ++extern atomic_unchecked_t fscache_n_acquires_ok; ++extern atomic_unchecked_t fscache_n_acquires_nobufs; ++extern atomic_unchecked_t fscache_n_acquires_oom; ++ ++extern atomic_unchecked_t fscache_n_invalidates; ++extern atomic_unchecked_t fscache_n_invalidates_run; ++ ++extern atomic_unchecked_t fscache_n_updates; ++extern atomic_unchecked_t fscache_n_updates_null; ++extern atomic_unchecked_t fscache_n_updates_run; ++ ++extern atomic_unchecked_t fscache_n_relinquishes; ++extern atomic_unchecked_t fscache_n_relinquishes_null; ++extern atomic_unchecked_t fscache_n_relinquishes_waitcrt; ++extern atomic_unchecked_t fscache_n_relinquishes_retire; ++ ++extern atomic_unchecked_t fscache_n_cookie_index; ++extern atomic_unchecked_t fscache_n_cookie_data; ++extern atomic_unchecked_t fscache_n_cookie_special; ++ ++extern atomic_unchecked_t fscache_n_object_alloc; ++extern atomic_unchecked_t fscache_n_object_no_alloc; ++extern atomic_unchecked_t fscache_n_object_lookups; ++extern atomic_unchecked_t fscache_n_object_lookups_negative; ++extern atomic_unchecked_t fscache_n_object_lookups_positive; ++extern atomic_unchecked_t fscache_n_object_lookups_timed_out; ++extern atomic_unchecked_t fscache_n_object_created; ++extern atomic_unchecked_t fscache_n_object_avail; ++extern atomic_unchecked_t fscache_n_object_dead; ++ ++extern atomic_unchecked_t fscache_n_checkaux_none; ++extern atomic_unchecked_t fscache_n_checkaux_okay; ++extern atomic_unchecked_t fscache_n_checkaux_update; ++extern atomic_unchecked_t fscache_n_checkaux_obsolete; + + extern atomic_t fscache_n_cop_alloc_object; + extern atomic_t fscache_n_cop_lookup_object; +@@ -276,6 +276,11 @@ static inline void fscache_stat(atomic_t *stat) + atomic_inc(stat); + } + ++static inline void fscache_stat_unchecked(atomic_unchecked_t *stat) ++{ ++ atomic_inc_unchecked(stat); ++} ++ + static inline void fscache_stat_d(atomic_t *stat) + { + atomic_dec(stat); +@@ -288,6 +293,7 @@ extern const struct file_operations fscache_stats_fops; + + #define __fscache_stat(stat) (NULL) + #define fscache_stat(stat) do {} while (0) ++#define fscache_stat_unchecked(stat) do {} while (0) + #define fscache_stat_d(stat) do {} while (0) + #endif + +diff --git a/fs/fscache/object.c b/fs/fscache/object.c +index da032da..0076ce7 100644 +--- a/fs/fscache/object.c ++++ b/fs/fscache/object.c +@@ -454,7 +454,7 @@ static const struct fscache_state *fscache_look_up_object(struct fscache_object + _debug("LOOKUP \"%s\" in \"%s\"", + cookie->def->name, object->cache->tag->name); + +- fscache_stat(&fscache_n_object_lookups); ++ fscache_stat_unchecked(&fscache_n_object_lookups); + fscache_stat(&fscache_n_cop_lookup_object); + ret = object->cache->ops->lookup_object(object); + fscache_stat_d(&fscache_n_cop_lookup_object); +@@ -464,7 +464,7 @@ static const struct fscache_state *fscache_look_up_object(struct fscache_object + if (ret == -ETIMEDOUT) { + /* probably stuck behind another object, so move this one to + * the back of the queue */ +- fscache_stat(&fscache_n_object_lookups_timed_out); ++ fscache_stat_unchecked(&fscache_n_object_lookups_timed_out); + _leave(" [timeout]"); + return NO_TRANSIT; + } +@@ -492,7 +492,7 @@ void fscache_object_lookup_negative(struct fscache_object *object) + _enter("{OBJ%x,%s}", object->debug_id, object->state->name); + + if (!test_and_set_bit(FSCACHE_OBJECT_IS_LOOKED_UP, &object->flags)) { +- fscache_stat(&fscache_n_object_lookups_negative); ++ fscache_stat_unchecked(&fscache_n_object_lookups_negative); + + /* Allow write requests to begin stacking up and read requests to begin + * returning ENODATA. +@@ -527,7 +527,7 @@ void fscache_obtained_object(struct fscache_object *object) + /* if we were still looking up, then we must have a positive lookup + * result, in which case there may be data available */ + if (!test_and_set_bit(FSCACHE_OBJECT_IS_LOOKED_UP, &object->flags)) { +- fscache_stat(&fscache_n_object_lookups_positive); ++ fscache_stat_unchecked(&fscache_n_object_lookups_positive); + + /* We do (presumably) have data */ + clear_bit_unlock(FSCACHE_COOKIE_NO_DATA_YET, &cookie->flags); +@@ -539,7 +539,7 @@ void fscache_obtained_object(struct fscache_object *object) + clear_bit_unlock(FSCACHE_COOKIE_LOOKING_UP, &cookie->flags); + wake_up_bit(&cookie->flags, FSCACHE_COOKIE_LOOKING_UP); + } else { +- fscache_stat(&fscache_n_object_created); ++ fscache_stat_unchecked(&fscache_n_object_created); + } + + set_bit(FSCACHE_OBJECT_IS_AVAILABLE, &object->flags); +@@ -575,7 +575,7 @@ static const struct fscache_state *fscache_object_available(struct fscache_objec + fscache_stat_d(&fscache_n_cop_lookup_complete); + + fscache_hist(fscache_obj_instantiate_histogram, object->lookup_jif); +- fscache_stat(&fscache_n_object_avail); ++ fscache_stat_unchecked(&fscache_n_object_avail); + + _leave(""); + return transit_to(JUMPSTART_DEPS); +@@ -722,7 +722,7 @@ static const struct fscache_state *fscache_drop_object(struct fscache_object *ob + + /* this just shifts the object release to the work processor */ + fscache_put_object(object); +- fscache_stat(&fscache_n_object_dead); ++ fscache_stat_unchecked(&fscache_n_object_dead); + + _leave(""); + return transit_to(OBJECT_DEAD); +@@ -887,7 +887,7 @@ enum fscache_checkaux fscache_check_aux(struct fscache_object *object, + enum fscache_checkaux result; + + if (!object->cookie->def->check_aux) { +- fscache_stat(&fscache_n_checkaux_none); ++ fscache_stat_unchecked(&fscache_n_checkaux_none); + return FSCACHE_CHECKAUX_OKAY; + } + +@@ -896,17 +896,17 @@ enum fscache_checkaux fscache_check_aux(struct fscache_object *object, + switch (result) { + /* entry okay as is */ + case FSCACHE_CHECKAUX_OKAY: +- fscache_stat(&fscache_n_checkaux_okay); ++ fscache_stat_unchecked(&fscache_n_checkaux_okay); + break; + + /* entry requires update */ + case FSCACHE_CHECKAUX_NEEDS_UPDATE: +- fscache_stat(&fscache_n_checkaux_update); ++ fscache_stat_unchecked(&fscache_n_checkaux_update); + break; + + /* entry requires deletion */ + case FSCACHE_CHECKAUX_OBSOLETE: +- fscache_stat(&fscache_n_checkaux_obsolete); ++ fscache_stat_unchecked(&fscache_n_checkaux_obsolete); + break; + + default: +@@ -993,7 +993,7 @@ static const struct fscache_state *fscache_invalidate_object(struct fscache_obje + { + const struct fscache_state *s; + +- fscache_stat(&fscache_n_invalidates_run); ++ fscache_stat_unchecked(&fscache_n_invalidates_run); + fscache_stat(&fscache_n_cop_invalidate_object); + s = _fscache_invalidate_object(object, event); + fscache_stat_d(&fscache_n_cop_invalidate_object); +@@ -1008,7 +1008,7 @@ static const struct fscache_state *fscache_update_object(struct fscache_object * + { + _enter("{OBJ%x},%d", object->debug_id, event); + +- fscache_stat(&fscache_n_updates_run); ++ fscache_stat_unchecked(&fscache_n_updates_run); + fscache_stat(&fscache_n_cop_update_object); + object->cache->ops->update_object(object); + fscache_stat_d(&fscache_n_cop_update_object); +diff --git a/fs/fscache/operation.c b/fs/fscache/operation.c +index e7b87a0..a85d47a 100644 +--- a/fs/fscache/operation.c ++++ b/fs/fscache/operation.c +@@ -17,7 +17,7 @@ + #include <linux/slab.h> + #include "internal.h" + +-atomic_t fscache_op_debug_id; ++atomic_unchecked_t fscache_op_debug_id; + EXPORT_SYMBOL(fscache_op_debug_id); + + /** +@@ -39,7 +39,7 @@ void fscache_enqueue_operation(struct fscache_operation *op) + ASSERTCMP(atomic_read(&op->usage), >, 0); + ASSERTCMP(op->state, ==, FSCACHE_OP_ST_IN_PROGRESS); + +- fscache_stat(&fscache_n_op_enqueue); ++ fscache_stat_unchecked(&fscache_n_op_enqueue); + switch (op->flags & FSCACHE_OP_TYPE) { + case FSCACHE_OP_ASYNC: + _debug("queue async"); +@@ -72,7 +72,7 @@ static void fscache_run_op(struct fscache_object *object, + wake_up_bit(&op->flags, FSCACHE_OP_WAITING); + if (op->processor) + fscache_enqueue_operation(op); +- fscache_stat(&fscache_n_op_run); ++ fscache_stat_unchecked(&fscache_n_op_run); + } + + /* +@@ -104,11 +104,11 @@ int fscache_submit_exclusive_op(struct fscache_object *object, + if (object->n_in_progress > 0) { + atomic_inc(&op->usage); + list_add_tail(&op->pend_link, &object->pending_ops); +- fscache_stat(&fscache_n_op_pend); ++ fscache_stat_unchecked(&fscache_n_op_pend); + } else if (!list_empty(&object->pending_ops)) { + atomic_inc(&op->usage); + list_add_tail(&op->pend_link, &object->pending_ops); +- fscache_stat(&fscache_n_op_pend); ++ fscache_stat_unchecked(&fscache_n_op_pend); + fscache_start_operations(object); + } else { + ASSERTCMP(object->n_in_progress, ==, 0); +@@ -124,7 +124,7 @@ int fscache_submit_exclusive_op(struct fscache_object *object, + object->n_exclusive++; /* reads and writes must wait */ + atomic_inc(&op->usage); + list_add_tail(&op->pend_link, &object->pending_ops); +- fscache_stat(&fscache_n_op_pend); ++ fscache_stat_unchecked(&fscache_n_op_pend); + ret = 0; + } else { + /* If we're in any other state, there must have been an I/O +@@ -211,11 +211,11 @@ int fscache_submit_op(struct fscache_object *object, + if (object->n_exclusive > 0) { + atomic_inc(&op->usage); + list_add_tail(&op->pend_link, &object->pending_ops); +- fscache_stat(&fscache_n_op_pend); ++ fscache_stat_unchecked(&fscache_n_op_pend); + } else if (!list_empty(&object->pending_ops)) { + atomic_inc(&op->usage); + list_add_tail(&op->pend_link, &object->pending_ops); +- fscache_stat(&fscache_n_op_pend); ++ fscache_stat_unchecked(&fscache_n_op_pend); + fscache_start_operations(object); + } else { + ASSERTCMP(object->n_exclusive, ==, 0); +@@ -227,10 +227,10 @@ int fscache_submit_op(struct fscache_object *object, + object->n_ops++; + atomic_inc(&op->usage); + list_add_tail(&op->pend_link, &object->pending_ops); +- fscache_stat(&fscache_n_op_pend); ++ fscache_stat_unchecked(&fscache_n_op_pend); + ret = 0; + } else if (fscache_object_is_dying(object)) { +- fscache_stat(&fscache_n_op_rejected); ++ fscache_stat_unchecked(&fscache_n_op_rejected); + op->state = FSCACHE_OP_ST_CANCELLED; + ret = -ENOBUFS; + } else if (!test_bit(FSCACHE_IOERROR, &object->cache->flags)) { +@@ -309,7 +309,7 @@ int fscache_cancel_op(struct fscache_operation *op, + ret = -EBUSY; + if (op->state == FSCACHE_OP_ST_PENDING) { + ASSERT(!list_empty(&op->pend_link)); +- fscache_stat(&fscache_n_op_cancelled); ++ fscache_stat_unchecked(&fscache_n_op_cancelled); + list_del_init(&op->pend_link); + if (do_cancel) + do_cancel(op); +@@ -341,7 +341,7 @@ void fscache_cancel_all_ops(struct fscache_object *object) + while (!list_empty(&object->pending_ops)) { + op = list_entry(object->pending_ops.next, + struct fscache_operation, pend_link); +- fscache_stat(&fscache_n_op_cancelled); ++ fscache_stat_unchecked(&fscache_n_op_cancelled); + list_del_init(&op->pend_link); + + ASSERTCMP(op->state, ==, FSCACHE_OP_ST_PENDING); +@@ -413,7 +413,7 @@ void fscache_put_operation(struct fscache_operation *op) + op->state, ==, FSCACHE_OP_ST_CANCELLED); + op->state = FSCACHE_OP_ST_DEAD; + +- fscache_stat(&fscache_n_op_release); ++ fscache_stat_unchecked(&fscache_n_op_release); + + if (op->release) { + op->release(op); +@@ -432,7 +432,7 @@ void fscache_put_operation(struct fscache_operation *op) + * lock, and defer it otherwise */ + if (!spin_trylock(&object->lock)) { + _debug("defer put"); +- fscache_stat(&fscache_n_op_deferred_release); ++ fscache_stat_unchecked(&fscache_n_op_deferred_release); + + cache = object->cache; + spin_lock(&cache->op_gc_list_lock); +@@ -485,7 +485,7 @@ void fscache_operation_gc(struct work_struct *work) + + _debug("GC DEFERRED REL OBJ%x OP%x", + object->debug_id, op->debug_id); +- fscache_stat(&fscache_n_op_gc); ++ fscache_stat_unchecked(&fscache_n_op_gc); + + ASSERTCMP(atomic_read(&op->usage), ==, 0); + ASSERTCMP(op->state, ==, FSCACHE_OP_ST_DEAD); +diff --git a/fs/fscache/page.c b/fs/fscache/page.c +index de33b3f..8be4d29 100644 +--- a/fs/fscache/page.c ++++ b/fs/fscache/page.c +@@ -74,7 +74,7 @@ try_again: + val = radix_tree_lookup(&cookie->stores, page->index); + if (!val) { + rcu_read_unlock(); +- fscache_stat(&fscache_n_store_vmscan_not_storing); ++ fscache_stat_unchecked(&fscache_n_store_vmscan_not_storing); + __fscache_uncache_page(cookie, page); + return true; + } +@@ -104,11 +104,11 @@ try_again: + spin_unlock(&cookie->stores_lock); + + if (xpage) { +- fscache_stat(&fscache_n_store_vmscan_cancelled); +- fscache_stat(&fscache_n_store_radix_deletes); ++ fscache_stat_unchecked(&fscache_n_store_vmscan_cancelled); ++ fscache_stat_unchecked(&fscache_n_store_radix_deletes); + ASSERTCMP(xpage, ==, page); + } else { +- fscache_stat(&fscache_n_store_vmscan_gone); ++ fscache_stat_unchecked(&fscache_n_store_vmscan_gone); + } + + wake_up_bit(&cookie->flags, 0); +@@ -123,11 +123,11 @@ page_busy: + * sleeping on memory allocation, so we may need to impose a timeout + * too. */ + if (!(gfp & __GFP_WAIT) || !(gfp & __GFP_FS)) { +- fscache_stat(&fscache_n_store_vmscan_busy); ++ fscache_stat_unchecked(&fscache_n_store_vmscan_busy); + return false; + } + +- fscache_stat(&fscache_n_store_vmscan_wait); ++ fscache_stat_unchecked(&fscache_n_store_vmscan_wait); + if (!release_page_wait_timeout(cookie, page)) + _debug("fscache writeout timeout page: %p{%lx}", + page, page->index); +@@ -156,7 +156,7 @@ static void fscache_end_page_write(struct fscache_object *object, + FSCACHE_COOKIE_STORING_TAG); + if (!radix_tree_tag_get(&cookie->stores, page->index, + FSCACHE_COOKIE_PENDING_TAG)) { +- fscache_stat(&fscache_n_store_radix_deletes); ++ fscache_stat_unchecked(&fscache_n_store_radix_deletes); + xpage = radix_tree_delete(&cookie->stores, page->index); + } + spin_unlock(&cookie->stores_lock); +@@ -177,7 +177,7 @@ static void fscache_attr_changed_op(struct fscache_operation *op) + + _enter("{OBJ%x OP%x}", object->debug_id, op->debug_id); + +- fscache_stat(&fscache_n_attr_changed_calls); ++ fscache_stat_unchecked(&fscache_n_attr_changed_calls); + + if (fscache_object_is_active(object)) { + fscache_stat(&fscache_n_cop_attr_changed); +@@ -204,11 +204,11 @@ int __fscache_attr_changed(struct fscache_cookie *cookie) + + ASSERTCMP(cookie->def->type, !=, FSCACHE_COOKIE_TYPE_INDEX); + +- fscache_stat(&fscache_n_attr_changed); ++ fscache_stat_unchecked(&fscache_n_attr_changed); + + op = kzalloc(sizeof(*op), GFP_KERNEL); + if (!op) { +- fscache_stat(&fscache_n_attr_changed_nomem); ++ fscache_stat_unchecked(&fscache_n_attr_changed_nomem); + _leave(" = -ENOMEM"); + return -ENOMEM; + } +@@ -230,7 +230,7 @@ int __fscache_attr_changed(struct fscache_cookie *cookie) + if (fscache_submit_exclusive_op(object, op) < 0) + goto nobufs_dec; + spin_unlock(&cookie->lock); +- fscache_stat(&fscache_n_attr_changed_ok); ++ fscache_stat_unchecked(&fscache_n_attr_changed_ok); + fscache_put_operation(op); + _leave(" = 0"); + return 0; +@@ -242,7 +242,7 @@ nobufs: + kfree(op); + if (wake_cookie) + __fscache_wake_unused_cookie(cookie); +- fscache_stat(&fscache_n_attr_changed_nobufs); ++ fscache_stat_unchecked(&fscache_n_attr_changed_nobufs); + _leave(" = %d", -ENOBUFS); + return -ENOBUFS; + } +@@ -281,7 +281,7 @@ static struct fscache_retrieval *fscache_alloc_retrieval( + /* allocate a retrieval operation and attempt to submit it */ + op = kzalloc(sizeof(*op), GFP_NOIO); + if (!op) { +- fscache_stat(&fscache_n_retrievals_nomem); ++ fscache_stat_unchecked(&fscache_n_retrievals_nomem); + return NULL; + } + +@@ -311,12 +311,12 @@ int fscache_wait_for_deferred_lookup(struct fscache_cookie *cookie) + return 0; + } + +- fscache_stat(&fscache_n_retrievals_wait); ++ fscache_stat_unchecked(&fscache_n_retrievals_wait); + + jif = jiffies; + if (wait_on_bit(&cookie->flags, FSCACHE_COOKIE_LOOKING_UP, + TASK_INTERRUPTIBLE) != 0) { +- fscache_stat(&fscache_n_retrievals_intr); ++ fscache_stat_unchecked(&fscache_n_retrievals_intr); + _leave(" = -ERESTARTSYS"); + return -ERESTARTSYS; + } +@@ -345,8 +345,8 @@ static void fscache_do_cancel_retrieval(struct fscache_operation *_op) + */ + int fscache_wait_for_operation_activation(struct fscache_object *object, + struct fscache_operation *op, +- atomic_t *stat_op_waits, +- atomic_t *stat_object_dead, ++ atomic_unchecked_t *stat_op_waits, ++ atomic_unchecked_t *stat_object_dead, + void (*do_cancel)(struct fscache_operation *)) + { + int ret; +@@ -356,7 +356,7 @@ int fscache_wait_for_operation_activation(struct fscache_object *object, + + _debug(">>> WT"); + if (stat_op_waits) +- fscache_stat(stat_op_waits); ++ fscache_stat_unchecked(stat_op_waits); + if (wait_on_bit(&op->flags, FSCACHE_OP_WAITING, + TASK_INTERRUPTIBLE) != 0) { + ret = fscache_cancel_op(op, do_cancel); +@@ -373,7 +373,7 @@ int fscache_wait_for_operation_activation(struct fscache_object *object, + check_if_dead: + if (op->state == FSCACHE_OP_ST_CANCELLED) { + if (stat_object_dead) +- fscache_stat(stat_object_dead); ++ fscache_stat_unchecked(stat_object_dead); + _leave(" = -ENOBUFS [cancelled]"); + return -ENOBUFS; + } +@@ -381,7 +381,7 @@ check_if_dead: + pr_err("%s() = -ENOBUFS [obj dead %d]\n", __func__, op->state); + fscache_cancel_op(op, do_cancel); + if (stat_object_dead) +- fscache_stat(stat_object_dead); ++ fscache_stat_unchecked(stat_object_dead); + return -ENOBUFS; + } + return 0; +@@ -409,7 +409,7 @@ int __fscache_read_or_alloc_page(struct fscache_cookie *cookie, + + _enter("%p,%p,,,", cookie, page); + +- fscache_stat(&fscache_n_retrievals); ++ fscache_stat_unchecked(&fscache_n_retrievals); + + if (hlist_empty(&cookie->backing_objects)) + goto nobufs; +@@ -451,7 +451,7 @@ int __fscache_read_or_alloc_page(struct fscache_cookie *cookie, + goto nobufs_unlock_dec; + spin_unlock(&cookie->lock); + +- fscache_stat(&fscache_n_retrieval_ops); ++ fscache_stat_unchecked(&fscache_n_retrieval_ops); + + /* pin the netfs read context in case we need to do the actual netfs + * read because we've encountered a cache read failure */ +@@ -482,15 +482,15 @@ int __fscache_read_or_alloc_page(struct fscache_cookie *cookie, + + error: + if (ret == -ENOMEM) +- fscache_stat(&fscache_n_retrievals_nomem); ++ fscache_stat_unchecked(&fscache_n_retrievals_nomem); + else if (ret == -ERESTARTSYS) +- fscache_stat(&fscache_n_retrievals_intr); ++ fscache_stat_unchecked(&fscache_n_retrievals_intr); + else if (ret == -ENODATA) +- fscache_stat(&fscache_n_retrievals_nodata); ++ fscache_stat_unchecked(&fscache_n_retrievals_nodata); + else if (ret < 0) +- fscache_stat(&fscache_n_retrievals_nobufs); ++ fscache_stat_unchecked(&fscache_n_retrievals_nobufs); + else +- fscache_stat(&fscache_n_retrievals_ok); ++ fscache_stat_unchecked(&fscache_n_retrievals_ok); + + fscache_put_retrieval(op); + _leave(" = %d", ret); +@@ -505,7 +505,7 @@ nobufs_unlock: + __fscache_wake_unused_cookie(cookie); + kfree(op); + nobufs: +- fscache_stat(&fscache_n_retrievals_nobufs); ++ fscache_stat_unchecked(&fscache_n_retrievals_nobufs); + _leave(" = -ENOBUFS"); + return -ENOBUFS; + } +@@ -544,7 +544,7 @@ int __fscache_read_or_alloc_pages(struct fscache_cookie *cookie, + + _enter("%p,,%d,,,", cookie, *nr_pages); + +- fscache_stat(&fscache_n_retrievals); ++ fscache_stat_unchecked(&fscache_n_retrievals); + + if (hlist_empty(&cookie->backing_objects)) + goto nobufs; +@@ -582,7 +582,7 @@ int __fscache_read_or_alloc_pages(struct fscache_cookie *cookie, + goto nobufs_unlock_dec; + spin_unlock(&cookie->lock); + +- fscache_stat(&fscache_n_retrieval_ops); ++ fscache_stat_unchecked(&fscache_n_retrieval_ops); + + /* pin the netfs read context in case we need to do the actual netfs + * read because we've encountered a cache read failure */ +@@ -613,15 +613,15 @@ int __fscache_read_or_alloc_pages(struct fscache_cookie *cookie, + + error: + if (ret == -ENOMEM) +- fscache_stat(&fscache_n_retrievals_nomem); ++ fscache_stat_unchecked(&fscache_n_retrievals_nomem); + else if (ret == -ERESTARTSYS) +- fscache_stat(&fscache_n_retrievals_intr); ++ fscache_stat_unchecked(&fscache_n_retrievals_intr); + else if (ret == -ENODATA) +- fscache_stat(&fscache_n_retrievals_nodata); ++ fscache_stat_unchecked(&fscache_n_retrievals_nodata); + else if (ret < 0) +- fscache_stat(&fscache_n_retrievals_nobufs); ++ fscache_stat_unchecked(&fscache_n_retrievals_nobufs); + else +- fscache_stat(&fscache_n_retrievals_ok); ++ fscache_stat_unchecked(&fscache_n_retrievals_ok); + + fscache_put_retrieval(op); + _leave(" = %d", ret); +@@ -636,7 +636,7 @@ nobufs_unlock: + if (wake_cookie) + __fscache_wake_unused_cookie(cookie); + nobufs: +- fscache_stat(&fscache_n_retrievals_nobufs); ++ fscache_stat_unchecked(&fscache_n_retrievals_nobufs); + _leave(" = -ENOBUFS"); + return -ENOBUFS; + } +@@ -661,7 +661,7 @@ int __fscache_alloc_page(struct fscache_cookie *cookie, + + _enter("%p,%p,,,", cookie, page); + +- fscache_stat(&fscache_n_allocs); ++ fscache_stat_unchecked(&fscache_n_allocs); + + if (hlist_empty(&cookie->backing_objects)) + goto nobufs; +@@ -695,7 +695,7 @@ int __fscache_alloc_page(struct fscache_cookie *cookie, + goto nobufs_unlock_dec; + spin_unlock(&cookie->lock); + +- fscache_stat(&fscache_n_alloc_ops); ++ fscache_stat_unchecked(&fscache_n_alloc_ops); + + ret = fscache_wait_for_operation_activation( + object, &op->op, +@@ -712,11 +712,11 @@ int __fscache_alloc_page(struct fscache_cookie *cookie, + + error: + if (ret == -ERESTARTSYS) +- fscache_stat(&fscache_n_allocs_intr); ++ fscache_stat_unchecked(&fscache_n_allocs_intr); + else if (ret < 0) +- fscache_stat(&fscache_n_allocs_nobufs); ++ fscache_stat_unchecked(&fscache_n_allocs_nobufs); + else +- fscache_stat(&fscache_n_allocs_ok); ++ fscache_stat_unchecked(&fscache_n_allocs_ok); + + fscache_put_retrieval(op); + _leave(" = %d", ret); +@@ -730,7 +730,7 @@ nobufs_unlock: + if (wake_cookie) + __fscache_wake_unused_cookie(cookie); + nobufs: +- fscache_stat(&fscache_n_allocs_nobufs); ++ fscache_stat_unchecked(&fscache_n_allocs_nobufs); + _leave(" = -ENOBUFS"); + return -ENOBUFS; + } +@@ -806,7 +806,7 @@ static void fscache_write_op(struct fscache_operation *_op) + + spin_lock(&cookie->stores_lock); + +- fscache_stat(&fscache_n_store_calls); ++ fscache_stat_unchecked(&fscache_n_store_calls); + + /* find a page to store */ + page = NULL; +@@ -817,7 +817,7 @@ static void fscache_write_op(struct fscache_operation *_op) + page = results[0]; + _debug("gang %d [%lx]", n, page->index); + if (page->index > op->store_limit) { +- fscache_stat(&fscache_n_store_pages_over_limit); ++ fscache_stat_unchecked(&fscache_n_store_pages_over_limit); + goto superseded; + } + +@@ -829,7 +829,7 @@ static void fscache_write_op(struct fscache_operation *_op) + spin_unlock(&cookie->stores_lock); + spin_unlock(&object->lock); + +- fscache_stat(&fscache_n_store_pages); ++ fscache_stat_unchecked(&fscache_n_store_pages); + fscache_stat(&fscache_n_cop_write_page); + ret = object->cache->ops->write_page(op, page); + fscache_stat_d(&fscache_n_cop_write_page); +@@ -933,7 +933,7 @@ int __fscache_write_page(struct fscache_cookie *cookie, + ASSERTCMP(cookie->def->type, !=, FSCACHE_COOKIE_TYPE_INDEX); + ASSERT(PageFsCache(page)); + +- fscache_stat(&fscache_n_stores); ++ fscache_stat_unchecked(&fscache_n_stores); + + if (test_bit(FSCACHE_COOKIE_INVALIDATING, &cookie->flags)) { + _leave(" = -ENOBUFS [invalidating]"); +@@ -992,7 +992,7 @@ int __fscache_write_page(struct fscache_cookie *cookie, + spin_unlock(&cookie->stores_lock); + spin_unlock(&object->lock); + +- op->op.debug_id = atomic_inc_return(&fscache_op_debug_id); ++ op->op.debug_id = atomic_inc_return_unchecked(&fscache_op_debug_id); + op->store_limit = object->store_limit; + + __fscache_use_cookie(cookie); +@@ -1001,8 +1001,8 @@ int __fscache_write_page(struct fscache_cookie *cookie, + + spin_unlock(&cookie->lock); + radix_tree_preload_end(); +- fscache_stat(&fscache_n_store_ops); +- fscache_stat(&fscache_n_stores_ok); ++ fscache_stat_unchecked(&fscache_n_store_ops); ++ fscache_stat_unchecked(&fscache_n_stores_ok); + + /* the work queue now carries its own ref on the object */ + fscache_put_operation(&op->op); +@@ -1010,14 +1010,14 @@ int __fscache_write_page(struct fscache_cookie *cookie, + return 0; + + already_queued: +- fscache_stat(&fscache_n_stores_again); ++ fscache_stat_unchecked(&fscache_n_stores_again); + already_pending: + spin_unlock(&cookie->stores_lock); + spin_unlock(&object->lock); + spin_unlock(&cookie->lock); + radix_tree_preload_end(); + kfree(op); +- fscache_stat(&fscache_n_stores_ok); ++ fscache_stat_unchecked(&fscache_n_stores_ok); + _leave(" = 0"); + return 0; + +@@ -1039,14 +1039,14 @@ nobufs: + kfree(op); + if (wake_cookie) + __fscache_wake_unused_cookie(cookie); +- fscache_stat(&fscache_n_stores_nobufs); ++ fscache_stat_unchecked(&fscache_n_stores_nobufs); + _leave(" = -ENOBUFS"); + return -ENOBUFS; + + nomem_free: + kfree(op); + nomem: +- fscache_stat(&fscache_n_stores_oom); ++ fscache_stat_unchecked(&fscache_n_stores_oom); + _leave(" = -ENOMEM"); + return -ENOMEM; + } +@@ -1064,7 +1064,7 @@ void __fscache_uncache_page(struct fscache_cookie *cookie, struct page *page) + ASSERTCMP(cookie->def->type, !=, FSCACHE_COOKIE_TYPE_INDEX); + ASSERTCMP(page, !=, NULL); + +- fscache_stat(&fscache_n_uncaches); ++ fscache_stat_unchecked(&fscache_n_uncaches); + + /* cache withdrawal may beat us to it */ + if (!PageFsCache(page)) +@@ -1115,7 +1115,7 @@ void fscache_mark_page_cached(struct fscache_retrieval *op, struct page *page) + struct fscache_cookie *cookie = op->op.object->cookie; + + #ifdef CONFIG_FSCACHE_STATS +- atomic_inc(&fscache_n_marks); ++ atomic_inc_unchecked(&fscache_n_marks); + #endif + + _debug("- mark %p{%lx}", page, page->index); +diff --git a/fs/fscache/stats.c b/fs/fscache/stats.c +index 40d13c7..ddf52b9 100644 +--- a/fs/fscache/stats.c ++++ b/fs/fscache/stats.c +@@ -18,99 +18,99 @@ + /* + * operation counters + */ +-atomic_t fscache_n_op_pend; +-atomic_t fscache_n_op_run; +-atomic_t fscache_n_op_enqueue; +-atomic_t fscache_n_op_requeue; +-atomic_t fscache_n_op_deferred_release; +-atomic_t fscache_n_op_release; +-atomic_t fscache_n_op_gc; +-atomic_t fscache_n_op_cancelled; +-atomic_t fscache_n_op_rejected; +- +-atomic_t fscache_n_attr_changed; +-atomic_t fscache_n_attr_changed_ok; +-atomic_t fscache_n_attr_changed_nobufs; +-atomic_t fscache_n_attr_changed_nomem; +-atomic_t fscache_n_attr_changed_calls; +- +-atomic_t fscache_n_allocs; +-atomic_t fscache_n_allocs_ok; +-atomic_t fscache_n_allocs_wait; +-atomic_t fscache_n_allocs_nobufs; +-atomic_t fscache_n_allocs_intr; +-atomic_t fscache_n_allocs_object_dead; +-atomic_t fscache_n_alloc_ops; +-atomic_t fscache_n_alloc_op_waits; +- +-atomic_t fscache_n_retrievals; +-atomic_t fscache_n_retrievals_ok; +-atomic_t fscache_n_retrievals_wait; +-atomic_t fscache_n_retrievals_nodata; +-atomic_t fscache_n_retrievals_nobufs; +-atomic_t fscache_n_retrievals_intr; +-atomic_t fscache_n_retrievals_nomem; +-atomic_t fscache_n_retrievals_object_dead; +-atomic_t fscache_n_retrieval_ops; +-atomic_t fscache_n_retrieval_op_waits; +- +-atomic_t fscache_n_stores; +-atomic_t fscache_n_stores_ok; +-atomic_t fscache_n_stores_again; +-atomic_t fscache_n_stores_nobufs; +-atomic_t fscache_n_stores_oom; +-atomic_t fscache_n_store_ops; +-atomic_t fscache_n_store_calls; +-atomic_t fscache_n_store_pages; +-atomic_t fscache_n_store_radix_deletes; +-atomic_t fscache_n_store_pages_over_limit; +- +-atomic_t fscache_n_store_vmscan_not_storing; +-atomic_t fscache_n_store_vmscan_gone; +-atomic_t fscache_n_store_vmscan_busy; +-atomic_t fscache_n_store_vmscan_cancelled; +-atomic_t fscache_n_store_vmscan_wait; +- +-atomic_t fscache_n_marks; +-atomic_t fscache_n_uncaches; +- +-atomic_t fscache_n_acquires; +-atomic_t fscache_n_acquires_null; +-atomic_t fscache_n_acquires_no_cache; +-atomic_t fscache_n_acquires_ok; +-atomic_t fscache_n_acquires_nobufs; +-atomic_t fscache_n_acquires_oom; +- +-atomic_t fscache_n_invalidates; +-atomic_t fscache_n_invalidates_run; +- +-atomic_t fscache_n_updates; +-atomic_t fscache_n_updates_null; +-atomic_t fscache_n_updates_run; +- +-atomic_t fscache_n_relinquishes; +-atomic_t fscache_n_relinquishes_null; +-atomic_t fscache_n_relinquishes_waitcrt; +-atomic_t fscache_n_relinquishes_retire; +- +-atomic_t fscache_n_cookie_index; +-atomic_t fscache_n_cookie_data; +-atomic_t fscache_n_cookie_special; +- +-atomic_t fscache_n_object_alloc; +-atomic_t fscache_n_object_no_alloc; +-atomic_t fscache_n_object_lookups; +-atomic_t fscache_n_object_lookups_negative; +-atomic_t fscache_n_object_lookups_positive; +-atomic_t fscache_n_object_lookups_timed_out; +-atomic_t fscache_n_object_created; +-atomic_t fscache_n_object_avail; +-atomic_t fscache_n_object_dead; +- +-atomic_t fscache_n_checkaux_none; +-atomic_t fscache_n_checkaux_okay; +-atomic_t fscache_n_checkaux_update; +-atomic_t fscache_n_checkaux_obsolete; ++atomic_unchecked_t fscache_n_op_pend; ++atomic_unchecked_t fscache_n_op_run; ++atomic_unchecked_t fscache_n_op_enqueue; ++atomic_unchecked_t fscache_n_op_requeue; ++atomic_unchecked_t fscache_n_op_deferred_release; ++atomic_unchecked_t fscache_n_op_release; ++atomic_unchecked_t fscache_n_op_gc; ++atomic_unchecked_t fscache_n_op_cancelled; ++atomic_unchecked_t fscache_n_op_rejected; ++ ++atomic_unchecked_t fscache_n_attr_changed; ++atomic_unchecked_t fscache_n_attr_changed_ok; ++atomic_unchecked_t fscache_n_attr_changed_nobufs; ++atomic_unchecked_t fscache_n_attr_changed_nomem; ++atomic_unchecked_t fscache_n_attr_changed_calls; ++ ++atomic_unchecked_t fscache_n_allocs; ++atomic_unchecked_t fscache_n_allocs_ok; ++atomic_unchecked_t fscache_n_allocs_wait; ++atomic_unchecked_t fscache_n_allocs_nobufs; ++atomic_unchecked_t fscache_n_allocs_intr; ++atomic_unchecked_t fscache_n_allocs_object_dead; ++atomic_unchecked_t fscache_n_alloc_ops; ++atomic_unchecked_t fscache_n_alloc_op_waits; ++ ++atomic_unchecked_t fscache_n_retrievals; ++atomic_unchecked_t fscache_n_retrievals_ok; ++atomic_unchecked_t fscache_n_retrievals_wait; ++atomic_unchecked_t fscache_n_retrievals_nodata; ++atomic_unchecked_t fscache_n_retrievals_nobufs; ++atomic_unchecked_t fscache_n_retrievals_intr; ++atomic_unchecked_t fscache_n_retrievals_nomem; ++atomic_unchecked_t fscache_n_retrievals_object_dead; ++atomic_unchecked_t fscache_n_retrieval_ops; ++atomic_unchecked_t fscache_n_retrieval_op_waits; ++ ++atomic_unchecked_t fscache_n_stores; ++atomic_unchecked_t fscache_n_stores_ok; ++atomic_unchecked_t fscache_n_stores_again; ++atomic_unchecked_t fscache_n_stores_nobufs; ++atomic_unchecked_t fscache_n_stores_oom; ++atomic_unchecked_t fscache_n_store_ops; ++atomic_unchecked_t fscache_n_store_calls; ++atomic_unchecked_t fscache_n_store_pages; ++atomic_unchecked_t fscache_n_store_radix_deletes; ++atomic_unchecked_t fscache_n_store_pages_over_limit; ++ ++atomic_unchecked_t fscache_n_store_vmscan_not_storing; ++atomic_unchecked_t fscache_n_store_vmscan_gone; ++atomic_unchecked_t fscache_n_store_vmscan_busy; ++atomic_unchecked_t fscache_n_store_vmscan_cancelled; ++atomic_unchecked_t fscache_n_store_vmscan_wait; ++ ++atomic_unchecked_t fscache_n_marks; ++atomic_unchecked_t fscache_n_uncaches; ++ ++atomic_unchecked_t fscache_n_acquires; ++atomic_unchecked_t fscache_n_acquires_null; ++atomic_unchecked_t fscache_n_acquires_no_cache; ++atomic_unchecked_t fscache_n_acquires_ok; ++atomic_unchecked_t fscache_n_acquires_nobufs; ++atomic_unchecked_t fscache_n_acquires_oom; ++ ++atomic_unchecked_t fscache_n_invalidates; ++atomic_unchecked_t fscache_n_invalidates_run; ++ ++atomic_unchecked_t fscache_n_updates; ++atomic_unchecked_t fscache_n_updates_null; ++atomic_unchecked_t fscache_n_updates_run; ++ ++atomic_unchecked_t fscache_n_relinquishes; ++atomic_unchecked_t fscache_n_relinquishes_null; ++atomic_unchecked_t fscache_n_relinquishes_waitcrt; ++atomic_unchecked_t fscache_n_relinquishes_retire; ++ ++atomic_unchecked_t fscache_n_cookie_index; ++atomic_unchecked_t fscache_n_cookie_data; ++atomic_unchecked_t fscache_n_cookie_special; ++ ++atomic_unchecked_t fscache_n_object_alloc; ++atomic_unchecked_t fscache_n_object_no_alloc; ++atomic_unchecked_t fscache_n_object_lookups; ++atomic_unchecked_t fscache_n_object_lookups_negative; ++atomic_unchecked_t fscache_n_object_lookups_positive; ++atomic_unchecked_t fscache_n_object_lookups_timed_out; ++atomic_unchecked_t fscache_n_object_created; ++atomic_unchecked_t fscache_n_object_avail; ++atomic_unchecked_t fscache_n_object_dead; ++ ++atomic_unchecked_t fscache_n_checkaux_none; ++atomic_unchecked_t fscache_n_checkaux_okay; ++atomic_unchecked_t fscache_n_checkaux_update; ++atomic_unchecked_t fscache_n_checkaux_obsolete; + + atomic_t fscache_n_cop_alloc_object; + atomic_t fscache_n_cop_lookup_object; +@@ -138,118 +138,118 @@ static int fscache_stats_show(struct seq_file *m, void *v) + seq_puts(m, "FS-Cache statistics\n"); + + seq_printf(m, "Cookies: idx=%u dat=%u spc=%u\n", +- atomic_read(&fscache_n_cookie_index), +- atomic_read(&fscache_n_cookie_data), +- atomic_read(&fscache_n_cookie_special)); ++ atomic_read_unchecked(&fscache_n_cookie_index), ++ atomic_read_unchecked(&fscache_n_cookie_data), ++ atomic_read_unchecked(&fscache_n_cookie_special)); + + seq_printf(m, "Objects: alc=%u nal=%u avl=%u ded=%u\n", +- atomic_read(&fscache_n_object_alloc), +- atomic_read(&fscache_n_object_no_alloc), +- atomic_read(&fscache_n_object_avail), +- atomic_read(&fscache_n_object_dead)); ++ atomic_read_unchecked(&fscache_n_object_alloc), ++ atomic_read_unchecked(&fscache_n_object_no_alloc), ++ atomic_read_unchecked(&fscache_n_object_avail), ++ atomic_read_unchecked(&fscache_n_object_dead)); + seq_printf(m, "ChkAux : non=%u ok=%u upd=%u obs=%u\n", +- atomic_read(&fscache_n_checkaux_none), +- atomic_read(&fscache_n_checkaux_okay), +- atomic_read(&fscache_n_checkaux_update), +- atomic_read(&fscache_n_checkaux_obsolete)); ++ atomic_read_unchecked(&fscache_n_checkaux_none), ++ atomic_read_unchecked(&fscache_n_checkaux_okay), ++ atomic_read_unchecked(&fscache_n_checkaux_update), ++ atomic_read_unchecked(&fscache_n_checkaux_obsolete)); + + seq_printf(m, "Pages : mrk=%u unc=%u\n", +- atomic_read(&fscache_n_marks), +- atomic_read(&fscache_n_uncaches)); ++ atomic_read_unchecked(&fscache_n_marks), ++ atomic_read_unchecked(&fscache_n_uncaches)); + + seq_printf(m, "Acquire: n=%u nul=%u noc=%u ok=%u nbf=%u" + " oom=%u\n", +- atomic_read(&fscache_n_acquires), +- atomic_read(&fscache_n_acquires_null), +- atomic_read(&fscache_n_acquires_no_cache), +- atomic_read(&fscache_n_acquires_ok), +- atomic_read(&fscache_n_acquires_nobufs), +- atomic_read(&fscache_n_acquires_oom)); ++ atomic_read_unchecked(&fscache_n_acquires), ++ atomic_read_unchecked(&fscache_n_acquires_null), ++ atomic_read_unchecked(&fscache_n_acquires_no_cache), ++ atomic_read_unchecked(&fscache_n_acquires_ok), ++ atomic_read_unchecked(&fscache_n_acquires_nobufs), ++ atomic_read_unchecked(&fscache_n_acquires_oom)); + + seq_printf(m, "Lookups: n=%u neg=%u pos=%u crt=%u tmo=%u\n", +- atomic_read(&fscache_n_object_lookups), +- atomic_read(&fscache_n_object_lookups_negative), +- atomic_read(&fscache_n_object_lookups_positive), +- atomic_read(&fscache_n_object_created), +- atomic_read(&fscache_n_object_lookups_timed_out)); ++ atomic_read_unchecked(&fscache_n_object_lookups), ++ atomic_read_unchecked(&fscache_n_object_lookups_negative), ++ atomic_read_unchecked(&fscache_n_object_lookups_positive), ++ atomic_read_unchecked(&fscache_n_object_created), ++ atomic_read_unchecked(&fscache_n_object_lookups_timed_out)); + + seq_printf(m, "Invals : n=%u run=%u\n", +- atomic_read(&fscache_n_invalidates), +- atomic_read(&fscache_n_invalidates_run)); ++ atomic_read_unchecked(&fscache_n_invalidates), ++ atomic_read_unchecked(&fscache_n_invalidates_run)); + + seq_printf(m, "Updates: n=%u nul=%u run=%u\n", +- atomic_read(&fscache_n_updates), +- atomic_read(&fscache_n_updates_null), +- atomic_read(&fscache_n_updates_run)); ++ atomic_read_unchecked(&fscache_n_updates), ++ atomic_read_unchecked(&fscache_n_updates_null), ++ atomic_read_unchecked(&fscache_n_updates_run)); + + seq_printf(m, "Relinqs: n=%u nul=%u wcr=%u rtr=%u\n", +- atomic_read(&fscache_n_relinquishes), +- atomic_read(&fscache_n_relinquishes_null), +- atomic_read(&fscache_n_relinquishes_waitcrt), +- atomic_read(&fscache_n_relinquishes_retire)); ++ atomic_read_unchecked(&fscache_n_relinquishes), ++ atomic_read_unchecked(&fscache_n_relinquishes_null), ++ atomic_read_unchecked(&fscache_n_relinquishes_waitcrt), ++ atomic_read_unchecked(&fscache_n_relinquishes_retire)); + + seq_printf(m, "AttrChg: n=%u ok=%u nbf=%u oom=%u run=%u\n", +- atomic_read(&fscache_n_attr_changed), +- atomic_read(&fscache_n_attr_changed_ok), +- atomic_read(&fscache_n_attr_changed_nobufs), +- atomic_read(&fscache_n_attr_changed_nomem), +- atomic_read(&fscache_n_attr_changed_calls)); ++ atomic_read_unchecked(&fscache_n_attr_changed), ++ atomic_read_unchecked(&fscache_n_attr_changed_ok), ++ atomic_read_unchecked(&fscache_n_attr_changed_nobufs), ++ atomic_read_unchecked(&fscache_n_attr_changed_nomem), ++ atomic_read_unchecked(&fscache_n_attr_changed_calls)); + + seq_printf(m, "Allocs : n=%u ok=%u wt=%u nbf=%u int=%u\n", +- atomic_read(&fscache_n_allocs), +- atomic_read(&fscache_n_allocs_ok), +- atomic_read(&fscache_n_allocs_wait), +- atomic_read(&fscache_n_allocs_nobufs), +- atomic_read(&fscache_n_allocs_intr)); ++ atomic_read_unchecked(&fscache_n_allocs), ++ atomic_read_unchecked(&fscache_n_allocs_ok), ++ atomic_read_unchecked(&fscache_n_allocs_wait), ++ atomic_read_unchecked(&fscache_n_allocs_nobufs), ++ atomic_read_unchecked(&fscache_n_allocs_intr)); + seq_printf(m, "Allocs : ops=%u owt=%u abt=%u\n", +- atomic_read(&fscache_n_alloc_ops), +- atomic_read(&fscache_n_alloc_op_waits), +- atomic_read(&fscache_n_allocs_object_dead)); ++ atomic_read_unchecked(&fscache_n_alloc_ops), ++ atomic_read_unchecked(&fscache_n_alloc_op_waits), ++ atomic_read_unchecked(&fscache_n_allocs_object_dead)); + + seq_printf(m, "Retrvls: n=%u ok=%u wt=%u nod=%u nbf=%u" + " int=%u oom=%u\n", +- atomic_read(&fscache_n_retrievals), +- atomic_read(&fscache_n_retrievals_ok), +- atomic_read(&fscache_n_retrievals_wait), +- atomic_read(&fscache_n_retrievals_nodata), +- atomic_read(&fscache_n_retrievals_nobufs), +- atomic_read(&fscache_n_retrievals_intr), +- atomic_read(&fscache_n_retrievals_nomem)); ++ atomic_read_unchecked(&fscache_n_retrievals), ++ atomic_read_unchecked(&fscache_n_retrievals_ok), ++ atomic_read_unchecked(&fscache_n_retrievals_wait), ++ atomic_read_unchecked(&fscache_n_retrievals_nodata), ++ atomic_read_unchecked(&fscache_n_retrievals_nobufs), ++ atomic_read_unchecked(&fscache_n_retrievals_intr), ++ atomic_read_unchecked(&fscache_n_retrievals_nomem)); + seq_printf(m, "Retrvls: ops=%u owt=%u abt=%u\n", +- atomic_read(&fscache_n_retrieval_ops), +- atomic_read(&fscache_n_retrieval_op_waits), +- atomic_read(&fscache_n_retrievals_object_dead)); ++ atomic_read_unchecked(&fscache_n_retrieval_ops), ++ atomic_read_unchecked(&fscache_n_retrieval_op_waits), ++ atomic_read_unchecked(&fscache_n_retrievals_object_dead)); + + seq_printf(m, "Stores : n=%u ok=%u agn=%u nbf=%u oom=%u\n", +- atomic_read(&fscache_n_stores), +- atomic_read(&fscache_n_stores_ok), +- atomic_read(&fscache_n_stores_again), +- atomic_read(&fscache_n_stores_nobufs), +- atomic_read(&fscache_n_stores_oom)); ++ atomic_read_unchecked(&fscache_n_stores), ++ atomic_read_unchecked(&fscache_n_stores_ok), ++ atomic_read_unchecked(&fscache_n_stores_again), ++ atomic_read_unchecked(&fscache_n_stores_nobufs), ++ atomic_read_unchecked(&fscache_n_stores_oom)); + seq_printf(m, "Stores : ops=%u run=%u pgs=%u rxd=%u olm=%u\n", +- atomic_read(&fscache_n_store_ops), +- atomic_read(&fscache_n_store_calls), +- atomic_read(&fscache_n_store_pages), +- atomic_read(&fscache_n_store_radix_deletes), +- atomic_read(&fscache_n_store_pages_over_limit)); ++ atomic_read_unchecked(&fscache_n_store_ops), ++ atomic_read_unchecked(&fscache_n_store_calls), ++ atomic_read_unchecked(&fscache_n_store_pages), ++ atomic_read_unchecked(&fscache_n_store_radix_deletes), ++ atomic_read_unchecked(&fscache_n_store_pages_over_limit)); + + seq_printf(m, "VmScan : nos=%u gon=%u bsy=%u can=%u wt=%u\n", +- atomic_read(&fscache_n_store_vmscan_not_storing), +- atomic_read(&fscache_n_store_vmscan_gone), +- atomic_read(&fscache_n_store_vmscan_busy), +- atomic_read(&fscache_n_store_vmscan_cancelled), +- atomic_read(&fscache_n_store_vmscan_wait)); ++ atomic_read_unchecked(&fscache_n_store_vmscan_not_storing), ++ atomic_read_unchecked(&fscache_n_store_vmscan_gone), ++ atomic_read_unchecked(&fscache_n_store_vmscan_busy), ++ atomic_read_unchecked(&fscache_n_store_vmscan_cancelled), ++ atomic_read_unchecked(&fscache_n_store_vmscan_wait)); + + seq_printf(m, "Ops : pend=%u run=%u enq=%u can=%u rej=%u\n", +- atomic_read(&fscache_n_op_pend), +- atomic_read(&fscache_n_op_run), +- atomic_read(&fscache_n_op_enqueue), +- atomic_read(&fscache_n_op_cancelled), +- atomic_read(&fscache_n_op_rejected)); ++ atomic_read_unchecked(&fscache_n_op_pend), ++ atomic_read_unchecked(&fscache_n_op_run), ++ atomic_read_unchecked(&fscache_n_op_enqueue), ++ atomic_read_unchecked(&fscache_n_op_cancelled), ++ atomic_read_unchecked(&fscache_n_op_rejected)); + seq_printf(m, "Ops : dfr=%u rel=%u gc=%u\n", +- atomic_read(&fscache_n_op_deferred_release), +- atomic_read(&fscache_n_op_release), +- atomic_read(&fscache_n_op_gc)); ++ atomic_read_unchecked(&fscache_n_op_deferred_release), ++ atomic_read_unchecked(&fscache_n_op_release), ++ atomic_read_unchecked(&fscache_n_op_gc)); + + seq_printf(m, "CacheOp: alo=%d luo=%d luc=%d gro=%d\n", + atomic_read(&fscache_n_cop_alloc_object), +diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c +index 966ace8..030a03a 100644 +--- a/fs/fuse/cuse.c ++++ b/fs/fuse/cuse.c +@@ -611,10 +611,12 @@ static int __init cuse_init(void) + INIT_LIST_HEAD(&cuse_conntbl[i]); + + /* inherit and extend fuse_dev_operations */ +- cuse_channel_fops = fuse_dev_operations; +- cuse_channel_fops.owner = THIS_MODULE; +- cuse_channel_fops.open = cuse_channel_open; +- cuse_channel_fops.release = cuse_channel_release; ++ pax_open_kernel(); ++ memcpy((void *)&cuse_channel_fops, &fuse_dev_operations, sizeof(fuse_dev_operations)); ++ *(void **)&cuse_channel_fops.owner = THIS_MODULE; ++ *(void **)&cuse_channel_fops.open = cuse_channel_open; ++ *(void **)&cuse_channel_fops.release = cuse_channel_release; ++ pax_close_kernel(); + + cuse_class = class_create(THIS_MODULE, "cuse"); + if (IS_ERR(cuse_class)) +diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c +index f2bbb85..9216e10 100644 +--- a/fs/fuse/dev.c ++++ b/fs/fuse/dev.c +@@ -1318,7 +1318,7 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos, + ret = 0; + pipe_lock(pipe); + +- if (!pipe->readers) { ++ if (!atomic_read(&pipe->readers)) { + send_sig(SIGPIPE, current, 0); + if (!ret) + ret = -EPIPE; +@@ -1347,7 +1347,7 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos, + page_nr++; + ret += buf->len; + +- if (pipe->files) ++ if (atomic_read(&pipe->files)) + do_wakeup = 1; + } + +diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c +index dbab798..fefa22b 100644 +--- a/fs/fuse/dir.c ++++ b/fs/fuse/dir.c +@@ -1474,7 +1474,7 @@ static char *read_link(struct dentry *dentry) + return link; + } + +-static void free_link(char *link) ++static void free_link(const char *link) + { + if (!IS_ERR(link)) + free_page((unsigned long) link); +diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c +index fd62cae..3494dfa 100644 +--- a/fs/hostfs/hostfs_kern.c ++++ b/fs/hostfs/hostfs_kern.c +@@ -908,7 +908,7 @@ static void *hostfs_follow_link(struct dentry *dentry, struct nameidata *nd) + + static void hostfs_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) + { +- char *s = nd_get_link(nd); ++ const char *s = nd_get_link(nd); + if (!IS_ERR(s)) + __putname(s); + } +diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c +index 1e2872b..7aea000 100644 +--- a/fs/hugetlbfs/inode.c ++++ b/fs/hugetlbfs/inode.c +@@ -154,6 +154,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + struct hstate *h = hstate_file(file); ++ unsigned long offset = gr_rand_threadstack_offset(mm, file, flags); + struct vm_unmapped_area_info info; + + if (len & ~huge_page_mask(h)) +@@ -167,17 +168,26 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, + return addr; + } + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + addr = ALIGN(addr, huge_page_size(h)); + vma = find_vma(mm, addr); +- if (TASK_SIZE - len >= addr && +- (!vma || addr + len <= vma->vm_start)) ++ if (TASK_SIZE - len >= addr && check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + + info.flags = 0; + info.length = len; + info.low_limit = TASK_UNMAPPED_BASE; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ info.low_limit += mm->delta_mmap; ++#endif ++ + info.high_limit = TASK_SIZE; + info.align_mask = PAGE_MASK & ~huge_page_mask(h); + info.align_offset = 0; +@@ -919,7 +929,7 @@ static struct file_system_type hugetlbfs_fs_type = { + }; + MODULE_ALIAS_FS("hugetlbfs"); + +-static struct vfsmount *hugetlbfs_vfsmount[HUGE_MAX_HSTATE]; ++struct vfsmount *hugetlbfs_vfsmount[HUGE_MAX_HSTATE]; + + static int can_do_hugetlb_shm(void) + { +diff --git a/fs/inode.c b/fs/inode.c +index 26753ba..d19eb34 100644 +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -840,16 +840,20 @@ unsigned int get_next_ino(void) + unsigned int *p = &get_cpu_var(last_ino); + unsigned int res = *p; + ++start: ++ + #ifdef CONFIG_SMP + if (unlikely((res & (LAST_INO_BATCH-1)) == 0)) { +- static atomic_t shared_last_ino; +- int next = atomic_add_return(LAST_INO_BATCH, &shared_last_ino); ++ static atomic_unchecked_t shared_last_ino; ++ int next = atomic_add_return_unchecked(LAST_INO_BATCH, &shared_last_ino); + + res = next - LAST_INO_BATCH; + } + #endif + +- *p = ++res; ++ if (unlikely(!++res)) ++ goto start; /* never zero */ ++ *p = res; + put_cpu_var(last_ino); + return res; + } +diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c +index 4a6cf28..d3a29d3 100644 +--- a/fs/jffs2/erase.c ++++ b/fs/jffs2/erase.c +@@ -452,7 +452,8 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb + struct jffs2_unknown_node marker = { + .magic = cpu_to_je16(JFFS2_MAGIC_BITMASK), + .nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER), +- .totlen = cpu_to_je32(c->cleanmarker_size) ++ .totlen = cpu_to_je32(c->cleanmarker_size), ++ .hdr_crc = cpu_to_je32(0) + }; + + jffs2_prealloc_raw_node_refs(c, jeb, 1); +diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c +index 09ed551..45684f8 100644 +--- a/fs/jffs2/wbuf.c ++++ b/fs/jffs2/wbuf.c +@@ -1023,7 +1023,8 @@ static const struct jffs2_unknown_node oob_cleanmarker = + { + .magic = constant_cpu_to_je16(JFFS2_MAGIC_BITMASK), + .nodetype = constant_cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER), +- .totlen = constant_cpu_to_je32(8) ++ .totlen = constant_cpu_to_je32(8), ++ .hdr_crc = constant_cpu_to_je32(0) + }; + + /* +diff --git a/fs/jfs/super.c b/fs/jfs/super.c +index 93e897e..a863de4 100644 +--- a/fs/jfs/super.c ++++ b/fs/jfs/super.c +@@ -893,7 +893,7 @@ static int __init init_jfs_fs(void) + + jfs_inode_cachep = + kmem_cache_create("jfs_ip", sizeof(struct jfs_inode_info), 0, +- SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD, ++ SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|SLAB_USERCOPY, + init_once); + if (jfs_inode_cachep == NULL) + return -ENOMEM; +diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c +index 1c77193..ba73e66 100644 +--- a/fs/kernfs/dir.c ++++ b/fs/kernfs/dir.c +@@ -182,7 +182,7 @@ struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn) + * + * Returns 31 bit hash of ns + name (so it fits in an off_t ) + */ +-static unsigned int kernfs_name_hash(const char *name, const void *ns) ++static unsigned int kernfs_name_hash(const unsigned char *name, const void *ns) + { + unsigned long hash = init_name_hash(); + unsigned int len = strlen(name); +@@ -829,6 +829,12 @@ static int kernfs_iop_mkdir(struct inode *dir, struct dentry *dentry, + ret = scops->mkdir(parent, dentry->d_name.name, mode); + + kernfs_put_active(parent); ++ ++ if (!ret) { ++ struct dentry *dentry_ret = kernfs_iop_lookup(dir, dentry, 0); ++ ret = PTR_ERR_OR_ZERO(dentry_ret); ++ } ++ + return ret; + } + +diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c +index 4429d6d..83d89ba 100644 +--- a/fs/kernfs/file.c ++++ b/fs/kernfs/file.c +@@ -34,7 +34,7 @@ static DEFINE_MUTEX(kernfs_open_file_mutex); + + struct kernfs_open_node { + atomic_t refcnt; +- atomic_t event; ++ atomic_unchecked_t event; + wait_queue_head_t poll; + struct list_head files; /* goes through kernfs_open_file.list */ + }; +@@ -163,7 +163,7 @@ static int kernfs_seq_show(struct seq_file *sf, void *v) + { + struct kernfs_open_file *of = sf->private; + +- of->event = atomic_read(&of->kn->attr.open->event); ++ of->event = atomic_read_unchecked(&of->kn->attr.open->event); + + return of->kn->attr.ops->seq_show(sf, v); + } +@@ -267,7 +267,7 @@ static ssize_t kernfs_fop_write(struct file *file, const char __user *user_buf, + { + struct kernfs_open_file *of = kernfs_of(file); + const struct kernfs_ops *ops; +- size_t len; ++ ssize_t len; + char *buf; + + if (of->atomic_write_len) { +@@ -375,12 +375,12 @@ static int kernfs_vma_page_mkwrite(struct vm_area_struct *vma, + return ret; + } + +-static int kernfs_vma_access(struct vm_area_struct *vma, unsigned long addr, +- void *buf, int len, int write) ++static ssize_t kernfs_vma_access(struct vm_area_struct *vma, unsigned long addr, ++ void *buf, size_t len, int write) + { + struct file *file = vma->vm_file; + struct kernfs_open_file *of = kernfs_of(file); +- int ret; ++ ssize_t ret; + + if (!of->vm_ops) + return -EINVAL; +@@ -581,7 +581,7 @@ static int kernfs_get_open_node(struct kernfs_node *kn, + return -ENOMEM; + + atomic_set(&new_on->refcnt, 0); +- atomic_set(&new_on->event, 1); ++ atomic_set_unchecked(&new_on->event, 1); + init_waitqueue_head(&new_on->poll); + INIT_LIST_HEAD(&new_on->files); + goto retry; +@@ -787,7 +787,7 @@ static unsigned int kernfs_fop_poll(struct file *filp, poll_table *wait) + + kernfs_put_active(kn); + +- if (of->event != atomic_read(&on->event)) ++ if (of->event != atomic_read_unchecked(&on->event)) + goto trigger; + + return DEFAULT_POLLMASK; +@@ -818,7 +818,7 @@ repeat: + + on = kn->attr.open; + if (on) { +- atomic_inc(&on->event); ++ atomic_inc_unchecked(&on->event); + wake_up_interruptible(&on->poll); + } + +diff --git a/fs/kernfs/symlink.c b/fs/kernfs/symlink.c +index 8a19889..4c3069a 100644 +--- a/fs/kernfs/symlink.c ++++ b/fs/kernfs/symlink.c +@@ -128,7 +128,7 @@ static void *kernfs_iop_follow_link(struct dentry *dentry, struct nameidata *nd) + static void kernfs_iop_put_link(struct dentry *dentry, struct nameidata *nd, + void *cookie) + { +- char *page = nd_get_link(nd); ++ const char *page = nd_get_link(nd); + if (!IS_ERR(page)) + free_page((unsigned long)page); + } +diff --git a/fs/libfs.c b/fs/libfs.c +index 005843c..06c4191 100644 +--- a/fs/libfs.c ++++ b/fs/libfs.c +@@ -160,6 +160,9 @@ int dcache_readdir(struct file *file, struct dir_context *ctx) + + for (p = q->next; p != &dentry->d_subdirs; p = p->next) { + struct dentry *next = list_entry(p, struct dentry, d_child); ++ char d_name[sizeof(next->d_iname)]; ++ const unsigned char *name; ++ + spin_lock_nested(&next->d_lock, DENTRY_D_LOCK_NESTED); + if (!simple_positive(next)) { + spin_unlock(&next->d_lock); +@@ -168,7 +171,12 @@ int dcache_readdir(struct file *file, struct dir_context *ctx) + + spin_unlock(&next->d_lock); + spin_unlock(&dentry->d_lock); +- if (!dir_emit(ctx, next->d_name.name, next->d_name.len, ++ name = next->d_name.name; ++ if (name == next->d_iname) { ++ memcpy(d_name, name, next->d_name.len); ++ name = d_name; ++ } ++ if (!dir_emit(ctx, name, next->d_name.len, + next->d_inode->i_ino, dt_type(next->d_inode))) + return 0; + spin_lock(&dentry->d_lock); +@@ -1027,7 +1035,7 @@ EXPORT_SYMBOL(noop_fsync); + void kfree_put_link(struct dentry *dentry, struct nameidata *nd, + void *cookie) + { +- char *s = nd_get_link(nd); ++ const char *s = nd_get_link(nd); + if (!IS_ERR(s)) + kfree(s); + } +diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c +index acd3947..1f896e2 100644 +--- a/fs/lockd/clntproc.c ++++ b/fs/lockd/clntproc.c +@@ -36,11 +36,11 @@ static const struct rpc_call_ops nlmclnt_cancel_ops; + /* + * Cookie counter for NLM requests + */ +-static atomic_t nlm_cookie = ATOMIC_INIT(0x1234); ++static atomic_unchecked_t nlm_cookie = ATOMIC_INIT(0x1234); + + void nlmclnt_next_cookie(struct nlm_cookie *c) + { +- u32 cookie = atomic_inc_return(&nlm_cookie); ++ u32 cookie = atomic_inc_return_unchecked(&nlm_cookie); + + memcpy(c->data, &cookie, 4); + c->len=4; +diff --git a/fs/locks.c b/fs/locks.c +index 59e2f90..bd69071 100644 +--- a/fs/locks.c ++++ b/fs/locks.c +@@ -2374,7 +2374,7 @@ void locks_remove_file(struct file *filp) + locks_remove_posix(filp, filp); + + if (filp->f_op->flock) { +- struct file_lock fl = { ++ struct file_lock flock = { + .fl_owner = filp, + .fl_pid = current->tgid, + .fl_file = filp, +@@ -2382,9 +2382,9 @@ void locks_remove_file(struct file *filp) + .fl_type = F_UNLCK, + .fl_end = OFFSET_MAX, + }; +- filp->f_op->flock(filp, F_SETLKW, &fl); +- if (fl.fl_ops && fl.fl_ops->fl_release_private) +- fl.fl_ops->fl_release_private(&fl); ++ filp->f_op->flock(filp, F_SETLKW, &flock); ++ if (flock.fl_ops && flock.fl_ops->fl_release_private) ++ flock.fl_ops->fl_release_private(&flock); + } + + spin_lock(&inode->i_lock); +diff --git a/fs/mount.h b/fs/mount.h +index f82c628..9492b99 100644 +--- a/fs/mount.h ++++ b/fs/mount.h +@@ -11,7 +11,7 @@ struct mnt_namespace { + u64 seq; /* Sequence number to prevent loops */ + wait_queue_head_t poll; + u64 event; +-}; ++} __randomize_layout; + + struct mnt_pcp { + int mnt_count; +@@ -62,7 +62,7 @@ struct mount { + int mnt_expiry_mark; /* true if marked for expiry */ + struct hlist_head mnt_pins; + struct path mnt_ex_mountpoint; +-}; ++} __randomize_layout; + + #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */ + +diff --git a/fs/namei.c b/fs/namei.c +index db5fe86..8bce5f0 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -331,17 +331,32 @@ int generic_permission(struct inode *inode, int mask) + if (ret != -EACCES) + return ret; + ++#ifdef CONFIG_GRKERNSEC ++ /* we'll block if we have to log due to a denied capability use */ ++ if (mask & MAY_NOT_BLOCK) ++ return -ECHILD; ++#endif ++ + if (S_ISDIR(inode->i_mode)) { + /* DACs are overridable for directories */ +- if (capable_wrt_inode_uidgid(inode, CAP_DAC_OVERRIDE)) +- return 0; + if (!(mask & MAY_WRITE)) +- if (capable_wrt_inode_uidgid(inode, +- CAP_DAC_READ_SEARCH)) ++ if (capable_wrt_inode_uidgid_nolog(inode, CAP_DAC_OVERRIDE) || ++ capable_wrt_inode_uidgid(inode, CAP_DAC_READ_SEARCH)) + return 0; ++ if (capable_wrt_inode_uidgid(inode, CAP_DAC_OVERRIDE)) ++ return 0; + return -EACCES; + } + /* ++ * Searching includes executable on directories, else just read. ++ */ ++ mask &= MAY_READ | MAY_WRITE | MAY_EXEC; ++ if (mask == MAY_READ) ++ if (capable_wrt_inode_uidgid_nolog(inode, CAP_DAC_OVERRIDE) || ++ capable_wrt_inode_uidgid(inode, CAP_DAC_READ_SEARCH)) ++ return 0; ++ ++ /* + * Read/write DACs are always overridable. + * Executable DACs are overridable when there is + * at least one exec bit set. +@@ -350,14 +365,6 @@ int generic_permission(struct inode *inode, int mask) + if (capable_wrt_inode_uidgid(inode, CAP_DAC_OVERRIDE)) + return 0; + +- /* +- * Searching includes executable on directories, else just read. +- */ +- mask &= MAY_READ | MAY_WRITE | MAY_EXEC; +- if (mask == MAY_READ) +- if (capable_wrt_inode_uidgid(inode, CAP_DAC_READ_SEARCH)) +- return 0; +- + return -EACCES; + } + EXPORT_SYMBOL(generic_permission); +@@ -824,7 +831,7 @@ follow_link(struct path *link, struct nameidata *nd, void **p) + { + struct dentry *dentry = link->dentry; + int error; +- char *s; ++ const char *s; + + BUG_ON(nd->flags & LOOKUP_RCU); + +@@ -845,6 +852,12 @@ follow_link(struct path *link, struct nameidata *nd, void **p) + if (error) + goto out_put_nd_path; + ++ if (gr_handle_follow_link(dentry->d_parent->d_inode, ++ dentry->d_inode, dentry, nd->path.mnt)) { ++ error = -EACCES; ++ goto out_put_nd_path; ++ } ++ + nd->last_type = LAST_BIND; + *p = dentry->d_inode->i_op->follow_link(dentry, nd); + error = PTR_ERR(*p); +@@ -1608,6 +1621,8 @@ static inline int nested_symlink(struct path *path, struct nameidata *nd) + if (res) + break; + res = walk_component(nd, path, LOOKUP_FOLLOW); ++ if (res >= 0 && gr_handle_symlink_owner(&link, nd->inode)) ++ res = -EACCES; + put_link(nd, &link, cookie); + } while (res > 0); + +@@ -1680,7 +1695,7 @@ EXPORT_SYMBOL(full_name_hash); + static inline u64 hash_name(const char *name) + { + unsigned long a, b, adata, bdata, mask, hash, len; +- const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; ++ static const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; + + hash = a = 0; + len = -sizeof(unsigned long); +@@ -1969,6 +1984,8 @@ static int path_lookupat(int dfd, const char *name, + if (err) + break; + err = lookup_last(nd, &path); ++ if (!err && gr_handle_symlink_owner(&link, nd->inode)) ++ err = -EACCES; + put_link(nd, &link, cookie); + } + } +@@ -1976,6 +1993,13 @@ static int path_lookupat(int dfd, const char *name, + if (!err) + err = complete_walk(nd); + ++ if (!err && !(nd->flags & LOOKUP_PARENT)) { ++ if (!gr_acl_handle_hidden_file(nd->path.dentry, nd->path.mnt)) { ++ path_put(&nd->path); ++ err = -ENOENT; ++ } ++ } ++ + if (!err && nd->flags & LOOKUP_DIRECTORY) { + if (!d_can_lookup(nd->path.dentry)) { + path_put(&nd->path); +@@ -2004,8 +2028,15 @@ static int filename_lookup(int dfd, struct filename *name, + retval = path_lookupat(dfd, name->name, + flags | LOOKUP_REVAL, nd); + +- if (likely(!retval)) ++ if (likely(!retval)) { + audit_inode(name, nd->path.dentry, flags & LOOKUP_PARENT); ++ if (name->name[0] != '/' && nd->path.dentry && nd->inode) { ++ if (!gr_chroot_fchdir(nd->path.dentry, nd->path.mnt)) { ++ path_put(&nd->path); ++ return -ENOENT; ++ } ++ } ++ } + return retval; + } + +@@ -2582,6 +2613,13 @@ static int may_open(struct path *path, int acc_mode, int flag) + if (flag & O_NOATIME && !inode_owner_or_capable(inode)) + return -EPERM; + ++ if (gr_handle_rofs_blockwrite(dentry, path->mnt, acc_mode)) ++ return -EPERM; ++ if (gr_handle_rawio(inode)) ++ return -EPERM; ++ if (!gr_acl_handle_open(dentry, path->mnt, acc_mode)) ++ return -EACCES; ++ + return 0; + } + +@@ -2813,7 +2851,7 @@ looked_up: + * cleared otherwise prior to returning. + */ + static int lookup_open(struct nameidata *nd, struct path *path, +- struct file *file, ++ struct path *link, struct file *file, + const struct open_flags *op, + bool got_write, int *opened) + { +@@ -2848,6 +2886,17 @@ static int lookup_open(struct nameidata *nd, struct path *path, + /* Negative dentry, just create the file */ + if (!dentry->d_inode && (op->open_flag & O_CREAT)) { + umode_t mode = op->mode; ++ ++ if (link && gr_handle_symlink_owner(link, dir->d_inode)) { ++ error = -EACCES; ++ goto out_dput; ++ } ++ ++ if (!gr_acl_handle_creat(dentry, dir, nd->path.mnt, op->open_flag, op->acc_mode, mode)) { ++ error = -EACCES; ++ goto out_dput; ++ } ++ + if (!IS_POSIXACL(dir->d_inode)) + mode &= ~current_umask(); + /* +@@ -2869,6 +2918,8 @@ static int lookup_open(struct nameidata *nd, struct path *path, + nd->flags & LOOKUP_EXCL); + if (error) + goto out_dput; ++ else ++ gr_handle_create(dentry, nd->path.mnt); + } + out_no_open: + path->dentry = dentry; +@@ -2883,7 +2934,7 @@ out_dput: + /* + * Handle the last step of open() + */ +-static int do_last(struct nameidata *nd, struct path *path, ++static int do_last(struct nameidata *nd, struct path *path, struct path *link, + struct file *file, const struct open_flags *op, + int *opened, struct filename *name) + { +@@ -2933,6 +2984,15 @@ static int do_last(struct nameidata *nd, struct path *path, + if (error) + return error; + ++ if (!gr_acl_handle_hidden_file(dir, nd->path.mnt)) { ++ error = -ENOENT; ++ goto out; ++ } ++ if (link && gr_handle_symlink_owner(link, nd->inode)) { ++ error = -EACCES; ++ goto out; ++ } ++ + audit_inode(name, dir, LOOKUP_PARENT); + error = -EISDIR; + /* trailing slashes? */ +@@ -2952,7 +3012,7 @@ retry_lookup: + */ + } + mutex_lock(&dir->d_inode->i_mutex); +- error = lookup_open(nd, path, file, op, got_write, opened); ++ error = lookup_open(nd, path, link, file, op, got_write, opened); + mutex_unlock(&dir->d_inode->i_mutex); + + if (error <= 0) { +@@ -2976,11 +3036,28 @@ retry_lookup: + goto finish_open_created; + } + ++ if (!gr_acl_handle_hidden_file(path->dentry, nd->path.mnt)) { ++ error = -ENOENT; ++ goto exit_dput; ++ } ++ if (link && gr_handle_symlink_owner(link, path->dentry->d_inode)) { ++ error = -EACCES; ++ goto exit_dput; ++ } ++ + /* + * create/update audit record if it already exists. + */ +- if (d_is_positive(path->dentry)) ++ if (d_is_positive(path->dentry)) { ++ /* only check if O_CREAT is specified, all other checks need to go ++ into may_open */ ++ if (gr_handle_fifo(path->dentry, path->mnt, dir, open_flag, acc_mode)) { ++ error = -EACCES; ++ goto exit_dput; ++ } ++ + audit_inode(name, path->dentry, 0); ++ } + + /* + * If atomic_open() acquired write access it is dropped now due to +@@ -3021,6 +3098,11 @@ finish_lookup: + } + } + BUG_ON(inode != path->dentry->d_inode); ++ /* if we're resolving a symlink to another symlink */ ++ if (link && gr_handle_symlink_owner(link, inode)) { ++ error = -EACCES; ++ goto out; ++ } + return 1; + } + +@@ -3040,7 +3122,18 @@ finish_open: + path_put(&save_parent); + return error; + } ++ ++ if (!gr_acl_handle_hidden_file(nd->path.dentry, nd->path.mnt)) { ++ error = -ENOENT; ++ goto out; ++ } ++ if (link && gr_handle_symlink_owner(link, nd->inode)) { ++ error = -EACCES; ++ goto out; ++ } ++ + audit_inode(name, nd->path.dentry, 0); ++ + error = -EISDIR; + if ((open_flag & O_CREAT) && d_is_dir(nd->path.dentry)) + goto out; +@@ -3207,7 +3300,7 @@ static struct file *path_openat(int dfd, struct filename *pathname, + if (unlikely(error)) + goto out; + +- error = do_last(nd, &path, file, op, &opened, pathname); ++ error = do_last(nd, &path, NULL, file, op, &opened, pathname); + while (unlikely(error > 0)) { /* trailing symlink */ + struct path link = path; + void *cookie; +@@ -3225,7 +3318,7 @@ static struct file *path_openat(int dfd, struct filename *pathname, + error = follow_link(&link, nd, &cookie); + if (unlikely(error)) + break; +- error = do_last(nd, &path, file, op, &opened, pathname); ++ error = do_last(nd, &path, &link, file, op, &opened, pathname); + put_link(nd, &link, cookie); + } + out: +@@ -3325,9 +3418,11 @@ struct dentry *kern_path_create(int dfd, const char *pathname, + goto unlock; + + error = -EEXIST; +- if (d_is_positive(dentry)) ++ if (d_is_positive(dentry)) { ++ if (!gr_acl_handle_hidden_file(dentry, nd.path.mnt)) ++ error = -ENOENT; + goto fail; +- ++ } + /* + * Special case - lookup gave negative, but... we had foo/bar/ + * From the vfs_mknod() POV we just have a negative dentry - +@@ -3379,6 +3474,20 @@ struct dentry *user_path_create(int dfd, const char __user *pathname, + } + EXPORT_SYMBOL(user_path_create); + ++static struct dentry *user_path_create_with_name(int dfd, const char __user *pathname, struct path *path, struct filename **to, unsigned int lookup_flags) ++{ ++ struct filename *tmp = getname(pathname); ++ struct dentry *res; ++ if (IS_ERR(tmp)) ++ return ERR_CAST(tmp); ++ res = kern_path_create(dfd, tmp->name, path, lookup_flags); ++ if (IS_ERR(res)) ++ putname(tmp); ++ else ++ *to = tmp; ++ return res; ++} ++ + int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) + { + int error = may_create(dir, dentry); +@@ -3442,6 +3551,17 @@ retry: + + if (!IS_POSIXACL(path.dentry->d_inode)) + mode &= ~current_umask(); ++ ++ if (gr_handle_chroot_mknod(dentry, path.mnt, mode)) { ++ error = -EPERM; ++ goto out; ++ } ++ ++ if (!gr_acl_handle_mknod(dentry, path.dentry, path.mnt, mode)) { ++ error = -EACCES; ++ goto out; ++ } ++ + error = security_path_mknod(&path, dentry, mode, dev); + if (error) + goto out; +@@ -3457,6 +3577,8 @@ retry: + error = vfs_mknod(path.dentry->d_inode,dentry,mode,0); + break; + } ++ if (!error) ++ gr_handle_create(dentry, path.mnt); + out: + done_path_create(&path, dentry); + if (retry_estale(error, lookup_flags)) { +@@ -3511,9 +3633,16 @@ retry: + + if (!IS_POSIXACL(path.dentry->d_inode)) + mode &= ~current_umask(); ++ if (!gr_acl_handle_mkdir(dentry, path.dentry, path.mnt)) { ++ error = -EACCES; ++ goto out; ++ } + error = security_path_mkdir(&path, dentry, mode); + if (!error) + error = vfs_mkdir(path.dentry->d_inode, dentry, mode); ++ if (!error) ++ gr_handle_create(dentry, path.mnt); ++out: + done_path_create(&path, dentry); + if (retry_estale(error, lookup_flags)) { + lookup_flags |= LOOKUP_REVAL; +@@ -3597,6 +3726,8 @@ static long do_rmdir(int dfd, const char __user *pathname) + struct filename *name; + struct dentry *dentry; + struct nameidata nd; ++ u64 saved_ino = 0; ++ dev_t saved_dev = 0; + unsigned int lookup_flags = 0; + retry: + name = user_path_parent(dfd, pathname, &nd, lookup_flags); +@@ -3629,10 +3760,21 @@ retry: + error = -ENOENT; + goto exit3; + } ++ ++ saved_ino = gr_get_ino_from_dentry(dentry); ++ saved_dev = gr_get_dev_from_dentry(dentry); ++ ++ if (!gr_acl_handle_rmdir(dentry, nd.path.mnt)) { ++ error = -EACCES; ++ goto exit3; ++ } ++ + error = security_path_rmdir(&nd.path, dentry); + if (error) + goto exit3; + error = vfs_rmdir(nd.path.dentry->d_inode, dentry); ++ if (!error && (saved_dev || saved_ino)) ++ gr_handle_delete(saved_ino, saved_dev); + exit3: + dput(dentry); + exit2: +@@ -3725,6 +3867,8 @@ static long do_unlinkat(int dfd, const char __user *pathname) + struct nameidata nd; + struct inode *inode = NULL; + struct inode *delegated_inode = NULL; ++ u64 saved_ino = 0; ++ dev_t saved_dev = 0; + unsigned int lookup_flags = 0; + retry: + name = user_path_parent(dfd, pathname, &nd, lookup_flags); +@@ -3751,10 +3895,22 @@ retry_deleg: + if (d_is_negative(dentry)) + goto slashes; + ihold(inode); ++ ++ if (inode->i_nlink <= 1) { ++ saved_ino = gr_get_ino_from_dentry(dentry); ++ saved_dev = gr_get_dev_from_dentry(dentry); ++ } ++ if (!gr_acl_handle_unlink(dentry, nd.path.mnt)) { ++ error = -EACCES; ++ goto exit2; ++ } ++ + error = security_path_unlink(&nd.path, dentry); + if (error) + goto exit2; + error = vfs_unlink(nd.path.dentry->d_inode, dentry, &delegated_inode); ++ if (!error && (saved_ino || saved_dev)) ++ gr_handle_delete(saved_ino, saved_dev); + exit2: + dput(dentry); + } +@@ -3843,9 +3999,17 @@ retry: + if (IS_ERR(dentry)) + goto out_putname; + ++ if (!gr_acl_handle_symlink(dentry, path.dentry, path.mnt, from)) { ++ error = -EACCES; ++ goto out; ++ } ++ + error = security_path_symlink(&path, dentry, from->name); + if (!error) + error = vfs_symlink(path.dentry->d_inode, dentry, from->name); ++ if (!error) ++ gr_handle_create(dentry, path.mnt); ++out: + done_path_create(&path, dentry); + if (retry_estale(error, lookup_flags)) { + lookup_flags |= LOOKUP_REVAL; +@@ -3949,6 +4113,7 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname, + struct dentry *new_dentry; + struct path old_path, new_path; + struct inode *delegated_inode = NULL; ++ struct filename *to = NULL; + int how = 0; + int error; + +@@ -3972,7 +4137,7 @@ retry: + if (error) + return error; + +- new_dentry = user_path_create(newdfd, newname, &new_path, ++ new_dentry = user_path_create_with_name(newdfd, newname, &new_path, &to, + (how & LOOKUP_REVAL)); + error = PTR_ERR(new_dentry); + if (IS_ERR(new_dentry)) +@@ -3984,11 +4149,28 @@ retry: + error = may_linkat(&old_path); + if (unlikely(error)) + goto out_dput; ++ ++ if (gr_handle_hardlink(old_path.dentry, old_path.mnt, ++ old_path.dentry->d_inode, ++ old_path.dentry->d_inode->i_mode, to)) { ++ error = -EACCES; ++ goto out_dput; ++ } ++ ++ if (!gr_acl_handle_link(new_dentry, new_path.dentry, new_path.mnt, ++ old_path.dentry, old_path.mnt, to)) { ++ error = -EACCES; ++ goto out_dput; ++ } ++ + error = security_path_link(old_path.dentry, &new_path, new_dentry); + if (error) + goto out_dput; + error = vfs_link(old_path.dentry, new_path.dentry->d_inode, new_dentry, &delegated_inode); ++ if (!error) ++ gr_handle_create(new_dentry, new_path.mnt); + out_dput: ++ putname(to); + done_path_create(&new_path, new_dentry); + if (delegated_inode) { + error = break_deleg_wait(&delegated_inode); +@@ -4304,6 +4486,20 @@ retry_deleg: + if (new_dentry == trap) + goto exit5; + ++ if (gr_bad_chroot_rename(old_dentry, oldnd.path.mnt, new_dentry, newnd.path.mnt)) { ++ /* use EXDEV error to cause 'mv' to switch to an alternative ++ * method for usability ++ */ ++ error = -EXDEV; ++ goto exit5; ++ } ++ ++ error = gr_acl_handle_rename(new_dentry, new_dir, newnd.path.mnt, ++ old_dentry, old_dir->d_inode, oldnd.path.mnt, ++ to, flags); ++ if (error) ++ goto exit5; ++ + error = security_path_rename(&oldnd.path, old_dentry, + &newnd.path, new_dentry, flags); + if (error) +@@ -4311,6 +4507,9 @@ retry_deleg: + error = vfs_rename(old_dir->d_inode, old_dentry, + new_dir->d_inode, new_dentry, + &delegated_inode, flags); ++ if (!error) ++ gr_handle_rename(old_dir->d_inode, new_dir->d_inode, old_dentry, ++ new_dentry, oldnd.path.mnt, new_dentry->d_inode ? 1 : 0, flags); + exit5: + dput(new_dentry); + exit4: +@@ -4367,14 +4566,24 @@ EXPORT_SYMBOL(vfs_whiteout); + + int readlink_copy(char __user *buffer, int buflen, const char *link) + { ++ char tmpbuf[64]; ++ const char *newlink; + int len = PTR_ERR(link); ++ + if (IS_ERR(link)) + goto out; + + len = strlen(link); + if (len > (unsigned) buflen) + len = buflen; +- if (copy_to_user(buffer, link, len)) ++ ++ if (len < sizeof(tmpbuf)) { ++ memcpy(tmpbuf, link, len); ++ newlink = tmpbuf; ++ } else ++ newlink = link; ++ ++ if (copy_to_user(buffer, newlink, len)) + len = -EFAULT; + out: + return len; +diff --git a/fs/namespace.c b/fs/namespace.c +index bbde147..f4deeba 100644 +--- a/fs/namespace.c ++++ b/fs/namespace.c +@@ -1447,6 +1447,9 @@ static int do_umount(struct mount *mnt, int flags) + if (!(sb->s_flags & MS_RDONLY)) + retval = do_remount_sb(sb, MS_RDONLY, NULL, 0); + up_write(&sb->s_umount); ++ ++ gr_log_remount(mnt->mnt_devname, retval); ++ + return retval; + } + +@@ -1469,6 +1472,9 @@ static int do_umount(struct mount *mnt, int flags) + } + unlock_mount_hash(); + namespace_unlock(); ++ ++ gr_log_unmount(mnt->mnt_devname, retval); ++ + return retval; + } + +@@ -1519,7 +1525,7 @@ static inline bool may_mount(void) + * unixes. Our API is identical to OSF/1 to avoid making a mess of AMD + */ + +-SYSCALL_DEFINE2(umount, char __user *, name, int, flags) ++SYSCALL_DEFINE2(umount, const char __user *, name, int, flags) + { + struct path path; + struct mount *mnt; +@@ -1564,7 +1570,7 @@ out: + /* + * The 2.0 compatible umount. No flags. + */ +-SYSCALL_DEFINE1(oldumount, char __user *, name) ++SYSCALL_DEFINE1(oldumount, const char __user *, name) + { + return sys_umount(name, 0); + } +@@ -2632,6 +2638,16 @@ long do_mount(const char *dev_name, const char __user *dir_name, + MS_NOATIME | MS_NODIRATIME | MS_RELATIME| MS_KERNMOUNT | + MS_STRICTATIME); + ++ if (gr_handle_rofs_mount(path.dentry, path.mnt, mnt_flags)) { ++ retval = -EPERM; ++ goto dput_out; ++ } ++ ++ if (gr_handle_chroot_mount(path.dentry, path.mnt, dev_name)) { ++ retval = -EPERM; ++ goto dput_out; ++ } ++ + if (flags & MS_REMOUNT) + retval = do_remount(&path, flags & ~MS_REMOUNT, mnt_flags, + data_page); +@@ -2645,7 +2661,10 @@ long do_mount(const char *dev_name, const char __user *dir_name, + retval = do_new_mount(&path, type_page, flags, mnt_flags, + dev_name, data_page); + dput_out: ++ gr_log_mount(dev_name, &path, retval); ++ + path_put(&path); ++ + return retval; + } + +@@ -2663,7 +2682,7 @@ static void free_mnt_ns(struct mnt_namespace *ns) + * number incrementing at 10Ghz will take 12,427 years to wrap which + * is effectively never, so we can ignore the possibility. + */ +-static atomic64_t mnt_ns_seq = ATOMIC64_INIT(1); ++static atomic64_unchecked_t mnt_ns_seq = ATOMIC64_INIT(1); + + static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *user_ns) + { +@@ -2678,7 +2697,7 @@ static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *user_ns) + kfree(new_ns); + return ERR_PTR(ret); + } +- new_ns->seq = atomic64_add_return(1, &mnt_ns_seq); ++ new_ns->seq = atomic64_inc_return_unchecked(&mnt_ns_seq); + atomic_set(&new_ns->count, 1); + new_ns->root = NULL; + INIT_LIST_HEAD(&new_ns->list); +@@ -2688,7 +2707,7 @@ static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *user_ns) + return new_ns; + } + +-struct mnt_namespace *copy_mnt_ns(unsigned long flags, struct mnt_namespace *ns, ++__latent_entropy struct mnt_namespace *copy_mnt_ns(unsigned long flags, struct mnt_namespace *ns, + struct user_namespace *user_ns, struct fs_struct *new_fs) + { + struct mnt_namespace *new_ns; +@@ -2809,8 +2828,8 @@ struct dentry *mount_subtree(struct vfsmount *mnt, const char *name) + } + EXPORT_SYMBOL(mount_subtree); + +-SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, +- char __user *, type, unsigned long, flags, void __user *, data) ++SYSCALL_DEFINE5(mount, const char __user *, dev_name, const char __user *, dir_name, ++ const char __user *, type, unsigned long, flags, void __user *, data) + { + int ret; + char *kernel_type; +@@ -2916,6 +2935,11 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root, + if (error) + goto out2; + ++ if (gr_handle_chroot_pivot()) { ++ error = -EPERM; ++ goto out2; ++ } ++ + get_fs_root(current->fs, &root); + old_mp = lock_mount(&old); + error = PTR_ERR(old_mp); +@@ -3187,7 +3211,7 @@ static int mntns_install(struct nsproxy *nsproxy, void *ns) + !ns_capable(current_user_ns(), CAP_SYS_ADMIN)) + return -EPERM; + +- if (fs->users != 1) ++ if (atomic_read(&fs->users) != 1) + return -EINVAL; + + get_mnt_ns(mnt_ns); +diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c +index 02f8d09..a5c25d1 100644 +--- a/fs/nfs/callback_xdr.c ++++ b/fs/nfs/callback_xdr.c +@@ -51,7 +51,7 @@ struct callback_op { + callback_decode_arg_t decode_args; + callback_encode_res_t encode_res; + long res_maxsize; +-}; ++} __do_const; + + static struct callback_op callback_ops[]; + +diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c +index 00689a8..b162632 100644 +--- a/fs/nfs/inode.c ++++ b/fs/nfs/inode.c +@@ -1232,16 +1232,16 @@ static int nfs_size_need_update(const struct inode *inode, const struct nfs_fatt + return nfs_size_to_loff_t(fattr->size) > i_size_read(inode); + } + +-static atomic_long_t nfs_attr_generation_counter; ++static atomic_long_unchecked_t nfs_attr_generation_counter; + + static unsigned long nfs_read_attr_generation_counter(void) + { +- return atomic_long_read(&nfs_attr_generation_counter); ++ return atomic_long_read_unchecked(&nfs_attr_generation_counter); + } + + unsigned long nfs_inc_attr_generation_counter(void) + { +- return atomic_long_inc_return(&nfs_attr_generation_counter); ++ return atomic_long_inc_return_unchecked(&nfs_attr_generation_counter); + } + + void nfs_fattr_init(struct nfs_fattr *fattr) +diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c +index 0beb023..3f685ec 100644 +--- a/fs/nfsd/nfs4proc.c ++++ b/fs/nfsd/nfs4proc.c +@@ -1198,7 +1198,7 @@ struct nfsd4_operation { + nfsd4op_rsize op_rsize_bop; + stateid_getter op_get_currentstateid; + stateid_setter op_set_currentstateid; +-}; ++} __do_const; + + static struct nfsd4_operation nfsd4_ops[]; + +diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c +index 2a77603..68e0e37 100644 +--- a/fs/nfsd/nfs4xdr.c ++++ b/fs/nfsd/nfs4xdr.c +@@ -1543,7 +1543,7 @@ nfsd4_decode_notsupp(struct nfsd4_compoundargs *argp, void *p) + + typedef __be32(*nfsd4_dec)(struct nfsd4_compoundargs *argp, void *); + +-static nfsd4_dec nfsd4_dec_ops[] = { ++static const nfsd4_dec nfsd4_dec_ops[] = { + [OP_ACCESS] = (nfsd4_dec)nfsd4_decode_access, + [OP_CLOSE] = (nfsd4_dec)nfsd4_decode_close, + [OP_COMMIT] = (nfsd4_dec)nfsd4_decode_commit, +diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c +index 122f691..a00e2e0 100644 +--- a/fs/nfsd/nfscache.c ++++ b/fs/nfsd/nfscache.c +@@ -537,7 +537,7 @@ nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp) + struct kvec *resv = &rqstp->rq_res.head[0], *cachv; + u32 hash; + struct nfsd_drc_bucket *b; +- int len; ++ long len; + size_t bufsize = 0; + + if (!rp) +@@ -546,11 +546,14 @@ nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp) + hash = nfsd_cache_hash(rp->c_xid); + b = &drc_hashtbl[hash]; + +- len = resv->iov_len - ((char*)statp - (char*)resv->iov_base); +- len >>= 2; ++ if (statp) { ++ len = (char*)statp - (char*)resv->iov_base; ++ len = resv->iov_len - len; ++ len >>= 2; ++ } + + /* Don't cache excessive amounts of data and XDR failures */ +- if (!statp || len > (256 >> 2)) { ++ if (!statp || len > (256 >> 2) || len < 0) { + nfsd_reply_cache_free(b, rp); + return; + } +@@ -558,7 +561,7 @@ nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp) + switch (cachetype) { + case RC_REPLSTAT: + if (len != 1) +- printk("nfsd: RC_REPLSTAT/reply len %d!\n",len); ++ printk("nfsd: RC_REPLSTAT/reply len %ld!\n",len); + rp->c_replstat = *statp; + break; + case RC_REPLBUFF: +diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c +index 989129e..42e019e 100644 +--- a/fs/nfsd/vfs.c ++++ b/fs/nfsd/vfs.c +@@ -872,7 +872,7 @@ __be32 nfsd_readv(struct file *file, loff_t offset, struct kvec *vec, int vlen, + + oldfs = get_fs(); + set_fs(KERNEL_DS); +- host_err = vfs_readv(file, (struct iovec __user *)vec, vlen, &offset); ++ host_err = vfs_readv(file, (struct iovec __force_user *)vec, vlen, &offset); + set_fs(oldfs); + return nfsd_finish_read(file, count, host_err); + } +@@ -960,7 +960,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, + + /* Write the data. */ + oldfs = get_fs(); set_fs(KERNEL_DS); +- host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &pos); ++ host_err = vfs_writev(file, (struct iovec __force_user *)vec, vlen, &pos); + set_fs(oldfs); + if (host_err < 0) + goto out_nfserr; +@@ -1502,7 +1502,7 @@ nfsd_readlink(struct svc_rqst *rqstp, struct svc_fh *fhp, char *buf, int *lenp) + */ + + oldfs = get_fs(); set_fs(KERNEL_DS); +- host_err = inode->i_op->readlink(path.dentry, (char __user *)buf, *lenp); ++ host_err = inode->i_op->readlink(path.dentry, (char __force_user *)buf, *lenp); + set_fs(oldfs); + + if (host_err < 0) +diff --git a/fs/nls/nls_base.c b/fs/nls/nls_base.c +index 52ccd34..7a6b202 100644 +--- a/fs/nls/nls_base.c ++++ b/fs/nls/nls_base.c +@@ -234,21 +234,25 @@ EXPORT_SYMBOL(utf16s_to_utf8s); + + int __register_nls(struct nls_table *nls, struct module *owner) + { +- struct nls_table ** tmp = &tables; ++ struct nls_table *tmp = tables; + + if (nls->next) + return -EBUSY; + +- nls->owner = owner; ++ pax_open_kernel(); ++ *(void **)&nls->owner = owner; ++ pax_close_kernel(); + spin_lock(&nls_lock); +- while (*tmp) { +- if (nls == *tmp) { ++ while (tmp) { ++ if (nls == tmp) { + spin_unlock(&nls_lock); + return -EBUSY; + } +- tmp = &(*tmp)->next; ++ tmp = tmp->next; + } +- nls->next = tables; ++ pax_open_kernel(); ++ *(struct nls_table **)&nls->next = tables; ++ pax_close_kernel(); + tables = nls; + spin_unlock(&nls_lock); + return 0; +@@ -257,12 +261,14 @@ EXPORT_SYMBOL(__register_nls); + + int unregister_nls(struct nls_table * nls) + { +- struct nls_table ** tmp = &tables; ++ struct nls_table * const * tmp = &tables; + + spin_lock(&nls_lock); + while (*tmp) { + if (nls == *tmp) { +- *tmp = nls->next; ++ pax_open_kernel(); ++ *(struct nls_table **)tmp = nls->next; ++ pax_close_kernel(); + spin_unlock(&nls_lock); + return 0; + } +@@ -272,7 +278,7 @@ int unregister_nls(struct nls_table * nls) + return -EINVAL; + } + +-static struct nls_table *find_nls(char *charset) ++static struct nls_table *find_nls(const char *charset) + { + struct nls_table *nls; + spin_lock(&nls_lock); +@@ -288,7 +294,7 @@ static struct nls_table *find_nls(char *charset) + return nls; + } + +-struct nls_table *load_nls(char *charset) ++struct nls_table *load_nls(const char *charset) + { + return try_then_request_module(find_nls(charset), "nls_%s", charset); + } +diff --git a/fs/nls/nls_euc-jp.c b/fs/nls/nls_euc-jp.c +index 162b3f1..6076a7c 100644 +--- a/fs/nls/nls_euc-jp.c ++++ b/fs/nls/nls_euc-jp.c +@@ -560,8 +560,10 @@ static int __init init_nls_euc_jp(void) + p_nls = load_nls("cp932"); + + if (p_nls) { +- table.charset2upper = p_nls->charset2upper; +- table.charset2lower = p_nls->charset2lower; ++ pax_open_kernel(); ++ *(const unsigned char **)&table.charset2upper = p_nls->charset2upper; ++ *(const unsigned char **)&table.charset2lower = p_nls->charset2lower; ++ pax_close_kernel(); + return register_nls(&table); + } + +diff --git a/fs/nls/nls_koi8-ru.c b/fs/nls/nls_koi8-ru.c +index a80a741..7b96e1b 100644 +--- a/fs/nls/nls_koi8-ru.c ++++ b/fs/nls/nls_koi8-ru.c +@@ -62,8 +62,10 @@ static int __init init_nls_koi8_ru(void) + p_nls = load_nls("koi8-u"); + + if (p_nls) { +- table.charset2upper = p_nls->charset2upper; +- table.charset2lower = p_nls->charset2lower; ++ pax_open_kernel(); ++ *(const unsigned char **)&table.charset2upper = p_nls->charset2upper; ++ *(const unsigned char **)&table.charset2lower = p_nls->charset2lower; ++ pax_close_kernel(); + return register_nls(&table); + } + +diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c +index c991616..5ae51af 100644 +--- a/fs/notify/fanotify/fanotify_user.c ++++ b/fs/notify/fanotify/fanotify_user.c +@@ -216,8 +216,8 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, + + fd = fanotify_event_metadata.fd; + ret = -EFAULT; +- if (copy_to_user(buf, &fanotify_event_metadata, +- fanotify_event_metadata.event_len)) ++ if (fanotify_event_metadata.event_len > sizeof fanotify_event_metadata || ++ copy_to_user(buf, &fanotify_event_metadata, fanotify_event_metadata.event_len)) + goto out_close_fd; + + #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS +diff --git a/fs/notify/notification.c b/fs/notify/notification.c +index a95d8e0..a91a5fd 100644 +--- a/fs/notify/notification.c ++++ b/fs/notify/notification.c +@@ -48,7 +48,7 @@ + #include <linux/fsnotify_backend.h> + #include "fsnotify.h" + +-static atomic_t fsnotify_sync_cookie = ATOMIC_INIT(0); ++static atomic_unchecked_t fsnotify_sync_cookie = ATOMIC_INIT(0); + + /** + * fsnotify_get_cookie - return a unique cookie for use in synchronizing events. +@@ -56,7 +56,7 @@ static atomic_t fsnotify_sync_cookie = ATOMIC_INIT(0); + */ + u32 fsnotify_get_cookie(void) + { +- return atomic_inc_return(&fsnotify_sync_cookie); ++ return atomic_inc_return_unchecked(&fsnotify_sync_cookie); + } + EXPORT_SYMBOL_GPL(fsnotify_get_cookie); + +diff --git a/fs/ntfs/dir.c b/fs/ntfs/dir.c +index 9e38daf..5727cae 100644 +--- a/fs/ntfs/dir.c ++++ b/fs/ntfs/dir.c +@@ -1310,7 +1310,7 @@ find_next_index_buffer: + ia = (INDEX_ALLOCATION*)(kaddr + (ia_pos & ~PAGE_CACHE_MASK & + ~(s64)(ndir->itype.index.block_size - 1))); + /* Bounds checks. */ +- if (unlikely((u8*)ia < kaddr || (u8*)ia > kaddr + PAGE_CACHE_SIZE)) { ++ if (unlikely(!kaddr || (u8*)ia < kaddr || (u8*)ia > kaddr + PAGE_CACHE_SIZE)) { + ntfs_error(sb, "Out of bounds check failed. Corrupt directory " + "inode 0x%lx or driver bug.", vdir->i_ino); + goto err_out; +diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c +index 643faa4..ef9027e 100644 +--- a/fs/ntfs/file.c ++++ b/fs/ntfs/file.c +@@ -1280,7 +1280,7 @@ static inline size_t ntfs_copy_from_user(struct page **pages, + char *addr; + size_t total = 0; + unsigned len; +- int left; ++ unsigned left; + + do { + len = PAGE_CACHE_SIZE - ofs; +diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c +index 9e1e112..241a52a 100644 +--- a/fs/ntfs/super.c ++++ b/fs/ntfs/super.c +@@ -688,7 +688,7 @@ static struct buffer_head *read_ntfs_boot_sector(struct super_block *sb, + if (!silent) + ntfs_error(sb, "Primary boot sector is invalid."); + } else if (!silent) +- ntfs_error(sb, read_err_str, "primary"); ++ ntfs_error(sb, read_err_str, "%s", "primary"); + if (!(NTFS_SB(sb)->on_errors & ON_ERRORS_RECOVER)) { + if (bh_primary) + brelse(bh_primary); +@@ -704,7 +704,7 @@ static struct buffer_head *read_ntfs_boot_sector(struct super_block *sb, + goto hotfix_primary_boot_sector; + brelse(bh_backup); + } else if (!silent) +- ntfs_error(sb, read_err_str, "backup"); ++ ntfs_error(sb, read_err_str, "%s", "backup"); + /* Try to read NT3.51- backup boot sector. */ + if ((bh_backup = sb_bread(sb, nr_blocks >> 1))) { + if (is_boot_sector_ntfs(sb, (NTFS_BOOT_SECTOR*) +@@ -715,7 +715,7 @@ static struct buffer_head *read_ntfs_boot_sector(struct super_block *sb, + "sector."); + brelse(bh_backup); + } else if (!silent) +- ntfs_error(sb, read_err_str, "backup"); ++ ntfs_error(sb, read_err_str, "%s", "backup"); + /* We failed. Cleanup and return. */ + if (bh_primary) + brelse(bh_primary); +diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c +index 0440134..d52c93a 100644 +--- a/fs/ocfs2/localalloc.c ++++ b/fs/ocfs2/localalloc.c +@@ -1320,7 +1320,7 @@ static int ocfs2_local_alloc_slide_window(struct ocfs2_super *osb, + goto bail; + } + +- atomic_inc(&osb->alloc_stats.moves); ++ atomic_inc_unchecked(&osb->alloc_stats.moves); + + bail: + if (handle) +diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h +index bbec539..7b266d5 100644 +--- a/fs/ocfs2/ocfs2.h ++++ b/fs/ocfs2/ocfs2.h +@@ -236,11 +236,11 @@ enum ocfs2_vol_state + + struct ocfs2_alloc_stats + { +- atomic_t moves; +- atomic_t local_data; +- atomic_t bitmap_data; +- atomic_t bg_allocs; +- atomic_t bg_extends; ++ atomic_unchecked_t moves; ++ atomic_unchecked_t local_data; ++ atomic_unchecked_t bitmap_data; ++ atomic_unchecked_t bg_allocs; ++ atomic_unchecked_t bg_extends; + }; + + enum ocfs2_local_alloc_state +diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c +index d81f6e2..e794c38 100644 +--- a/fs/ocfs2/refcounttree.c ++++ b/fs/ocfs2/refcounttree.c +@@ -4278,7 +4278,7 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, + error = posix_acl_create(dir, &mode, &default_acl, &acl); + if (error) { + mlog_errno(error); +- goto out; ++ return error; + } + + error = ocfs2_create_inode_in_orphan(dir, mode, +diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c +index 0cb889a..6a26b24 100644 +--- a/fs/ocfs2/suballoc.c ++++ b/fs/ocfs2/suballoc.c +@@ -867,7 +867,7 @@ static int ocfs2_reserve_suballoc_bits(struct ocfs2_super *osb, + mlog_errno(status); + goto bail; + } +- atomic_inc(&osb->alloc_stats.bg_extends); ++ atomic_inc_unchecked(&osb->alloc_stats.bg_extends); + + /* You should never ask for this much metadata */ + BUG_ON(bits_wanted > +@@ -2014,7 +2014,7 @@ int ocfs2_claim_metadata(handle_t *handle, + mlog_errno(status); + goto bail; + } +- atomic_inc(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); ++ atomic_inc_unchecked(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); + + *suballoc_loc = res.sr_bg_blkno; + *suballoc_bit_start = res.sr_bit_offset; +@@ -2180,7 +2180,7 @@ int ocfs2_claim_new_inode_at_loc(handle_t *handle, + trace_ocfs2_claim_new_inode_at_loc((unsigned long long)di_blkno, + res->sr_bits); + +- atomic_inc(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); ++ atomic_inc_unchecked(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); + + BUG_ON(res->sr_bits != 1); + +@@ -2222,7 +2222,7 @@ int ocfs2_claim_new_inode(handle_t *handle, + mlog_errno(status); + goto bail; + } +- atomic_inc(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); ++ atomic_inc_unchecked(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); + + BUG_ON(res.sr_bits != 1); + +@@ -2326,7 +2326,7 @@ int __ocfs2_claim_clusters(handle_t *handle, + cluster_start, + num_clusters); + if (!status) +- atomic_inc(&osb->alloc_stats.local_data); ++ atomic_inc_unchecked(&osb->alloc_stats.local_data); + } else { + if (min_clusters > (osb->bitmap_cpg - 1)) { + /* The only paths asking for contiguousness +@@ -2352,7 +2352,7 @@ int __ocfs2_claim_clusters(handle_t *handle, + ocfs2_desc_bitmap_to_cluster_off(ac->ac_inode, + res.sr_bg_blkno, + res.sr_bit_offset); +- atomic_inc(&osb->alloc_stats.bitmap_data); ++ atomic_inc_unchecked(&osb->alloc_stats.bitmap_data); + *num_clusters = res.sr_bits; + } + } +diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c +index 93c85bc..02f68a4 100644 +--- a/fs/ocfs2/super.c ++++ b/fs/ocfs2/super.c +@@ -300,11 +300,11 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len) + "%10s => GlobalAllocs: %d LocalAllocs: %d " + "SubAllocs: %d LAWinMoves: %d SAExtends: %d\n", + "Stats", +- atomic_read(&osb->alloc_stats.bitmap_data), +- atomic_read(&osb->alloc_stats.local_data), +- atomic_read(&osb->alloc_stats.bg_allocs), +- atomic_read(&osb->alloc_stats.moves), +- atomic_read(&osb->alloc_stats.bg_extends)); ++ atomic_read_unchecked(&osb->alloc_stats.bitmap_data), ++ atomic_read_unchecked(&osb->alloc_stats.local_data), ++ atomic_read_unchecked(&osb->alloc_stats.bg_allocs), ++ atomic_read_unchecked(&osb->alloc_stats.moves), ++ atomic_read_unchecked(&osb->alloc_stats.bg_extends)); + + out += snprintf(buf + out, len - out, + "%10s => State: %u Descriptor: %llu Size: %u bits " +@@ -2104,11 +2104,11 @@ static int ocfs2_initialize_super(struct super_block *sb, + + mutex_init(&osb->system_file_mutex); + +- atomic_set(&osb->alloc_stats.moves, 0); +- atomic_set(&osb->alloc_stats.local_data, 0); +- atomic_set(&osb->alloc_stats.bitmap_data, 0); +- atomic_set(&osb->alloc_stats.bg_allocs, 0); +- atomic_set(&osb->alloc_stats.bg_extends, 0); ++ atomic_set_unchecked(&osb->alloc_stats.moves, 0); ++ atomic_set_unchecked(&osb->alloc_stats.local_data, 0); ++ atomic_set_unchecked(&osb->alloc_stats.bitmap_data, 0); ++ atomic_set_unchecked(&osb->alloc_stats.bg_allocs, 0); ++ atomic_set_unchecked(&osb->alloc_stats.bg_extends, 0); + + /* Copy the blockcheck stats from the superblock probe */ + osb->osb_ecc_stats = *stats; +diff --git a/fs/open.c b/fs/open.c +index de92c13..52d2a6c 100644 +--- a/fs/open.c ++++ b/fs/open.c +@@ -32,6 +32,8 @@ + #include <linux/dnotify.h> + #include <linux/compat.h> + ++#define CREATE_TRACE_POINTS ++#include <trace/events/fs.h> + #include "internal.h" + + int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, +@@ -103,6 +105,8 @@ long vfs_truncate(struct path *path, loff_t length) + error = locks_verify_truncate(inode, NULL, length); + if (!error) + error = security_path_truncate(path); ++ if (!error && !gr_acl_handle_truncate(path->dentry, path->mnt)) ++ error = -EACCES; + if (!error) + error = do_truncate(path->dentry, length, 0, NULL); + +@@ -187,6 +191,8 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) + error = locks_verify_truncate(inode, f.file, length); + if (!error) + error = security_path_truncate(&f.file->f_path); ++ if (!error && !gr_acl_handle_truncate(f.file->f_path.dentry, f.file->f_path.mnt)) ++ error = -EACCES; + if (!error) + error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file); + sb_end_write(inode->i_sb); +@@ -380,6 +386,9 @@ retry: + if (__mnt_is_readonly(path.mnt)) + res = -EROFS; + ++ if (!res && !gr_acl_handle_access(path.dentry, path.mnt, mode)) ++ res = -EACCES; ++ + out_path_release: + path_put(&path); + if (retry_estale(res, lookup_flags)) { +@@ -411,6 +420,8 @@ retry: + if (error) + goto dput_and_out; + ++ gr_log_chdir(path.dentry, path.mnt); ++ + set_fs_pwd(current->fs, &path); + + dput_and_out: +@@ -440,6 +451,13 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) + goto out_putf; + + error = inode_permission(inode, MAY_EXEC | MAY_CHDIR); ++ ++ if (!error && !gr_chroot_fchdir(f.file->f_path.dentry, f.file->f_path.mnt)) ++ error = -EPERM; ++ ++ if (!error) ++ gr_log_chdir(f.file->f_path.dentry, f.file->f_path.mnt); ++ + if (!error) + set_fs_pwd(current->fs, &f.file->f_path); + out_putf: +@@ -469,7 +487,13 @@ retry: + if (error) + goto dput_and_out; + ++ if (gr_handle_chroot_chroot(path.dentry, path.mnt)) ++ goto dput_and_out; ++ + set_fs_root(current->fs, &path); ++ ++ gr_handle_chroot_chdir(&path); ++ + error = 0; + dput_and_out: + path_put(&path); +@@ -493,6 +517,16 @@ static int chmod_common(struct path *path, umode_t mode) + return error; + retry_deleg: + mutex_lock(&inode->i_mutex); ++ ++ if (!gr_acl_handle_chmod(path->dentry, path->mnt, &mode)) { ++ error = -EACCES; ++ goto out_unlock; ++ } ++ if (gr_handle_chroot_chmod(path->dentry, path->mnt, mode)) { ++ error = -EACCES; ++ goto out_unlock; ++ } ++ + error = security_path_chmod(path, mode); + if (error) + goto out_unlock; +@@ -558,6 +592,9 @@ static int chown_common(struct path *path, uid_t user, gid_t group) + uid = make_kuid(current_user_ns(), user); + gid = make_kgid(current_user_ns(), group); + ++ if (!gr_acl_handle_chown(path->dentry, path->mnt)) ++ return -EACCES; ++ + newattrs.ia_valid = ATTR_CTIME; + if (user != (uid_t) -1) { + if (!uid_valid(uid)) +@@ -1002,6 +1039,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode) + } else { + fsnotify_open(f); + fd_install(fd, f); ++ trace_do_sys_open(tmp->name, flags, mode); + } + } + putname(tmp); +diff --git a/fs/pipe.c b/fs/pipe.c +index 21981e5..3d5f55c 100644 +--- a/fs/pipe.c ++++ b/fs/pipe.c +@@ -56,7 +56,7 @@ unsigned int pipe_min_size = PAGE_SIZE; + + static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass) + { +- if (pipe->files) ++ if (atomic_read(&pipe->files)) + mutex_lock_nested(&pipe->mutex, subclass); + } + +@@ -71,7 +71,7 @@ EXPORT_SYMBOL(pipe_lock); + + void pipe_unlock(struct pipe_inode_info *pipe) + { +- if (pipe->files) ++ if (atomic_read(&pipe->files)) + mutex_unlock(&pipe->mutex); + } + EXPORT_SYMBOL(pipe_unlock); +@@ -292,9 +292,9 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to) + } + if (bufs) /* More to do? */ + continue; +- if (!pipe->writers) ++ if (!atomic_read(&pipe->writers)) + break; +- if (!pipe->waiting_writers) { ++ if (!atomic_read(&pipe->waiting_writers)) { + /* syscall merging: Usually we must not sleep + * if O_NONBLOCK is set, or if we got some data. + * But if a writer sleeps in kernel space, then +@@ -351,7 +351,7 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from) + + __pipe_lock(pipe); + +- if (!pipe->readers) { ++ if (!atomic_read(&pipe->readers)) { + send_sig(SIGPIPE, current, 0); + ret = -EPIPE; + goto out; +@@ -387,7 +387,7 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from) + for (;;) { + int bufs; + +- if (!pipe->readers) { ++ if (!atomic_read(&pipe->readers)) { + send_sig(SIGPIPE, current, 0); + if (!ret) + ret = -EPIPE; +@@ -455,9 +455,9 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from) + kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); + do_wakeup = 0; + } +- pipe->waiting_writers++; ++ atomic_inc(&pipe->waiting_writers); + pipe_wait(pipe); +- pipe->waiting_writers--; ++ atomic_dec(&pipe->waiting_writers); + } + out: + __pipe_unlock(pipe); +@@ -512,7 +512,7 @@ pipe_poll(struct file *filp, poll_table *wait) + mask = 0; + if (filp->f_mode & FMODE_READ) { + mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0; +- if (!pipe->writers && filp->f_version != pipe->w_counter) ++ if (!atomic_read(&pipe->writers) && filp->f_version != pipe->w_counter) + mask |= POLLHUP; + } + +@@ -522,7 +522,7 @@ pipe_poll(struct file *filp, poll_table *wait) + * Most Unices do not set POLLERR for FIFOs but on Linux they + * behave exactly like pipes for poll(). + */ +- if (!pipe->readers) ++ if (!atomic_read(&pipe->readers)) + mask |= POLLERR; + } + +@@ -534,7 +534,7 @@ static void put_pipe_info(struct inode *inode, struct pipe_inode_info *pipe) + int kill = 0; + + spin_lock(&inode->i_lock); +- if (!--pipe->files) { ++ if (atomic_dec_and_test(&pipe->files)) { + inode->i_pipe = NULL; + kill = 1; + } +@@ -551,11 +551,11 @@ pipe_release(struct inode *inode, struct file *file) + + __pipe_lock(pipe); + if (file->f_mode & FMODE_READ) +- pipe->readers--; ++ atomic_dec(&pipe->readers); + if (file->f_mode & FMODE_WRITE) +- pipe->writers--; ++ atomic_dec(&pipe->writers); + +- if (pipe->readers || pipe->writers) { ++ if (atomic_read(&pipe->readers) || atomic_read(&pipe->writers)) { + wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLERR | POLLHUP); + kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); + kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); +@@ -620,7 +620,7 @@ void free_pipe_info(struct pipe_inode_info *pipe) + kfree(pipe); + } + +-static struct vfsmount *pipe_mnt __read_mostly; ++struct vfsmount *pipe_mnt __read_mostly; + + /* + * pipefs_dname() is called from d_path(). +@@ -650,8 +650,9 @@ static struct inode * get_pipe_inode(void) + goto fail_iput; + + inode->i_pipe = pipe; +- pipe->files = 2; +- pipe->readers = pipe->writers = 1; ++ atomic_set(&pipe->files, 2); ++ atomic_set(&pipe->readers, 1); ++ atomic_set(&pipe->writers, 1); + inode->i_fop = &pipefifo_fops; + + /* +@@ -830,17 +831,17 @@ static int fifo_open(struct inode *inode, struct file *filp) + spin_lock(&inode->i_lock); + if (inode->i_pipe) { + pipe = inode->i_pipe; +- pipe->files++; ++ atomic_inc(&pipe->files); + spin_unlock(&inode->i_lock); + } else { + spin_unlock(&inode->i_lock); + pipe = alloc_pipe_info(); + if (!pipe) + return -ENOMEM; +- pipe->files = 1; ++ atomic_set(&pipe->files, 1); + spin_lock(&inode->i_lock); + if (unlikely(inode->i_pipe)) { +- inode->i_pipe->files++; ++ atomic_inc(&inode->i_pipe->files); + spin_unlock(&inode->i_lock); + free_pipe_info(pipe); + pipe = inode->i_pipe; +@@ -865,10 +866,10 @@ static int fifo_open(struct inode *inode, struct file *filp) + * opened, even when there is no process writing the FIFO. + */ + pipe->r_counter++; +- if (pipe->readers++ == 0) ++ if (atomic_inc_return(&pipe->readers) == 1) + wake_up_partner(pipe); + +- if (!is_pipe && !pipe->writers) { ++ if (!is_pipe && !atomic_read(&pipe->writers)) { + if ((filp->f_flags & O_NONBLOCK)) { + /* suppress POLLHUP until we have + * seen a writer */ +@@ -887,14 +888,14 @@ static int fifo_open(struct inode *inode, struct file *filp) + * errno=ENXIO when there is no process reading the FIFO. + */ + ret = -ENXIO; +- if (!is_pipe && (filp->f_flags & O_NONBLOCK) && !pipe->readers) ++ if (!is_pipe && (filp->f_flags & O_NONBLOCK) && !atomic_read(&pipe->readers)) + goto err; + + pipe->w_counter++; +- if (!pipe->writers++) ++ if (atomic_inc_return(&pipe->writers) == 1) + wake_up_partner(pipe); + +- if (!is_pipe && !pipe->readers) { ++ if (!is_pipe && !atomic_read(&pipe->readers)) { + if (wait_for_partner(pipe, &pipe->r_counter)) + goto err_wr; + } +@@ -908,11 +909,11 @@ static int fifo_open(struct inode *inode, struct file *filp) + * the process can at least talk to itself. + */ + +- pipe->readers++; +- pipe->writers++; ++ atomic_inc(&pipe->readers); ++ atomic_inc(&pipe->writers); + pipe->r_counter++; + pipe->w_counter++; +- if (pipe->readers == 1 || pipe->writers == 1) ++ if (atomic_read(&pipe->readers) == 1 || atomic_read(&pipe->writers) == 1) + wake_up_partner(pipe); + break; + +@@ -926,13 +927,13 @@ static int fifo_open(struct inode *inode, struct file *filp) + return 0; + + err_rd: +- if (!--pipe->readers) ++ if (atomic_dec_and_test(&pipe->readers)) + wake_up_interruptible(&pipe->wait); + ret = -ERESTARTSYS; + goto err; + + err_wr: +- if (!--pipe->writers) ++ if (atomic_dec_and_test(&pipe->writers)) + wake_up_interruptible(&pipe->wait); + ret = -ERESTARTSYS; + goto err; +diff --git a/fs/posix_acl.c b/fs/posix_acl.c +index 0855f77..6787d50 100644 +--- a/fs/posix_acl.c ++++ b/fs/posix_acl.c +@@ -20,6 +20,7 @@ + #include <linux/xattr.h> + #include <linux/export.h> + #include <linux/user_namespace.h> ++#include <linux/grsecurity.h> + + struct posix_acl **acl_by_type(struct inode *inode, int type) + { +@@ -277,7 +278,7 @@ posix_acl_equiv_mode(const struct posix_acl *acl, umode_t *mode_p) + } + } + if (mode_p) +- *mode_p = (*mode_p & ~S_IRWXUGO) | mode; ++ *mode_p = ((*mode_p & ~S_IRWXUGO) | mode) & ~gr_acl_umask(); + return not_equiv; + } + EXPORT_SYMBOL(posix_acl_equiv_mode); +@@ -427,7 +428,7 @@ static int posix_acl_create_masq(struct posix_acl *acl, umode_t *mode_p) + mode &= (group_obj->e_perm << 3) | ~S_IRWXG; + } + +- *mode_p = (*mode_p & ~S_IRWXUGO) | mode; ++ *mode_p = ((*mode_p & ~S_IRWXUGO) | mode) & ~gr_acl_umask(); + return not_equiv; + } + +@@ -485,6 +486,8 @@ __posix_acl_create(struct posix_acl **acl, gfp_t gfp, umode_t *mode_p) + struct posix_acl *clone = posix_acl_clone(*acl, gfp); + int err = -ENOMEM; + if (clone) { ++ *mode_p &= ~gr_acl_umask(); ++ + err = posix_acl_create_masq(clone, mode_p); + if (err < 0) { + posix_acl_release(clone); +@@ -659,11 +662,12 @@ struct posix_acl * + posix_acl_from_xattr(struct user_namespace *user_ns, + const void *value, size_t size) + { +- posix_acl_xattr_header *header = (posix_acl_xattr_header *)value; +- posix_acl_xattr_entry *entry = (posix_acl_xattr_entry *)(header+1), *end; ++ const posix_acl_xattr_header *header = (const posix_acl_xattr_header *)value; ++ const posix_acl_xattr_entry *entry = (const posix_acl_xattr_entry *)(header+1), *end; + int count; + struct posix_acl *acl; + struct posix_acl_entry *acl_e; ++ umode_t umask = gr_acl_umask(); + + if (!value) + return NULL; +@@ -689,12 +693,18 @@ posix_acl_from_xattr(struct user_namespace *user_ns, + + switch(acl_e->e_tag) { + case ACL_USER_OBJ: ++ acl_e->e_perm &= ~((umask & S_IRWXU) >> 6); ++ break; + case ACL_GROUP_OBJ: + case ACL_MASK: ++ acl_e->e_perm &= ~((umask & S_IRWXG) >> 3); ++ break; + case ACL_OTHER: ++ acl_e->e_perm &= ~(umask & S_IRWXO); + break; + + case ACL_USER: ++ acl_e->e_perm &= ~((umask & S_IRWXU) >> 6); + acl_e->e_uid = + make_kuid(user_ns, + le32_to_cpu(entry->e_id)); +@@ -702,6 +712,7 @@ posix_acl_from_xattr(struct user_namespace *user_ns, + goto fail; + break; + case ACL_GROUP: ++ acl_e->e_perm &= ~((umask & S_IRWXG) >> 3); + acl_e->e_gid = + make_kgid(user_ns, + le32_to_cpu(entry->e_id)); +diff --git a/fs/proc/Kconfig b/fs/proc/Kconfig +index 2183fcf..3c32a98 100644 +--- a/fs/proc/Kconfig ++++ b/fs/proc/Kconfig +@@ -30,7 +30,7 @@ config PROC_FS + + config PROC_KCORE + bool "/proc/kcore support" if !ARM +- depends on PROC_FS && MMU ++ depends on PROC_FS && MMU && !GRKERNSEC_PROC_ADD + help + Provides a virtual ELF core file of the live kernel. This can + be read with gdb and other ELF tools. No modifications can be +@@ -38,8 +38,8 @@ config PROC_KCORE + + config PROC_VMCORE + bool "/proc/vmcore support" +- depends on PROC_FS && CRASH_DUMP +- default y ++ depends on PROC_FS && CRASH_DUMP && !GRKERNSEC ++ default n + help + Exports the dump image of crashed kernel in ELF format. + +@@ -63,8 +63,8 @@ config PROC_SYSCTL + limited in memory. + + config PROC_PAGE_MONITOR +- default y +- depends on PROC_FS && MMU ++ default n ++ depends on PROC_FS && MMU && !GRKERNSEC + bool "Enable /proc page monitoring" if EXPERT + help + Various /proc files exist to monitor process memory utilization: +diff --git a/fs/proc/array.c b/fs/proc/array.c +index cd3653e..9b9b79a 100644 +--- a/fs/proc/array.c ++++ b/fs/proc/array.c +@@ -60,6 +60,7 @@ + #include <linux/tty.h> + #include <linux/string.h> + #include <linux/mman.h> ++#include <linux/grsecurity.h> + #include <linux/proc_fs.h> + #include <linux/ioport.h> + #include <linux/uaccess.h> +@@ -347,6 +348,21 @@ static void task_cpus_allowed(struct seq_file *m, struct task_struct *task) + seq_putc(m, '\n'); + } + ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++static inline void task_pax(struct seq_file *m, struct task_struct *p) ++{ ++ if (p->mm) ++ seq_printf(m, "PaX:\t%c%c%c%c%c\n", ++ p->mm->pax_flags & MF_PAX_PAGEEXEC ? 'P' : 'p', ++ p->mm->pax_flags & MF_PAX_EMUTRAMP ? 'E' : 'e', ++ p->mm->pax_flags & MF_PAX_MPROTECT ? 'M' : 'm', ++ p->mm->pax_flags & MF_PAX_RANDMMAP ? 'R' : 'r', ++ p->mm->pax_flags & MF_PAX_SEGMEXEC ? 'S' : 's'); ++ else ++ seq_printf(m, "PaX:\t-----\n"); ++} ++#endif ++ + int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task) + { +@@ -365,9 +381,24 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, + task_cpus_allowed(m, task); + cpuset_task_status_allowed(m, task); + task_context_switch_counts(m, task); ++ ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++ task_pax(m, task); ++#endif ++ ++#if defined(CONFIG_GRKERNSEC) && !defined(CONFIG_GRKERNSEC_NO_RBAC) ++ task_grsec_rbac(m, task); ++#endif ++ + return 0; + } + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++#define PAX_RAND_FLAGS(_mm) (_mm != NULL && _mm != current->mm && \ ++ (_mm->pax_flags & MF_PAX_RANDMMAP || \ ++ _mm->pax_flags & MF_PAX_SEGMEXEC)) ++#endif ++ + static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task, int whole) + { +@@ -389,6 +420,13 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, + char tcomm[sizeof(task->comm)]; + unsigned long flags; + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (current->exec_id != m->exec_id) { ++ gr_log_badprocpid("stat"); ++ return 0; ++ } ++#endif ++ + state = *get_task_state(task); + vsize = eip = esp = 0; + permitted = ptrace_may_access(task, PTRACE_MODE_READ | PTRACE_MODE_NOAUDIT); +@@ -459,6 +497,19 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, + gtime = task_gtime(task); + } + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (PAX_RAND_FLAGS(mm)) { ++ eip = 0; ++ esp = 0; ++ wchan = 0; ++ } ++#endif ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ wchan = 0; ++ eip =0; ++ esp =0; ++#endif ++ + /* scale priority and nice values from timeslices to -20..20 */ + /* to make it look like a "normal" Unix priority/nice value */ + priority = task_prio(task); +@@ -490,9 +541,15 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, + seq_put_decimal_ull(m, ' ', vsize); + seq_put_decimal_ull(m, ' ', mm ? get_mm_rss(mm) : 0); + seq_put_decimal_ull(m, ' ', rsslim); ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ seq_put_decimal_ull(m, ' ', PAX_RAND_FLAGS(mm) ? 1 : (mm ? (permitted ? mm->start_code : 1) : 0)); ++ seq_put_decimal_ull(m, ' ', PAX_RAND_FLAGS(mm) ? 1 : (mm ? (permitted ? mm->end_code : 1) : 0)); ++ seq_put_decimal_ull(m, ' ', PAX_RAND_FLAGS(mm) ? 0 : ((permitted && mm) ? mm->start_stack : 0)); ++#else + seq_put_decimal_ull(m, ' ', mm ? (permitted ? mm->start_code : 1) : 0); + seq_put_decimal_ull(m, ' ', mm ? (permitted ? mm->end_code : 1) : 0); + seq_put_decimal_ull(m, ' ', (permitted && mm) ? mm->start_stack : 0); ++#endif + seq_put_decimal_ull(m, ' ', esp); + seq_put_decimal_ull(m, ' ', eip); + /* The signal information here is obsolete. +@@ -514,7 +571,11 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, + seq_put_decimal_ull(m, ' ', cputime_to_clock_t(gtime)); + seq_put_decimal_ll(m, ' ', cputime_to_clock_t(cgtime)); + +- if (mm && permitted) { ++ if (mm && permitted ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ && !PAX_RAND_FLAGS(mm) ++#endif ++ ) { + seq_put_decimal_ull(m, ' ', mm->start_data); + seq_put_decimal_ull(m, ' ', mm->end_data); + seq_put_decimal_ull(m, ' ', mm->start_brk); +@@ -552,8 +613,15 @@ int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task) + { + unsigned long size = 0, resident = 0, shared = 0, text = 0, data = 0; +- struct mm_struct *mm = get_task_mm(task); ++ struct mm_struct *mm; + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (current->exec_id != m->exec_id) { ++ gr_log_badprocpid("statm"); ++ return 0; ++ } ++#endif ++ mm = get_task_mm(task); + if (mm) { + size = task_statm(mm, &shared, &text, &data, &resident); + mmput(mm); +@@ -576,6 +644,20 @@ int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, + return 0; + } + ++#ifdef CONFIG_GRKERNSEC_PROC_IPADDR ++int proc_pid_ipaddr(struct seq_file *m, struct pid_namespace *ns, struct pid *pid, struct task_struct *task) ++{ ++ unsigned long flags; ++ u32 curr_ip = 0; ++ ++ if (lock_task_sighand(task, &flags)) { ++ curr_ip = task->signal->curr_ip; ++ unlock_task_sighand(task, &flags); ++ } ++ return seq_printf(m, "%pI4\n", &curr_ip); ++} ++#endif ++ + #ifdef CONFIG_CHECKPOINT_RESTORE + static struct pid * + get_children_pid(struct inode *inode, struct pid *pid_prev, loff_t pos) +diff --git a/fs/proc/base.c b/fs/proc/base.c +index 7dc3ea8..a08077e 100644 +--- a/fs/proc/base.c ++++ b/fs/proc/base.c +@@ -113,6 +113,14 @@ struct pid_entry { + union proc_op op; + }; + ++struct getdents_callback { ++ struct linux_dirent __user * current_dir; ++ struct linux_dirent __user * previous; ++ struct file * file; ++ int count; ++ int error; ++}; ++ + #define NOD(NAME, MODE, IOP, FOP, OP) { \ + .name = (NAME), \ + .len = sizeof(NAME) - 1, \ +@@ -208,12 +216,28 @@ static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns, + return 0; + } + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++#define PAX_RAND_FLAGS(_mm) (_mm != NULL && _mm != current->mm && \ ++ (_mm->pax_flags & MF_PAX_RANDMMAP || \ ++ _mm->pax_flags & MF_PAX_SEGMEXEC)) ++#endif ++ + static int proc_pid_auxv(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task) + { + struct mm_struct *mm = mm_access(task, PTRACE_MODE_READ); + if (mm && !IS_ERR(mm)) { + unsigned int nwords = 0; ++ ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ /* allow if we're currently ptracing this task */ ++ if (PAX_RAND_FLAGS(mm) && ++ (!(task->ptrace & PT_PTRACED) || (task->parent != current))) { ++ mmput(mm); ++ return 0; ++ } ++#endif ++ + do { + nwords += 2; + } while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */ +@@ -225,7 +249,7 @@ static int proc_pid_auxv(struct seq_file *m, struct pid_namespace *ns, + } + + +-#ifdef CONFIG_KALLSYMS ++#if defined(CONFIG_KALLSYMS) && !defined(CONFIG_GRKERNSEC_HIDESYM) + /* + * Provides a wchan file via kallsyms in a proper one-value-per-file format. + * Returns the resolved symbol. If that fails, simply return the address. +@@ -265,7 +289,7 @@ static void unlock_trace(struct task_struct *task) + mutex_unlock(&task->signal->cred_guard_mutex); + } + +-#ifdef CONFIG_STACKTRACE ++#if defined(CONFIG_STACKTRACE) && !defined(CONFIG_GRKERNSEC_HIDESYM) + + #define MAX_STACK_TRACE_DEPTH 64 + +@@ -456,7 +480,7 @@ static int proc_pid_limits(struct seq_file *m, struct pid_namespace *ns, + return 0; + } + +-#ifdef CONFIG_HAVE_ARCH_TRACEHOOK ++#if defined(CONFIG_HAVE_ARCH_TRACEHOOK) && !defined(CONFIG_GRKERNSEC_PROC_MEMMAP) + static int proc_pid_syscall(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task) + { +@@ -486,7 +510,7 @@ static int proc_pid_syscall(struct seq_file *m, struct pid_namespace *ns, + /************************************************************************/ + + /* permission checks */ +-static int proc_fd_access_allowed(struct inode *inode) ++static int proc_fd_access_allowed(struct inode *inode, unsigned int log) + { + struct task_struct *task; + int allowed = 0; +@@ -496,7 +520,10 @@ static int proc_fd_access_allowed(struct inode *inode) + */ + task = get_proc_task(inode); + if (task) { +- allowed = ptrace_may_access(task, PTRACE_MODE_READ); ++ if (log) ++ allowed = ptrace_may_access(task, PTRACE_MODE_READ); ++ else ++ allowed = ptrace_may_access(task, PTRACE_MODE_READ | PTRACE_MODE_NOAUDIT); + put_task_struct(task); + } + return allowed; +@@ -527,10 +554,35 @@ static bool has_pid_permissions(struct pid_namespace *pid, + struct task_struct *task, + int hide_pid_min) + { ++ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) ++ return false; ++ ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ rcu_read_lock(); ++ { ++ const struct cred *tmpcred = current_cred(); ++ const struct cred *cred = __task_cred(task); ++ ++ if (uid_eq(tmpcred->uid, GLOBAL_ROOT_UID) || uid_eq(tmpcred->uid, cred->uid) ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ || in_group_p(grsec_proc_gid) ++#endif ++ ) { ++ rcu_read_unlock(); ++ return true; ++ } ++ } ++ rcu_read_unlock(); ++ ++ if (!pid->hide_pid) ++ return false; ++#endif ++ + if (pid->hide_pid < hide_pid_min) + return true; + if (in_group_p(pid->pid_gid)) + return true; ++ + return ptrace_may_access(task, PTRACE_MODE_READ); + } + +@@ -548,7 +600,11 @@ static int proc_pid_permission(struct inode *inode, int mask) + put_task_struct(task); + + if (!has_perms) { ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ { ++#else + if (pid->hide_pid == 2) { ++#endif + /* + * Let's make getdents(), stat(), and open() + * consistent with each other. If a process +@@ -609,6 +665,10 @@ struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode) + + if (task) { + mm = mm_access(task, mode); ++ if (!IS_ERR_OR_NULL(mm) && gr_acl_handle_procpidmem(task)) { ++ mmput(mm); ++ mm = ERR_PTR(-EPERM); ++ } + put_task_struct(task); + + if (!IS_ERR_OR_NULL(mm)) { +@@ -630,6 +690,11 @@ static int __mem_open(struct inode *inode, struct file *file, unsigned int mode) + return PTR_ERR(mm); + + file->private_data = mm; ++ ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ file->f_version = current->exec_id; ++#endif ++ + return 0; + } + +@@ -651,6 +716,17 @@ static ssize_t mem_rw(struct file *file, char __user *buf, + ssize_t copied; + char *page; + ++#ifdef CONFIG_GRKERNSEC ++ if (write) ++ return -EPERM; ++#endif ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (file->f_version != current->exec_id) { ++ gr_log_badprocpid("mem"); ++ return 0; ++ } ++#endif ++ + if (!mm) + return 0; + +@@ -663,7 +739,7 @@ static ssize_t mem_rw(struct file *file, char __user *buf, + goto free; + + while (count > 0) { +- int this_len = min_t(int, count, PAGE_SIZE); ++ ssize_t this_len = min_t(ssize_t, count, PAGE_SIZE); + + if (write && copy_from_user(page, buf, this_len)) { + copied = -EFAULT; +@@ -755,6 +831,13 @@ static ssize_t environ_read(struct file *file, char __user *buf, + if (!mm) + return 0; + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (file->f_version != current->exec_id) { ++ gr_log_badprocpid("environ"); ++ return 0; ++ } ++#endif ++ + page = (char *)__get_free_page(GFP_TEMPORARY); + if (!page) + return -ENOMEM; +@@ -764,7 +847,7 @@ static ssize_t environ_read(struct file *file, char __user *buf, + goto free; + while (count > 0) { + size_t this_len, max_len; +- int retval; ++ ssize_t retval; + + if (src >= (mm->env_end - mm->env_start)) + break; +@@ -1378,7 +1461,7 @@ static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd) + int error = -EACCES; + + /* Are we allowed to snoop on the tasks file descriptors? */ +- if (!proc_fd_access_allowed(inode)) ++ if (!proc_fd_access_allowed(inode, 0)) + goto out; + + error = PROC_I(inode)->op.proc_get_link(dentry, &path); +@@ -1422,8 +1505,18 @@ static int proc_pid_readlink(struct dentry * dentry, char __user * buffer, int b + struct path path; + + /* Are we allowed to snoop on the tasks file descriptors? */ +- if (!proc_fd_access_allowed(inode)) +- goto out; ++ /* logging this is needed for learning on chromium to work properly, ++ but we don't want to flood the logs from 'ps' which does a readlink ++ on /proc/fd/2 of tasks in the listing, nor do we want 'ps' to learn ++ CAP_SYS_PTRACE as it's not necessary for its basic functionality ++ */ ++ if (dentry->d_name.name[0] == '2' && dentry->d_name.name[1] == '\0') { ++ if (!proc_fd_access_allowed(inode,0)) ++ goto out; ++ } else { ++ if (!proc_fd_access_allowed(inode,1)) ++ goto out; ++ } + + error = PROC_I(inode)->op.proc_get_link(dentry, &path); + if (error) +@@ -1473,7 +1566,11 @@ struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *t + rcu_read_lock(); + cred = __task_cred(task); + inode->i_uid = cred->euid; ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ inode->i_gid = grsec_proc_gid; ++#else + inode->i_gid = cred->egid; ++#endif + rcu_read_unlock(); + } + security_task_to_inode(task, inode); +@@ -1509,10 +1606,19 @@ int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) + return -ENOENT; + } + if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IXUSR)) || ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IRGRP|S_IXUSR|S_IXGRP)) || ++#endif + task_dumpable(task)) { + cred = __task_cred(task); + stat->uid = cred->euid; ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ stat->gid = grsec_proc_gid; ++#else + stat->gid = cred->egid; ++#endif + } + } + rcu_read_unlock(); +@@ -1550,11 +1656,20 @@ int pid_revalidate(struct dentry *dentry, unsigned int flags) + + if (task) { + if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) || ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IXUSR)) || ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ (inode->i_mode == (S_IFDIR|S_IRUSR|S_IRGRP|S_IXUSR|S_IXGRP)) || ++#endif + task_dumpable(task)) { + rcu_read_lock(); + cred = __task_cred(task); + inode->i_uid = cred->euid; ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ inode->i_gid = grsec_proc_gid; ++#else + inode->i_gid = cred->egid; ++#endif + rcu_read_unlock(); + } else { + inode->i_uid = GLOBAL_ROOT_UID; +@@ -2085,6 +2200,9 @@ static struct dentry *proc_pident_lookup(struct inode *dir, + if (!task) + goto out_no_task; + ++ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) ++ goto out; ++ + /* + * Yes, it does not scale. And it should not. Don't add + * new entries into /proc/<tgid>/ without very good reasons. +@@ -2115,6 +2233,9 @@ static int proc_pident_readdir(struct file *file, struct dir_context *ctx, + if (!task) + return -ENOENT; + ++ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) ++ goto out; ++ + if (!dir_emit_dots(file, ctx)) + goto out; + +@@ -2557,7 +2678,7 @@ static const struct pid_entry tgid_base_stuff[] = { + REG("autogroup", S_IRUGO|S_IWUSR, proc_pid_sched_autogroup_operations), + #endif + REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations), +-#ifdef CONFIG_HAVE_ARCH_TRACEHOOK ++#if defined(CONFIG_HAVE_ARCH_TRACEHOOK) && !defined(CONFIG_GRKERNSEC_PROC_MEMMAP) + ONE("syscall", S_IRUSR, proc_pid_syscall), + #endif + ONE("cmdline", S_IRUGO, proc_pid_cmdline), +@@ -2582,10 +2703,10 @@ static const struct pid_entry tgid_base_stuff[] = { + #ifdef CONFIG_SECURITY + DIR("attr", S_IRUGO|S_IXUGO, proc_attr_dir_inode_operations, proc_attr_dir_operations), + #endif +-#ifdef CONFIG_KALLSYMS ++#if defined(CONFIG_KALLSYMS) && !defined(CONFIG_GRKERNSEC_HIDESYM) + ONE("wchan", S_IRUGO, proc_pid_wchan), + #endif +-#ifdef CONFIG_STACKTRACE ++#if defined(CONFIG_STACKTRACE) && !defined(CONFIG_GRKERNSEC_HIDESYM) + ONE("stack", S_IRUSR, proc_pid_stack), + #endif + #ifdef CONFIG_SCHEDSTATS +@@ -2619,6 +2740,9 @@ static const struct pid_entry tgid_base_stuff[] = { + #ifdef CONFIG_HARDWALL + ONE("hardwall", S_IRUGO, proc_pid_hardwall), + #endif ++#ifdef CONFIG_GRKERNSEC_PROC_IPADDR ++ ONE("ipaddr", S_IRUSR, proc_pid_ipaddr), ++#endif + #ifdef CONFIG_USER_NS + REG("uid_map", S_IRUGO|S_IWUSR, proc_uid_map_operations), + REG("gid_map", S_IRUGO|S_IWUSR, proc_gid_map_operations), +@@ -2748,7 +2872,14 @@ static int proc_pid_instantiate(struct inode *dir, + if (!inode) + goto out; + ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ inode->i_mode = S_IFDIR|S_IRUSR|S_IXUSR; ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ inode->i_gid = grsec_proc_gid; ++ inode->i_mode = S_IFDIR|S_IRUSR|S_IRGRP|S_IXUSR|S_IXGRP; ++#else + inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; ++#endif + inode->i_op = &proc_tgid_base_inode_operations; + inode->i_fop = &proc_tgid_base_operations; + inode->i_flags|=S_IMMUTABLE; +@@ -2786,7 +2917,11 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, unsign + if (!task) + goto out; + ++ if (gr_pid_is_chrooted(task) || gr_check_hidden_task(task)) ++ goto out_put_task; ++ + result = proc_pid_instantiate(dir, dentry, task, NULL); ++out_put_task: + put_task_struct(task); + out: + return ERR_PTR(result); +@@ -2900,7 +3035,7 @@ static const struct pid_entry tid_base_stuff[] = { + REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations), + #endif + REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations), +-#ifdef CONFIG_HAVE_ARCH_TRACEHOOK ++#if defined(CONFIG_HAVE_ARCH_TRACEHOOK) && !defined(CONFIG_GRKERNSEC_PROC_MEMMAP) + ONE("syscall", S_IRUSR, proc_pid_syscall), + #endif + ONE("cmdline", S_IRUGO, proc_pid_cmdline), +@@ -2927,10 +3062,10 @@ static const struct pid_entry tid_base_stuff[] = { + #ifdef CONFIG_SECURITY + DIR("attr", S_IRUGO|S_IXUGO, proc_attr_dir_inode_operations, proc_attr_dir_operations), + #endif +-#ifdef CONFIG_KALLSYMS ++#if defined(CONFIG_KALLSYMS) && !defined(CONFIG_GRKERNSEC_HIDESYM) + ONE("wchan", S_IRUGO, proc_pid_wchan), + #endif +-#ifdef CONFIG_STACKTRACE ++#if defined(CONFIG_STACKTRACE) && !defined(CONFIG_GRKERNSEC_HIDESYM) + ONE("stack", S_IRUSR, proc_pid_stack), + #endif + #ifdef CONFIG_SCHEDSTATS +diff --git a/fs/proc/cmdline.c b/fs/proc/cmdline.c +index cbd82df..c0407d2 100644 +--- a/fs/proc/cmdline.c ++++ b/fs/proc/cmdline.c +@@ -23,7 +23,11 @@ static const struct file_operations cmdline_proc_fops = { + + static int __init proc_cmdline_init(void) + { ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ proc_create_grsec("cmdline", 0, NULL, &cmdline_proc_fops); ++#else + proc_create("cmdline", 0, NULL, &cmdline_proc_fops); ++#endif + return 0; + } + fs_initcall(proc_cmdline_init); +diff --git a/fs/proc/devices.c b/fs/proc/devices.c +index 50493ed..248166b 100644 +--- a/fs/proc/devices.c ++++ b/fs/proc/devices.c +@@ -64,7 +64,11 @@ static const struct file_operations proc_devinfo_operations = { + + static int __init proc_devices_init(void) + { ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ proc_create_grsec("devices", 0, NULL, &proc_devinfo_operations); ++#else + proc_create("devices", 0, NULL, &proc_devinfo_operations); ++#endif + return 0; + } + fs_initcall(proc_devices_init); +diff --git a/fs/proc/fd.c b/fs/proc/fd.c +index e11d7c5..9128ce06 100644 +--- a/fs/proc/fd.c ++++ b/fs/proc/fd.c +@@ -26,7 +26,8 @@ static int seq_show(struct seq_file *m, void *v) + if (!task) + return -ENOENT; + +- files = get_files_struct(task); ++ if (!gr_acl_handle_procpidmem(task)) ++ files = get_files_struct(task); + put_task_struct(task); + + if (files) { +@@ -283,11 +284,21 @@ static struct dentry *proc_lookupfd(struct inode *dir, struct dentry *dentry, + */ + int proc_fd_permission(struct inode *inode, int mask) + { ++ struct task_struct *task; + int rv = generic_permission(inode, mask); +- if (rv == 0) +- return 0; ++ + if (task_tgid(current) == proc_pid(inode)) + rv = 0; ++ ++ task = get_proc_task(inode); ++ if (task == NULL) ++ return rv; ++ ++ if (gr_acl_handle_procpidmem(task)) ++ rv = -EACCES; ++ ++ put_task_struct(task); ++ + return rv; + } + +diff --git a/fs/proc/generic.c b/fs/proc/generic.c +index 228cc4e..d997a4d 100644 +--- a/fs/proc/generic.c ++++ b/fs/proc/generic.c +@@ -22,6 +22,7 @@ + #include <linux/bitops.h> + #include <linux/spinlock.h> + #include <linux/completion.h> ++#include <linux/grsecurity.h> + #include <asm/uaccess.h> + + #include "internal.h" +@@ -195,6 +196,15 @@ struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry, + return proc_lookup_de(PDE(dir), dir, dentry); + } + ++struct dentry *proc_lookup_restrict(struct inode *dir, struct dentry *dentry, ++ unsigned int flags) ++{ ++ if (gr_proc_is_restricted()) ++ return ERR_PTR(-EACCES); ++ ++ return proc_lookup_de(PDE(dir), dir, dentry); ++} ++ + /* + * This returns non-zero if at EOF, so that the /proc + * root directory can use this and check if it should +@@ -252,6 +262,16 @@ int proc_readdir(struct file *file, struct dir_context *ctx) + return proc_readdir_de(PDE(inode), file, ctx); + } + ++int proc_readdir_restrict(struct file *file, struct dir_context *ctx) ++{ ++ struct inode *inode = file_inode(file); ++ ++ if (gr_proc_is_restricted()) ++ return -EACCES; ++ ++ return proc_readdir_de(PDE(inode), file, ctx); ++} ++ + /* + * These are the generic /proc directory operations. They + * use the in-memory "struct proc_dir_entry" tree to parse +@@ -263,6 +283,12 @@ static const struct file_operations proc_dir_operations = { + .iterate = proc_readdir, + }; + ++static const struct file_operations proc_dir_restricted_operations = { ++ .llseek = generic_file_llseek, ++ .read = generic_read_dir, ++ .iterate = proc_readdir_restrict, ++}; ++ + /* + * proc directories can do almost nothing.. + */ +@@ -272,6 +298,12 @@ static const struct inode_operations proc_dir_inode_operations = { + .setattr = proc_notify_change, + }; + ++static const struct inode_operations proc_dir_restricted_inode_operations = { ++ .lookup = proc_lookup_restrict, ++ .getattr = proc_getattr, ++ .setattr = proc_notify_change, ++}; ++ + static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp) + { + struct proc_dir_entry *tmp; +@@ -282,8 +314,13 @@ static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp + return ret; + + if (S_ISDIR(dp->mode)) { +- dp->proc_fops = &proc_dir_operations; +- dp->proc_iops = &proc_dir_inode_operations; ++ if (dp->restricted) { ++ dp->proc_fops = &proc_dir_restricted_operations; ++ dp->proc_iops = &proc_dir_restricted_inode_operations; ++ } else { ++ dp->proc_fops = &proc_dir_operations; ++ dp->proc_iops = &proc_dir_inode_operations; ++ } + dir->nlink++; + } else if (S_ISLNK(dp->mode)) { + dp->proc_iops = &proc_link_inode_operations; +@@ -395,6 +432,27 @@ struct proc_dir_entry *proc_mkdir_data(const char *name, umode_t mode, + } + EXPORT_SYMBOL_GPL(proc_mkdir_data); + ++struct proc_dir_entry *proc_mkdir_data_restrict(const char *name, umode_t mode, ++ struct proc_dir_entry *parent, void *data) ++{ ++ struct proc_dir_entry *ent; ++ ++ if (mode == 0) ++ mode = S_IRUGO | S_IXUGO; ++ ++ ent = __proc_create(&parent, name, S_IFDIR | mode, 2); ++ if (ent) { ++ ent->data = data; ++ ent->restricted = 1; ++ if (proc_register(parent, ent) < 0) { ++ kfree(ent); ++ ent = NULL; ++ } ++ } ++ return ent; ++} ++EXPORT_SYMBOL_GPL(proc_mkdir_data_restrict); ++ + struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode, + struct proc_dir_entry *parent) + { +@@ -409,6 +467,13 @@ struct proc_dir_entry *proc_mkdir(const char *name, + } + EXPORT_SYMBOL(proc_mkdir); + ++struct proc_dir_entry *proc_mkdir_restrict(const char *name, ++ struct proc_dir_entry *parent) ++{ ++ return proc_mkdir_data_restrict(name, 0, parent, NULL); ++} ++EXPORT_SYMBOL(proc_mkdir_restrict); ++ + struct proc_dir_entry *proc_create_data(const char *name, umode_t mode, + struct proc_dir_entry *parent, + const struct file_operations *proc_fops, +diff --git a/fs/proc/inode.c b/fs/proc/inode.c +index 54ed31c..9ae2ede 100644 +--- a/fs/proc/inode.c ++++ b/fs/proc/inode.c +@@ -24,11 +24,17 @@ + #include <linux/mount.h> + #include <linux/magic.h> + #include <linux/namei.h> ++#include <linux/grsecurity.h> + + #include <asm/uaccess.h> + + #include "internal.h" + ++#ifdef CONFIG_PROC_SYSCTL ++extern const struct inode_operations proc_sys_inode_operations; ++extern const struct inode_operations proc_sys_dir_operations; ++#endif ++ + static void proc_evict_inode(struct inode *inode) + { + struct proc_dir_entry *de; +@@ -56,6 +62,13 @@ static void proc_evict_inode(struct inode *inode) + ns = PROC_I(inode)->ns.ns; + if (ns_ops && ns) + ns_ops->put(ns); ++ ++#ifdef CONFIG_PROC_SYSCTL ++ if (inode->i_op == &proc_sys_inode_operations || ++ inode->i_op == &proc_sys_dir_operations) ++ gr_handle_delete(inode->i_ino, inode->i_sb->s_dev); ++#endif ++ + } + + static struct kmem_cache * proc_inode_cachep; +@@ -434,7 +447,11 @@ struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) + if (de->mode) { + inode->i_mode = de->mode; + inode->i_uid = de->uid; ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ inode->i_gid = grsec_proc_gid; ++#else + inode->i_gid = de->gid; ++#endif + } + if (de->size) + inode->i_size = de->size; +diff --git a/fs/proc/internal.h b/fs/proc/internal.h +index 73f8190..4aafc20 100644 +--- a/fs/proc/internal.h ++++ b/fs/proc/internal.h +@@ -46,9 +46,10 @@ struct proc_dir_entry { + struct completion *pde_unload_completion; + struct list_head pde_openers; /* who did ->open, but not ->release */ + spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */ ++ u8 restricted; /* a directory in /proc/net that should be restricted via GRKERNSEC_PROC */ + u8 namelen; + char name[]; +-}; ++} __randomize_layout; + + union proc_op { + int (*proc_get_link)(struct dentry *, struct path *); +@@ -66,7 +67,7 @@ struct proc_inode { + struct ctl_table *sysctl_entry; + struct proc_ns ns; + struct inode vfs_inode; +-}; ++} __randomize_layout; + + /* + * General functions +@@ -154,6 +155,10 @@ extern int proc_pid_status(struct seq_file *, struct pid_namespace *, + struct pid *, struct task_struct *); + extern int proc_pid_statm(struct seq_file *, struct pid_namespace *, + struct pid *, struct task_struct *); ++#ifdef CONFIG_GRKERNSEC_PROC_IPADDR ++extern int proc_pid_ipaddr(struct seq_file *, struct pid_namespace *, ++ struct pid *, struct task_struct *); ++#endif + + /* + * base.c +@@ -178,9 +183,11 @@ extern bool proc_fill_cache(struct file *, struct dir_context *, const char *, i + * generic.c + */ + extern struct dentry *proc_lookup(struct inode *, struct dentry *, unsigned int); ++extern struct dentry *proc_lookup_restrict(struct inode *, struct dentry *, unsigned int); + extern struct dentry *proc_lookup_de(struct proc_dir_entry *, struct inode *, + struct dentry *); + extern int proc_readdir(struct file *, struct dir_context *); ++extern int proc_readdir_restrict(struct file *, struct dir_context *); + extern int proc_readdir_de(struct proc_dir_entry *, struct file *, struct dir_context *); + + static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde) +diff --git a/fs/proc/interrupts.c b/fs/proc/interrupts.c +index a352d57..cb94a5c 100644 +--- a/fs/proc/interrupts.c ++++ b/fs/proc/interrupts.c +@@ -47,7 +47,11 @@ static const struct file_operations proc_interrupts_operations = { + + static int __init proc_interrupts_init(void) + { ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ proc_create_grsec("interrupts", 0, NULL, &proc_interrupts_operations); ++#else + proc_create("interrupts", 0, NULL, &proc_interrupts_operations); ++#endif + return 0; + } + fs_initcall(proc_interrupts_init); +diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c +index 91a4e64..cb007c0 100644 +--- a/fs/proc/kcore.c ++++ b/fs/proc/kcore.c +@@ -483,9 +483,10 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) + * the addresses in the elf_phdr on our list. + */ + start = kc_offset_to_vaddr(*fpos - elf_buflen); +- if ((tsz = (PAGE_SIZE - (start & ~PAGE_MASK))) > buflen) ++ tsz = PAGE_SIZE - (start & ~PAGE_MASK); ++ if (tsz > buflen) + tsz = buflen; +- ++ + while (buflen) { + struct kcore_list *m; + +@@ -514,20 +515,23 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) + kfree(elf_buf); + } else { + if (kern_addr_valid(start)) { +- unsigned long n; +- +- n = copy_to_user(buffer, (char *)start, tsz); +- /* +- * We cannot distinguish between fault on source +- * and fault on destination. When this happens +- * we clear too and hope it will trigger the +- * EFAULT again. +- */ +- if (n) { +- if (clear_user(buffer + tsz - n, +- n)) ++ char *elf_buf; ++ mm_segment_t oldfs; ++ ++ elf_buf = kmalloc(tsz, GFP_KERNEL); ++ if (!elf_buf) ++ return -ENOMEM; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ if (!__copy_from_user(elf_buf, (const void __user *)start, tsz)) { ++ set_fs(oldfs); ++ if (copy_to_user(buffer, elf_buf, tsz)) { ++ kfree(elf_buf); + return -EFAULT; ++ } + } ++ set_fs(oldfs); ++ kfree(elf_buf); + } else { + if (clear_user(buffer, tsz)) + return -EFAULT; +@@ -547,6 +551,9 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) + + static int open_kcore(struct inode *inode, struct file *filp) + { ++#if defined(CONFIG_GRKERNSEC_PROC_ADD) || defined(CONFIG_GRKERNSEC_HIDESYM) ++ return -EPERM; ++#endif + if (!capable(CAP_SYS_RAWIO)) + return -EPERM; + if (kcore_need_update) +diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c +index aa1eee0..03dda72 100644 +--- a/fs/proc/meminfo.c ++++ b/fs/proc/meminfo.c +@@ -187,7 +187,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v) + vmi.used >> 10, + vmi.largest_chunk >> 10 + #ifdef CONFIG_MEMORY_FAILURE +- ,atomic_long_read(&num_poisoned_pages) << (PAGE_SHIFT - 10) ++ ,atomic_long_read_unchecked(&num_poisoned_pages) << (PAGE_SHIFT - 10) + #endif + #ifdef CONFIG_TRANSPARENT_HUGEPAGE + ,K(global_page_state(NR_ANON_TRANSPARENT_HUGEPAGES) * +diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c +index d4a3574..b421ce9 100644 +--- a/fs/proc/nommu.c ++++ b/fs/proc/nommu.c +@@ -64,7 +64,7 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region) + + if (file) { + seq_pad(m, ' '); +- seq_path(m, &file->f_path, ""); ++ seq_path(m, &file->f_path, "\n\\"); + } + + seq_putc(m, '\n'); +diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c +index a63af3e..b4f262a 100644 +--- a/fs/proc/proc_net.c ++++ b/fs/proc/proc_net.c +@@ -23,9 +23,27 @@ + #include <linux/nsproxy.h> + #include <net/net_namespace.h> + #include <linux/seq_file.h> ++#include <linux/grsecurity.h> + + #include "internal.h" + ++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) ++static struct seq_operations *ipv6_seq_ops_addr; ++ ++void register_ipv6_seq_ops_addr(struct seq_operations *addr) ++{ ++ ipv6_seq_ops_addr = addr; ++} ++ ++void unregister_ipv6_seq_ops_addr(void) ++{ ++ ipv6_seq_ops_addr = NULL; ++} ++ ++EXPORT_SYMBOL_GPL(register_ipv6_seq_ops_addr); ++EXPORT_SYMBOL_GPL(unregister_ipv6_seq_ops_addr); ++#endif ++ + static inline struct net *PDE_NET(struct proc_dir_entry *pde) + { + return pde->parent->data; +@@ -36,6 +54,8 @@ static struct net *get_proc_net(const struct inode *inode) + return maybe_get_net(PDE_NET(PDE(inode))); + } + ++extern const struct seq_operations dev_seq_ops; ++ + int seq_open_net(struct inode *ino, struct file *f, + const struct seq_operations *ops, int size) + { +@@ -44,6 +64,14 @@ int seq_open_net(struct inode *ino, struct file *f, + + BUG_ON(size < sizeof(*p)); + ++ /* only permit access to /proc/net/dev */ ++ if ( ++#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) ++ ops != ipv6_seq_ops_addr && ++#endif ++ ops != &dev_seq_ops && gr_proc_is_restricted()) ++ return -EACCES; ++ + net = get_proc_net(ino); + if (net == NULL) + return -ENXIO; +@@ -66,6 +94,9 @@ int single_open_net(struct inode *inode, struct file *file, + int err; + struct net *net; + ++ if (gr_proc_is_restricted()) ++ return -EACCES; ++ + err = -ENXIO; + net = get_proc_net(inode); + if (net == NULL) +diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c +index f92d5dd..26398ac 100644 +--- a/fs/proc/proc_sysctl.c ++++ b/fs/proc/proc_sysctl.c +@@ -11,13 +11,21 @@ + #include <linux/namei.h> + #include <linux/mm.h> + #include <linux/module.h> ++#include <linux/nsproxy.h> ++#ifdef CONFIG_GRKERNSEC ++#include <net/net_namespace.h> ++#endif + #include "internal.h" + ++extern int gr_handle_chroot_sysctl(const int op); ++extern int gr_handle_sysctl_mod(const char *dirname, const char *name, ++ const int op); ++ + static const struct dentry_operations proc_sys_dentry_operations; + static const struct file_operations proc_sys_file_operations; +-static const struct inode_operations proc_sys_inode_operations; ++const struct inode_operations proc_sys_inode_operations; + static const struct file_operations proc_sys_dir_file_operations; +-static const struct inode_operations proc_sys_dir_operations; ++const struct inode_operations proc_sys_dir_operations; + + void proc_sys_poll_notify(struct ctl_table_poll *poll) + { +@@ -467,6 +475,9 @@ static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry, + + err = NULL; + d_set_d_op(dentry, &proc_sys_dentry_operations); ++ ++ gr_handle_proc_create(dentry, inode); ++ + d_add(dentry, inode); + + out: +@@ -482,6 +493,7 @@ static ssize_t proc_sys_call_handler(struct file *filp, void __user *buf, + struct inode *inode = file_inode(filp); + struct ctl_table_header *head = grab_header(inode); + struct ctl_table *table = PROC_I(inode)->sysctl_entry; ++ int op = write ? MAY_WRITE : MAY_READ; + ssize_t error; + size_t res; + +@@ -493,7 +505,7 @@ static ssize_t proc_sys_call_handler(struct file *filp, void __user *buf, + * and won't be until we finish. + */ + error = -EPERM; +- if (sysctl_perm(head, table, write ? MAY_WRITE : MAY_READ)) ++ if (sysctl_perm(head, table, op)) + goto out; + + /* if that can happen at all, it should be -EINVAL, not -EISDIR */ +@@ -501,6 +513,27 @@ static ssize_t proc_sys_call_handler(struct file *filp, void __user *buf, + if (!table->proc_handler) + goto out; + ++#ifdef CONFIG_GRKERNSEC ++ error = -EPERM; ++ if (gr_handle_chroot_sysctl(op)) ++ goto out; ++ dget(filp->f_path.dentry); ++ if (gr_handle_sysctl_mod(filp->f_path.dentry->d_parent->d_name.name, table->procname, op)) { ++ dput(filp->f_path.dentry); ++ goto out; ++ } ++ dput(filp->f_path.dentry); ++ if (!gr_acl_handle_open(filp->f_path.dentry, filp->f_path.mnt, op)) ++ goto out; ++ if (write) { ++ if (current->nsproxy->net_ns != table->extra2) { ++ if (!capable(CAP_SYS_ADMIN)) ++ goto out; ++ } else if (!ns_capable(current->nsproxy->net_ns->user_ns, CAP_NET_ADMIN)) ++ goto out; ++ } ++#endif ++ + /* careful: calling conventions are nasty here */ + res = count; + error = table->proc_handler(table, write, buf, &res, ppos); +@@ -598,6 +631,9 @@ static bool proc_sys_fill_cache(struct file *file, + return false; + } else { + d_set_d_op(child, &proc_sys_dentry_operations); ++ ++ gr_handle_proc_create(child, inode); ++ + d_add(child, inode); + } + } else { +@@ -641,6 +677,9 @@ static int scan(struct ctl_table_header *head, struct ctl_table *table, + if ((*pos)++ < ctx->pos) + return true; + ++ if (!gr_acl_handle_hidden_file(file->f_path.dentry, file->f_path.mnt)) ++ return 0; ++ + if (unlikely(S_ISLNK(table->mode))) + res = proc_sys_link_fill_cache(file, ctx, head, table); + else +@@ -734,6 +773,9 @@ static int proc_sys_getattr(struct vfsmount *mnt, struct dentry *dentry, struct + if (IS_ERR(head)) + return PTR_ERR(head); + ++ if (table && !gr_acl_handle_hidden_file(dentry, mnt)) ++ return -ENOENT; ++ + generic_fillattr(inode, stat); + if (table) + stat->mode = (stat->mode & S_IFMT) | table->mode; +@@ -756,13 +798,13 @@ static const struct file_operations proc_sys_dir_file_operations = { + .llseek = generic_file_llseek, + }; + +-static const struct inode_operations proc_sys_inode_operations = { ++const struct inode_operations proc_sys_inode_operations = { + .permission = proc_sys_permission, + .setattr = proc_sys_setattr, + .getattr = proc_sys_getattr, + }; + +-static const struct inode_operations proc_sys_dir_operations = { ++const struct inode_operations proc_sys_dir_operations = { + .lookup = proc_sys_lookup, + .permission = proc_sys_permission, + .setattr = proc_sys_setattr, +@@ -839,7 +881,7 @@ static struct ctl_dir *find_subdir(struct ctl_dir *dir, + static struct ctl_dir *new_dir(struct ctl_table_set *set, + const char *name, int namelen) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + struct ctl_dir *new; + struct ctl_node *node; + char *new_name; +@@ -851,7 +893,7 @@ static struct ctl_dir *new_dir(struct ctl_table_set *set, + return NULL; + + node = (struct ctl_node *)(new + 1); +- table = (struct ctl_table *)(node + 1); ++ table = (ctl_table_no_const *)(node + 1); + new_name = (char *)(table + 2); + memcpy(new_name, name, namelen); + new_name[namelen] = '\0'; +@@ -1020,7 +1062,8 @@ static int sysctl_check_table(const char *path, struct ctl_table *table) + static struct ctl_table_header *new_links(struct ctl_dir *dir, struct ctl_table *table, + struct ctl_table_root *link_root) + { +- struct ctl_table *link_table, *entry, *link; ++ ctl_table_no_const *link_table, *link; ++ struct ctl_table *entry; + struct ctl_table_header *links; + struct ctl_node *node; + char *link_name; +@@ -1043,7 +1086,7 @@ static struct ctl_table_header *new_links(struct ctl_dir *dir, struct ctl_table + return NULL; + + node = (struct ctl_node *)(links + 1); +- link_table = (struct ctl_table *)(node + nr_entries); ++ link_table = (ctl_table_no_const *)(node + nr_entries); + link_name = (char *)&link_table[nr_entries + 1]; + + for (link = link_table, entry = table; entry->procname; link++, entry++) { +@@ -1291,8 +1334,8 @@ static int register_leaf_sysctl_tables(const char *path, char *pos, + struct ctl_table_header ***subheader, struct ctl_table_set *set, + struct ctl_table *table) + { +- struct ctl_table *ctl_table_arg = NULL; +- struct ctl_table *entry, *files; ++ ctl_table_no_const *ctl_table_arg = NULL, *files = NULL; ++ struct ctl_table *entry; + int nr_files = 0; + int nr_dirs = 0; + int err = -ENOMEM; +@@ -1304,10 +1347,9 @@ static int register_leaf_sysctl_tables(const char *path, char *pos, + nr_files++; + } + +- files = table; + /* If there are mixed files and directories we need a new table */ + if (nr_dirs && nr_files) { +- struct ctl_table *new; ++ ctl_table_no_const *new; + files = kzalloc(sizeof(struct ctl_table) * (nr_files + 1), + GFP_KERNEL); + if (!files) +@@ -1325,7 +1367,7 @@ static int register_leaf_sysctl_tables(const char *path, char *pos, + /* Register everything except a directory full of subdirectories */ + if (nr_files || !nr_dirs) { + struct ctl_table_header *header; +- header = __register_sysctl_table(set, path, files); ++ header = __register_sysctl_table(set, path, files ? files : table); + if (!header) { + kfree(ctl_table_arg); + goto out; +diff --git a/fs/proc/root.c b/fs/proc/root.c +index 094e44d..085a877 100644 +--- a/fs/proc/root.c ++++ b/fs/proc/root.c +@@ -188,7 +188,15 @@ void __init proc_root_init(void) + proc_mkdir("openprom", NULL); + #endif + proc_tty_init(); ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ proc_mkdir_mode("bus", S_IRUSR | S_IXUSR, NULL); ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ proc_mkdir_mode("bus", S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP, NULL); ++#endif ++#else + proc_mkdir("bus", NULL); ++#endif + proc_sys_init(); + } + +diff --git a/fs/proc/stat.c b/fs/proc/stat.c +index 510413eb..34d9a8c 100644 +--- a/fs/proc/stat.c ++++ b/fs/proc/stat.c +@@ -11,6 +11,7 @@ + #include <linux/irqnr.h> + #include <linux/cputime.h> + #include <linux/tick.h> ++#include <linux/grsecurity.h> + + #ifndef arch_irq_stat_cpu + #define arch_irq_stat_cpu(cpu) 0 +@@ -87,6 +88,18 @@ static int show_stat(struct seq_file *p, void *v) + u64 sum_softirq = 0; + unsigned int per_softirq_sums[NR_SOFTIRQS] = {0}; + struct timespec boottime; ++ int unrestricted = 1; ++ ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ if (!uid_eq(current_uid(), GLOBAL_ROOT_UID) ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ && !in_group_p(grsec_proc_gid) ++#endif ++ ) ++ unrestricted = 0; ++#endif ++#endif + + user = nice = system = idle = iowait = + irq = softirq = steal = 0; +@@ -99,23 +112,25 @@ static int show_stat(struct seq_file *p, void *v) + nice += kcpustat_cpu(i).cpustat[CPUTIME_NICE]; + system += kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM]; + idle += get_idle_time(i); +- iowait += get_iowait_time(i); +- irq += kcpustat_cpu(i).cpustat[CPUTIME_IRQ]; +- softirq += kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ]; +- steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; +- guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; +- guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; +- sum += kstat_cpu_irqs_sum(i); +- sum += arch_irq_stat_cpu(i); +- +- for (j = 0; j < NR_SOFTIRQS; j++) { +- unsigned int softirq_stat = kstat_softirqs_cpu(j, i); +- +- per_softirq_sums[j] += softirq_stat; +- sum_softirq += softirq_stat; ++ if (unrestricted) { ++ iowait += get_iowait_time(i); ++ irq += kcpustat_cpu(i).cpustat[CPUTIME_IRQ]; ++ softirq += kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ]; ++ steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; ++ guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; ++ guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; ++ sum += kstat_cpu_irqs_sum(i); ++ sum += arch_irq_stat_cpu(i); ++ for (j = 0; j < NR_SOFTIRQS; j++) { ++ unsigned int softirq_stat = kstat_softirqs_cpu(j, i); ++ ++ per_softirq_sums[j] += softirq_stat; ++ sum_softirq += softirq_stat; ++ } + } + } +- sum += arch_irq_stat(); ++ if (unrestricted) ++ sum += arch_irq_stat(); + + seq_puts(p, "cpu "); + seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(user)); +@@ -136,12 +151,14 @@ static int show_stat(struct seq_file *p, void *v) + nice = kcpustat_cpu(i).cpustat[CPUTIME_NICE]; + system = kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM]; + idle = get_idle_time(i); +- iowait = get_iowait_time(i); +- irq = kcpustat_cpu(i).cpustat[CPUTIME_IRQ]; +- softirq = kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ]; +- steal = kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; +- guest = kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; +- guest_nice = kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; ++ if (unrestricted) { ++ iowait = get_iowait_time(i); ++ irq = kcpustat_cpu(i).cpustat[CPUTIME_IRQ]; ++ softirq = kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ]; ++ steal = kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; ++ guest = kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; ++ guest_nice = kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; ++ } + seq_printf(p, "cpu%d", i); + seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(user)); + seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(nice)); +@@ -159,7 +176,7 @@ static int show_stat(struct seq_file *p, void *v) + + /* sum again ? it could be updated? */ + for_each_irq_nr(j) +- seq_put_decimal_ull(p, ' ', kstat_irqs_usr(j)); ++ seq_put_decimal_ull(p, ' ', unrestricted ? kstat_irqs_usr(j) : 0ULL); + + seq_printf(p, + "\nctxt %llu\n" +@@ -167,11 +184,11 @@ static int show_stat(struct seq_file *p, void *v) + "processes %lu\n" + "procs_running %lu\n" + "procs_blocked %lu\n", +- nr_context_switches(), ++ unrestricted ? nr_context_switches() : 0ULL, + (unsigned long)jif, +- total_forks, +- nr_running(), +- nr_iowait()); ++ unrestricted ? total_forks : 0UL, ++ unrestricted ? nr_running() : 0UL, ++ unrestricted ? nr_iowait() : 0UL); + + seq_printf(p, "softirq %llu", (unsigned long long)sum_softirq); + +diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c +index 69aa378..47fb850 100644 +--- a/fs/proc/task_mmu.c ++++ b/fs/proc/task_mmu.c +@@ -13,12 +13,19 @@ + #include <linux/swap.h> + #include <linux/swapops.h> + #include <linux/mmu_notifier.h> ++#include <linux/grsecurity.h> + + #include <asm/elf.h> + #include <asm/uaccess.h> + #include <asm/tlbflush.h> + #include "internal.h" + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++#define PAX_RAND_FLAGS(_mm) (_mm != NULL && _mm != current->mm && \ ++ (_mm->pax_flags & MF_PAX_RANDMMAP || \ ++ _mm->pax_flags & MF_PAX_SEGMEXEC)) ++#endif ++ + void task_mem(struct seq_file *m, struct mm_struct *mm) + { + unsigned long data, text, lib, swap; +@@ -54,8 +61,13 @@ void task_mem(struct seq_file *m, struct mm_struct *mm) + "VmExe:\t%8lu kB\n" + "VmLib:\t%8lu kB\n" + "VmPTE:\t%8lu kB\n" +- "VmSwap:\t%8lu kB\n", +- hiwater_vm << (PAGE_SHIFT-10), ++ "VmSwap:\t%8lu kB\n" ++ ++#ifdef CONFIG_ARCH_TRACK_EXEC_LIMIT ++ "CsBase:\t%8lx\nCsLim:\t%8lx\n" ++#endif ++ ++ ,hiwater_vm << (PAGE_SHIFT-10), + total_vm << (PAGE_SHIFT-10), + mm->locked_vm << (PAGE_SHIFT-10), + mm->pinned_vm << (PAGE_SHIFT-10), +@@ -65,7 +77,19 @@ void task_mem(struct seq_file *m, struct mm_struct *mm) + mm->stack_vm << (PAGE_SHIFT-10), text, lib, + (PTRS_PER_PTE * sizeof(pte_t) * + atomic_long_read(&mm->nr_ptes)) >> 10, +- swap << (PAGE_SHIFT-10)); ++ swap << (PAGE_SHIFT-10) ++ ++#ifdef CONFIG_ARCH_TRACK_EXEC_LIMIT ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ , PAX_RAND_FLAGS(mm) ? 0 : mm->context.user_cs_base ++ , PAX_RAND_FLAGS(mm) ? 0 : mm->context.user_cs_limit ++#else ++ , mm->context.user_cs_base ++ , mm->context.user_cs_limit ++#endif ++#endif ++ ++ ); + } + + unsigned long task_vsize(struct mm_struct *mm) +@@ -282,13 +306,13 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid) + pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; + } + +- /* We don't show the stack guard page in /proc/maps */ ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ start = PAX_RAND_FLAGS(mm) ? 0UL : vma->vm_start; ++ end = PAX_RAND_FLAGS(mm) ? 0UL : vma->vm_end; ++#else + start = vma->vm_start; +- if (stack_guard_page_start(vma, start)) +- start += PAGE_SIZE; + end = vma->vm_end; +- if (stack_guard_page_end(vma, end)) +- end -= PAGE_SIZE; ++#endif + + seq_setwidth(m, 25 + sizeof(void *) * 6 - 1); + seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu ", +@@ -298,7 +322,11 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid) + flags & VM_WRITE ? 'w' : '-', + flags & VM_EXEC ? 'x' : '-', + flags & VM_MAYSHARE ? 's' : 'p', ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ PAX_RAND_FLAGS(mm) ? 0UL : pgoff, ++#else + pgoff, ++#endif + MAJOR(dev), MINOR(dev), ino); + + /* +@@ -307,7 +335,7 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid) + */ + if (file) { + seq_pad(m, ' '); +- seq_path(m, &file->f_path, "\n"); ++ seq_path(m, &file->f_path, "\n\\"); + goto done; + } + +@@ -338,8 +366,9 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid) + * Thread stack in /proc/PID/task/TID/maps or + * the main process stack. + */ +- if (!is_pid || (vma->vm_start <= mm->start_stack && +- vma->vm_end >= mm->start_stack)) { ++ if (!is_pid || (vma->vm_flags & (VM_GROWSDOWN | VM_GROWSUP)) || ++ (vma->vm_start <= mm->start_stack && ++ vma->vm_end >= mm->start_stack)) { + name = "[stack]"; + } else { + /* Thread stack in /proc/PID/maps */ +@@ -359,6 +388,12 @@ done: + + static int show_map(struct seq_file *m, void *v, int is_pid) + { ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (current->exec_id != m->exec_id) { ++ gr_log_badprocpid("maps"); ++ return 0; ++ } ++#endif + show_map_vma(m, v, is_pid); + m_cache_vma(m, v); + return 0; +@@ -594,12 +629,23 @@ static int show_smap(struct seq_file *m, void *v, int is_pid) + .private = &mss, + }; + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (current->exec_id != m->exec_id) { ++ gr_log_badprocpid("smaps"); ++ return 0; ++ } ++#endif + memset(&mss, 0, sizeof mss); +- mss.vma = vma; +- /* mmap_sem is held in m_start */ +- if (vma->vm_mm && !is_vm_hugetlb_page(vma)) +- walk_page_range(vma->vm_start, vma->vm_end, &smaps_walk); +- ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (!PAX_RAND_FLAGS(vma->vm_mm)) { ++#endif ++ mss.vma = vma; ++ /* mmap_sem is held in m_start */ ++ if (vma->vm_mm && !is_vm_hugetlb_page(vma)) ++ walk_page_range(vma->vm_start, vma->vm_end, &smaps_walk); ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ } ++#endif + show_map_vma(m, vma, is_pid); + + seq_printf(m, +@@ -617,7 +663,11 @@ static int show_smap(struct seq_file *m, void *v, int is_pid) + "KernelPageSize: %8lu kB\n" + "MMUPageSize: %8lu kB\n" + "Locked: %8lu kB\n", ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ PAX_RAND_FLAGS(vma->vm_mm) ? 0UL : (vma->vm_end - vma->vm_start) >> 10, ++#else + (vma->vm_end - vma->vm_start) >> 10, ++#endif + mss.resident >> 10, + (unsigned long)(mss.pss >> (10 + PSS_SHIFT)), + mss.shared_clean >> 10, +@@ -1454,6 +1504,13 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid) + char buffer[64]; + int nid; + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (current->exec_id != m->exec_id) { ++ gr_log_badprocpid("numa_maps"); ++ return 0; ++ } ++#endif ++ + if (!mm) + return 0; + +@@ -1475,11 +1532,15 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid) + mpol_to_str(buffer, sizeof(buffer), proc_priv->task_mempolicy); + } + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ seq_printf(m, "%08lx %s", PAX_RAND_FLAGS(vma->vm_mm) ? 0UL : vma->vm_start, buffer); ++#else + seq_printf(m, "%08lx %s", vma->vm_start, buffer); ++#endif + + if (file) { + seq_puts(m, " file="); +- seq_path(m, &file->f_path, "\n\t= "); ++ seq_path(m, &file->f_path, "\n\t\\= "); + } else if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) { + seq_puts(m, " heap"); + } else { +diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c +index 599ec2e..f1413ae 100644 +--- a/fs/proc/task_nommu.c ++++ b/fs/proc/task_nommu.c +@@ -51,7 +51,7 @@ void task_mem(struct seq_file *m, struct mm_struct *mm) + else + bytes += kobjsize(mm); + +- if (current->fs && current->fs->users > 1) ++ if (current->fs && atomic_read(¤t->fs->users) > 1) + sbytes += kobjsize(current->fs); + else + bytes += kobjsize(current->fs); +@@ -180,7 +180,7 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma, + + if (file) { + seq_pad(m, ' '); +- seq_path(m, &file->f_path, ""); ++ seq_path(m, &file->f_path, "\n\\"); + } else if (mm) { + pid_t tid = pid_of_stack(priv, vma, is_pid); + +diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c +index a90d6d35..d08047c 100644 +--- a/fs/proc/vmcore.c ++++ b/fs/proc/vmcore.c +@@ -105,9 +105,13 @@ static ssize_t read_from_oldmem(char *buf, size_t count, + nr_bytes = count; + + /* If pfn is not ram, return zeros for sparse dump files */ +- if (pfn_is_ram(pfn) == 0) +- memset(buf, 0, nr_bytes); +- else { ++ if (pfn_is_ram(pfn) == 0) { ++ if (userbuf) { ++ if (clear_user((char __force_user *)buf, nr_bytes)) ++ return -EFAULT; ++ } else ++ memset(buf, 0, nr_bytes); ++ } else { + tmp = copy_oldmem_page(pfn, buf, nr_bytes, + offset, userbuf); + if (tmp < 0) +@@ -170,7 +174,7 @@ int __weak remap_oldmem_pfn_range(struct vm_area_struct *vma, + static int copy_to(void *target, void *src, size_t size, int userbuf) + { + if (userbuf) { +- if (copy_to_user((char __user *) target, src, size)) ++ if (copy_to_user((char __force_user *) target, src, size)) + return -EFAULT; + } else { + memcpy(target, src, size); +@@ -233,7 +237,7 @@ static ssize_t __read_vmcore(char *buffer, size_t buflen, loff_t *fpos, + if (*fpos < m->offset + m->size) { + tsz = min_t(size_t, m->offset + m->size - *fpos, buflen); + start = m->paddr + *fpos - m->offset; +- tmp = read_from_oldmem(buffer, tsz, &start, userbuf); ++ tmp = read_from_oldmem((char __force_kernel *)buffer, tsz, &start, userbuf); + if (tmp < 0) + return tmp; + buflen -= tsz; +@@ -253,7 +257,7 @@ static ssize_t __read_vmcore(char *buffer, size_t buflen, loff_t *fpos, + static ssize_t read_vmcore(struct file *file, char __user *buffer, + size_t buflen, loff_t *fpos) + { +- return __read_vmcore((__force char *) buffer, buflen, fpos, 1); ++ return __read_vmcore((__force_kernel char *) buffer, buflen, fpos, 1); + } + + /* +diff --git a/fs/qnx6/qnx6.h b/fs/qnx6/qnx6.h +index d3fb2b6..43a8140 100644 +--- a/fs/qnx6/qnx6.h ++++ b/fs/qnx6/qnx6.h +@@ -74,7 +74,7 @@ enum { + BYTESEX_BE, + }; + +-static inline __u64 fs64_to_cpu(struct qnx6_sb_info *sbi, __fs64 n) ++static inline __u64 __intentional_overflow(-1) fs64_to_cpu(struct qnx6_sb_info *sbi, __fs64 n) + { + if (sbi->s_bytesex == BYTESEX_LE) + return le64_to_cpu((__force __le64)n); +@@ -90,7 +90,7 @@ static inline __fs64 cpu_to_fs64(struct qnx6_sb_info *sbi, __u64 n) + return (__force __fs64)cpu_to_be64(n); + } + +-static inline __u32 fs32_to_cpu(struct qnx6_sb_info *sbi, __fs32 n) ++static inline __u32 __intentional_overflow(-1) fs32_to_cpu(struct qnx6_sb_info *sbi, __fs32 n) + { + if (sbi->s_bytesex == BYTESEX_LE) + return le32_to_cpu((__force __le32)n); +diff --git a/fs/quota/netlink.c b/fs/quota/netlink.c +index bb2869f..d34ada8 100644 +--- a/fs/quota/netlink.c ++++ b/fs/quota/netlink.c +@@ -44,7 +44,7 @@ static struct genl_family quota_genl_family = { + void quota_send_warning(struct kqid qid, dev_t dev, + const char warntype) + { +- static atomic_t seq; ++ static atomic_unchecked_t seq; + struct sk_buff *skb; + void *msg_head; + int ret; +@@ -60,7 +60,7 @@ void quota_send_warning(struct kqid qid, dev_t dev, + "VFS: Not enough memory to send quota warning.\n"); + return; + } +- msg_head = genlmsg_put(skb, 0, atomic_add_return(1, &seq), ++ msg_head = genlmsg_put(skb, 0, atomic_add_return_unchecked(1, &seq), + "a_genl_family, 0, QUOTA_NL_C_WARNING); + if (!msg_head) { + printk(KERN_ERR +diff --git a/fs/read_write.c b/fs/read_write.c +index 7d9318c..51b336f 100644 +--- a/fs/read_write.c ++++ b/fs/read_write.c +@@ -495,7 +495,7 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t + + old_fs = get_fs(); + set_fs(get_ds()); +- p = (__force const char __user *)buf; ++ p = (const char __force_user *)buf; + if (count > MAX_RW_COUNT) + count = MAX_RW_COUNT; + if (file->f_op->write) +diff --git a/fs/readdir.c b/fs/readdir.c +index 33fd922..e0d6094 100644 +--- a/fs/readdir.c ++++ b/fs/readdir.c +@@ -18,6 +18,7 @@ + #include <linux/security.h> + #include <linux/syscalls.h> + #include <linux/unistd.h> ++#include <linux/namei.h> + + #include <asm/uaccess.h> + +@@ -71,6 +72,7 @@ struct old_linux_dirent { + struct readdir_callback { + struct dir_context ctx; + struct old_linux_dirent __user * dirent; ++ struct file * file; + int result; + }; + +@@ -88,6 +90,10 @@ static int fillonedir(void * __buf, const char * name, int namlen, loff_t offset + buf->result = -EOVERFLOW; + return -EOVERFLOW; + } ++ ++ if (!gr_acl_handle_filldir(buf->file, name, namlen, ino)) ++ return 0; ++ + buf->result++; + dirent = buf->dirent; + if (!access_ok(VERIFY_WRITE, dirent, +@@ -119,6 +125,7 @@ SYSCALL_DEFINE3(old_readdir, unsigned int, fd, + if (!f.file) + return -EBADF; + ++ buf.file = f.file; + error = iterate_dir(f.file, &buf.ctx); + if (buf.result) + error = buf.result; +@@ -144,6 +151,7 @@ struct getdents_callback { + struct dir_context ctx; + struct linux_dirent __user * current_dir; + struct linux_dirent __user * previous; ++ struct file * file; + int count; + int error; + }; +@@ -165,6 +173,10 @@ static int filldir(void * __buf, const char * name, int namlen, loff_t offset, + buf->error = -EOVERFLOW; + return -EOVERFLOW; + } ++ ++ if (!gr_acl_handle_filldir(buf->file, name, namlen, ino)) ++ return 0; ++ + dirent = buf->previous; + if (dirent) { + if (__put_user(offset, &dirent->d_off)) +@@ -210,6 +222,7 @@ SYSCALL_DEFINE3(getdents, unsigned int, fd, + if (!f.file) + return -EBADF; + ++ buf.file = f.file; + error = iterate_dir(f.file, &buf.ctx); + if (error >= 0) + error = buf.error; +@@ -228,6 +241,7 @@ struct getdents_callback64 { + struct dir_context ctx; + struct linux_dirent64 __user * current_dir; + struct linux_dirent64 __user * previous; ++ struct file *file; + int count; + int error; + }; +@@ -243,6 +257,10 @@ static int filldir64(void * __buf, const char * name, int namlen, loff_t offset, + buf->error = -EINVAL; /* only used if we fail.. */ + if (reclen > buf->count) + return -EINVAL; ++ ++ if (!gr_acl_handle_filldir(buf->file, name, namlen, ino)) ++ return 0; ++ + dirent = buf->previous; + if (dirent) { + if (__put_user(offset, &dirent->d_off)) +@@ -290,6 +308,7 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd, + if (!f.file) + return -EBADF; + ++ buf.file = f.file; + error = iterate_dir(f.file, &buf.ctx); + if (error >= 0) + error = buf.error; +diff --git a/fs/reiserfs/do_balan.c b/fs/reiserfs/do_balan.c +index 9c02d96..6562c10 100644 +--- a/fs/reiserfs/do_balan.c ++++ b/fs/reiserfs/do_balan.c +@@ -1887,7 +1887,7 @@ void do_balance(struct tree_balance *tb, struct item_head *ih, + return; + } + +- atomic_inc(&fs_generation(tb->tb_sb)); ++ atomic_inc_unchecked(&fs_generation(tb->tb_sb)); + do_balance_starts(tb); + + /* +diff --git a/fs/reiserfs/item_ops.c b/fs/reiserfs/item_ops.c +index aca73dd..e3c558d 100644 +--- a/fs/reiserfs/item_ops.c ++++ b/fs/reiserfs/item_ops.c +@@ -724,18 +724,18 @@ static void errcatch_print_vi(struct virtual_item *vi) + } + + static struct item_operations errcatch_ops = { +- errcatch_bytes_number, +- errcatch_decrement_key, +- errcatch_is_left_mergeable, +- errcatch_print_item, +- errcatch_check_item, +- +- errcatch_create_vi, +- errcatch_check_left, +- errcatch_check_right, +- errcatch_part_size, +- errcatch_unit_num, +- errcatch_print_vi ++ .bytes_number = errcatch_bytes_number, ++ .decrement_key = errcatch_decrement_key, ++ .is_left_mergeable = errcatch_is_left_mergeable, ++ .print_item = errcatch_print_item, ++ .check_item = errcatch_check_item, ++ ++ .create_vi = errcatch_create_vi, ++ .check_left = errcatch_check_left, ++ .check_right = errcatch_check_right, ++ .part_size = errcatch_part_size, ++ .unit_num = errcatch_unit_num, ++ .print_vi = errcatch_print_vi + }; + + #if ! (TYPE_STAT_DATA == 0 && TYPE_INDIRECT == 1 && TYPE_DIRECT == 2 && TYPE_DIRENTRY == 3) +diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c +index 621b9f3..af527fd 100644 +--- a/fs/reiserfs/procfs.c ++++ b/fs/reiserfs/procfs.c +@@ -114,7 +114,7 @@ static int show_super(struct seq_file *m, void *unused) + "SMALL_TAILS " : "NO_TAILS ", + replay_only(sb) ? "REPLAY_ONLY " : "", + convert_reiserfs(sb) ? "CONV " : "", +- atomic_read(&r->s_generation_counter), ++ atomic_read_unchecked(&r->s_generation_counter), + SF(s_disk_reads), SF(s_disk_writes), SF(s_fix_nodes), + SF(s_do_balance), SF(s_unneeded_left_neighbor), + SF(s_good_search_by_key_reada), SF(s_bmaps), +diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h +index 1894d96..1dfd1c2 100644 +--- a/fs/reiserfs/reiserfs.h ++++ b/fs/reiserfs/reiserfs.h +@@ -576,7 +576,7 @@ struct reiserfs_sb_info { + /* Comment? -Hans */ + wait_queue_head_t s_wait; + /* increased by one every time the tree gets re-balanced */ +- atomic_t s_generation_counter; ++ atomic_unchecked_t s_generation_counter; + + /* File system properties. Currently holds on-disk FS format */ + unsigned long s_properties; +@@ -2297,7 +2297,7 @@ static inline loff_t max_reiserfs_offset(struct inode *inode) + #define REISERFS_USER_MEM 1 /* user memory mode */ + + #define fs_generation(s) (REISERFS_SB(s)->s_generation_counter) +-#define get_generation(s) atomic_read (&fs_generation(s)) ++#define get_generation(s) atomic_read_unchecked (&fs_generation(s)) + #define FILESYSTEM_CHANGED_TB(tb) (get_generation((tb)->tb_sb) != (tb)->fs_gen) + #define __fs_changed(gen,s) (gen != get_generation (s)) + #define fs_changed(gen,s) \ +diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c +index b27ef35..d9c6c18 100644 +--- a/fs/reiserfs/super.c ++++ b/fs/reiserfs/super.c +@@ -1857,6 +1857,10 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) + sbi->s_mount_opt |= (1 << REISERFS_SMALLTAIL); + sbi->s_mount_opt |= (1 << REISERFS_ERROR_RO); + sbi->s_mount_opt |= (1 << REISERFS_BARRIER_FLUSH); ++#ifdef CONFIG_REISERFS_FS_XATTR ++ /* turn on user xattrs by default */ ++ sbi->s_mount_opt |= (1 << REISERFS_XATTRS_USER); ++#endif + /* no preallocation minimum, be smart in reiserfs_file_write instead */ + sbi->s_alloc_options.preallocmin = 0; + /* Preallocate by 16 blocks (17-1) at once */ +diff --git a/fs/select.c b/fs/select.c +index 467bb1c..cf9d65a 100644 +--- a/fs/select.c ++++ b/fs/select.c +@@ -20,6 +20,7 @@ + #include <linux/export.h> + #include <linux/slab.h> + #include <linux/poll.h> ++#include <linux/security.h> + #include <linux/personality.h> /* for STICKY_TIMEOUTS */ + #include <linux/file.h> + #include <linux/fdtable.h> +@@ -880,6 +881,7 @@ int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, + struct poll_list *walk = head; + unsigned long todo = nfds; + ++ gr_learn_resource(current, RLIMIT_NOFILE, nfds, 1); + if (nfds > rlimit(RLIMIT_NOFILE)) + return -EINVAL; + +diff --git a/fs/seq_file.c b/fs/seq_file.c +index 3857b72..0b7281e 100644 +--- a/fs/seq_file.c ++++ b/fs/seq_file.c +@@ -12,6 +12,8 @@ + #include <linux/slab.h> + #include <linux/cred.h> + #include <linux/mm.h> ++#include <linux/sched.h> ++#include <linux/grsecurity.h> + + #include <asm/uaccess.h> + #include <asm/page.h> +@@ -34,12 +36,7 @@ static void seq_set_overflow(struct seq_file *m) + + static void *seq_buf_alloc(unsigned long size) + { +- void *buf; +- +- buf = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); +- if (!buf && size > PAGE_SIZE) +- buf = vmalloc(size); +- return buf; ++ return kmalloc(size, GFP_KERNEL | GFP_USERCOPY); + } + + /** +@@ -72,6 +69,9 @@ int seq_open(struct file *file, const struct seq_operations *op) + #ifdef CONFIG_USER_NS + p->user_ns = file->f_cred->user_ns; + #endif ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ p->exec_id = current->exec_id; ++#endif + + /* + * Wrappers around seq_open(e.g. swaps_open) need to be +@@ -94,6 +94,16 @@ int seq_open(struct file *file, const struct seq_operations *op) + } + EXPORT_SYMBOL(seq_open); + ++ ++int seq_open_restrict(struct file *file, const struct seq_operations *op) ++{ ++ if (gr_proc_is_restricted()) ++ return -EACCES; ++ ++ return seq_open(file, op); ++} ++EXPORT_SYMBOL(seq_open_restrict); ++ + static int traverse(struct seq_file *m, loff_t offset) + { + loff_t pos = 0, index; +@@ -165,7 +175,7 @@ Eoverflow: + ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) + { + struct seq_file *m = file->private_data; +- size_t copied = 0; ++ ssize_t copied = 0; + loff_t pos; + size_t n; + void *p; +@@ -596,7 +606,7 @@ static void single_stop(struct seq_file *p, void *v) + int single_open(struct file *file, int (*show)(struct seq_file *, void *), + void *data) + { +- struct seq_operations *op = kmalloc(sizeof(*op), GFP_KERNEL); ++ seq_operations_no_const *op = kzalloc(sizeof(*op), GFP_KERNEL); + int res = -ENOMEM; + + if (op) { +@@ -632,6 +642,17 @@ int single_open_size(struct file *file, int (*show)(struct seq_file *, void *), + } + EXPORT_SYMBOL(single_open_size); + ++int single_open_restrict(struct file *file, int (*show)(struct seq_file *, void *), ++ void *data) ++{ ++ if (gr_proc_is_restricted()) ++ return -EACCES; ++ ++ return single_open(file, show, data); ++} ++EXPORT_SYMBOL(single_open_restrict); ++ ++ + int single_release(struct inode *inode, struct file *file) + { + const struct seq_operations *op = ((struct seq_file *)file->private_data)->op; +diff --git a/fs/splice.c b/fs/splice.c +index 75c6058..770d40c 100644 +--- a/fs/splice.c ++++ b/fs/splice.c +@@ -193,7 +193,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, + pipe_lock(pipe); + + for (;;) { +- if (!pipe->readers) { ++ if (!atomic_read(&pipe->readers)) { + send_sig(SIGPIPE, current, 0); + if (!ret) + ret = -EPIPE; +@@ -216,7 +216,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, + page_nr++; + ret += buf->len; + +- if (pipe->files) ++ if (atomic_read(&pipe->files)) + do_wakeup = 1; + + if (!--spd->nr_pages) +@@ -247,9 +247,9 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, + do_wakeup = 0; + } + +- pipe->waiting_writers++; ++ atomic_inc(&pipe->waiting_writers); + pipe_wait(pipe); +- pipe->waiting_writers--; ++ atomic_dec(&pipe->waiting_writers); + } + + pipe_unlock(pipe); +@@ -576,7 +576,7 @@ static ssize_t kernel_readv(struct file *file, const struct iovec *vec, + old_fs = get_fs(); + set_fs(get_ds()); + /* The cast to a user pointer is valid due to the set_fs() */ +- res = vfs_readv(file, (const struct iovec __user *)vec, vlen, &pos); ++ res = vfs_readv(file, (const struct iovec __force_user *)vec, vlen, &pos); + set_fs(old_fs); + + return res; +@@ -591,7 +591,7 @@ ssize_t kernel_write(struct file *file, const char *buf, size_t count, + old_fs = get_fs(); + set_fs(get_ds()); + /* The cast to a user pointer is valid due to the set_fs() */ +- res = vfs_write(file, (__force const char __user *)buf, count, &pos); ++ res = vfs_write(file, (const char __force_user *)buf, count, &pos); + set_fs(old_fs); + + return res; +@@ -644,7 +644,7 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos, + goto err; + + this_len = min_t(size_t, len, PAGE_CACHE_SIZE - offset); +- vec[i].iov_base = (void __user *) page_address(page); ++ vec[i].iov_base = (void __force_user *) page_address(page); + vec[i].iov_len = this_len; + spd.pages[i] = page; + spd.nr_pages++; +@@ -783,7 +783,7 @@ static int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_des + ops->release(pipe, buf); + pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1); + pipe->nrbufs--; +- if (pipe->files) ++ if (atomic_read(&pipe->files)) + sd->need_wakeup = true; + } + +@@ -807,10 +807,10 @@ static int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_des + static int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd) + { + while (!pipe->nrbufs) { +- if (!pipe->writers) ++ if (!atomic_read(&pipe->writers)) + return 0; + +- if (!pipe->waiting_writers && sd->num_spliced) ++ if (!atomic_read(&pipe->waiting_writers) && sd->num_spliced) + return 0; + + if (sd->flags & SPLICE_F_NONBLOCK) +@@ -1040,7 +1040,7 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out, + ops->release(pipe, buf); + pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1); + pipe->nrbufs--; +- if (pipe->files) ++ if (atomic_read(&pipe->files)) + sd.need_wakeup = true; + } else { + buf->offset += ret; +@@ -1200,7 +1200,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, + * out of the pipe right after the splice_to_pipe(). So set + * PIPE_READERS appropriately. + */ +- pipe->readers = 1; ++ atomic_set(&pipe->readers, 1); + + current->splice_pipe = pipe; + } +@@ -1497,6 +1497,7 @@ static int get_iovec_page_array(const struct iovec __user *iov, + + partial[buffers].offset = off; + partial[buffers].len = plen; ++ partial[buffers].private = 0; + + off = 0; + len -= plen; +@@ -1733,9 +1734,9 @@ static int ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags) + ret = -ERESTARTSYS; + break; + } +- if (!pipe->writers) ++ if (!atomic_read(&pipe->writers)) + break; +- if (!pipe->waiting_writers) { ++ if (!atomic_read(&pipe->waiting_writers)) { + if (flags & SPLICE_F_NONBLOCK) { + ret = -EAGAIN; + break; +@@ -1767,7 +1768,7 @@ static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) + pipe_lock(pipe); + + while (pipe->nrbufs >= pipe->buffers) { +- if (!pipe->readers) { ++ if (!atomic_read(&pipe->readers)) { + send_sig(SIGPIPE, current, 0); + ret = -EPIPE; + break; +@@ -1780,9 +1781,9 @@ static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) + ret = -ERESTARTSYS; + break; + } +- pipe->waiting_writers++; ++ atomic_inc(&pipe->waiting_writers); + pipe_wait(pipe); +- pipe->waiting_writers--; ++ atomic_dec(&pipe->waiting_writers); + } + + pipe_unlock(pipe); +@@ -1818,14 +1819,14 @@ retry: + pipe_double_lock(ipipe, opipe); + + do { +- if (!opipe->readers) { ++ if (!atomic_read(&opipe->readers)) { + send_sig(SIGPIPE, current, 0); + if (!ret) + ret = -EPIPE; + break; + } + +- if (!ipipe->nrbufs && !ipipe->writers) ++ if (!ipipe->nrbufs && !atomic_read(&ipipe->writers)) + break; + + /* +@@ -1922,7 +1923,7 @@ static int link_pipe(struct pipe_inode_info *ipipe, + pipe_double_lock(ipipe, opipe); + + do { +- if (!opipe->readers) { ++ if (!atomic_read(&opipe->readers)) { + send_sig(SIGPIPE, current, 0); + if (!ret) + ret = -EPIPE; +@@ -1967,7 +1968,7 @@ static int link_pipe(struct pipe_inode_info *ipipe, + * return EAGAIN if we have the potential of some data in the + * future, otherwise just return 0 + */ +- if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK)) ++ if (!ret && atomic_read(&ipipe->waiting_writers) && (flags & SPLICE_F_NONBLOCK)) + ret = -EAGAIN; + + pipe_unlock(ipipe); +diff --git a/fs/stat.c b/fs/stat.c +index ae0c3ce..9ee641c 100644 +--- a/fs/stat.c ++++ b/fs/stat.c +@@ -28,8 +28,13 @@ void generic_fillattr(struct inode *inode, struct kstat *stat) + stat->gid = inode->i_gid; + stat->rdev = inode->i_rdev; + stat->size = i_size_read(inode); +- stat->atime = inode->i_atime; +- stat->mtime = inode->i_mtime; ++ if (is_sidechannel_device(inode) && !capable_nolog(CAP_MKNOD)) { ++ stat->atime = inode->i_ctime; ++ stat->mtime = inode->i_ctime; ++ } else { ++ stat->atime = inode->i_atime; ++ stat->mtime = inode->i_mtime; ++ } + stat->ctime = inode->i_ctime; + stat->blksize = (1 << inode->i_blkbits); + stat->blocks = inode->i_blocks; +@@ -52,9 +57,16 @@ EXPORT_SYMBOL(generic_fillattr); + int vfs_getattr_nosec(struct path *path, struct kstat *stat) + { + struct inode *inode = path->dentry->d_inode; ++ int retval; + +- if (inode->i_op->getattr) +- return inode->i_op->getattr(path->mnt, path->dentry, stat); ++ if (inode->i_op->getattr) { ++ retval = inode->i_op->getattr(path->mnt, path->dentry, stat); ++ if (!retval && is_sidechannel_device(inode) && !capable_nolog(CAP_MKNOD)) { ++ stat->atime = stat->ctime; ++ stat->mtime = stat->ctime; ++ } ++ return retval; ++ } + + generic_fillattr(inode, stat); + return 0; +diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c +index 0b45ff4..edf9d3a 100644 +--- a/fs/sysfs/dir.c ++++ b/fs/sysfs/dir.c +@@ -33,6 +33,10 @@ void sysfs_warn_dup(struct kernfs_node *parent, const char *name) + kfree(buf); + } + ++#ifdef CONFIG_GRKERNSEC_SYSFS_RESTRICT ++extern int grsec_enable_sysfs_restrict; ++#endif ++ + /** + * sysfs_create_dir_ns - create a directory for an object with a namespace tag + * @kobj: object we're creating directory for +@@ -41,9 +45,16 @@ void sysfs_warn_dup(struct kernfs_node *parent, const char *name) + int sysfs_create_dir_ns(struct kobject *kobj, const void *ns) + { + struct kernfs_node *parent, *kn; ++ const char *name; ++ umode_t mode = S_IRWXU | S_IRUGO | S_IXUGO; ++#ifdef CONFIG_GRKERNSEC_SYSFS_RESTRICT ++ const char *parent_name; ++#endif + + BUG_ON(!kobj); + ++ name = kobject_name(kobj); ++ + if (kobj->parent) + parent = kobj->parent->sd; + else +@@ -52,11 +63,24 @@ int sysfs_create_dir_ns(struct kobject *kobj, const void *ns) + if (!parent) + return -ENOENT; + +- kn = kernfs_create_dir_ns(parent, kobject_name(kobj), +- S_IRWXU | S_IRUGO | S_IXUGO, kobj, ns); ++#ifdef CONFIG_GRKERNSEC_SYSFS_RESTRICT ++ parent_name = parent->name; ++ mode = S_IRWXU; ++ ++ if ((!strcmp(parent_name, "") && (!strcmp(name, "devices") || !strcmp(name, "fs"))) || ++ (!strcmp(parent_name, "devices") && !strcmp(name, "system")) || ++ (!strcmp(parent_name, "fs") && (!strcmp(name, "selinux") || !strcmp(name, "fuse") || !strcmp(name, "ecryptfs"))) || ++ (!strcmp(parent_name, "system") && !strcmp(name, "cpu"))) ++ mode = S_IRWXU | S_IRUGO | S_IXUGO; ++ if (!grsec_enable_sysfs_restrict) ++ mode = S_IRWXU | S_IRUGO | S_IXUGO; ++#endif ++ ++ kn = kernfs_create_dir_ns(parent, name, ++ mode, kobj, ns); + if (IS_ERR(kn)) { + if (PTR_ERR(kn) == -EEXIST) +- sysfs_warn_dup(parent, kobject_name(kobj)); ++ sysfs_warn_dup(parent, name); + return PTR_ERR(kn); + } + +diff --git a/fs/sysv/sysv.h b/fs/sysv/sysv.h +index 69d4889..a810bd4 100644 +--- a/fs/sysv/sysv.h ++++ b/fs/sysv/sysv.h +@@ -188,7 +188,7 @@ static inline u32 PDP_swab(u32 x) + #endif + } + +-static inline __u32 fs32_to_cpu(struct sysv_sb_info *sbi, __fs32 n) ++static inline __u32 __intentional_overflow(-1) fs32_to_cpu(struct sysv_sb_info *sbi, __fs32 n) + { + if (sbi->s_bytesex == BYTESEX_PDP) + return PDP_swab((__force __u32)n); +diff --git a/fs/ubifs/io.c b/fs/ubifs/io.c +index fb08b0c..65fcc7e 100644 +--- a/fs/ubifs/io.c ++++ b/fs/ubifs/io.c +@@ -155,7 +155,7 @@ int ubifs_leb_change(struct ubifs_info *c, int lnum, const void *buf, int len) + return err; + } + +-int ubifs_leb_unmap(struct ubifs_info *c, int lnum) ++int __intentional_overflow(-1) ubifs_leb_unmap(struct ubifs_info *c, int lnum) + { + int err; + +diff --git a/fs/udf/misc.c b/fs/udf/misc.c +index c175b4d..8f36a16 100644 +--- a/fs/udf/misc.c ++++ b/fs/udf/misc.c +@@ -289,7 +289,7 @@ void udf_new_tag(char *data, uint16_t ident, uint16_t version, uint16_t snum, + + u8 udf_tag_checksum(const struct tag *t) + { +- u8 *data = (u8 *)t; ++ const u8 *data = (const u8 *)t; + u8 checksum = 0; + int i; + for (i = 0; i < sizeof(struct tag); ++i) +diff --git a/fs/ufs/swab.h b/fs/ufs/swab.h +index 8d974c4..b82f6ec 100644 +--- a/fs/ufs/swab.h ++++ b/fs/ufs/swab.h +@@ -22,7 +22,7 @@ enum { + BYTESEX_BE + }; + +-static inline u64 ++static inline u64 __intentional_overflow(-1) + fs64_to_cpu(struct super_block *sbp, __fs64 n) + { + if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE) +@@ -40,7 +40,7 @@ cpu_to_fs64(struct super_block *sbp, u64 n) + return (__force __fs64)cpu_to_be64(n); + } + +-static inline u32 ++static inline u32 __intentional_overflow(-1) + fs32_to_cpu(struct super_block *sbp, __fs32 n) + { + if (UFS_SB(sbp)->s_bytesex == BYTESEX_LE) +diff --git a/fs/utimes.c b/fs/utimes.c +index aa138d6..5f3a811 100644 +--- a/fs/utimes.c ++++ b/fs/utimes.c +@@ -1,6 +1,7 @@ + #include <linux/compiler.h> + #include <linux/file.h> + #include <linux/fs.h> ++#include <linux/security.h> + #include <linux/linkage.h> + #include <linux/mount.h> + #include <linux/namei.h> +@@ -103,6 +104,12 @@ static int utimes_common(struct path *path, struct timespec *times) + } + } + retry_deleg: ++ ++ if (!gr_acl_handle_utime(path->dentry, path->mnt)) { ++ error = -EACCES; ++ goto mnt_drop_write_and_out; ++ } ++ + mutex_lock(&inode->i_mutex); + error = notify_change(path->dentry, &newattrs, &delegated_inode); + mutex_unlock(&inode->i_mutex); +diff --git a/fs/xattr.c b/fs/xattr.c +index 64e83ef..b6be154 100644 +--- a/fs/xattr.c ++++ b/fs/xattr.c +@@ -227,6 +227,27 @@ int vfs_xattr_cmp(struct dentry *dentry, const char *xattr_name, + return rc; + } + ++#ifdef CONFIG_PAX_XATTR_PAX_FLAGS ++ssize_t ++pax_getxattr(struct dentry *dentry, void *value, size_t size) ++{ ++ struct inode *inode = dentry->d_inode; ++ ssize_t error; ++ ++ error = inode_permission(inode, MAY_EXEC); ++ if (error) ++ return error; ++ ++ if (inode->i_op->getxattr) ++ error = inode->i_op->getxattr(dentry, XATTR_NAME_PAX_FLAGS, value, size); ++ else ++ error = -EOPNOTSUPP; ++ ++ return error; ++} ++EXPORT_SYMBOL(pax_getxattr); ++#endif ++ + ssize_t + vfs_getxattr(struct dentry *dentry, const char *name, void *value, size_t size) + { +@@ -319,7 +340,7 @@ EXPORT_SYMBOL_GPL(vfs_removexattr); + * Extended attribute SET operations + */ + static long +-setxattr(struct dentry *d, const char __user *name, const void __user *value, ++setxattr(struct path *path, const char __user *name, const void __user *value, + size_t size, int flags) + { + int error; +@@ -355,7 +376,12 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, + posix_acl_fix_xattr_from_user(kvalue, size); + } + +- error = vfs_setxattr(d, kname, kvalue, size, flags); ++ if (!gr_acl_handle_setxattr(path->dentry, path->mnt)) { ++ error = -EACCES; ++ goto out; ++ } ++ ++ error = vfs_setxattr(path->dentry, kname, kvalue, size, flags); + out: + if (vvalue) + vfree(vvalue); +@@ -376,7 +402,7 @@ retry: + return error; + error = mnt_want_write(path.mnt); + if (!error) { +- error = setxattr(path.dentry, name, value, size, flags); ++ error = setxattr(&path, name, value, size, flags); + mnt_drop_write(path.mnt); + } + path_put(&path); +@@ -405,16 +431,14 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name, + const void __user *,value, size_t, size, int, flags) + { + struct fd f = fdget(fd); +- struct dentry *dentry; + int error = -EBADF; + + if (!f.file) + return error; +- dentry = f.file->f_path.dentry; +- audit_inode(NULL, dentry, 0); ++ audit_inode(NULL, f.file->f_path.dentry, 0); + error = mnt_want_write_file(f.file); + if (!error) { +- error = setxattr(dentry, name, value, size, flags); ++ error = setxattr(&f.file->f_path, name, value, size, flags); + mnt_drop_write_file(f.file); + } + fdput(f); +@@ -600,7 +624,7 @@ SYSCALL_DEFINE3(flistxattr, int, fd, char __user *, list, size_t, size) + * Extended attribute REMOVE operations + */ + static long +-removexattr(struct dentry *d, const char __user *name) ++removexattr(struct path *path, const char __user *name) + { + int error; + char kname[XATTR_NAME_MAX + 1]; +@@ -611,7 +635,10 @@ removexattr(struct dentry *d, const char __user *name) + if (error < 0) + return error; + +- return vfs_removexattr(d, kname); ++ if (!gr_acl_handle_removexattr(path->dentry, path->mnt)) ++ return -EACCES; ++ ++ return vfs_removexattr(path->dentry, kname); + } + + static int path_removexattr(const char __user *pathname, +@@ -625,7 +652,7 @@ retry: + return error; + error = mnt_want_write(path.mnt); + if (!error) { +- error = removexattr(path.dentry, name); ++ error = removexattr(&path, name); + mnt_drop_write(path.mnt); + } + path_put(&path); +@@ -651,16 +678,16 @@ SYSCALL_DEFINE2(lremovexattr, const char __user *, pathname, + SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name) + { + struct fd f = fdget(fd); +- struct dentry *dentry; ++ struct path *path; + int error = -EBADF; + + if (!f.file) + return error; +- dentry = f.file->f_path.dentry; +- audit_inode(NULL, dentry, 0); ++ path = &f.file->f_path; ++ audit_inode(NULL, path->dentry, 0); + error = mnt_want_write_file(f.file); + if (!error) { +- error = removexattr(dentry, name); ++ error = removexattr(path, name); + mnt_drop_write_file(f.file); + } + fdput(f); +diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c +index 661666e..e1c7ec2 100644 +--- a/fs/xfs/libxfs/xfs_bmap.c ++++ b/fs/xfs/libxfs/xfs_bmap.c +@@ -583,7 +583,7 @@ xfs_bmap_validate_ret( + + #else + #define xfs_bmap_check_leaf_extents(cur, ip, whichfork) do { } while (0) +-#define xfs_bmap_validate_ret(bno,len,flags,mval,onmap,nmap) ++#define xfs_bmap_validate_ret(bno,len,flags,mval,onmap,nmap) do { } while (0) + #endif /* DEBUG */ + + /* +diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c +index f1b69ed..3d0222f 100644 +--- a/fs/xfs/xfs_dir2_readdir.c ++++ b/fs/xfs/xfs_dir2_readdir.c +@@ -159,7 +159,12 @@ xfs_dir2_sf_getdents( + ino = dp->d_ops->sf_get_ino(sfp, sfep); + filetype = dp->d_ops->sf_get_ftype(sfep); + ctx->pos = off & 0x7fffffff; +- if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, ++ if (dp->i_df.if_u1.if_data == dp->i_df.if_u2.if_inline_data) { ++ char name[sfep->namelen]; ++ memcpy(name, sfep->name, sfep->namelen); ++ if (!dir_emit(ctx, name, sfep->namelen, ino, xfs_dir3_get_dtype(dp->i_mount, filetype))) ++ return 0; ++ } else if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, + xfs_dir3_get_dtype(dp->i_mount, filetype))) + return 0; + sfep = dp->d_ops->sf_nextentry(sfp, sfep); +diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c +index 24c926b6..8726af88 100644 +--- a/fs/xfs/xfs_ioctl.c ++++ b/fs/xfs/xfs_ioctl.c +@@ -122,7 +122,7 @@ xfs_find_handle( + } + + error = -EFAULT; +- if (copy_to_user(hreq->ohandle, &handle, hsize) || ++ if (hsize > sizeof handle || copy_to_user(hreq->ohandle, &handle, hsize) || + copy_to_user(hreq->ohandlen, &hsize, sizeof(__s32))) + goto out_put; + +diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h +index 6a51619..9592e1b 100644 +--- a/fs/xfs/xfs_linux.h ++++ b/fs/xfs/xfs_linux.h +@@ -234,7 +234,7 @@ static inline kgid_t xfs_gid_to_kgid(__uint32_t gid) + * of the compiler which do not like us using do_div in the middle + * of large functions. + */ +-static inline __u32 xfs_do_div(void *a, __u32 b, int n) ++static inline __u32 __intentional_overflow(-1) xfs_do_div(void *a, __u32 b, int n) + { + __u32 mod; + +@@ -290,7 +290,7 @@ static inline __u32 xfs_do_mod(void *a, __u32 b, int n) + return 0; + } + #else +-static inline __u32 xfs_do_div(void *a, __u32 b, int n) ++static inline __u32 __intentional_overflow(-1) xfs_do_div(void *a, __u32 b, int n) + { + __u32 mod; + +diff --git a/grsecurity/Kconfig b/grsecurity/Kconfig +new file mode 100644 +index 0000000..31f8fe4 +--- /dev/null ++++ b/grsecurity/Kconfig +@@ -0,0 +1,1182 @@ ++# ++# grecurity configuration ++# ++menu "Memory Protections" ++depends on GRKERNSEC ++ ++config GRKERNSEC_KMEM ++ bool "Deny reading/writing to /dev/kmem, /dev/mem, and /dev/port" ++ default y if GRKERNSEC_CONFIG_AUTO ++ select STRICT_DEVMEM if (X86 || ARM || TILE || S390) ++ help ++ If you say Y here, /dev/kmem and /dev/mem won't be allowed to ++ be written to or read from to modify or leak the contents of the running ++ kernel. /dev/port will also not be allowed to be opened, writing to ++ /dev/cpu/*/msr will be prevented, and support for kexec will be removed. ++ If you have module support disabled, enabling this will close up several ++ ways that are currently used to insert malicious code into the running ++ kernel. ++ ++ Even with this feature enabled, we still highly recommend that ++ you use the RBAC system, as it is still possible for an attacker to ++ modify the running kernel through other more obscure methods. ++ ++ It is highly recommended that you say Y here if you meet all the ++ conditions above. ++ ++config GRKERNSEC_VM86 ++ bool "Restrict VM86 mode" ++ default y if (GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_SERVER) ++ depends on X86_32 ++ ++ help ++ If you say Y here, only processes with CAP_SYS_RAWIO will be able to ++ make use of a special execution mode on 32bit x86 processors called ++ Virtual 8086 (VM86) mode. XFree86 may need vm86 mode for certain ++ video cards and will still work with this option enabled. The purpose ++ of the option is to prevent exploitation of emulation errors in ++ virtualization of vm86 mode like the one discovered in VMWare in 2009. ++ Nearly all users should be able to enable this option. ++ ++config GRKERNSEC_IO ++ bool "Disable privileged I/O" ++ default y if (GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_SERVER) ++ depends on X86 ++ select RTC_CLASS ++ select RTC_INTF_DEV ++ select RTC_DRV_CMOS ++ ++ help ++ If you say Y here, all ioperm and iopl calls will return an error. ++ Ioperm and iopl can be used to modify the running kernel. ++ Unfortunately, some programs need this access to operate properly, ++ the most notable of which are XFree86 and hwclock. hwclock can be ++ remedied by having RTC support in the kernel, so real-time ++ clock support is enabled if this option is enabled, to ensure ++ that hwclock operates correctly. If hwclock still does not work, ++ either update udev or symlink /dev/rtc to /dev/rtc0. ++ ++ If you're using XFree86 or a version of Xorg from 2012 or earlier, ++ you may not be able to boot into a graphical environment with this ++ option enabled. In this case, you should use the RBAC system instead. ++ ++config GRKERNSEC_BPF_HARDEN ++ bool "Harden BPF interpreter" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ Unlike previous versions of grsecurity that hardened both the BPF ++ interpreted code against corruption at rest as well as the JIT code ++ against JIT-spray attacks and attacker-controlled immediate values ++ for ROP, this feature will enforce disabling of the new eBPF JIT engine ++ and will ensure the interpreted code is read-only at rest. This feature ++ may be removed at a later time when eBPF stabilizes to entirely revert ++ back to the more secure pre-3.16 BPF interpreter/JIT. ++ ++ If you're using KERNEXEC, it's recommended that you enable this option ++ to supplement the hardening of the kernel. ++ ++config GRKERNSEC_PERF_HARDEN ++ bool "Disable unprivileged PERF_EVENTS usage by default" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on PERF_EVENTS ++ help ++ If you say Y here, the range of acceptable values for the ++ /proc/sys/kernel/perf_event_paranoid sysctl will be expanded to allow and ++ default to a new value: 3. When the sysctl is set to this value, no ++ unprivileged use of the PERF_EVENTS syscall interface will be permitted. ++ ++ Though PERF_EVENTS can be used legitimately for performance monitoring ++ and low-level application profiling, it is forced on regardless of ++ configuration, has been at fault for several vulnerabilities, and ++ creates new opportunities for side channels and other information leaks. ++ ++ This feature puts PERF_EVENTS into a secure default state and permits ++ the administrator to change out of it temporarily if unprivileged ++ application profiling is needed. ++ ++config GRKERNSEC_RAND_THREADSTACK ++ bool "Insert random gaps between thread stacks" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on PAX_RANDMMAP && !PPC ++ help ++ If you say Y here, a random-sized gap will be enforced between allocated ++ thread stacks. Glibc's NPTL and other threading libraries that ++ pass MAP_STACK to the kernel for thread stack allocation are supported. ++ The implementation currently provides 8 bits of entropy for the gap. ++ ++ Many distributions do not compile threaded remote services with the ++ -fstack-check argument to GCC, causing the variable-sized stack-based ++ allocator, alloca(), to not probe the stack on allocation. This ++ permits an unbounded alloca() to skip over any guard page and potentially ++ modify another thread's stack reliably. An enforced random gap ++ reduces the reliability of such an attack and increases the chance ++ that such a read/write to another thread's stack instead lands in ++ an unmapped area, causing a crash and triggering grsecurity's ++ anti-bruteforcing logic. ++ ++config GRKERNSEC_PROC_MEMMAP ++ bool "Harden ASLR against information leaks and entropy reduction" ++ default y if (GRKERNSEC_CONFIG_AUTO || PAX_NOEXEC || PAX_ASLR) ++ depends on PAX_NOEXEC || PAX_ASLR ++ help ++ If you say Y here, the /proc/<pid>/maps and /proc/<pid>/stat files will ++ give no information about the addresses of its mappings if ++ PaX features that rely on random addresses are enabled on the task. ++ In addition to sanitizing this information and disabling other ++ dangerous sources of information, this option causes reads of sensitive ++ /proc/<pid> entries where the file descriptor was opened in a different ++ task than the one performing the read. Such attempts are logged. ++ This option also limits argv/env strings for suid/sgid binaries ++ to 512KB to prevent a complete exhaustion of the stack entropy provided ++ by ASLR. Finally, it places an 8MB stack resource limit on suid/sgid ++ binaries to prevent alternative mmap layouts from being abused. ++ ++ If you use PaX it is essential that you say Y here as it closes up ++ several holes that make full ASLR useless locally. ++ ++ ++config GRKERNSEC_KSTACKOVERFLOW ++ bool "Prevent kernel stack overflows" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on !IA64 && 64BIT ++ help ++ If you say Y here, the kernel's process stacks will be allocated ++ with vmalloc instead of the kernel's default allocator. This ++ introduces guard pages that in combination with the alloca checking ++ of the STACKLEAK feature prevents all forms of kernel process stack ++ overflow abuse. Note that this is different from kernel stack ++ buffer overflows. ++ ++config GRKERNSEC_BRUTE ++ bool "Deter exploit bruteforcing" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, attempts to bruteforce exploits against forking ++ daemons such as apache or sshd, as well as against suid/sgid binaries ++ will be deterred. When a child of a forking daemon is killed by PaX ++ or crashes due to an illegal instruction or other suspicious signal, ++ the parent process will be delayed 30 seconds upon every subsequent ++ fork until the administrator is able to assess the situation and ++ restart the daemon. ++ In the suid/sgid case, the attempt is logged, the user has all their ++ existing instances of the suid/sgid binary terminated and will ++ be unable to execute any suid/sgid binaries for 15 minutes. ++ ++ It is recommended that you also enable signal logging in the auditing ++ section so that logs are generated when a process triggers a suspicious ++ signal. ++ If the sysctl option is enabled, a sysctl option with name ++ "deter_bruteforce" is created. ++ ++config GRKERNSEC_MODHARDEN ++ bool "Harden module auto-loading" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on MODULES ++ help ++ If you say Y here, module auto-loading in response to use of some ++ feature implemented by an unloaded module will be restricted to ++ root users. Enabling this option helps defend against attacks ++ by unprivileged users who abuse the auto-loading behavior to ++ cause a vulnerable module to load that is then exploited. ++ ++ If this option prevents a legitimate use of auto-loading for a ++ non-root user, the administrator can execute modprobe manually ++ with the exact name of the module mentioned in the alert log. ++ Alternatively, the administrator can add the module to the list ++ of modules loaded at boot by modifying init scripts. ++ ++ Modification of init scripts will most likely be needed on ++ Ubuntu servers with encrypted home directory support enabled, ++ as the first non-root user logging in will cause the ecb(aes), ++ ecb(aes)-all, cbc(aes), and cbc(aes)-all modules to be loaded. ++ ++config GRKERNSEC_HIDESYM ++ bool "Hide kernel symbols" ++ default y if GRKERNSEC_CONFIG_AUTO ++ select PAX_USERCOPY_SLABS ++ help ++ If you say Y here, getting information on loaded modules, and ++ displaying all kernel symbols through a syscall will be restricted ++ to users with CAP_SYS_MODULE. For software compatibility reasons, ++ /proc/kallsyms will be restricted to the root user. The RBAC ++ system can hide that entry even from root. ++ ++ This option also prevents leaking of kernel addresses through ++ several /proc entries. ++ ++ Note that this option is only effective provided the following ++ conditions are met: ++ 1) The kernel using grsecurity is not precompiled by some distribution ++ 2) You have also enabled GRKERNSEC_DMESG ++ 3) You are using the RBAC system and hiding other files such as your ++ kernel image and System.map. Alternatively, enabling this option ++ causes the permissions on /boot, /lib/modules, and the kernel ++ source directory to change at compile time to prevent ++ reading by non-root users. ++ If the above conditions are met, this option will aid in providing a ++ useful protection against local kernel exploitation of overflows ++ and arbitrary read/write vulnerabilities. ++ ++ It is highly recommended that you enable GRKERNSEC_PERF_HARDEN ++ in addition to this feature. ++ ++config GRKERNSEC_RANDSTRUCT ++ bool "Randomize layout of sensitive kernel structures" ++ default y if GRKERNSEC_CONFIG_AUTO ++ select GRKERNSEC_HIDESYM ++ select MODVERSIONS if MODULES ++ help ++ If you say Y here, the layouts of a number of sensitive kernel ++ structures (task, fs, cred, etc) and all structures composed entirely ++ of function pointers (aka "ops" structs) will be randomized at compile-time. ++ This can introduce the requirement of an additional infoleak ++ vulnerability for exploits targeting these structure types. ++ ++ Enabling this feature will introduce some performance impact, slightly ++ increase memory usage, and prevent the use of forensic tools like ++ Volatility against the system (unless the kernel source tree isn't ++ cleaned after kernel installation). ++ ++ The seed used for compilation is located at tools/gcc/randomize_layout_seed.h. ++ It remains after a make clean to allow for external modules to be compiled ++ with the existing seed and will be removed by a make mrproper or ++ make distclean. ++ ++ Note that the implementation requires gcc 4.6.4. or newer. You may need ++ to install the supporting headers explicitly in addition to the normal ++ gcc package. ++ ++config GRKERNSEC_RANDSTRUCT_PERFORMANCE ++ bool "Use cacheline-aware structure randomization" ++ depends on GRKERNSEC_RANDSTRUCT ++ default y if GRKERNSEC_CONFIG_PRIORITY_PERF ++ help ++ If you say Y here, the RANDSTRUCT randomization will make a best effort ++ at restricting randomization to cacheline-sized groups of elements. It ++ will further not randomize bitfields in structures. This reduces the ++ performance hit of RANDSTRUCT at the cost of weakened randomization. ++ ++config GRKERNSEC_KERN_LOCKOUT ++ bool "Active kernel exploit response" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on X86 || ARM || PPC || SPARC ++ help ++ If you say Y here, when a PaX alert is triggered due to suspicious ++ activity in the kernel (from KERNEXEC/UDEREF/USERCOPY) ++ or an OOPS occurs due to bad memory accesses, instead of just ++ terminating the offending process (and potentially allowing ++ a subsequent exploit from the same user), we will take one of two ++ actions: ++ If the user was root, we will panic the system ++ If the user was non-root, we will log the attempt, terminate ++ all processes owned by the user, then prevent them from creating ++ any new processes until the system is restarted ++ This deters repeated kernel exploitation/bruteforcing attempts ++ and is useful for later forensics. ++ ++config GRKERNSEC_OLD_ARM_USERLAND ++ bool "Old ARM userland compatibility" ++ depends on ARM && (CPU_V6 || CPU_V6K || CPU_V7) ++ help ++ If you say Y here, stubs of executable code to perform such operations ++ as "compare-exchange" will be placed at fixed locations in the ARM vector ++ table. This is unfortunately needed for old ARM userland meant to run ++ across a wide range of processors. Without this option enabled, ++ the get_tls and data memory barrier stubs will be emulated by the kernel, ++ which is enough for Linaro userlands or other userlands designed for v6 ++ and newer ARM CPUs. It's recommended that you try without this option enabled ++ first, and only enable it if your userland does not boot (it will likely fail ++ at init time). ++ ++endmenu ++menu "Role Based Access Control Options" ++depends on GRKERNSEC ++ ++config GRKERNSEC_RBAC_DEBUG ++ bool ++ ++config GRKERNSEC_NO_RBAC ++ bool "Disable RBAC system" ++ help ++ If you say Y here, the /dev/grsec device will be removed from the kernel, ++ preventing the RBAC system from being enabled. You should only say Y ++ here if you have no intention of using the RBAC system, so as to prevent ++ an attacker with root access from misusing the RBAC system to hide files ++ and processes when loadable module support and /dev/[k]mem have been ++ locked down. ++ ++config GRKERNSEC_ACL_HIDEKERN ++ bool "Hide kernel processes" ++ help ++ If you say Y here, all kernel threads will be hidden to all ++ processes but those whose subject has the "view hidden processes" ++ flag. ++ ++config GRKERNSEC_ACL_MAXTRIES ++ int "Maximum tries before password lockout" ++ default 3 ++ help ++ This option enforces the maximum number of times a user can attempt ++ to authorize themselves with the grsecurity RBAC system before being ++ denied the ability to attempt authorization again for a specified time. ++ The lower the number, the harder it will be to brute-force a password. ++ ++config GRKERNSEC_ACL_TIMEOUT ++ int "Time to wait after max password tries, in seconds" ++ default 30 ++ help ++ This option specifies the time the user must wait after attempting to ++ authorize to the RBAC system with the maximum number of invalid ++ passwords. The higher the number, the harder it will be to brute-force ++ a password. ++ ++endmenu ++menu "Filesystem Protections" ++depends on GRKERNSEC ++ ++config GRKERNSEC_PROC ++ bool "Proc restrictions" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, the permissions of the /proc filesystem ++ will be altered to enhance system security and privacy. You MUST ++ choose either a user only restriction or a user and group restriction. ++ Depending upon the option you choose, you can either restrict users to ++ see only the processes they themselves run, or choose a group that can ++ view all processes and files normally restricted to root if you choose ++ the "restrict to user only" option. NOTE: If you're running identd or ++ ntpd as a non-root user, you will have to run it as the group you ++ specify here. ++ ++config GRKERNSEC_PROC_USER ++ bool "Restrict /proc to user only" ++ depends on GRKERNSEC_PROC ++ help ++ If you say Y here, non-root users will only be able to view their own ++ processes, and restricts them from viewing network-related information, ++ and viewing kernel symbol and module information. ++ ++config GRKERNSEC_PROC_USERGROUP ++ bool "Allow special group" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_PROC && !GRKERNSEC_PROC_USER ++ help ++ If you say Y here, you will be able to select a group that will be ++ able to view all processes and network-related information. If you've ++ enabled GRKERNSEC_HIDESYM, kernel and symbol information may still ++ remain hidden. This option is useful if you want to run identd as ++ a non-root user. The group you select may also be chosen at boot time ++ via "grsec_proc_gid=" on the kernel commandline. ++ ++config GRKERNSEC_PROC_GID ++ int "GID for special group" ++ depends on GRKERNSEC_PROC_USERGROUP ++ default 1001 ++ ++config GRKERNSEC_PROC_ADD ++ bool "Additional restrictions" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_PROC_USER || GRKERNSEC_PROC_USERGROUP ++ help ++ If you say Y here, additional restrictions will be placed on ++ /proc that keep normal users from viewing device information and ++ slabinfo information that could be useful for exploits. ++ ++config GRKERNSEC_LINK ++ bool "Linking restrictions" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, /tmp race exploits will be prevented, since users ++ will no longer be able to follow symlinks owned by other users in ++ world-writable +t directories (e.g. /tmp), unless the owner of the ++ symlink is the owner of the directory. users will also not be ++ able to hardlink to files they do not own. If the sysctl option is ++ enabled, a sysctl option with name "linking_restrictions" is created. ++ ++config GRKERNSEC_SYMLINKOWN ++ bool "Kernel-enforced SymlinksIfOwnerMatch" ++ default y if GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_SERVER ++ help ++ Apache's SymlinksIfOwnerMatch option has an inherent race condition ++ that prevents it from being used as a security feature. As Apache ++ verifies the symlink by performing a stat() against the target of ++ the symlink before it is followed, an attacker can setup a symlink ++ to point to a same-owned file, then replace the symlink with one ++ that targets another user's file just after Apache "validates" the ++ symlink -- a classic TOCTOU race. If you say Y here, a complete, ++ race-free replacement for Apache's "SymlinksIfOwnerMatch" option ++ will be in place for the group you specify. If the sysctl option ++ is enabled, a sysctl option with name "enforce_symlinksifowner" is ++ created. ++ ++config GRKERNSEC_SYMLINKOWN_GID ++ int "GID for users with kernel-enforced SymlinksIfOwnerMatch" ++ depends on GRKERNSEC_SYMLINKOWN ++ default 1006 ++ help ++ Setting this GID determines what group kernel-enforced ++ SymlinksIfOwnerMatch will be enabled for. If the sysctl option ++ is enabled, a sysctl option with name "symlinkown_gid" is created. ++ ++config GRKERNSEC_FIFO ++ bool "FIFO restrictions" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, users will not be able to write to FIFOs they don't ++ own in world-writable +t directories (e.g. /tmp), unless the owner of ++ the FIFO is the same owner of the directory it's held in. If the sysctl ++ option is enabled, a sysctl option with name "fifo_restrictions" is ++ created. ++ ++config GRKERNSEC_SYSFS_RESTRICT ++ bool "Sysfs/debugfs restriction" ++ default y if (GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_SERVER) ++ depends on SYSFS ++ help ++ If you say Y here, sysfs (the pseudo-filesystem mounted at /sys) and ++ any filesystem normally mounted under it (e.g. debugfs) will be ++ mostly accessible only by root. These filesystems generally provide access ++ to hardware and debug information that isn't appropriate for unprivileged ++ users of the system. Sysfs and debugfs have also become a large source ++ of new vulnerabilities, ranging from infoleaks to local compromise. ++ There has been very little oversight with an eye toward security involved ++ in adding new exporters of information to these filesystems, so their ++ use is discouraged. ++ For reasons of compatibility, a few directories have been whitelisted ++ for access by non-root users: ++ /sys/fs/selinux ++ /sys/fs/fuse ++ /sys/devices/system/cpu ++ ++config GRKERNSEC_ROFS ++ bool "Runtime read-only mount protection" ++ depends on SYSCTL ++ help ++ If you say Y here, a sysctl option with name "romount_protect" will ++ be created. By setting this option to 1 at runtime, filesystems ++ will be protected in the following ways: ++ * No new writable mounts will be allowed ++ * Existing read-only mounts won't be able to be remounted read/write ++ * Write operations will be denied on all block devices ++ This option acts independently of grsec_lock: once it is set to 1, ++ it cannot be turned off. Therefore, please be mindful of the resulting ++ behavior if this option is enabled in an init script on a read-only ++ filesystem. ++ Also be aware that as with other root-focused features, GRKERNSEC_KMEM ++ and GRKERNSEC_IO should be enabled and module loading disabled via ++ config or at runtime. ++ This feature is mainly intended for secure embedded systems. ++ ++ ++config GRKERNSEC_DEVICE_SIDECHANNEL ++ bool "Eliminate stat/notify-based device sidechannels" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, timing analyses on block or character ++ devices like /dev/ptmx using stat or inotify/dnotify/fanotify ++ will be thwarted for unprivileged users. If a process without ++ CAP_MKNOD stats such a device, the last access and last modify times ++ will match the device's create time. No access or modify events ++ will be triggered through inotify/dnotify/fanotify for such devices. ++ This feature will prevent attacks that may at a minimum ++ allow an attacker to determine the administrator's password length. ++ ++config GRKERNSEC_CHROOT ++ bool "Chroot jail restrictions" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, you will be able to choose several options that will ++ make breaking out of a chrooted jail much more difficult. If you ++ encounter no software incompatibilities with the following options, it ++ is recommended that you enable each one. ++ ++ Note that the chroot restrictions are not intended to apply to "chroots" ++ to directories that are simple bind mounts of the global root filesystem. ++ For several other reasons, a user shouldn't expect any significant ++ security by performing such a chroot. ++ ++config GRKERNSEC_CHROOT_MOUNT ++ bool "Deny mounts" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to ++ mount or remount filesystems. If the sysctl option is enabled, a ++ sysctl option with name "chroot_deny_mount" is created. ++ ++config GRKERNSEC_CHROOT_DOUBLE ++ bool "Deny double-chroots" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to chroot ++ again outside the chroot. This is a widely used method of breaking ++ out of a chroot jail and should not be allowed. If the sysctl ++ option is enabled, a sysctl option with name ++ "chroot_deny_chroot" is created. ++ ++config GRKERNSEC_CHROOT_PIVOT ++ bool "Deny pivot_root in chroot" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to use ++ a function called pivot_root() that was introduced in Linux 2.3.41. It ++ works similar to chroot in that it changes the root filesystem. This ++ function could be misused in a chrooted process to attempt to break out ++ of the chroot, and therefore should not be allowed. If the sysctl ++ option is enabled, a sysctl option with name "chroot_deny_pivot" is ++ created. ++ ++config GRKERNSEC_CHROOT_CHDIR ++ bool "Enforce chdir(\"/\") on all chroots" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, the current working directory of all newly-chrooted ++ applications will be set to the the root directory of the chroot. ++ The man page on chroot(2) states: ++ Note that this call does not change the current working ++ directory, so that `.' can be outside the tree rooted at ++ `/'. In particular, the super-user can escape from a ++ `chroot jail' by doing `mkdir foo; chroot foo; cd ..'. ++ ++ It is recommended that you say Y here, since it's not known to break ++ any software. If the sysctl option is enabled, a sysctl option with ++ name "chroot_enforce_chdir" is created. ++ ++config GRKERNSEC_CHROOT_CHMOD ++ bool "Deny (f)chmod +s" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to chmod ++ or fchmod files to make them have suid or sgid bits. This protects ++ against another published method of breaking a chroot. If the sysctl ++ option is enabled, a sysctl option with name "chroot_deny_chmod" is ++ created. ++ ++config GRKERNSEC_CHROOT_FCHDIR ++ bool "Deny fchdir and fhandle out of chroot" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, a well-known method of breaking chroots by fchdir'ing ++ to a file descriptor of the chrooting process that points to a directory ++ outside the filesystem will be stopped. Additionally, this option prevents ++ use of the recently-created syscall for opening files by a guessable "file ++ handle" inside a chroot. If the sysctl option is enabled, a sysctl option ++ with name "chroot_deny_fchdir" is created. ++ ++config GRKERNSEC_CHROOT_MKNOD ++ bool "Deny mknod" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be allowed to ++ mknod. The problem with using mknod inside a chroot is that it ++ would allow an attacker to create a device entry that is the same ++ as one on the physical root of your system, which could range from ++ anything from the console device to a device for your harddrive (which ++ they could then use to wipe the drive or steal data). It is recommended ++ that you say Y here, unless you run into software incompatibilities. ++ If the sysctl option is enabled, a sysctl option with name ++ "chroot_deny_mknod" is created. ++ ++config GRKERNSEC_CHROOT_SHMAT ++ bool "Deny shmat() out of chroot" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to attach ++ to shared memory segments that were created outside of the chroot jail. ++ It is recommended that you say Y here. If the sysctl option is enabled, ++ a sysctl option with name "chroot_deny_shmat" is created. ++ ++config GRKERNSEC_CHROOT_UNIX ++ bool "Deny access to abstract AF_UNIX sockets out of chroot" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to ++ connect to abstract (meaning not belonging to a filesystem) Unix ++ domain sockets that were bound outside of a chroot. It is recommended ++ that you say Y here. If the sysctl option is enabled, a sysctl option ++ with name "chroot_deny_unix" is created. ++ ++config GRKERNSEC_CHROOT_FINDTASK ++ bool "Protect outside processes" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to ++ kill, send signals with fcntl, ptrace, capget, getpgid, setpgid, ++ getsid, or view any process outside of the chroot. If the sysctl ++ option is enabled, a sysctl option with name "chroot_findtask" is ++ created. ++ ++config GRKERNSEC_CHROOT_NICE ++ bool "Restrict priority changes" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, processes inside a chroot will not be able to raise ++ the priority of processes in the chroot, or alter the priority of ++ processes outside the chroot. This provides more security than simply ++ removing CAP_SYS_NICE from the process' capability set. If the ++ sysctl option is enabled, a sysctl option with name "chroot_restrict_nice" ++ is created. ++ ++config GRKERNSEC_CHROOT_SYSCTL ++ bool "Deny sysctl writes" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, an attacker in a chroot will not be able to ++ write to sysctl entries, either by sysctl(2) or through a /proc ++ interface. It is strongly recommended that you say Y here. If the ++ sysctl option is enabled, a sysctl option with name ++ "chroot_deny_sysctl" is created. ++ ++config GRKERNSEC_CHROOT_RENAME ++ bool "Deny bad renames" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, an attacker in a chroot will not be able to ++ abuse the ability to create double chroots to break out of the ++ chroot by exploiting a race condition between a rename of a directory ++ within a chroot against an open of a symlink with relative path ++ components. This feature will likewise prevent an accomplice outside ++ a chroot from enabling a user inside the chroot to break out and make ++ use of their credentials on the global filesystem. Enabling this ++ feature is essential to prevent root users from breaking out of a ++ chroot. If the sysctl option is enabled, a sysctl option with name ++ "chroot_deny_bad_rename" is created. ++ ++config GRKERNSEC_CHROOT_CAPS ++ bool "Capability restrictions" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT ++ help ++ If you say Y here, the capabilities on all processes within a ++ chroot jail will be lowered to stop module insertion, raw i/o, ++ system and net admin tasks, rebooting the system, modifying immutable ++ files, modifying IPC owned by another, and changing the system time. ++ This is left an option because it can break some apps. Disable this ++ if your chrooted apps are having problems performing those kinds of ++ tasks. If the sysctl option is enabled, a sysctl option with ++ name "chroot_caps" is created. ++ ++config GRKERNSEC_CHROOT_INITRD ++ bool "Exempt initrd tasks from restrictions" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_CHROOT && BLK_DEV_INITRD ++ help ++ If you say Y here, tasks started prior to init will be exempted from ++ grsecurity's chroot restrictions. This option is mainly meant to ++ resolve Plymouth's performing privileged operations unnecessarily ++ in a chroot. ++ ++endmenu ++menu "Kernel Auditing" ++depends on GRKERNSEC ++ ++config GRKERNSEC_AUDIT_GROUP ++ bool "Single group for auditing" ++ help ++ If you say Y here, the exec and chdir logging features will only operate ++ on a group you specify. This option is recommended if you only want to ++ watch certain users instead of having a large amount of logs from the ++ entire system. If the sysctl option is enabled, a sysctl option with ++ name "audit_group" is created. ++ ++config GRKERNSEC_AUDIT_GID ++ int "GID for auditing" ++ depends on GRKERNSEC_AUDIT_GROUP ++ default 1007 ++ ++config GRKERNSEC_EXECLOG ++ bool "Exec logging" ++ help ++ If you say Y here, all execve() calls will be logged (since the ++ other exec*() calls are frontends to execve(), all execution ++ will be logged). Useful for shell-servers that like to keep track ++ of their users. If the sysctl option is enabled, a sysctl option with ++ name "exec_logging" is created. ++ WARNING: This option when enabled will produce a LOT of logs, especially ++ on an active system. ++ ++config GRKERNSEC_RESLOG ++ bool "Resource logging" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, all attempts to overstep resource limits will ++ be logged with the resource name, the requested size, and the current ++ limit. It is highly recommended that you say Y here. If the sysctl ++ option is enabled, a sysctl option with name "resource_logging" is ++ created. If the RBAC system is enabled, the sysctl value is ignored. ++ ++config GRKERNSEC_CHROOT_EXECLOG ++ bool "Log execs within chroot" ++ help ++ If you say Y here, all executions inside a chroot jail will be logged ++ to syslog. This can cause a large amount of logs if certain ++ applications (eg. djb's daemontools) are installed on the system, and ++ is therefore left as an option. If the sysctl option is enabled, a ++ sysctl option with name "chroot_execlog" is created. ++ ++config GRKERNSEC_AUDIT_PTRACE ++ bool "Ptrace logging" ++ help ++ If you say Y here, all attempts to attach to a process via ptrace ++ will be logged. If the sysctl option is enabled, a sysctl option ++ with name "audit_ptrace" is created. ++ ++config GRKERNSEC_AUDIT_CHDIR ++ bool "Chdir logging" ++ help ++ If you say Y here, all chdir() calls will be logged. If the sysctl ++ option is enabled, a sysctl option with name "audit_chdir" is created. ++ ++config GRKERNSEC_AUDIT_MOUNT ++ bool "(Un)Mount logging" ++ help ++ If you say Y here, all mounts and unmounts will be logged. If the ++ sysctl option is enabled, a sysctl option with name "audit_mount" is ++ created. ++ ++config GRKERNSEC_SIGNAL ++ bool "Signal logging" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, certain important signals will be logged, such as ++ SIGSEGV, which will as a result inform you of when a error in a program ++ occurred, which in some cases could mean a possible exploit attempt. ++ If the sysctl option is enabled, a sysctl option with name ++ "signal_logging" is created. ++ ++config GRKERNSEC_FORKFAIL ++ bool "Fork failure logging" ++ help ++ If you say Y here, all failed fork() attempts will be logged. ++ This could suggest a fork bomb, or someone attempting to overstep ++ their process limit. If the sysctl option is enabled, a sysctl option ++ with name "forkfail_logging" is created. ++ ++config GRKERNSEC_TIME ++ bool "Time change logging" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, any changes of the system clock will be logged. ++ If the sysctl option is enabled, a sysctl option with name ++ "timechange_logging" is created. ++ ++config GRKERNSEC_PROC_IPADDR ++ bool "/proc/<pid>/ipaddr support" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, a new entry will be added to each /proc/<pid> ++ directory that contains the IP address of the person using the task. ++ The IP is carried across local TCP and AF_UNIX stream sockets. ++ This information can be useful for IDS/IPSes to perform remote response ++ to a local attack. The entry is readable by only the owner of the ++ process (and root if he has CAP_DAC_OVERRIDE, which can be removed via ++ the RBAC system), and thus does not create privacy concerns. ++ ++config GRKERNSEC_RWXMAP_LOG ++ bool 'Denied RWX mmap/mprotect logging' ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on PAX_MPROTECT && !PAX_EMUPLT && !PAX_EMUSIGRT ++ help ++ If you say Y here, calls to mmap() and mprotect() with explicit ++ usage of PROT_WRITE and PROT_EXEC together will be logged when ++ denied by the PAX_MPROTECT feature. This feature will also ++ log other problematic scenarios that can occur when PAX_MPROTECT ++ is enabled on a binary, like textrels and PT_GNU_STACK. If the ++ sysctl option is enabled, a sysctl option with name "rwxmap_logging" ++ is created. ++ ++endmenu ++ ++menu "Executable Protections" ++depends on GRKERNSEC ++ ++config GRKERNSEC_DMESG ++ bool "Dmesg(8) restriction" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, non-root users will not be able to use dmesg(8) ++ to view the contents of the kernel's circular log buffer. ++ The kernel's log buffer often contains kernel addresses and other ++ identifying information useful to an attacker in fingerprinting a ++ system for a targeted exploit. ++ If the sysctl option is enabled, a sysctl option with name "dmesg" is ++ created. ++ ++config GRKERNSEC_HARDEN_PTRACE ++ bool "Deter ptrace-based process snooping" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, TTY sniffers and other malicious monitoring ++ programs implemented through ptrace will be defeated. If you ++ have been using the RBAC system, this option has already been ++ enabled for several years for all users, with the ability to make ++ fine-grained exceptions. ++ ++ This option only affects the ability of non-root users to ptrace ++ processes that are not a descendent of the ptracing process. ++ This means that strace ./binary and gdb ./binary will still work, ++ but attaching to arbitrary processes will not. If the sysctl ++ option is enabled, a sysctl option with name "harden_ptrace" is ++ created. ++ ++config GRKERNSEC_PTRACE_READEXEC ++ bool "Require read access to ptrace sensitive binaries" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, unprivileged users will not be able to ptrace unreadable ++ binaries. This option is useful in environments that ++ remove the read bits (e.g. file mode 4711) from suid binaries to ++ prevent infoleaking of their contents. This option adds ++ consistency to the use of that file mode, as the binary could normally ++ be read out when run without privileges while ptracing. ++ ++ If the sysctl option is enabled, a sysctl option with name "ptrace_readexec" ++ is created. ++ ++config GRKERNSEC_SETXID ++ bool "Enforce consistent multithreaded privileges" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on (X86 || SPARC64 || PPC || ARM || MIPS) ++ help ++ If you say Y here, a change from a root uid to a non-root uid ++ in a multithreaded application will cause the resulting uids, ++ gids, supplementary groups, and capabilities in that thread ++ to be propagated to the other threads of the process. In most ++ cases this is unnecessary, as glibc will emulate this behavior ++ on behalf of the application. Other libcs do not act in the ++ same way, allowing the other threads of the process to continue ++ running with root privileges. If the sysctl option is enabled, ++ a sysctl option with name "consistent_setxid" is created. ++ ++config GRKERNSEC_HARDEN_IPC ++ bool "Disallow access to overly-permissive IPC objects" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on SYSVIPC ++ help ++ If you say Y here, access to overly-permissive IPC objects (shared ++ memory, message queues, and semaphores) will be denied for processes ++ given the following criteria beyond normal permission checks: ++ 1) If the IPC object is world-accessible and the euid doesn't match ++ that of the creator or current uid for the IPC object ++ 2) If the IPC object is group-accessible and the egid doesn't ++ match that of the creator or current gid for the IPC object ++ It's a common error to grant too much permission to these objects, ++ with impact ranging from denial of service and information leaking to ++ privilege escalation. This feature was developed in response to ++ research by Tim Brown: ++ http://labs.portcullis.co.uk/whitepapers/memory-squatting-attacks-on-system-v-shared-memory/ ++ who found hundreds of such insecure usages. Processes with ++ CAP_IPC_OWNER are still permitted to access these IPC objects. ++ If the sysctl option is enabled, a sysctl option with name ++ "harden_ipc" is created. ++ ++config GRKERNSEC_TPE ++ bool "Trusted Path Execution (TPE)" ++ default y if GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_SERVER ++ help ++ If you say Y here, you will be able to choose a gid to add to the ++ supplementary groups of users you want to mark as "untrusted." ++ These users will not be able to execute any files that are not in ++ root-owned directories writable only by root. If the sysctl option ++ is enabled, a sysctl option with name "tpe" is created. ++ ++config GRKERNSEC_TPE_ALL ++ bool "Partially restrict all non-root users" ++ depends on GRKERNSEC_TPE ++ help ++ If you say Y here, all non-root users will be covered under ++ a weaker TPE restriction. This is separate from, and in addition to, ++ the main TPE options that you have selected elsewhere. Thus, if a ++ "trusted" GID is chosen, this restriction applies to even that GID. ++ Under this restriction, all non-root users will only be allowed to ++ execute files in directories they own that are not group or ++ world-writable, or in directories owned by root and writable only by ++ root. If the sysctl option is enabled, a sysctl option with name ++ "tpe_restrict_all" is created. ++ ++config GRKERNSEC_TPE_INVERT ++ bool "Invert GID option" ++ depends on GRKERNSEC_TPE ++ help ++ If you say Y here, the group you specify in the TPE configuration will ++ decide what group TPE restrictions will be *disabled* for. This ++ option is useful if you want TPE restrictions to be applied to most ++ users on the system. If the sysctl option is enabled, a sysctl option ++ with name "tpe_invert" is created. Unlike other sysctl options, this ++ entry will default to on for backward-compatibility. ++ ++config GRKERNSEC_TPE_GID ++ int ++ default GRKERNSEC_TPE_UNTRUSTED_GID if (GRKERNSEC_TPE && !GRKERNSEC_TPE_INVERT) ++ default GRKERNSEC_TPE_TRUSTED_GID if (GRKERNSEC_TPE && GRKERNSEC_TPE_INVERT) ++ ++config GRKERNSEC_TPE_UNTRUSTED_GID ++ int "GID for TPE-untrusted users" ++ depends on GRKERNSEC_TPE && !GRKERNSEC_TPE_INVERT ++ default 1005 ++ help ++ Setting this GID determines what group TPE restrictions will be ++ *enabled* for. If the sysctl option is enabled, a sysctl option ++ with name "tpe_gid" is created. ++ ++config GRKERNSEC_TPE_TRUSTED_GID ++ int "GID for TPE-trusted users" ++ depends on GRKERNSEC_TPE && GRKERNSEC_TPE_INVERT ++ default 1005 ++ help ++ Setting this GID determines what group TPE restrictions will be ++ *disabled* for. If the sysctl option is enabled, a sysctl option ++ with name "tpe_gid" is created. ++ ++endmenu ++menu "Network Protections" ++depends on GRKERNSEC ++ ++config GRKERNSEC_BLACKHOLE ++ bool "TCP/UDP blackhole and LAST_ACK DoS prevention" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on NET ++ help ++ If you say Y here, neither TCP resets nor ICMP ++ destination-unreachable packets will be sent in response to packets ++ sent to ports for which no associated listening process exists. ++ It will also prevent the sending of ICMP protocol unreachable packets ++ in response to packets with unknown protocols. ++ This feature supports both IPV4 and IPV6 and exempts the ++ loopback interface from blackholing. Enabling this feature ++ makes a host more resilient to DoS attacks and reduces network ++ visibility against scanners. ++ ++ The blackhole feature as-implemented is equivalent to the FreeBSD ++ blackhole feature, as it prevents RST responses to all packets, not ++ just SYNs. Under most application behavior this causes no ++ problems, but applications (like haproxy) may not close certain ++ connections in a way that cleanly terminates them on the remote ++ end, leaving the remote host in LAST_ACK state. Because of this ++ side-effect and to prevent intentional LAST_ACK DoSes, this ++ feature also adds automatic mitigation against such attacks. ++ The mitigation drastically reduces the amount of time a socket ++ can spend in LAST_ACK state. If you're using haproxy and not ++ all servers it connects to have this option enabled, consider ++ disabling this feature on the haproxy host. ++ ++ If the sysctl option is enabled, two sysctl options with names ++ "ip_blackhole" and "lastack_retries" will be created. ++ While "ip_blackhole" takes the standard zero/non-zero on/off ++ toggle, "lastack_retries" uses the same kinds of values as ++ "tcp_retries1" and "tcp_retries2". The default value of 4 ++ prevents a socket from lasting more than 45 seconds in LAST_ACK ++ state. ++ ++config GRKERNSEC_NO_SIMULT_CONNECT ++ bool "Disable TCP Simultaneous Connect" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on NET ++ help ++ If you say Y here, a feature by Willy Tarreau will be enabled that ++ removes a weakness in Linux's strict implementation of TCP that ++ allows two clients to connect to each other without either entering ++ a listening state. The weakness allows an attacker to easily prevent ++ a client from connecting to a known server provided the source port ++ for the connection is guessed correctly. ++ ++ As the weakness could be used to prevent an antivirus or IPS from ++ fetching updates, or prevent an SSL gateway from fetching a CRL, ++ it should be eliminated by enabling this option. Though Linux is ++ one of few operating systems supporting simultaneous connect, it ++ has no legitimate use in practice and is rarely supported by firewalls. ++ ++config GRKERNSEC_SOCKET ++ bool "Socket restrictions" ++ depends on NET ++ help ++ If you say Y here, you will be able to choose from several options. ++ If you assign a GID on your system and add it to the supplementary ++ groups of users you want to restrict socket access to, this patch ++ will perform up to three things, based on the option(s) you choose. ++ ++config GRKERNSEC_SOCKET_ALL ++ bool "Deny any sockets to group" ++ depends on GRKERNSEC_SOCKET ++ help ++ If you say Y here, you will be able to choose a GID of whose users will ++ be unable to connect to other hosts from your machine or run server ++ applications from your machine. If the sysctl option is enabled, a ++ sysctl option with name "socket_all" is created. ++ ++config GRKERNSEC_SOCKET_ALL_GID ++ int "GID to deny all sockets for" ++ depends on GRKERNSEC_SOCKET_ALL ++ default 1004 ++ help ++ Here you can choose the GID to disable socket access for. Remember to ++ add the users you want socket access disabled for to the GID ++ specified here. If the sysctl option is enabled, a sysctl option ++ with name "socket_all_gid" is created. ++ ++config GRKERNSEC_SOCKET_CLIENT ++ bool "Deny client sockets to group" ++ depends on GRKERNSEC_SOCKET ++ help ++ If you say Y here, you will be able to choose a GID of whose users will ++ be unable to connect to other hosts from your machine, but will be ++ able to run servers. If this option is enabled, all users in the group ++ you specify will have to use passive mode when initiating ftp transfers ++ from the shell on your machine. If the sysctl option is enabled, a ++ sysctl option with name "socket_client" is created. ++ ++config GRKERNSEC_SOCKET_CLIENT_GID ++ int "GID to deny client sockets for" ++ depends on GRKERNSEC_SOCKET_CLIENT ++ default 1003 ++ help ++ Here you can choose the GID to disable client socket access for. ++ Remember to add the users you want client socket access disabled for to ++ the GID specified here. If the sysctl option is enabled, a sysctl ++ option with name "socket_client_gid" is created. ++ ++config GRKERNSEC_SOCKET_SERVER ++ bool "Deny server sockets to group" ++ depends on GRKERNSEC_SOCKET ++ help ++ If you say Y here, you will be able to choose a GID of whose users will ++ be unable to run server applications from your machine. If the sysctl ++ option is enabled, a sysctl option with name "socket_server" is created. ++ ++config GRKERNSEC_SOCKET_SERVER_GID ++ int "GID to deny server sockets for" ++ depends on GRKERNSEC_SOCKET_SERVER ++ default 1002 ++ help ++ Here you can choose the GID to disable server socket access for. ++ Remember to add the users you want server socket access disabled for to ++ the GID specified here. If the sysctl option is enabled, a sysctl ++ option with name "socket_server_gid" is created. ++ ++endmenu ++ ++menu "Physical Protections" ++depends on GRKERNSEC ++ ++config GRKERNSEC_DENYUSB ++ bool "Deny new USB connections after toggle" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on SYSCTL && USB_SUPPORT ++ help ++ If you say Y here, a new sysctl option with name "deny_new_usb" ++ will be created. Setting its value to 1 will prevent any new ++ USB devices from being recognized by the OS. Any attempted USB ++ device insertion will be logged. This option is intended to be ++ used against custom USB devices designed to exploit vulnerabilities ++ in various USB device drivers. ++ ++ For greatest effectiveness, this sysctl should be set after any ++ relevant init scripts. This option is safe to enable in distros ++ as each user can choose whether or not to toggle the sysctl. ++ ++config GRKERNSEC_DENYUSB_FORCE ++ bool "Reject all USB devices not connected at boot" ++ select USB ++ depends on GRKERNSEC_DENYUSB ++ help ++ If you say Y here, a variant of GRKERNSEC_DENYUSB will be enabled ++ that doesn't involve a sysctl entry. This option should only be ++ enabled if you're sure you want to deny all new USB connections ++ at runtime and don't want to modify init scripts. This should not ++ be enabled by distros. It forces the core USB code to be built ++ into the kernel image so that all devices connected at boot time ++ can be recognized and new USB device connections can be prevented ++ prior to init running. ++ ++endmenu ++ ++menu "Sysctl Support" ++depends on GRKERNSEC && SYSCTL ++ ++config GRKERNSEC_SYSCTL ++ bool "Sysctl support" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ If you say Y here, you will be able to change the options that ++ grsecurity runs with at bootup, without having to recompile your ++ kernel. You can echo values to files in /proc/sys/kernel/grsecurity ++ to enable (1) or disable (0) various features. All the sysctl entries ++ are mutable until the "grsec_lock" entry is set to a non-zero value. ++ All features enabled in the kernel configuration are disabled at boot ++ if you do not say Y to the "Turn on features by default" option. ++ All options should be set at startup, and the grsec_lock entry should ++ be set to a non-zero value after all the options are set. ++ *THIS IS EXTREMELY IMPORTANT* ++ ++config GRKERNSEC_SYSCTL_DISTRO ++ bool "Extra sysctl support for distro makers (READ HELP)" ++ depends on GRKERNSEC_SYSCTL && GRKERNSEC_IO ++ help ++ If you say Y here, additional sysctl options will be created ++ for features that affect processes running as root. Therefore, ++ it is critical when using this option that the grsec_lock entry be ++ enabled after boot. Only distros with prebuilt kernel packages ++ with this option enabled that can ensure grsec_lock is enabled ++ after boot should use this option. ++ *Failure to set grsec_lock after boot makes all grsec features ++ this option covers useless* ++ ++ Currently this option creates the following sysctl entries: ++ "Disable Privileged I/O": "disable_priv_io" ++ ++config GRKERNSEC_SYSCTL_ON ++ bool "Turn on features by default" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC_SYSCTL ++ help ++ If you say Y here, instead of having all features enabled in the ++ kernel configuration disabled at boot time, the features will be ++ enabled at boot time. It is recommended you say Y here unless ++ there is some reason you would want all sysctl-tunable features to ++ be disabled by default. As mentioned elsewhere, it is important ++ to enable the grsec_lock entry once you have finished modifying ++ the sysctl entries. ++ ++endmenu ++menu "Logging Options" ++depends on GRKERNSEC ++ ++config GRKERNSEC_FLOODTIME ++ int "Seconds in between log messages (minimum)" ++ default 10 ++ help ++ This option allows you to enforce the number of seconds between ++ grsecurity log messages. The default should be suitable for most ++ people, however, if you choose to change it, choose a value small enough ++ to allow informative logs to be produced, but large enough to ++ prevent flooding. ++ ++ Setting both this value and GRKERNSEC_FLOODBURST to 0 will disable ++ any rate limiting on grsecurity log messages. ++ ++config GRKERNSEC_FLOODBURST ++ int "Number of messages in a burst (maximum)" ++ default 6 ++ help ++ This option allows you to choose the maximum number of messages allowed ++ within the flood time interval you chose in a separate option. The ++ default should be suitable for most people, however if you find that ++ many of your logs are being interpreted as flooding, you may want to ++ raise this value. ++ ++ Setting both this value and GRKERNSEC_FLOODTIME to 0 will disable ++ any rate limiting on grsecurity log messages. ++ ++endmenu +diff --git a/grsecurity/Makefile b/grsecurity/Makefile +new file mode 100644 +index 0000000..30ababb +--- /dev/null ++++ b/grsecurity/Makefile +@@ -0,0 +1,54 @@ ++# grsecurity – access control and security hardening for Linux ++# All code in this directory and various hooks located throughout the Linux kernel are ++# Copyright (C) 2001-2014 Bradley Spengler, Open Source Security, Inc. ++# http://www.grsecurity.net spender@grsecurity.net ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License version 2 ++# as published by the Free Software Foundation. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ++ ++KBUILD_CFLAGS += -Werror ++ ++obj-y = grsec_chdir.o grsec_chroot.o grsec_exec.o grsec_fifo.o grsec_fork.o \ ++ grsec_mount.o grsec_sig.o grsec_sysctl.o \ ++ grsec_time.o grsec_tpe.o grsec_link.o grsec_pax.o grsec_ptrace.o \ ++ grsec_usb.o grsec_ipc.o grsec_proc.o ++ ++obj-$(CONFIG_GRKERNSEC) += grsec_init.o grsum.o gracl.o gracl_segv.o \ ++ gracl_cap.o gracl_alloc.o gracl_shm.o grsec_mem.o gracl_fs.o \ ++ gracl_learn.o grsec_log.o gracl_policy.o ++ifdef CONFIG_COMPAT ++obj-$(CONFIG_GRKERNSEC) += gracl_compat.o ++endif ++ ++obj-$(CONFIG_GRKERNSEC_RESLOG) += gracl_res.o ++ ++ifdef CONFIG_NET ++obj-y += grsec_sock.o ++obj-$(CONFIG_GRKERNSEC) += gracl_ip.o ++endif ++ ++ifndef CONFIG_GRKERNSEC ++obj-y += grsec_disabled.o ++endif ++ ++ifdef CONFIG_GRKERNSEC_HIDESYM ++extra-y := grsec_hidesym.o ++$(obj)/grsec_hidesym.o: ++ @-chmod -f 500 /boot ++ @-chmod -f 500 /lib/modules ++ @-chmod -f 500 /lib64/modules ++ @-chmod -f 500 /lib32/modules ++ @-chmod -f 700 . ++ @-chmod -f 700 $(objtree) ++ @echo ' grsec: protected kernel image paths' ++endif +diff --git a/grsecurity/gracl.c b/grsecurity/gracl.c +new file mode 100644 +index 0000000..6c1e154 +--- /dev/null ++++ b/grsecurity/gracl.c +@@ -0,0 +1,2749 @@ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/file.h> ++#include <linux/fs.h> ++#include <linux/namei.h> ++#include <linux/mount.h> ++#include <linux/tty.h> ++#include <linux/proc_fs.h> ++#include <linux/lglock.h> ++#include <linux/slab.h> ++#include <linux/vmalloc.h> ++#include <linux/types.h> ++#include <linux/sysctl.h> ++#include <linux/netdevice.h> ++#include <linux/ptrace.h> ++#include <linux/gracl.h> ++#include <linux/gralloc.h> ++#include <linux/security.h> ++#include <linux/grinternal.h> ++#include <linux/pid_namespace.h> ++#include <linux/stop_machine.h> ++#include <linux/fdtable.h> ++#include <linux/percpu.h> ++#include <linux/lglock.h> ++#include <linux/hugetlb.h> ++#include <linux/posix-timers.h> ++#include <linux/prefetch.h> ++#if defined(CONFIG_BTRFS_FS) || defined(CONFIG_BTRFS_FS_MODULE) ++#include <linux/magic.h> ++#include <linux/pagemap.h> ++#include "../fs/btrfs/async-thread.h" ++#include "../fs/btrfs/ctree.h" ++#include "../fs/btrfs/btrfs_inode.h" ++#endif ++#include "../fs/mount.h" ++ ++#include <asm/uaccess.h> ++#include <asm/errno.h> ++#include <asm/mman.h> ++ ++#define FOR_EACH_ROLE_START(role) \ ++ role = running_polstate.role_list; \ ++ while (role) { ++ ++#define FOR_EACH_ROLE_END(role) \ ++ role = role->prev; \ ++ } ++ ++extern struct path gr_real_root; ++ ++static struct gr_policy_state running_polstate; ++struct gr_policy_state *polstate = &running_polstate; ++extern struct gr_alloc_state *current_alloc_state; ++ ++extern char *gr_shared_page[4]; ++DEFINE_RWLOCK(gr_inode_lock); ++ ++static unsigned int gr_status __read_only = GR_STATUS_INIT; ++ ++#ifdef CONFIG_NET ++extern struct vfsmount *sock_mnt; ++#endif ++ ++extern struct vfsmount *pipe_mnt; ++extern struct vfsmount *shm_mnt; ++ ++#ifdef CONFIG_HUGETLBFS ++extern struct vfsmount *hugetlbfs_vfsmount[HUGE_MAX_HSTATE]; ++#endif ++ ++extern u16 acl_sp_role_value; ++extern struct acl_object_label *fakefs_obj_rw; ++extern struct acl_object_label *fakefs_obj_rwx; ++ ++int gr_acl_is_enabled(void) ++{ ++ return (gr_status & GR_READY); ++} ++ ++void gr_enable_rbac_system(void) ++{ ++ pax_open_kernel(); ++ gr_status |= GR_READY; ++ pax_close_kernel(); ++} ++ ++int gr_rbac_disable(void *unused) ++{ ++ pax_open_kernel(); ++ gr_status &= ~GR_READY; ++ pax_close_kernel(); ++ ++ return 0; ++} ++ ++static inline dev_t __get_dev(const struct dentry *dentry) ++{ ++#if defined(CONFIG_BTRFS_FS) || defined(CONFIG_BTRFS_FS_MODULE) ++ if (dentry->d_sb->s_magic == BTRFS_SUPER_MAGIC) ++ return BTRFS_I(dentry->d_inode)->root->anon_dev; ++ else ++#endif ++ return dentry->d_sb->s_dev; ++} ++ ++static inline u64 __get_ino(const struct dentry *dentry) ++{ ++#if defined(CONFIG_BTRFS_FS) || defined(CONFIG_BTRFS_FS_MODULE) ++ if (dentry->d_sb->s_magic == BTRFS_SUPER_MAGIC) ++ return btrfs_ino(dentry->d_inode); ++ else ++#endif ++ return dentry->d_inode->i_ino; ++} ++ ++dev_t gr_get_dev_from_dentry(struct dentry *dentry) ++{ ++ return __get_dev(dentry); ++} ++ ++u64 gr_get_ino_from_dentry(struct dentry *dentry) ++{ ++ return __get_ino(dentry); ++} ++ ++static char gr_task_roletype_to_char(struct task_struct *task) ++{ ++ switch (task->role->roletype & ++ (GR_ROLE_DEFAULT | GR_ROLE_USER | GR_ROLE_GROUP | ++ GR_ROLE_SPECIAL)) { ++ case GR_ROLE_DEFAULT: ++ return 'D'; ++ case GR_ROLE_USER: ++ return 'U'; ++ case GR_ROLE_GROUP: ++ return 'G'; ++ case GR_ROLE_SPECIAL: ++ return 'S'; ++ } ++ ++ return 'X'; ++} ++ ++char gr_roletype_to_char(void) ++{ ++ return gr_task_roletype_to_char(current); ++} ++ ++__inline__ int ++gr_acl_tpe_check(void) ++{ ++ if (unlikely(!(gr_status & GR_READY))) ++ return 0; ++ if (current->role->roletype & GR_ROLE_TPE) ++ return 1; ++ else ++ return 0; ++} ++ ++int ++gr_handle_rawio(const struct inode *inode) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_CAPS ++ if (inode && (S_ISBLK(inode->i_mode) || (S_ISCHR(inode->i_mode) && imajor(inode) == RAW_MAJOR)) && ++ grsec_enable_chroot_caps && proc_is_chrooted(current) && ++ !capable(CAP_SYS_RAWIO)) ++ return 1; ++#endif ++ return 0; ++} ++ ++int ++gr_streq(const char *a, const char *b, const unsigned int lena, const unsigned int lenb) ++{ ++ if (likely(lena != lenb)) ++ return 0; ++ ++ return !memcmp(a, b, lena); ++} ++ ++static int prepend(char **buffer, int *buflen, const char *str, int namelen) ++{ ++ *buflen -= namelen; ++ if (*buflen < 0) ++ return -ENAMETOOLONG; ++ *buffer -= namelen; ++ memcpy(*buffer, str, namelen); ++ return 0; ++} ++ ++static int prepend_name(char **buffer, int *buflen, struct qstr *name) ++{ ++ return prepend(buffer, buflen, name->name, name->len); ++} ++ ++static int prepend_path(const struct path *path, struct path *root, ++ char **buffer, int *buflen) ++{ ++ struct dentry *dentry = path->dentry; ++ struct vfsmount *vfsmnt = path->mnt; ++ struct mount *mnt = real_mount(vfsmnt); ++ bool slash = false; ++ int error = 0; ++ ++ while (dentry != root->dentry || vfsmnt != root->mnt) { ++ struct dentry * parent; ++ ++ if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) { ++ /* Global root? */ ++ if (!mnt_has_parent(mnt)) { ++ goto out; ++ } ++ dentry = mnt->mnt_mountpoint; ++ mnt = mnt->mnt_parent; ++ vfsmnt = &mnt->mnt; ++ continue; ++ } ++ parent = dentry->d_parent; ++ prefetch(parent); ++ spin_lock(&dentry->d_lock); ++ error = prepend_name(buffer, buflen, &dentry->d_name); ++ spin_unlock(&dentry->d_lock); ++ if (!error) ++ error = prepend(buffer, buflen, "/", 1); ++ if (error) ++ break; ++ ++ slash = true; ++ dentry = parent; ++ } ++ ++out: ++ if (!error && !slash) ++ error = prepend(buffer, buflen, "/", 1); ++ ++ return error; ++} ++ ++/* this must be called with mount_lock and rename_lock held */ ++ ++static char *__our_d_path(const struct path *path, struct path *root, ++ char *buf, int buflen) ++{ ++ char *res = buf + buflen; ++ int error; ++ ++ prepend(&res, &buflen, "\0", 1); ++ error = prepend_path(path, root, &res, &buflen); ++ if (error) ++ return ERR_PTR(error); ++ ++ return res; ++} ++ ++static char * ++gen_full_path(struct path *path, struct path *root, char *buf, int buflen) ++{ ++ char *retval; ++ ++ retval = __our_d_path(path, root, buf, buflen); ++ if (unlikely(IS_ERR(retval))) ++ retval = strcpy(buf, "<path too long>"); ++ else if (unlikely(retval[1] == '/' && retval[2] == '\0')) ++ retval[1] = '\0'; ++ ++ return retval; ++} ++ ++static char * ++__d_real_path(const struct dentry *dentry, const struct vfsmount *vfsmnt, ++ char *buf, int buflen) ++{ ++ struct path path; ++ char *res; ++ ++ path.dentry = (struct dentry *)dentry; ++ path.mnt = (struct vfsmount *)vfsmnt; ++ ++ /* we can use gr_real_root.dentry, gr_real_root.mnt, because this is only called ++ by the RBAC system */ ++ res = gen_full_path(&path, &gr_real_root, buf, buflen); ++ ++ return res; ++} ++ ++static char * ++d_real_path(const struct dentry *dentry, const struct vfsmount *vfsmnt, ++ char *buf, int buflen) ++{ ++ char *res; ++ struct path path; ++ struct path root; ++ struct task_struct *reaper = init_pid_ns.child_reaper; ++ ++ path.dentry = (struct dentry *)dentry; ++ path.mnt = (struct vfsmount *)vfsmnt; ++ ++ /* we can't use gr_real_root.dentry, gr_real_root.mnt, because they belong only to the RBAC system */ ++ get_fs_root(reaper->fs, &root); ++ ++ read_seqlock_excl(&mount_lock); ++ write_seqlock(&rename_lock); ++ res = gen_full_path(&path, &root, buf, buflen); ++ write_sequnlock(&rename_lock); ++ read_sequnlock_excl(&mount_lock); ++ ++ path_put(&root); ++ return res; ++} ++ ++char * ++gr_to_filename_rbac(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ char *ret; ++ read_seqlock_excl(&mount_lock); ++ write_seqlock(&rename_lock); ++ ret = __d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0],smp_processor_id()), ++ PAGE_SIZE); ++ write_sequnlock(&rename_lock); ++ read_sequnlock_excl(&mount_lock); ++ return ret; ++} ++ ++static char * ++gr_to_proc_filename_rbac(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ char *ret; ++ char *buf; ++ int buflen; ++ ++ read_seqlock_excl(&mount_lock); ++ write_seqlock(&rename_lock); ++ buf = per_cpu_ptr(gr_shared_page[0], smp_processor_id()); ++ ret = __d_real_path(dentry, mnt, buf, PAGE_SIZE - 6); ++ buflen = (int)(ret - buf); ++ if (buflen >= 5) ++ prepend(&ret, &buflen, "/proc", 5); ++ else ++ ret = strcpy(buf, "<path too long>"); ++ write_sequnlock(&rename_lock); ++ read_sequnlock_excl(&mount_lock); ++ return ret; ++} ++ ++char * ++gr_to_filename_nolock(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return __d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0],smp_processor_id()), ++ PAGE_SIZE); ++} ++ ++char * ++gr_to_filename(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0], smp_processor_id()), ++ PAGE_SIZE); ++} ++ ++char * ++gr_to_filename1(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[1], smp_processor_id()), ++ PAGE_SIZE); ++} ++ ++char * ++gr_to_filename2(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[2], smp_processor_id()), ++ PAGE_SIZE); ++} ++ ++char * ++gr_to_filename3(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[3], smp_processor_id()), ++ PAGE_SIZE); ++} ++ ++__inline__ __u32 ++to_gr_audit(const __u32 reqmode) ++{ ++ /* masks off auditable permission flags, then shifts them to create ++ auditing flags, and adds the special case of append auditing if ++ we're requesting write */ ++ return (((reqmode & ~GR_AUDITS) << 10) | ((reqmode & GR_WRITE) ? GR_AUDIT_APPEND : 0)); ++} ++ ++struct acl_role_label * ++__lookup_acl_role_label(const struct gr_policy_state *state, const struct task_struct *task, const uid_t uid, ++ const gid_t gid) ++{ ++ unsigned int index = gr_rhash(uid, GR_ROLE_USER, state->acl_role_set.r_size); ++ struct acl_role_label *match; ++ struct role_allowed_ip *ipp; ++ unsigned int x; ++ u32 curr_ip = task->signal->saved_ip; ++ ++ match = state->acl_role_set.r_hash[index]; ++ ++ while (match) { ++ if ((match->roletype & (GR_ROLE_DOMAIN | GR_ROLE_USER)) == (GR_ROLE_DOMAIN | GR_ROLE_USER)) { ++ for (x = 0; x < match->domain_child_num; x++) { ++ if (match->domain_children[x] == uid) ++ goto found; ++ } ++ } else if (match->uidgid == uid && match->roletype & GR_ROLE_USER) ++ break; ++ match = match->next; ++ } ++found: ++ if (match == NULL) { ++ try_group: ++ index = gr_rhash(gid, GR_ROLE_GROUP, state->acl_role_set.r_size); ++ match = state->acl_role_set.r_hash[index]; ++ ++ while (match) { ++ if ((match->roletype & (GR_ROLE_DOMAIN | GR_ROLE_GROUP)) == (GR_ROLE_DOMAIN | GR_ROLE_GROUP)) { ++ for (x = 0; x < match->domain_child_num; x++) { ++ if (match->domain_children[x] == gid) ++ goto found2; ++ } ++ } else if (match->uidgid == gid && match->roletype & GR_ROLE_GROUP) ++ break; ++ match = match->next; ++ } ++found2: ++ if (match == NULL) ++ match = state->default_role; ++ if (match->allowed_ips == NULL) ++ return match; ++ else { ++ for (ipp = match->allowed_ips; ipp; ipp = ipp->next) { ++ if (likely ++ ((ntohl(curr_ip) & ipp->netmask) == ++ (ntohl(ipp->addr) & ipp->netmask))) ++ return match; ++ } ++ match = state->default_role; ++ } ++ } else if (match->allowed_ips == NULL) { ++ return match; ++ } else { ++ for (ipp = match->allowed_ips; ipp; ipp = ipp->next) { ++ if (likely ++ ((ntohl(curr_ip) & ipp->netmask) == ++ (ntohl(ipp->addr) & ipp->netmask))) ++ return match; ++ } ++ goto try_group; ++ } ++ ++ return match; ++} ++ ++static struct acl_role_label * ++lookup_acl_role_label(const struct task_struct *task, const uid_t uid, ++ const gid_t gid) ++{ ++ return __lookup_acl_role_label(&running_polstate, task, uid, gid); ++} ++ ++struct acl_subject_label * ++lookup_acl_subj_label(const u64 ino, const dev_t dev, ++ const struct acl_role_label *role) ++{ ++ unsigned int index = gr_fhash(ino, dev, role->subj_hash_size); ++ struct acl_subject_label *match; ++ ++ match = role->subj_hash[index]; ++ ++ while (match && (match->inode != ino || match->device != dev || ++ (match->mode & GR_DELETED))) { ++ match = match->next; ++ } ++ ++ if (match && !(match->mode & GR_DELETED)) ++ return match; ++ else ++ return NULL; ++} ++ ++struct acl_subject_label * ++lookup_acl_subj_label_deleted(const u64 ino, const dev_t dev, ++ const struct acl_role_label *role) ++{ ++ unsigned int index = gr_fhash(ino, dev, role->subj_hash_size); ++ struct acl_subject_label *match; ++ ++ match = role->subj_hash[index]; ++ ++ while (match && (match->inode != ino || match->device != dev || ++ !(match->mode & GR_DELETED))) { ++ match = match->next; ++ } ++ ++ if (match && (match->mode & GR_DELETED)) ++ return match; ++ else ++ return NULL; ++} ++ ++static struct acl_object_label * ++lookup_acl_obj_label(const u64 ino, const dev_t dev, ++ const struct acl_subject_label *subj) ++{ ++ unsigned int index = gr_fhash(ino, dev, subj->obj_hash_size); ++ struct acl_object_label *match; ++ ++ match = subj->obj_hash[index]; ++ ++ while (match && (match->inode != ino || match->device != dev || ++ (match->mode & GR_DELETED))) { ++ match = match->next; ++ } ++ ++ if (match && !(match->mode & GR_DELETED)) ++ return match; ++ else ++ return NULL; ++} ++ ++static struct acl_object_label * ++lookup_acl_obj_label_create(const u64 ino, const dev_t dev, ++ const struct acl_subject_label *subj) ++{ ++ unsigned int index = gr_fhash(ino, dev, subj->obj_hash_size); ++ struct acl_object_label *match; ++ ++ match = subj->obj_hash[index]; ++ ++ while (match && (match->inode != ino || match->device != dev || ++ !(match->mode & GR_DELETED))) { ++ match = match->next; ++ } ++ ++ if (match && (match->mode & GR_DELETED)) ++ return match; ++ ++ match = subj->obj_hash[index]; ++ ++ while (match && (match->inode != ino || match->device != dev || ++ (match->mode & GR_DELETED))) { ++ match = match->next; ++ } ++ ++ if (match && !(match->mode & GR_DELETED)) ++ return match; ++ else ++ return NULL; ++} ++ ++struct name_entry * ++__lookup_name_entry(const struct gr_policy_state *state, const char *name) ++{ ++ unsigned int len = strlen(name); ++ unsigned int key = full_name_hash(name, len); ++ unsigned int index = key % state->name_set.n_size; ++ struct name_entry *match; ++ ++ match = state->name_set.n_hash[index]; ++ ++ while (match && (match->key != key || !gr_streq(match->name, name, match->len, len))) ++ match = match->next; ++ ++ return match; ++} ++ ++static struct name_entry * ++lookup_name_entry(const char *name) ++{ ++ return __lookup_name_entry(&running_polstate, name); ++} ++ ++static struct name_entry * ++lookup_name_entry_create(const char *name) ++{ ++ unsigned int len = strlen(name); ++ unsigned int key = full_name_hash(name, len); ++ unsigned int index = key % running_polstate.name_set.n_size; ++ struct name_entry *match; ++ ++ match = running_polstate.name_set.n_hash[index]; ++ ++ while (match && (match->key != key || !gr_streq(match->name, name, match->len, len) || ++ !match->deleted)) ++ match = match->next; ++ ++ if (match && match->deleted) ++ return match; ++ ++ match = running_polstate.name_set.n_hash[index]; ++ ++ while (match && (match->key != key || !gr_streq(match->name, name, match->len, len) || ++ match->deleted)) ++ match = match->next; ++ ++ if (match && !match->deleted) ++ return match; ++ else ++ return NULL; ++} ++ ++static struct inodev_entry * ++lookup_inodev_entry(const u64 ino, const dev_t dev) ++{ ++ unsigned int index = gr_fhash(ino, dev, running_polstate.inodev_set.i_size); ++ struct inodev_entry *match; ++ ++ match = running_polstate.inodev_set.i_hash[index]; ++ ++ while (match && (match->nentry->inode != ino || match->nentry->device != dev)) ++ match = match->next; ++ ++ return match; ++} ++ ++void ++__insert_inodev_entry(const struct gr_policy_state *state, struct inodev_entry *entry) ++{ ++ unsigned int index = gr_fhash(entry->nentry->inode, entry->nentry->device, ++ state->inodev_set.i_size); ++ struct inodev_entry **curr; ++ ++ entry->prev = NULL; ++ ++ curr = &state->inodev_set.i_hash[index]; ++ if (*curr != NULL) ++ (*curr)->prev = entry; ++ ++ entry->next = *curr; ++ *curr = entry; ++ ++ return; ++} ++ ++static void ++insert_inodev_entry(struct inodev_entry *entry) ++{ ++ __insert_inodev_entry(&running_polstate, entry); ++} ++ ++void ++insert_acl_obj_label(struct acl_object_label *obj, ++ struct acl_subject_label *subj) ++{ ++ unsigned int index = ++ gr_fhash(obj->inode, obj->device, subj->obj_hash_size); ++ struct acl_object_label **curr; ++ ++ obj->prev = NULL; ++ ++ curr = &subj->obj_hash[index]; ++ if (*curr != NULL) ++ (*curr)->prev = obj; ++ ++ obj->next = *curr; ++ *curr = obj; ++ ++ return; ++} ++ ++void ++insert_acl_subj_label(struct acl_subject_label *obj, ++ struct acl_role_label *role) ++{ ++ unsigned int index = gr_fhash(obj->inode, obj->device, role->subj_hash_size); ++ struct acl_subject_label **curr; ++ ++ obj->prev = NULL; ++ ++ curr = &role->subj_hash[index]; ++ if (*curr != NULL) ++ (*curr)->prev = obj; ++ ++ obj->next = *curr; ++ *curr = obj; ++ ++ return; ++} ++ ++/* derived from glibc fnmatch() 0: match, 1: no match*/ ++ ++static int ++glob_match(const char *p, const char *n) ++{ ++ char c; ++ ++ while ((c = *p++) != '\0') { ++ switch (c) { ++ case '?': ++ if (*n == '\0') ++ return 1; ++ else if (*n == '/') ++ return 1; ++ break; ++ case '\\': ++ if (*n != c) ++ return 1; ++ break; ++ case '*': ++ for (c = *p++; c == '?' || c == '*'; c = *p++) { ++ if (*n == '/') ++ return 1; ++ else if (c == '?') { ++ if (*n == '\0') ++ return 1; ++ else ++ ++n; ++ } ++ } ++ if (c == '\0') { ++ return 0; ++ } else { ++ const char *endp; ++ ++ if ((endp = strchr(n, '/')) == NULL) ++ endp = n + strlen(n); ++ ++ if (c == '[') { ++ for (--p; n < endp; ++n) ++ if (!glob_match(p, n)) ++ return 0; ++ } else if (c == '/') { ++ while (*n != '\0' && *n != '/') ++ ++n; ++ if (*n == '/' && !glob_match(p, n + 1)) ++ return 0; ++ } else { ++ for (--p; n < endp; ++n) ++ if (*n == c && !glob_match(p, n)) ++ return 0; ++ } ++ ++ return 1; ++ } ++ case '[': ++ { ++ int not; ++ char cold; ++ ++ if (*n == '\0' || *n == '/') ++ return 1; ++ ++ not = (*p == '!' || *p == '^'); ++ if (not) ++ ++p; ++ ++ c = *p++; ++ for (;;) { ++ unsigned char fn = (unsigned char)*n; ++ ++ if (c == '\0') ++ return 1; ++ else { ++ if (c == fn) ++ goto matched; ++ cold = c; ++ c = *p++; ++ ++ if (c == '-' && *p != ']') { ++ unsigned char cend = *p++; ++ ++ if (cend == '\0') ++ return 1; ++ ++ if (cold <= fn && fn <= cend) ++ goto matched; ++ ++ c = *p++; ++ } ++ } ++ ++ if (c == ']') ++ break; ++ } ++ if (!not) ++ return 1; ++ break; ++ matched: ++ while (c != ']') { ++ if (c == '\0') ++ return 1; ++ ++ c = *p++; ++ } ++ if (not) ++ return 1; ++ } ++ break; ++ default: ++ if (c != *n) ++ return 1; ++ } ++ ++ ++n; ++ } ++ ++ if (*n == '\0') ++ return 0; ++ ++ if (*n == '/') ++ return 0; ++ ++ return 1; ++} ++ ++static struct acl_object_label * ++chk_glob_label(struct acl_object_label *globbed, ++ const struct dentry *dentry, const struct vfsmount *mnt, char **path) ++{ ++ struct acl_object_label *tmp; ++ ++ if (*path == NULL) ++ *path = gr_to_filename_nolock(dentry, mnt); ++ ++ tmp = globbed; ++ ++ while (tmp) { ++ if (!glob_match(tmp->filename, *path)) ++ return tmp; ++ tmp = tmp->next; ++ } ++ ++ return NULL; ++} ++ ++static struct acl_object_label * ++__full_lookup(const struct dentry *orig_dentry, const struct vfsmount *orig_mnt, ++ const u64 curr_ino, const dev_t curr_dev, ++ const struct acl_subject_label *subj, char **path, const int checkglob) ++{ ++ struct acl_subject_label *tmpsubj; ++ struct acl_object_label *retval; ++ struct acl_object_label *retval2; ++ ++ tmpsubj = (struct acl_subject_label *) subj; ++ read_lock(&gr_inode_lock); ++ do { ++ retval = lookup_acl_obj_label(curr_ino, curr_dev, tmpsubj); ++ if (retval) { ++ if (checkglob && retval->globbed) { ++ retval2 = chk_glob_label(retval->globbed, orig_dentry, orig_mnt, path); ++ if (retval2) ++ retval = retval2; ++ } ++ break; ++ } ++ } while ((tmpsubj = tmpsubj->parent_subject)); ++ read_unlock(&gr_inode_lock); ++ ++ return retval; ++} ++ ++static __inline__ struct acl_object_label * ++full_lookup(const struct dentry *orig_dentry, const struct vfsmount *orig_mnt, ++ struct dentry *curr_dentry, ++ const struct acl_subject_label *subj, char **path, const int checkglob) ++{ ++ int newglob = checkglob; ++ u64 inode; ++ dev_t device; ++ ++ /* if we aren't checking a subdirectory of the original path yet, don't do glob checking ++ as we don't want a / * rule to match instead of the / object ++ don't do this for create lookups that call this function though, since they're looking up ++ on the parent and thus need globbing checks on all paths ++ */ ++ if (orig_dentry == curr_dentry && newglob != GR_CREATE_GLOB) ++ newglob = GR_NO_GLOB; ++ ++ spin_lock(&curr_dentry->d_lock); ++ inode = __get_ino(curr_dentry); ++ device = __get_dev(curr_dentry); ++ spin_unlock(&curr_dentry->d_lock); ++ ++ return __full_lookup(orig_dentry, orig_mnt, inode, device, subj, path, newglob); ++} ++ ++#ifdef CONFIG_HUGETLBFS ++static inline bool ++is_hugetlbfs_mnt(const struct vfsmount *mnt) ++{ ++ int i; ++ for (i = 0; i < HUGE_MAX_HSTATE; i++) { ++ if (unlikely(hugetlbfs_vfsmount[i] == mnt)) ++ return true; ++ } ++ ++ return false; ++} ++#endif ++ ++static struct acl_object_label * ++__chk_obj_label(const struct dentry *l_dentry, const struct vfsmount *l_mnt, ++ const struct acl_subject_label *subj, char *path, const int checkglob) ++{ ++ struct dentry *dentry = (struct dentry *) l_dentry; ++ struct vfsmount *mnt = (struct vfsmount *) l_mnt; ++ struct mount *real_mnt = real_mount(mnt); ++ struct acl_object_label *retval; ++ struct dentry *parent; ++ ++ read_seqlock_excl(&mount_lock); ++ write_seqlock(&rename_lock); ++ ++ if (unlikely((mnt == shm_mnt && dentry->d_inode->i_nlink == 0) || mnt == pipe_mnt || ++#ifdef CONFIG_NET ++ mnt == sock_mnt || ++#endif ++#ifdef CONFIG_HUGETLBFS ++ (is_hugetlbfs_mnt(mnt) && dentry->d_inode->i_nlink == 0) || ++#endif ++ /* ignore Eric Biederman */ ++ IS_PRIVATE(l_dentry->d_inode))) { ++ retval = (subj->mode & GR_SHMEXEC) ? fakefs_obj_rwx : fakefs_obj_rw; ++ goto out; ++ } ++ ++ for (;;) { ++ if (dentry == gr_real_root.dentry && mnt == gr_real_root.mnt) ++ break; ++ ++ if (dentry == mnt->mnt_root || IS_ROOT(dentry)) { ++ if (!mnt_has_parent(real_mnt)) ++ break; ++ ++ retval = full_lookup(l_dentry, l_mnt, dentry, subj, &path, checkglob); ++ if (retval != NULL) ++ goto out; ++ ++ dentry = real_mnt->mnt_mountpoint; ++ real_mnt = real_mnt->mnt_parent; ++ mnt = &real_mnt->mnt; ++ continue; ++ } ++ ++ parent = dentry->d_parent; ++ retval = full_lookup(l_dentry, l_mnt, dentry, subj, &path, checkglob); ++ if (retval != NULL) ++ goto out; ++ ++ dentry = parent; ++ } ++ ++ retval = full_lookup(l_dentry, l_mnt, dentry, subj, &path, checkglob); ++ ++ /* gr_real_root is pinned so we don't have to hold a reference */ ++ if (retval == NULL) ++ retval = full_lookup(l_dentry, l_mnt, gr_real_root.dentry, subj, &path, checkglob); ++out: ++ write_sequnlock(&rename_lock); ++ read_sequnlock_excl(&mount_lock); ++ ++ BUG_ON(retval == NULL); ++ ++ return retval; ++} ++ ++static __inline__ struct acl_object_label * ++chk_obj_label(const struct dentry *l_dentry, const struct vfsmount *l_mnt, ++ const struct acl_subject_label *subj) ++{ ++ char *path = NULL; ++ return __chk_obj_label(l_dentry, l_mnt, subj, path, GR_REG_GLOB); ++} ++ ++static __inline__ struct acl_object_label * ++chk_obj_label_noglob(const struct dentry *l_dentry, const struct vfsmount *l_mnt, ++ const struct acl_subject_label *subj) ++{ ++ char *path = NULL; ++ return __chk_obj_label(l_dentry, l_mnt, subj, path, GR_NO_GLOB); ++} ++ ++static __inline__ struct acl_object_label * ++chk_obj_create_label(const struct dentry *l_dentry, const struct vfsmount *l_mnt, ++ const struct acl_subject_label *subj, char *path) ++{ ++ return __chk_obj_label(l_dentry, l_mnt, subj, path, GR_CREATE_GLOB); ++} ++ ++struct acl_subject_label * ++chk_subj_label(const struct dentry *l_dentry, const struct vfsmount *l_mnt, ++ const struct acl_role_label *role) ++{ ++ struct dentry *dentry = (struct dentry *) l_dentry; ++ struct vfsmount *mnt = (struct vfsmount *) l_mnt; ++ struct mount *real_mnt = real_mount(mnt); ++ struct acl_subject_label *retval; ++ struct dentry *parent; ++ ++ read_seqlock_excl(&mount_lock); ++ write_seqlock(&rename_lock); ++ ++ for (;;) { ++ if (dentry == gr_real_root.dentry && mnt == gr_real_root.mnt) ++ break; ++ if (dentry == mnt->mnt_root || IS_ROOT(dentry)) { ++ if (!mnt_has_parent(real_mnt)) ++ break; ++ ++ spin_lock(&dentry->d_lock); ++ read_lock(&gr_inode_lock); ++ retval = ++ lookup_acl_subj_label(__get_ino(dentry), ++ __get_dev(dentry), role); ++ read_unlock(&gr_inode_lock); ++ spin_unlock(&dentry->d_lock); ++ if (retval != NULL) ++ goto out; ++ ++ dentry = real_mnt->mnt_mountpoint; ++ real_mnt = real_mnt->mnt_parent; ++ mnt = &real_mnt->mnt; ++ continue; ++ } ++ ++ spin_lock(&dentry->d_lock); ++ read_lock(&gr_inode_lock); ++ retval = lookup_acl_subj_label(__get_ino(dentry), ++ __get_dev(dentry), role); ++ read_unlock(&gr_inode_lock); ++ parent = dentry->d_parent; ++ spin_unlock(&dentry->d_lock); ++ ++ if (retval != NULL) ++ goto out; ++ ++ dentry = parent; ++ } ++ ++ spin_lock(&dentry->d_lock); ++ read_lock(&gr_inode_lock); ++ retval = lookup_acl_subj_label(__get_ino(dentry), ++ __get_dev(dentry), role); ++ read_unlock(&gr_inode_lock); ++ spin_unlock(&dentry->d_lock); ++ ++ if (unlikely(retval == NULL)) { ++ /* gr_real_root is pinned, we don't need to hold a reference */ ++ read_lock(&gr_inode_lock); ++ retval = lookup_acl_subj_label(__get_ino(gr_real_root.dentry), ++ __get_dev(gr_real_root.dentry), role); ++ read_unlock(&gr_inode_lock); ++ } ++out: ++ write_sequnlock(&rename_lock); ++ read_sequnlock_excl(&mount_lock); ++ ++ BUG_ON(retval == NULL); ++ ++ return retval; ++} ++ ++void ++assign_special_role(const char *rolename) ++{ ++ struct acl_object_label *obj; ++ struct acl_role_label *r; ++ struct acl_role_label *assigned = NULL; ++ struct task_struct *tsk; ++ struct file *filp; ++ ++ FOR_EACH_ROLE_START(r) ++ if (!strcmp(rolename, r->rolename) && ++ (r->roletype & GR_ROLE_SPECIAL)) { ++ assigned = r; ++ break; ++ } ++ FOR_EACH_ROLE_END(r) ++ ++ if (!assigned) ++ return; ++ ++ read_lock(&tasklist_lock); ++ read_lock(&grsec_exec_file_lock); ++ ++ tsk = current->real_parent; ++ if (tsk == NULL) ++ goto out_unlock; ++ ++ filp = tsk->exec_file; ++ if (filp == NULL) ++ goto out_unlock; ++ ++ tsk->is_writable = 0; ++ tsk->inherited = 0; ++ ++ tsk->acl_sp_role = 1; ++ tsk->acl_role_id = ++acl_sp_role_value; ++ tsk->role = assigned; ++ tsk->acl = chk_subj_label(filp->f_path.dentry, filp->f_path.mnt, tsk->role); ++ ++ /* ignore additional mmap checks for processes that are writable ++ by the default ACL */ ++ obj = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, running_polstate.default_role->root_label); ++ if (unlikely(obj->mode & GR_WRITE)) ++ tsk->is_writable = 1; ++ obj = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, tsk->role->root_label); ++ if (unlikely(obj->mode & GR_WRITE)) ++ tsk->is_writable = 1; ++ ++#ifdef CONFIG_GRKERNSEC_RBAC_DEBUG ++ printk(KERN_ALERT "Assigning special role:%s subject:%s to process (%s:%d)\n", tsk->role->rolename, ++ tsk->acl->filename, tsk->comm, task_pid_nr(tsk)); ++#endif ++ ++out_unlock: ++ read_unlock(&grsec_exec_file_lock); ++ read_unlock(&tasklist_lock); ++ return; ++} ++ ++ ++static void ++gr_log_learn(const struct dentry *dentry, const struct vfsmount *mnt, const __u32 mode) ++{ ++ struct task_struct *task = current; ++ const struct cred *cred = current_cred(); ++ ++ security_learn(GR_LEARN_AUDIT_MSG, task->role->rolename, task->role->roletype, ++ GR_GLOBAL_UID(cred->uid), GR_GLOBAL_GID(cred->gid), task->exec_file ? gr_to_filename1(task->exec_file->f_path.dentry, ++ task->exec_file->f_path.mnt) : task->acl->filename, task->acl->filename, ++ 1UL, 1UL, gr_to_filename(dentry, mnt), (unsigned long) mode, &task->signal->saved_ip); ++ ++ return; ++} ++ ++static void ++gr_log_learn_uid_change(const kuid_t real, const kuid_t effective, const kuid_t fs) ++{ ++ struct task_struct *task = current; ++ const struct cred *cred = current_cred(); ++ ++ security_learn(GR_ID_LEARN_MSG, task->role->rolename, task->role->roletype, ++ GR_GLOBAL_UID(cred->uid), GR_GLOBAL_GID(cred->gid), task->exec_file ? gr_to_filename1(task->exec_file->f_path.dentry, ++ task->exec_file->f_path.mnt) : task->acl->filename, task->acl->filename, ++ 'u', GR_GLOBAL_UID(real), GR_GLOBAL_UID(effective), GR_GLOBAL_UID(fs), &task->signal->saved_ip); ++ ++ return; ++} ++ ++static void ++gr_log_learn_gid_change(const kgid_t real, const kgid_t effective, const kgid_t fs) ++{ ++ struct task_struct *task = current; ++ const struct cred *cred = current_cred(); ++ ++ security_learn(GR_ID_LEARN_MSG, task->role->rolename, task->role->roletype, ++ GR_GLOBAL_UID(cred->uid), GR_GLOBAL_GID(cred->gid), task->exec_file ? gr_to_filename1(task->exec_file->f_path.dentry, ++ task->exec_file->f_path.mnt) : task->acl->filename, task->acl->filename, ++ 'g', GR_GLOBAL_GID(real), GR_GLOBAL_GID(effective), GR_GLOBAL_GID(fs), &task->signal->saved_ip); ++ ++ return; ++} ++ ++static void ++gr_set_proc_res(struct task_struct *task) ++{ ++ struct acl_subject_label *proc; ++ unsigned short i; ++ ++ proc = task->acl; ++ ++ if (proc->mode & (GR_LEARN | GR_INHERITLEARN)) ++ return; ++ ++ for (i = 0; i < RLIM_NLIMITS; i++) { ++ unsigned long rlim_cur, rlim_max; ++ ++ if (!(proc->resmask & (1U << i))) ++ continue; ++ ++ rlim_cur = proc->res[i].rlim_cur; ++ rlim_max = proc->res[i].rlim_max; ++ ++ if (i == RLIMIT_NOFILE) { ++ unsigned long saved_sysctl_nr_open = sysctl_nr_open; ++ if (rlim_cur > saved_sysctl_nr_open) ++ rlim_cur = saved_sysctl_nr_open; ++ if (rlim_max > saved_sysctl_nr_open) ++ rlim_max = saved_sysctl_nr_open; ++ } ++ ++ task->signal->rlim[i].rlim_cur = rlim_cur; ++ task->signal->rlim[i].rlim_max = rlim_max; ++ ++ if (i == RLIMIT_CPU) ++ update_rlimit_cpu(task, rlim_cur); ++ } ++ ++ return; ++} ++ ++/* both of the below must be called with ++ rcu_read_lock(); ++ read_lock(&tasklist_lock); ++ read_lock(&grsec_exec_file_lock); ++ except in the case of gr_set_role_label() (for __gr_get_subject_for_task) ++*/ ++ ++struct acl_subject_label *__gr_get_subject_for_task(const struct gr_policy_state *state, struct task_struct *task, const char *filename, int fallback) ++{ ++ char *tmpname; ++ struct acl_subject_label *tmpsubj; ++ struct file *filp; ++ struct name_entry *nmatch; ++ ++ filp = task->exec_file; ++ if (filp == NULL) ++ return NULL; ++ ++ /* the following is to apply the correct subject ++ on binaries running when the RBAC system ++ is enabled, when the binaries have been ++ replaced or deleted since their execution ++ ----- ++ when the RBAC system starts, the inode/dev ++ from exec_file will be one the RBAC system ++ is unaware of. It only knows the inode/dev ++ of the present file on disk, or the absence ++ of it. ++ */ ++ ++ if (filename) ++ nmatch = __lookup_name_entry(state, filename); ++ else { ++ preempt_disable(); ++ tmpname = gr_to_filename_rbac(filp->f_path.dentry, filp->f_path.mnt); ++ ++ nmatch = __lookup_name_entry(state, tmpname); ++ preempt_enable(); ++ } ++ tmpsubj = NULL; ++ if (nmatch) { ++ if (nmatch->deleted) ++ tmpsubj = lookup_acl_subj_label_deleted(nmatch->inode, nmatch->device, task->role); ++ else ++ tmpsubj = lookup_acl_subj_label(nmatch->inode, nmatch->device, task->role); ++ } ++ /* this also works for the reload case -- if we don't match a potentially inherited subject ++ then we fall back to a normal lookup based on the binary's ino/dev ++ */ ++ if (tmpsubj == NULL && fallback) ++ tmpsubj = chk_subj_label(filp->f_path.dentry, filp->f_path.mnt, task->role); ++ ++ return tmpsubj; ++} ++ ++static struct acl_subject_label *gr_get_subject_for_task(struct task_struct *task, const char *filename, int fallback) ++{ ++ return __gr_get_subject_for_task(&running_polstate, task, filename, fallback); ++} ++ ++void __gr_apply_subject_to_task(const struct gr_policy_state *state, struct task_struct *task, struct acl_subject_label *subj) ++{ ++ struct acl_object_label *obj; ++ struct file *filp; ++ ++ filp = task->exec_file; ++ ++ task->acl = subj; ++ task->is_writable = 0; ++ /* ignore additional mmap checks for processes that are writable ++ by the default ACL */ ++ obj = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, state->default_role->root_label); ++ if (unlikely(obj->mode & GR_WRITE)) ++ task->is_writable = 1; ++ obj = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, task->role->root_label); ++ if (unlikely(obj->mode & GR_WRITE)) ++ task->is_writable = 1; ++ ++ gr_set_proc_res(task); ++ ++#ifdef CONFIG_GRKERNSEC_RBAC_DEBUG ++ printk(KERN_ALERT "gr_set_acls for (%s:%d): role:%s, subject:%s\n", task->comm, task_pid_nr(task), task->role->rolename, task->acl->filename); ++#endif ++} ++ ++static void gr_apply_subject_to_task(struct task_struct *task, struct acl_subject_label *subj) ++{ ++ __gr_apply_subject_to_task(&running_polstate, task, subj); ++} ++ ++__u32 ++gr_search_file(const struct dentry * dentry, const __u32 mode, ++ const struct vfsmount * mnt) ++{ ++ __u32 retval = mode; ++ struct acl_subject_label *curracl; ++ struct acl_object_label *currobj; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return (mode & ~GR_AUDITS); ++ ++ curracl = current->acl; ++ ++ currobj = chk_obj_label(dentry, mnt, curracl); ++ retval = currobj->mode & mode; ++ ++ /* if we're opening a specified transfer file for writing ++ (e.g. /dev/initctl), then transfer our role to init ++ */ ++ if (unlikely(currobj->mode & GR_INIT_TRANSFER && retval & GR_WRITE && ++ current->role->roletype & GR_ROLE_PERSIST)) { ++ struct task_struct *task = init_pid_ns.child_reaper; ++ ++ if (task->role != current->role) { ++ struct acl_subject_label *subj; ++ ++ task->acl_sp_role = 0; ++ task->acl_role_id = current->acl_role_id; ++ task->role = current->role; ++ rcu_read_lock(); ++ read_lock(&grsec_exec_file_lock); ++ subj = gr_get_subject_for_task(task, NULL, 1); ++ gr_apply_subject_to_task(task, subj); ++ read_unlock(&grsec_exec_file_lock); ++ rcu_read_unlock(); ++ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_INIT_TRANSFER_MSG); ++ } ++ } ++ ++ if (unlikely ++ ((curracl->mode & (GR_LEARN | GR_INHERITLEARN)) && !(mode & GR_NOPTRACE) ++ && (retval != (mode & ~(GR_AUDITS | GR_SUPPRESS))))) { ++ __u32 new_mode = mode; ++ ++ new_mode &= ~(GR_AUDITS | GR_SUPPRESS); ++ ++ retval = new_mode; ++ ++ if (new_mode & GR_EXEC && curracl->mode & GR_INHERITLEARN) ++ new_mode |= GR_INHERIT; ++ ++ if (!(mode & GR_NOLEARN)) ++ gr_log_learn(dentry, mnt, new_mode); ++ } ++ ++ return retval; ++} ++ ++struct acl_object_label *gr_get_create_object(const struct dentry *new_dentry, ++ const struct dentry *parent, ++ const struct vfsmount *mnt) ++{ ++ struct name_entry *match; ++ struct acl_object_label *matchpo; ++ struct acl_subject_label *curracl; ++ char *path; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return NULL; ++ ++ preempt_disable(); ++ path = gr_to_filename_rbac(new_dentry, mnt); ++ match = lookup_name_entry_create(path); ++ ++ curracl = current->acl; ++ ++ if (match) { ++ read_lock(&gr_inode_lock); ++ matchpo = lookup_acl_obj_label_create(match->inode, match->device, curracl); ++ read_unlock(&gr_inode_lock); ++ ++ if (matchpo) { ++ preempt_enable(); ++ return matchpo; ++ } ++ } ++ ++ // lookup parent ++ ++ matchpo = chk_obj_create_label(parent, mnt, curracl, path); ++ ++ preempt_enable(); ++ return matchpo; ++} ++ ++__u32 ++gr_check_create(const struct dentry * new_dentry, const struct dentry * parent, ++ const struct vfsmount * mnt, const __u32 mode) ++{ ++ struct acl_object_label *matchpo; ++ __u32 retval; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return (mode & ~GR_AUDITS); ++ ++ matchpo = gr_get_create_object(new_dentry, parent, mnt); ++ ++ retval = matchpo->mode & mode; ++ ++ if ((retval != (mode & ~(GR_AUDITS | GR_SUPPRESS))) ++ && (current->acl->mode & (GR_LEARN | GR_INHERITLEARN))) { ++ __u32 new_mode = mode; ++ ++ new_mode &= ~(GR_AUDITS | GR_SUPPRESS); ++ ++ gr_log_learn(new_dentry, mnt, new_mode); ++ return new_mode; ++ } ++ ++ return retval; ++} ++ ++__u32 ++gr_check_link(const struct dentry * new_dentry, ++ const struct dentry * parent_dentry, ++ const struct vfsmount * parent_mnt, ++ const struct dentry * old_dentry, const struct vfsmount * old_mnt) ++{ ++ struct acl_object_label *obj; ++ __u32 oldmode, newmode; ++ __u32 needmode; ++ __u32 checkmodes = GR_FIND | GR_APPEND | GR_WRITE | GR_EXEC | GR_SETID | GR_READ | ++ GR_DELETE | GR_INHERIT; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return (GR_CREATE | GR_LINK); ++ ++ obj = chk_obj_label(old_dentry, old_mnt, current->acl); ++ oldmode = obj->mode; ++ ++ obj = gr_get_create_object(new_dentry, parent_dentry, parent_mnt); ++ newmode = obj->mode; ++ ++ needmode = newmode & checkmodes; ++ ++ // old name for hardlink must have at least the permissions of the new name ++ if ((oldmode & needmode) != needmode) ++ goto bad; ++ ++ // if old name had restrictions/auditing, make sure the new name does as well ++ needmode = oldmode & (GR_NOPTRACE | GR_PTRACERD | GR_INHERIT | GR_AUDITS); ++ ++ // don't allow hardlinking of suid/sgid/fcapped files without permission ++ if (is_privileged_binary(old_dentry)) ++ needmode |= GR_SETID; ++ ++ if ((newmode & needmode) != needmode) ++ goto bad; ++ ++ // enforce minimum permissions ++ if ((newmode & (GR_CREATE | GR_LINK)) == (GR_CREATE | GR_LINK)) ++ return newmode; ++bad: ++ needmode = oldmode; ++ if (is_privileged_binary(old_dentry)) ++ needmode |= GR_SETID; ++ ++ if (current->acl->mode & (GR_LEARN | GR_INHERITLEARN)) { ++ gr_log_learn(old_dentry, old_mnt, needmode | GR_CREATE | GR_LINK); ++ return (GR_CREATE | GR_LINK); ++ } else if (newmode & GR_SUPPRESS) ++ return GR_SUPPRESS; ++ else ++ return 0; ++} ++ ++int ++gr_check_hidden_task(const struct task_struct *task) ++{ ++ if (unlikely(!(gr_status & GR_READY))) ++ return 0; ++ ++ if (!(task->acl->mode & GR_PROCFIND) && !(current->acl->mode & GR_VIEW)) ++ return 1; ++ ++ return 0; ++} ++ ++int ++gr_check_protected_task(const struct task_struct *task) ++{ ++ if (unlikely(!(gr_status & GR_READY) || !task)) ++ return 0; ++ ++ if ((task->acl->mode & GR_PROTECTED) && !(current->acl->mode & GR_KILL) && ++ task->acl != current->acl) ++ return 1; ++ ++ return 0; ++} ++ ++int ++gr_check_protected_task_fowner(struct pid *pid, enum pid_type type) ++{ ++ struct task_struct *p; ++ int ret = 0; ++ ++ if (unlikely(!(gr_status & GR_READY) || !pid)) ++ return ret; ++ ++ read_lock(&tasklist_lock); ++ do_each_pid_task(pid, type, p) { ++ if ((p->acl->mode & GR_PROTECTED) && !(current->acl->mode & GR_KILL) && ++ p->acl != current->acl) { ++ ret = 1; ++ goto out; ++ } ++ } while_each_pid_task(pid, type, p); ++out: ++ read_unlock(&tasklist_lock); ++ ++ return ret; ++} ++ ++void ++gr_copy_label(struct task_struct *tsk) ++{ ++ struct task_struct *p = current; ++ ++ tsk->inherited = p->inherited; ++ tsk->acl_sp_role = 0; ++ tsk->acl_role_id = p->acl_role_id; ++ tsk->acl = p->acl; ++ tsk->role = p->role; ++ tsk->signal->used_accept = 0; ++ tsk->signal->curr_ip = p->signal->curr_ip; ++ tsk->signal->saved_ip = p->signal->saved_ip; ++ if (p->exec_file) ++ get_file(p->exec_file); ++ tsk->exec_file = p->exec_file; ++ tsk->is_writable = p->is_writable; ++ if (unlikely(p->signal->used_accept)) { ++ p->signal->curr_ip = 0; ++ p->signal->saved_ip = 0; ++ } ++ ++ return; ++} ++ ++extern int gr_process_kernel_setuid_ban(struct user_struct *user); ++ ++int ++gr_check_user_change(kuid_t real, kuid_t effective, kuid_t fs) ++{ ++ unsigned int i; ++ __u16 num; ++ uid_t *uidlist; ++ uid_t curuid; ++ int realok = 0; ++ int effectiveok = 0; ++ int fsok = 0; ++ uid_t globalreal, globaleffective, globalfs; ++ ++#if defined(CONFIG_GRKERNSEC_KERN_LOCKOUT) ++ struct user_struct *user; ++ ++ if (!uid_valid(real)) ++ goto skipit; ++ ++ /* find user based on global namespace */ ++ ++ globalreal = GR_GLOBAL_UID(real); ++ ++ user = find_user(make_kuid(&init_user_ns, globalreal)); ++ if (user == NULL) ++ goto skipit; ++ ++ if (gr_process_kernel_setuid_ban(user)) { ++ /* for find_user */ ++ free_uid(user); ++ return 1; ++ } ++ ++ /* for find_user */ ++ free_uid(user); ++ ++skipit: ++#endif ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return 0; ++ ++ if (current->acl->mode & (GR_LEARN | GR_INHERITLEARN)) ++ gr_log_learn_uid_change(real, effective, fs); ++ ++ num = current->acl->user_trans_num; ++ uidlist = current->acl->user_transitions; ++ ++ if (uidlist == NULL) ++ return 0; ++ ++ if (!uid_valid(real)) { ++ realok = 1; ++ globalreal = (uid_t)-1; ++ } else { ++ globalreal = GR_GLOBAL_UID(real); ++ } ++ if (!uid_valid(effective)) { ++ effectiveok = 1; ++ globaleffective = (uid_t)-1; ++ } else { ++ globaleffective = GR_GLOBAL_UID(effective); ++ } ++ if (!uid_valid(fs)) { ++ fsok = 1; ++ globalfs = (uid_t)-1; ++ } else { ++ globalfs = GR_GLOBAL_UID(fs); ++ } ++ ++ if (current->acl->user_trans_type & GR_ID_ALLOW) { ++ for (i = 0; i < num; i++) { ++ curuid = uidlist[i]; ++ if (globalreal == curuid) ++ realok = 1; ++ if (globaleffective == curuid) ++ effectiveok = 1; ++ if (globalfs == curuid) ++ fsok = 1; ++ } ++ } else if (current->acl->user_trans_type & GR_ID_DENY) { ++ for (i = 0; i < num; i++) { ++ curuid = uidlist[i]; ++ if (globalreal == curuid) ++ break; ++ if (globaleffective == curuid) ++ break; ++ if (globalfs == curuid) ++ break; ++ } ++ /* not in deny list */ ++ if (i == num) { ++ realok = 1; ++ effectiveok = 1; ++ fsok = 1; ++ } ++ } ++ ++ if (realok && effectiveok && fsok) ++ return 0; ++ else { ++ gr_log_int(GR_DONT_AUDIT, GR_USRCHANGE_ACL_MSG, realok ? (effectiveok ? (fsok ? 0 : globalfs) : globaleffective) : globalreal); ++ return 1; ++ } ++} ++ ++int ++gr_check_group_change(kgid_t real, kgid_t effective, kgid_t fs) ++{ ++ unsigned int i; ++ __u16 num; ++ gid_t *gidlist; ++ gid_t curgid; ++ int realok = 0; ++ int effectiveok = 0; ++ int fsok = 0; ++ gid_t globalreal, globaleffective, globalfs; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return 0; ++ ++ if (current->acl->mode & (GR_LEARN | GR_INHERITLEARN)) ++ gr_log_learn_gid_change(real, effective, fs); ++ ++ num = current->acl->group_trans_num; ++ gidlist = current->acl->group_transitions; ++ ++ if (gidlist == NULL) ++ return 0; ++ ++ if (!gid_valid(real)) { ++ realok = 1; ++ globalreal = (gid_t)-1; ++ } else { ++ globalreal = GR_GLOBAL_GID(real); ++ } ++ if (!gid_valid(effective)) { ++ effectiveok = 1; ++ globaleffective = (gid_t)-1; ++ } else { ++ globaleffective = GR_GLOBAL_GID(effective); ++ } ++ if (!gid_valid(fs)) { ++ fsok = 1; ++ globalfs = (gid_t)-1; ++ } else { ++ globalfs = GR_GLOBAL_GID(fs); ++ } ++ ++ if (current->acl->group_trans_type & GR_ID_ALLOW) { ++ for (i = 0; i < num; i++) { ++ curgid = gidlist[i]; ++ if (globalreal == curgid) ++ realok = 1; ++ if (globaleffective == curgid) ++ effectiveok = 1; ++ if (globalfs == curgid) ++ fsok = 1; ++ } ++ } else if (current->acl->group_trans_type & GR_ID_DENY) { ++ for (i = 0; i < num; i++) { ++ curgid = gidlist[i]; ++ if (globalreal == curgid) ++ break; ++ if (globaleffective == curgid) ++ break; ++ if (globalfs == curgid) ++ break; ++ } ++ /* not in deny list */ ++ if (i == num) { ++ realok = 1; ++ effectiveok = 1; ++ fsok = 1; ++ } ++ } ++ ++ if (realok && effectiveok && fsok) ++ return 0; ++ else { ++ gr_log_int(GR_DONT_AUDIT, GR_GRPCHANGE_ACL_MSG, realok ? (effectiveok ? (fsok ? 0 : globalfs) : globaleffective) : globalreal); ++ return 1; ++ } ++} ++ ++extern int gr_acl_is_capable(const int cap); ++ ++void ++gr_set_role_label(struct task_struct *task, const kuid_t kuid, const kgid_t kgid) ++{ ++ struct acl_role_label *role = task->role; ++ struct acl_role_label *origrole = role; ++ struct acl_subject_label *subj = NULL; ++ struct acl_object_label *obj; ++ struct file *filp; ++ uid_t uid; ++ gid_t gid; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return; ++ ++ uid = GR_GLOBAL_UID(kuid); ++ gid = GR_GLOBAL_GID(kgid); ++ ++ filp = task->exec_file; ++ ++ /* kernel process, we'll give them the kernel role */ ++ if (unlikely(!filp)) { ++ task->role = running_polstate.kernel_role; ++ task->acl = running_polstate.kernel_role->root_label; ++ return; ++ } else if (!task->role || !(task->role->roletype & GR_ROLE_SPECIAL)) { ++ /* save the current ip at time of role lookup so that the proper ++ IP will be learned for role_allowed_ip */ ++ task->signal->saved_ip = task->signal->curr_ip; ++ role = lookup_acl_role_label(task, uid, gid); ++ } ++ ++ /* don't change the role if we're not a privileged process */ ++ if (role && task->role != role && ++ (((role->roletype & GR_ROLE_USER) && !gr_acl_is_capable(CAP_SETUID)) || ++ ((role->roletype & GR_ROLE_GROUP) && !gr_acl_is_capable(CAP_SETGID)))) ++ return; ++ ++ task->role = role; ++ ++ if (task->inherited) { ++ /* if we reached our subject through inheritance, then first see ++ if there's a subject of the same name in the new role that has ++ an object that would result in the same inherited subject ++ */ ++ subj = gr_get_subject_for_task(task, task->acl->filename, 0); ++ if (subj) { ++ obj = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, subj); ++ if (!(obj->mode & GR_INHERIT)) ++ subj = NULL; ++ } ++ ++ } ++ if (subj == NULL) { ++ /* otherwise: ++ perform subject lookup in possibly new role ++ we can use this result below in the case where role == task->role ++ */ ++ subj = chk_subj_label(filp->f_path.dentry, filp->f_path.mnt, role); ++ } ++ ++ /* if we changed uid/gid, but result in the same role ++ and are using inheritance, don't lose the inherited subject ++ if current subject is other than what normal lookup ++ would result in, we arrived via inheritance, don't ++ lose subject ++ */ ++ if (role != origrole || (!(task->acl->mode & GR_INHERITLEARN) && ++ (subj == task->acl))) ++ task->acl = subj; ++ ++ /* leave task->inherited unaffected */ ++ ++ task->is_writable = 0; ++ ++ /* ignore additional mmap checks for processes that are writable ++ by the default ACL */ ++ obj = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, running_polstate.default_role->root_label); ++ if (unlikely(obj->mode & GR_WRITE)) ++ task->is_writable = 1; ++ obj = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, task->role->root_label); ++ if (unlikely(obj->mode & GR_WRITE)) ++ task->is_writable = 1; ++ ++#ifdef CONFIG_GRKERNSEC_RBAC_DEBUG ++ printk(KERN_ALERT "Set role label for (%s:%d): role:%s, subject:%s\n", task->comm, task_pid_nr(task), task->role->rolename, task->acl->filename); ++#endif ++ ++ gr_set_proc_res(task); ++ ++ return; ++} ++ ++int ++gr_set_proc_label(const struct dentry *dentry, const struct vfsmount *mnt, ++ const int unsafe_flags) ++{ ++ struct task_struct *task = current; ++ struct acl_subject_label *newacl; ++ struct acl_object_label *obj; ++ __u32 retmode; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return 0; ++ ++ newacl = chk_subj_label(dentry, mnt, task->role); ++ ++ /* special handling for if we did an strace -f -p <pid> from an admin role, where pid then ++ did an exec ++ */ ++ rcu_read_lock(); ++ read_lock(&tasklist_lock); ++ if (task->ptrace && task->parent && ((task->parent->role->roletype & GR_ROLE_GOD) || ++ (task->parent->acl->mode & GR_POVERRIDE))) { ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ goto skip_check; ++ } ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ ++ if (unsafe_flags && !(task->acl->mode & GR_POVERRIDE) && (task->acl != newacl) && ++ !(task->role->roletype & GR_ROLE_GOD) && ++ !gr_search_file(dentry, GR_PTRACERD, mnt) && ++ !(task->acl->mode & (GR_LEARN | GR_INHERITLEARN))) { ++ if (unsafe_flags & LSM_UNSAFE_SHARE) ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_UNSAFESHARE_EXEC_ACL_MSG, dentry, mnt); ++ else ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_PTRACE_EXEC_ACL_MSG, dentry, mnt); ++ return -EACCES; ++ } ++ ++skip_check: ++ ++ obj = chk_obj_label(dentry, mnt, task->acl); ++ retmode = obj->mode & (GR_INHERIT | GR_AUDIT_INHERIT); ++ ++ if (!(task->acl->mode & GR_INHERITLEARN) && ++ ((newacl->mode & GR_LEARN) || !(retmode & GR_INHERIT))) { ++ if (obj->nested) ++ task->acl = obj->nested; ++ else ++ task->acl = newacl; ++ task->inherited = 0; ++ } else { ++ task->inherited = 1; ++ if (retmode & GR_INHERIT && retmode & GR_AUDIT_INHERIT) ++ gr_log_str_fs(GR_DO_AUDIT, GR_INHERIT_ACL_MSG, task->acl->filename, dentry, mnt); ++ } ++ ++ task->is_writable = 0; ++ ++ /* ignore additional mmap checks for processes that are writable ++ by the default ACL */ ++ obj = chk_obj_label(dentry, mnt, running_polstate.default_role->root_label); ++ if (unlikely(obj->mode & GR_WRITE)) ++ task->is_writable = 1; ++ obj = chk_obj_label(dentry, mnt, task->role->root_label); ++ if (unlikely(obj->mode & GR_WRITE)) ++ task->is_writable = 1; ++ ++ gr_set_proc_res(task); ++ ++#ifdef CONFIG_GRKERNSEC_RBAC_DEBUG ++ printk(KERN_ALERT "Set subject label for (%s:%d): role:%s, subject:%s\n", task->comm, task_pid_nr(task), task->role->rolename, task->acl->filename); ++#endif ++ return 0; ++} ++ ++/* always called with valid inodev ptr */ ++static void ++do_handle_delete(struct inodev_entry *inodev, const u64 ino, const dev_t dev) ++{ ++ struct acl_object_label *matchpo; ++ struct acl_subject_label *matchps; ++ struct acl_subject_label *subj; ++ struct acl_role_label *role; ++ unsigned int x; ++ ++ FOR_EACH_ROLE_START(role) ++ FOR_EACH_SUBJECT_START(role, subj, x) ++ if ((matchpo = lookup_acl_obj_label(ino, dev, subj)) != NULL) ++ matchpo->mode |= GR_DELETED; ++ FOR_EACH_SUBJECT_END(subj,x) ++ FOR_EACH_NESTED_SUBJECT_START(role, subj) ++ /* nested subjects aren't in the role's subj_hash table */ ++ if ((matchpo = lookup_acl_obj_label(ino, dev, subj)) != NULL) ++ matchpo->mode |= GR_DELETED; ++ FOR_EACH_NESTED_SUBJECT_END(subj) ++ if ((matchps = lookup_acl_subj_label(ino, dev, role)) != NULL) ++ matchps->mode |= GR_DELETED; ++ FOR_EACH_ROLE_END(role) ++ ++ inodev->nentry->deleted = 1; ++ ++ return; ++} ++ ++void ++gr_handle_delete(const u64 ino, const dev_t dev) ++{ ++ struct inodev_entry *inodev; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return; ++ ++ write_lock(&gr_inode_lock); ++ inodev = lookup_inodev_entry(ino, dev); ++ if (inodev != NULL) ++ do_handle_delete(inodev, ino, dev); ++ write_unlock(&gr_inode_lock); ++ ++ return; ++} ++ ++static void ++update_acl_obj_label(const u64 oldinode, const dev_t olddevice, ++ const u64 newinode, const dev_t newdevice, ++ struct acl_subject_label *subj) ++{ ++ unsigned int index = gr_fhash(oldinode, olddevice, subj->obj_hash_size); ++ struct acl_object_label *match; ++ ++ match = subj->obj_hash[index]; ++ ++ while (match && (match->inode != oldinode || ++ match->device != olddevice || ++ !(match->mode & GR_DELETED))) ++ match = match->next; ++ ++ if (match && (match->inode == oldinode) ++ && (match->device == olddevice) ++ && (match->mode & GR_DELETED)) { ++ if (match->prev == NULL) { ++ subj->obj_hash[index] = match->next; ++ if (match->next != NULL) ++ match->next->prev = NULL; ++ } else { ++ match->prev->next = match->next; ++ if (match->next != NULL) ++ match->next->prev = match->prev; ++ } ++ match->prev = NULL; ++ match->next = NULL; ++ match->inode = newinode; ++ match->device = newdevice; ++ match->mode &= ~GR_DELETED; ++ ++ insert_acl_obj_label(match, subj); ++ } ++ ++ return; ++} ++ ++static void ++update_acl_subj_label(const u64 oldinode, const dev_t olddevice, ++ const u64 newinode, const dev_t newdevice, ++ struct acl_role_label *role) ++{ ++ unsigned int index = gr_fhash(oldinode, olddevice, role->subj_hash_size); ++ struct acl_subject_label *match; ++ ++ match = role->subj_hash[index]; ++ ++ while (match && (match->inode != oldinode || ++ match->device != olddevice || ++ !(match->mode & GR_DELETED))) ++ match = match->next; ++ ++ if (match && (match->inode == oldinode) ++ && (match->device == olddevice) ++ && (match->mode & GR_DELETED)) { ++ if (match->prev == NULL) { ++ role->subj_hash[index] = match->next; ++ if (match->next != NULL) ++ match->next->prev = NULL; ++ } else { ++ match->prev->next = match->next; ++ if (match->next != NULL) ++ match->next->prev = match->prev; ++ } ++ match->prev = NULL; ++ match->next = NULL; ++ match->inode = newinode; ++ match->device = newdevice; ++ match->mode &= ~GR_DELETED; ++ ++ insert_acl_subj_label(match, role); ++ } ++ ++ return; ++} ++ ++static void ++update_inodev_entry(const u64 oldinode, const dev_t olddevice, ++ const u64 newinode, const dev_t newdevice) ++{ ++ unsigned int index = gr_fhash(oldinode, olddevice, running_polstate.inodev_set.i_size); ++ struct inodev_entry *match; ++ ++ match = running_polstate.inodev_set.i_hash[index]; ++ ++ while (match && (match->nentry->inode != oldinode || ++ match->nentry->device != olddevice || !match->nentry->deleted)) ++ match = match->next; ++ ++ if (match && (match->nentry->inode == oldinode) ++ && (match->nentry->device == olddevice) && ++ match->nentry->deleted) { ++ if (match->prev == NULL) { ++ running_polstate.inodev_set.i_hash[index] = match->next; ++ if (match->next != NULL) ++ match->next->prev = NULL; ++ } else { ++ match->prev->next = match->next; ++ if (match->next != NULL) ++ match->next->prev = match->prev; ++ } ++ match->prev = NULL; ++ match->next = NULL; ++ match->nentry->inode = newinode; ++ match->nentry->device = newdevice; ++ match->nentry->deleted = 0; ++ ++ insert_inodev_entry(match); ++ } ++ ++ return; ++} ++ ++static void ++__do_handle_create(const struct name_entry *matchn, u64 ino, dev_t dev) ++{ ++ struct acl_subject_label *subj; ++ struct acl_role_label *role; ++ unsigned int x; ++ ++ FOR_EACH_ROLE_START(role) ++ update_acl_subj_label(matchn->inode, matchn->device, ino, dev, role); ++ ++ FOR_EACH_NESTED_SUBJECT_START(role, subj) ++ if ((subj->inode == ino) && (subj->device == dev)) { ++ subj->inode = ino; ++ subj->device = dev; ++ } ++ /* nested subjects aren't in the role's subj_hash table */ ++ update_acl_obj_label(matchn->inode, matchn->device, ++ ino, dev, subj); ++ FOR_EACH_NESTED_SUBJECT_END(subj) ++ FOR_EACH_SUBJECT_START(role, subj, x) ++ update_acl_obj_label(matchn->inode, matchn->device, ++ ino, dev, subj); ++ FOR_EACH_SUBJECT_END(subj,x) ++ FOR_EACH_ROLE_END(role) ++ ++ update_inodev_entry(matchn->inode, matchn->device, ino, dev); ++ ++ return; ++} ++ ++static void ++do_handle_create(const struct name_entry *matchn, const struct dentry *dentry, ++ const struct vfsmount *mnt) ++{ ++ u64 ino = __get_ino(dentry); ++ dev_t dev = __get_dev(dentry); ++ ++ __do_handle_create(matchn, ino, dev); ++ ++ return; ++} ++ ++void ++gr_handle_create(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ struct name_entry *matchn; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return; ++ ++ preempt_disable(); ++ matchn = lookup_name_entry(gr_to_filename_rbac(dentry, mnt)); ++ ++ if (unlikely((unsigned long)matchn)) { ++ write_lock(&gr_inode_lock); ++ do_handle_create(matchn, dentry, mnt); ++ write_unlock(&gr_inode_lock); ++ } ++ preempt_enable(); ++ ++ return; ++} ++ ++void ++gr_handle_proc_create(const struct dentry *dentry, const struct inode *inode) ++{ ++ struct name_entry *matchn; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return; ++ ++ preempt_disable(); ++ matchn = lookup_name_entry(gr_to_proc_filename_rbac(dentry, init_pid_ns.proc_mnt)); ++ ++ if (unlikely((unsigned long)matchn)) { ++ write_lock(&gr_inode_lock); ++ __do_handle_create(matchn, inode->i_ino, inode->i_sb->s_dev); ++ write_unlock(&gr_inode_lock); ++ } ++ preempt_enable(); ++ ++ return; ++} ++ ++void ++gr_handle_rename(struct inode *old_dir, struct inode *new_dir, ++ struct dentry *old_dentry, ++ struct dentry *new_dentry, ++ struct vfsmount *mnt, const __u8 replace, unsigned int flags) ++{ ++ struct name_entry *matchn; ++ struct name_entry *matchn2 = NULL; ++ struct inodev_entry *inodev; ++ struct inode *inode = new_dentry->d_inode; ++ u64 old_ino = __get_ino(old_dentry); ++ dev_t old_dev = __get_dev(old_dentry); ++ unsigned int exchange = flags & RENAME_EXCHANGE; ++ ++ /* vfs_rename swaps the name and parent link for old_dentry and ++ new_dentry ++ at this point, old_dentry has the new name, parent link, and inode ++ for the renamed file ++ if a file is being replaced by a rename, new_dentry has the inode ++ and name for the replaced file ++ */ ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return; ++ ++ preempt_disable(); ++ matchn = lookup_name_entry(gr_to_filename_rbac(old_dentry, mnt)); ++ ++ /* exchange cases: ++ a filename exists for the source, but not dest ++ do a recreate on source ++ a filename exists for the dest, but not source ++ do a recreate on dest ++ a filename exists for both source and dest ++ delete source and dest, then create source and dest ++ a filename exists for neither source nor dest ++ no updates needed ++ ++ the name entry lookups get us the old inode/dev associated with ++ each name, so do the deletes first (if possible) so that when ++ we do the create, we pick up on the right entries ++ */ ++ ++ if (exchange) ++ matchn2 = lookup_name_entry(gr_to_filename_rbac(new_dentry, mnt)); ++ ++ /* we wouldn't have to check d_inode if it weren't for ++ NFS silly-renaming ++ */ ++ ++ write_lock(&gr_inode_lock); ++ if (unlikely((replace || exchange) && inode)) { ++ u64 new_ino = __get_ino(new_dentry); ++ dev_t new_dev = __get_dev(new_dentry); ++ ++ inodev = lookup_inodev_entry(new_ino, new_dev); ++ if (inodev != NULL && ((inode->i_nlink <= 1) || S_ISDIR(inode->i_mode))) ++ do_handle_delete(inodev, new_ino, new_dev); ++ } ++ ++ inodev = lookup_inodev_entry(old_ino, old_dev); ++ if (inodev != NULL && ((old_dentry->d_inode->i_nlink <= 1) || S_ISDIR(old_dentry->d_inode->i_mode))) ++ do_handle_delete(inodev, old_ino, old_dev); ++ ++ if (unlikely(matchn != NULL)) ++ do_handle_create(matchn, old_dentry, mnt); ++ ++ if (unlikely(matchn2 != NULL)) ++ do_handle_create(matchn2, new_dentry, mnt); ++ ++ write_unlock(&gr_inode_lock); ++ preempt_enable(); ++ ++ return; ++} ++ ++#if defined(CONFIG_GRKERNSEC_RESLOG) || !defined(CONFIG_GRKERNSEC_NO_RBAC) ++static const unsigned long res_learn_bumps[GR_NLIMITS] = { ++ [RLIMIT_CPU] = GR_RLIM_CPU_BUMP, ++ [RLIMIT_FSIZE] = GR_RLIM_FSIZE_BUMP, ++ [RLIMIT_DATA] = GR_RLIM_DATA_BUMP, ++ [RLIMIT_STACK] = GR_RLIM_STACK_BUMP, ++ [RLIMIT_CORE] = GR_RLIM_CORE_BUMP, ++ [RLIMIT_RSS] = GR_RLIM_RSS_BUMP, ++ [RLIMIT_NPROC] = GR_RLIM_NPROC_BUMP, ++ [RLIMIT_NOFILE] = GR_RLIM_NOFILE_BUMP, ++ [RLIMIT_MEMLOCK] = GR_RLIM_MEMLOCK_BUMP, ++ [RLIMIT_AS] = GR_RLIM_AS_BUMP, ++ [RLIMIT_LOCKS] = GR_RLIM_LOCKS_BUMP, ++ [RLIMIT_SIGPENDING] = GR_RLIM_SIGPENDING_BUMP, ++ [RLIMIT_MSGQUEUE] = GR_RLIM_MSGQUEUE_BUMP, ++ [RLIMIT_NICE] = GR_RLIM_NICE_BUMP, ++ [RLIMIT_RTPRIO] = GR_RLIM_RTPRIO_BUMP, ++ [RLIMIT_RTTIME] = GR_RLIM_RTTIME_BUMP ++}; ++ ++void ++gr_learn_resource(const struct task_struct *task, ++ const int res, const unsigned long wanted, const int gt) ++{ ++ struct acl_subject_label *acl; ++ const struct cred *cred; ++ ++ if (unlikely((gr_status & GR_READY) && ++ task->acl && (task->acl->mode & (GR_LEARN | GR_INHERITLEARN)))) ++ goto skip_reslog; ++ ++ gr_log_resource(task, res, wanted, gt); ++skip_reslog: ++ ++ if (unlikely(!(gr_status & GR_READY) || !wanted || res >= GR_NLIMITS)) ++ return; ++ ++ acl = task->acl; ++ ++ if (likely(!acl || !(acl->mode & (GR_LEARN | GR_INHERITLEARN)) || ++ !(acl->resmask & (1U << (unsigned short) res)))) ++ return; ++ ++ if (wanted >= acl->res[res].rlim_cur) { ++ unsigned long res_add; ++ ++ res_add = wanted + res_learn_bumps[res]; ++ ++ acl->res[res].rlim_cur = res_add; ++ ++ if (wanted > acl->res[res].rlim_max) ++ acl->res[res].rlim_max = res_add; ++ ++ /* only log the subject filename, since resource logging is supported for ++ single-subject learning only */ ++ rcu_read_lock(); ++ cred = __task_cred(task); ++ security_learn(GR_LEARN_AUDIT_MSG, task->role->rolename, ++ task->role->roletype, GR_GLOBAL_UID(cred->uid), GR_GLOBAL_GID(cred->gid), acl->filename, ++ acl->filename, acl->res[res].rlim_cur, acl->res[res].rlim_max, ++ "", (unsigned long) res, &task->signal->saved_ip); ++ rcu_read_unlock(); ++ } ++ ++ return; ++} ++EXPORT_SYMBOL_GPL(gr_learn_resource); ++#endif ++ ++#if defined(CONFIG_PAX_HAVE_ACL_FLAGS) && (defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR)) ++void ++pax_set_initial_flags(struct linux_binprm *bprm) ++{ ++ struct task_struct *task = current; ++ struct acl_subject_label *proc; ++ unsigned long flags; ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return; ++ ++ flags = pax_get_flags(task); ++ ++ proc = task->acl; ++ ++ if (proc->pax_flags & GR_PAX_DISABLE_PAGEEXEC) ++ flags &= ~MF_PAX_PAGEEXEC; ++ if (proc->pax_flags & GR_PAX_DISABLE_SEGMEXEC) ++ flags &= ~MF_PAX_SEGMEXEC; ++ if (proc->pax_flags & GR_PAX_DISABLE_RANDMMAP) ++ flags &= ~MF_PAX_RANDMMAP; ++ if (proc->pax_flags & GR_PAX_DISABLE_EMUTRAMP) ++ flags &= ~MF_PAX_EMUTRAMP; ++ if (proc->pax_flags & GR_PAX_DISABLE_MPROTECT) ++ flags &= ~MF_PAX_MPROTECT; ++ ++ if (proc->pax_flags & GR_PAX_ENABLE_PAGEEXEC) ++ flags |= MF_PAX_PAGEEXEC; ++ if (proc->pax_flags & GR_PAX_ENABLE_SEGMEXEC) ++ flags |= MF_PAX_SEGMEXEC; ++ if (proc->pax_flags & GR_PAX_ENABLE_RANDMMAP) ++ flags |= MF_PAX_RANDMMAP; ++ if (proc->pax_flags & GR_PAX_ENABLE_EMUTRAMP) ++ flags |= MF_PAX_EMUTRAMP; ++ if (proc->pax_flags & GR_PAX_ENABLE_MPROTECT) ++ flags |= MF_PAX_MPROTECT; ++ ++ pax_set_flags(task, flags); ++ ++ return; ++} ++#endif ++ ++int ++gr_handle_proc_ptrace(struct task_struct *task) ++{ ++ struct file *filp; ++ struct task_struct *tmp = task; ++ struct task_struct *curtemp = current; ++ __u32 retmode; ++ ++#ifndef CONFIG_GRKERNSEC_HARDEN_PTRACE ++ if (unlikely(!(gr_status & GR_READY))) ++ return 0; ++#endif ++ ++ read_lock(&tasklist_lock); ++ read_lock(&grsec_exec_file_lock); ++ filp = task->exec_file; ++ ++ while (task_pid_nr(tmp) > 0) { ++ if (tmp == curtemp) ++ break; ++ tmp = tmp->real_parent; ++ } ++ ++ if (!filp || (task_pid_nr(tmp) == 0 && ((grsec_enable_harden_ptrace && gr_is_global_nonroot(current_uid()) && !(gr_status & GR_READY)) || ++ ((gr_status & GR_READY) && !(current->acl->mode & GR_RELAXPTRACE))))) { ++ read_unlock(&grsec_exec_file_lock); ++ read_unlock(&tasklist_lock); ++ return 1; ++ } ++ ++#ifdef CONFIG_GRKERNSEC_HARDEN_PTRACE ++ if (!(gr_status & GR_READY)) { ++ read_unlock(&grsec_exec_file_lock); ++ read_unlock(&tasklist_lock); ++ return 0; ++ } ++#endif ++ ++ retmode = gr_search_file(filp->f_path.dentry, GR_NOPTRACE, filp->f_path.mnt); ++ read_unlock(&grsec_exec_file_lock); ++ read_unlock(&tasklist_lock); ++ ++ if (retmode & GR_NOPTRACE) ++ return 1; ++ ++ if (!(current->acl->mode & GR_POVERRIDE) && !(current->role->roletype & GR_ROLE_GOD) ++ && (current->acl != task->acl || (current->acl != current->role->root_label ++ && task_pid_nr(current) != task_pid_nr(task)))) ++ return 1; ++ ++ return 0; ++} ++ ++void task_grsec_rbac(struct seq_file *m, struct task_struct *p) ++{ ++ if (unlikely(!(gr_status & GR_READY))) ++ return; ++ ++ if (!(current->role->roletype & GR_ROLE_GOD)) ++ return; ++ ++ seq_printf(m, "RBAC:\t%.64s:%c:%.950s\n", ++ p->role->rolename, gr_task_roletype_to_char(p), ++ p->acl->filename); ++} ++ ++int ++gr_handle_ptrace(struct task_struct *task, const long request) ++{ ++ struct task_struct *tmp = task; ++ struct task_struct *curtemp = current; ++ __u32 retmode; ++ ++#ifndef CONFIG_GRKERNSEC_HARDEN_PTRACE ++ if (unlikely(!(gr_status & GR_READY))) ++ return 0; ++#endif ++ if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { ++ read_lock(&tasklist_lock); ++ while (task_pid_nr(tmp) > 0) { ++ if (tmp == curtemp) ++ break; ++ tmp = tmp->real_parent; ++ } ++ ++ if (task_pid_nr(tmp) == 0 && ((grsec_enable_harden_ptrace && gr_is_global_nonroot(current_uid()) && !(gr_status & GR_READY)) || ++ ((gr_status & GR_READY) && !(current->acl->mode & GR_RELAXPTRACE)))) { ++ read_unlock(&tasklist_lock); ++ gr_log_ptrace(GR_DONT_AUDIT, GR_PTRACE_ACL_MSG, task); ++ return 1; ++ } ++ read_unlock(&tasklist_lock); ++ } ++ ++#ifdef CONFIG_GRKERNSEC_HARDEN_PTRACE ++ if (!(gr_status & GR_READY)) ++ return 0; ++#endif ++ ++ read_lock(&grsec_exec_file_lock); ++ if (unlikely(!task->exec_file)) { ++ read_unlock(&grsec_exec_file_lock); ++ return 0; ++ } ++ ++ retmode = gr_search_file(task->exec_file->f_path.dentry, GR_PTRACERD | GR_NOPTRACE, task->exec_file->f_path.mnt); ++ read_unlock(&grsec_exec_file_lock); ++ ++ if (retmode & GR_NOPTRACE) { ++ gr_log_ptrace(GR_DONT_AUDIT, GR_PTRACE_ACL_MSG, task); ++ return 1; ++ } ++ ++ if (retmode & GR_PTRACERD) { ++ switch (request) { ++ case PTRACE_SEIZE: ++ case PTRACE_POKETEXT: ++ case PTRACE_POKEDATA: ++ case PTRACE_POKEUSR: ++#if !defined(CONFIG_PPC32) && !defined(CONFIG_PPC64) && !defined(CONFIG_PARISC) && !defined(CONFIG_ALPHA) && !defined(CONFIG_IA64) ++ case PTRACE_SETREGS: ++ case PTRACE_SETFPREGS: ++#endif ++#ifdef CONFIG_X86 ++ case PTRACE_SETFPXREGS: ++#endif ++#ifdef CONFIG_ALTIVEC ++ case PTRACE_SETVRREGS: ++#endif ++ return 1; ++ default: ++ return 0; ++ } ++ } else if (!(current->acl->mode & GR_POVERRIDE) && ++ !(current->role->roletype & GR_ROLE_GOD) && ++ (current->acl != task->acl)) { ++ gr_log_ptrace(GR_DONT_AUDIT, GR_PTRACE_ACL_MSG, task); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++static int is_writable_mmap(const struct file *filp) ++{ ++ struct task_struct *task = current; ++ struct acl_object_label *obj, *obj2; ++ ++ if (gr_status & GR_READY && !(task->acl->mode & GR_OVERRIDE) && ++ !task->is_writable && S_ISREG(filp->f_path.dentry->d_inode->i_mode) && (filp->f_path.mnt != shm_mnt || (filp->f_path.dentry->d_inode->i_nlink > 0))) { ++ obj = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, running_polstate.default_role->root_label); ++ obj2 = chk_obj_label(filp->f_path.dentry, filp->f_path.mnt, ++ task->role->root_label); ++ if (unlikely((obj->mode & GR_WRITE) || (obj2->mode & GR_WRITE))) { ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_WRITLIB_ACL_MSG, filp->f_path.dentry, filp->f_path.mnt); ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++int ++gr_acl_handle_mmap(const struct file *file, const unsigned long prot) ++{ ++ __u32 mode; ++ ++ if (unlikely(!file || !(prot & PROT_EXEC))) ++ return 1; ++ ++ if (is_writable_mmap(file)) ++ return 0; ++ ++ mode = ++ gr_search_file(file->f_path.dentry, ++ GR_EXEC | GR_AUDIT_EXEC | GR_SUPPRESS, ++ file->f_path.mnt); ++ ++ if (!gr_tpe_allow(file)) ++ return 0; ++ ++ if (unlikely(!(mode & GR_EXEC) && !(mode & GR_SUPPRESS))) { ++ gr_log_fs_rbac_generic(GR_DONT_AUDIT, GR_MMAP_ACL_MSG, file->f_path.dentry, file->f_path.mnt); ++ return 0; ++ } else if (unlikely(!(mode & GR_EXEC))) { ++ return 0; ++ } else if (unlikely(mode & GR_EXEC && mode & GR_AUDIT_EXEC)) { ++ gr_log_fs_rbac_generic(GR_DO_AUDIT, GR_MMAP_ACL_MSG, file->f_path.dentry, file->f_path.mnt); ++ return 1; ++ } ++ ++ return 1; ++} ++ ++int ++gr_acl_handle_mprotect(const struct file *file, const unsigned long prot) ++{ ++ __u32 mode; ++ ++ if (unlikely(!file || !(prot & PROT_EXEC))) ++ return 1; ++ ++ if (is_writable_mmap(file)) ++ return 0; ++ ++ mode = ++ gr_search_file(file->f_path.dentry, ++ GR_EXEC | GR_AUDIT_EXEC | GR_SUPPRESS, ++ file->f_path.mnt); ++ ++ if (!gr_tpe_allow(file)) ++ return 0; ++ ++ if (unlikely(!(mode & GR_EXEC) && !(mode & GR_SUPPRESS))) { ++ gr_log_fs_rbac_generic(GR_DONT_AUDIT, GR_MPROTECT_ACL_MSG, file->f_path.dentry, file->f_path.mnt); ++ return 0; ++ } else if (unlikely(!(mode & GR_EXEC))) { ++ return 0; ++ } else if (unlikely(mode & GR_EXEC && mode & GR_AUDIT_EXEC)) { ++ gr_log_fs_rbac_generic(GR_DO_AUDIT, GR_MPROTECT_ACL_MSG, file->f_path.dentry, file->f_path.mnt); ++ return 1; ++ } ++ ++ return 1; ++} ++ ++void ++gr_acl_handle_psacct(struct task_struct *task, const long code) ++{ ++ unsigned long runtime, cputime; ++ cputime_t utime, stime; ++ unsigned int wday, cday; ++ __u8 whr, chr; ++ __u8 wmin, cmin; ++ __u8 wsec, csec; ++ struct timespec curtime, starttime; ++ ++ if (unlikely(!(gr_status & GR_READY) || !task->acl || ++ !(task->acl->mode & GR_PROCACCT))) ++ return; ++ ++ curtime = ns_to_timespec(ktime_get_ns()); ++ starttime = ns_to_timespec(task->start_time); ++ runtime = curtime.tv_sec - starttime.tv_sec; ++ wday = runtime / (60 * 60 * 24); ++ runtime -= wday * (60 * 60 * 24); ++ whr = runtime / (60 * 60); ++ runtime -= whr * (60 * 60); ++ wmin = runtime / 60; ++ runtime -= wmin * 60; ++ wsec = runtime; ++ ++ task_cputime(task, &utime, &stime); ++ cputime = cputime_to_secs(utime + stime); ++ cday = cputime / (60 * 60 * 24); ++ cputime -= cday * (60 * 60 * 24); ++ chr = cputime / (60 * 60); ++ cputime -= chr * (60 * 60); ++ cmin = cputime / 60; ++ cputime -= cmin * 60; ++ csec = cputime; ++ ++ gr_log_procacct(GR_DO_AUDIT, GR_ACL_PROCACCT_MSG, task, wday, whr, wmin, wsec, cday, chr, cmin, csec, code); ++ ++ return; ++} ++ ++#ifdef CONFIG_TASKSTATS ++int gr_is_taskstats_denied(int pid) ++{ ++ struct task_struct *task; ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ const struct cred *cred; ++#endif ++ int ret = 0; ++ ++ /* restrict taskstats viewing to un-chrooted root users ++ who have the 'view' subject flag if the RBAC system is enabled ++ */ ++ ++ rcu_read_lock(); ++ read_lock(&tasklist_lock); ++ task = find_task_by_vpid(pid); ++ if (task) { ++#ifdef CONFIG_GRKERNSEC_CHROOT ++ if (proc_is_chrooted(task)) ++ ret = -EACCES; ++#endif ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ cred = __task_cred(task); ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ if (gr_is_global_nonroot(cred->uid)) ++ ret = -EACCES; ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ if (gr_is_global_nonroot(cred->uid) && !groups_search(cred->group_info, grsec_proc_gid)) ++ ret = -EACCES; ++#endif ++#endif ++ if (gr_status & GR_READY) { ++ if (!(task->acl->mode & GR_VIEW)) ++ ret = -EACCES; ++ } ++ } else ++ ret = -ENOENT; ++ ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ ++ return ret; ++} ++#endif ++ ++/* AUXV entries are filled via a descendant of search_binary_handler ++ after we've already applied the subject for the target ++*/ ++int gr_acl_enable_at_secure(void) ++{ ++ if (unlikely(!(gr_status & GR_READY))) ++ return 0; ++ ++ if (current->acl->mode & GR_ATSECURE) ++ return 1; ++ ++ return 0; ++} ++ ++int gr_acl_handle_filldir(const struct file *file, const char *name, const unsigned int namelen, const u64 ino) ++{ ++ struct task_struct *task = current; ++ struct dentry *dentry = file->f_path.dentry; ++ struct vfsmount *mnt = file->f_path.mnt; ++ struct acl_object_label *obj, *tmp; ++ struct acl_subject_label *subj; ++ unsigned int bufsize; ++ int is_not_root; ++ char *path; ++ dev_t dev = __get_dev(dentry); ++ ++ if (unlikely(!(gr_status & GR_READY))) ++ return 1; ++ ++ if (task->acl->mode & (GR_LEARN | GR_INHERITLEARN)) ++ return 1; ++ ++ /* ignore Eric Biederman */ ++ if (IS_PRIVATE(dentry->d_inode)) ++ return 1; ++ ++ subj = task->acl; ++ read_lock(&gr_inode_lock); ++ do { ++ obj = lookup_acl_obj_label(ino, dev, subj); ++ if (obj != NULL) { ++ read_unlock(&gr_inode_lock); ++ return (obj->mode & GR_FIND) ? 1 : 0; ++ } ++ } while ((subj = subj->parent_subject)); ++ read_unlock(&gr_inode_lock); ++ ++ /* this is purely an optimization since we're looking for an object ++ for the directory we're doing a readdir on ++ if it's possible for any globbed object to match the entry we're ++ filling into the directory, then the object we find here will be ++ an anchor point with attached globbed objects ++ */ ++ obj = chk_obj_label_noglob(dentry, mnt, task->acl); ++ if (obj->globbed == NULL) ++ return (obj->mode & GR_FIND) ? 1 : 0; ++ ++ is_not_root = ((obj->filename[0] == '/') && ++ (obj->filename[1] == '\0')) ? 0 : 1; ++ bufsize = PAGE_SIZE - namelen - is_not_root; ++ ++ /* check bufsize > PAGE_SIZE || bufsize == 0 */ ++ if (unlikely((bufsize - 1) > (PAGE_SIZE - 1))) ++ return 1; ++ ++ preempt_disable(); ++ path = d_real_path(dentry, mnt, per_cpu_ptr(gr_shared_page[0], smp_processor_id()), ++ bufsize); ++ ++ bufsize = strlen(path); ++ ++ /* if base is "/", don't append an additional slash */ ++ if (is_not_root) ++ *(path + bufsize) = '/'; ++ memcpy(path + bufsize + is_not_root, name, namelen); ++ *(path + bufsize + namelen + is_not_root) = '\0'; ++ ++ tmp = obj->globbed; ++ while (tmp) { ++ if (!glob_match(tmp->filename, path)) { ++ preempt_enable(); ++ return (tmp->mode & GR_FIND) ? 1 : 0; ++ } ++ tmp = tmp->next; ++ } ++ preempt_enable(); ++ return (obj->mode & GR_FIND) ? 1 : 0; ++} ++ ++void gr_put_exec_file(struct task_struct *task) ++{ ++ struct file *filp; ++ ++ write_lock(&grsec_exec_file_lock); ++ filp = task->exec_file; ++ task->exec_file = NULL; ++ write_unlock(&grsec_exec_file_lock); ++ ++ if (filp) ++ fput(filp); ++ ++ return; ++} ++ ++ ++#ifdef CONFIG_NETFILTER_XT_MATCH_GRADM_MODULE ++EXPORT_SYMBOL_GPL(gr_acl_is_enabled); ++#endif ++#ifdef CONFIG_SECURITY ++EXPORT_SYMBOL_GPL(gr_check_user_change); ++EXPORT_SYMBOL_GPL(gr_check_group_change); ++#endif ++ +diff --git a/grsecurity/gracl_alloc.c b/grsecurity/gracl_alloc.c +new file mode 100644 +index 0000000..18ffbbd +--- /dev/null ++++ b/grsecurity/gracl_alloc.c +@@ -0,0 +1,105 @@ ++#include <linux/kernel.h> ++#include <linux/mm.h> ++#include <linux/slab.h> ++#include <linux/vmalloc.h> ++#include <linux/gracl.h> ++#include <linux/grsecurity.h> ++ ++static struct gr_alloc_state __current_alloc_state = { 1, 1, NULL }; ++struct gr_alloc_state *current_alloc_state = &__current_alloc_state; ++ ++static __inline__ int ++alloc_pop(void) ++{ ++ if (current_alloc_state->alloc_stack_next == 1) ++ return 0; ++ ++ kfree(current_alloc_state->alloc_stack[current_alloc_state->alloc_stack_next - 2]); ++ ++ current_alloc_state->alloc_stack_next--; ++ ++ return 1; ++} ++ ++static __inline__ int ++alloc_push(void *buf) ++{ ++ if (current_alloc_state->alloc_stack_next >= current_alloc_state->alloc_stack_size) ++ return 1; ++ ++ current_alloc_state->alloc_stack[current_alloc_state->alloc_stack_next - 1] = buf; ++ ++ current_alloc_state->alloc_stack_next++; ++ ++ return 0; ++} ++ ++void * ++acl_alloc(unsigned long len) ++{ ++ void *ret = NULL; ++ ++ if (!len || len > PAGE_SIZE) ++ goto out; ++ ++ ret = kmalloc(len, GFP_KERNEL); ++ ++ if (ret) { ++ if (alloc_push(ret)) { ++ kfree(ret); ++ ret = NULL; ++ } ++ } ++ ++out: ++ return ret; ++} ++ ++void * ++acl_alloc_num(unsigned long num, unsigned long len) ++{ ++ if (!len || (num > (PAGE_SIZE / len))) ++ return NULL; ++ ++ return acl_alloc(num * len); ++} ++ ++void ++acl_free_all(void) ++{ ++ if (!current_alloc_state->alloc_stack) ++ return; ++ ++ while (alloc_pop()) ; ++ ++ if (current_alloc_state->alloc_stack) { ++ if ((current_alloc_state->alloc_stack_size * sizeof (void *)) <= PAGE_SIZE) ++ kfree(current_alloc_state->alloc_stack); ++ else ++ vfree(current_alloc_state->alloc_stack); ++ } ++ ++ current_alloc_state->alloc_stack = NULL; ++ current_alloc_state->alloc_stack_size = 1; ++ current_alloc_state->alloc_stack_next = 1; ++ ++ return; ++} ++ ++int ++acl_alloc_stack_init(unsigned long size) ++{ ++ if ((size * sizeof (void *)) <= PAGE_SIZE) ++ current_alloc_state->alloc_stack = ++ (void **) kmalloc(size * sizeof (void *), GFP_KERNEL); ++ else ++ current_alloc_state->alloc_stack = (void **) vmalloc(size * sizeof (void *)); ++ ++ current_alloc_state->alloc_stack_size = size; ++ current_alloc_state->alloc_stack_next = 1; ++ ++ if (!current_alloc_state->alloc_stack) ++ return 0; ++ else ++ return 1; ++} +diff --git a/grsecurity/gracl_cap.c b/grsecurity/gracl_cap.c +new file mode 100644 +index 0000000..1a94c11 +--- /dev/null ++++ b/grsecurity/gracl_cap.c +@@ -0,0 +1,127 @@ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/gracl.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++ ++extern const char *captab_log[]; ++extern int captab_log_entries; ++ ++int gr_learn_cap(const struct task_struct *task, const struct cred *cred, const int cap) ++{ ++ struct acl_subject_label *curracl; ++ ++ if (!gr_acl_is_enabled()) ++ return 1; ++ ++ curracl = task->acl; ++ ++ if (curracl->mode & (GR_LEARN | GR_INHERITLEARN)) { ++ security_learn(GR_LEARN_AUDIT_MSG, task->role->rolename, ++ task->role->roletype, GR_GLOBAL_UID(cred->uid), ++ GR_GLOBAL_GID(cred->gid), task->exec_file ? ++ gr_to_filename(task->exec_file->f_path.dentry, ++ task->exec_file->f_path.mnt) : curracl->filename, ++ curracl->filename, 0UL, ++ 0UL, "", (unsigned long) cap, &task->signal->saved_ip); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++int gr_task_acl_is_capable(const struct task_struct *task, const struct cred *cred, const int cap) ++{ ++ struct acl_subject_label *curracl; ++ kernel_cap_t cap_drop = __cap_empty_set, cap_mask = __cap_empty_set; ++ kernel_cap_t cap_audit = __cap_empty_set; ++ ++ if (!gr_acl_is_enabled()) ++ return 1; ++ ++ curracl = task->acl; ++ ++ cap_drop = curracl->cap_lower; ++ cap_mask = curracl->cap_mask; ++ cap_audit = curracl->cap_invert_audit; ++ ++ while ((curracl = curracl->parent_subject)) { ++ /* if the cap isn't specified in the current computed mask but is specified in the ++ current level subject, and is lowered in the current level subject, then add ++ it to the set of dropped capabilities ++ otherwise, add the current level subject's mask to the current computed mask ++ */ ++ if (!cap_raised(cap_mask, cap) && cap_raised(curracl->cap_mask, cap)) { ++ cap_raise(cap_mask, cap); ++ if (cap_raised(curracl->cap_lower, cap)) ++ cap_raise(cap_drop, cap); ++ if (cap_raised(curracl->cap_invert_audit, cap)) ++ cap_raise(cap_audit, cap); ++ } ++ } ++ ++ if (!cap_raised(cap_drop, cap)) { ++ if (cap_raised(cap_audit, cap)) ++ gr_log_cap(GR_DO_AUDIT, GR_CAP_ACL_MSG2, task, captab_log[cap]); ++ return 1; ++ } ++ ++ /* only learn the capability use if the process has the capability in the ++ general case, the two uses in sys.c of gr_learn_cap are an exception ++ to this rule to ensure any role transition involves what the full-learned ++ policy believes in a privileged process ++ */ ++ if (cap_raised(cred->cap_effective, cap) && gr_learn_cap(task, cred, cap)) ++ return 1; ++ ++ if ((cap >= 0) && (cap < captab_log_entries) && cap_raised(cred->cap_effective, cap) && !cap_raised(cap_audit, cap)) ++ gr_log_cap(GR_DONT_AUDIT, GR_CAP_ACL_MSG, task, captab_log[cap]); ++ ++ return 0; ++} ++ ++int ++gr_acl_is_capable(const int cap) ++{ ++ return gr_task_acl_is_capable(current, current_cred(), cap); ++} ++ ++int gr_task_acl_is_capable_nolog(const struct task_struct *task, const int cap) ++{ ++ struct acl_subject_label *curracl; ++ kernel_cap_t cap_drop = __cap_empty_set, cap_mask = __cap_empty_set; ++ ++ if (!gr_acl_is_enabled()) ++ return 1; ++ ++ curracl = task->acl; ++ ++ cap_drop = curracl->cap_lower; ++ cap_mask = curracl->cap_mask; ++ ++ while ((curracl = curracl->parent_subject)) { ++ /* if the cap isn't specified in the current computed mask but is specified in the ++ current level subject, and is lowered in the current level subject, then add ++ it to the set of dropped capabilities ++ otherwise, add the current level subject's mask to the current computed mask ++ */ ++ if (!cap_raised(cap_mask, cap) && cap_raised(curracl->cap_mask, cap)) { ++ cap_raise(cap_mask, cap); ++ if (cap_raised(curracl->cap_lower, cap)) ++ cap_raise(cap_drop, cap); ++ } ++ } ++ ++ if (!cap_raised(cap_drop, cap)) ++ return 1; ++ ++ return 0; ++} ++ ++int ++gr_acl_is_capable_nolog(const int cap) ++{ ++ return gr_task_acl_is_capable_nolog(current, cap); ++} ++ +diff --git a/grsecurity/gracl_compat.c b/grsecurity/gracl_compat.c +new file mode 100644 +index 0000000..a43dd06 +--- /dev/null ++++ b/grsecurity/gracl_compat.c +@@ -0,0 +1,269 @@ ++#include <linux/kernel.h> ++#include <linux/gracl.h> ++#include <linux/compat.h> ++#include <linux/gracl_compat.h> ++ ++#include <asm/uaccess.h> ++ ++int copy_gr_arg_wrapper_compat(const char *buf, struct gr_arg_wrapper *uwrap) ++{ ++ struct gr_arg_wrapper_compat uwrapcompat; ++ ++ if (copy_from_user(&uwrapcompat, buf, sizeof(uwrapcompat))) ++ return -EFAULT; ++ ++ if ((uwrapcompat.version != GRSECURITY_VERSION) || ++ (uwrapcompat.size != sizeof(struct gr_arg_compat))) ++ return -EINVAL; ++ ++ uwrap->arg = compat_ptr(uwrapcompat.arg); ++ uwrap->version = uwrapcompat.version; ++ uwrap->size = sizeof(struct gr_arg); ++ ++ return 0; ++} ++ ++int copy_gr_arg_compat(const struct gr_arg __user *buf, struct gr_arg *arg) ++{ ++ struct gr_arg_compat argcompat; ++ ++ if (copy_from_user(&argcompat, buf, sizeof(argcompat))) ++ return -EFAULT; ++ ++ arg->role_db.r_table = compat_ptr(argcompat.role_db.r_table); ++ arg->role_db.num_pointers = argcompat.role_db.num_pointers; ++ arg->role_db.num_roles = argcompat.role_db.num_roles; ++ arg->role_db.num_domain_children = argcompat.role_db.num_domain_children; ++ arg->role_db.num_subjects = argcompat.role_db.num_subjects; ++ arg->role_db.num_objects = argcompat.role_db.num_objects; ++ ++ memcpy(&arg->pw, &argcompat.pw, sizeof(arg->pw)); ++ memcpy(&arg->salt, &argcompat.salt, sizeof(arg->salt)); ++ memcpy(&arg->sum, &argcompat.sum, sizeof(arg->sum)); ++ memcpy(&arg->sp_role, &argcompat.sp_role, sizeof(arg->sp_role)); ++ arg->sprole_pws = compat_ptr(argcompat.sprole_pws); ++ arg->segv_device = argcompat.segv_device; ++ arg->segv_inode = argcompat.segv_inode; ++ arg->segv_uid = argcompat.segv_uid; ++ arg->num_sprole_pws = argcompat.num_sprole_pws; ++ arg->mode = argcompat.mode; ++ ++ return 0; ++} ++ ++int copy_acl_object_label_compat(struct acl_object_label *obj, const struct acl_object_label *userp) ++{ ++ struct acl_object_label_compat objcompat; ++ ++ if (copy_from_user(&objcompat, userp, sizeof(objcompat))) ++ return -EFAULT; ++ ++ obj->filename = compat_ptr(objcompat.filename); ++ obj->inode = objcompat.inode; ++ obj->device = objcompat.device; ++ obj->mode = objcompat.mode; ++ ++ obj->nested = compat_ptr(objcompat.nested); ++ obj->globbed = compat_ptr(objcompat.globbed); ++ ++ obj->prev = compat_ptr(objcompat.prev); ++ obj->next = compat_ptr(objcompat.next); ++ ++ return 0; ++} ++ ++int copy_acl_subject_label_compat(struct acl_subject_label *subj, const struct acl_subject_label *userp) ++{ ++ unsigned int i; ++ struct acl_subject_label_compat subjcompat; ++ ++ if (copy_from_user(&subjcompat, userp, sizeof(subjcompat))) ++ return -EFAULT; ++ ++ subj->filename = compat_ptr(subjcompat.filename); ++ subj->inode = subjcompat.inode; ++ subj->device = subjcompat.device; ++ subj->mode = subjcompat.mode; ++ subj->cap_mask = subjcompat.cap_mask; ++ subj->cap_lower = subjcompat.cap_lower; ++ subj->cap_invert_audit = subjcompat.cap_invert_audit; ++ ++ for (i = 0; i < GR_NLIMITS; i++) { ++ if (subjcompat.res[i].rlim_cur == COMPAT_RLIM_INFINITY) ++ subj->res[i].rlim_cur = RLIM_INFINITY; ++ else ++ subj->res[i].rlim_cur = subjcompat.res[i].rlim_cur; ++ if (subjcompat.res[i].rlim_max == COMPAT_RLIM_INFINITY) ++ subj->res[i].rlim_max = RLIM_INFINITY; ++ else ++ subj->res[i].rlim_max = subjcompat.res[i].rlim_max; ++ } ++ subj->resmask = subjcompat.resmask; ++ ++ subj->user_trans_type = subjcompat.user_trans_type; ++ subj->group_trans_type = subjcompat.group_trans_type; ++ subj->user_transitions = compat_ptr(subjcompat.user_transitions); ++ subj->group_transitions = compat_ptr(subjcompat.group_transitions); ++ subj->user_trans_num = subjcompat.user_trans_num; ++ subj->group_trans_num = subjcompat.group_trans_num; ++ ++ memcpy(&subj->sock_families, &subjcompat.sock_families, sizeof(subj->sock_families)); ++ memcpy(&subj->ip_proto, &subjcompat.ip_proto, sizeof(subj->ip_proto)); ++ subj->ip_type = subjcompat.ip_type; ++ subj->ips = compat_ptr(subjcompat.ips); ++ subj->ip_num = subjcompat.ip_num; ++ subj->inaddr_any_override = subjcompat.inaddr_any_override; ++ ++ subj->crashes = subjcompat.crashes; ++ subj->expires = subjcompat.expires; ++ ++ subj->parent_subject = compat_ptr(subjcompat.parent_subject); ++ subj->hash = compat_ptr(subjcompat.hash); ++ subj->prev = compat_ptr(subjcompat.prev); ++ subj->next = compat_ptr(subjcompat.next); ++ ++ subj->obj_hash = compat_ptr(subjcompat.obj_hash); ++ subj->obj_hash_size = subjcompat.obj_hash_size; ++ subj->pax_flags = subjcompat.pax_flags; ++ ++ return 0; ++} ++ ++int copy_acl_role_label_compat(struct acl_role_label *role, const struct acl_role_label *userp) ++{ ++ struct acl_role_label_compat rolecompat; ++ ++ if (copy_from_user(&rolecompat, userp, sizeof(rolecompat))) ++ return -EFAULT; ++ ++ role->rolename = compat_ptr(rolecompat.rolename); ++ role->uidgid = rolecompat.uidgid; ++ role->roletype = rolecompat.roletype; ++ ++ role->auth_attempts = rolecompat.auth_attempts; ++ role->expires = rolecompat.expires; ++ ++ role->root_label = compat_ptr(rolecompat.root_label); ++ role->hash = compat_ptr(rolecompat.hash); ++ ++ role->prev = compat_ptr(rolecompat.prev); ++ role->next = compat_ptr(rolecompat.next); ++ ++ role->transitions = compat_ptr(rolecompat.transitions); ++ role->allowed_ips = compat_ptr(rolecompat.allowed_ips); ++ role->domain_children = compat_ptr(rolecompat.domain_children); ++ role->domain_child_num = rolecompat.domain_child_num; ++ ++ role->umask = rolecompat.umask; ++ ++ role->subj_hash = compat_ptr(rolecompat.subj_hash); ++ role->subj_hash_size = rolecompat.subj_hash_size; ++ ++ return 0; ++} ++ ++int copy_role_allowed_ip_compat(struct role_allowed_ip *roleip, const struct role_allowed_ip *userp) ++{ ++ struct role_allowed_ip_compat roleip_compat; ++ ++ if (copy_from_user(&roleip_compat, userp, sizeof(roleip_compat))) ++ return -EFAULT; ++ ++ roleip->addr = roleip_compat.addr; ++ roleip->netmask = roleip_compat.netmask; ++ ++ roleip->prev = compat_ptr(roleip_compat.prev); ++ roleip->next = compat_ptr(roleip_compat.next); ++ ++ return 0; ++} ++ ++int copy_role_transition_compat(struct role_transition *trans, const struct role_transition *userp) ++{ ++ struct role_transition_compat trans_compat; ++ ++ if (copy_from_user(&trans_compat, userp, sizeof(trans_compat))) ++ return -EFAULT; ++ ++ trans->rolename = compat_ptr(trans_compat.rolename); ++ ++ trans->prev = compat_ptr(trans_compat.prev); ++ trans->next = compat_ptr(trans_compat.next); ++ ++ return 0; ++ ++} ++ ++int copy_gr_hash_struct_compat(struct gr_hash_struct *hash, const struct gr_hash_struct *userp) ++{ ++ struct gr_hash_struct_compat hash_compat; ++ ++ if (copy_from_user(&hash_compat, userp, sizeof(hash_compat))) ++ return -EFAULT; ++ ++ hash->table = compat_ptr(hash_compat.table); ++ hash->nametable = compat_ptr(hash_compat.nametable); ++ hash->first = compat_ptr(hash_compat.first); ++ ++ hash->table_size = hash_compat.table_size; ++ hash->used_size = hash_compat.used_size; ++ ++ hash->type = hash_compat.type; ++ ++ return 0; ++} ++ ++int copy_pointer_from_array_compat(void *ptr, unsigned long idx, const void *userp) ++{ ++ compat_uptr_t ptrcompat; ++ ++ if (copy_from_user(&ptrcompat, userp + (idx * sizeof(ptrcompat)), sizeof(ptrcompat))) ++ return -EFAULT; ++ ++ *(void **)ptr = compat_ptr(ptrcompat); ++ ++ return 0; ++} ++ ++int copy_acl_ip_label_compat(struct acl_ip_label *ip, const struct acl_ip_label *userp) ++{ ++ struct acl_ip_label_compat ip_compat; ++ ++ if (copy_from_user(&ip_compat, userp, sizeof(ip_compat))) ++ return -EFAULT; ++ ++ ip->iface = compat_ptr(ip_compat.iface); ++ ip->addr = ip_compat.addr; ++ ip->netmask = ip_compat.netmask; ++ ip->low = ip_compat.low; ++ ip->high = ip_compat.high; ++ ip->mode = ip_compat.mode; ++ ip->type = ip_compat.type; ++ ++ memcpy(&ip->proto, &ip_compat.proto, sizeof(ip->proto)); ++ ++ ip->prev = compat_ptr(ip_compat.prev); ++ ip->next = compat_ptr(ip_compat.next); ++ ++ return 0; ++} ++ ++int copy_sprole_pw_compat(struct sprole_pw *pw, unsigned long idx, const struct sprole_pw *userp) ++{ ++ struct sprole_pw_compat pw_compat; ++ ++ if (copy_from_user(&pw_compat, (const void *)userp + (sizeof(pw_compat) * idx), sizeof(pw_compat))) ++ return -EFAULT; ++ ++ pw->rolename = compat_ptr(pw_compat.rolename); ++ memcpy(&pw->salt, pw_compat.salt, sizeof(pw->salt)); ++ memcpy(&pw->sum, pw_compat.sum, sizeof(pw->sum)); ++ ++ return 0; ++} ++ ++size_t get_gr_arg_wrapper_size_compat(void) ++{ ++ return sizeof(struct gr_arg_wrapper_compat); ++} ++ +diff --git a/grsecurity/gracl_fs.c b/grsecurity/gracl_fs.c +new file mode 100644 +index 0000000..8ee8e4f +--- /dev/null ++++ b/grsecurity/gracl_fs.c +@@ -0,0 +1,447 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/types.h> ++#include <linux/fs.h> ++#include <linux/file.h> ++#include <linux/stat.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++#include <linux/gracl.h> ++ ++umode_t ++gr_acl_umask(void) ++{ ++ if (unlikely(!gr_acl_is_enabled())) ++ return 0; ++ ++ return current->role->umask; ++} ++ ++__u32 ++gr_acl_handle_hidden_file(const struct dentry * dentry, ++ const struct vfsmount * mnt) ++{ ++ __u32 mode; ++ ++ if (unlikely(d_is_negative(dentry))) ++ return GR_FIND; ++ ++ mode = ++ gr_search_file(dentry, GR_FIND | GR_AUDIT_FIND | GR_SUPPRESS, mnt); ++ ++ if (unlikely(mode & GR_FIND && mode & GR_AUDIT_FIND)) { ++ gr_log_fs_rbac_generic(GR_DO_AUDIT, GR_HIDDEN_ACL_MSG, dentry, mnt); ++ return mode; ++ } else if (unlikely(!(mode & GR_FIND) && !(mode & GR_SUPPRESS))) { ++ gr_log_fs_rbac_generic(GR_DONT_AUDIT, GR_HIDDEN_ACL_MSG, dentry, mnt); ++ return 0; ++ } else if (unlikely(!(mode & GR_FIND))) ++ return 0; ++ ++ return GR_FIND; ++} ++ ++__u32 ++gr_acl_handle_open(const struct dentry * dentry, const struct vfsmount * mnt, ++ int acc_mode) ++{ ++ __u32 reqmode = GR_FIND; ++ __u32 mode; ++ ++ if (unlikely(d_is_negative(dentry))) ++ return reqmode; ++ ++ if (acc_mode & MAY_APPEND) ++ reqmode |= GR_APPEND; ++ else if (acc_mode & MAY_WRITE) ++ reqmode |= GR_WRITE; ++ if ((acc_mode & MAY_READ) && !S_ISDIR(dentry->d_inode->i_mode)) ++ reqmode |= GR_READ; ++ ++ mode = ++ gr_search_file(dentry, reqmode | to_gr_audit(reqmode) | GR_SUPPRESS, ++ mnt); ++ ++ if (unlikely(((mode & reqmode) == reqmode) && mode & GR_AUDITS)) { ++ gr_log_fs_rbac_mode2(GR_DO_AUDIT, GR_OPEN_ACL_MSG, dentry, mnt, ++ reqmode & GR_READ ? " reading" : "", ++ reqmode & GR_WRITE ? " writing" : reqmode & ++ GR_APPEND ? " appending" : ""); ++ return reqmode; ++ } else ++ if (unlikely((mode & reqmode) != reqmode && !(mode & GR_SUPPRESS))) ++ { ++ gr_log_fs_rbac_mode2(GR_DONT_AUDIT, GR_OPEN_ACL_MSG, dentry, mnt, ++ reqmode & GR_READ ? " reading" : "", ++ reqmode & GR_WRITE ? " writing" : reqmode & ++ GR_APPEND ? " appending" : ""); ++ return 0; ++ } else if (unlikely((mode & reqmode) != reqmode)) ++ return 0; ++ ++ return reqmode; ++} ++ ++__u32 ++gr_acl_handle_creat(const struct dentry * dentry, ++ const struct dentry * p_dentry, ++ const struct vfsmount * p_mnt, int open_flags, int acc_mode, ++ const int imode) ++{ ++ __u32 reqmode = GR_WRITE | GR_CREATE; ++ __u32 mode; ++ ++ if (acc_mode & MAY_APPEND) ++ reqmode |= GR_APPEND; ++ // if a directory was required or the directory already exists, then ++ // don't count this open as a read ++ if ((acc_mode & MAY_READ) && ++ !((open_flags & O_DIRECTORY) || (dentry->d_inode && S_ISDIR(dentry->d_inode->i_mode)))) ++ reqmode |= GR_READ; ++ if ((open_flags & O_CREAT) && ++ ((imode & S_ISUID) || ((imode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)))) ++ reqmode |= GR_SETID; ++ ++ mode = ++ gr_check_create(dentry, p_dentry, p_mnt, ++ reqmode | to_gr_audit(reqmode) | GR_SUPPRESS); ++ ++ if (unlikely(((mode & reqmode) == reqmode) && mode & GR_AUDITS)) { ++ gr_log_fs_rbac_mode2(GR_DO_AUDIT, GR_CREATE_ACL_MSG, dentry, p_mnt, ++ reqmode & GR_READ ? " reading" : "", ++ reqmode & GR_WRITE ? " writing" : reqmode & ++ GR_APPEND ? " appending" : ""); ++ return reqmode; ++ } else ++ if (unlikely((mode & reqmode) != reqmode && !(mode & GR_SUPPRESS))) ++ { ++ gr_log_fs_rbac_mode2(GR_DONT_AUDIT, GR_CREATE_ACL_MSG, dentry, p_mnt, ++ reqmode & GR_READ ? " reading" : "", ++ reqmode & GR_WRITE ? " writing" : reqmode & ++ GR_APPEND ? " appending" : ""); ++ return 0; ++ } else if (unlikely((mode & reqmode) != reqmode)) ++ return 0; ++ ++ return reqmode; ++} ++ ++__u32 ++gr_acl_handle_access(const struct dentry * dentry, const struct vfsmount * mnt, ++ const int fmode) ++{ ++ __u32 mode, reqmode = GR_FIND; ++ ++ if ((fmode & S_IXOTH) && !S_ISDIR(dentry->d_inode->i_mode)) ++ reqmode |= GR_EXEC; ++ if (fmode & S_IWOTH) ++ reqmode |= GR_WRITE; ++ if (fmode & S_IROTH) ++ reqmode |= GR_READ; ++ ++ mode = ++ gr_search_file(dentry, reqmode | to_gr_audit(reqmode) | GR_SUPPRESS, ++ mnt); ++ ++ if (unlikely(((mode & reqmode) == reqmode) && mode & GR_AUDITS)) { ++ gr_log_fs_rbac_mode3(GR_DO_AUDIT, GR_ACCESS_ACL_MSG, dentry, mnt, ++ reqmode & GR_READ ? " reading" : "", ++ reqmode & GR_WRITE ? " writing" : "", ++ reqmode & GR_EXEC ? " executing" : ""); ++ return reqmode; ++ } else ++ if (unlikely((mode & reqmode) != reqmode && !(mode & GR_SUPPRESS))) ++ { ++ gr_log_fs_rbac_mode3(GR_DONT_AUDIT, GR_ACCESS_ACL_MSG, dentry, mnt, ++ reqmode & GR_READ ? " reading" : "", ++ reqmode & GR_WRITE ? " writing" : "", ++ reqmode & GR_EXEC ? " executing" : ""); ++ return 0; ++ } else if (unlikely((mode & reqmode) != reqmode)) ++ return 0; ++ ++ return reqmode; ++} ++ ++static __u32 generic_fs_handler(const struct dentry *dentry, const struct vfsmount *mnt, __u32 reqmode, const char *fmt) ++{ ++ __u32 mode; ++ ++ mode = gr_search_file(dentry, reqmode | to_gr_audit(reqmode) | GR_SUPPRESS, mnt); ++ ++ if (unlikely(((mode & (reqmode)) == (reqmode)) && mode & GR_AUDITS)) { ++ gr_log_fs_rbac_generic(GR_DO_AUDIT, fmt, dentry, mnt); ++ return mode; ++ } else if (unlikely((mode & (reqmode)) != (reqmode) && !(mode & GR_SUPPRESS))) { ++ gr_log_fs_rbac_generic(GR_DONT_AUDIT, fmt, dentry, mnt); ++ return 0; ++ } else if (unlikely((mode & (reqmode)) != (reqmode))) ++ return 0; ++ ++ return (reqmode); ++} ++ ++__u32 ++gr_acl_handle_rmdir(const struct dentry * dentry, const struct vfsmount * mnt) ++{ ++ return generic_fs_handler(dentry, mnt, GR_WRITE | GR_DELETE , GR_RMDIR_ACL_MSG); ++} ++ ++__u32 ++gr_acl_handle_unlink(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return generic_fs_handler(dentry, mnt, GR_WRITE | GR_DELETE , GR_UNLINK_ACL_MSG); ++} ++ ++__u32 ++gr_acl_handle_truncate(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return generic_fs_handler(dentry, mnt, GR_WRITE, GR_TRUNCATE_ACL_MSG); ++} ++ ++__u32 ++gr_acl_handle_utime(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return generic_fs_handler(dentry, mnt, GR_WRITE, GR_ATIME_ACL_MSG); ++} ++ ++__u32 ++gr_acl_handle_chmod(const struct dentry *dentry, const struct vfsmount *mnt, ++ umode_t *modeptr) ++{ ++ umode_t mode; ++ ++ *modeptr &= ~gr_acl_umask(); ++ mode = *modeptr; ++ ++ if (unlikely(dentry->d_inode && S_ISSOCK(dentry->d_inode->i_mode))) ++ return 1; ++ ++ if (unlikely(dentry->d_inode && !S_ISDIR(dentry->d_inode->i_mode) && ++ ((mode & S_ISUID) || ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP))))) { ++ return generic_fs_handler(dentry, mnt, GR_WRITE | GR_SETID, ++ GR_CHMOD_ACL_MSG); ++ } else { ++ return generic_fs_handler(dentry, mnt, GR_WRITE, GR_CHMOD_ACL_MSG); ++ } ++} ++ ++__u32 ++gr_acl_handle_chown(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return generic_fs_handler(dentry, mnt, GR_WRITE, GR_CHOWN_ACL_MSG); ++} ++ ++__u32 ++gr_acl_handle_setxattr(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return generic_fs_handler(dentry, mnt, GR_WRITE, GR_SETXATTR_ACL_MSG); ++} ++ ++__u32 ++gr_acl_handle_removexattr(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return generic_fs_handler(dentry, mnt, GR_WRITE, GR_REMOVEXATTR_ACL_MSG); ++} ++ ++__u32 ++gr_acl_handle_execve(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return generic_fs_handler(dentry, mnt, GR_EXEC, GR_EXEC_ACL_MSG); ++} ++ ++__u32 ++gr_acl_handle_unix(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return generic_fs_handler(dentry, mnt, GR_READ | GR_WRITE, ++ GR_UNIXCONNECT_ACL_MSG); ++} ++ ++/* hardlinks require at minimum create and link permission, ++ any additional privilege required is based on the ++ privilege of the file being linked to ++*/ ++__u32 ++gr_acl_handle_link(const struct dentry * new_dentry, ++ const struct dentry * parent_dentry, ++ const struct vfsmount * parent_mnt, ++ const struct dentry * old_dentry, ++ const struct vfsmount * old_mnt, const struct filename *to) ++{ ++ __u32 mode; ++ __u32 needmode = GR_CREATE | GR_LINK; ++ __u32 needaudit = GR_AUDIT_CREATE | GR_AUDIT_LINK; ++ ++ mode = ++ gr_check_link(new_dentry, parent_dentry, parent_mnt, old_dentry, ++ old_mnt); ++ ++ if (unlikely(((mode & needmode) == needmode) && (mode & needaudit))) { ++ gr_log_fs_rbac_str(GR_DO_AUDIT, GR_LINK_ACL_MSG, old_dentry, old_mnt, to->name); ++ return mode; ++ } else if (unlikely(((mode & needmode) != needmode) && !(mode & GR_SUPPRESS))) { ++ gr_log_fs_rbac_str(GR_DONT_AUDIT, GR_LINK_ACL_MSG, old_dentry, old_mnt, to->name); ++ return 0; ++ } else if (unlikely((mode & needmode) != needmode)) ++ return 0; ++ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_symlink(const struct dentry * new_dentry, ++ const struct dentry * parent_dentry, ++ const struct vfsmount * parent_mnt, const struct filename *from) ++{ ++ __u32 needmode = GR_WRITE | GR_CREATE; ++ __u32 mode; ++ ++ mode = ++ gr_check_create(new_dentry, parent_dentry, parent_mnt, ++ GR_CREATE | GR_AUDIT_CREATE | ++ GR_WRITE | GR_AUDIT_WRITE | GR_SUPPRESS); ++ ++ if (unlikely(mode & GR_WRITE && mode & GR_AUDITS)) { ++ gr_log_fs_str_rbac(GR_DO_AUDIT, GR_SYMLINK_ACL_MSG, from->name, new_dentry, parent_mnt); ++ return mode; ++ } else if (unlikely(((mode & needmode) != needmode) && !(mode & GR_SUPPRESS))) { ++ gr_log_fs_str_rbac(GR_DONT_AUDIT, GR_SYMLINK_ACL_MSG, from->name, new_dentry, parent_mnt); ++ return 0; ++ } else if (unlikely((mode & needmode) != needmode)) ++ return 0; ++ ++ return (GR_WRITE | GR_CREATE); ++} ++ ++static __u32 generic_fs_create_handler(const struct dentry *new_dentry, const struct dentry *parent_dentry, const struct vfsmount *parent_mnt, __u32 reqmode, const char *fmt) ++{ ++ __u32 mode; ++ ++ mode = gr_check_create(new_dentry, parent_dentry, parent_mnt, reqmode | to_gr_audit(reqmode) | GR_SUPPRESS); ++ ++ if (unlikely(((mode & (reqmode)) == (reqmode)) && mode & GR_AUDITS)) { ++ gr_log_fs_rbac_generic(GR_DO_AUDIT, fmt, new_dentry, parent_mnt); ++ return mode; ++ } else if (unlikely((mode & (reqmode)) != (reqmode) && !(mode & GR_SUPPRESS))) { ++ gr_log_fs_rbac_generic(GR_DONT_AUDIT, fmt, new_dentry, parent_mnt); ++ return 0; ++ } else if (unlikely((mode & (reqmode)) != (reqmode))) ++ return 0; ++ ++ return (reqmode); ++} ++ ++__u32 ++gr_acl_handle_mknod(const struct dentry * new_dentry, ++ const struct dentry * parent_dentry, ++ const struct vfsmount * parent_mnt, ++ const int mode) ++{ ++ __u32 reqmode = GR_WRITE | GR_CREATE; ++ if (unlikely((mode & S_ISUID) || ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)))) ++ reqmode |= GR_SETID; ++ ++ return generic_fs_create_handler(new_dentry, parent_dentry, parent_mnt, ++ reqmode, GR_MKNOD_ACL_MSG); ++} ++ ++__u32 ++gr_acl_handle_mkdir(const struct dentry *new_dentry, ++ const struct dentry *parent_dentry, ++ const struct vfsmount *parent_mnt) ++{ ++ return generic_fs_create_handler(new_dentry, parent_dentry, parent_mnt, ++ GR_WRITE | GR_CREATE, GR_MKDIR_ACL_MSG); ++} ++ ++#define RENAME_CHECK_SUCCESS(old, new) \ ++ (((old & (GR_WRITE | GR_READ)) == (GR_WRITE | GR_READ)) && \ ++ ((new & (GR_WRITE | GR_READ)) == (GR_WRITE | GR_READ))) ++ ++int ++gr_acl_handle_rename(struct dentry *new_dentry, ++ struct dentry *parent_dentry, ++ const struct vfsmount *parent_mnt, ++ struct dentry *old_dentry, ++ struct inode *old_parent_inode, ++ struct vfsmount *old_mnt, const struct filename *newname, unsigned int flags) ++{ ++ __u32 comp1, comp2; ++ int error = 0; ++ ++ if (unlikely(!gr_acl_is_enabled())) ++ return 0; ++ ++ if (flags & RENAME_EXCHANGE) { ++ comp1 = gr_search_file(new_dentry, GR_READ | GR_WRITE | ++ GR_AUDIT_READ | GR_AUDIT_WRITE | ++ GR_SUPPRESS, parent_mnt); ++ comp2 = ++ gr_search_file(old_dentry, ++ GR_READ | GR_WRITE | GR_AUDIT_READ | ++ GR_AUDIT_WRITE | GR_SUPPRESS, old_mnt); ++ } else if (d_is_negative(new_dentry)) { ++ comp1 = gr_check_create(new_dentry, parent_dentry, parent_mnt, ++ GR_READ | GR_WRITE | GR_CREATE | GR_AUDIT_READ | ++ GR_AUDIT_WRITE | GR_AUDIT_CREATE | GR_SUPPRESS); ++ comp2 = gr_search_file(old_dentry, GR_READ | GR_WRITE | ++ GR_DELETE | GR_AUDIT_DELETE | ++ GR_AUDIT_READ | GR_AUDIT_WRITE | ++ GR_SUPPRESS, old_mnt); ++ } else { ++ comp1 = gr_search_file(new_dentry, GR_READ | GR_WRITE | ++ GR_CREATE | GR_DELETE | ++ GR_AUDIT_CREATE | GR_AUDIT_DELETE | ++ GR_AUDIT_READ | GR_AUDIT_WRITE | ++ GR_SUPPRESS, parent_mnt); ++ comp2 = ++ gr_search_file(old_dentry, ++ GR_READ | GR_WRITE | GR_AUDIT_READ | ++ GR_DELETE | GR_AUDIT_DELETE | ++ GR_AUDIT_WRITE | GR_SUPPRESS, old_mnt); ++ } ++ ++ if (RENAME_CHECK_SUCCESS(comp1, comp2) && ++ ((comp1 & GR_AUDITS) || (comp2 & GR_AUDITS))) ++ gr_log_fs_rbac_str(GR_DO_AUDIT, GR_RENAME_ACL_MSG, old_dentry, old_mnt, newname->name); ++ else if (!RENAME_CHECK_SUCCESS(comp1, comp2) && !(comp1 & GR_SUPPRESS) ++ && !(comp2 & GR_SUPPRESS)) { ++ gr_log_fs_rbac_str(GR_DONT_AUDIT, GR_RENAME_ACL_MSG, old_dentry, old_mnt, newname->name); ++ error = -EACCES; ++ } else if (unlikely(!RENAME_CHECK_SUCCESS(comp1, comp2))) ++ error = -EACCES; ++ ++ return error; ++} ++ ++void ++gr_acl_handle_exit(void) ++{ ++ u16 id; ++ char *rolename; ++ ++ if (unlikely(current->acl_sp_role && gr_acl_is_enabled() && ++ !(current->role->roletype & GR_ROLE_PERSIST))) { ++ id = current->acl_role_id; ++ rolename = current->role->rolename; ++ gr_set_acls(1); ++ gr_log_str_int(GR_DONT_AUDIT_GOOD, GR_SPROLEL_ACL_MSG, rolename, id); ++ } ++ ++ gr_put_exec_file(current); ++ return; ++} ++ ++int ++gr_acl_handle_procpidmem(const struct task_struct *task) ++{ ++ if (unlikely(!gr_acl_is_enabled())) ++ return 0; ++ ++ if (task != current && (task->acl->mode & GR_PROTPROCFD) && ++ !(current->acl->mode & GR_POVERRIDE) && ++ !(current->role->roletype & GR_ROLE_GOD)) ++ return -EACCES; ++ ++ return 0; ++} +diff --git a/grsecurity/gracl_ip.c b/grsecurity/gracl_ip.c +new file mode 100644 +index 0000000..f056b81 +--- /dev/null ++++ b/grsecurity/gracl_ip.c +@@ -0,0 +1,386 @@ ++#include <linux/kernel.h> ++#include <asm/uaccess.h> ++#include <asm/errno.h> ++#include <net/sock.h> ++#include <linux/file.h> ++#include <linux/fs.h> ++#include <linux/net.h> ++#include <linux/in.h> ++#include <linux/skbuff.h> ++#include <linux/ip.h> ++#include <linux/udp.h> ++#include <linux/types.h> ++#include <linux/sched.h> ++#include <linux/netdevice.h> ++#include <linux/inetdevice.h> ++#include <linux/gracl.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++ ++#define GR_BIND 0x01 ++#define GR_CONNECT 0x02 ++#define GR_INVERT 0x04 ++#define GR_BINDOVERRIDE 0x08 ++#define GR_CONNECTOVERRIDE 0x10 ++#define GR_SOCK_FAMILY 0x20 ++ ++static const char * gr_protocols[IPPROTO_MAX] = { ++ "ip", "icmp", "igmp", "ggp", "ipencap", "st", "tcp", "cbt", ++ "egp", "igp", "bbn-rcc", "nvp", "pup", "argus", "emcon", "xnet", ++ "chaos", "udp", "mux", "dcn", "hmp", "prm", "xns-idp", "trunk-1", ++ "trunk-2", "leaf-1", "leaf-2", "rdp", "irtp", "iso-tp4", "netblt", "mfe-nsp", ++ "merit-inp", "sep", "3pc", "idpr", "xtp", "ddp", "idpr-cmtp", "tp++", ++ "il", "ipv6", "sdrp", "ipv6-route", "ipv6-frag", "idrp", "rsvp", "gre", ++ "mhrp", "bna", "ipv6-crypt", "ipv6-auth", "i-nlsp", "swipe", "narp", "mobile", ++ "tlsp", "skip", "ipv6-icmp", "ipv6-nonxt", "ipv6-opts", "unknown:61", "cftp", "unknown:63", ++ "sat-expak", "kryptolan", "rvd", "ippc", "unknown:68", "sat-mon", "visa", "ipcv", ++ "cpnx", "cphb", "wsn", "pvp", "br-sat-mon", "sun-nd", "wb-mon", "wb-expak", ++ "iso-ip", "vmtp", "secure-vmtp", "vines", "ttp", "nfsnet-igp", "dgp", "tcf", ++ "eigrp", "ospf", "sprite-rpc", "larp", "mtp", "ax.25", "ipip", "micp", ++ "scc-sp", "etherip", "encap", "unknown:99", "gmtp", "ifmp", "pnni", "pim", ++ "aris", "scps", "qnx", "a/n", "ipcomp", "snp", "compaq-peer", "ipx-in-ip", ++ "vrrp", "pgm", "unknown:114", "l2tp", "ddx", "iatp", "stp", "srp", ++ "uti", "smp", "sm", "ptp", "isis", "fire", "crtp", "crdup", ++ "sscopmce", "iplt", "sps", "pipe", "sctp", "fc", "unkown:134", "unknown:135", ++ "unknown:136", "unknown:137", "unknown:138", "unknown:139", "unknown:140", "unknown:141", "unknown:142", "unknown:143", ++ "unknown:144", "unknown:145", "unknown:146", "unknown:147", "unknown:148", "unknown:149", "unknown:150", "unknown:151", ++ "unknown:152", "unknown:153", "unknown:154", "unknown:155", "unknown:156", "unknown:157", "unknown:158", "unknown:159", ++ "unknown:160", "unknown:161", "unknown:162", "unknown:163", "unknown:164", "unknown:165", "unknown:166", "unknown:167", ++ "unknown:168", "unknown:169", "unknown:170", "unknown:171", "unknown:172", "unknown:173", "unknown:174", "unknown:175", ++ "unknown:176", "unknown:177", "unknown:178", "unknown:179", "unknown:180", "unknown:181", "unknown:182", "unknown:183", ++ "unknown:184", "unknown:185", "unknown:186", "unknown:187", "unknown:188", "unknown:189", "unknown:190", "unknown:191", ++ "unknown:192", "unknown:193", "unknown:194", "unknown:195", "unknown:196", "unknown:197", "unknown:198", "unknown:199", ++ "unknown:200", "unknown:201", "unknown:202", "unknown:203", "unknown:204", "unknown:205", "unknown:206", "unknown:207", ++ "unknown:208", "unknown:209", "unknown:210", "unknown:211", "unknown:212", "unknown:213", "unknown:214", "unknown:215", ++ "unknown:216", "unknown:217", "unknown:218", "unknown:219", "unknown:220", "unknown:221", "unknown:222", "unknown:223", ++ "unknown:224", "unknown:225", "unknown:226", "unknown:227", "unknown:228", "unknown:229", "unknown:230", "unknown:231", ++ "unknown:232", "unknown:233", "unknown:234", "unknown:235", "unknown:236", "unknown:237", "unknown:238", "unknown:239", ++ "unknown:240", "unknown:241", "unknown:242", "unknown:243", "unknown:244", "unknown:245", "unknown:246", "unknown:247", ++ "unknown:248", "unknown:249", "unknown:250", "unknown:251", "unknown:252", "unknown:253", "unknown:254", "unknown:255", ++ }; ++ ++static const char * gr_socktypes[SOCK_MAX] = { ++ "unknown:0", "stream", "dgram", "raw", "rdm", "seqpacket", "unknown:6", ++ "unknown:7", "unknown:8", "unknown:9", "packet" ++ }; ++ ++static const char * gr_sockfamilies[AF_MAX+1] = { ++ "unspec", "unix", "inet", "ax25", "ipx", "appletalk", "netrom", "bridge", "atmpvc", "x25", ++ "inet6", "rose", "decnet", "netbeui", "security", "key", "netlink", "packet", "ash", ++ "econet", "atmsvc", "rds", "sna", "irda", "ppox", "wanpipe", "llc", "fam_27", "fam_28", ++ "tipc", "bluetooth", "iucv", "rxrpc", "isdn", "phonet", "ieee802154", "ciaf" ++ }; ++ ++const char * ++gr_proto_to_name(unsigned char proto) ++{ ++ return gr_protocols[proto]; ++} ++ ++const char * ++gr_socktype_to_name(unsigned char type) ++{ ++ return gr_socktypes[type]; ++} ++ ++const char * ++gr_sockfamily_to_name(unsigned char family) ++{ ++ return gr_sockfamilies[family]; ++} ++ ++extern const struct net_proto_family __rcu *net_families[NPROTO] __read_mostly; ++ ++int ++gr_search_socket(const int domain, const int type, const int protocol) ++{ ++ struct acl_subject_label *curr; ++ const struct cred *cred = current_cred(); ++ ++ if (unlikely(!gr_acl_is_enabled())) ++ goto exit; ++ ++ if ((domain < 0) || (type < 0) || (protocol < 0) || ++ (domain >= AF_MAX) || (type >= SOCK_MAX) || (protocol >= IPPROTO_MAX)) ++ goto exit; // let the kernel handle it ++ ++ curr = current->acl; ++ ++ if (curr->sock_families[domain / 32] & (1U << (domain % 32))) { ++ /* the family is allowed, if this is PF_INET allow it only if ++ the extra sock type/protocol checks pass */ ++ if (domain == PF_INET) ++ goto inet_check; ++ goto exit; ++ } else { ++ if (curr->mode & (GR_LEARN | GR_INHERITLEARN)) { ++ __u32 fakeip = 0; ++ security_learn(GR_IP_LEARN_MSG, current->role->rolename, ++ current->role->roletype, GR_GLOBAL_UID(cred->uid), ++ GR_GLOBAL_GID(cred->gid), current->exec_file ? ++ gr_to_filename(current->exec_file->f_path.dentry, ++ current->exec_file->f_path.mnt) : ++ curr->filename, curr->filename, ++ &fakeip, domain, 0, 0, GR_SOCK_FAMILY, ++ ¤t->signal->saved_ip); ++ goto exit; ++ } ++ goto exit_fail; ++ } ++ ++inet_check: ++ /* the rest of this checking is for IPv4 only */ ++ if (!curr->ips) ++ goto exit; ++ ++ if ((curr->ip_type & (1U << type)) && ++ (curr->ip_proto[protocol / 32] & (1U << (protocol % 32)))) ++ goto exit; ++ ++ if (curr->mode & (GR_LEARN | GR_INHERITLEARN)) { ++ /* we don't place acls on raw sockets , and sometimes ++ dgram/ip sockets are opened for ioctl and not ++ bind/connect, so we'll fake a bind learn log */ ++ if (type == SOCK_RAW || type == SOCK_PACKET) { ++ __u32 fakeip = 0; ++ security_learn(GR_IP_LEARN_MSG, current->role->rolename, ++ current->role->roletype, GR_GLOBAL_UID(cred->uid), ++ GR_GLOBAL_GID(cred->gid), current->exec_file ? ++ gr_to_filename(current->exec_file->f_path.dentry, ++ current->exec_file->f_path.mnt) : ++ curr->filename, curr->filename, ++ &fakeip, 0, type, ++ protocol, GR_CONNECT, ¤t->signal->saved_ip); ++ } else if ((type == SOCK_DGRAM) && (protocol == IPPROTO_IP)) { ++ __u32 fakeip = 0; ++ security_learn(GR_IP_LEARN_MSG, current->role->rolename, ++ current->role->roletype, GR_GLOBAL_UID(cred->uid), ++ GR_GLOBAL_GID(cred->gid), current->exec_file ? ++ gr_to_filename(current->exec_file->f_path.dentry, ++ current->exec_file->f_path.mnt) : ++ curr->filename, curr->filename, ++ &fakeip, 0, type, ++ protocol, GR_BIND, ¤t->signal->saved_ip); ++ } ++ /* we'll log when they use connect or bind */ ++ goto exit; ++ } ++ ++exit_fail: ++ if (domain == PF_INET) ++ gr_log_str3(GR_DONT_AUDIT, GR_SOCK_MSG, gr_sockfamily_to_name(domain), ++ gr_socktype_to_name(type), gr_proto_to_name(protocol)); ++ else if (rcu_access_pointer(net_families[domain]) != NULL) ++ gr_log_str2_int(GR_DONT_AUDIT, GR_SOCK_NOINET_MSG, gr_sockfamily_to_name(domain), ++ gr_socktype_to_name(type), protocol); ++ ++ return 0; ++exit: ++ return 1; ++} ++ ++int check_ip_policy(struct acl_ip_label *ip, __u32 ip_addr, __u16 ip_port, __u8 protocol, const int mode, const int type, __u32 our_addr, __u32 our_netmask) ++{ ++ if ((ip->mode & mode) && ++ (ip_port >= ip->low) && ++ (ip_port <= ip->high) && ++ ((ntohl(ip_addr) & our_netmask) == ++ (ntohl(our_addr) & our_netmask)) ++ && (ip->proto[protocol / 32] & (1U << (protocol % 32))) ++ && (ip->type & (1U << type))) { ++ if (ip->mode & GR_INVERT) ++ return 2; // specifically denied ++ else ++ return 1; // allowed ++ } ++ ++ return 0; // not specifically allowed, may continue parsing ++} ++ ++static int ++gr_search_connectbind(const int full_mode, struct sock *sk, ++ struct sockaddr_in *addr, const int type) ++{ ++ char iface[IFNAMSIZ] = {0}; ++ struct acl_subject_label *curr; ++ struct acl_ip_label *ip; ++ struct inet_sock *isk; ++ struct net_device *dev; ++ struct in_device *idev; ++ unsigned long i; ++ int ret; ++ int mode = full_mode & (GR_BIND | GR_CONNECT); ++ __u32 ip_addr = 0; ++ __u32 our_addr; ++ __u32 our_netmask; ++ char *p; ++ __u16 ip_port = 0; ++ const struct cred *cred = current_cred(); ++ ++ if (unlikely(!gr_acl_is_enabled() || sk->sk_family != PF_INET)) ++ return 0; ++ ++ curr = current->acl; ++ isk = inet_sk(sk); ++ ++ /* INADDR_ANY overriding for binds, inaddr_any_override is already in network order */ ++ if ((full_mode & GR_BINDOVERRIDE) && addr->sin_addr.s_addr == htonl(INADDR_ANY) && curr->inaddr_any_override != 0) ++ addr->sin_addr.s_addr = curr->inaddr_any_override; ++ if ((full_mode & GR_CONNECT) && isk->inet_saddr == htonl(INADDR_ANY) && curr->inaddr_any_override != 0) { ++ struct sockaddr_in saddr; ++ int err; ++ ++ saddr.sin_family = AF_INET; ++ saddr.sin_addr.s_addr = curr->inaddr_any_override; ++ saddr.sin_port = isk->inet_sport; ++ ++ err = security_socket_bind(sk->sk_socket, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); ++ if (err) ++ return err; ++ ++ err = sk->sk_socket->ops->bind(sk->sk_socket, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); ++ if (err) ++ return err; ++ } ++ ++ if (!curr->ips) ++ return 0; ++ ++ ip_addr = addr->sin_addr.s_addr; ++ ip_port = ntohs(addr->sin_port); ++ ++ if (curr->mode & (GR_LEARN | GR_INHERITLEARN)) { ++ security_learn(GR_IP_LEARN_MSG, current->role->rolename, ++ current->role->roletype, GR_GLOBAL_UID(cred->uid), ++ GR_GLOBAL_GID(cred->gid), current->exec_file ? ++ gr_to_filename(current->exec_file->f_path.dentry, ++ current->exec_file->f_path.mnt) : ++ curr->filename, curr->filename, ++ &ip_addr, ip_port, type, ++ sk->sk_protocol, mode, ¤t->signal->saved_ip); ++ return 0; ++ } ++ ++ for (i = 0; i < curr->ip_num; i++) { ++ ip = *(curr->ips + i); ++ if (ip->iface != NULL) { ++ strncpy(iface, ip->iface, IFNAMSIZ - 1); ++ p = strchr(iface, ':'); ++ if (p != NULL) ++ *p = '\0'; ++ dev = dev_get_by_name(sock_net(sk), iface); ++ if (dev == NULL) ++ continue; ++ idev = in_dev_get(dev); ++ if (idev == NULL) { ++ dev_put(dev); ++ continue; ++ } ++ rcu_read_lock(); ++ for_ifa(idev) { ++ if (!strcmp(ip->iface, ifa->ifa_label)) { ++ our_addr = ifa->ifa_address; ++ our_netmask = 0xffffffff; ++ ret = check_ip_policy(ip, ip_addr, ip_port, sk->sk_protocol, mode, type, our_addr, our_netmask); ++ if (ret == 1) { ++ rcu_read_unlock(); ++ in_dev_put(idev); ++ dev_put(dev); ++ return 0; ++ } else if (ret == 2) { ++ rcu_read_unlock(); ++ in_dev_put(idev); ++ dev_put(dev); ++ goto denied; ++ } ++ } ++ } endfor_ifa(idev); ++ rcu_read_unlock(); ++ in_dev_put(idev); ++ dev_put(dev); ++ } else { ++ our_addr = ip->addr; ++ our_netmask = ip->netmask; ++ ret = check_ip_policy(ip, ip_addr, ip_port, sk->sk_protocol, mode, type, our_addr, our_netmask); ++ if (ret == 1) ++ return 0; ++ else if (ret == 2) ++ goto denied; ++ } ++ } ++ ++denied: ++ if (mode == GR_BIND) ++ gr_log_int5_str2(GR_DONT_AUDIT, GR_BIND_ACL_MSG, &ip_addr, ip_port, gr_socktype_to_name(type), gr_proto_to_name(sk->sk_protocol)); ++ else if (mode == GR_CONNECT) ++ gr_log_int5_str2(GR_DONT_AUDIT, GR_CONNECT_ACL_MSG, &ip_addr, ip_port, gr_socktype_to_name(type), gr_proto_to_name(sk->sk_protocol)); ++ ++ return -EACCES; ++} ++ ++int ++gr_search_connect(struct socket *sock, struct sockaddr_in *addr) ++{ ++ /* always allow disconnection of dgram sockets with connect */ ++ if (addr->sin_family == AF_UNSPEC) ++ return 0; ++ return gr_search_connectbind(GR_CONNECT | GR_CONNECTOVERRIDE, sock->sk, addr, sock->type); ++} ++ ++int ++gr_search_bind(struct socket *sock, struct sockaddr_in *addr) ++{ ++ return gr_search_connectbind(GR_BIND | GR_BINDOVERRIDE, sock->sk, addr, sock->type); ++} ++ ++int gr_search_listen(struct socket *sock) ++{ ++ struct sock *sk = sock->sk; ++ struct sockaddr_in addr; ++ ++ addr.sin_addr.s_addr = inet_sk(sk)->inet_saddr; ++ addr.sin_port = inet_sk(sk)->inet_sport; ++ ++ return gr_search_connectbind(GR_BIND | GR_CONNECTOVERRIDE, sock->sk, &addr, sock->type); ++} ++ ++int gr_search_accept(struct socket *sock) ++{ ++ struct sock *sk = sock->sk; ++ struct sockaddr_in addr; ++ ++ addr.sin_addr.s_addr = inet_sk(sk)->inet_saddr; ++ addr.sin_port = inet_sk(sk)->inet_sport; ++ ++ return gr_search_connectbind(GR_BIND | GR_CONNECTOVERRIDE, sock->sk, &addr, sock->type); ++} ++ ++int ++gr_search_udp_sendmsg(struct sock *sk, struct sockaddr_in *addr) ++{ ++ if (addr) ++ return gr_search_connectbind(GR_CONNECT, sk, addr, SOCK_DGRAM); ++ else { ++ struct sockaddr_in sin; ++ const struct inet_sock *inet = inet_sk(sk); ++ ++ sin.sin_addr.s_addr = inet->inet_daddr; ++ sin.sin_port = inet->inet_dport; ++ ++ return gr_search_connectbind(GR_CONNECT | GR_CONNECTOVERRIDE, sk, &sin, SOCK_DGRAM); ++ } ++} ++ ++int ++gr_search_udp_recvmsg(struct sock *sk, const struct sk_buff *skb) ++{ ++ struct sockaddr_in sin; ++ ++ if (unlikely(skb->len < sizeof (struct udphdr))) ++ return 0; // skip this packet ++ ++ sin.sin_addr.s_addr = ip_hdr(skb)->saddr; ++ sin.sin_port = udp_hdr(skb)->source; ++ ++ return gr_search_connectbind(GR_CONNECT | GR_CONNECTOVERRIDE, sk, &sin, SOCK_DGRAM); ++} +diff --git a/grsecurity/gracl_learn.c b/grsecurity/gracl_learn.c +new file mode 100644 +index 0000000..25f54ef +--- /dev/null ++++ b/grsecurity/gracl_learn.c +@@ -0,0 +1,207 @@ ++#include <linux/kernel.h> ++#include <linux/mm.h> ++#include <linux/sched.h> ++#include <linux/poll.h> ++#include <linux/string.h> ++#include <linux/file.h> ++#include <linux/types.h> ++#include <linux/vmalloc.h> ++#include <linux/grinternal.h> ++ ++extern ssize_t write_grsec_handler(struct file * file, const char __user * buf, ++ size_t count, loff_t *ppos); ++extern int gr_acl_is_enabled(void); ++ ++static DECLARE_WAIT_QUEUE_HEAD(learn_wait); ++static int gr_learn_attached; ++ ++/* use a 512k buffer */ ++#define LEARN_BUFFER_SIZE (512 * 1024) ++ ++static DEFINE_SPINLOCK(gr_learn_lock); ++static DEFINE_MUTEX(gr_learn_user_mutex); ++ ++/* we need to maintain two buffers, so that the kernel context of grlearn ++ uses a semaphore around the userspace copying, and the other kernel contexts ++ use a spinlock when copying into the buffer, since they cannot sleep ++*/ ++static char *learn_buffer; ++static char *learn_buffer_user; ++static int learn_buffer_len; ++static int learn_buffer_user_len; ++ ++static ssize_t ++read_learn(struct file *file, char __user * buf, size_t count, loff_t * ppos) ++{ ++ DECLARE_WAITQUEUE(wait, current); ++ ssize_t retval = 0; ++ ++ add_wait_queue(&learn_wait, &wait); ++ set_current_state(TASK_INTERRUPTIBLE); ++ do { ++ mutex_lock(&gr_learn_user_mutex); ++ spin_lock(&gr_learn_lock); ++ if (learn_buffer_len) ++ break; ++ spin_unlock(&gr_learn_lock); ++ mutex_unlock(&gr_learn_user_mutex); ++ if (file->f_flags & O_NONBLOCK) { ++ retval = -EAGAIN; ++ goto out; ++ } ++ if (signal_pending(current)) { ++ retval = -ERESTARTSYS; ++ goto out; ++ } ++ ++ schedule(); ++ } while (1); ++ ++ memcpy(learn_buffer_user, learn_buffer, learn_buffer_len); ++ learn_buffer_user_len = learn_buffer_len; ++ retval = learn_buffer_len; ++ learn_buffer_len = 0; ++ ++ spin_unlock(&gr_learn_lock); ++ ++ if (copy_to_user(buf, learn_buffer_user, learn_buffer_user_len)) ++ retval = -EFAULT; ++ ++ mutex_unlock(&gr_learn_user_mutex); ++out: ++ set_current_state(TASK_RUNNING); ++ remove_wait_queue(&learn_wait, &wait); ++ return retval; ++} ++ ++static unsigned int ++poll_learn(struct file * file, poll_table * wait) ++{ ++ poll_wait(file, &learn_wait, wait); ++ ++ if (learn_buffer_len) ++ return (POLLIN | POLLRDNORM); ++ ++ return 0; ++} ++ ++void ++gr_clear_learn_entries(void) ++{ ++ char *tmp; ++ ++ mutex_lock(&gr_learn_user_mutex); ++ spin_lock(&gr_learn_lock); ++ tmp = learn_buffer; ++ learn_buffer = NULL; ++ spin_unlock(&gr_learn_lock); ++ if (tmp) ++ vfree(tmp); ++ if (learn_buffer_user != NULL) { ++ vfree(learn_buffer_user); ++ learn_buffer_user = NULL; ++ } ++ learn_buffer_len = 0; ++ mutex_unlock(&gr_learn_user_mutex); ++ ++ return; ++} ++ ++void ++gr_add_learn_entry(const char *fmt, ...) ++{ ++ va_list args; ++ unsigned int len; ++ ++ if (!gr_learn_attached) ++ return; ++ ++ spin_lock(&gr_learn_lock); ++ ++ /* leave a gap at the end so we know when it's "full" but don't have to ++ compute the exact length of the string we're trying to append ++ */ ++ if (learn_buffer_len > LEARN_BUFFER_SIZE - 16384) { ++ spin_unlock(&gr_learn_lock); ++ wake_up_interruptible(&learn_wait); ++ return; ++ } ++ if (learn_buffer == NULL) { ++ spin_unlock(&gr_learn_lock); ++ return; ++ } ++ ++ va_start(args, fmt); ++ len = vsnprintf(learn_buffer + learn_buffer_len, LEARN_BUFFER_SIZE - learn_buffer_len, fmt, args); ++ va_end(args); ++ ++ learn_buffer_len += len + 1; ++ ++ spin_unlock(&gr_learn_lock); ++ wake_up_interruptible(&learn_wait); ++ ++ return; ++} ++ ++static int ++open_learn(struct inode *inode, struct file *file) ++{ ++ if (file->f_mode & FMODE_READ && gr_learn_attached) ++ return -EBUSY; ++ if (file->f_mode & FMODE_READ) { ++ int retval = 0; ++ mutex_lock(&gr_learn_user_mutex); ++ if (learn_buffer == NULL) ++ learn_buffer = vmalloc(LEARN_BUFFER_SIZE); ++ if (learn_buffer_user == NULL) ++ learn_buffer_user = vmalloc(LEARN_BUFFER_SIZE); ++ if (learn_buffer == NULL) { ++ retval = -ENOMEM; ++ goto out_error; ++ } ++ if (learn_buffer_user == NULL) { ++ retval = -ENOMEM; ++ goto out_error; ++ } ++ learn_buffer_len = 0; ++ learn_buffer_user_len = 0; ++ gr_learn_attached = 1; ++out_error: ++ mutex_unlock(&gr_learn_user_mutex); ++ return retval; ++ } ++ return 0; ++} ++ ++static int ++close_learn(struct inode *inode, struct file *file) ++{ ++ if (file->f_mode & FMODE_READ) { ++ char *tmp = NULL; ++ mutex_lock(&gr_learn_user_mutex); ++ spin_lock(&gr_learn_lock); ++ tmp = learn_buffer; ++ learn_buffer = NULL; ++ spin_unlock(&gr_learn_lock); ++ if (tmp) ++ vfree(tmp); ++ if (learn_buffer_user != NULL) { ++ vfree(learn_buffer_user); ++ learn_buffer_user = NULL; ++ } ++ learn_buffer_len = 0; ++ learn_buffer_user_len = 0; ++ gr_learn_attached = 0; ++ mutex_unlock(&gr_learn_user_mutex); ++ } ++ ++ return 0; ++} ++ ++const struct file_operations grsec_fops = { ++ .read = read_learn, ++ .write = write_grsec_handler, ++ .open = open_learn, ++ .release = close_learn, ++ .poll = poll_learn, ++}; +diff --git a/grsecurity/gracl_policy.c b/grsecurity/gracl_policy.c +new file mode 100644 +index 0000000..fd26052 +--- /dev/null ++++ b/grsecurity/gracl_policy.c +@@ -0,0 +1,1781 @@ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/file.h> ++#include <linux/fs.h> ++#include <linux/namei.h> ++#include <linux/mount.h> ++#include <linux/tty.h> ++#include <linux/proc_fs.h> ++#include <linux/lglock.h> ++#include <linux/slab.h> ++#include <linux/vmalloc.h> ++#include <linux/types.h> ++#include <linux/sysctl.h> ++#include <linux/netdevice.h> ++#include <linux/ptrace.h> ++#include <linux/gracl.h> ++#include <linux/gralloc.h> ++#include <linux/security.h> ++#include <linux/grinternal.h> ++#include <linux/pid_namespace.h> ++#include <linux/stop_machine.h> ++#include <linux/fdtable.h> ++#include <linux/percpu.h> ++#include <linux/lglock.h> ++#include <linux/hugetlb.h> ++#include <linux/posix-timers.h> ++#include "../fs/mount.h" ++ ++#include <asm/uaccess.h> ++#include <asm/errno.h> ++#include <asm/mman.h> ++ ++extern struct gr_policy_state *polstate; ++ ++#define FOR_EACH_ROLE_START(role) \ ++ role = polstate->role_list; \ ++ while (role) { ++ ++#define FOR_EACH_ROLE_END(role) \ ++ role = role->prev; \ ++ } ++ ++struct path gr_real_root; ++ ++extern struct gr_alloc_state *current_alloc_state; ++ ++u16 acl_sp_role_value; ++ ++static DEFINE_MUTEX(gr_dev_mutex); ++ ++extern int chkpw(struct gr_arg *entry, unsigned char *salt, unsigned char *sum); ++extern void gr_clear_learn_entries(void); ++ ++struct gr_arg *gr_usermode __read_only; ++unsigned char *gr_system_salt __read_only; ++unsigned char *gr_system_sum __read_only; ++ ++static unsigned int gr_auth_attempts = 0; ++static unsigned long gr_auth_expires = 0UL; ++ ++struct acl_object_label *fakefs_obj_rw; ++struct acl_object_label *fakefs_obj_rwx; ++ ++extern int gr_init_uidset(void); ++extern void gr_free_uidset(void); ++extern void gr_remove_uid(uid_t uid); ++extern int gr_find_uid(uid_t uid); ++ ++extern struct acl_subject_label *__gr_get_subject_for_task(const struct gr_policy_state *state, struct task_struct *task, const char *filename, int fallback); ++extern void __gr_apply_subject_to_task(struct gr_policy_state *state, struct task_struct *task, struct acl_subject_label *subj); ++extern int gr_streq(const char *a, const char *b, const unsigned int lena, const unsigned int lenb); ++extern void __insert_inodev_entry(const struct gr_policy_state *state, struct inodev_entry *entry); ++extern struct acl_role_label *__lookup_acl_role_label(const struct gr_policy_state *state, const struct task_struct *task, const uid_t uid, const gid_t gid); ++extern void insert_acl_obj_label(struct acl_object_label *obj, struct acl_subject_label *subj); ++extern void insert_acl_subj_label(struct acl_subject_label *obj, struct acl_role_label *role); ++extern struct name_entry * __lookup_name_entry(const struct gr_policy_state *state, const char *name); ++extern char *gr_to_filename_rbac(const struct dentry *dentry, const struct vfsmount *mnt); ++extern struct acl_subject_label *lookup_acl_subj_label(const u64 ino, const dev_t dev, const struct acl_role_label *role); ++extern struct acl_subject_label *lookup_acl_subj_label_deleted(const u64 ino, const dev_t dev, const struct acl_role_label *role); ++extern void assign_special_role(const char *rolename); ++extern struct acl_subject_label *chk_subj_label(const struct dentry *l_dentry, const struct vfsmount *l_mnt, const struct acl_role_label *role); ++extern int gr_rbac_disable(void *unused); ++extern void gr_enable_rbac_system(void); ++ ++static int copy_acl_object_label_normal(struct acl_object_label *obj, const struct acl_object_label *userp) ++{ ++ if (copy_from_user(obj, userp, sizeof(struct acl_object_label))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int copy_acl_ip_label_normal(struct acl_ip_label *ip, const struct acl_ip_label *userp) ++{ ++ if (copy_from_user(ip, userp, sizeof(struct acl_ip_label))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int copy_acl_subject_label_normal(struct acl_subject_label *subj, const struct acl_subject_label *userp) ++{ ++ if (copy_from_user(subj, userp, sizeof(struct acl_subject_label))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int copy_acl_role_label_normal(struct acl_role_label *role, const struct acl_role_label *userp) ++{ ++ if (copy_from_user(role, userp, sizeof(struct acl_role_label))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int copy_role_allowed_ip_normal(struct role_allowed_ip *roleip, const struct role_allowed_ip *userp) ++{ ++ if (copy_from_user(roleip, userp, sizeof(struct role_allowed_ip))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int copy_sprole_pw_normal(struct sprole_pw *pw, unsigned long idx, const struct sprole_pw *userp) ++{ ++ if (copy_from_user(pw, userp + idx, sizeof(struct sprole_pw))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int copy_gr_hash_struct_normal(struct gr_hash_struct *hash, const struct gr_hash_struct *userp) ++{ ++ if (copy_from_user(hash, userp, sizeof(struct gr_hash_struct))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int copy_role_transition_normal(struct role_transition *trans, const struct role_transition *userp) ++{ ++ if (copy_from_user(trans, userp, sizeof(struct role_transition))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++int copy_pointer_from_array_normal(void *ptr, unsigned long idx, const void *userp) ++{ ++ if (copy_from_user(ptr, userp + (idx * sizeof(void *)), sizeof(void *))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int copy_gr_arg_wrapper_normal(const char __user *buf, struct gr_arg_wrapper *uwrap) ++{ ++ if (copy_from_user(uwrap, buf, sizeof (struct gr_arg_wrapper))) ++ return -EFAULT; ++ ++ if ((uwrap->version != GRSECURITY_VERSION) || ++ (uwrap->size != sizeof(struct gr_arg))) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int copy_gr_arg_normal(const struct gr_arg __user *buf, struct gr_arg *arg) ++{ ++ if (copy_from_user(arg, buf, sizeof (struct gr_arg))) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static size_t get_gr_arg_wrapper_size_normal(void) ++{ ++ return sizeof(struct gr_arg_wrapper); ++} ++ ++#ifdef CONFIG_COMPAT ++extern int copy_gr_arg_wrapper_compat(const char *buf, struct gr_arg_wrapper *uwrap); ++extern int copy_gr_arg_compat(const struct gr_arg __user *buf, struct gr_arg *arg); ++extern int copy_acl_object_label_compat(struct acl_object_label *obj, const struct acl_object_label *userp); ++extern int copy_acl_subject_label_compat(struct acl_subject_label *subj, const struct acl_subject_label *userp); ++extern int copy_acl_role_label_compat(struct acl_role_label *role, const struct acl_role_label *userp); ++extern int copy_role_allowed_ip_compat(struct role_allowed_ip *roleip, const struct role_allowed_ip *userp); ++extern int copy_role_transition_compat(struct role_transition *trans, const struct role_transition *userp); ++extern int copy_gr_hash_struct_compat(struct gr_hash_struct *hash, const struct gr_hash_struct *userp); ++extern int copy_pointer_from_array_compat(void *ptr, unsigned long idx, const void *userp); ++extern int copy_acl_ip_label_compat(struct acl_ip_label *ip, const struct acl_ip_label *userp); ++extern int copy_sprole_pw_compat(struct sprole_pw *pw, unsigned long idx, const struct sprole_pw *userp); ++extern size_t get_gr_arg_wrapper_size_compat(void); ++ ++int (* copy_gr_arg_wrapper)(const char *buf, struct gr_arg_wrapper *uwrap) __read_only; ++int (* copy_gr_arg)(const struct gr_arg *buf, struct gr_arg *arg) __read_only; ++int (* copy_acl_object_label)(struct acl_object_label *obj, const struct acl_object_label *userp) __read_only; ++int (* copy_acl_subject_label)(struct acl_subject_label *subj, const struct acl_subject_label *userp) __read_only; ++int (* copy_acl_role_label)(struct acl_role_label *role, const struct acl_role_label *userp) __read_only; ++int (* copy_acl_ip_label)(struct acl_ip_label *ip, const struct acl_ip_label *userp) __read_only; ++int (* copy_pointer_from_array)(void *ptr, unsigned long idx, const void *userp) __read_only; ++int (* copy_sprole_pw)(struct sprole_pw *pw, unsigned long idx, const struct sprole_pw *userp) __read_only; ++int (* copy_gr_hash_struct)(struct gr_hash_struct *hash, const struct gr_hash_struct *userp) __read_only; ++int (* copy_role_transition)(struct role_transition *trans, const struct role_transition *userp) __read_only; ++int (* copy_role_allowed_ip)(struct role_allowed_ip *roleip, const struct role_allowed_ip *userp) __read_only; ++size_t (* get_gr_arg_wrapper_size)(void) __read_only; ++ ++#else ++#define copy_gr_arg_wrapper copy_gr_arg_wrapper_normal ++#define copy_gr_arg copy_gr_arg_normal ++#define copy_gr_hash_struct copy_gr_hash_struct_normal ++#define copy_acl_object_label copy_acl_object_label_normal ++#define copy_acl_subject_label copy_acl_subject_label_normal ++#define copy_acl_role_label copy_acl_role_label_normal ++#define copy_acl_ip_label copy_acl_ip_label_normal ++#define copy_pointer_from_array copy_pointer_from_array_normal ++#define copy_sprole_pw copy_sprole_pw_normal ++#define copy_role_transition copy_role_transition_normal ++#define copy_role_allowed_ip copy_role_allowed_ip_normal ++#define get_gr_arg_wrapper_size get_gr_arg_wrapper_size_normal ++#endif ++ ++static struct acl_subject_label * ++lookup_subject_map(const struct acl_subject_label *userp) ++{ ++ unsigned int index = gr_shash(userp, polstate->subj_map_set.s_size); ++ struct subject_map *match; ++ ++ match = polstate->subj_map_set.s_hash[index]; ++ ++ while (match && match->user != userp) ++ match = match->next; ++ ++ if (match != NULL) ++ return match->kernel; ++ else ++ return NULL; ++} ++ ++static void ++insert_subj_map_entry(struct subject_map *subjmap) ++{ ++ unsigned int index = gr_shash(subjmap->user, polstate->subj_map_set.s_size); ++ struct subject_map **curr; ++ ++ subjmap->prev = NULL; ++ ++ curr = &polstate->subj_map_set.s_hash[index]; ++ if (*curr != NULL) ++ (*curr)->prev = subjmap; ++ ++ subjmap->next = *curr; ++ *curr = subjmap; ++ ++ return; ++} ++ ++static void ++__insert_acl_role_label(struct acl_role_label *role, uid_t uidgid) ++{ ++ unsigned int index = ++ gr_rhash(uidgid, role->roletype & (GR_ROLE_USER | GR_ROLE_GROUP), polstate->acl_role_set.r_size); ++ struct acl_role_label **curr; ++ struct acl_role_label *tmp, *tmp2; ++ ++ curr = &polstate->acl_role_set.r_hash[index]; ++ ++ /* simple case, slot is empty, just set it to our role */ ++ if (*curr == NULL) { ++ *curr = role; ++ } else { ++ /* example: ++ 1 -> 2 -> 3 (adding 2 -> 3 to here) ++ 2 -> 3 ++ */ ++ /* first check to see if we can already be reached via this slot */ ++ tmp = *curr; ++ while (tmp && tmp != role) ++ tmp = tmp->next; ++ if (tmp == role) { ++ /* we don't need to add ourselves to this slot's chain */ ++ return; ++ } ++ /* we need to add ourselves to this chain, two cases */ ++ if (role->next == NULL) { ++ /* simple case, append the current chain to our role */ ++ role->next = *curr; ++ *curr = role; ++ } else { ++ /* 1 -> 2 -> 3 -> 4 ++ 2 -> 3 -> 4 ++ 3 -> 4 (adding 1 -> 2 -> 3 -> 4 to here) ++ */ ++ /* trickier case: walk our role's chain until we find ++ the role for the start of the current slot's chain */ ++ tmp = role; ++ tmp2 = *curr; ++ while (tmp->next && tmp->next != tmp2) ++ tmp = tmp->next; ++ if (tmp->next == tmp2) { ++ /* from example above, we found 3, so just ++ replace this slot's chain with ours */ ++ *curr = role; ++ } else { ++ /* we didn't find a subset of our role's chain ++ in the current slot's chain, so append their ++ chain to ours, and set us as the first role in ++ the slot's chain ++ ++ we could fold this case with the case above, ++ but making it explicit for clarity ++ */ ++ tmp->next = tmp2; ++ *curr = role; ++ } ++ } ++ } ++ ++ return; ++} ++ ++static void ++insert_acl_role_label(struct acl_role_label *role) ++{ ++ int i; ++ ++ if (polstate->role_list == NULL) { ++ polstate->role_list = role; ++ role->prev = NULL; ++ } else { ++ role->prev = polstate->role_list; ++ polstate->role_list = role; ++ } ++ ++ /* used for hash chains */ ++ role->next = NULL; ++ ++ if (role->roletype & GR_ROLE_DOMAIN) { ++ for (i = 0; i < role->domain_child_num; i++) ++ __insert_acl_role_label(role, role->domain_children[i]); ++ } else ++ __insert_acl_role_label(role, role->uidgid); ++} ++ ++static int ++insert_name_entry(char *name, const u64 inode, const dev_t device, __u8 deleted) ++{ ++ struct name_entry **curr, *nentry; ++ struct inodev_entry *ientry; ++ unsigned int len = strlen(name); ++ unsigned int key = full_name_hash(name, len); ++ unsigned int index = key % polstate->name_set.n_size; ++ ++ curr = &polstate->name_set.n_hash[index]; ++ ++ while (*curr && ((*curr)->key != key || !gr_streq((*curr)->name, name, (*curr)->len, len))) ++ curr = &((*curr)->next); ++ ++ if (*curr != NULL) ++ return 1; ++ ++ nentry = acl_alloc(sizeof (struct name_entry)); ++ if (nentry == NULL) ++ return 0; ++ ientry = acl_alloc(sizeof (struct inodev_entry)); ++ if (ientry == NULL) ++ return 0; ++ ientry->nentry = nentry; ++ ++ nentry->key = key; ++ nentry->name = name; ++ nentry->inode = inode; ++ nentry->device = device; ++ nentry->len = len; ++ nentry->deleted = deleted; ++ ++ nentry->prev = NULL; ++ curr = &polstate->name_set.n_hash[index]; ++ if (*curr != NULL) ++ (*curr)->prev = nentry; ++ nentry->next = *curr; ++ *curr = nentry; ++ ++ /* insert us into the table searchable by inode/dev */ ++ __insert_inodev_entry(polstate, ientry); ++ ++ return 1; ++} ++ ++/* allocating chained hash tables, so optimal size is where lambda ~ 1 */ ++ ++static void * ++create_table(__u32 * len, int elementsize) ++{ ++ unsigned int table_sizes[] = { ++ 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, ++ 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, ++ 4194301, 8388593, 16777213, 33554393, 67108859 ++ }; ++ void *newtable = NULL; ++ unsigned int pwr = 0; ++ ++ while ((pwr < ((sizeof (table_sizes) / sizeof (table_sizes[0])) - 1)) && ++ table_sizes[pwr] <= *len) ++ pwr++; ++ ++ if (table_sizes[pwr] <= *len || (table_sizes[pwr] > ULONG_MAX / elementsize)) ++ return newtable; ++ ++ if ((table_sizes[pwr] * elementsize) <= PAGE_SIZE) ++ newtable = ++ kmalloc(table_sizes[pwr] * elementsize, GFP_KERNEL); ++ else ++ newtable = vmalloc(table_sizes[pwr] * elementsize); ++ ++ *len = table_sizes[pwr]; ++ ++ return newtable; ++} ++ ++static int ++init_variables(const struct gr_arg *arg, bool reload) ++{ ++ struct task_struct *reaper = init_pid_ns.child_reaper; ++ unsigned int stacksize; ++ ++ polstate->subj_map_set.s_size = arg->role_db.num_subjects; ++ polstate->acl_role_set.r_size = arg->role_db.num_roles + arg->role_db.num_domain_children; ++ polstate->name_set.n_size = arg->role_db.num_objects; ++ polstate->inodev_set.i_size = arg->role_db.num_objects; ++ ++ if (!polstate->subj_map_set.s_size || !polstate->acl_role_set.r_size || ++ !polstate->name_set.n_size || !polstate->inodev_set.i_size) ++ return 1; ++ ++ if (!reload) { ++ if (!gr_init_uidset()) ++ return 1; ++ } ++ ++ /* set up the stack that holds allocation info */ ++ ++ stacksize = arg->role_db.num_pointers + 5; ++ ++ if (!acl_alloc_stack_init(stacksize)) ++ return 1; ++ ++ if (!reload) { ++ /* grab reference for the real root dentry and vfsmount */ ++ get_fs_root(reaper->fs, &gr_real_root); ++ ++#ifdef CONFIG_GRKERNSEC_RBAC_DEBUG ++ printk(KERN_ALERT "Obtained real root device=%d, inode=%lu\n", __get_dev(gr_real_root.dentry), gr_real_root.dentry->d_inode->i_ino); ++#endif ++ ++ fakefs_obj_rw = kzalloc(sizeof(struct acl_object_label), GFP_KERNEL); ++ if (fakefs_obj_rw == NULL) ++ return 1; ++ fakefs_obj_rw->mode = GR_FIND | GR_READ | GR_WRITE; ++ ++ fakefs_obj_rwx = kzalloc(sizeof(struct acl_object_label), GFP_KERNEL); ++ if (fakefs_obj_rwx == NULL) ++ return 1; ++ fakefs_obj_rwx->mode = GR_FIND | GR_READ | GR_WRITE | GR_EXEC; ++ } ++ ++ polstate->subj_map_set.s_hash = ++ (struct subject_map **) create_table(&polstate->subj_map_set.s_size, sizeof(void *)); ++ polstate->acl_role_set.r_hash = ++ (struct acl_role_label **) create_table(&polstate->acl_role_set.r_size, sizeof(void *)); ++ polstate->name_set.n_hash = (struct name_entry **) create_table(&polstate->name_set.n_size, sizeof(void *)); ++ polstate->inodev_set.i_hash = ++ (struct inodev_entry **) create_table(&polstate->inodev_set.i_size, sizeof(void *)); ++ ++ if (!polstate->subj_map_set.s_hash || !polstate->acl_role_set.r_hash || ++ !polstate->name_set.n_hash || !polstate->inodev_set.i_hash) ++ return 1; ++ ++ memset(polstate->subj_map_set.s_hash, 0, ++ sizeof(struct subject_map *) * polstate->subj_map_set.s_size); ++ memset(polstate->acl_role_set.r_hash, 0, ++ sizeof (struct acl_role_label *) * polstate->acl_role_set.r_size); ++ memset(polstate->name_set.n_hash, 0, ++ sizeof (struct name_entry *) * polstate->name_set.n_size); ++ memset(polstate->inodev_set.i_hash, 0, ++ sizeof (struct inodev_entry *) * polstate->inodev_set.i_size); ++ ++ return 0; ++} ++ ++/* free information not needed after startup ++ currently contains user->kernel pointer mappings for subjects ++*/ ++ ++static void ++free_init_variables(void) ++{ ++ __u32 i; ++ ++ if (polstate->subj_map_set.s_hash) { ++ for (i = 0; i < polstate->subj_map_set.s_size; i++) { ++ if (polstate->subj_map_set.s_hash[i]) { ++ kfree(polstate->subj_map_set.s_hash[i]); ++ polstate->subj_map_set.s_hash[i] = NULL; ++ } ++ } ++ ++ if ((polstate->subj_map_set.s_size * sizeof (struct subject_map *)) <= ++ PAGE_SIZE) ++ kfree(polstate->subj_map_set.s_hash); ++ else ++ vfree(polstate->subj_map_set.s_hash); ++ } ++ ++ return; ++} ++ ++static void ++free_variables(bool reload) ++{ ++ struct acl_subject_label *s; ++ struct acl_role_label *r; ++ struct task_struct *task, *task2; ++ unsigned int x; ++ ++ if (!reload) { ++ gr_clear_learn_entries(); ++ ++ read_lock(&tasklist_lock); ++ do_each_thread(task2, task) { ++ task->acl_sp_role = 0; ++ task->acl_role_id = 0; ++ task->inherited = 0; ++ task->acl = NULL; ++ task->role = NULL; ++ } while_each_thread(task2, task); ++ read_unlock(&tasklist_lock); ++ ++ kfree(fakefs_obj_rw); ++ fakefs_obj_rw = NULL; ++ kfree(fakefs_obj_rwx); ++ fakefs_obj_rwx = NULL; ++ ++ /* release the reference to the real root dentry and vfsmount */ ++ path_put(&gr_real_root); ++ memset(&gr_real_root, 0, sizeof(gr_real_root)); ++ } ++ ++ /* free all object hash tables */ ++ ++ FOR_EACH_ROLE_START(r) ++ if (r->subj_hash == NULL) ++ goto next_role; ++ FOR_EACH_SUBJECT_START(r, s, x) ++ if (s->obj_hash == NULL) ++ break; ++ if ((s->obj_hash_size * sizeof (struct acl_object_label *)) <= PAGE_SIZE) ++ kfree(s->obj_hash); ++ else ++ vfree(s->obj_hash); ++ FOR_EACH_SUBJECT_END(s, x) ++ FOR_EACH_NESTED_SUBJECT_START(r, s) ++ if (s->obj_hash == NULL) ++ break; ++ if ((s->obj_hash_size * sizeof (struct acl_object_label *)) <= PAGE_SIZE) ++ kfree(s->obj_hash); ++ else ++ vfree(s->obj_hash); ++ FOR_EACH_NESTED_SUBJECT_END(s) ++ if ((r->subj_hash_size * sizeof (struct acl_subject_label *)) <= PAGE_SIZE) ++ kfree(r->subj_hash); ++ else ++ vfree(r->subj_hash); ++ r->subj_hash = NULL; ++next_role: ++ FOR_EACH_ROLE_END(r) ++ ++ acl_free_all(); ++ ++ if (polstate->acl_role_set.r_hash) { ++ if ((polstate->acl_role_set.r_size * sizeof (struct acl_role_label *)) <= ++ PAGE_SIZE) ++ kfree(polstate->acl_role_set.r_hash); ++ else ++ vfree(polstate->acl_role_set.r_hash); ++ } ++ if (polstate->name_set.n_hash) { ++ if ((polstate->name_set.n_size * sizeof (struct name_entry *)) <= ++ PAGE_SIZE) ++ kfree(polstate->name_set.n_hash); ++ else ++ vfree(polstate->name_set.n_hash); ++ } ++ ++ if (polstate->inodev_set.i_hash) { ++ if ((polstate->inodev_set.i_size * sizeof (struct inodev_entry *)) <= ++ PAGE_SIZE) ++ kfree(polstate->inodev_set.i_hash); ++ else ++ vfree(polstate->inodev_set.i_hash); ++ } ++ ++ if (!reload) ++ gr_free_uidset(); ++ ++ memset(&polstate->name_set, 0, sizeof (struct name_db)); ++ memset(&polstate->inodev_set, 0, sizeof (struct inodev_db)); ++ memset(&polstate->acl_role_set, 0, sizeof (struct acl_role_db)); ++ memset(&polstate->subj_map_set, 0, sizeof (struct acl_subj_map_db)); ++ ++ polstate->default_role = NULL; ++ polstate->kernel_role = NULL; ++ polstate->role_list = NULL; ++ ++ return; ++} ++ ++static struct acl_subject_label * ++do_copy_user_subj(struct acl_subject_label *userp, struct acl_role_label *role, int *already_copied); ++ ++static int alloc_and_copy_string(char **name, unsigned int maxlen) ++{ ++ unsigned int len = strnlen_user(*name, maxlen); ++ char *tmp; ++ ++ if (!len || len >= maxlen) ++ return -EINVAL; ++ ++ if ((tmp = (char *) acl_alloc(len)) == NULL) ++ return -ENOMEM; ++ ++ if (copy_from_user(tmp, *name, len)) ++ return -EFAULT; ++ ++ tmp[len-1] = '\0'; ++ *name = tmp; ++ ++ return 0; ++} ++ ++static int ++copy_user_glob(struct acl_object_label *obj) ++{ ++ struct acl_object_label *g_tmp, **guser; ++ int error; ++ ++ if (obj->globbed == NULL) ++ return 0; ++ ++ guser = &obj->globbed; ++ while (*guser) { ++ g_tmp = (struct acl_object_label *) ++ acl_alloc(sizeof (struct acl_object_label)); ++ if (g_tmp == NULL) ++ return -ENOMEM; ++ ++ if (copy_acl_object_label(g_tmp, *guser)) ++ return -EFAULT; ++ ++ error = alloc_and_copy_string(&g_tmp->filename, PATH_MAX); ++ if (error) ++ return error; ++ ++ *guser = g_tmp; ++ guser = &(g_tmp->next); ++ } ++ ++ return 0; ++} ++ ++static int ++copy_user_objs(struct acl_object_label *userp, struct acl_subject_label *subj, ++ struct acl_role_label *role) ++{ ++ struct acl_object_label *o_tmp; ++ int ret; ++ ++ while (userp) { ++ if ((o_tmp = (struct acl_object_label *) ++ acl_alloc(sizeof (struct acl_object_label))) == NULL) ++ return -ENOMEM; ++ ++ if (copy_acl_object_label(o_tmp, userp)) ++ return -EFAULT; ++ ++ userp = o_tmp->prev; ++ ++ ret = alloc_and_copy_string(&o_tmp->filename, PATH_MAX); ++ if (ret) ++ return ret; ++ ++ insert_acl_obj_label(o_tmp, subj); ++ if (!insert_name_entry(o_tmp->filename, o_tmp->inode, ++ o_tmp->device, (o_tmp->mode & GR_DELETED) ? 1 : 0)) ++ return -ENOMEM; ++ ++ ret = copy_user_glob(o_tmp); ++ if (ret) ++ return ret; ++ ++ if (o_tmp->nested) { ++ int already_copied; ++ ++ o_tmp->nested = do_copy_user_subj(o_tmp->nested, role, &already_copied); ++ if (IS_ERR(o_tmp->nested)) ++ return PTR_ERR(o_tmp->nested); ++ ++ /* insert into nested subject list if we haven't copied this one yet ++ to prevent duplicate entries */ ++ if (!already_copied) { ++ o_tmp->nested->next = role->hash->first; ++ role->hash->first = o_tmp->nested; ++ } ++ } ++ } ++ ++ return 0; ++} ++ ++static __u32 ++count_user_subjs(struct acl_subject_label *userp) ++{ ++ struct acl_subject_label s_tmp; ++ __u32 num = 0; ++ ++ while (userp) { ++ if (copy_acl_subject_label(&s_tmp, userp)) ++ break; ++ ++ userp = s_tmp.prev; ++ } ++ ++ return num; ++} ++ ++static int ++copy_user_allowedips(struct acl_role_label *rolep) ++{ ++ struct role_allowed_ip *ruserip, *rtmp = NULL, *rlast; ++ ++ ruserip = rolep->allowed_ips; ++ ++ while (ruserip) { ++ rlast = rtmp; ++ ++ if ((rtmp = (struct role_allowed_ip *) ++ acl_alloc(sizeof (struct role_allowed_ip))) == NULL) ++ return -ENOMEM; ++ ++ if (copy_role_allowed_ip(rtmp, ruserip)) ++ return -EFAULT; ++ ++ ruserip = rtmp->prev; ++ ++ if (!rlast) { ++ rtmp->prev = NULL; ++ rolep->allowed_ips = rtmp; ++ } else { ++ rlast->next = rtmp; ++ rtmp->prev = rlast; ++ } ++ ++ if (!ruserip) ++ rtmp->next = NULL; ++ } ++ ++ return 0; ++} ++ ++static int ++copy_user_transitions(struct acl_role_label *rolep) ++{ ++ struct role_transition *rusertp, *rtmp = NULL, *rlast; ++ int error; ++ ++ rusertp = rolep->transitions; ++ ++ while (rusertp) { ++ rlast = rtmp; ++ ++ if ((rtmp = (struct role_transition *) ++ acl_alloc(sizeof (struct role_transition))) == NULL) ++ return -ENOMEM; ++ ++ if (copy_role_transition(rtmp, rusertp)) ++ return -EFAULT; ++ ++ rusertp = rtmp->prev; ++ ++ error = alloc_and_copy_string(&rtmp->rolename, GR_SPROLE_LEN); ++ if (error) ++ return error; ++ ++ if (!rlast) { ++ rtmp->prev = NULL; ++ rolep->transitions = rtmp; ++ } else { ++ rlast->next = rtmp; ++ rtmp->prev = rlast; ++ } ++ ++ if (!rusertp) ++ rtmp->next = NULL; ++ } ++ ++ return 0; ++} ++ ++static __u32 count_user_objs(const struct acl_object_label __user *userp) ++{ ++ struct acl_object_label o_tmp; ++ __u32 num = 0; ++ ++ while (userp) { ++ if (copy_acl_object_label(&o_tmp, userp)) ++ break; ++ ++ userp = o_tmp.prev; ++ num++; ++ } ++ ++ return num; ++} ++ ++static struct acl_subject_label * ++do_copy_user_subj(struct acl_subject_label *userp, struct acl_role_label *role, int *already_copied) ++{ ++ struct acl_subject_label *s_tmp = NULL, *s_tmp2; ++ __u32 num_objs; ++ struct acl_ip_label **i_tmp, *i_utmp2; ++ struct gr_hash_struct ghash; ++ struct subject_map *subjmap; ++ unsigned int i_num; ++ int err; ++ ++ if (already_copied != NULL) ++ *already_copied = 0; ++ ++ s_tmp = lookup_subject_map(userp); ++ ++ /* we've already copied this subject into the kernel, just return ++ the reference to it, and don't copy it over again ++ */ ++ if (s_tmp) { ++ if (already_copied != NULL) ++ *already_copied = 1; ++ return(s_tmp); ++ } ++ ++ if ((s_tmp = (struct acl_subject_label *) ++ acl_alloc(sizeof (struct acl_subject_label))) == NULL) ++ return ERR_PTR(-ENOMEM); ++ ++ subjmap = (struct subject_map *)kmalloc(sizeof (struct subject_map), GFP_KERNEL); ++ if (subjmap == NULL) ++ return ERR_PTR(-ENOMEM); ++ ++ subjmap->user = userp; ++ subjmap->kernel = s_tmp; ++ insert_subj_map_entry(subjmap); ++ ++ if (copy_acl_subject_label(s_tmp, userp)) ++ return ERR_PTR(-EFAULT); ++ ++ err = alloc_and_copy_string(&s_tmp->filename, PATH_MAX); ++ if (err) ++ return ERR_PTR(err); ++ ++ if (!strcmp(s_tmp->filename, "/")) ++ role->root_label = s_tmp; ++ ++ if (copy_gr_hash_struct(&ghash, s_tmp->hash)) ++ return ERR_PTR(-EFAULT); ++ ++ /* copy user and group transition tables */ ++ ++ if (s_tmp->user_trans_num) { ++ uid_t *uidlist; ++ ++ uidlist = (uid_t *)acl_alloc_num(s_tmp->user_trans_num, sizeof(uid_t)); ++ if (uidlist == NULL) ++ return ERR_PTR(-ENOMEM); ++ if (copy_from_user(uidlist, s_tmp->user_transitions, s_tmp->user_trans_num * sizeof(uid_t))) ++ return ERR_PTR(-EFAULT); ++ ++ s_tmp->user_transitions = uidlist; ++ } ++ ++ if (s_tmp->group_trans_num) { ++ gid_t *gidlist; ++ ++ gidlist = (gid_t *)acl_alloc_num(s_tmp->group_trans_num, sizeof(gid_t)); ++ if (gidlist == NULL) ++ return ERR_PTR(-ENOMEM); ++ if (copy_from_user(gidlist, s_tmp->group_transitions, s_tmp->group_trans_num * sizeof(gid_t))) ++ return ERR_PTR(-EFAULT); ++ ++ s_tmp->group_transitions = gidlist; ++ } ++ ++ /* set up object hash table */ ++ num_objs = count_user_objs(ghash.first); ++ ++ s_tmp->obj_hash_size = num_objs; ++ s_tmp->obj_hash = ++ (struct acl_object_label **) ++ create_table(&(s_tmp->obj_hash_size), sizeof(void *)); ++ ++ if (!s_tmp->obj_hash) ++ return ERR_PTR(-ENOMEM); ++ ++ memset(s_tmp->obj_hash, 0, ++ s_tmp->obj_hash_size * ++ sizeof (struct acl_object_label *)); ++ ++ /* add in objects */ ++ err = copy_user_objs(ghash.first, s_tmp, role); ++ ++ if (err) ++ return ERR_PTR(err); ++ ++ /* set pointer for parent subject */ ++ if (s_tmp->parent_subject) { ++ s_tmp2 = do_copy_user_subj(s_tmp->parent_subject, role, NULL); ++ ++ if (IS_ERR(s_tmp2)) ++ return s_tmp2; ++ ++ s_tmp->parent_subject = s_tmp2; ++ } ++ ++ /* add in ip acls */ ++ ++ if (!s_tmp->ip_num) { ++ s_tmp->ips = NULL; ++ goto insert; ++ } ++ ++ i_tmp = ++ (struct acl_ip_label **) acl_alloc_num(s_tmp->ip_num, ++ sizeof (struct acl_ip_label *)); ++ ++ if (!i_tmp) ++ return ERR_PTR(-ENOMEM); ++ ++ for (i_num = 0; i_num < s_tmp->ip_num; i_num++) { ++ *(i_tmp + i_num) = ++ (struct acl_ip_label *) ++ acl_alloc(sizeof (struct acl_ip_label)); ++ if (!*(i_tmp + i_num)) ++ return ERR_PTR(-ENOMEM); ++ ++ if (copy_pointer_from_array(&i_utmp2, i_num, s_tmp->ips)) ++ return ERR_PTR(-EFAULT); ++ ++ if (copy_acl_ip_label(*(i_tmp + i_num), i_utmp2)) ++ return ERR_PTR(-EFAULT); ++ ++ if ((*(i_tmp + i_num))->iface == NULL) ++ continue; ++ ++ err = alloc_and_copy_string(&(*(i_tmp + i_num))->iface, IFNAMSIZ); ++ if (err) ++ return ERR_PTR(err); ++ } ++ ++ s_tmp->ips = i_tmp; ++ ++insert: ++ if (!insert_name_entry(s_tmp->filename, s_tmp->inode, ++ s_tmp->device, (s_tmp->mode & GR_DELETED) ? 1 : 0)) ++ return ERR_PTR(-ENOMEM); ++ ++ return s_tmp; ++} ++ ++static int ++copy_user_subjs(struct acl_subject_label *userp, struct acl_role_label *role) ++{ ++ struct acl_subject_label s_pre; ++ struct acl_subject_label * ret; ++ int err; ++ ++ while (userp) { ++ if (copy_acl_subject_label(&s_pre, userp)) ++ return -EFAULT; ++ ++ ret = do_copy_user_subj(userp, role, NULL); ++ ++ err = PTR_ERR(ret); ++ if (IS_ERR(ret)) ++ return err; ++ ++ insert_acl_subj_label(ret, role); ++ ++ userp = s_pre.prev; ++ } ++ ++ return 0; ++} ++ ++static int ++copy_user_acl(struct gr_arg *arg) ++{ ++ struct acl_role_label *r_tmp = NULL, **r_utmp, *r_utmp2; ++ struct acl_subject_label *subj_list; ++ struct sprole_pw *sptmp; ++ struct gr_hash_struct *ghash; ++ uid_t *domainlist; ++ unsigned int r_num; ++ int err = 0; ++ __u16 i; ++ __u32 num_subjs; ++ ++ /* we need a default and kernel role */ ++ if (arg->role_db.num_roles < 2) ++ return -EINVAL; ++ ++ /* copy special role authentication info from userspace */ ++ ++ polstate->num_sprole_pws = arg->num_sprole_pws; ++ polstate->acl_special_roles = (struct sprole_pw **) acl_alloc_num(polstate->num_sprole_pws, sizeof(struct sprole_pw *)); ++ ++ if (!polstate->acl_special_roles && polstate->num_sprole_pws) ++ return -ENOMEM; ++ ++ for (i = 0; i < polstate->num_sprole_pws; i++) { ++ sptmp = (struct sprole_pw *) acl_alloc(sizeof(struct sprole_pw)); ++ if (!sptmp) ++ return -ENOMEM; ++ if (copy_sprole_pw(sptmp, i, arg->sprole_pws)) ++ return -EFAULT; ++ ++ err = alloc_and_copy_string((char **)&sptmp->rolename, GR_SPROLE_LEN); ++ if (err) ++ return err; ++ ++#ifdef CONFIG_GRKERNSEC_RBAC_DEBUG ++ printk(KERN_ALERT "Copying special role %s\n", sptmp->rolename); ++#endif ++ ++ polstate->acl_special_roles[i] = sptmp; ++ } ++ ++ r_utmp = (struct acl_role_label **) arg->role_db.r_table; ++ ++ for (r_num = 0; r_num < arg->role_db.num_roles; r_num++) { ++ r_tmp = acl_alloc(sizeof (struct acl_role_label)); ++ ++ if (!r_tmp) ++ return -ENOMEM; ++ ++ if (copy_pointer_from_array(&r_utmp2, r_num, r_utmp)) ++ return -EFAULT; ++ ++ if (copy_acl_role_label(r_tmp, r_utmp2)) ++ return -EFAULT; ++ ++ err = alloc_and_copy_string(&r_tmp->rolename, GR_SPROLE_LEN); ++ if (err) ++ return err; ++ ++ if (!strcmp(r_tmp->rolename, "default") ++ && (r_tmp->roletype & GR_ROLE_DEFAULT)) { ++ polstate->default_role = r_tmp; ++ } else if (!strcmp(r_tmp->rolename, ":::kernel:::")) { ++ polstate->kernel_role = r_tmp; ++ } ++ ++ if ((ghash = (struct gr_hash_struct *) acl_alloc(sizeof(struct gr_hash_struct))) == NULL) ++ return -ENOMEM; ++ ++ if (copy_gr_hash_struct(ghash, r_tmp->hash)) ++ return -EFAULT; ++ ++ r_tmp->hash = ghash; ++ ++ num_subjs = count_user_subjs(r_tmp->hash->first); ++ ++ r_tmp->subj_hash_size = num_subjs; ++ r_tmp->subj_hash = ++ (struct acl_subject_label **) ++ create_table(&(r_tmp->subj_hash_size), sizeof(void *)); ++ ++ if (!r_tmp->subj_hash) ++ return -ENOMEM; ++ ++ err = copy_user_allowedips(r_tmp); ++ if (err) ++ return err; ++ ++ /* copy domain info */ ++ if (r_tmp->domain_children != NULL) { ++ domainlist = acl_alloc_num(r_tmp->domain_child_num, sizeof(uid_t)); ++ if (domainlist == NULL) ++ return -ENOMEM; ++ ++ if (copy_from_user(domainlist, r_tmp->domain_children, r_tmp->domain_child_num * sizeof(uid_t))) ++ return -EFAULT; ++ ++ r_tmp->domain_children = domainlist; ++ } ++ ++ err = copy_user_transitions(r_tmp); ++ if (err) ++ return err; ++ ++ memset(r_tmp->subj_hash, 0, ++ r_tmp->subj_hash_size * ++ sizeof (struct acl_subject_label *)); ++ ++ /* acquire the list of subjects, then NULL out ++ the list prior to parsing the subjects for this role, ++ as during this parsing the list is replaced with a list ++ of *nested* subjects for the role ++ */ ++ subj_list = r_tmp->hash->first; ++ ++ /* set nested subject list to null */ ++ r_tmp->hash->first = NULL; ++ ++ err = copy_user_subjs(subj_list, r_tmp); ++ ++ if (err) ++ return err; ++ ++ insert_acl_role_label(r_tmp); ++ } ++ ++ if (polstate->default_role == NULL || polstate->kernel_role == NULL) ++ return -EINVAL; ++ ++ return err; ++} ++ ++static int gracl_reload_apply_policies(void *reload) ++{ ++ struct gr_reload_state *reload_state = (struct gr_reload_state *)reload; ++ struct task_struct *task, *task2; ++ struct acl_role_label *role, *rtmp; ++ struct acl_subject_label *subj; ++ const struct cred *cred; ++ int role_applied; ++ int ret = 0; ++ ++ memcpy(&reload_state->oldpolicy, reload_state->oldpolicy_ptr, sizeof(struct gr_policy_state)); ++ memcpy(&reload_state->oldalloc, reload_state->oldalloc_ptr, sizeof(struct gr_alloc_state)); ++ ++ /* first make sure we'll be able to apply the new policy cleanly */ ++ do_each_thread(task2, task) { ++ if (task->exec_file == NULL) ++ continue; ++ role_applied = 0; ++ if (!reload_state->oldmode && task->role->roletype & GR_ROLE_SPECIAL) { ++ /* preserve special roles */ ++ FOR_EACH_ROLE_START(role) ++ if ((role->roletype & GR_ROLE_SPECIAL) && !strcmp(task->role->rolename, role->rolename)) { ++ rtmp = task->role; ++ task->role = role; ++ role_applied = 1; ++ break; ++ } ++ FOR_EACH_ROLE_END(role) ++ } ++ if (!role_applied) { ++ cred = __task_cred(task); ++ rtmp = task->role; ++ task->role = __lookup_acl_role_label(polstate, task, GR_GLOBAL_UID(cred->uid), GR_GLOBAL_GID(cred->gid)); ++ } ++ /* this handles non-nested inherited subjects, nested subjects will still ++ be dropped currently */ ++ subj = __gr_get_subject_for_task(polstate, task, task->acl->filename, 1); ++ task->tmpacl = __gr_get_subject_for_task(polstate, task, NULL, 1); ++ /* change the role back so that we've made no modifications to the policy */ ++ task->role = rtmp; ++ ++ if (subj == NULL || task->tmpacl == NULL) { ++ ret = -EINVAL; ++ goto out; ++ } ++ } while_each_thread(task2, task); ++ ++ /* now actually apply the policy */ ++ ++ do_each_thread(task2, task) { ++ if (task->exec_file) { ++ role_applied = 0; ++ if (!reload_state->oldmode && task->role->roletype & GR_ROLE_SPECIAL) { ++ /* preserve special roles */ ++ FOR_EACH_ROLE_START(role) ++ if ((role->roletype & GR_ROLE_SPECIAL) && !strcmp(task->role->rolename, role->rolename)) { ++ task->role = role; ++ role_applied = 1; ++ break; ++ } ++ FOR_EACH_ROLE_END(role) ++ } ++ if (!role_applied) { ++ cred = __task_cred(task); ++ task->role = __lookup_acl_role_label(polstate, task, GR_GLOBAL_UID(cred->uid), GR_GLOBAL_GID(cred->gid)); ++ } ++ /* this handles non-nested inherited subjects, nested subjects will still ++ be dropped currently */ ++ if (!reload_state->oldmode && task->inherited) ++ subj = __gr_get_subject_for_task(polstate, task, task->acl->filename, 1); ++ else { ++ /* looked up and tagged to the task previously */ ++ subj = task->tmpacl; ++ } ++ /* subj will be non-null */ ++ __gr_apply_subject_to_task(polstate, task, subj); ++ if (reload_state->oldmode) { ++ task->acl_role_id = 0; ++ task->acl_sp_role = 0; ++ task->inherited = 0; ++ } ++ } else { ++ // it's a kernel process ++ task->role = polstate->kernel_role; ++ task->acl = polstate->kernel_role->root_label; ++#ifdef CONFIG_GRKERNSEC_ACL_HIDEKERN ++ task->acl->mode &= ~GR_PROCFIND; ++#endif ++ } ++ } while_each_thread(task2, task); ++ ++ memcpy(reload_state->oldpolicy_ptr, &reload_state->newpolicy, sizeof(struct gr_policy_state)); ++ memcpy(reload_state->oldalloc_ptr, &reload_state->newalloc, sizeof(struct gr_alloc_state)); ++ ++out: ++ ++ return ret; ++} ++ ++static int gracl_reload(struct gr_arg *args, unsigned char oldmode) ++{ ++ struct gr_reload_state new_reload_state = { }; ++ int err; ++ ++ new_reload_state.oldpolicy_ptr = polstate; ++ new_reload_state.oldalloc_ptr = current_alloc_state; ++ new_reload_state.oldmode = oldmode; ++ ++ current_alloc_state = &new_reload_state.newalloc; ++ polstate = &new_reload_state.newpolicy; ++ ++ /* everything relevant is now saved off, copy in the new policy */ ++ if (init_variables(args, true)) { ++ gr_log_str(GR_DONT_AUDIT_GOOD, GR_INITF_ACL_MSG, GR_VERSION); ++ err = -ENOMEM; ++ goto error; ++ } ++ ++ err = copy_user_acl(args); ++ free_init_variables(); ++ if (err) ++ goto error; ++ /* the new policy is copied in, with the old policy available via saved_state ++ first go through applying roles, making sure to preserve special roles ++ then apply new subjects, making sure to preserve inherited and nested subjects, ++ though currently only inherited subjects will be preserved ++ */ ++ err = stop_machine(gracl_reload_apply_policies, &new_reload_state, NULL); ++ if (err) ++ goto error; ++ ++ /* we've now applied the new policy, so restore the old policy state to free it */ ++ polstate = &new_reload_state.oldpolicy; ++ current_alloc_state = &new_reload_state.oldalloc; ++ free_variables(true); ++ ++ /* oldpolicy/oldalloc_ptr point to the new policy/alloc states as they were copied ++ to running_polstate/current_alloc_state inside stop_machine ++ */ ++ err = 0; ++ goto out; ++error: ++ /* on error of loading the new policy, we'll just keep the previous ++ policy set around ++ */ ++ free_variables(true); ++ ++ /* doesn't affect runtime, but maintains consistent state */ ++out: ++ polstate = new_reload_state.oldpolicy_ptr; ++ current_alloc_state = new_reload_state.oldalloc_ptr; ++ ++ return err; ++} ++ ++static int ++gracl_init(struct gr_arg *args) ++{ ++ int error = 0; ++ ++ memcpy(gr_system_salt, args->salt, GR_SALT_LEN); ++ memcpy(gr_system_sum, args->sum, GR_SHA_LEN); ++ ++ if (init_variables(args, false)) { ++ gr_log_str(GR_DONT_AUDIT_GOOD, GR_INITF_ACL_MSG, GR_VERSION); ++ error = -ENOMEM; ++ goto out; ++ } ++ ++ error = copy_user_acl(args); ++ free_init_variables(); ++ if (error) ++ goto out; ++ ++ error = gr_set_acls(0); ++ if (error) ++ goto out; ++ ++ gr_enable_rbac_system(); ++ ++ return 0; ++ ++out: ++ free_variables(false); ++ return error; ++} ++ ++static int ++lookup_special_role_auth(__u16 mode, const char *rolename, unsigned char **salt, ++ unsigned char **sum) ++{ ++ struct acl_role_label *r; ++ struct role_allowed_ip *ipp; ++ struct role_transition *trans; ++ unsigned int i; ++ int found = 0; ++ u32 curr_ip = current->signal->curr_ip; ++ ++ current->signal->saved_ip = curr_ip; ++ ++ /* check transition table */ ++ ++ for (trans = current->role->transitions; trans; trans = trans->next) { ++ if (!strcmp(rolename, trans->rolename)) { ++ found = 1; ++ break; ++ } ++ } ++ ++ if (!found) ++ return 0; ++ ++ /* handle special roles that do not require authentication ++ and check ip */ ++ ++ FOR_EACH_ROLE_START(r) ++ if (!strcmp(rolename, r->rolename) && ++ (r->roletype & GR_ROLE_SPECIAL)) { ++ found = 0; ++ if (r->allowed_ips != NULL) { ++ for (ipp = r->allowed_ips; ipp; ipp = ipp->next) { ++ if ((ntohl(curr_ip) & ipp->netmask) == ++ (ntohl(ipp->addr) & ipp->netmask)) ++ found = 1; ++ } ++ } else ++ found = 2; ++ if (!found) ++ return 0; ++ ++ if (((mode == GR_SPROLE) && (r->roletype & GR_ROLE_NOPW)) || ++ ((mode == GR_SPROLEPAM) && (r->roletype & GR_ROLE_PAM))) { ++ *salt = NULL; ++ *sum = NULL; ++ return 1; ++ } ++ } ++ FOR_EACH_ROLE_END(r) ++ ++ for (i = 0; i < polstate->num_sprole_pws; i++) { ++ if (!strcmp(rolename, polstate->acl_special_roles[i]->rolename)) { ++ *salt = polstate->acl_special_roles[i]->salt; ++ *sum = polstate->acl_special_roles[i]->sum; ++ return 1; ++ } ++ } ++ ++ return 0; ++} ++ ++int gr_check_secure_terminal(struct task_struct *task) ++{ ++ struct task_struct *p, *p2, *p3; ++ struct files_struct *files; ++ struct fdtable *fdt; ++ struct file *our_file = NULL, *file; ++ int i; ++ ++ if (task->signal->tty == NULL) ++ return 1; ++ ++ files = get_files_struct(task); ++ if (files != NULL) { ++ rcu_read_lock(); ++ fdt = files_fdtable(files); ++ for (i=0; i < fdt->max_fds; i++) { ++ file = fcheck_files(files, i); ++ if (file && (our_file == NULL) && (file->private_data == task->signal->tty)) { ++ get_file(file); ++ our_file = file; ++ } ++ } ++ rcu_read_unlock(); ++ put_files_struct(files); ++ } ++ ++ if (our_file == NULL) ++ return 1; ++ ++ read_lock(&tasklist_lock); ++ do_each_thread(p2, p) { ++ files = get_files_struct(p); ++ if (files == NULL || ++ (p->signal && p->signal->tty == task->signal->tty)) { ++ if (files != NULL) ++ put_files_struct(files); ++ continue; ++ } ++ rcu_read_lock(); ++ fdt = files_fdtable(files); ++ for (i=0; i < fdt->max_fds; i++) { ++ file = fcheck_files(files, i); ++ if (file && S_ISCHR(file->f_path.dentry->d_inode->i_mode) && ++ file->f_path.dentry->d_inode->i_rdev == our_file->f_path.dentry->d_inode->i_rdev) { ++ p3 = task; ++ while (task_pid_nr(p3) > 0) { ++ if (p3 == p) ++ break; ++ p3 = p3->real_parent; ++ } ++ if (p3 == p) ++ break; ++ gr_log_ttysniff(GR_DONT_AUDIT_GOOD, GR_TTYSNIFF_ACL_MSG, p); ++ gr_handle_alertkill(p); ++ rcu_read_unlock(); ++ put_files_struct(files); ++ read_unlock(&tasklist_lock); ++ fput(our_file); ++ return 0; ++ } ++ } ++ rcu_read_unlock(); ++ put_files_struct(files); ++ } while_each_thread(p2, p); ++ read_unlock(&tasklist_lock); ++ ++ fput(our_file); ++ return 1; ++} ++ ++ssize_t ++write_grsec_handler(struct file *file, const char __user * buf, size_t count, loff_t *ppos) ++{ ++ struct gr_arg_wrapper uwrap; ++ unsigned char *sprole_salt = NULL; ++ unsigned char *sprole_sum = NULL; ++ int error = 0; ++ int error2 = 0; ++ size_t req_count = 0; ++ unsigned char oldmode = 0; ++ ++ mutex_lock(&gr_dev_mutex); ++ ++ if (gr_acl_is_enabled() && !(current->acl->mode & GR_KERNELAUTH)) { ++ error = -EPERM; ++ goto out; ++ } ++ ++#ifdef CONFIG_COMPAT ++ pax_open_kernel(); ++ if (is_compat_task()) { ++ copy_gr_arg_wrapper = ©_gr_arg_wrapper_compat; ++ copy_gr_arg = ©_gr_arg_compat; ++ copy_acl_object_label = ©_acl_object_label_compat; ++ copy_acl_subject_label = ©_acl_subject_label_compat; ++ copy_acl_role_label = ©_acl_role_label_compat; ++ copy_acl_ip_label = ©_acl_ip_label_compat; ++ copy_role_allowed_ip = ©_role_allowed_ip_compat; ++ copy_role_transition = ©_role_transition_compat; ++ copy_sprole_pw = ©_sprole_pw_compat; ++ copy_gr_hash_struct = ©_gr_hash_struct_compat; ++ copy_pointer_from_array = ©_pointer_from_array_compat; ++ get_gr_arg_wrapper_size = &get_gr_arg_wrapper_size_compat; ++ } else { ++ copy_gr_arg_wrapper = ©_gr_arg_wrapper_normal; ++ copy_gr_arg = ©_gr_arg_normal; ++ copy_acl_object_label = ©_acl_object_label_normal; ++ copy_acl_subject_label = ©_acl_subject_label_normal; ++ copy_acl_role_label = ©_acl_role_label_normal; ++ copy_acl_ip_label = ©_acl_ip_label_normal; ++ copy_role_allowed_ip = ©_role_allowed_ip_normal; ++ copy_role_transition = ©_role_transition_normal; ++ copy_sprole_pw = ©_sprole_pw_normal; ++ copy_gr_hash_struct = ©_gr_hash_struct_normal; ++ copy_pointer_from_array = ©_pointer_from_array_normal; ++ get_gr_arg_wrapper_size = &get_gr_arg_wrapper_size_normal; ++ } ++ pax_close_kernel(); ++#endif ++ ++ req_count = get_gr_arg_wrapper_size(); ++ ++ if (count != req_count) { ++ gr_log_int_int(GR_DONT_AUDIT_GOOD, GR_DEV_ACL_MSG, (int)count, (int)req_count); ++ error = -EINVAL; ++ goto out; ++ } ++ ++ ++ if (gr_auth_expires && time_after_eq(get_seconds(), gr_auth_expires)) { ++ gr_auth_expires = 0; ++ gr_auth_attempts = 0; ++ } ++ ++ error = copy_gr_arg_wrapper(buf, &uwrap); ++ if (error) ++ goto out; ++ ++ error = copy_gr_arg(uwrap.arg, gr_usermode); ++ if (error) ++ goto out; ++ ++ if (gr_usermode->mode != GR_SPROLE && gr_usermode->mode != GR_SPROLEPAM && ++ gr_auth_attempts >= CONFIG_GRKERNSEC_ACL_MAXTRIES && ++ time_after(gr_auth_expires, get_seconds())) { ++ error = -EBUSY; ++ goto out; ++ } ++ ++ /* if non-root trying to do anything other than use a special role, ++ do not attempt authentication, do not count towards authentication ++ locking ++ */ ++ ++ if (gr_usermode->mode != GR_SPROLE && gr_usermode->mode != GR_STATUS && ++ gr_usermode->mode != GR_UNSPROLE && gr_usermode->mode != GR_SPROLEPAM && ++ gr_is_global_nonroot(current_uid())) { ++ error = -EPERM; ++ goto out; ++ } ++ ++ /* ensure pw and special role name are null terminated */ ++ ++ gr_usermode->pw[GR_PW_LEN - 1] = '\0'; ++ gr_usermode->sp_role[GR_SPROLE_LEN - 1] = '\0'; ++ ++ /* Okay. ++ * We have our enough of the argument structure..(we have yet ++ * to copy_from_user the tables themselves) . Copy the tables ++ * only if we need them, i.e. for loading operations. */ ++ ++ switch (gr_usermode->mode) { ++ case GR_STATUS: ++ if (gr_acl_is_enabled()) { ++ error = 1; ++ if (!gr_check_secure_terminal(current)) ++ error = 3; ++ } else ++ error = 2; ++ goto out; ++ case GR_SHUTDOWN: ++ if (gr_acl_is_enabled() && !(chkpw(gr_usermode, gr_system_salt, gr_system_sum))) { ++ stop_machine(gr_rbac_disable, NULL, NULL); ++ free_variables(false); ++ memset(gr_usermode, 0, sizeof(struct gr_arg)); ++ memset(gr_system_salt, 0, GR_SALT_LEN); ++ memset(gr_system_sum, 0, GR_SHA_LEN); ++ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_SHUTS_ACL_MSG); ++ } else if (gr_acl_is_enabled()) { ++ gr_log_noargs(GR_DONT_AUDIT, GR_SHUTF_ACL_MSG); ++ error = -EPERM; ++ } else { ++ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_SHUTI_ACL_MSG); ++ error = -EAGAIN; ++ } ++ break; ++ case GR_ENABLE: ++ if (!gr_acl_is_enabled() && !(error2 = gracl_init(gr_usermode))) ++ gr_log_str(GR_DONT_AUDIT_GOOD, GR_ENABLE_ACL_MSG, GR_VERSION); ++ else { ++ if (gr_acl_is_enabled()) ++ error = -EAGAIN; ++ else ++ error = error2; ++ gr_log_str(GR_DONT_AUDIT, GR_ENABLEF_ACL_MSG, GR_VERSION); ++ } ++ break; ++ case GR_OLDRELOAD: ++ oldmode = 1; ++ case GR_RELOAD: ++ if (!gr_acl_is_enabled()) { ++ gr_log_str(GR_DONT_AUDIT_GOOD, GR_RELOADI_ACL_MSG, GR_VERSION); ++ error = -EAGAIN; ++ } else if (!(chkpw(gr_usermode, gr_system_salt, gr_system_sum))) { ++ error2 = gracl_reload(gr_usermode, oldmode); ++ if (!error2) ++ gr_log_str(GR_DONT_AUDIT_GOOD, GR_RELOAD_ACL_MSG, GR_VERSION); ++ else { ++ gr_log_str(GR_DONT_AUDIT, GR_RELOADF_ACL_MSG, GR_VERSION); ++ error = error2; ++ } ++ } else { ++ gr_log_str(GR_DONT_AUDIT, GR_RELOADF_ACL_MSG, GR_VERSION); ++ error = -EPERM; ++ } ++ break; ++ case GR_SEGVMOD: ++ if (unlikely(!gr_acl_is_enabled())) { ++ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_SEGVMODI_ACL_MSG); ++ error = -EAGAIN; ++ break; ++ } ++ ++ if (!(chkpw(gr_usermode, gr_system_salt, gr_system_sum))) { ++ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_SEGVMODS_ACL_MSG); ++ if (gr_usermode->segv_device && gr_usermode->segv_inode) { ++ struct acl_subject_label *segvacl; ++ segvacl = ++ lookup_acl_subj_label(gr_usermode->segv_inode, ++ gr_usermode->segv_device, ++ current->role); ++ if (segvacl) { ++ segvacl->crashes = 0; ++ segvacl->expires = 0; ++ } ++ } else if (gr_find_uid(gr_usermode->segv_uid) >= 0) { ++ gr_remove_uid(gr_usermode->segv_uid); ++ } ++ } else { ++ gr_log_noargs(GR_DONT_AUDIT, GR_SEGVMODF_ACL_MSG); ++ error = -EPERM; ++ } ++ break; ++ case GR_SPROLE: ++ case GR_SPROLEPAM: ++ if (unlikely(!gr_acl_is_enabled())) { ++ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_SPROLEI_ACL_MSG); ++ error = -EAGAIN; ++ break; ++ } ++ ++ if (current->role->expires && time_after_eq(get_seconds(), current->role->expires)) { ++ current->role->expires = 0; ++ current->role->auth_attempts = 0; ++ } ++ ++ if (current->role->auth_attempts >= CONFIG_GRKERNSEC_ACL_MAXTRIES && ++ time_after(current->role->expires, get_seconds())) { ++ error = -EBUSY; ++ goto out; ++ } ++ ++ if (lookup_special_role_auth ++ (gr_usermode->mode, gr_usermode->sp_role, &sprole_salt, &sprole_sum) ++ && ((!sprole_salt && !sprole_sum) ++ || !(chkpw(gr_usermode, sprole_salt, sprole_sum)))) { ++ char *p = ""; ++ assign_special_role(gr_usermode->sp_role); ++ read_lock(&tasklist_lock); ++ if (current->real_parent) ++ p = current->real_parent->role->rolename; ++ read_unlock(&tasklist_lock); ++ gr_log_str_int(GR_DONT_AUDIT_GOOD, GR_SPROLES_ACL_MSG, ++ p, acl_sp_role_value); ++ } else { ++ gr_log_str(GR_DONT_AUDIT, GR_SPROLEF_ACL_MSG, gr_usermode->sp_role); ++ error = -EPERM; ++ if(!(current->role->auth_attempts++)) ++ current->role->expires = get_seconds() + CONFIG_GRKERNSEC_ACL_TIMEOUT; ++ ++ goto out; ++ } ++ break; ++ case GR_UNSPROLE: ++ if (unlikely(!gr_acl_is_enabled())) { ++ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_UNSPROLEI_ACL_MSG); ++ error = -EAGAIN; ++ break; ++ } ++ ++ if (current->role->roletype & GR_ROLE_SPECIAL) { ++ char *p = ""; ++ int i = 0; ++ ++ read_lock(&tasklist_lock); ++ if (current->real_parent) { ++ p = current->real_parent->role->rolename; ++ i = current->real_parent->acl_role_id; ++ } ++ read_unlock(&tasklist_lock); ++ ++ gr_log_str_int(GR_DONT_AUDIT_GOOD, GR_UNSPROLES_ACL_MSG, p, i); ++ gr_set_acls(1); ++ } else { ++ error = -EPERM; ++ goto out; ++ } ++ break; ++ default: ++ gr_log_int(GR_DONT_AUDIT, GR_INVMODE_ACL_MSG, gr_usermode->mode); ++ error = -EINVAL; ++ break; ++ } ++ ++ if (error != -EPERM) ++ goto out; ++ ++ if(!(gr_auth_attempts++)) ++ gr_auth_expires = get_seconds() + CONFIG_GRKERNSEC_ACL_TIMEOUT; ++ ++ out: ++ mutex_unlock(&gr_dev_mutex); ++ ++ if (!error) ++ error = req_count; ++ ++ return error; ++} ++ ++int ++gr_set_acls(const int type) ++{ ++ struct task_struct *task, *task2; ++ struct acl_role_label *role = current->role; ++ struct acl_subject_label *subj; ++ __u16 acl_role_id = current->acl_role_id; ++ const struct cred *cred; ++ int ret; ++ ++ rcu_read_lock(); ++ read_lock(&tasklist_lock); ++ read_lock(&grsec_exec_file_lock); ++ do_each_thread(task2, task) { ++ /* check to see if we're called from the exit handler, ++ if so, only replace ACLs that have inherited the admin ++ ACL */ ++ ++ if (type && (task->role != role || ++ task->acl_role_id != acl_role_id)) ++ continue; ++ ++ task->acl_role_id = 0; ++ task->acl_sp_role = 0; ++ task->inherited = 0; ++ ++ if (task->exec_file) { ++ cred = __task_cred(task); ++ task->role = __lookup_acl_role_label(polstate, task, GR_GLOBAL_UID(cred->uid), GR_GLOBAL_GID(cred->gid)); ++ subj = __gr_get_subject_for_task(polstate, task, NULL, 1); ++ if (subj == NULL) { ++ ret = -EINVAL; ++ read_unlock(&grsec_exec_file_lock); ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ gr_log_str_int(GR_DONT_AUDIT_GOOD, GR_DEFACL_MSG, task->comm, task_pid_nr(task)); ++ return ret; ++ } ++ __gr_apply_subject_to_task(polstate, task, subj); ++ } else { ++ // it's a kernel process ++ task->role = polstate->kernel_role; ++ task->acl = polstate->kernel_role->root_label; ++#ifdef CONFIG_GRKERNSEC_ACL_HIDEKERN ++ task->acl->mode &= ~GR_PROCFIND; ++#endif ++ } ++ } while_each_thread(task2, task); ++ read_unlock(&grsec_exec_file_lock); ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ ++ return 0; ++} +diff --git a/grsecurity/gracl_res.c b/grsecurity/gracl_res.c +new file mode 100644 +index 0000000..39645c9 +--- /dev/null ++++ b/grsecurity/gracl_res.c +@@ -0,0 +1,68 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/gracl.h> ++#include <linux/grinternal.h> ++ ++static const char *restab_log[] = { ++ [RLIMIT_CPU] = "RLIMIT_CPU", ++ [RLIMIT_FSIZE] = "RLIMIT_FSIZE", ++ [RLIMIT_DATA] = "RLIMIT_DATA", ++ [RLIMIT_STACK] = "RLIMIT_STACK", ++ [RLIMIT_CORE] = "RLIMIT_CORE", ++ [RLIMIT_RSS] = "RLIMIT_RSS", ++ [RLIMIT_NPROC] = "RLIMIT_NPROC", ++ [RLIMIT_NOFILE] = "RLIMIT_NOFILE", ++ [RLIMIT_MEMLOCK] = "RLIMIT_MEMLOCK", ++ [RLIMIT_AS] = "RLIMIT_AS", ++ [RLIMIT_LOCKS] = "RLIMIT_LOCKS", ++ [RLIMIT_SIGPENDING] = "RLIMIT_SIGPENDING", ++ [RLIMIT_MSGQUEUE] = "RLIMIT_MSGQUEUE", ++ [RLIMIT_NICE] = "RLIMIT_NICE", ++ [RLIMIT_RTPRIO] = "RLIMIT_RTPRIO", ++ [RLIMIT_RTTIME] = "RLIMIT_RTTIME", ++ [GR_CRASH_RES] = "RLIMIT_CRASH" ++}; ++ ++void ++gr_log_resource(const struct task_struct *task, ++ const int res, const unsigned long wanted, const int gt) ++{ ++ const struct cred *cred; ++ unsigned long rlim; ++ ++ if (!gr_acl_is_enabled() && !grsec_resource_logging) ++ return; ++ ++ // not yet supported resource ++ if (unlikely(!restab_log[res])) ++ return; ++ ++ if (res == RLIMIT_CPU || res == RLIMIT_RTTIME) ++ rlim = task_rlimit_max(task, res); ++ else ++ rlim = task_rlimit(task, res); ++ ++ if (likely((rlim == RLIM_INFINITY) || (gt && wanted <= rlim) || (!gt && wanted < rlim))) ++ return; ++ ++ rcu_read_lock(); ++ cred = __task_cred(task); ++ ++ if (res == RLIMIT_NPROC && ++ (cap_raised(cred->cap_effective, CAP_SYS_ADMIN) || ++ cap_raised(cred->cap_effective, CAP_SYS_RESOURCE))) ++ goto out_rcu_unlock; ++ else if (res == RLIMIT_MEMLOCK && ++ cap_raised(cred->cap_effective, CAP_IPC_LOCK)) ++ goto out_rcu_unlock; ++ else if (res == RLIMIT_NICE && cap_raised(cred->cap_effective, CAP_SYS_NICE)) ++ goto out_rcu_unlock; ++ rcu_read_unlock(); ++ ++ gr_log_res_ulong2_str(GR_DONT_AUDIT, GR_RESOURCE_MSG, task, wanted, restab_log[res], rlim); ++ ++ return; ++out_rcu_unlock: ++ rcu_read_unlock(); ++ return; ++} +diff --git a/grsecurity/gracl_segv.c b/grsecurity/gracl_segv.c +new file mode 100644 +index 0000000..218b66b +--- /dev/null ++++ b/grsecurity/gracl_segv.c +@@ -0,0 +1,324 @@ ++#include <linux/kernel.h> ++#include <linux/mm.h> ++#include <asm/uaccess.h> ++#include <asm/errno.h> ++#include <asm/mman.h> ++#include <net/sock.h> ++#include <linux/file.h> ++#include <linux/fs.h> ++#include <linux/net.h> ++#include <linux/in.h> ++#include <linux/slab.h> ++#include <linux/types.h> ++#include <linux/sched.h> ++#include <linux/timer.h> ++#include <linux/gracl.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++#if defined(CONFIG_BTRFS_FS) || defined(CONFIG_BTRFS_FS_MODULE) ++#include <linux/magic.h> ++#include <linux/pagemap.h> ++#include "../fs/btrfs/async-thread.h" ++#include "../fs/btrfs/ctree.h" ++#include "../fs/btrfs/btrfs_inode.h" ++#endif ++ ++static struct crash_uid *uid_set; ++static unsigned short uid_used; ++static DEFINE_SPINLOCK(gr_uid_lock); ++extern rwlock_t gr_inode_lock; ++extern struct acl_subject_label * ++ lookup_acl_subj_label(const u64 inode, const dev_t dev, ++ struct acl_role_label *role); ++ ++static inline dev_t __get_dev(const struct dentry *dentry) ++{ ++#if defined(CONFIG_BTRFS_FS) || defined(CONFIG_BTRFS_FS_MODULE) ++ if (dentry->d_sb->s_magic == BTRFS_SUPER_MAGIC) ++ return BTRFS_I(dentry->d_inode)->root->anon_dev; ++ else ++#endif ++ return dentry->d_sb->s_dev; ++} ++ ++static inline u64 __get_ino(const struct dentry *dentry) ++{ ++#if defined(CONFIG_BTRFS_FS) || defined(CONFIG_BTRFS_FS_MODULE) ++ if (dentry->d_sb->s_magic == BTRFS_SUPER_MAGIC) ++ return btrfs_ino(dentry->d_inode); ++ else ++#endif ++ return dentry->d_inode->i_ino; ++} ++ ++int ++gr_init_uidset(void) ++{ ++ uid_set = ++ kmalloc(GR_UIDTABLE_MAX * sizeof (struct crash_uid), GFP_KERNEL); ++ uid_used = 0; ++ ++ return uid_set ? 1 : 0; ++} ++ ++void ++gr_free_uidset(void) ++{ ++ if (uid_set) { ++ struct crash_uid *tmpset; ++ spin_lock(&gr_uid_lock); ++ tmpset = uid_set; ++ uid_set = NULL; ++ uid_used = 0; ++ spin_unlock(&gr_uid_lock); ++ if (tmpset) ++ kfree(tmpset); ++ } ++ ++ return; ++} ++ ++int ++gr_find_uid(const uid_t uid) ++{ ++ struct crash_uid *tmp = uid_set; ++ uid_t buid; ++ int low = 0, high = uid_used - 1, mid; ++ ++ while (high >= low) { ++ mid = (low + high) >> 1; ++ buid = tmp[mid].uid; ++ if (buid == uid) ++ return mid; ++ if (buid > uid) ++ high = mid - 1; ++ if (buid < uid) ++ low = mid + 1; ++ } ++ ++ return -1; ++} ++ ++static __inline__ void ++gr_insertsort(void) ++{ ++ unsigned short i, j; ++ struct crash_uid index; ++ ++ for (i = 1; i < uid_used; i++) { ++ index = uid_set[i]; ++ j = i; ++ while ((j > 0) && uid_set[j - 1].uid > index.uid) { ++ uid_set[j] = uid_set[j - 1]; ++ j--; ++ } ++ uid_set[j] = index; ++ } ++ ++ return; ++} ++ ++static __inline__ void ++gr_insert_uid(const kuid_t kuid, const unsigned long expires) ++{ ++ int loc; ++ uid_t uid = GR_GLOBAL_UID(kuid); ++ ++ if (uid_used == GR_UIDTABLE_MAX) ++ return; ++ ++ loc = gr_find_uid(uid); ++ ++ if (loc >= 0) { ++ uid_set[loc].expires = expires; ++ return; ++ } ++ ++ uid_set[uid_used].uid = uid; ++ uid_set[uid_used].expires = expires; ++ uid_used++; ++ ++ gr_insertsort(); ++ ++ return; ++} ++ ++void ++gr_remove_uid(const unsigned short loc) ++{ ++ unsigned short i; ++ ++ for (i = loc + 1; i < uid_used; i++) ++ uid_set[i - 1] = uid_set[i]; ++ ++ uid_used--; ++ ++ return; ++} ++ ++int ++gr_check_crash_uid(const kuid_t kuid) ++{ ++ int loc; ++ int ret = 0; ++ uid_t uid; ++ ++ if (unlikely(!gr_acl_is_enabled())) ++ return 0; ++ ++ uid = GR_GLOBAL_UID(kuid); ++ ++ spin_lock(&gr_uid_lock); ++ loc = gr_find_uid(uid); ++ ++ if (loc < 0) ++ goto out_unlock; ++ ++ if (time_before_eq(uid_set[loc].expires, get_seconds())) ++ gr_remove_uid(loc); ++ else ++ ret = 1; ++ ++out_unlock: ++ spin_unlock(&gr_uid_lock); ++ return ret; ++} ++ ++static __inline__ int ++proc_is_setxid(const struct cred *cred) ++{ ++ if (!uid_eq(cred->uid, cred->euid) || !uid_eq(cred->uid, cred->suid) || ++ !uid_eq(cred->uid, cred->fsuid)) ++ return 1; ++ if (!gid_eq(cred->gid, cred->egid) || !gid_eq(cred->gid, cred->sgid) || ++ !gid_eq(cred->gid, cred->fsgid)) ++ return 1; ++ ++ return 0; ++} ++ ++extern int gr_fake_force_sig(int sig, struct task_struct *t); ++ ++void ++gr_handle_crash(struct task_struct *task, const int sig) ++{ ++ struct acl_subject_label *curr; ++ struct task_struct *tsk, *tsk2; ++ const struct cred *cred; ++ const struct cred *cred2; ++ ++ if (sig != SIGSEGV && sig != SIGKILL && sig != SIGBUS && sig != SIGILL) ++ return; ++ ++ if (unlikely(!gr_acl_is_enabled())) ++ return; ++ ++ curr = task->acl; ++ ++ if (!(curr->resmask & (1U << GR_CRASH_RES))) ++ return; ++ ++ if (time_before_eq(curr->expires, get_seconds())) { ++ curr->expires = 0; ++ curr->crashes = 0; ++ } ++ ++ curr->crashes++; ++ ++ if (!curr->expires) ++ curr->expires = get_seconds() + curr->res[GR_CRASH_RES].rlim_max; ++ ++ if ((curr->crashes >= curr->res[GR_CRASH_RES].rlim_cur) && ++ time_after(curr->expires, get_seconds())) { ++ rcu_read_lock(); ++ cred = __task_cred(task); ++ if (gr_is_global_nonroot(cred->uid) && proc_is_setxid(cred)) { ++ gr_log_crash1(GR_DONT_AUDIT, GR_SEGVSTART_ACL_MSG, task, curr->res[GR_CRASH_RES].rlim_max); ++ spin_lock(&gr_uid_lock); ++ gr_insert_uid(cred->uid, curr->expires); ++ spin_unlock(&gr_uid_lock); ++ curr->expires = 0; ++ curr->crashes = 0; ++ read_lock(&tasklist_lock); ++ do_each_thread(tsk2, tsk) { ++ cred2 = __task_cred(tsk); ++ if (tsk != task && uid_eq(cred2->uid, cred->uid)) ++ gr_fake_force_sig(SIGKILL, tsk); ++ } while_each_thread(tsk2, tsk); ++ read_unlock(&tasklist_lock); ++ } else { ++ gr_log_crash2(GR_DONT_AUDIT, GR_SEGVNOSUID_ACL_MSG, task, curr->res[GR_CRASH_RES].rlim_max); ++ read_lock(&tasklist_lock); ++ read_lock(&grsec_exec_file_lock); ++ do_each_thread(tsk2, tsk) { ++ if (likely(tsk != task)) { ++ // if this thread has the same subject as the one that triggered ++ // RES_CRASH and it's the same binary, kill it ++ if (tsk->acl == task->acl && gr_is_same_file(tsk->exec_file, task->exec_file)) ++ gr_fake_force_sig(SIGKILL, tsk); ++ } ++ } while_each_thread(tsk2, tsk); ++ read_unlock(&grsec_exec_file_lock); ++ read_unlock(&tasklist_lock); ++ } ++ rcu_read_unlock(); ++ } ++ ++ return; ++} ++ ++int ++gr_check_crash_exec(const struct file *filp) ++{ ++ struct acl_subject_label *curr; ++ struct dentry *dentry; ++ ++ if (unlikely(!gr_acl_is_enabled())) ++ return 0; ++ ++ read_lock(&gr_inode_lock); ++ dentry = filp->f_path.dentry; ++ curr = lookup_acl_subj_label(__get_ino(dentry), __get_dev(dentry), ++ current->role); ++ read_unlock(&gr_inode_lock); ++ ++ if (!curr || !(curr->resmask & (1U << GR_CRASH_RES)) || ++ (!curr->crashes && !curr->expires)) ++ return 0; ++ ++ if ((curr->crashes >= curr->res[GR_CRASH_RES].rlim_cur) && ++ time_after(curr->expires, get_seconds())) ++ return 1; ++ else if (time_before_eq(curr->expires, get_seconds())) { ++ curr->crashes = 0; ++ curr->expires = 0; ++ } ++ ++ return 0; ++} ++ ++void ++gr_handle_alertkill(struct task_struct *task) ++{ ++ struct acl_subject_label *curracl; ++ __u32 curr_ip; ++ struct task_struct *p, *p2; ++ ++ if (unlikely(!gr_acl_is_enabled())) ++ return; ++ ++ curracl = task->acl; ++ curr_ip = task->signal->curr_ip; ++ ++ if ((curracl->mode & GR_KILLIPPROC) && curr_ip) { ++ read_lock(&tasklist_lock); ++ do_each_thread(p2, p) { ++ if (p->signal->curr_ip == curr_ip) ++ gr_fake_force_sig(SIGKILL, p); ++ } while_each_thread(p2, p); ++ read_unlock(&tasklist_lock); ++ } else if (curracl->mode & GR_KILLPROC) ++ gr_fake_force_sig(SIGKILL, task); ++ ++ return; ++} +diff --git a/grsecurity/gracl_shm.c b/grsecurity/gracl_shm.c +new file mode 100644 +index 0000000..6b0c9cc +--- /dev/null ++++ b/grsecurity/gracl_shm.c +@@ -0,0 +1,40 @@ ++#include <linux/kernel.h> ++#include <linux/mm.h> ++#include <linux/sched.h> ++#include <linux/file.h> ++#include <linux/ipc.h> ++#include <linux/gracl.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++ ++int ++gr_handle_shmat(const pid_t shm_cprid, const pid_t shm_lapid, ++ const u64 shm_createtime, const kuid_t cuid, const int shmid) ++{ ++ struct task_struct *task; ++ ++ if (!gr_acl_is_enabled()) ++ return 1; ++ ++ rcu_read_lock(); ++ read_lock(&tasklist_lock); ++ ++ task = find_task_by_vpid(shm_cprid); ++ ++ if (unlikely(!task)) ++ task = find_task_by_vpid(shm_lapid); ++ ++ if (unlikely(task && (time_before_eq64(task->start_time, shm_createtime) || ++ (task_pid_nr(task) == shm_lapid)) && ++ (task->acl->mode & GR_PROTSHM) && ++ (task->acl != current->acl))) { ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ gr_log_int3(GR_DONT_AUDIT, GR_SHMAT_ACL_MSG, GR_GLOBAL_UID(cuid), shm_cprid, shmid); ++ return 0; ++ } ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ ++ return 1; ++} +diff --git a/grsecurity/grsec_chdir.c b/grsecurity/grsec_chdir.c +new file mode 100644 +index 0000000..bc0be01 +--- /dev/null ++++ b/grsecurity/grsec_chdir.c +@@ -0,0 +1,19 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/fs.h> ++#include <linux/file.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++ ++void ++gr_log_chdir(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++#ifdef CONFIG_GRKERNSEC_AUDIT_CHDIR ++ if ((grsec_enable_chdir && grsec_enable_group && ++ in_group_p(grsec_audit_gid)) || (grsec_enable_chdir && ++ !grsec_enable_group)) { ++ gr_log_fs_generic(GR_DO_AUDIT, GR_CHDIR_AUDIT_MSG, dentry, mnt); ++ } ++#endif ++ return; ++} +diff --git a/grsecurity/grsec_chroot.c b/grsecurity/grsec_chroot.c +new file mode 100644 +index 0000000..114ea4f +--- /dev/null ++++ b/grsecurity/grsec_chroot.c +@@ -0,0 +1,467 @@ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/file.h> ++#include <linux/fs.h> ++#include <linux/mount.h> ++#include <linux/types.h> ++#include "../fs/mount.h" ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++ ++#ifdef CONFIG_GRKERNSEC_CHROOT_INITRD ++int gr_init_ran; ++#endif ++ ++void gr_inc_chroot_refcnts(struct dentry *dentry, struct vfsmount *mnt) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_RENAME ++ struct dentry *tmpd = dentry; ++ ++ read_seqlock_excl(&mount_lock); ++ write_seqlock(&rename_lock); ++ ++ while (tmpd != mnt->mnt_root) { ++ atomic_inc(&tmpd->chroot_refcnt); ++ tmpd = tmpd->d_parent; ++ } ++ atomic_inc(&tmpd->chroot_refcnt); ++ ++ write_sequnlock(&rename_lock); ++ read_sequnlock_excl(&mount_lock); ++#endif ++} ++ ++void gr_dec_chroot_refcnts(struct dentry *dentry, struct vfsmount *mnt) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_RENAME ++ struct dentry *tmpd = dentry; ++ ++ read_seqlock_excl(&mount_lock); ++ write_seqlock(&rename_lock); ++ ++ while (tmpd != mnt->mnt_root) { ++ atomic_dec(&tmpd->chroot_refcnt); ++ tmpd = tmpd->d_parent; ++ } ++ atomic_dec(&tmpd->chroot_refcnt); ++ ++ write_sequnlock(&rename_lock); ++ read_sequnlock_excl(&mount_lock); ++#endif ++} ++ ++#ifdef CONFIG_GRKERNSEC_CHROOT_RENAME ++static struct dentry *get_closest_chroot(struct dentry *dentry) ++{ ++ write_seqlock(&rename_lock); ++ do { ++ if (atomic_read(&dentry->chroot_refcnt)) { ++ write_sequnlock(&rename_lock); ++ return dentry; ++ } ++ dentry = dentry->d_parent; ++ } while (!IS_ROOT(dentry)); ++ write_sequnlock(&rename_lock); ++ return NULL; ++} ++#endif ++ ++int gr_bad_chroot_rename(struct dentry *olddentry, struct vfsmount *oldmnt, ++ struct dentry *newdentry, struct vfsmount *newmnt) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_RENAME ++ struct dentry *chroot; ++ ++ if (unlikely(!grsec_enable_chroot_rename)) ++ return 0; ++ ++ if (likely(!proc_is_chrooted(current) && gr_is_global_root(current_uid()))) ++ return 0; ++ ++ chroot = get_closest_chroot(olddentry); ++ ++ if (chroot == NULL) ++ return 0; ++ ++ if (is_subdir(newdentry, chroot)) ++ return 0; ++ ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_CHROOT_RENAME_MSG, olddentry, oldmnt); ++ ++ return 1; ++#else ++ return 0; ++#endif ++} ++ ++void gr_set_chroot_entries(struct task_struct *task, const struct path *path) ++{ ++#ifdef CONFIG_GRKERNSEC ++ if (task_pid_nr(task) > 1 && path->dentry != init_task.fs->root.dentry && ++ path->dentry != task->nsproxy->mnt_ns->root->mnt.mnt_root ++#ifdef CONFIG_GRKERNSEC_CHROOT_INITRD ++ && gr_init_ran ++#endif ++ ) ++ task->gr_is_chrooted = 1; ++ else { ++#ifdef CONFIG_GRKERNSEC_CHROOT_INITRD ++ if (task_pid_nr(task) == 1 && !gr_init_ran) ++ gr_init_ran = 1; ++#endif ++ task->gr_is_chrooted = 0; ++ } ++ ++ task->gr_chroot_dentry = path->dentry; ++#endif ++ return; ++} ++ ++void gr_clear_chroot_entries(struct task_struct *task) ++{ ++#ifdef CONFIG_GRKERNSEC ++ task->gr_is_chrooted = 0; ++ task->gr_chroot_dentry = NULL; ++#endif ++ return; ++} ++ ++int ++gr_handle_chroot_unix(const pid_t pid) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_UNIX ++ struct task_struct *p; ++ ++ if (unlikely(!grsec_enable_chroot_unix)) ++ return 1; ++ ++ if (likely(!proc_is_chrooted(current))) ++ return 1; ++ ++ rcu_read_lock(); ++ read_lock(&tasklist_lock); ++ p = find_task_by_vpid_unrestricted(pid); ++ if (unlikely(p && !have_same_root(current, p))) { ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ gr_log_noargs(GR_DONT_AUDIT, GR_UNIX_CHROOT_MSG); ++ return 0; ++ } ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++#endif ++ return 1; ++} ++ ++int ++gr_handle_chroot_nice(void) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_NICE ++ if (grsec_enable_chroot_nice && proc_is_chrooted(current)) { ++ gr_log_noargs(GR_DONT_AUDIT, GR_NICE_CHROOT_MSG); ++ return -EPERM; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_chroot_setpriority(struct task_struct *p, const int niceval) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_NICE ++ if (grsec_enable_chroot_nice && (niceval < task_nice(p)) ++ && proc_is_chrooted(current)) { ++ gr_log_str_int(GR_DONT_AUDIT, GR_PRIORITY_CHROOT_MSG, p->comm, task_pid_nr(p)); ++ return -EACCES; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_chroot_fowner(struct pid *pid, enum pid_type type) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_FINDTASK ++ struct task_struct *p; ++ int ret = 0; ++ if (!grsec_enable_chroot_findtask || !proc_is_chrooted(current) || !pid) ++ return ret; ++ ++ read_lock(&tasklist_lock); ++ do_each_pid_task(pid, type, p) { ++ if (!have_same_root(current, p)) { ++ ret = 1; ++ goto out; ++ } ++ } while_each_pid_task(pid, type, p); ++out: ++ read_unlock(&tasklist_lock); ++ return ret; ++#endif ++ return 0; ++} ++ ++int ++gr_pid_is_chrooted(struct task_struct *p) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_FINDTASK ++ if (!grsec_enable_chroot_findtask || !proc_is_chrooted(current) || p == NULL) ++ return 0; ++ ++ if ((p->exit_state & (EXIT_ZOMBIE | EXIT_DEAD)) || ++ !have_same_root(current, p)) { ++ return 1; ++ } ++#endif ++ return 0; ++} ++ ++EXPORT_SYMBOL_GPL(gr_pid_is_chrooted); ++ ++#if defined(CONFIG_GRKERNSEC_CHROOT_DOUBLE) || defined(CONFIG_GRKERNSEC_CHROOT_FCHDIR) ++int gr_is_outside_chroot(const struct dentry *u_dentry, const struct vfsmount *u_mnt) ++{ ++ struct path path, currentroot; ++ int ret = 0; ++ ++ path.dentry = (struct dentry *)u_dentry; ++ path.mnt = (struct vfsmount *)u_mnt; ++ get_fs_root(current->fs, ¤troot); ++ if (path_is_under(&path, ¤troot)) ++ ret = 1; ++ path_put(¤troot); ++ ++ return ret; ++} ++#endif ++ ++int ++gr_chroot_fchdir(struct dentry *u_dentry, struct vfsmount *u_mnt) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_FCHDIR ++ if (!grsec_enable_chroot_fchdir) ++ return 1; ++ ++ if (!proc_is_chrooted(current)) ++ return 1; ++ else if (!gr_is_outside_chroot(u_dentry, u_mnt)) { ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_CHROOT_FCHDIR_MSG, u_dentry, u_mnt); ++ return 0; ++ } ++#endif ++ return 1; ++} ++ ++int ++gr_chroot_fhandle(void) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_FCHDIR ++ if (!grsec_enable_chroot_fchdir) ++ return 1; ++ ++ if (!proc_is_chrooted(current)) ++ return 1; ++ else { ++ gr_log_noargs(GR_DONT_AUDIT, GR_CHROOT_FHANDLE_MSG); ++ return 0; ++ } ++#endif ++ return 1; ++} ++ ++int ++gr_chroot_shmat(const pid_t shm_cprid, const pid_t shm_lapid, ++ const u64 shm_createtime) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_SHMAT ++ struct task_struct *p; ++ ++ if (unlikely(!grsec_enable_chroot_shmat)) ++ return 1; ++ ++ if (likely(!proc_is_chrooted(current))) ++ return 1; ++ ++ rcu_read_lock(); ++ read_lock(&tasklist_lock); ++ ++ if ((p = find_task_by_vpid_unrestricted(shm_cprid))) { ++ if (time_before_eq64(p->start_time, shm_createtime)) { ++ if (have_same_root(current, p)) { ++ goto allow; ++ } else { ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ gr_log_noargs(GR_DONT_AUDIT, GR_SHMAT_CHROOT_MSG); ++ return 0; ++ } ++ } ++ /* creator exited, pid reuse, fall through to next check */ ++ } ++ if ((p = find_task_by_vpid_unrestricted(shm_lapid))) { ++ if (unlikely(!have_same_root(current, p))) { ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ gr_log_noargs(GR_DONT_AUDIT, GR_SHMAT_CHROOT_MSG); ++ return 0; ++ } ++ } ++ ++allow: ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++#endif ++ return 1; ++} ++ ++void ++gr_log_chroot_exec(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_EXECLOG ++ if (grsec_enable_chroot_execlog && proc_is_chrooted(current)) ++ gr_log_fs_generic(GR_DO_AUDIT, GR_EXEC_CHROOT_MSG, dentry, mnt); ++#endif ++ return; ++} ++ ++int ++gr_handle_chroot_mknod(const struct dentry *dentry, ++ const struct vfsmount *mnt, const int mode) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_MKNOD ++ if (grsec_enable_chroot_mknod && !S_ISFIFO(mode) && !S_ISREG(mode) && ++ proc_is_chrooted(current)) { ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_MKNOD_CHROOT_MSG, dentry, mnt); ++ return -EPERM; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_chroot_mount(const struct dentry *dentry, ++ const struct vfsmount *mnt, const char *dev_name) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_MOUNT ++ if (grsec_enable_chroot_mount && proc_is_chrooted(current)) { ++ gr_log_str_fs(GR_DONT_AUDIT, GR_MOUNT_CHROOT_MSG, dev_name ? dev_name : "none", dentry, mnt); ++ return -EPERM; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_chroot_pivot(void) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_PIVOT ++ if (grsec_enable_chroot_pivot && proc_is_chrooted(current)) { ++ gr_log_noargs(GR_DONT_AUDIT, GR_PIVOT_CHROOT_MSG); ++ return -EPERM; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_chroot_chroot(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_DOUBLE ++ if (grsec_enable_chroot_double && proc_is_chrooted(current) && ++ !gr_is_outside_chroot(dentry, mnt)) { ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_CHROOT_CHROOT_MSG, dentry, mnt); ++ return -EPERM; ++ } ++#endif ++ return 0; ++} ++ ++extern const char *captab_log[]; ++extern int captab_log_entries; ++ ++int ++gr_task_chroot_is_capable(const struct task_struct *task, const struct cred *cred, const int cap) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_CAPS ++ if (grsec_enable_chroot_caps && proc_is_chrooted(task)) { ++ kernel_cap_t chroot_caps = GR_CHROOT_CAPS; ++ if (cap_raised(chroot_caps, cap)) { ++ if (cap_raised(cred->cap_effective, cap) && cap < captab_log_entries) { ++ gr_log_cap(GR_DONT_AUDIT, GR_CAP_CHROOT_MSG, task, captab_log[cap]); ++ } ++ return 0; ++ } ++ } ++#endif ++ return 1; ++} ++ ++int ++gr_chroot_is_capable(const int cap) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_CAPS ++ return gr_task_chroot_is_capable(current, current_cred(), cap); ++#endif ++ return 1; ++} ++ ++int ++gr_task_chroot_is_capable_nolog(const struct task_struct *task, const int cap) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_CAPS ++ if (grsec_enable_chroot_caps && proc_is_chrooted(task)) { ++ kernel_cap_t chroot_caps = GR_CHROOT_CAPS; ++ if (cap_raised(chroot_caps, cap)) { ++ return 0; ++ } ++ } ++#endif ++ return 1; ++} ++ ++int ++gr_chroot_is_capable_nolog(const int cap) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_CAPS ++ return gr_task_chroot_is_capable_nolog(current, cap); ++#endif ++ return 1; ++} ++ ++int ++gr_handle_chroot_sysctl(const int op) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_SYSCTL ++ if (grsec_enable_chroot_sysctl && (op & MAY_WRITE) && ++ proc_is_chrooted(current)) ++ return -EACCES; ++#endif ++ return 0; ++} ++ ++void ++gr_handle_chroot_chdir(const struct path *path) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_CHDIR ++ if (grsec_enable_chroot_chdir) ++ set_fs_pwd(current->fs, path); ++#endif ++ return; ++} ++ ++int ++gr_handle_chroot_chmod(const struct dentry *dentry, ++ const struct vfsmount *mnt, const int mode) ++{ ++#ifdef CONFIG_GRKERNSEC_CHROOT_CHMOD ++ /* allow chmod +s on directories, but not files */ ++ if (grsec_enable_chroot_chmod && !S_ISDIR(dentry->d_inode->i_mode) && ++ ((mode & S_ISUID) || ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP))) && ++ proc_is_chrooted(current)) { ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_CHMOD_CHROOT_MSG, dentry, mnt); ++ return -EPERM; ++ } ++#endif ++ return 0; ++} +diff --git a/grsecurity/grsec_disabled.c b/grsecurity/grsec_disabled.c +new file mode 100644 +index 0000000..946f750 +--- /dev/null ++++ b/grsecurity/grsec_disabled.c +@@ -0,0 +1,445 @@ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/file.h> ++#include <linux/fs.h> ++#include <linux/kdev_t.h> ++#include <linux/net.h> ++#include <linux/in.h> ++#include <linux/ip.h> ++#include <linux/skbuff.h> ++#include <linux/sysctl.h> ++ ++#ifdef CONFIG_PAX_HAVE_ACL_FLAGS ++void ++pax_set_initial_flags(struct linux_binprm *bprm) ++{ ++ return; ++} ++#endif ++ ++#ifdef CONFIG_SYSCTL ++__u32 ++gr_handle_sysctl(const struct ctl_table * table, const int op) ++{ ++ return 0; ++} ++#endif ++ ++#ifdef CONFIG_TASKSTATS ++int gr_is_taskstats_denied(int pid) ++{ ++ return 0; ++} ++#endif ++ ++int ++gr_acl_is_enabled(void) ++{ ++ return 0; ++} ++ ++int ++gr_learn_cap(const struct task_struct *task, const struct cred *cred, const int cap) ++{ ++ return 0; ++} ++ ++void ++gr_handle_proc_create(const struct dentry *dentry, const struct inode *inode) ++{ ++ return; ++} ++ ++int ++gr_handle_rawio(const struct inode *inode) ++{ ++ return 0; ++} ++ ++void ++gr_acl_handle_psacct(struct task_struct *task, const long code) ++{ ++ return; ++} ++ ++int ++gr_handle_ptrace(struct task_struct *task, const long request) ++{ ++ return 0; ++} ++ ++int ++gr_handle_proc_ptrace(struct task_struct *task) ++{ ++ return 0; ++} ++ ++int ++gr_set_acls(const int type) ++{ ++ return 0; ++} ++ ++int ++gr_check_hidden_task(const struct task_struct *tsk) ++{ ++ return 0; ++} ++ ++int ++gr_check_protected_task(const struct task_struct *task) ++{ ++ return 0; ++} ++ ++int ++gr_check_protected_task_fowner(struct pid *pid, enum pid_type type) ++{ ++ return 0; ++} ++ ++void ++gr_copy_label(struct task_struct *tsk) ++{ ++ return; ++} ++ ++void ++gr_set_pax_flags(struct task_struct *task) ++{ ++ return; ++} ++ ++int ++gr_set_proc_label(const struct dentry *dentry, const struct vfsmount *mnt, ++ const int unsafe_share) ++{ ++ return 0; ++} ++ ++void ++gr_handle_delete(const u64 ino, const dev_t dev) ++{ ++ return; ++} ++ ++void ++gr_handle_create(const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++ return; ++} ++ ++void ++gr_handle_crash(struct task_struct *task, const int sig) ++{ ++ return; ++} ++ ++int ++gr_check_crash_exec(const struct file *filp) ++{ ++ return 0; ++} ++ ++int ++gr_check_crash_uid(const kuid_t uid) ++{ ++ return 0; ++} ++ ++void ++gr_handle_rename(struct inode *old_dir, struct inode *new_dir, ++ struct dentry *old_dentry, ++ struct dentry *new_dentry, ++ struct vfsmount *mnt, const __u8 replace, unsigned int flags) ++{ ++ return; ++} ++ ++int ++gr_search_socket(const int family, const int type, const int protocol) ++{ ++ return 1; ++} ++ ++int ++gr_search_connectbind(const int mode, const struct socket *sock, ++ const struct sockaddr_in *addr) ++{ ++ return 0; ++} ++ ++void ++gr_handle_alertkill(struct task_struct *task) ++{ ++ return; ++} ++ ++__u32 ++gr_acl_handle_execve(const struct dentry * dentry, const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_hidden_file(const struct dentry * dentry, ++ const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_open(const struct dentry * dentry, const struct vfsmount * mnt, ++ int acc_mode) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_rmdir(const struct dentry * dentry, const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_unlink(const struct dentry * dentry, const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++int ++gr_acl_handle_mmap(const struct file *file, const unsigned long prot, ++ unsigned int *vm_flags) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_truncate(const struct dentry * dentry, ++ const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_utime(const struct dentry * dentry, const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_access(const struct dentry * dentry, ++ const struct vfsmount * mnt, const int fmode) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_chmod(const struct dentry * dentry, const struct vfsmount * mnt, ++ umode_t *mode) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_chown(const struct dentry * dentry, const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_setxattr(const struct dentry * dentry, const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_removexattr(const struct dentry * dentry, const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++void ++grsecurity_init(void) ++{ ++ return; ++} ++ ++umode_t gr_acl_umask(void) ++{ ++ return 0; ++} ++ ++__u32 ++gr_acl_handle_mknod(const struct dentry * new_dentry, ++ const struct dentry * parent_dentry, ++ const struct vfsmount * parent_mnt, ++ const int mode) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_mkdir(const struct dentry * new_dentry, ++ const struct dentry * parent_dentry, ++ const struct vfsmount * parent_mnt) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_symlink(const struct dentry * new_dentry, ++ const struct dentry * parent_dentry, ++ const struct vfsmount * parent_mnt, const struct filename *from) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_link(const struct dentry * new_dentry, ++ const struct dentry * parent_dentry, ++ const struct vfsmount * parent_mnt, ++ const struct dentry * old_dentry, ++ const struct vfsmount * old_mnt, const struct filename *to) ++{ ++ return 1; ++} ++ ++int ++gr_acl_handle_rename(const struct dentry *new_dentry, ++ const struct dentry *parent_dentry, ++ const struct vfsmount *parent_mnt, ++ const struct dentry *old_dentry, ++ const struct inode *old_parent_inode, ++ const struct vfsmount *old_mnt, const struct filename *newname, ++ unsigned int flags) ++{ ++ return 0; ++} ++ ++int ++gr_acl_handle_filldir(const struct file *file, const char *name, ++ const int namelen, const u64 ino) ++{ ++ return 1; ++} ++ ++int ++gr_handle_shmat(const pid_t shm_cprid, const pid_t shm_lapid, ++ const u64 shm_createtime, const kuid_t cuid, const int shmid) ++{ ++ return 1; ++} ++ ++int ++gr_search_bind(const struct socket *sock, const struct sockaddr_in *addr) ++{ ++ return 0; ++} ++ ++int ++gr_search_accept(const struct socket *sock) ++{ ++ return 0; ++} ++ ++int ++gr_search_listen(const struct socket *sock) ++{ ++ return 0; ++} ++ ++int ++gr_search_connect(const struct socket *sock, const struct sockaddr_in *addr) ++{ ++ return 0; ++} ++ ++__u32 ++gr_acl_handle_unix(const struct dentry * dentry, const struct vfsmount * mnt) ++{ ++ return 1; ++} ++ ++__u32 ++gr_acl_handle_creat(const struct dentry * dentry, ++ const struct dentry * p_dentry, ++ const struct vfsmount * p_mnt, int open_flags, int acc_mode, ++ const int imode) ++{ ++ return 1; ++} ++ ++void ++gr_acl_handle_exit(void) ++{ ++ return; ++} ++ ++int ++gr_acl_handle_mprotect(const struct file *file, const unsigned long prot) ++{ ++ return 1; ++} ++ ++void ++gr_set_role_label(const kuid_t uid, const kgid_t gid) ++{ ++ return; ++} ++ ++int ++gr_acl_handle_procpidmem(const struct task_struct *task) ++{ ++ return 0; ++} ++ ++int ++gr_search_udp_recvmsg(const struct sock *sk, const struct sk_buff *skb) ++{ ++ return 0; ++} ++ ++int ++gr_search_udp_sendmsg(const struct sock *sk, const struct sockaddr_in *addr) ++{ ++ return 0; ++} ++ ++int ++gr_check_user_change(kuid_t real, kuid_t effective, kuid_t fs) ++{ ++ return 0; ++} ++ ++int ++gr_check_group_change(kgid_t real, kgid_t effective, kgid_t fs) ++{ ++ return 0; ++} ++ ++int gr_acl_enable_at_secure(void) ++{ ++ return 0; ++} ++ ++dev_t gr_get_dev_from_dentry(struct dentry *dentry) ++{ ++ return dentry->d_sb->s_dev; ++} ++ ++u64 gr_get_ino_from_dentry(struct dentry *dentry) ++{ ++ return dentry->d_inode->i_ino; ++} ++ ++void gr_put_exec_file(struct task_struct *task) ++{ ++ return; ++} ++ ++#ifdef CONFIG_SECURITY ++EXPORT_SYMBOL_GPL(gr_check_user_change); ++EXPORT_SYMBOL_GPL(gr_check_group_change); ++#endif +diff --git a/grsecurity/grsec_exec.c b/grsecurity/grsec_exec.c +new file mode 100644 +index 0000000..fb7531e +--- /dev/null ++++ b/grsecurity/grsec_exec.c +@@ -0,0 +1,189 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/file.h> ++#include <linux/binfmts.h> ++#include <linux/fs.h> ++#include <linux/types.h> ++#include <linux/grdefs.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++#include <linux/capability.h> ++#include <linux/module.h> ++#include <linux/compat.h> ++ ++#include <asm/uaccess.h> ++ ++#ifdef CONFIG_GRKERNSEC_EXECLOG ++static char gr_exec_arg_buf[132]; ++static DEFINE_MUTEX(gr_exec_arg_mutex); ++#endif ++ ++struct user_arg_ptr { ++#ifdef CONFIG_COMPAT ++ bool is_compat; ++#endif ++ union { ++ const char __user *const __user *native; ++#ifdef CONFIG_COMPAT ++ const compat_uptr_t __user *compat; ++#endif ++ } ptr; ++}; ++ ++extern const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr); ++ ++void ++gr_handle_exec_args(struct linux_binprm *bprm, struct user_arg_ptr argv) ++{ ++#ifdef CONFIG_GRKERNSEC_EXECLOG ++ char *grarg = gr_exec_arg_buf; ++ unsigned int i, x, execlen = 0; ++ char c; ++ ++ if (!((grsec_enable_execlog && grsec_enable_group && ++ in_group_p(grsec_audit_gid)) ++ || (grsec_enable_execlog && !grsec_enable_group))) ++ return; ++ ++ mutex_lock(&gr_exec_arg_mutex); ++ memset(grarg, 0, sizeof(gr_exec_arg_buf)); ++ ++ for (i = 0; i < bprm->argc && execlen < 128; i++) { ++ const char __user *p; ++ unsigned int len; ++ ++ p = get_user_arg_ptr(argv, i); ++ if (IS_ERR(p)) ++ goto log; ++ ++ len = strnlen_user(p, 128 - execlen); ++ if (len > 128 - execlen) ++ len = 128 - execlen; ++ else if (len > 0) ++ len--; ++ if (copy_from_user(grarg + execlen, p, len)) ++ goto log; ++ ++ /* rewrite unprintable characters */ ++ for (x = 0; x < len; x++) { ++ c = *(grarg + execlen + x); ++ if (c < 32 || c > 126) ++ *(grarg + execlen + x) = ' '; ++ } ++ ++ execlen += len; ++ *(grarg + execlen) = ' '; ++ *(grarg + execlen + 1) = '\0'; ++ execlen++; ++ } ++ ++ log: ++ gr_log_fs_str(GR_DO_AUDIT, GR_EXEC_AUDIT_MSG, bprm->file->f_path.dentry, ++ bprm->file->f_path.mnt, grarg); ++ mutex_unlock(&gr_exec_arg_mutex); ++#endif ++ return; ++} ++ ++#ifdef CONFIG_GRKERNSEC ++extern int gr_acl_is_capable(const int cap); ++extern int gr_acl_is_capable_nolog(const int cap); ++extern int gr_task_acl_is_capable(const struct task_struct *task, const struct cred *cred, const int cap); ++extern int gr_task_acl_is_capable_nolog(const struct task_struct *task, const int cap); ++extern int gr_chroot_is_capable(const int cap); ++extern int gr_chroot_is_capable_nolog(const int cap); ++extern int gr_task_chroot_is_capable(const struct task_struct *task, const struct cred *cred, const int cap); ++extern int gr_task_chroot_is_capable_nolog(const struct task_struct *task, const int cap); ++#endif ++ ++const char *captab_log[] = { ++ "CAP_CHOWN", ++ "CAP_DAC_OVERRIDE", ++ "CAP_DAC_READ_SEARCH", ++ "CAP_FOWNER", ++ "CAP_FSETID", ++ "CAP_KILL", ++ "CAP_SETGID", ++ "CAP_SETUID", ++ "CAP_SETPCAP", ++ "CAP_LINUX_IMMUTABLE", ++ "CAP_NET_BIND_SERVICE", ++ "CAP_NET_BROADCAST", ++ "CAP_NET_ADMIN", ++ "CAP_NET_RAW", ++ "CAP_IPC_LOCK", ++ "CAP_IPC_OWNER", ++ "CAP_SYS_MODULE", ++ "CAP_SYS_RAWIO", ++ "CAP_SYS_CHROOT", ++ "CAP_SYS_PTRACE", ++ "CAP_SYS_PACCT", ++ "CAP_SYS_ADMIN", ++ "CAP_SYS_BOOT", ++ "CAP_SYS_NICE", ++ "CAP_SYS_RESOURCE", ++ "CAP_SYS_TIME", ++ "CAP_SYS_TTY_CONFIG", ++ "CAP_MKNOD", ++ "CAP_LEASE", ++ "CAP_AUDIT_WRITE", ++ "CAP_AUDIT_CONTROL", ++ "CAP_SETFCAP", ++ "CAP_MAC_OVERRIDE", ++ "CAP_MAC_ADMIN", ++ "CAP_SYSLOG", ++ "CAP_WAKE_ALARM", ++ "CAP_BLOCK_SUSPEND", ++ "CAP_AUDIT_READ" ++}; ++ ++int captab_log_entries = sizeof(captab_log)/sizeof(captab_log[0]); ++ ++int gr_is_capable(const int cap) ++{ ++#ifdef CONFIG_GRKERNSEC ++ if (gr_acl_is_capable(cap) && gr_chroot_is_capable(cap)) ++ return 1; ++ return 0; ++#else ++ return 1; ++#endif ++} ++ ++int gr_task_is_capable(const struct task_struct *task, const struct cred *cred, const int cap) ++{ ++#ifdef CONFIG_GRKERNSEC ++ if (gr_task_acl_is_capable(task, cred, cap) && gr_task_chroot_is_capable(task, cred, cap)) ++ return 1; ++ return 0; ++#else ++ return 1; ++#endif ++} ++ ++int gr_is_capable_nolog(const int cap) ++{ ++#ifdef CONFIG_GRKERNSEC ++ if (gr_acl_is_capable_nolog(cap) && gr_chroot_is_capable_nolog(cap)) ++ return 1; ++ return 0; ++#else ++ return 1; ++#endif ++} ++ ++int gr_task_is_capable_nolog(const struct task_struct *task, const int cap) ++{ ++#ifdef CONFIG_GRKERNSEC ++ if (gr_task_acl_is_capable_nolog(task, cap) && gr_task_chroot_is_capable_nolog(task, cap)) ++ return 1; ++ return 0; ++#else ++ return 1; ++#endif ++} ++ ++EXPORT_SYMBOL_GPL(gr_is_capable); ++EXPORT_SYMBOL_GPL(gr_is_capable_nolog); ++EXPORT_SYMBOL_GPL(gr_task_is_capable); ++EXPORT_SYMBOL_GPL(gr_task_is_capable_nolog); +diff --git a/grsecurity/grsec_fifo.c b/grsecurity/grsec_fifo.c +new file mode 100644 +index 0000000..06cc6ea +--- /dev/null ++++ b/grsecurity/grsec_fifo.c +@@ -0,0 +1,24 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/fs.h> ++#include <linux/file.h> ++#include <linux/grinternal.h> ++ ++int ++gr_handle_fifo(const struct dentry *dentry, const struct vfsmount *mnt, ++ const struct dentry *dir, const int flag, const int acc_mode) ++{ ++#ifdef CONFIG_GRKERNSEC_FIFO ++ const struct cred *cred = current_cred(); ++ ++ if (grsec_enable_fifo && S_ISFIFO(dentry->d_inode->i_mode) && ++ !(flag & O_EXCL) && (dir->d_inode->i_mode & S_ISVTX) && ++ !uid_eq(dentry->d_inode->i_uid, dir->d_inode->i_uid) && ++ !uid_eq(cred->fsuid, dentry->d_inode->i_uid)) { ++ if (!inode_permission(dentry->d_inode, acc_mode)) ++ gr_log_fs_int2(GR_DONT_AUDIT, GR_FIFO_MSG, dentry, mnt, GR_GLOBAL_UID(dentry->d_inode->i_uid), GR_GLOBAL_GID(dentry->d_inode->i_gid)); ++ return -EACCES; ++ } ++#endif ++ return 0; ++} +diff --git a/grsecurity/grsec_fork.c b/grsecurity/grsec_fork.c +new file mode 100644 +index 0000000..8ca18bf +--- /dev/null ++++ b/grsecurity/grsec_fork.c +@@ -0,0 +1,23 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++#include <linux/errno.h> ++ ++void ++gr_log_forkfail(const int retval) ++{ ++#ifdef CONFIG_GRKERNSEC_FORKFAIL ++ if (grsec_enable_forkfail && (retval == -EAGAIN || retval == -ENOMEM)) { ++ switch (retval) { ++ case -EAGAIN: ++ gr_log_str(GR_DONT_AUDIT, GR_FAILFORK_MSG, "EAGAIN"); ++ break; ++ case -ENOMEM: ++ gr_log_str(GR_DONT_AUDIT, GR_FAILFORK_MSG, "ENOMEM"); ++ break; ++ } ++ } ++#endif ++ return; ++} +diff --git a/grsecurity/grsec_init.c b/grsecurity/grsec_init.c +new file mode 100644 +index 0000000..4ed9e7d +--- /dev/null ++++ b/grsecurity/grsec_init.c +@@ -0,0 +1,290 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/gracl.h> ++#include <linux/slab.h> ++#include <linux/vmalloc.h> ++#include <linux/percpu.h> ++#include <linux/module.h> ++ ++int grsec_enable_ptrace_readexec; ++int grsec_enable_setxid; ++int grsec_enable_symlinkown; ++kgid_t grsec_symlinkown_gid; ++int grsec_enable_brute; ++int grsec_enable_link; ++int grsec_enable_dmesg; ++int grsec_enable_harden_ptrace; ++int grsec_enable_harden_ipc; ++int grsec_enable_fifo; ++int grsec_enable_execlog; ++int grsec_enable_signal; ++int grsec_enable_forkfail; ++int grsec_enable_audit_ptrace; ++int grsec_enable_time; ++int grsec_enable_group; ++kgid_t grsec_audit_gid; ++int grsec_enable_chdir; ++int grsec_enable_mount; ++int grsec_enable_rofs; ++int grsec_deny_new_usb; ++int grsec_enable_chroot_findtask; ++int grsec_enable_chroot_mount; ++int grsec_enable_chroot_shmat; ++int grsec_enable_chroot_fchdir; ++int grsec_enable_chroot_double; ++int grsec_enable_chroot_pivot; ++int grsec_enable_chroot_chdir; ++int grsec_enable_chroot_chmod; ++int grsec_enable_chroot_mknod; ++int grsec_enable_chroot_nice; ++int grsec_enable_chroot_execlog; ++int grsec_enable_chroot_caps; ++int grsec_enable_chroot_rename; ++int grsec_enable_chroot_sysctl; ++int grsec_enable_chroot_unix; ++int grsec_enable_tpe; ++kgid_t grsec_tpe_gid; ++int grsec_enable_blackhole; ++#ifdef CONFIG_IPV6_MODULE ++EXPORT_SYMBOL_GPL(grsec_enable_blackhole); ++#endif ++int grsec_lastack_retries; ++int grsec_enable_tpe_all; ++int grsec_enable_tpe_invert; ++int grsec_enable_socket_all; ++kgid_t grsec_socket_all_gid; ++int grsec_enable_socket_client; ++kgid_t grsec_socket_client_gid; ++int grsec_enable_socket_server; ++kgid_t grsec_socket_server_gid; ++int grsec_resource_logging; ++int grsec_disable_privio; ++int grsec_enable_log_rwxmaps; ++int grsec_lock; ++ ++DEFINE_SPINLOCK(grsec_alert_lock); ++unsigned long grsec_alert_wtime = 0; ++unsigned long grsec_alert_fyet = 0; ++ ++DEFINE_SPINLOCK(grsec_audit_lock); ++ ++DEFINE_RWLOCK(grsec_exec_file_lock); ++ ++char *gr_shared_page[4]; ++ ++char *gr_alert_log_fmt; ++char *gr_audit_log_fmt; ++char *gr_alert_log_buf; ++char *gr_audit_log_buf; ++ ++extern struct gr_arg *gr_usermode; ++extern unsigned char *gr_system_salt; ++extern unsigned char *gr_system_sum; ++ ++void __init ++grsecurity_init(void) ++{ ++ int j; ++ /* create the per-cpu shared pages */ ++ ++#ifdef CONFIG_X86 ++ memset((char *)(0x41a + PAGE_OFFSET), 0, 36); ++#endif ++ ++ for (j = 0; j < 4; j++) { ++ gr_shared_page[j] = (char *)__alloc_percpu(PAGE_SIZE, __alignof__(unsigned long long)); ++ if (gr_shared_page[j] == NULL) { ++ panic("Unable to allocate grsecurity shared page"); ++ return; ++ } ++ } ++ ++ /* allocate log buffers */ ++ gr_alert_log_fmt = kmalloc(512, GFP_KERNEL); ++ if (!gr_alert_log_fmt) { ++ panic("Unable to allocate grsecurity alert log format buffer"); ++ return; ++ } ++ gr_audit_log_fmt = kmalloc(512, GFP_KERNEL); ++ if (!gr_audit_log_fmt) { ++ panic("Unable to allocate grsecurity audit log format buffer"); ++ return; ++ } ++ gr_alert_log_buf = (char *) get_zeroed_page(GFP_KERNEL); ++ if (!gr_alert_log_buf) { ++ panic("Unable to allocate grsecurity alert log buffer"); ++ return; ++ } ++ gr_audit_log_buf = (char *) get_zeroed_page(GFP_KERNEL); ++ if (!gr_audit_log_buf) { ++ panic("Unable to allocate grsecurity audit log buffer"); ++ return; ++ } ++ ++ /* allocate memory for authentication structure */ ++ gr_usermode = kmalloc(sizeof(struct gr_arg), GFP_KERNEL); ++ gr_system_salt = kmalloc(GR_SALT_LEN, GFP_KERNEL); ++ gr_system_sum = kmalloc(GR_SHA_LEN, GFP_KERNEL); ++ ++ if (!gr_usermode || !gr_system_salt || !gr_system_sum) { ++ panic("Unable to allocate grsecurity authentication structure"); ++ return; ++ } ++ ++#ifdef CONFIG_GRKERNSEC_IO ++#if !defined(CONFIG_GRKERNSEC_SYSCTL_DISTRO) ++ grsec_disable_privio = 1; ++#elif defined(CONFIG_GRKERNSEC_SYSCTL_ON) ++ grsec_disable_privio = 1; ++#else ++ grsec_disable_privio = 0; ++#endif ++#endif ++ ++#ifdef CONFIG_GRKERNSEC_TPE_INVERT ++ /* for backward compatibility, tpe_invert always defaults to on if ++ enabled in the kernel ++ */ ++ grsec_enable_tpe_invert = 1; ++#endif ++ ++#if !defined(CONFIG_GRKERNSEC_SYSCTL) || defined(CONFIG_GRKERNSEC_SYSCTL_ON) ++#ifndef CONFIG_GRKERNSEC_SYSCTL ++ grsec_lock = 1; ++#endif ++ ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++ grsec_enable_log_rwxmaps = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_AUDIT_GROUP ++ grsec_enable_group = 1; ++ grsec_audit_gid = KGIDT_INIT(CONFIG_GRKERNSEC_AUDIT_GID); ++#endif ++#ifdef CONFIG_GRKERNSEC_PTRACE_READEXEC ++ grsec_enable_ptrace_readexec = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_AUDIT_CHDIR ++ grsec_enable_chdir = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_HARDEN_PTRACE ++ grsec_enable_harden_ptrace = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_HARDEN_IPC ++ grsec_enable_harden_ipc = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_AUDIT_MOUNT ++ grsec_enable_mount = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_LINK ++ grsec_enable_link = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_BRUTE ++ grsec_enable_brute = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_DMESG ++ grsec_enable_dmesg = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ grsec_enable_blackhole = 1; ++ grsec_lastack_retries = 4; ++#endif ++#ifdef CONFIG_GRKERNSEC_FIFO ++ grsec_enable_fifo = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_EXECLOG ++ grsec_enable_execlog = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_SETXID ++ grsec_enable_setxid = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_SIGNAL ++ grsec_enable_signal = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_FORKFAIL ++ grsec_enable_forkfail = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_TIME ++ grsec_enable_time = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_RESLOG ++ grsec_resource_logging = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_FINDTASK ++ grsec_enable_chroot_findtask = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_UNIX ++ grsec_enable_chroot_unix = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_MOUNT ++ grsec_enable_chroot_mount = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_FCHDIR ++ grsec_enable_chroot_fchdir = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_SHMAT ++ grsec_enable_chroot_shmat = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_AUDIT_PTRACE ++ grsec_enable_audit_ptrace = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_DOUBLE ++ grsec_enable_chroot_double = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_PIVOT ++ grsec_enable_chroot_pivot = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_CHDIR ++ grsec_enable_chroot_chdir = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_CHMOD ++ grsec_enable_chroot_chmod = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_MKNOD ++ grsec_enable_chroot_mknod = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_NICE ++ grsec_enable_chroot_nice = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_EXECLOG ++ grsec_enable_chroot_execlog = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_CAPS ++ grsec_enable_chroot_caps = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_RENAME ++ grsec_enable_chroot_rename = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_SYSCTL ++ grsec_enable_chroot_sysctl = 1; ++#endif ++#ifdef CONFIG_GRKERNSEC_SYMLINKOWN ++ grsec_enable_symlinkown = 1; ++ grsec_symlinkown_gid = KGIDT_INIT(CONFIG_GRKERNSEC_SYMLINKOWN_GID); ++#endif ++#ifdef CONFIG_GRKERNSEC_TPE ++ grsec_enable_tpe = 1; ++ grsec_tpe_gid = KGIDT_INIT(CONFIG_GRKERNSEC_TPE_GID); ++#ifdef CONFIG_GRKERNSEC_TPE_ALL ++ grsec_enable_tpe_all = 1; ++#endif ++#endif ++#ifdef CONFIG_GRKERNSEC_SOCKET_ALL ++ grsec_enable_socket_all = 1; ++ grsec_socket_all_gid = KGIDT_INIT(CONFIG_GRKERNSEC_SOCKET_ALL_GID); ++#endif ++#ifdef CONFIG_GRKERNSEC_SOCKET_CLIENT ++ grsec_enable_socket_client = 1; ++ grsec_socket_client_gid = KGIDT_INIT(CONFIG_GRKERNSEC_SOCKET_CLIENT_GID); ++#endif ++#ifdef CONFIG_GRKERNSEC_SOCKET_SERVER ++ grsec_enable_socket_server = 1; ++ grsec_socket_server_gid = KGIDT_INIT(CONFIG_GRKERNSEC_SOCKET_SERVER_GID); ++#endif ++#endif ++#ifdef CONFIG_GRKERNSEC_DENYUSB_FORCE ++ grsec_deny_new_usb = 1; ++#endif ++ ++ return; ++} +diff --git a/grsecurity/grsec_ipc.c b/grsecurity/grsec_ipc.c +new file mode 100644 +index 0000000..1773300 +--- /dev/null ++++ b/grsecurity/grsec_ipc.c +@@ -0,0 +1,48 @@ ++#include <linux/kernel.h> ++#include <linux/mm.h> ++#include <linux/sched.h> ++#include <linux/file.h> ++#include <linux/ipc.h> ++#include <linux/ipc_namespace.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++ ++int ++gr_ipc_permitted(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, int requested_mode, int granted_mode) ++{ ++#ifdef CONFIG_GRKERNSEC_HARDEN_IPC ++ int write; ++ int orig_granted_mode; ++ kuid_t euid; ++ kgid_t egid; ++ ++ if (!grsec_enable_harden_ipc) ++ return 1; ++ ++ euid = current_euid(); ++ egid = current_egid(); ++ ++ write = requested_mode & 00002; ++ orig_granted_mode = ipcp->mode; ++ ++ if (uid_eq(euid, ipcp->cuid) || uid_eq(euid, ipcp->uid)) ++ orig_granted_mode >>= 6; ++ else { ++ /* if likely wrong permissions, lock to user */ ++ if (orig_granted_mode & 0007) ++ orig_granted_mode = 0; ++ /* otherwise do a egid-only check */ ++ else if (gid_eq(egid, ipcp->cgid) || gid_eq(egid, ipcp->gid)) ++ orig_granted_mode >>= 3; ++ /* otherwise, no access */ ++ else ++ orig_granted_mode = 0; ++ } ++ if (!(requested_mode & ~granted_mode & 0007) && (requested_mode & ~orig_granted_mode & 0007) && ++ !ns_capable_nolog(ns->user_ns, CAP_IPC_OWNER)) { ++ gr_log_str_int(GR_DONT_AUDIT, GR_IPC_DENIED_MSG, write ? "write" : "read", GR_GLOBAL_UID(ipcp->cuid)); ++ return 0; ++ } ++#endif ++ return 1; ++} +diff --git a/grsecurity/grsec_link.c b/grsecurity/grsec_link.c +new file mode 100644 +index 0000000..5e05e20 +--- /dev/null ++++ b/grsecurity/grsec_link.c +@@ -0,0 +1,58 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/fs.h> ++#include <linux/file.h> ++#include <linux/grinternal.h> ++ ++int gr_handle_symlink_owner(const struct path *link, const struct inode *target) ++{ ++#ifdef CONFIG_GRKERNSEC_SYMLINKOWN ++ const struct inode *link_inode = link->dentry->d_inode; ++ ++ if (grsec_enable_symlinkown && in_group_p(grsec_symlinkown_gid) && ++ /* ignore root-owned links, e.g. /proc/self */ ++ gr_is_global_nonroot(link_inode->i_uid) && target && ++ !uid_eq(link_inode->i_uid, target->i_uid)) { ++ gr_log_fs_int2(GR_DONT_AUDIT, GR_SYMLINKOWNER_MSG, link->dentry, link->mnt, link_inode->i_uid, target->i_uid); ++ return 1; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_follow_link(const struct inode *parent, ++ const struct inode *inode, ++ const struct dentry *dentry, const struct vfsmount *mnt) ++{ ++#ifdef CONFIG_GRKERNSEC_LINK ++ const struct cred *cred = current_cred(); ++ ++ if (grsec_enable_link && S_ISLNK(inode->i_mode) && ++ (parent->i_mode & S_ISVTX) && !uid_eq(parent->i_uid, inode->i_uid) && ++ (parent->i_mode & S_IWOTH) && !uid_eq(cred->fsuid, inode->i_uid)) { ++ gr_log_fs_int2(GR_DONT_AUDIT, GR_SYMLINK_MSG, dentry, mnt, inode->i_uid, inode->i_gid); ++ return -EACCES; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_hardlink(const struct dentry *dentry, ++ const struct vfsmount *mnt, ++ struct inode *inode, const int mode, const struct filename *to) ++{ ++#ifdef CONFIG_GRKERNSEC_LINK ++ const struct cred *cred = current_cred(); ++ ++ if (grsec_enable_link && !uid_eq(cred->fsuid, inode->i_uid) && ++ (!S_ISREG(mode) || is_privileged_binary(dentry) || ++ (inode_permission(inode, MAY_READ | MAY_WRITE))) && ++ !capable(CAP_FOWNER) && gr_is_global_nonroot(cred->uid)) { ++ gr_log_fs_int2_str(GR_DONT_AUDIT, GR_HARDLINK_MSG, dentry, mnt, inode->i_uid, inode->i_gid, to->name); ++ return -EPERM; ++ } ++#endif ++ return 0; ++} +diff --git a/grsecurity/grsec_log.c b/grsecurity/grsec_log.c +new file mode 100644 +index 0000000..dbe0a6b +--- /dev/null ++++ b/grsecurity/grsec_log.c +@@ -0,0 +1,341 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/file.h> ++#include <linux/tty.h> ++#include <linux/fs.h> ++#include <linux/mm.h> ++#include <linux/grinternal.h> ++ ++#ifdef CONFIG_TREE_PREEMPT_RCU ++#define DISABLE_PREEMPT() preempt_disable() ++#define ENABLE_PREEMPT() preempt_enable() ++#else ++#define DISABLE_PREEMPT() ++#define ENABLE_PREEMPT() ++#endif ++ ++#define BEGIN_LOCKS(x) \ ++ DISABLE_PREEMPT(); \ ++ rcu_read_lock(); \ ++ read_lock(&tasklist_lock); \ ++ read_lock(&grsec_exec_file_lock); \ ++ if (x != GR_DO_AUDIT) \ ++ spin_lock(&grsec_alert_lock); \ ++ else \ ++ spin_lock(&grsec_audit_lock) ++ ++#define END_LOCKS(x) \ ++ if (x != GR_DO_AUDIT) \ ++ spin_unlock(&grsec_alert_lock); \ ++ else \ ++ spin_unlock(&grsec_audit_lock); \ ++ read_unlock(&grsec_exec_file_lock); \ ++ read_unlock(&tasklist_lock); \ ++ rcu_read_unlock(); \ ++ ENABLE_PREEMPT(); \ ++ if (x == GR_DONT_AUDIT) \ ++ gr_handle_alertkill(current) ++ ++enum { ++ FLOODING, ++ NO_FLOODING ++}; ++ ++extern char *gr_alert_log_fmt; ++extern char *gr_audit_log_fmt; ++extern char *gr_alert_log_buf; ++extern char *gr_audit_log_buf; ++ ++static int gr_log_start(int audit) ++{ ++ char *loglevel = (audit == GR_DO_AUDIT) ? KERN_INFO : KERN_ALERT; ++ char *fmt = (audit == GR_DO_AUDIT) ? gr_audit_log_fmt : gr_alert_log_fmt; ++ char *buf = (audit == GR_DO_AUDIT) ? gr_audit_log_buf : gr_alert_log_buf; ++#if (CONFIG_GRKERNSEC_FLOODTIME > 0 && CONFIG_GRKERNSEC_FLOODBURST > 0) ++ unsigned long curr_secs = get_seconds(); ++ ++ if (audit == GR_DO_AUDIT) ++ goto set_fmt; ++ ++ if (!grsec_alert_wtime || time_after(curr_secs, grsec_alert_wtime + CONFIG_GRKERNSEC_FLOODTIME)) { ++ grsec_alert_wtime = curr_secs; ++ grsec_alert_fyet = 0; ++ } else if (time_before_eq(curr_secs, grsec_alert_wtime + CONFIG_GRKERNSEC_FLOODTIME) ++ && (grsec_alert_fyet < CONFIG_GRKERNSEC_FLOODBURST)) { ++ grsec_alert_fyet++; ++ } else if (grsec_alert_fyet == CONFIG_GRKERNSEC_FLOODBURST) { ++ grsec_alert_wtime = curr_secs; ++ grsec_alert_fyet++; ++ printk(KERN_ALERT "grsec: more alerts, logging disabled for %d seconds\n", CONFIG_GRKERNSEC_FLOODTIME); ++ return FLOODING; ++ } ++ else return FLOODING; ++ ++set_fmt: ++#endif ++ memset(buf, 0, PAGE_SIZE); ++ if (current->signal->curr_ip && gr_acl_is_enabled()) { ++ sprintf(fmt, "%s%s", loglevel, "grsec: From %pI4: (%.64s:%c:%.950s) "); ++ snprintf(buf, PAGE_SIZE - 1, fmt, ¤t->signal->curr_ip, current->role->rolename, gr_roletype_to_char(), current->acl->filename); ++ } else if (current->signal->curr_ip) { ++ sprintf(fmt, "%s%s", loglevel, "grsec: From %pI4: "); ++ snprintf(buf, PAGE_SIZE - 1, fmt, ¤t->signal->curr_ip); ++ } else if (gr_acl_is_enabled()) { ++ sprintf(fmt, "%s%s", loglevel, "grsec: (%.64s:%c:%.950s) "); ++ snprintf(buf, PAGE_SIZE - 1, fmt, current->role->rolename, gr_roletype_to_char(), current->acl->filename); ++ } else { ++ sprintf(fmt, "%s%s", loglevel, "grsec: "); ++ strcpy(buf, fmt); ++ } ++ ++ return NO_FLOODING; ++} ++ ++static void gr_log_middle(int audit, const char *msg, va_list ap) ++ __attribute__ ((format (printf, 2, 0))); ++ ++static void gr_log_middle(int audit, const char *msg, va_list ap) ++{ ++ char *buf = (audit == GR_DO_AUDIT) ? gr_audit_log_buf : gr_alert_log_buf; ++ unsigned int len = strlen(buf); ++ ++ vsnprintf(buf + len, PAGE_SIZE - len - 1, msg, ap); ++ ++ return; ++} ++ ++static void gr_log_middle_varargs(int audit, const char *msg, ...) ++ __attribute__ ((format (printf, 2, 3))); ++ ++static void gr_log_middle_varargs(int audit, const char *msg, ...) ++{ ++ char *buf = (audit == GR_DO_AUDIT) ? gr_audit_log_buf : gr_alert_log_buf; ++ unsigned int len = strlen(buf); ++ va_list ap; ++ ++ va_start(ap, msg); ++ vsnprintf(buf + len, PAGE_SIZE - len - 1, msg, ap); ++ va_end(ap); ++ ++ return; ++} ++ ++static void gr_log_end(int audit, int append_default) ++{ ++ char *buf = (audit == GR_DO_AUDIT) ? gr_audit_log_buf : gr_alert_log_buf; ++ if (append_default) { ++ struct task_struct *task = current; ++ struct task_struct *parent = task->real_parent; ++ const struct cred *cred = __task_cred(task); ++ const struct cred *pcred = __task_cred(parent); ++ unsigned int len = strlen(buf); ++ ++ snprintf(buf + len, PAGE_SIZE - len - 1, DEFAULTSECMSG, gr_task_fullpath(task), task->comm, task_pid_nr(task), GR_GLOBAL_UID(cred->uid), GR_GLOBAL_UID(cred->euid), GR_GLOBAL_GID(cred->gid), GR_GLOBAL_GID(cred->egid), gr_parent_task_fullpath(task), parent->comm, task_pid_nr(task->real_parent), GR_GLOBAL_UID(pcred->uid), GR_GLOBAL_UID(pcred->euid), GR_GLOBAL_GID(pcred->gid), GR_GLOBAL_GID(pcred->egid)); ++ } ++ ++ printk("%s\n", buf); ++ ++ return; ++} ++ ++void gr_log_varargs(int audit, const char *msg, int argtypes, ...) ++{ ++ int logtype; ++ char *result = (audit == GR_DO_AUDIT) ? "successful" : "denied"; ++ char *str1 = NULL, *str2 = NULL, *str3 = NULL; ++ void *voidptr = NULL; ++ int num1 = 0, num2 = 0; ++ unsigned long ulong1 = 0, ulong2 = 0; ++ struct dentry *dentry = NULL; ++ struct vfsmount *mnt = NULL; ++ struct file *file = NULL; ++ struct task_struct *task = NULL; ++ struct vm_area_struct *vma = NULL; ++ const struct cred *cred, *pcred; ++ va_list ap; ++ ++ BEGIN_LOCKS(audit); ++ logtype = gr_log_start(audit); ++ if (logtype == FLOODING) { ++ END_LOCKS(audit); ++ return; ++ } ++ va_start(ap, argtypes); ++ switch (argtypes) { ++ case GR_TTYSNIFF: ++ task = va_arg(ap, struct task_struct *); ++ gr_log_middle_varargs(audit, msg, &task->signal->curr_ip, gr_task_fullpath0(task), task->comm, task_pid_nr(task), gr_parent_task_fullpath0(task), task->real_parent->comm, task_pid_nr(task->real_parent)); ++ break; ++ case GR_SYSCTL_HIDDEN: ++ str1 = va_arg(ap, char *); ++ gr_log_middle_varargs(audit, msg, result, str1); ++ break; ++ case GR_RBAC: ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ gr_log_middle_varargs(audit, msg, result, gr_to_filename(dentry, mnt)); ++ break; ++ case GR_RBAC_STR: ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ str1 = va_arg(ap, char *); ++ gr_log_middle_varargs(audit, msg, result, gr_to_filename(dentry, mnt), str1); ++ break; ++ case GR_STR_RBAC: ++ str1 = va_arg(ap, char *); ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ gr_log_middle_varargs(audit, msg, result, str1, gr_to_filename(dentry, mnt)); ++ break; ++ case GR_RBAC_MODE2: ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ str1 = va_arg(ap, char *); ++ str2 = va_arg(ap, char *); ++ gr_log_middle_varargs(audit, msg, result, gr_to_filename(dentry, mnt), str1, str2); ++ break; ++ case GR_RBAC_MODE3: ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ str1 = va_arg(ap, char *); ++ str2 = va_arg(ap, char *); ++ str3 = va_arg(ap, char *); ++ gr_log_middle_varargs(audit, msg, result, gr_to_filename(dentry, mnt), str1, str2, str3); ++ break; ++ case GR_FILENAME: ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ gr_log_middle_varargs(audit, msg, gr_to_filename(dentry, mnt)); ++ break; ++ case GR_STR_FILENAME: ++ str1 = va_arg(ap, char *); ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ gr_log_middle_varargs(audit, msg, str1, gr_to_filename(dentry, mnt)); ++ break; ++ case GR_FILENAME_STR: ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ str1 = va_arg(ap, char *); ++ gr_log_middle_varargs(audit, msg, gr_to_filename(dentry, mnt), str1); ++ break; ++ case GR_FILENAME_TWO_INT: ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ num1 = va_arg(ap, int); ++ num2 = va_arg(ap, int); ++ gr_log_middle_varargs(audit, msg, gr_to_filename(dentry, mnt), num1, num2); ++ break; ++ case GR_FILENAME_TWO_INT_STR: ++ dentry = va_arg(ap, struct dentry *); ++ mnt = va_arg(ap, struct vfsmount *); ++ num1 = va_arg(ap, int); ++ num2 = va_arg(ap, int); ++ str1 = va_arg(ap, char *); ++ gr_log_middle_varargs(audit, msg, gr_to_filename(dentry, mnt), num1, num2, str1); ++ break; ++ case GR_TEXTREL: ++ file = va_arg(ap, struct file *); ++ ulong1 = va_arg(ap, unsigned long); ++ ulong2 = va_arg(ap, unsigned long); ++ gr_log_middle_varargs(audit, msg, file ? gr_to_filename(file->f_path.dentry, file->f_path.mnt) : "<anonymous mapping>", ulong1, ulong2); ++ break; ++ case GR_PTRACE: ++ task = va_arg(ap, struct task_struct *); ++ gr_log_middle_varargs(audit, msg, task->exec_file ? gr_to_filename(task->exec_file->f_path.dentry, task->exec_file->f_path.mnt) : "(none)", task->comm, task_pid_nr(task)); ++ break; ++ case GR_RESOURCE: ++ task = va_arg(ap, struct task_struct *); ++ cred = __task_cred(task); ++ pcred = __task_cred(task->real_parent); ++ ulong1 = va_arg(ap, unsigned long); ++ str1 = va_arg(ap, char *); ++ ulong2 = va_arg(ap, unsigned long); ++ gr_log_middle_varargs(audit, msg, ulong1, str1, ulong2, gr_task_fullpath(task), task->comm, task_pid_nr(task), GR_GLOBAL_UID(cred->uid), GR_GLOBAL_UID(cred->euid), GR_GLOBAL_GID(cred->gid), GR_GLOBAL_GID(cred->egid), gr_parent_task_fullpath(task), task->real_parent->comm, task_pid_nr(task->real_parent), GR_GLOBAL_UID(pcred->uid), GR_GLOBAL_UID(pcred->euid), GR_GLOBAL_GID(pcred->gid), GR_GLOBAL_GID(pcred->egid)); ++ break; ++ case GR_CAP: ++ task = va_arg(ap, struct task_struct *); ++ cred = __task_cred(task); ++ pcred = __task_cred(task->real_parent); ++ str1 = va_arg(ap, char *); ++ gr_log_middle_varargs(audit, msg, str1, gr_task_fullpath(task), task->comm, task_pid_nr(task), GR_GLOBAL_UID(cred->uid), GR_GLOBAL_UID(cred->euid), GR_GLOBAL_GID(cred->gid), GR_GLOBAL_GID(cred->egid), gr_parent_task_fullpath(task), task->real_parent->comm, task_pid_nr(task->real_parent), GR_GLOBAL_UID(pcred->uid), GR_GLOBAL_UID(pcred->euid), GR_GLOBAL_GID(pcred->gid), GR_GLOBAL_GID(pcred->egid)); ++ break; ++ case GR_SIG: ++ str1 = va_arg(ap, char *); ++ voidptr = va_arg(ap, void *); ++ gr_log_middle_varargs(audit, msg, str1, voidptr); ++ break; ++ case GR_SIG2: ++ task = va_arg(ap, struct task_struct *); ++ cred = __task_cred(task); ++ pcred = __task_cred(task->real_parent); ++ num1 = va_arg(ap, int); ++ gr_log_middle_varargs(audit, msg, num1, gr_task_fullpath0(task), task->comm, task_pid_nr(task), GR_GLOBAL_UID(cred->uid), GR_GLOBAL_UID(cred->euid), GR_GLOBAL_GID(cred->gid), GR_GLOBAL_GID(cred->egid), gr_parent_task_fullpath0(task), task->real_parent->comm, task_pid_nr(task->real_parent), GR_GLOBAL_UID(pcred->uid), GR_GLOBAL_UID(pcred->euid), GR_GLOBAL_GID(pcred->gid), GR_GLOBAL_GID(pcred->egid)); ++ break; ++ case GR_CRASH1: ++ task = va_arg(ap, struct task_struct *); ++ cred = __task_cred(task); ++ pcred = __task_cred(task->real_parent); ++ ulong1 = va_arg(ap, unsigned long); ++ gr_log_middle_varargs(audit, msg, gr_task_fullpath(task), task->comm, task_pid_nr(task), GR_GLOBAL_UID(cred->uid), GR_GLOBAL_UID(cred->euid), GR_GLOBAL_GID(cred->gid), GR_GLOBAL_GID(cred->egid), gr_parent_task_fullpath(task), task->real_parent->comm, task_pid_nr(task->real_parent), GR_GLOBAL_UID(pcred->uid), GR_GLOBAL_UID(pcred->euid), GR_GLOBAL_GID(pcred->gid), GR_GLOBAL_GID(pcred->egid), GR_GLOBAL_UID(cred->uid), ulong1); ++ break; ++ case GR_CRASH2: ++ task = va_arg(ap, struct task_struct *); ++ cred = __task_cred(task); ++ pcred = __task_cred(task->real_parent); ++ ulong1 = va_arg(ap, unsigned long); ++ gr_log_middle_varargs(audit, msg, gr_task_fullpath(task), task->comm, task_pid_nr(task), GR_GLOBAL_UID(cred->uid), GR_GLOBAL_UID(cred->euid), GR_GLOBAL_GID(cred->gid), GR_GLOBAL_GID(cred->egid), gr_parent_task_fullpath(task), task->real_parent->comm, task_pid_nr(task->real_parent), GR_GLOBAL_UID(pcred->uid), GR_GLOBAL_UID(pcred->euid), GR_GLOBAL_GID(pcred->gid), GR_GLOBAL_GID(pcred->egid), ulong1); ++ break; ++ case GR_RWXMAP: ++ file = va_arg(ap, struct file *); ++ gr_log_middle_varargs(audit, msg, file ? gr_to_filename(file->f_path.dentry, file->f_path.mnt) : "<anonymous mapping>"); ++ break; ++ case GR_RWXMAPVMA: ++ vma = va_arg(ap, struct vm_area_struct *); ++ if (vma->vm_file) ++ str1 = gr_to_filename(vma->vm_file->f_path.dentry, vma->vm_file->f_path.mnt); ++ else if (vma->vm_flags & (VM_GROWSDOWN | VM_GROWSUP)) ++ str1 = "<stack>"; ++ else if (vma->vm_start <= current->mm->brk && ++ vma->vm_end >= current->mm->start_brk) ++ str1 = "<heap>"; ++ else ++ str1 = "<anonymous mapping>"; ++ gr_log_middle_varargs(audit, msg, str1); ++ break; ++ case GR_PSACCT: ++ { ++ unsigned int wday, cday; ++ __u8 whr, chr; ++ __u8 wmin, cmin; ++ __u8 wsec, csec; ++ char cur_tty[64] = { 0 }; ++ char parent_tty[64] = { 0 }; ++ ++ task = va_arg(ap, struct task_struct *); ++ wday = va_arg(ap, unsigned int); ++ cday = va_arg(ap, unsigned int); ++ whr = va_arg(ap, int); ++ chr = va_arg(ap, int); ++ wmin = va_arg(ap, int); ++ cmin = va_arg(ap, int); ++ wsec = va_arg(ap, int); ++ csec = va_arg(ap, int); ++ ulong1 = va_arg(ap, unsigned long); ++ cred = __task_cred(task); ++ pcred = __task_cred(task->real_parent); ++ ++ gr_log_middle_varargs(audit, msg, gr_task_fullpath(task), task->comm, task_pid_nr(task), &task->signal->curr_ip, tty_name(task->signal->tty, cur_tty), GR_GLOBAL_UID(cred->uid), GR_GLOBAL_UID(cred->euid), GR_GLOBAL_GID(cred->gid), GR_GLOBAL_GID(cred->egid), wday, whr, wmin, wsec, cday, chr, cmin, csec, (task->flags & PF_SIGNALED) ? "killed by signal" : "exited", ulong1, gr_parent_task_fullpath(task), task->real_parent->comm, task_pid_nr(task->real_parent), &task->real_parent->signal->curr_ip, tty_name(task->real_parent->signal->tty, parent_tty), GR_GLOBAL_UID(pcred->uid), GR_GLOBAL_UID(pcred->euid), GR_GLOBAL_GID(pcred->gid), GR_GLOBAL_GID(pcred->egid)); ++ } ++ break; ++ default: ++ gr_log_middle(audit, msg, ap); ++ } ++ va_end(ap); ++ // these don't need DEFAULTSECARGS printed on the end ++ if (argtypes == GR_CRASH1 || argtypes == GR_CRASH2) ++ gr_log_end(audit, 0); ++ else ++ gr_log_end(audit, 1); ++ END_LOCKS(audit); ++} +diff --git a/grsecurity/grsec_mem.c b/grsecurity/grsec_mem.c +new file mode 100644 +index 0000000..0e39d8c +--- /dev/null ++++ b/grsecurity/grsec_mem.c +@@ -0,0 +1,48 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/mman.h> ++#include <linux/module.h> ++#include <linux/grinternal.h> ++ ++void gr_handle_msr_write(void) ++{ ++ gr_log_noargs(GR_DONT_AUDIT, GR_MSRWRITE_MSG); ++ return; ++} ++EXPORT_SYMBOL_GPL(gr_handle_msr_write); ++ ++void ++gr_handle_ioperm(void) ++{ ++ gr_log_noargs(GR_DONT_AUDIT, GR_IOPERM_MSG); ++ return; ++} ++ ++void ++gr_handle_iopl(void) ++{ ++ gr_log_noargs(GR_DONT_AUDIT, GR_IOPL_MSG); ++ return; ++} ++ ++void ++gr_handle_mem_readwrite(u64 from, u64 to) ++{ ++ gr_log_two_u64(GR_DONT_AUDIT, GR_MEM_READWRITE_MSG, from, to); ++ return; ++} ++ ++void ++gr_handle_vm86(void) ++{ ++ gr_log_noargs(GR_DONT_AUDIT, GR_VM86_MSG); ++ return; ++} ++ ++void ++gr_log_badprocpid(const char *entry) ++{ ++ gr_log_str(GR_DONT_AUDIT, GR_BADPROCPID_MSG, entry); ++ return; ++} +diff --git a/grsecurity/grsec_mount.c b/grsecurity/grsec_mount.c +new file mode 100644 +index 0000000..6f9eb73 +--- /dev/null ++++ b/grsecurity/grsec_mount.c +@@ -0,0 +1,65 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/mount.h> ++#include <linux/major.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++ ++void ++gr_log_remount(const char *devname, const int retval) ++{ ++#ifdef CONFIG_GRKERNSEC_AUDIT_MOUNT ++ if (grsec_enable_mount && (retval >= 0)) ++ gr_log_str(GR_DO_AUDIT, GR_REMOUNT_AUDIT_MSG, devname ? devname : "none"); ++#endif ++ return; ++} ++ ++void ++gr_log_unmount(const char *devname, const int retval) ++{ ++#ifdef CONFIG_GRKERNSEC_AUDIT_MOUNT ++ if (grsec_enable_mount && (retval >= 0)) ++ gr_log_str(GR_DO_AUDIT, GR_UNMOUNT_AUDIT_MSG, devname ? devname : "none"); ++#endif ++ return; ++} ++ ++void ++gr_log_mount(const char *from, struct path *to, const int retval) ++{ ++#ifdef CONFIG_GRKERNSEC_AUDIT_MOUNT ++ if (grsec_enable_mount && (retval >= 0)) ++ gr_log_str_fs(GR_DO_AUDIT, GR_MOUNT_AUDIT_MSG, from ? from : "none", to->dentry, to->mnt); ++#endif ++ return; ++} ++ ++int ++gr_handle_rofs_mount(struct dentry *dentry, struct vfsmount *mnt, int mnt_flags) ++{ ++#ifdef CONFIG_GRKERNSEC_ROFS ++ if (grsec_enable_rofs && !(mnt_flags & MNT_READONLY)) { ++ gr_log_fs_generic(GR_DO_AUDIT, GR_ROFS_MOUNT_MSG, dentry, mnt); ++ return -EPERM; ++ } else ++ return 0; ++#endif ++ return 0; ++} ++ ++int ++gr_handle_rofs_blockwrite(struct dentry *dentry, struct vfsmount *mnt, int acc_mode) ++{ ++#ifdef CONFIG_GRKERNSEC_ROFS ++ struct inode *inode = dentry->d_inode; ++ ++ if (grsec_enable_rofs && (acc_mode & MAY_WRITE) && ++ inode && (S_ISBLK(inode->i_mode) || (S_ISCHR(inode->i_mode) && imajor(inode) == RAW_MAJOR))) { ++ gr_log_fs_generic(GR_DO_AUDIT, GR_ROFS_BLOCKWRITE_MSG, dentry, mnt); ++ return -EPERM; ++ } else ++ return 0; ++#endif ++ return 0; ++} +diff --git a/grsecurity/grsec_pax.c b/grsecurity/grsec_pax.c +new file mode 100644 +index 0000000..6ee9d50 +--- /dev/null ++++ b/grsecurity/grsec_pax.c +@@ -0,0 +1,45 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/file.h> ++#include <linux/grinternal.h> ++#include <linux/grsecurity.h> ++ ++void ++gr_log_textrel(struct vm_area_struct * vma) ++{ ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++ if (grsec_enable_log_rwxmaps) ++ gr_log_textrel_ulong_ulong(GR_DONT_AUDIT, GR_TEXTREL_AUDIT_MSG, vma->vm_file, vma->vm_start, vma->vm_pgoff); ++#endif ++ return; ++} ++ ++void gr_log_ptgnustack(struct file *file) ++{ ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++ if (grsec_enable_log_rwxmaps) ++ gr_log_rwxmap(GR_DONT_AUDIT, GR_PTGNUSTACK_MSG, file); ++#endif ++ return; ++} ++ ++void ++gr_log_rwxmmap(struct file *file) ++{ ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++ if (grsec_enable_log_rwxmaps) ++ gr_log_rwxmap(GR_DONT_AUDIT, GR_RWXMMAP_MSG, file); ++#endif ++ return; ++} ++ ++void ++gr_log_rwxmprotect(struct vm_area_struct *vma) ++{ ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++ if (grsec_enable_log_rwxmaps) ++ gr_log_rwxmap_vma(GR_DONT_AUDIT, GR_RWXMPROTECT_MSG, vma); ++#endif ++ return; ++} +diff --git a/grsecurity/grsec_proc.c b/grsecurity/grsec_proc.c +new file mode 100644 +index 0000000..2005a3a +--- /dev/null ++++ b/grsecurity/grsec_proc.c +@@ -0,0 +1,20 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++ ++int gr_proc_is_restricted(void) ++{ ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ const struct cred *cred = current_cred(); ++#endif ++ ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ if (!uid_eq(cred->fsuid, GLOBAL_ROOT_UID)) ++ return -EACCES; ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ if (!uid_eq(cred->fsuid, GLOBAL_ROOT_UID) && !in_group_p(grsec_proc_gid)) ++ return -EACCES; ++#endif ++ return 0; ++} +diff --git a/grsecurity/grsec_ptrace.c b/grsecurity/grsec_ptrace.c +new file mode 100644 +index 0000000..f7f29aa +--- /dev/null ++++ b/grsecurity/grsec_ptrace.c +@@ -0,0 +1,30 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/grinternal.h> ++#include <linux/security.h> ++ ++void ++gr_audit_ptrace(struct task_struct *task) ++{ ++#ifdef CONFIG_GRKERNSEC_AUDIT_PTRACE ++ if (grsec_enable_audit_ptrace) ++ gr_log_ptrace(GR_DO_AUDIT, GR_PTRACE_AUDIT_MSG, task); ++#endif ++ return; ++} ++ ++int ++gr_ptrace_readexec(struct file *file, int unsafe_flags) ++{ ++#ifdef CONFIG_GRKERNSEC_PTRACE_READEXEC ++ const struct dentry *dentry = file->f_path.dentry; ++ const struct vfsmount *mnt = file->f_path.mnt; ++ ++ if (grsec_enable_ptrace_readexec && (unsafe_flags & LSM_UNSAFE_PTRACE) && ++ (inode_permission(dentry->d_inode, MAY_READ) || !gr_acl_handle_open(dentry, mnt, MAY_READ))) { ++ gr_log_fs_generic(GR_DONT_AUDIT, GR_PTRACE_READEXEC_MSG, dentry, mnt); ++ return -EACCES; ++ } ++#endif ++ return 0; ++} +diff --git a/grsecurity/grsec_sig.c b/grsecurity/grsec_sig.c +new file mode 100644 +index 0000000..3860c7e +--- /dev/null ++++ b/grsecurity/grsec_sig.c +@@ -0,0 +1,236 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/fs.h> ++#include <linux/delay.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++#include <linux/hardirq.h> ++ ++char *signames[] = { ++ [SIGSEGV] = "Segmentation fault", ++ [SIGILL] = "Illegal instruction", ++ [SIGABRT] = "Abort", ++ [SIGBUS] = "Invalid alignment/Bus error" ++}; ++ ++void ++gr_log_signal(const int sig, const void *addr, const struct task_struct *t) ++{ ++#ifdef CONFIG_GRKERNSEC_SIGNAL ++ if (grsec_enable_signal && ((sig == SIGSEGV) || (sig == SIGILL) || ++ (sig == SIGABRT) || (sig == SIGBUS))) { ++ if (task_pid_nr(t) == task_pid_nr(current)) { ++ gr_log_sig_addr(GR_DONT_AUDIT_GOOD, GR_UNISIGLOG_MSG, signames[sig], addr); ++ } else { ++ gr_log_sig_task(GR_DONT_AUDIT_GOOD, GR_DUALSIGLOG_MSG, t, sig); ++ } ++ } ++#endif ++ return; ++} ++ ++int ++gr_handle_signal(const struct task_struct *p, const int sig) ++{ ++#ifdef CONFIG_GRKERNSEC ++ /* ignore the 0 signal for protected task checks */ ++ if (task_pid_nr(current) > 1 && sig && gr_check_protected_task(p)) { ++ gr_log_sig_task(GR_DONT_AUDIT, GR_SIG_ACL_MSG, p, sig); ++ return -EPERM; ++ } else if (gr_pid_is_chrooted((struct task_struct *)p)) { ++ return -EPERM; ++ } ++#endif ++ return 0; ++} ++ ++#ifdef CONFIG_GRKERNSEC ++extern int specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t); ++ ++int gr_fake_force_sig(int sig, struct task_struct *t) ++{ ++ unsigned long int flags; ++ int ret, blocked, ignored; ++ struct k_sigaction *action; ++ ++ spin_lock_irqsave(&t->sighand->siglock, flags); ++ action = &t->sighand->action[sig-1]; ++ ignored = action->sa.sa_handler == SIG_IGN; ++ blocked = sigismember(&t->blocked, sig); ++ if (blocked || ignored) { ++ action->sa.sa_handler = SIG_DFL; ++ if (blocked) { ++ sigdelset(&t->blocked, sig); ++ recalc_sigpending_and_wake(t); ++ } ++ } ++ if (action->sa.sa_handler == SIG_DFL) ++ t->signal->flags &= ~SIGNAL_UNKILLABLE; ++ ret = specific_send_sig_info(sig, SEND_SIG_PRIV, t); ++ ++ spin_unlock_irqrestore(&t->sighand->siglock, flags); ++ ++ return ret; ++} ++#endif ++ ++#define GR_USER_BAN_TIME (15 * 60) ++#define GR_DAEMON_BRUTE_TIME (30 * 60) ++ ++void gr_handle_brute_attach(int dumpable) ++{ ++#ifdef CONFIG_GRKERNSEC_BRUTE ++ struct task_struct *p = current; ++ kuid_t uid = GLOBAL_ROOT_UID; ++ int daemon = 0; ++ ++ if (!grsec_enable_brute) ++ return; ++ ++ rcu_read_lock(); ++ read_lock(&tasklist_lock); ++ read_lock(&grsec_exec_file_lock); ++ if (p->real_parent && gr_is_same_file(p->real_parent->exec_file, p->exec_file)) { ++ p->real_parent->brute_expires = get_seconds() + GR_DAEMON_BRUTE_TIME; ++ p->real_parent->brute = 1; ++ daemon = 1; ++ } else { ++ const struct cred *cred = __task_cred(p), *cred2; ++ struct task_struct *tsk, *tsk2; ++ ++ if (dumpable != SUID_DUMP_USER && gr_is_global_nonroot(cred->uid)) { ++ struct user_struct *user; ++ ++ uid = cred->uid; ++ ++ /* this is put upon execution past expiration */ ++ user = find_user(uid); ++ if (user == NULL) ++ goto unlock; ++ user->suid_banned = 1; ++ user->suid_ban_expires = get_seconds() + GR_USER_BAN_TIME; ++ if (user->suid_ban_expires == ~0UL) ++ user->suid_ban_expires--; ++ ++ /* only kill other threads of the same binary, from the same user */ ++ do_each_thread(tsk2, tsk) { ++ cred2 = __task_cred(tsk); ++ if (tsk != p && uid_eq(cred2->uid, uid) && gr_is_same_file(tsk->exec_file, p->exec_file)) ++ gr_fake_force_sig(SIGKILL, tsk); ++ } while_each_thread(tsk2, tsk); ++ } ++ } ++unlock: ++ read_unlock(&grsec_exec_file_lock); ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ ++ if (gr_is_global_nonroot(uid)) ++ gr_log_fs_int2(GR_DONT_AUDIT, GR_BRUTE_SUID_MSG, p->exec_file->f_path.dentry, p->exec_file->f_path.mnt, GR_GLOBAL_UID(uid), GR_USER_BAN_TIME / 60); ++ else if (daemon) ++ gr_log_noargs(GR_DONT_AUDIT, GR_BRUTE_DAEMON_MSG); ++ ++#endif ++ return; ++} ++ ++void gr_handle_brute_check(void) ++{ ++#ifdef CONFIG_GRKERNSEC_BRUTE ++ struct task_struct *p = current; ++ ++ if (unlikely(p->brute)) { ++ if (!grsec_enable_brute) ++ p->brute = 0; ++ else if (time_before(get_seconds(), p->brute_expires)) ++ msleep(30 * 1000); ++ } ++#endif ++ return; ++} ++ ++void gr_handle_kernel_exploit(void) ++{ ++#ifdef CONFIG_GRKERNSEC_KERN_LOCKOUT ++ const struct cred *cred; ++ struct task_struct *tsk, *tsk2; ++ struct user_struct *user; ++ kuid_t uid; ++ ++ if (in_irq() || in_serving_softirq() || in_nmi()) ++ panic("grsec: halting the system due to suspicious kernel crash caused in interrupt context"); ++ ++ uid = current_uid(); ++ ++ if (gr_is_global_root(uid)) ++ panic("grsec: halting the system due to suspicious kernel crash caused by root"); ++ else { ++ /* kill all the processes of this user, hold a reference ++ to their creds struct, and prevent them from creating ++ another process until system reset ++ */ ++ printk(KERN_ALERT "grsec: banning user with uid %u until system restart for suspicious kernel crash\n", ++ GR_GLOBAL_UID(uid)); ++ /* we intentionally leak this ref */ ++ user = get_uid(current->cred->user); ++ if (user) ++ user->kernel_banned = 1; ++ ++ /* kill all processes of this user */ ++ read_lock(&tasklist_lock); ++ do_each_thread(tsk2, tsk) { ++ cred = __task_cred(tsk); ++ if (uid_eq(cred->uid, uid)) ++ gr_fake_force_sig(SIGKILL, tsk); ++ } while_each_thread(tsk2, tsk); ++ read_unlock(&tasklist_lock); ++ } ++#endif ++} ++ ++#ifdef CONFIG_GRKERNSEC_BRUTE ++static bool suid_ban_expired(struct user_struct *user) ++{ ++ if (user->suid_ban_expires != ~0UL && time_after_eq(get_seconds(), user->suid_ban_expires)) { ++ user->suid_banned = 0; ++ user->suid_ban_expires = 0; ++ free_uid(user); ++ return true; ++ } ++ ++ return false; ++} ++#endif ++ ++int gr_process_kernel_exec_ban(void) ++{ ++#ifdef CONFIG_GRKERNSEC_KERN_LOCKOUT ++ if (unlikely(current->cred->user->kernel_banned)) ++ return -EPERM; ++#endif ++ return 0; ++} ++ ++int gr_process_kernel_setuid_ban(struct user_struct *user) ++{ ++#ifdef CONFIG_GRKERNSEC_KERN_LOCKOUT ++ if (unlikely(user->kernel_banned)) ++ gr_fake_force_sig(SIGKILL, current); ++#endif ++ return 0; ++} ++ ++int gr_process_suid_exec_ban(const struct linux_binprm *bprm) ++{ ++#ifdef CONFIG_GRKERNSEC_BRUTE ++ struct user_struct *user = current->cred->user; ++ if (unlikely(user->suid_banned)) { ++ if (suid_ban_expired(user)) ++ return 0; ++ /* disallow execution of suid binaries only */ ++ else if (!uid_eq(bprm->cred->euid, current->cred->uid)) ++ return -EPERM; ++ } ++#endif ++ return 0; ++} +diff --git a/grsecurity/grsec_sock.c b/grsecurity/grsec_sock.c +new file mode 100644 +index 0000000..e3650b6 +--- /dev/null ++++ b/grsecurity/grsec_sock.c +@@ -0,0 +1,244 @@ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/file.h> ++#include <linux/net.h> ++#include <linux/in.h> ++#include <linux/ip.h> ++#include <net/sock.h> ++#include <net/inet_sock.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++#include <linux/gracl.h> ++ ++extern int gr_search_udp_recvmsg(const struct sock *sk, const struct sk_buff *skb); ++extern int gr_search_udp_sendmsg(const struct sock *sk, const struct sockaddr_in *addr); ++ ++EXPORT_SYMBOL_GPL(gr_search_udp_recvmsg); ++EXPORT_SYMBOL_GPL(gr_search_udp_sendmsg); ++ ++#ifdef CONFIG_UNIX_MODULE ++EXPORT_SYMBOL_GPL(gr_acl_handle_unix); ++EXPORT_SYMBOL_GPL(gr_acl_handle_mknod); ++EXPORT_SYMBOL_GPL(gr_handle_chroot_unix); ++EXPORT_SYMBOL_GPL(gr_handle_create); ++#endif ++ ++#ifdef CONFIG_GRKERNSEC ++#define gr_conn_table_size 32749 ++struct conn_table_entry { ++ struct conn_table_entry *next; ++ struct signal_struct *sig; ++}; ++ ++struct conn_table_entry *gr_conn_table[gr_conn_table_size]; ++DEFINE_SPINLOCK(gr_conn_table_lock); ++ ++extern const char * gr_socktype_to_name(unsigned char type); ++extern const char * gr_proto_to_name(unsigned char proto); ++extern const char * gr_sockfamily_to_name(unsigned char family); ++ ++static __inline__ int ++conn_hash(__u32 saddr, __u32 daddr, __u16 sport, __u16 dport, unsigned int size) ++{ ++ return ((daddr + saddr + (sport << 8) + (dport << 16)) % size); ++} ++ ++static __inline__ int ++conn_match(const struct signal_struct *sig, __u32 saddr, __u32 daddr, ++ __u16 sport, __u16 dport) ++{ ++ if (unlikely(sig->gr_saddr == saddr && sig->gr_daddr == daddr && ++ sig->gr_sport == sport && sig->gr_dport == dport)) ++ return 1; ++ else ++ return 0; ++} ++ ++static void gr_add_to_task_ip_table_nolock(struct signal_struct *sig, struct conn_table_entry *newent) ++{ ++ struct conn_table_entry **match; ++ unsigned int index; ++ ++ index = conn_hash(sig->gr_saddr, sig->gr_daddr, ++ sig->gr_sport, sig->gr_dport, ++ gr_conn_table_size); ++ ++ newent->sig = sig; ++ ++ match = &gr_conn_table[index]; ++ newent->next = *match; ++ *match = newent; ++ ++ return; ++} ++ ++static void gr_del_task_from_ip_table_nolock(struct signal_struct *sig) ++{ ++ struct conn_table_entry *match, *last = NULL; ++ unsigned int index; ++ ++ index = conn_hash(sig->gr_saddr, sig->gr_daddr, ++ sig->gr_sport, sig->gr_dport, ++ gr_conn_table_size); ++ ++ match = gr_conn_table[index]; ++ while (match && !conn_match(match->sig, ++ sig->gr_saddr, sig->gr_daddr, sig->gr_sport, ++ sig->gr_dport)) { ++ last = match; ++ match = match->next; ++ } ++ ++ if (match) { ++ if (last) ++ last->next = match->next; ++ else ++ gr_conn_table[index] = NULL; ++ kfree(match); ++ } ++ ++ return; ++} ++ ++static struct signal_struct * gr_lookup_task_ip_table(__u32 saddr, __u32 daddr, ++ __u16 sport, __u16 dport) ++{ ++ struct conn_table_entry *match; ++ unsigned int index; ++ ++ index = conn_hash(saddr, daddr, sport, dport, gr_conn_table_size); ++ ++ match = gr_conn_table[index]; ++ while (match && !conn_match(match->sig, saddr, daddr, sport, dport)) ++ match = match->next; ++ ++ if (match) ++ return match->sig; ++ else ++ return NULL; ++} ++ ++#endif ++ ++void gr_update_task_in_ip_table(const struct inet_sock *inet) ++{ ++#ifdef CONFIG_GRKERNSEC ++ struct signal_struct *sig = current->signal; ++ struct conn_table_entry *newent; ++ ++ newent = kmalloc(sizeof(struct conn_table_entry), GFP_ATOMIC); ++ if (newent == NULL) ++ return; ++ /* no bh lock needed since we are called with bh disabled */ ++ spin_lock(&gr_conn_table_lock); ++ gr_del_task_from_ip_table_nolock(sig); ++ sig->gr_saddr = inet->inet_rcv_saddr; ++ sig->gr_daddr = inet->inet_daddr; ++ sig->gr_sport = inet->inet_sport; ++ sig->gr_dport = inet->inet_dport; ++ gr_add_to_task_ip_table_nolock(sig, newent); ++ spin_unlock(&gr_conn_table_lock); ++#endif ++ return; ++} ++ ++void gr_del_task_from_ip_table(struct task_struct *task) ++{ ++#ifdef CONFIG_GRKERNSEC ++ spin_lock_bh(&gr_conn_table_lock); ++ gr_del_task_from_ip_table_nolock(task->signal); ++ spin_unlock_bh(&gr_conn_table_lock); ++#endif ++ return; ++} ++ ++void ++gr_attach_curr_ip(const struct sock *sk) ++{ ++#ifdef CONFIG_GRKERNSEC ++ struct signal_struct *p, *set; ++ const struct inet_sock *inet = inet_sk(sk); ++ ++ if (unlikely(sk->sk_protocol != IPPROTO_TCP)) ++ return; ++ ++ set = current->signal; ++ ++ spin_lock_bh(&gr_conn_table_lock); ++ p = gr_lookup_task_ip_table(inet->inet_daddr, inet->inet_rcv_saddr, ++ inet->inet_dport, inet->inet_sport); ++ if (unlikely(p != NULL)) { ++ set->curr_ip = p->curr_ip; ++ set->used_accept = 1; ++ gr_del_task_from_ip_table_nolock(p); ++ spin_unlock_bh(&gr_conn_table_lock); ++ return; ++ } ++ spin_unlock_bh(&gr_conn_table_lock); ++ ++ set->curr_ip = inet->inet_daddr; ++ set->used_accept = 1; ++#endif ++ return; ++} ++ ++int ++gr_handle_sock_all(const int family, const int type, const int protocol) ++{ ++#ifdef CONFIG_GRKERNSEC_SOCKET_ALL ++ if (grsec_enable_socket_all && in_group_p(grsec_socket_all_gid) && ++ (family != AF_UNIX)) { ++ if (family == AF_INET) ++ gr_log_str3(GR_DONT_AUDIT, GR_SOCK_MSG, gr_sockfamily_to_name(family), gr_socktype_to_name(type), gr_proto_to_name(protocol)); ++ else ++ gr_log_str2_int(GR_DONT_AUDIT, GR_SOCK_NOINET_MSG, gr_sockfamily_to_name(family), gr_socktype_to_name(type), protocol); ++ return -EACCES; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_sock_server(const struct sockaddr *sck) ++{ ++#ifdef CONFIG_GRKERNSEC_SOCKET_SERVER ++ if (grsec_enable_socket_server && ++ in_group_p(grsec_socket_server_gid) && ++ sck && (sck->sa_family != AF_UNIX) && ++ (sck->sa_family != AF_LOCAL)) { ++ gr_log_noargs(GR_DONT_AUDIT, GR_BIND_MSG); ++ return -EACCES; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_sock_server_other(const struct sock *sck) ++{ ++#ifdef CONFIG_GRKERNSEC_SOCKET_SERVER ++ if (grsec_enable_socket_server && ++ in_group_p(grsec_socket_server_gid) && ++ sck && (sck->sk_family != AF_UNIX) && ++ (sck->sk_family != AF_LOCAL)) { ++ gr_log_noargs(GR_DONT_AUDIT, GR_BIND_MSG); ++ return -EACCES; ++ } ++#endif ++ return 0; ++} ++ ++int ++gr_handle_sock_client(const struct sockaddr *sck) ++{ ++#ifdef CONFIG_GRKERNSEC_SOCKET_CLIENT ++ if (grsec_enable_socket_client && in_group_p(grsec_socket_client_gid) && ++ sck && (sck->sa_family != AF_UNIX) && ++ (sck->sa_family != AF_LOCAL)) { ++ gr_log_noargs(GR_DONT_AUDIT, GR_CONNECT_MSG); ++ return -EACCES; ++ } ++#endif ++ return 0; ++} +diff --git a/grsecurity/grsec_sysctl.c b/grsecurity/grsec_sysctl.c +new file mode 100644 +index 0000000..cce889e +--- /dev/null ++++ b/grsecurity/grsec_sysctl.c +@@ -0,0 +1,488 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/sysctl.h> ++#include <linux/grsecurity.h> ++#include <linux/grinternal.h> ++ ++int ++gr_handle_sysctl_mod(const char *dirname, const char *name, const int op) ++{ ++#ifdef CONFIG_GRKERNSEC_SYSCTL ++ if (dirname == NULL || name == NULL) ++ return 0; ++ if (!strcmp(dirname, "grsecurity") && grsec_lock && (op & MAY_WRITE)) { ++ gr_log_str(GR_DONT_AUDIT, GR_SYSCTL_MSG, name); ++ return -EACCES; ++ } ++#endif ++ return 0; ++} ++ ++#if defined(CONFIG_GRKERNSEC_ROFS) || defined(CONFIG_GRKERNSEC_DENYUSB) ++static int __maybe_unused __read_only one = 1; ++#endif ++ ++#if defined(CONFIG_GRKERNSEC_SYSCTL) || defined(CONFIG_GRKERNSEC_ROFS) || \ ++ defined(CONFIG_GRKERNSEC_DENYUSB) ++struct ctl_table grsecurity_table[] = { ++#ifdef CONFIG_GRKERNSEC_SYSCTL ++#ifdef CONFIG_GRKERNSEC_SYSCTL_DISTRO ++#ifdef CONFIG_GRKERNSEC_IO ++ { ++ .procname = "disable_priv_io", ++ .data = &grsec_disable_privio, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#endif ++#ifdef CONFIG_GRKERNSEC_LINK ++ { ++ .procname = "linking_restrictions", ++ .data = &grsec_enable_link, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_SYMLINKOWN ++ { ++ .procname = "enforce_symlinksifowner", ++ .data = &grsec_enable_symlinkown, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++ { ++ .procname = "symlinkown_gid", ++ .data = &grsec_symlinkown_gid, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_BRUTE ++ { ++ .procname = "deter_bruteforce", ++ .data = &grsec_enable_brute, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_FIFO ++ { ++ .procname = "fifo_restrictions", ++ .data = &grsec_enable_fifo, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_PTRACE_READEXEC ++ { ++ .procname = "ptrace_readexec", ++ .data = &grsec_enable_ptrace_readexec, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_SETXID ++ { ++ .procname = "consistent_setxid", ++ .data = &grsec_enable_setxid, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ { ++ .procname = "ip_blackhole", ++ .data = &grsec_enable_blackhole, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++ { ++ .procname = "lastack_retries", ++ .data = &grsec_lastack_retries, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_EXECLOG ++ { ++ .procname = "exec_logging", ++ .data = &grsec_enable_execlog, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++ { ++ .procname = "rwxmap_logging", ++ .data = &grsec_enable_log_rwxmaps, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_SIGNAL ++ { ++ .procname = "signal_logging", ++ .data = &grsec_enable_signal, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_FORKFAIL ++ { ++ .procname = "forkfail_logging", ++ .data = &grsec_enable_forkfail, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_TIME ++ { ++ .procname = "timechange_logging", ++ .data = &grsec_enable_time, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_SHMAT ++ { ++ .procname = "chroot_deny_shmat", ++ .data = &grsec_enable_chroot_shmat, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_UNIX ++ { ++ .procname = "chroot_deny_unix", ++ .data = &grsec_enable_chroot_unix, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_MOUNT ++ { ++ .procname = "chroot_deny_mount", ++ .data = &grsec_enable_chroot_mount, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_FCHDIR ++ { ++ .procname = "chroot_deny_fchdir", ++ .data = &grsec_enable_chroot_fchdir, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_DOUBLE ++ { ++ .procname = "chroot_deny_chroot", ++ .data = &grsec_enable_chroot_double, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_PIVOT ++ { ++ .procname = "chroot_deny_pivot", ++ .data = &grsec_enable_chroot_pivot, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_CHDIR ++ { ++ .procname = "chroot_enforce_chdir", ++ .data = &grsec_enable_chroot_chdir, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_CHMOD ++ { ++ .procname = "chroot_deny_chmod", ++ .data = &grsec_enable_chroot_chmod, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_MKNOD ++ { ++ .procname = "chroot_deny_mknod", ++ .data = &grsec_enable_chroot_mknod, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_NICE ++ { ++ .procname = "chroot_restrict_nice", ++ .data = &grsec_enable_chroot_nice, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_EXECLOG ++ { ++ .procname = "chroot_execlog", ++ .data = &grsec_enable_chroot_execlog, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_CAPS ++ { ++ .procname = "chroot_caps", ++ .data = &grsec_enable_chroot_caps, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_RENAME ++ { ++ .procname = "chroot_deny_bad_rename", ++ .data = &grsec_enable_chroot_rename, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_SYSCTL ++ { ++ .procname = "chroot_deny_sysctl", ++ .data = &grsec_enable_chroot_sysctl, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_TPE ++ { ++ .procname = "tpe", ++ .data = &grsec_enable_tpe, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++ { ++ .procname = "tpe_gid", ++ .data = &grsec_tpe_gid, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_TPE_INVERT ++ { ++ .procname = "tpe_invert", ++ .data = &grsec_enable_tpe_invert, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_TPE_ALL ++ { ++ .procname = "tpe_restrict_all", ++ .data = &grsec_enable_tpe_all, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_SOCKET_ALL ++ { ++ .procname = "socket_all", ++ .data = &grsec_enable_socket_all, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++ { ++ .procname = "socket_all_gid", ++ .data = &grsec_socket_all_gid, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_SOCKET_CLIENT ++ { ++ .procname = "socket_client", ++ .data = &grsec_enable_socket_client, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++ { ++ .procname = "socket_client_gid", ++ .data = &grsec_socket_client_gid, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_SOCKET_SERVER ++ { ++ .procname = "socket_server", ++ .data = &grsec_enable_socket_server, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++ { ++ .procname = "socket_server_gid", ++ .data = &grsec_socket_server_gid, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_AUDIT_GROUP ++ { ++ .procname = "audit_group", ++ .data = &grsec_enable_group, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++ { ++ .procname = "audit_gid", ++ .data = &grsec_audit_gid, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_AUDIT_CHDIR ++ { ++ .procname = "audit_chdir", ++ .data = &grsec_enable_chdir, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_AUDIT_MOUNT ++ { ++ .procname = "audit_mount", ++ .data = &grsec_enable_mount, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_DMESG ++ { ++ .procname = "dmesg", ++ .data = &grsec_enable_dmesg, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_CHROOT_FINDTASK ++ { ++ .procname = "chroot_findtask", ++ .data = &grsec_enable_chroot_findtask, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_RESLOG ++ { ++ .procname = "resource_logging", ++ .data = &grsec_resource_logging, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_AUDIT_PTRACE ++ { ++ .procname = "audit_ptrace", ++ .data = &grsec_enable_audit_ptrace, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_HARDEN_PTRACE ++ { ++ .procname = "harden_ptrace", ++ .data = &grsec_enable_harden_ptrace, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_HARDEN_IPC ++ { ++ .procname = "harden_ipc", ++ .data = &grsec_enable_harden_ipc, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++ { ++ .procname = "grsec_lock", ++ .data = &grsec_lock, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++#ifdef CONFIG_GRKERNSEC_ROFS ++ { ++ .procname = "romount_protect", ++ .data = &grsec_enable_rofs, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = &one, ++ .extra2 = &one, ++ }, ++#endif ++#if defined(CONFIG_GRKERNSEC_DENYUSB) && !defined(CONFIG_GRKERNSEC_DENYUSB_FORCE) ++ { ++ .procname = "deny_new_usb", ++ .data = &grsec_deny_new_usb, ++ .maxlen = sizeof(int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++#endif ++ { } ++}; ++#endif +diff --git a/grsecurity/grsec_time.c b/grsecurity/grsec_time.c +new file mode 100644 +index 0000000..61b514e +--- /dev/null ++++ b/grsecurity/grsec_time.c +@@ -0,0 +1,16 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/grinternal.h> ++#include <linux/module.h> ++ ++void ++gr_log_timechange(void) ++{ ++#ifdef CONFIG_GRKERNSEC_TIME ++ if (grsec_enable_time) ++ gr_log_noargs(GR_DONT_AUDIT_GOOD, GR_TIME_MSG); ++#endif ++ return; ++} ++ ++EXPORT_SYMBOL_GPL(gr_log_timechange); +diff --git a/grsecurity/grsec_tpe.c b/grsecurity/grsec_tpe.c +new file mode 100644 +index 0000000..d1953de +--- /dev/null ++++ b/grsecurity/grsec_tpe.c +@@ -0,0 +1,78 @@ ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/file.h> ++#include <linux/fs.h> ++#include <linux/grinternal.h> ++ ++extern int gr_acl_tpe_check(void); ++ ++int ++gr_tpe_allow(const struct file *file) ++{ ++#ifdef CONFIG_GRKERNSEC ++ struct inode *inode = file->f_path.dentry->d_parent->d_inode; ++ struct inode *file_inode = file->f_path.dentry->d_inode; ++ const struct cred *cred = current_cred(); ++ char *msg = NULL; ++ char *msg2 = NULL; ++ ++ // never restrict root ++ if (gr_is_global_root(cred->uid)) ++ return 1; ++ ++ if (grsec_enable_tpe) { ++#ifdef CONFIG_GRKERNSEC_TPE_INVERT ++ if (grsec_enable_tpe_invert && !in_group_p(grsec_tpe_gid)) ++ msg = "not being in trusted group"; ++ else if (!grsec_enable_tpe_invert && in_group_p(grsec_tpe_gid)) ++ msg = "being in untrusted group"; ++#else ++ if (in_group_p(grsec_tpe_gid)) ++ msg = "being in untrusted group"; ++#endif ++ } ++ if (!msg && gr_acl_tpe_check()) ++ msg = "being in untrusted role"; ++ ++ // not in any affected group/role ++ if (!msg) ++ goto next_check; ++ ++ if (gr_is_global_nonroot(inode->i_uid)) ++ msg2 = "file in non-root-owned directory"; ++ else if (inode->i_mode & S_IWOTH) ++ msg2 = "file in world-writable directory"; ++ else if (inode->i_mode & S_IWGRP) ++ msg2 = "file in group-writable directory"; ++ else if (file_inode->i_mode & S_IWOTH) ++ msg2 = "file is world-writable"; ++ ++ if (msg && msg2) { ++ char fullmsg[70] = {0}; ++ snprintf(fullmsg, sizeof(fullmsg)-1, "%s and %s", msg, msg2); ++ gr_log_str_fs(GR_DONT_AUDIT, GR_EXEC_TPE_MSG, fullmsg, file->f_path.dentry, file->f_path.mnt); ++ return 0; ++ } ++ msg = NULL; ++next_check: ++#ifdef CONFIG_GRKERNSEC_TPE_ALL ++ if (!grsec_enable_tpe || !grsec_enable_tpe_all) ++ return 1; ++ ++ if (gr_is_global_nonroot(inode->i_uid) && !uid_eq(inode->i_uid, cred->uid)) ++ msg = "directory not owned by user"; ++ else if (inode->i_mode & S_IWOTH) ++ msg = "file in world-writable directory"; ++ else if (inode->i_mode & S_IWGRP) ++ msg = "file in group-writable directory"; ++ else if (file_inode->i_mode & S_IWOTH) ++ msg = "file is world-writable"; ++ ++ if (msg) { ++ gr_log_str_fs(GR_DONT_AUDIT, GR_EXEC_TPE_MSG, msg, file->f_path.dentry, file->f_path.mnt); ++ return 0; ++ } ++#endif ++#endif ++ return 1; ++} +diff --git a/grsecurity/grsec_usb.c b/grsecurity/grsec_usb.c +new file mode 100644 +index 0000000..ae02d8e +--- /dev/null ++++ b/grsecurity/grsec_usb.c +@@ -0,0 +1,15 @@ ++#include <linux/kernel.h> ++#include <linux/grinternal.h> ++#include <linux/module.h> ++ ++int gr_handle_new_usb(void) ++{ ++#ifdef CONFIG_GRKERNSEC_DENYUSB ++ if (grsec_deny_new_usb) { ++ printk(KERN_ALERT "grsec: denied insert of new USB device\n"); ++ return 1; ++ } ++#endif ++ return 0; ++} ++EXPORT_SYMBOL_GPL(gr_handle_new_usb); +diff --git a/grsecurity/grsum.c b/grsecurity/grsum.c +new file mode 100644 +index 0000000..158b330 +--- /dev/null ++++ b/grsecurity/grsum.c +@@ -0,0 +1,64 @@ ++#include <linux/err.h> ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/mm.h> ++#include <linux/scatterlist.h> ++#include <linux/crypto.h> ++#include <linux/gracl.h> ++ ++ ++#if !defined(CONFIG_CRYPTO) || defined(CONFIG_CRYPTO_MODULE) || !defined(CONFIG_CRYPTO_SHA256) || defined(CONFIG_CRYPTO_SHA256_MODULE) ++#error "crypto and sha256 must be built into the kernel" ++#endif ++ ++int ++chkpw(struct gr_arg *entry, unsigned char *salt, unsigned char *sum) ++{ ++ struct crypto_hash *tfm; ++ struct hash_desc desc; ++ struct scatterlist sg[2]; ++ unsigned char temp_sum[GR_SHA_LEN] __attribute__((aligned(__alignof__(unsigned long)))); ++ unsigned long *tmpsumptr = (unsigned long *)temp_sum; ++ unsigned long *sumptr = (unsigned long *)sum; ++ int cryptres; ++ int retval = 1; ++ volatile int mismatched = 0; ++ volatile int dummy = 0; ++ unsigned int i; ++ ++ tfm = crypto_alloc_hash("sha256", 0, CRYPTO_ALG_ASYNC); ++ if (IS_ERR(tfm)) { ++ /* should never happen, since sha256 should be built in */ ++ memset(entry->pw, 0, GR_PW_LEN); ++ return 1; ++ } ++ ++ sg_init_table(sg, 2); ++ sg_set_buf(&sg[0], salt, GR_SALT_LEN); ++ sg_set_buf(&sg[1], entry->pw, strlen(entry->pw)); ++ ++ desc.tfm = tfm; ++ desc.flags = 0; ++ ++ cryptres = crypto_hash_digest(&desc, sg, GR_SALT_LEN + strlen(entry->pw), ++ temp_sum); ++ ++ memset(entry->pw, 0, GR_PW_LEN); ++ ++ if (cryptres) ++ goto out; ++ ++ for (i = 0; i < GR_SHA_LEN/sizeof(tmpsumptr[0]); i++) ++ if (sumptr[i] != tmpsumptr[i]) ++ mismatched = 1; ++ else ++ dummy = 1; // waste a cycle ++ ++ if (!mismatched) ++ retval = dummy - 1; ++ ++out: ++ crypto_free_hash(tfm); ++ ++ return retval; ++} +diff --git a/include/asm-generic/4level-fixup.h b/include/asm-generic/4level-fixup.h +index 77ff547..181834f 100644 +--- a/include/asm-generic/4level-fixup.h ++++ b/include/asm-generic/4level-fixup.h +@@ -13,8 +13,10 @@ + #define pmd_alloc(mm, pud, address) \ + ((unlikely(pgd_none(*(pud))) && __pmd_alloc(mm, pud, address))? \ + NULL: pmd_offset(pud, address)) ++#define pmd_alloc_kernel(mm, pud, address) pmd_alloc((mm), (pud), (address)) + + #define pud_alloc(mm, pgd, address) (pgd) ++#define pud_alloc_kernel(mm, pgd, address) pud_alloc((mm), (pgd), (address)) + #define pud_offset(pgd, start) (pgd) + #define pud_none(pud) 0 + #define pud_bad(pud) 0 +diff --git a/include/asm-generic/atomic-long.h b/include/asm-generic/atomic-long.h +index b7babf0..1e4b4f1 100644 +--- a/include/asm-generic/atomic-long.h ++++ b/include/asm-generic/atomic-long.h +@@ -22,6 +22,12 @@ + + typedef atomic64_t atomic_long_t; + ++#ifdef CONFIG_PAX_REFCOUNT ++typedef atomic64_unchecked_t atomic_long_unchecked_t; ++#else ++typedef atomic64_t atomic_long_unchecked_t; ++#endif ++ + #define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i) + + static inline long atomic_long_read(atomic_long_t *l) +@@ -31,6 +37,15 @@ static inline long atomic_long_read(atomic_long_t *l) + return (long)atomic64_read(v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline long atomic_long_read_unchecked(atomic_long_unchecked_t *l) ++{ ++ atomic64_unchecked_t *v = (atomic64_unchecked_t *)l; ++ ++ return (long)atomic64_read_unchecked(v); ++} ++#endif ++ + static inline void atomic_long_set(atomic_long_t *l, long i) + { + atomic64_t *v = (atomic64_t *)l; +@@ -38,6 +53,15 @@ static inline void atomic_long_set(atomic_long_t *l, long i) + atomic64_set(v, i); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_set_unchecked(atomic_long_unchecked_t *l, long i) ++{ ++ atomic64_unchecked_t *v = (atomic64_unchecked_t *)l; ++ ++ atomic64_set_unchecked(v, i); ++} ++#endif ++ + static inline void atomic_long_inc(atomic_long_t *l) + { + atomic64_t *v = (atomic64_t *)l; +@@ -45,6 +69,15 @@ static inline void atomic_long_inc(atomic_long_t *l) + atomic64_inc(v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_inc_unchecked(atomic_long_unchecked_t *l) ++{ ++ atomic64_unchecked_t *v = (atomic64_unchecked_t *)l; ++ ++ atomic64_inc_unchecked(v); ++} ++#endif ++ + static inline void atomic_long_dec(atomic_long_t *l) + { + atomic64_t *v = (atomic64_t *)l; +@@ -52,6 +85,15 @@ static inline void atomic_long_dec(atomic_long_t *l) + atomic64_dec(v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_dec_unchecked(atomic_long_unchecked_t *l) ++{ ++ atomic64_unchecked_t *v = (atomic64_unchecked_t *)l; ++ ++ atomic64_dec_unchecked(v); ++} ++#endif ++ + static inline void atomic_long_add(long i, atomic_long_t *l) + { + atomic64_t *v = (atomic64_t *)l; +@@ -59,6 +101,15 @@ static inline void atomic_long_add(long i, atomic_long_t *l) + atomic64_add(i, v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_add_unchecked(long i, atomic_long_unchecked_t *l) ++{ ++ atomic64_unchecked_t *v = (atomic64_unchecked_t *)l; ++ ++ atomic64_add_unchecked(i, v); ++} ++#endif ++ + static inline void atomic_long_sub(long i, atomic_long_t *l) + { + atomic64_t *v = (atomic64_t *)l; +@@ -66,6 +117,15 @@ static inline void atomic_long_sub(long i, atomic_long_t *l) + atomic64_sub(i, v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_sub_unchecked(long i, atomic_long_unchecked_t *l) ++{ ++ atomic64_unchecked_t *v = (atomic64_unchecked_t *)l; ++ ++ atomic64_sub_unchecked(i, v); ++} ++#endif ++ + static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) + { + atomic64_t *v = (atomic64_t *)l; +@@ -94,13 +154,22 @@ static inline int atomic_long_add_negative(long i, atomic_long_t *l) + return atomic64_add_negative(i, v); + } + +-static inline long atomic_long_add_return(long i, atomic_long_t *l) ++static inline long __intentional_overflow(-1) atomic_long_add_return(long i, atomic_long_t *l) + { + atomic64_t *v = (atomic64_t *)l; + + return (long)atomic64_add_return(i, v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline long atomic_long_add_return_unchecked(long i, atomic_long_unchecked_t *l) ++{ ++ atomic64_unchecked_t *v = (atomic64_unchecked_t *)l; ++ ++ return (long)atomic64_add_return_unchecked(i, v); ++} ++#endif ++ + static inline long atomic_long_sub_return(long i, atomic_long_t *l) + { + atomic64_t *v = (atomic64_t *)l; +@@ -115,6 +184,15 @@ static inline long atomic_long_inc_return(atomic_long_t *l) + return (long)atomic64_inc_return(v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline long atomic_long_inc_return_unchecked(atomic_long_unchecked_t *l) ++{ ++ atomic64_unchecked_t *v = (atomic64_unchecked_t *)l; ++ ++ return (long)atomic64_inc_return_unchecked(v); ++} ++#endif ++ + static inline long atomic_long_dec_return(atomic_long_t *l) + { + atomic64_t *v = (atomic64_t *)l; +@@ -140,6 +218,12 @@ static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) + + typedef atomic_t atomic_long_t; + ++#ifdef CONFIG_PAX_REFCOUNT ++typedef atomic_unchecked_t atomic_long_unchecked_t; ++#else ++typedef atomic_t atomic_long_unchecked_t; ++#endif ++ + #define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i) + static inline long atomic_long_read(atomic_long_t *l) + { +@@ -148,6 +232,15 @@ static inline long atomic_long_read(atomic_long_t *l) + return (long)atomic_read(v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline long atomic_long_read_unchecked(atomic_long_unchecked_t *l) ++{ ++ atomic_unchecked_t *v = (atomic_unchecked_t *)l; ++ ++ return (long)atomic_read_unchecked(v); ++} ++#endif ++ + static inline void atomic_long_set(atomic_long_t *l, long i) + { + atomic_t *v = (atomic_t *)l; +@@ -155,6 +248,15 @@ static inline void atomic_long_set(atomic_long_t *l, long i) + atomic_set(v, i); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_set_unchecked(atomic_long_unchecked_t *l, long i) ++{ ++ atomic_unchecked_t *v = (atomic_unchecked_t *)l; ++ ++ atomic_set_unchecked(v, i); ++} ++#endif ++ + static inline void atomic_long_inc(atomic_long_t *l) + { + atomic_t *v = (atomic_t *)l; +@@ -162,6 +264,15 @@ static inline void atomic_long_inc(atomic_long_t *l) + atomic_inc(v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_inc_unchecked(atomic_long_unchecked_t *l) ++{ ++ atomic_unchecked_t *v = (atomic_unchecked_t *)l; ++ ++ atomic_inc_unchecked(v); ++} ++#endif ++ + static inline void atomic_long_dec(atomic_long_t *l) + { + atomic_t *v = (atomic_t *)l; +@@ -169,6 +280,15 @@ static inline void atomic_long_dec(atomic_long_t *l) + atomic_dec(v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_dec_unchecked(atomic_long_unchecked_t *l) ++{ ++ atomic_unchecked_t *v = (atomic_unchecked_t *)l; ++ ++ atomic_dec_unchecked(v); ++} ++#endif ++ + static inline void atomic_long_add(long i, atomic_long_t *l) + { + atomic_t *v = (atomic_t *)l; +@@ -176,6 +296,15 @@ static inline void atomic_long_add(long i, atomic_long_t *l) + atomic_add(i, v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_add_unchecked(long i, atomic_long_unchecked_t *l) ++{ ++ atomic_unchecked_t *v = (atomic_unchecked_t *)l; ++ ++ atomic_add_unchecked(i, v); ++} ++#endif ++ + static inline void atomic_long_sub(long i, atomic_long_t *l) + { + atomic_t *v = (atomic_t *)l; +@@ -183,6 +312,15 @@ static inline void atomic_long_sub(long i, atomic_long_t *l) + atomic_sub(i, v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void atomic_long_sub_unchecked(long i, atomic_long_unchecked_t *l) ++{ ++ atomic_unchecked_t *v = (atomic_unchecked_t *)l; ++ ++ atomic_sub_unchecked(i, v); ++} ++#endif ++ + static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) + { + atomic_t *v = (atomic_t *)l; +@@ -211,13 +349,23 @@ static inline int atomic_long_add_negative(long i, atomic_long_t *l) + return atomic_add_negative(i, v); + } + +-static inline long atomic_long_add_return(long i, atomic_long_t *l) ++static inline long __intentional_overflow(-1) atomic_long_add_return(long i, atomic_long_t *l) + { + atomic_t *v = (atomic_t *)l; + + return (long)atomic_add_return(i, v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline long atomic_long_add_return_unchecked(long i, atomic_long_unchecked_t *l) ++{ ++ atomic_unchecked_t *v = (atomic_unchecked_t *)l; ++ ++ return (long)atomic_add_return_unchecked(i, v); ++} ++ ++#endif ++ + static inline long atomic_long_sub_return(long i, atomic_long_t *l) + { + atomic_t *v = (atomic_t *)l; +@@ -232,6 +380,15 @@ static inline long atomic_long_inc_return(atomic_long_t *l) + return (long)atomic_inc_return(v); + } + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline long atomic_long_inc_return_unchecked(atomic_long_unchecked_t *l) ++{ ++ atomic_unchecked_t *v = (atomic_unchecked_t *)l; ++ ++ return (long)atomic_inc_return_unchecked(v); ++} ++#endif ++ + static inline long atomic_long_dec_return(atomic_long_t *l) + { + atomic_t *v = (atomic_t *)l; +@@ -255,4 +412,57 @@ static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) + + #endif /* BITS_PER_LONG == 64 */ + ++#ifdef CONFIG_PAX_REFCOUNT ++static inline void pax_refcount_needs_these_functions(void) ++{ ++ atomic_read_unchecked((atomic_unchecked_t *)NULL); ++ atomic_set_unchecked((atomic_unchecked_t *)NULL, 0); ++ atomic_add_unchecked(0, (atomic_unchecked_t *)NULL); ++ atomic_sub_unchecked(0, (atomic_unchecked_t *)NULL); ++ atomic_inc_unchecked((atomic_unchecked_t *)NULL); ++ (void)atomic_inc_and_test_unchecked((atomic_unchecked_t *)NULL); ++ atomic_inc_return_unchecked((atomic_unchecked_t *)NULL); ++ atomic_add_return_unchecked(0, (atomic_unchecked_t *)NULL); ++ atomic_dec_unchecked((atomic_unchecked_t *)NULL); ++ atomic_cmpxchg_unchecked((atomic_unchecked_t *)NULL, 0, 0); ++ (void)atomic_xchg_unchecked((atomic_unchecked_t *)NULL, 0); ++#ifdef CONFIG_X86 ++ atomic_clear_mask_unchecked(0, NULL); ++ atomic_set_mask_unchecked(0, NULL); ++#endif ++ ++ atomic_long_read_unchecked((atomic_long_unchecked_t *)NULL); ++ atomic_long_set_unchecked((atomic_long_unchecked_t *)NULL, 0); ++ atomic_long_add_unchecked(0, (atomic_long_unchecked_t *)NULL); ++ atomic_long_sub_unchecked(0, (atomic_long_unchecked_t *)NULL); ++ atomic_long_inc_unchecked((atomic_long_unchecked_t *)NULL); ++ atomic_long_add_return_unchecked(0, (atomic_long_unchecked_t *)NULL); ++ atomic_long_inc_return_unchecked((atomic_long_unchecked_t *)NULL); ++ atomic_long_dec_unchecked((atomic_long_unchecked_t *)NULL); ++} ++#else ++#define atomic_read_unchecked(v) atomic_read(v) ++#define atomic_set_unchecked(v, i) atomic_set((v), (i)) ++#define atomic_add_unchecked(i, v) atomic_add((i), (v)) ++#define atomic_sub_unchecked(i, v) atomic_sub((i), (v)) ++#define atomic_inc_unchecked(v) atomic_inc(v) ++#define atomic_inc_and_test_unchecked(v) atomic_inc_and_test(v) ++#define atomic_inc_return_unchecked(v) atomic_inc_return(v) ++#define atomic_add_return_unchecked(i, v) atomic_add_return((i), (v)) ++#define atomic_dec_unchecked(v) atomic_dec(v) ++#define atomic_cmpxchg_unchecked(v, o, n) atomic_cmpxchg((v), (o), (n)) ++#define atomic_xchg_unchecked(v, i) atomic_xchg((v), (i)) ++#define atomic_clear_mask_unchecked(mask, v) atomic_clear_mask((mask), (v)) ++#define atomic_set_mask_unchecked(mask, v) atomic_set_mask((mask), (v)) ++ ++#define atomic_long_read_unchecked(v) atomic_long_read(v) ++#define atomic_long_set_unchecked(v, i) atomic_long_set((v), (i)) ++#define atomic_long_add_unchecked(i, v) atomic_long_add((i), (v)) ++#define atomic_long_sub_unchecked(i, v) atomic_long_sub((i), (v)) ++#define atomic_long_inc_unchecked(v) atomic_long_inc(v) ++#define atomic_long_add_return_unchecked(i, v) atomic_long_add_return((i), (v)) ++#define atomic_long_inc_return_unchecked(v) atomic_long_inc_return(v) ++#define atomic_long_dec_unchecked(v) atomic_long_dec(v) ++#endif ++ + #endif /* _ASM_GENERIC_ATOMIC_LONG_H */ +diff --git a/include/asm-generic/atomic64.h b/include/asm-generic/atomic64.h +index 30ad9c8..c70c170 100644 +--- a/include/asm-generic/atomic64.h ++++ b/include/asm-generic/atomic64.h +@@ -16,6 +16,8 @@ typedef struct { + long long counter; + } atomic64_t; + ++typedef atomic64_t atomic64_unchecked_t; ++ + #define ATOMIC64_INIT(i) { (i) } + + extern long long atomic64_read(const atomic64_t *v); +@@ -51,4 +53,14 @@ extern int atomic64_add_unless(atomic64_t *v, long long a, long long u); + #define atomic64_dec_and_test(v) (atomic64_dec_return((v)) == 0) + #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1LL, 0LL) + ++#define atomic64_read_unchecked(v) atomic64_read(v) ++#define atomic64_set_unchecked(v, i) atomic64_set((v), (i)) ++#define atomic64_add_unchecked(a, v) atomic64_add((a), (v)) ++#define atomic64_add_return_unchecked(a, v) atomic64_add_return((a), (v)) ++#define atomic64_sub_unchecked(a, v) atomic64_sub((a), (v)) ++#define atomic64_inc_unchecked(v) atomic64_inc(v) ++#define atomic64_inc_return_unchecked(v) atomic64_inc_return(v) ++#define atomic64_dec_unchecked(v) atomic64_dec(v) ++#define atomic64_cmpxchg_unchecked(v, o, n) atomic64_cmpxchg((v), (o), (n)) ++ + #endif /* _ASM_GENERIC_ATOMIC64_H */ +diff --git a/include/asm-generic/barrier.h b/include/asm-generic/barrier.h +index 1402fa8..025a736 100644 +--- a/include/asm-generic/barrier.h ++++ b/include/asm-generic/barrier.h +@@ -74,7 +74,7 @@ + do { \ + compiletime_assert_atomic_type(*p); \ + smp_mb(); \ +- ACCESS_ONCE(*p) = (v); \ ++ ACCESS_ONCE_RW(*p) = (v); \ + } while (0) + + #define smp_load_acquire(p) \ +diff --git a/include/asm-generic/bitops/__fls.h b/include/asm-generic/bitops/__fls.h +index a60a7cc..0fe12f2 100644 +--- a/include/asm-generic/bitops/__fls.h ++++ b/include/asm-generic/bitops/__fls.h +@@ -9,7 +9,7 @@ + * + * Undefined if no set bit exists, so code should check against 0 first. + */ +-static __always_inline unsigned long __fls(unsigned long word) ++static __always_inline unsigned long __intentional_overflow(-1) __fls(unsigned long word) + { + int num = BITS_PER_LONG - 1; + +diff --git a/include/asm-generic/bitops/fls.h b/include/asm-generic/bitops/fls.h +index 0576d1f..dad6c71 100644 +--- a/include/asm-generic/bitops/fls.h ++++ b/include/asm-generic/bitops/fls.h +@@ -9,7 +9,7 @@ + * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. + */ + +-static __always_inline int fls(int x) ++static __always_inline int __intentional_overflow(-1) fls(int x) + { + int r = 32; + +diff --git a/include/asm-generic/bitops/fls64.h b/include/asm-generic/bitops/fls64.h +index b097cf8..3d40e14 100644 +--- a/include/asm-generic/bitops/fls64.h ++++ b/include/asm-generic/bitops/fls64.h +@@ -15,7 +15,7 @@ + * at position 64. + */ + #if BITS_PER_LONG == 32 +-static __always_inline int fls64(__u64 x) ++static __always_inline int __intentional_overflow(-1) fls64(__u64 x) + { + __u32 h = x >> 32; + if (h) +@@ -23,7 +23,7 @@ static __always_inline int fls64(__u64 x) + return fls(x); + } + #elif BITS_PER_LONG == 64 +-static __always_inline int fls64(__u64 x) ++static __always_inline int __intentional_overflow(-1) fls64(__u64 x) + { + if (x == 0) + return 0; +diff --git a/include/asm-generic/cache.h b/include/asm-generic/cache.h +index 1bfcfe5..e04c5c9 100644 +--- a/include/asm-generic/cache.h ++++ b/include/asm-generic/cache.h +@@ -6,7 +6,7 @@ + * cache lines need to provide their own cache.h. + */ + +-#define L1_CACHE_SHIFT 5 +-#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) ++#define L1_CACHE_SHIFT 5UL ++#define L1_CACHE_BYTES (1UL << L1_CACHE_SHIFT) + + #endif /* __ASM_GENERIC_CACHE_H */ +diff --git a/include/asm-generic/emergency-restart.h b/include/asm-generic/emergency-restart.h +index 0d68a1e..b74a761 100644 +--- a/include/asm-generic/emergency-restart.h ++++ b/include/asm-generic/emergency-restart.h +@@ -1,7 +1,7 @@ + #ifndef _ASM_GENERIC_EMERGENCY_RESTART_H + #define _ASM_GENERIC_EMERGENCY_RESTART_H + +-static inline void machine_emergency_restart(void) ++static inline __noreturn void machine_emergency_restart(void) + { + machine_restart(NULL); + } +diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h +index b8fdc57..c6d5a5c 100644 +--- a/include/asm-generic/io.h ++++ b/include/asm-generic/io.h +@@ -289,7 +289,7 @@ static inline void pci_iounmap(struct pci_dev *dev, void __iomem *p) + * These are pretty trivial + */ + #ifndef virt_to_phys +-static inline unsigned long virt_to_phys(volatile void *address) ++static inline unsigned long __intentional_overflow(-1) virt_to_phys(volatile void *address) + { + return __pa((unsigned long)address); + } +diff --git a/include/asm-generic/kmap_types.h b/include/asm-generic/kmap_types.h +index 90f99c7..00ce236 100644 +--- a/include/asm-generic/kmap_types.h ++++ b/include/asm-generic/kmap_types.h +@@ -2,9 +2,9 @@ + #define _ASM_GENERIC_KMAP_TYPES_H + + #ifdef __WITH_KM_FENCE +-# define KM_TYPE_NR 41 ++# define KM_TYPE_NR 42 + #else +-# define KM_TYPE_NR 20 ++# define KM_TYPE_NR 21 + #endif + + #endif +diff --git a/include/asm-generic/local.h b/include/asm-generic/local.h +index 9ceb03b..62b0b8f 100644 +--- a/include/asm-generic/local.h ++++ b/include/asm-generic/local.h +@@ -23,24 +23,37 @@ typedef struct + atomic_long_t a; + } local_t; + ++typedef struct { ++ atomic_long_unchecked_t a; ++} local_unchecked_t; ++ + #define LOCAL_INIT(i) { ATOMIC_LONG_INIT(i) } + + #define local_read(l) atomic_long_read(&(l)->a) ++#define local_read_unchecked(l) atomic_long_read_unchecked(&(l)->a) + #define local_set(l,i) atomic_long_set((&(l)->a),(i)) ++#define local_set_unchecked(l,i) atomic_long_set_unchecked((&(l)->a),(i)) + #define local_inc(l) atomic_long_inc(&(l)->a) ++#define local_inc_unchecked(l) atomic_long_inc_unchecked(&(l)->a) + #define local_dec(l) atomic_long_dec(&(l)->a) ++#define local_dec_unchecked(l) atomic_long_dec_unchecked(&(l)->a) + #define local_add(i,l) atomic_long_add((i),(&(l)->a)) ++#define local_add_unchecked(i,l) atomic_long_add_unchecked((i),(&(l)->a)) + #define local_sub(i,l) atomic_long_sub((i),(&(l)->a)) ++#define local_sub_unchecked(i,l) atomic_long_sub_unchecked((i),(&(l)->a)) + + #define local_sub_and_test(i, l) atomic_long_sub_and_test((i), (&(l)->a)) + #define local_dec_and_test(l) atomic_long_dec_and_test(&(l)->a) + #define local_inc_and_test(l) atomic_long_inc_and_test(&(l)->a) + #define local_add_negative(i, l) atomic_long_add_negative((i), (&(l)->a)) + #define local_add_return(i, l) atomic_long_add_return((i), (&(l)->a)) ++#define local_add_return_unchecked(i, l) atomic_long_add_return_unchecked((i), (&(l)->a)) + #define local_sub_return(i, l) atomic_long_sub_return((i), (&(l)->a)) + #define local_inc_return(l) atomic_long_inc_return(&(l)->a) ++#define local_dec_return(l) atomic_long_dec_return(&(l)->a) + + #define local_cmpxchg(l, o, n) atomic_long_cmpxchg((&(l)->a), (o), (n)) ++#define local_cmpxchg_unchecked(l, o, n) atomic_long_cmpxchg((&(l)->a), (o), (n)) + #define local_xchg(l, n) atomic_long_xchg((&(l)->a), (n)) + #define local_add_unless(l, _a, u) atomic_long_add_unless((&(l)->a), (_a), (u)) + #define local_inc_not_zero(l) atomic_long_inc_not_zero(&(l)->a) +diff --git a/include/asm-generic/pgtable-nopmd.h b/include/asm-generic/pgtable-nopmd.h +index 725612b..9cc513a 100644 +--- a/include/asm-generic/pgtable-nopmd.h ++++ b/include/asm-generic/pgtable-nopmd.h +@@ -1,14 +1,19 @@ + #ifndef _PGTABLE_NOPMD_H + #define _PGTABLE_NOPMD_H + +-#ifndef __ASSEMBLY__ +- + #include <asm-generic/pgtable-nopud.h> + +-struct mm_struct; +- + #define __PAGETABLE_PMD_FOLDED + ++#define PMD_SHIFT PUD_SHIFT ++#define PTRS_PER_PMD 1 ++#define PMD_SIZE (_AC(1,UL) << PMD_SHIFT) ++#define PMD_MASK (~(PMD_SIZE-1)) ++ ++#ifndef __ASSEMBLY__ ++ ++struct mm_struct; ++ + /* + * Having the pmd type consist of a pud gets the size right, and allows + * us to conceptually access the pud entry that this pmd is folded into +@@ -16,11 +21,6 @@ struct mm_struct; + */ + typedef struct { pud_t pud; } pmd_t; + +-#define PMD_SHIFT PUD_SHIFT +-#define PTRS_PER_PMD 1 +-#define PMD_SIZE (1UL << PMD_SHIFT) +-#define PMD_MASK (~(PMD_SIZE-1)) +- + /* + * The "pud_xxx()" functions here are trivial for a folded two-level + * setup: the pmd is never bad, and a pmd always exists (as it's folded +diff --git a/include/asm-generic/pgtable-nopud.h b/include/asm-generic/pgtable-nopud.h +index 810431d..0ec4804f 100644 +--- a/include/asm-generic/pgtable-nopud.h ++++ b/include/asm-generic/pgtable-nopud.h +@@ -1,10 +1,15 @@ + #ifndef _PGTABLE_NOPUD_H + #define _PGTABLE_NOPUD_H + +-#ifndef __ASSEMBLY__ +- + #define __PAGETABLE_PUD_FOLDED + ++#define PUD_SHIFT PGDIR_SHIFT ++#define PTRS_PER_PUD 1 ++#define PUD_SIZE (_AC(1,UL) << PUD_SHIFT) ++#define PUD_MASK (~(PUD_SIZE-1)) ++ ++#ifndef __ASSEMBLY__ ++ + /* + * Having the pud type consist of a pgd gets the size right, and allows + * us to conceptually access the pgd entry that this pud is folded into +@@ -12,11 +17,6 @@ + */ + typedef struct { pgd_t pgd; } pud_t; + +-#define PUD_SHIFT PGDIR_SHIFT +-#define PTRS_PER_PUD 1 +-#define PUD_SIZE (1UL << PUD_SHIFT) +-#define PUD_MASK (~(PUD_SIZE-1)) +- + /* + * The "pgd_xxx()" functions here are trivial for a folded two-level + * setup: the pud is never bad, and a pud always exists (as it's folded +@@ -29,6 +29,7 @@ static inline void pgd_clear(pgd_t *pgd) { } + #define pud_ERROR(pud) (pgd_ERROR((pud).pgd)) + + #define pgd_populate(mm, pgd, pud) do { } while (0) ++#define pgd_populate_kernel(mm, pgd, pud) do { } while (0) + /* + * (puds are folded into pgds so this doesn't get actually called, + * but the define is needed for a generic inline function.) +diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h +index 752e30d..87f172d 100644 +--- a/include/asm-generic/pgtable.h ++++ b/include/asm-generic/pgtable.h +@@ -828,6 +828,22 @@ static inline void pmdp_set_numa(struct mm_struct *mm, unsigned long addr, + } + #endif /* CONFIG_NUMA_BALANCING */ + ++#ifndef __HAVE_ARCH_PAX_OPEN_KERNEL ++#ifdef CONFIG_PAX_KERNEXEC ++#error KERNEXEC requires pax_open_kernel ++#else ++static inline unsigned long pax_open_kernel(void) { return 0; } ++#endif ++#endif ++ ++#ifndef __HAVE_ARCH_PAX_CLOSE_KERNEL ++#ifdef CONFIG_PAX_KERNEXEC ++#error KERNEXEC requires pax_close_kernel ++#else ++static inline unsigned long pax_close_kernel(void) { return 0; } ++#endif ++#endif ++ + #endif /* CONFIG_MMU */ + + #endif /* !__ASSEMBLY__ */ +diff --git a/include/asm-generic/uaccess.h b/include/asm-generic/uaccess.h +index 72d8803..cb9749c 100644 +--- a/include/asm-generic/uaccess.h ++++ b/include/asm-generic/uaccess.h +@@ -343,4 +343,20 @@ clear_user(void __user *to, unsigned long n) + return __clear_user(to, n); + } + ++#ifndef __HAVE_ARCH_PAX_OPEN_USERLAND ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++#error UDEREF requires pax_open_userland ++#else ++static inline unsigned long pax_open_userland(void) { return 0; } ++#endif ++#endif ++ ++#ifndef __HAVE_ARCH_PAX_CLOSE_USERLAND ++#ifdef CONFIG_PAX_MEMORY_UDEREF ++#error UDEREF requires pax_close_userland ++#else ++static inline unsigned long pax_close_userland(void) { return 0; } ++#endif ++#endif ++ + #endif /* __ASM_GENERIC_UACCESS_H */ +diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h +index aa70cbd..fd72c7a 100644 +--- a/include/asm-generic/vmlinux.lds.h ++++ b/include/asm-generic/vmlinux.lds.h +@@ -233,6 +233,7 @@ + .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ + VMLINUX_SYMBOL(__start_rodata) = .; \ + *(.rodata) *(.rodata.*) \ ++ *(.data..read_only) \ + *(__vermagic) /* Kernel version magic */ \ + . = ALIGN(8); \ + VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .; \ +@@ -724,17 +725,18 @@ + * section in the linker script will go there too. @phdr should have + * a leading colon. + * +- * Note that this macros defines __per_cpu_load as an absolute symbol. ++ * Note that this macros defines per_cpu_load as an absolute symbol. + * If there is no need to put the percpu section at a predetermined + * address, use PERCPU_SECTION. + */ + #define PERCPU_VADDR(cacheline, vaddr, phdr) \ +- VMLINUX_SYMBOL(__per_cpu_load) = .; \ +- .data..percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ ++ per_cpu_load = .; \ ++ .data..percpu vaddr : AT(VMLINUX_SYMBOL(per_cpu_load) \ + - LOAD_OFFSET) { \ ++ VMLINUX_SYMBOL(__per_cpu_load) = . + per_cpu_load; \ + PERCPU_INPUT(cacheline) \ + } phdr \ +- . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data..percpu); ++ . = VMLINUX_SYMBOL(per_cpu_load) + SIZEOF(.data..percpu); + + /** + * PERCPU_SECTION - define output section for percpu area, simple version +diff --git a/include/crypto/algapi.h b/include/crypto/algapi.h +index 623a59c..1e79ab9 100644 +--- a/include/crypto/algapi.h ++++ b/include/crypto/algapi.h +@@ -34,7 +34,7 @@ struct crypto_type { + unsigned int maskclear; + unsigned int maskset; + unsigned int tfmsize; +-}; ++} __do_const; + + struct crypto_instance { + struct crypto_alg alg; +diff --git a/include/drm/drmP.h b/include/drm/drmP.h +index 53ed876..5bb09be 100644 +--- a/include/drm/drmP.h ++++ b/include/drm/drmP.h +@@ -59,6 +59,7 @@ + + #include <asm/mman.h> + #include <asm/pgalloc.h> ++#include <asm/local.h> + #include <asm/uaccess.h> + + #include <uapi/drm/drm.h> +@@ -223,10 +224,12 @@ void drm_err(const char *func, const char *format, ...); + * \param cmd command. + * \param arg argument. + */ +-typedef int drm_ioctl_t(struct drm_device *dev, void *data, ++typedef int (* const drm_ioctl_t)(struct drm_device *dev, void *data, ++ struct drm_file *file_priv); ++typedef int (* drm_ioctl_no_const_t)(struct drm_device *dev, void *data, + struct drm_file *file_priv); + +-typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, ++typedef int (* const drm_ioctl_compat_t)(struct file *filp, unsigned int cmd, + unsigned long arg); + + #define DRM_IOCTL_NR(n) _IOC_NR(n) +@@ -242,10 +245,10 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, + struct drm_ioctl_desc { + unsigned int cmd; + int flags; +- drm_ioctl_t *func; ++ drm_ioctl_t func; + unsigned int cmd_drv; + const char *name; +-}; ++} __do_const; + + /** + * Creates a driver or general drm_ioctl_desc array entry for the given +@@ -629,7 +632,8 @@ struct drm_info_list { + int (*show)(struct seq_file*, void*); /** show callback */ + u32 driver_features; /**< Required driver features for this entry */ + void *data; +-}; ++} __do_const; ++typedef struct drm_info_list __no_const drm_info_list_no_const; + + /** + * debugfs node structure. This structure represents a debugfs file. +@@ -713,7 +717,7 @@ struct drm_device { + + /** \name Usage Counters */ + /*@{ */ +- int open_count; /**< Outstanding files open, protected by drm_global_mutex. */ ++ local_t open_count; /**< Outstanding files open, protected by drm_global_mutex. */ + spinlock_t buf_lock; /**< For drm_device::buf_use and a few other things. */ + int buf_use; /**< Buffers in use -- cannot alloc */ + atomic_t buf_alloc; /**< Buffer allocation in progress */ +diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h +index a3d75fe..6802f9c 100644 +--- a/include/drm/drm_crtc_helper.h ++++ b/include/drm/drm_crtc_helper.h +@@ -109,7 +109,7 @@ struct drm_encoder_helper_funcs { + struct drm_connector *connector); + /* disable encoder when not in use - more explicit than dpms off */ + void (*disable)(struct drm_encoder *encoder); +-}; ++} __no_const; + + /** + * drm_connector_helper_funcs - helper operations for connectors +diff --git a/include/drm/i915_pciids.h b/include/drm/i915_pciids.h +index 47116c8..206522c 100644 +--- a/include/drm/i915_pciids.h ++++ b/include/drm/i915_pciids.h +@@ -37,7 +37,7 @@ + */ + #define INTEL_VGA_DEVICE(id, info) { \ + 0x8086, id, \ +- ~0, ~0, \ ++ PCI_ANY_ID, PCI_ANY_ID, \ + 0x030000, 0xff0000, \ + (unsigned long) info } + +diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h +index 72dcbe8..8db58d7 100644 +--- a/include/drm/ttm/ttm_memory.h ++++ b/include/drm/ttm/ttm_memory.h +@@ -48,7 +48,7 @@ + + struct ttm_mem_shrink { + int (*do_shrink) (struct ttm_mem_shrink *); +-}; ++} __no_const; + + /** + * struct ttm_mem_global - Global memory accounting structure. +diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h +index 49a8284..9643967 100644 +--- a/include/drm/ttm/ttm_page_alloc.h ++++ b/include/drm/ttm/ttm_page_alloc.h +@@ -80,6 +80,7 @@ void ttm_dma_page_alloc_fini(void); + */ + extern int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data); + ++struct device; + extern int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev); + extern void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev); + +diff --git a/include/keys/asymmetric-subtype.h b/include/keys/asymmetric-subtype.h +index 4b840e8..155d235 100644 +--- a/include/keys/asymmetric-subtype.h ++++ b/include/keys/asymmetric-subtype.h +@@ -37,7 +37,7 @@ struct asymmetric_key_subtype { + /* Verify the signature on a key of this subtype (optional) */ + int (*verify_signature)(const struct key *key, + const struct public_key_signature *sig); +-}; ++} __do_const; + + /** + * asymmetric_key_subtype - Get the subtype from an asymmetric key +diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h +index c1da539..1dcec55 100644 +--- a/include/linux/atmdev.h ++++ b/include/linux/atmdev.h +@@ -28,7 +28,7 @@ struct compat_atm_iobuf { + #endif + + struct k_atm_aal_stats { +-#define __HANDLE_ITEM(i) atomic_t i ++#define __HANDLE_ITEM(i) atomic_unchecked_t i + __AAL_STAT_ITEMS + #undef __HANDLE_ITEM + }; +@@ -200,7 +200,7 @@ struct atmdev_ops { /* only send is required */ + int (*change_qos)(struct atm_vcc *vcc,struct atm_qos *qos,int flags); + int (*proc_read)(struct atm_dev *dev,loff_t *pos,char *page); + struct module *owner; +-}; ++} __do_const ; + + struct atmphy_ops { + int (*start)(struct atm_dev *dev); +diff --git a/include/linux/audit.h b/include/linux/audit.h +index 10f155b..6c73ffe 100644 +--- a/include/linux/audit.h ++++ b/include/linux/audit.h +@@ -219,7 +219,7 @@ static inline void audit_ptrace(struct task_struct *t) + extern unsigned int audit_serial(void); + extern int auditsc_get_stamp(struct audit_context *ctx, + struct timespec *t, unsigned int *serial); +-extern int audit_set_loginuid(kuid_t loginuid); ++extern int __intentional_overflow(-1) audit_set_loginuid(kuid_t loginuid); + + static inline kuid_t audit_get_loginuid(struct task_struct *tsk) + { +diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h +index 61f29e5..e67c658 100644 +--- a/include/linux/binfmts.h ++++ b/include/linux/binfmts.h +@@ -44,7 +44,7 @@ struct linux_binprm { + unsigned interp_flags; + unsigned interp_data; + unsigned long loader, exec; +-}; ++} __randomize_layout; + + #define BINPRM_FLAGS_ENFORCE_NONDUMP_BIT 0 + #define BINPRM_FLAGS_ENFORCE_NONDUMP (1 << BINPRM_FLAGS_ENFORCE_NONDUMP_BIT) +@@ -73,8 +73,10 @@ struct linux_binfmt { + int (*load_binary)(struct linux_binprm *); + int (*load_shlib)(struct file *); + int (*core_dump)(struct coredump_params *cprm); ++ void (*handle_mprotect)(struct vm_area_struct *vma, unsigned long newflags); ++ void (*handle_mmap)(struct file *); + unsigned long min_coredump; /* minimal dump size */ +-}; ++} __do_const __randomize_layout; + + extern void __register_binfmt(struct linux_binfmt *fmt, int insert); + +diff --git a/include/linux/bitops.h b/include/linux/bitops.h +index 5d858e0..336c1d9 100644 +--- a/include/linux/bitops.h ++++ b/include/linux/bitops.h +@@ -105,7 +105,7 @@ static inline __u64 ror64(__u64 word, unsigned int shift) + * @word: value to rotate + * @shift: bits to roll + */ +-static inline __u32 rol32(__u32 word, unsigned int shift) ++static inline __u32 __intentional_overflow(-1) rol32(__u32 word, unsigned int shift) + { + return (word << shift) | (word >> (32 - shift)); + } +@@ -115,7 +115,7 @@ static inline __u32 rol32(__u32 word, unsigned int shift) + * @word: value to rotate + * @shift: bits to roll + */ +-static inline __u32 ror32(__u32 word, unsigned int shift) ++static inline __u32 __intentional_overflow(-1) ror32(__u32 word, unsigned int shift) + { + return (word >> shift) | (word << (32 - shift)); + } +@@ -171,7 +171,7 @@ static inline __s32 sign_extend32(__u32 value, int index) + return (__s32)(value << shift) >> shift; + } + +-static inline unsigned fls_long(unsigned long l) ++static inline unsigned __intentional_overflow(-1) fls_long(unsigned long l) + { + if (sizeof(l) == 4) + return fls(l); +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index aac0f9e..73c9869 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -1615,7 +1615,7 @@ struct block_device_operations { + /* this callback is with swap_lock and sometimes page table lock held */ + void (*swap_slot_free_notify) (struct block_device *, unsigned long); + struct module *owner; +-}; ++} __do_const; + + extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int, + unsigned long); +diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h +index afc1343..9735539 100644 +--- a/include/linux/blktrace_api.h ++++ b/include/linux/blktrace_api.h +@@ -25,7 +25,7 @@ struct blk_trace { + struct dentry *dropped_file; + struct dentry *msg_file; + struct list_head running_list; +- atomic_t dropped; ++ atomic_unchecked_t dropped; + }; + + extern int blk_trace_ioctl(struct block_device *, unsigned, char __user *); +diff --git a/include/linux/cache.h b/include/linux/cache.h +index 17e7e82..1d7da26 100644 +--- a/include/linux/cache.h ++++ b/include/linux/cache.h +@@ -16,6 +16,14 @@ + #define __read_mostly + #endif + ++#ifndef __read_only ++#ifdef CONFIG_PAX_KERNEXEC ++#error KERNEXEC requires __read_only ++#else ++#define __read_only __read_mostly ++#endif ++#endif ++ + #ifndef ____cacheline_aligned + #define ____cacheline_aligned __attribute__((__aligned__(SMP_CACHE_BYTES))) + #endif +diff --git a/include/linux/capability.h b/include/linux/capability.h +index aa93e5e..985a1b0 100644 +--- a/include/linux/capability.h ++++ b/include/linux/capability.h +@@ -214,9 +214,14 @@ extern bool has_ns_capability_noaudit(struct task_struct *t, + extern bool capable(int cap); + extern bool ns_capable(struct user_namespace *ns, int cap); + extern bool capable_wrt_inode_uidgid(const struct inode *inode, int cap); ++extern bool capable_wrt_inode_uidgid_nolog(const struct inode *inode, int cap); + extern bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap); ++extern bool capable_nolog(int cap); ++extern bool ns_capable_nolog(struct user_namespace *ns, int cap); + + /* audit system wants to get cap info from files as well */ + extern int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps); + ++extern int is_privileged_binary(const struct dentry *dentry); ++ + #endif /* !_LINUX_CAPABILITY_H */ +diff --git a/include/linux/cdrom.h b/include/linux/cdrom.h +index 8609d57..86e4d79 100644 +--- a/include/linux/cdrom.h ++++ b/include/linux/cdrom.h +@@ -87,7 +87,6 @@ struct cdrom_device_ops { + + /* driver specifications */ + const int capability; /* capability flags */ +- int n_minors; /* number of active minor devices */ + /* handle uniform packets for scsi type devices (scsi,atapi) */ + int (*generic_packet) (struct cdrom_device_info *, + struct packet_command *); +diff --git a/include/linux/cleancache.h b/include/linux/cleancache.h +index 4ce9056..86caac6 100644 +--- a/include/linux/cleancache.h ++++ b/include/linux/cleancache.h +@@ -31,7 +31,7 @@ struct cleancache_ops { + void (*invalidate_page)(int, struct cleancache_filekey, pgoff_t); + void (*invalidate_inode)(int, struct cleancache_filekey); + void (*invalidate_fs)(int); +-}; ++} __no_const; + + extern struct cleancache_ops * + cleancache_register_ops(struct cleancache_ops *ops); +diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h +index 2839c63..5b06b6b 100644 +--- a/include/linux/clk-provider.h ++++ b/include/linux/clk-provider.h +@@ -191,6 +191,7 @@ struct clk_ops { + void (*init)(struct clk_hw *hw); + int (*debug_init)(struct clk_hw *hw, struct dentry *dentry); + }; ++typedef struct clk_ops __no_const clk_ops_no_const; + + /** + * struct clk_init_data - holds init data that's common to all clocks and is +diff --git a/include/linux/compat.h b/include/linux/compat.h +index e649426..a74047b 100644 +--- a/include/linux/compat.h ++++ b/include/linux/compat.h +@@ -316,7 +316,7 @@ compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr, + compat_size_t __user *len_ptr); + + asmlinkage long compat_sys_ipc(u32, int, int, u32, compat_uptr_t, u32); +-asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg); ++asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg) __intentional_overflow(0); + asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg); + asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp, + compat_ssize_t msgsz, int msgflg); +@@ -436,7 +436,7 @@ extern int compat_ptrace_request(struct task_struct *child, + extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request, + compat_ulong_t addr, compat_ulong_t data); + asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, +- compat_long_t addr, compat_long_t data); ++ compat_ulong_t addr, compat_ulong_t data); + + asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t); + /* +diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h +index d1a5582..4424efa 100644 +--- a/include/linux/compiler-gcc4.h ++++ b/include/linux/compiler-gcc4.h +@@ -39,9 +39,34 @@ + # define __compiletime_warning(message) __attribute__((warning(message))) + # define __compiletime_error(message) __attribute__((error(message))) + #endif /* __CHECKER__ */ ++ ++#define __alloc_size(...) __attribute((alloc_size(__VA_ARGS__))) ++#define __bos(ptr, arg) __builtin_object_size((ptr), (arg)) ++#define __bos0(ptr) __bos((ptr), 0) ++#define __bos1(ptr) __bos((ptr), 1) + #endif /* GCC_VERSION >= 40300 */ + + #if GCC_VERSION >= 40500 ++ ++#ifdef RANDSTRUCT_PLUGIN ++#define __randomize_layout __attribute__((randomize_layout)) ++#define __no_randomize_layout __attribute__((no_randomize_layout)) ++#endif ++ ++#ifdef CONSTIFY_PLUGIN ++#define __no_const __attribute__((no_const)) ++#define __do_const __attribute__((do_const)) ++#endif ++ ++#ifdef SIZE_OVERFLOW_PLUGIN ++#define __size_overflow(...) __attribute__((size_overflow(__VA_ARGS__))) ++#define __intentional_overflow(...) __attribute__((intentional_overflow(__VA_ARGS__))) ++#endif ++ ++#ifdef LATENT_ENTROPY_PLUGIN ++#define __latent_entropy __attribute__((latent_entropy)) ++#endif ++ + /* + * Mark a position in code as unreachable. This can be used to + * suppress control flow warnings after asm blocks that transfer +diff --git a/include/linux/compiler-gcc5.h b/include/linux/compiler-gcc5.h +index c8c5659..9b20f4e 100644 +--- a/include/linux/compiler-gcc5.h ++++ b/include/linux/compiler-gcc5.h +@@ -28,6 +28,25 @@ + # define __compiletime_error(message) __attribute__((error(message))) + #endif /* __CHECKER__ */ + ++#define __alloc_size(...) __attribute((alloc_size(__VA_ARGS__))) ++#define __bos(ptr, arg) __builtin_object_size((ptr), (arg)) ++#define __bos0(ptr) __bos((ptr), 0) ++#define __bos1(ptr) __bos((ptr), 1) ++ ++#ifdef CONSTIFY_PLUGIN ++#define __no_const __attribute__((no_const)) ++#define __do_const __attribute__((do_const)) ++#endif ++ ++#ifdef SIZE_OVERFLOW_PLUGIN ++#define __size_overflow(...) __attribute__((size_overflow(__VA_ARGS__))) ++#define __intentional_overflow(...) __attribute__((intentional_overflow(__VA_ARGS__))) ++#endif ++ ++#ifdef LATENT_ENTROPY_PLUGIN ++#define __latent_entropy __attribute__((latent_entropy)) ++#endif ++ + /* + * Mark a position in code as unreachable. This can be used to + * suppress control flow warnings after asm blocks that transfer +diff --git a/include/linux/compiler.h b/include/linux/compiler.h +index 33063f8..3b67335 100644 +--- a/include/linux/compiler.h ++++ b/include/linux/compiler.h +@@ -5,11 +5,14 @@ + + #ifdef __CHECKER__ + # define __user __attribute__((noderef, address_space(1))) ++# define __force_user __force __user + # define __kernel __attribute__((address_space(0))) ++# define __force_kernel __force __kernel + # define __safe __attribute__((safe)) + # define __force __attribute__((force)) + # define __nocast __attribute__((nocast)) + # define __iomem __attribute__((noderef, address_space(2))) ++# define __force_iomem __force __iomem + # define __must_hold(x) __attribute__((context(x,1,1))) + # define __acquires(x) __attribute__((context(x,0,1))) + # define __releases(x) __attribute__((context(x,1,0))) +@@ -17,20 +20,37 @@ + # define __release(x) __context__(x,-1) + # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) + # define __percpu __attribute__((noderef, address_space(3))) ++# define __force_percpu __force __percpu + #ifdef CONFIG_SPARSE_RCU_POINTER + # define __rcu __attribute__((noderef, address_space(4))) ++# define __force_rcu __force __rcu + #else + # define __rcu ++# define __force_rcu + #endif + extern void __chk_user_ptr(const volatile void __user *); + extern void __chk_io_ptr(const volatile void __iomem *); + #else +-# define __user +-# define __kernel ++# ifdef CHECKER_PLUGIN ++//# define __user ++//# define __force_user ++//# define __kernel ++//# define __force_kernel ++# else ++# ifdef STRUCTLEAK_PLUGIN ++# define __user __attribute__((user)) ++# else ++# define __user ++# endif ++# define __force_user ++# define __kernel ++# define __force_kernel ++# endif + # define __safe + # define __force + # define __nocast + # define __iomem ++# define __force_iomem + # define __chk_user_ptr(x) (void)0 + # define __chk_io_ptr(x) (void)0 + # define __builtin_warning(x, y...) (1) +@@ -41,7 +61,9 @@ extern void __chk_io_ptr(const volatile void __iomem *); + # define __release(x) (void)0 + # define __cond_lock(x,c) (c) + # define __percpu ++# define __force_percpu + # define __rcu ++# define __force_rcu + #endif + + /* Indirect macros required for expanded argument pasting, eg. __LINE__. */ +@@ -360,6 +382,34 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s + # define __attribute_const__ /* unimplemented */ + #endif + ++#ifndef __randomize_layout ++# define __randomize_layout ++#endif ++ ++#ifndef __no_randomize_layout ++# define __no_randomize_layout ++#endif ++ ++#ifndef __no_const ++# define __no_const ++#endif ++ ++#ifndef __do_const ++# define __do_const ++#endif ++ ++#ifndef __size_overflow ++# define __size_overflow(...) ++#endif ++ ++#ifndef __intentional_overflow ++# define __intentional_overflow(...) ++#endif ++ ++#ifndef __latent_entropy ++# define __latent_entropy ++#endif ++ + /* + * Tell gcc if a function is cold. The compiler will assume any path + * directly leading to the call is unlikely. +@@ -369,6 +419,22 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s + #define __cold + #endif + ++#ifndef __alloc_size ++#define __alloc_size(...) ++#endif ++ ++#ifndef __bos ++#define __bos(ptr, arg) ++#endif ++ ++#ifndef __bos0 ++#define __bos0(ptr) ++#endif ++ ++#ifndef __bos1 ++#define __bos1(ptr) ++#endif ++ + /* Simple shorthand for a section definition */ + #ifndef __section + # define __section(S) __attribute__ ((__section__(#S))) +@@ -383,6 +449,8 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s + # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) + #endif + ++#define __type_is_unsigned(t) (__same_type((t)0, 0UL) || __same_type((t)0, 0U) || __same_type((t)0, (unsigned short)0) || __same_type((t)0, (unsigned char)0)) ++ + /* Is this type a native word size -- useful for atomic operations */ + #ifndef __native_word + # define __native_word(t) (sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) +@@ -452,7 +520,8 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s + * use is to mediate communication between process-level code and irq/NMI + * handlers, all running on the same CPU. + */ +-#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) ++#define ACCESS_ONCE(x) (*(volatile const typeof(x) *)&(x)) ++#define ACCESS_ONCE_RW(x) (*(volatile typeof(x) *)&(x)) + + /* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */ + #ifdef CONFIG_KPROBES +diff --git a/include/linux/completion.h b/include/linux/completion.h +index 5d5aaae..0ea9b84 100644 +--- a/include/linux/completion.h ++++ b/include/linux/completion.h +@@ -90,16 +90,16 @@ static inline void reinit_completion(struct completion *x) + + extern void wait_for_completion(struct completion *); + extern void wait_for_completion_io(struct completion *); +-extern int wait_for_completion_interruptible(struct completion *x); +-extern int wait_for_completion_killable(struct completion *x); ++extern int wait_for_completion_interruptible(struct completion *x) __intentional_overflow(-1); ++extern int wait_for_completion_killable(struct completion *x) __intentional_overflow(-1); + extern unsigned long wait_for_completion_timeout(struct completion *x, +- unsigned long timeout); ++ unsigned long timeout) __intentional_overflow(-1); + extern unsigned long wait_for_completion_io_timeout(struct completion *x, +- unsigned long timeout); ++ unsigned long timeout) __intentional_overflow(-1); + extern long wait_for_completion_interruptible_timeout( +- struct completion *x, unsigned long timeout); ++ struct completion *x, unsigned long timeout) __intentional_overflow(-1); + extern long wait_for_completion_killable_timeout( +- struct completion *x, unsigned long timeout); ++ struct completion *x, unsigned long timeout) __intentional_overflow(-1); + extern bool try_wait_for_completion(struct completion *x); + extern bool completion_done(struct completion *x); + +diff --git a/include/linux/configfs.h b/include/linux/configfs.h +index 34025df..d94bbbc 100644 +--- a/include/linux/configfs.h ++++ b/include/linux/configfs.h +@@ -125,7 +125,7 @@ struct configfs_attribute { + const char *ca_name; + struct module *ca_owner; + umode_t ca_mode; +-}; ++} __do_const; + + /* + * Users often need to create attribute structures for their configurable +diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h +index 503b085..1638c9e 100644 +--- a/include/linux/cpufreq.h ++++ b/include/linux/cpufreq.h +@@ -206,6 +206,7 @@ struct global_attr { + ssize_t (*store)(struct kobject *a, struct attribute *b, + const char *c, size_t count); + }; ++typedef struct global_attr __no_const global_attr_no_const; + + #define define_one_global_ro(_name) \ + static struct global_attr _name = \ +@@ -273,7 +274,7 @@ struct cpufreq_driver { + bool boost_supported; + bool boost_enabled; + int (*set_boost) (int state); +-}; ++} __do_const; + + /* flags */ + #define CPUFREQ_STICKY (1 << 0) /* driver isn't removed even if +diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h +index 575b716..72d25af 100644 +--- a/include/linux/cpuidle.h ++++ b/include/linux/cpuidle.h +@@ -50,7 +50,8 @@ struct cpuidle_state { + int index); + + int (*enter_dead) (struct cpuidle_device *dev, int index); +-}; ++} __do_const; ++typedef struct cpuidle_state __no_const cpuidle_state_no_const; + + /* Idle State Flags */ + #define CPUIDLE_FLAG_TIME_VALID (0x01) /* is residency time measurable? */ +@@ -208,7 +209,7 @@ struct cpuidle_governor { + void (*reflect) (struct cpuidle_device *dev, int index); + + struct module *owner; +-}; ++} __do_const; + + #ifdef CONFIG_CPU_IDLE + extern int cpuidle_register_governor(struct cpuidle_governor *gov); +diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h +index 0a9a6da..ea597ca 100644 +--- a/include/linux/cpumask.h ++++ b/include/linux/cpumask.h +@@ -118,17 +118,17 @@ static inline unsigned int cpumask_first(const struct cpumask *srcp) + } + + /* Valid inputs for n are -1 and 0. */ +-static inline unsigned int cpumask_next(int n, const struct cpumask *srcp) ++static inline unsigned int __intentional_overflow(-1) cpumask_next(int n, const struct cpumask *srcp) + { + return n+1; + } + +-static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp) ++static inline unsigned int __intentional_overflow(-1) cpumask_next_zero(int n, const struct cpumask *srcp) + { + return n+1; + } + +-static inline unsigned int cpumask_next_and(int n, ++static inline unsigned int __intentional_overflow(-1) cpumask_next_and(int n, + const struct cpumask *srcp, + const struct cpumask *andp) + { +@@ -174,7 +174,7 @@ static inline unsigned int cpumask_first(const struct cpumask *srcp) + * + * Returns >= nr_cpu_ids if no further cpus set. + */ +-static inline unsigned int cpumask_next(int n, const struct cpumask *srcp) ++static inline unsigned int __intentional_overflow(-1) cpumask_next(int n, const struct cpumask *srcp) + { + /* -1 is a legal arg here. */ + if (n != -1) +@@ -189,7 +189,7 @@ static inline unsigned int cpumask_next(int n, const struct cpumask *srcp) + * + * Returns >= nr_cpu_ids if no further cpus unset. + */ +-static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp) ++static inline unsigned int __intentional_overflow(-1) cpumask_next_zero(int n, const struct cpumask *srcp) + { + /* -1 is a legal arg here. */ + if (n != -1) +@@ -197,7 +197,7 @@ static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp) + return find_next_zero_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1); + } + +-int cpumask_next_and(int n, const struct cpumask *, const struct cpumask *); ++int cpumask_next_and(int n, const struct cpumask *, const struct cpumask *) __intentional_overflow(-1); + int cpumask_any_but(const struct cpumask *mask, unsigned int cpu); + int cpumask_set_cpu_local_first(int i, int numa_node, cpumask_t *dstp); + +diff --git a/include/linux/cred.h b/include/linux/cred.h +index 2fb2ca2..d6a3340 100644 +--- a/include/linux/cred.h ++++ b/include/linux/cred.h +@@ -35,7 +35,7 @@ struct group_info { + int nblocks; + kgid_t small_block[NGROUPS_SMALL]; + kgid_t *blocks[0]; +-}; ++} __randomize_layout; + + /** + * get_group_info - Get a reference to a group info structure +@@ -137,7 +137,7 @@ struct cred { + struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */ + struct group_info *group_info; /* supplementary groups for euid/fsgid */ + struct rcu_head rcu; /* RCU deletion hook */ +-}; ++} __randomize_layout; + + extern void __put_cred(struct cred *); + extern void exit_creds(struct task_struct *); +@@ -195,6 +195,9 @@ static inline void validate_creds_for_do_exit(struct task_struct *tsk) + static inline void validate_process_creds(void) + { + } ++static inline void validate_task_creds(struct task_struct *task) ++{ ++} + #endif + + /** +@@ -332,6 +335,7 @@ static inline void put_cred(const struct cred *_cred) + + #define task_uid(task) (task_cred_xxx((task), uid)) + #define task_euid(task) (task_cred_xxx((task), euid)) ++#define task_securebits(task) (task_cred_xxx((task), securebits)) + + #define current_cred_xxx(xxx) \ + ({ \ +diff --git a/include/linux/crypto.h b/include/linux/crypto.h +index dc34dfc..bdf9b5d 100644 +--- a/include/linux/crypto.h ++++ b/include/linux/crypto.h +@@ -386,7 +386,7 @@ struct cipher_tfm { + const u8 *key, unsigned int keylen); + void (*cit_encrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); + void (*cit_decrypt_one)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); +-}; ++} __no_const; + + struct hash_tfm { + int (*init)(struct hash_desc *desc); +@@ -407,13 +407,13 @@ struct compress_tfm { + int (*cot_decompress)(struct crypto_tfm *tfm, + const u8 *src, unsigned int slen, + u8 *dst, unsigned int *dlen); +-}; ++} __no_const; + + struct rng_tfm { + int (*rng_gen_random)(struct crypto_rng *tfm, u8 *rdata, + unsigned int dlen); + int (*rng_reset)(struct crypto_rng *tfm, u8 *seed, unsigned int slen); +-}; ++} __no_const; + + #define crt_ablkcipher crt_u.ablkcipher + #define crt_aead crt_u.aead +diff --git a/include/linux/ctype.h b/include/linux/ctype.h +index 653589e..4ef254a 100644 +--- a/include/linux/ctype.h ++++ b/include/linux/ctype.h +@@ -56,7 +56,7 @@ static inline unsigned char __toupper(unsigned char c) + * Fast implementation of tolower() for internal usage. Do not use in your + * code. + */ +-static inline char _tolower(const char c) ++static inline unsigned char _tolower(const unsigned char c) + { + return c | 0x20; + } +diff --git a/include/linux/dcache.h b/include/linux/dcache.h +index 1c2f1b8..7b9f50c 100644 +--- a/include/linux/dcache.h ++++ b/include/linux/dcache.h +@@ -123,6 +123,9 @@ struct dentry { + unsigned long d_time; /* used by d_revalidate */ + void *d_fsdata; /* fs-specific data */ + ++#ifdef CONFIG_GRKERNSEC_CHROOT_RENAME ++ atomic_t chroot_refcnt; /* tracks use of directory in chroot */ ++#endif + struct list_head d_lru; /* LRU list */ + struct list_head d_child; /* child of parent list */ + struct list_head d_subdirs; /* our children */ +@@ -133,7 +136,7 @@ struct dentry { + struct hlist_node d_alias; /* inode alias list */ + struct rcu_head d_rcu; + } d_u; +-}; ++} __randomize_layout; + + /* + * dentry->d_lock spinlock nesting subclasses: +diff --git a/include/linux/decompress/mm.h b/include/linux/decompress/mm.h +index 7925bf0..d5143d2 100644 +--- a/include/linux/decompress/mm.h ++++ b/include/linux/decompress/mm.h +@@ -77,7 +77,7 @@ static void free(void *where) + * warnings when not needed (indeed large_malloc / large_free are not + * needed by inflate */ + +-#define malloc(a) kmalloc(a, GFP_KERNEL) ++#define malloc(a) kmalloc((a), GFP_KERNEL) + #define free(a) kfree(a) + + #define large_malloc(a) vmalloc(a) +diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h +index f1863dc..5c26074 100644 +--- a/include/linux/devfreq.h ++++ b/include/linux/devfreq.h +@@ -114,7 +114,7 @@ struct devfreq_governor { + int (*get_target_freq)(struct devfreq *this, unsigned long *freq); + int (*event_handler)(struct devfreq *devfreq, + unsigned int event, void *data); +-}; ++} __do_const; + + /** + * struct devfreq - Device devfreq structure +diff --git a/include/linux/device.h b/include/linux/device.h +index ce1f2160..189bc33 100644 +--- a/include/linux/device.h ++++ b/include/linux/device.h +@@ -311,7 +311,7 @@ struct subsys_interface { + struct list_head node; + int (*add_dev)(struct device *dev, struct subsys_interface *sif); + int (*remove_dev)(struct device *dev, struct subsys_interface *sif); +-}; ++} __do_const; + + int subsys_interface_register(struct subsys_interface *sif); + void subsys_interface_unregister(struct subsys_interface *sif); +@@ -507,7 +507,7 @@ struct device_type { + void (*release)(struct device *dev); + + const struct dev_pm_ops *pm; +-}; ++} __do_const; + + /* interface for exporting device attributes */ + struct device_attribute { +@@ -517,11 +517,12 @@ struct device_attribute { + ssize_t (*store)(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count); + }; ++typedef struct device_attribute __no_const device_attribute_no_const; + + struct dev_ext_attribute { + struct device_attribute attr; + void *var; +-}; ++} __do_const; + + ssize_t device_show_ulong(struct device *dev, struct device_attribute *attr, + char *buf); +diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h +index d5d3881..7ed54af 100644 +--- a/include/linux/dma-mapping.h ++++ b/include/linux/dma-mapping.h +@@ -60,7 +60,7 @@ struct dma_map_ops { + u64 (*get_required_mask)(struct device *dev); + #endif + int is_phys; +-}; ++} __do_const; + + #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) + +diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h +index 653a1fd..9133cd1 100644 +--- a/include/linux/dmaengine.h ++++ b/include/linux/dmaengine.h +@@ -1136,9 +1136,9 @@ struct dma_pinned_list { + struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len); + void dma_unpin_iovec_pages(struct dma_pinned_list* pinned_list); + +-dma_cookie_t dma_memcpy_to_iovec(struct dma_chan *chan, struct iovec *iov, ++dma_cookie_t __intentional_overflow(0) dma_memcpy_to_iovec(struct dma_chan *chan, struct iovec *iov, + struct dma_pinned_list *pinned_list, unsigned char *kdata, size_t len); +-dma_cookie_t dma_memcpy_pg_to_iovec(struct dma_chan *chan, struct iovec *iov, ++dma_cookie_t __intentional_overflow(0) dma_memcpy_pg_to_iovec(struct dma_chan *chan, struct iovec *iov, + struct dma_pinned_list *pinned_list, struct page *page, + unsigned int offset, size_t len); + +diff --git a/include/linux/efi.h b/include/linux/efi.h +index 0949f9c..04cb9a5 100644 +--- a/include/linux/efi.h ++++ b/include/linux/efi.h +@@ -1050,6 +1050,7 @@ struct efivar_operations { + efi_set_variable_nonblocking_t *set_variable_nonblocking; + efi_query_variable_store_t *query_variable_store; + }; ++typedef struct efivar_operations __no_const efivar_operations_no_const; + + struct efivars { + /* +diff --git a/include/linux/elf.h b/include/linux/elf.h +index 67a5fa7..b817372 100644 +--- a/include/linux/elf.h ++++ b/include/linux/elf.h +@@ -24,6 +24,7 @@ extern Elf32_Dyn _DYNAMIC []; + #define elf_note elf32_note + #define elf_addr_t Elf32_Off + #define Elf_Half Elf32_Half ++#define elf_dyn Elf32_Dyn + + #else + +@@ -34,6 +35,7 @@ extern Elf64_Dyn _DYNAMIC []; + #define elf_note elf64_note + #define elf_addr_t Elf64_Off + #define Elf_Half Elf64_Half ++#define elf_dyn Elf64_Dyn + + #endif + +diff --git a/include/linux/err.h b/include/linux/err.h +index a729120..6ede2c9 100644 +--- a/include/linux/err.h ++++ b/include/linux/err.h +@@ -20,12 +20,12 @@ + + #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) + +-static inline void * __must_check ERR_PTR(long error) ++static inline void * __must_check __intentional_overflow(-1) ERR_PTR(long error) + { + return (void *) error; + } + +-static inline long __must_check PTR_ERR(__force const void *ptr) ++static inline long __must_check __intentional_overflow(-1) PTR_ERR(__force const void *ptr) + { + return (long) ptr; + } +diff --git a/include/linux/extcon.h b/include/linux/extcon.h +index 36f49c4..a2a1f4c 100644 +--- a/include/linux/extcon.h ++++ b/include/linux/extcon.h +@@ -135,7 +135,7 @@ struct extcon_dev { + /* /sys/class/extcon/.../mutually_exclusive/... */ + struct attribute_group attr_g_muex; + struct attribute **attrs_muex; +- struct device_attribute *d_attrs_muex; ++ device_attribute_no_const *d_attrs_muex; + }; + + /** +diff --git a/include/linux/fb.h b/include/linux/fb.h +index 09bb7a1..d98870a 100644 +--- a/include/linux/fb.h ++++ b/include/linux/fb.h +@@ -305,7 +305,7 @@ struct fb_ops { + /* called at KDB enter and leave time to prepare the console */ + int (*fb_debug_enter)(struct fb_info *info); + int (*fb_debug_leave)(struct fb_info *info); +-}; ++} __do_const; + + #ifdef CONFIG_FB_TILEBLITTING + #define FB_TILE_CURSOR_NONE 0 +diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h +index 230f87b..1fd0485 100644 +--- a/include/linux/fdtable.h ++++ b/include/linux/fdtable.h +@@ -100,7 +100,7 @@ struct files_struct *get_files_struct(struct task_struct *); + void put_files_struct(struct files_struct *fs); + void reset_files_struct(struct files_struct *); + int unshare_files(struct files_struct **); +-struct files_struct *dup_fd(struct files_struct *, int *); ++struct files_struct *dup_fd(struct files_struct *, int *) __latent_entropy; + void do_close_on_exec(struct files_struct *); + int iterate_fd(struct files_struct *, unsigned, + int (*)(const void *, struct file *, unsigned), +diff --git a/include/linux/frontswap.h b/include/linux/frontswap.h +index 8293262..2b3b8bd 100644 +--- a/include/linux/frontswap.h ++++ b/include/linux/frontswap.h +@@ -11,7 +11,7 @@ struct frontswap_ops { + int (*load)(unsigned, pgoff_t, struct page *); + void (*invalidate_page)(unsigned, pgoff_t); + void (*invalidate_area)(unsigned); +-}; ++} __no_const; + + extern bool frontswap_enabled; + extern struct frontswap_ops * +diff --git a/include/linux/fs.h b/include/linux/fs.h +index 9ab779e..0c636f2 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -412,7 +412,7 @@ struct address_space { + spinlock_t private_lock; /* for use by the address_space */ + struct list_head private_list; /* ditto */ + void *private_data; /* ditto */ +-} __attribute__((aligned(sizeof(long)))); ++} __attribute__((aligned(sizeof(long)))) __randomize_layout; + /* + * On most architectures that alignment is already the case; but + * must be enforced here for CRIS, to let the least significant bit +@@ -455,7 +455,7 @@ struct block_device { + int bd_fsfreeze_count; + /* Mutex for freeze */ + struct mutex bd_fsfreeze_mutex; +-}; ++} __randomize_layout; + + /* + * Radix-tree tags, for tagging dirty and writeback pages within the pagecache +@@ -624,7 +624,7 @@ struct inode { + #endif + + void *i_private; /* fs or device private pointer */ +-}; ++} __randomize_layout; + + static inline int inode_unhashed(struct inode *inode) + { +@@ -820,7 +820,7 @@ struct file { + struct list_head f_tfile_llink; + #endif /* #ifdef CONFIG_EPOLL */ + struct address_space *f_mapping; +-} __attribute__((aligned(4))); /* lest something weird decides that 2 is OK */ ++} __attribute__((aligned(4))) __randomize_layout; /* lest something weird decides that 2 is OK */ + + struct file_handle { + __u32 handle_bytes; +@@ -945,7 +945,7 @@ struct file_lock { + int state; /* state of grant or error if -ve */ + } afs; + } fl_u; +-}; ++} __randomize_layout; + + /* The following constant reflects the upper bound of the file/locking space */ + #ifndef OFFSET_MAX +@@ -1287,7 +1287,7 @@ struct super_block { + * Indicates how deep in a filesystem stack this SB is + */ + int s_stack_depth; +-}; ++} __randomize_layout; + + extern struct timespec current_fs_time(struct super_block *sb); + +@@ -1514,7 +1514,8 @@ struct file_operations { + long (*fallocate)(struct file *file, int mode, loff_t offset, + loff_t len); + int (*show_fdinfo)(struct seq_file *m, struct file *f); +-}; ++} __do_const __randomize_layout; ++typedef struct file_operations __no_const file_operations_no_const; + + struct inode_operations { + struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int); +@@ -2823,4 +2824,14 @@ static inline bool dir_relax(struct inode *inode) + return !IS_DEADDIR(inode); + } + ++static inline bool is_sidechannel_device(const struct inode *inode) ++{ ++#ifdef CONFIG_GRKERNSEC_DEVICE_SIDECHANNEL ++ umode_t mode = inode->i_mode; ++ return ((S_ISCHR(mode) || S_ISBLK(mode)) && (mode & (S_IROTH | S_IWOTH))); ++#else ++ return false; ++#endif ++} ++ + #endif /* _LINUX_FS_H */ +diff --git a/include/linux/fs_struct.h b/include/linux/fs_struct.h +index 0efc3e6..fd23610 100644 +--- a/include/linux/fs_struct.h ++++ b/include/linux/fs_struct.h +@@ -6,13 +6,13 @@ + #include <linux/seqlock.h> + + struct fs_struct { +- int users; ++ atomic_t users; + spinlock_t lock; + seqcount_t seq; + int umask; + int in_exec; + struct path root, pwd; +-}; ++} __randomize_layout; + + extern struct kmem_cache *fs_cachep; + +diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h +index 7714849..a4a5c7a 100644 +--- a/include/linux/fscache-cache.h ++++ b/include/linux/fscache-cache.h +@@ -113,7 +113,7 @@ struct fscache_operation { + fscache_operation_release_t release; + }; + +-extern atomic_t fscache_op_debug_id; ++extern atomic_unchecked_t fscache_op_debug_id; + extern void fscache_op_work_func(struct work_struct *work); + + extern void fscache_enqueue_operation(struct fscache_operation *); +@@ -135,7 +135,7 @@ static inline void fscache_operation_init(struct fscache_operation *op, + INIT_WORK(&op->work, fscache_op_work_func); + atomic_set(&op->usage, 1); + op->state = FSCACHE_OP_ST_INITIALISED; +- op->debug_id = atomic_inc_return(&fscache_op_debug_id); ++ op->debug_id = atomic_inc_return_unchecked(&fscache_op_debug_id); + op->processor = processor; + op->release = release; + INIT_LIST_HEAD(&op->pend_link); +diff --git a/include/linux/fscache.h b/include/linux/fscache.h +index 115bb81..e7b812b 100644 +--- a/include/linux/fscache.h ++++ b/include/linux/fscache.h +@@ -152,7 +152,7 @@ struct fscache_cookie_def { + * - this is mandatory for any object that may have data + */ + void (*now_uncached)(void *cookie_netfs_data); +-}; ++} __do_const; + + /* + * fscache cached network filesystem type +diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h +index 7ee1774..72505b8 100644 +--- a/include/linux/fsnotify.h ++++ b/include/linux/fsnotify.h +@@ -197,6 +197,9 @@ static inline void fsnotify_access(struct file *file) + struct inode *inode = file_inode(file); + __u32 mask = FS_ACCESS; + ++ if (is_sidechannel_device(inode)) ++ return; ++ + if (S_ISDIR(inode->i_mode)) + mask |= FS_ISDIR; + +@@ -215,6 +218,9 @@ static inline void fsnotify_modify(struct file *file) + struct inode *inode = file_inode(file); + __u32 mask = FS_MODIFY; + ++ if (is_sidechannel_device(inode)) ++ return; ++ + if (S_ISDIR(inode->i_mode)) + mask |= FS_ISDIR; + +@@ -317,7 +323,7 @@ static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid) + */ + static inline const unsigned char *fsnotify_oldname_init(const unsigned char *name) + { +- return kstrdup(name, GFP_KERNEL); ++ return (const unsigned char *)kstrdup((const char *)name, GFP_KERNEL); + } + + /* +diff --git a/include/linux/genhd.h b/include/linux/genhd.h +index ec274e0..e678159 100644 +--- a/include/linux/genhd.h ++++ b/include/linux/genhd.h +@@ -194,7 +194,7 @@ struct gendisk { + struct kobject *slave_dir; + + struct timer_rand_state *random; +- atomic_t sync_io; /* RAID */ ++ atomic_unchecked_t sync_io; /* RAID */ + struct disk_events *ev; + #ifdef CONFIG_BLK_DEV_INTEGRITY + struct blk_integrity *integrity; +@@ -435,7 +435,7 @@ extern void disk_flush_events(struct gendisk *disk, unsigned int mask); + extern unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask); + + /* drivers/char/random.c */ +-extern void add_disk_randomness(struct gendisk *disk); ++extern void add_disk_randomness(struct gendisk *disk) __latent_entropy; + extern void rand_initialize_disk(struct gendisk *disk); + + static inline sector_t get_start_sect(struct block_device *bdev) +diff --git a/include/linux/genl_magic_func.h b/include/linux/genl_magic_func.h +index 667c311..abac2a7 100644 +--- a/include/linux/genl_magic_func.h ++++ b/include/linux/genl_magic_func.h +@@ -246,7 +246,7 @@ const char *CONCAT_(GENL_MAGIC_FAMILY, _genl_cmd_to_str)(__u8 cmd) + }, + + #define ZZZ_genl_ops CONCAT_(GENL_MAGIC_FAMILY, _genl_ops) +-static struct genl_ops ZZZ_genl_ops[] __read_mostly = { ++static struct genl_ops ZZZ_genl_ops[] = { + #include GENL_MAGIC_INCLUDE_FILE + }; + +diff --git a/include/linux/gfp.h b/include/linux/gfp.h +index 41b30fd..a3718cf 100644 +--- a/include/linux/gfp.h ++++ b/include/linux/gfp.h +@@ -34,6 +34,13 @@ struct vm_area_struct; + #define ___GFP_NO_KSWAPD 0x400000u + #define ___GFP_OTHER_NODE 0x800000u + #define ___GFP_WRITE 0x1000000u ++ ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++#define ___GFP_USERCOPY 0x2000000u ++#else ++#define ___GFP_USERCOPY 0 ++#endif ++ + /* If the above are modified, __GFP_BITS_SHIFT may need updating */ + + /* +@@ -90,6 +97,7 @@ struct vm_area_struct; + #define __GFP_NO_KSWAPD ((__force gfp_t)___GFP_NO_KSWAPD) + #define __GFP_OTHER_NODE ((__force gfp_t)___GFP_OTHER_NODE) /* On behalf of other node */ + #define __GFP_WRITE ((__force gfp_t)___GFP_WRITE) /* Allocator intends to dirty page */ ++#define __GFP_USERCOPY ((__force gfp_t)___GFP_USERCOPY)/* Allocator intends to copy page to/from userland */ + + /* + * This may seem redundant, but it's a way of annotating false positives vs. +@@ -97,7 +105,7 @@ struct vm_area_struct; + */ + #define __GFP_NOTRACK_FALSE_POSITIVE (__GFP_NOTRACK) + +-#define __GFP_BITS_SHIFT 25 /* Room for N __GFP_FOO bits */ ++#define __GFP_BITS_SHIFT 26 /* Room for N __GFP_FOO bits */ + #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1)) + + /* This equals 0, but use constants in case they ever change */ +@@ -155,6 +163,8 @@ struct vm_area_struct; + /* 4GB DMA on some platforms */ + #define GFP_DMA32 __GFP_DMA32 + ++#define GFP_USERCOPY __GFP_USERCOPY ++ + /* Convert GFP flags to their corresponding migrate type */ + static inline int gfpflags_to_migratetype(const gfp_t gfp_flags) + { +diff --git a/include/linux/gracl.h b/include/linux/gracl.h +new file mode 100644 +index 0000000..91858e4 +--- /dev/null ++++ b/include/linux/gracl.h +@@ -0,0 +1,342 @@ ++#ifndef GR_ACL_H ++#define GR_ACL_H ++ ++#include <linux/grdefs.h> ++#include <linux/resource.h> ++#include <linux/capability.h> ++#include <linux/dcache.h> ++#include <asm/resource.h> ++ ++/* Major status information */ ++ ++#define GR_VERSION "grsecurity 3.1" ++#define GRSECURITY_VERSION 0x3100 ++ ++enum { ++ GR_SHUTDOWN = 0, ++ GR_ENABLE = 1, ++ GR_SPROLE = 2, ++ GR_OLDRELOAD = 3, ++ GR_SEGVMOD = 4, ++ GR_STATUS = 5, ++ GR_UNSPROLE = 6, ++ GR_PASSSET = 7, ++ GR_SPROLEPAM = 8, ++ GR_RELOAD = 9, ++}; ++ ++/* Password setup definitions ++ * kernel/grhash.c */ ++enum { ++ GR_PW_LEN = 128, ++ GR_SALT_LEN = 16, ++ GR_SHA_LEN = 32, ++}; ++ ++enum { ++ GR_SPROLE_LEN = 64, ++}; ++ ++enum { ++ GR_NO_GLOB = 0, ++ GR_REG_GLOB, ++ GR_CREATE_GLOB ++}; ++ ++#define GR_NLIMITS 32 ++ ++/* Begin Data Structures */ ++ ++struct sprole_pw { ++ unsigned char *rolename; ++ unsigned char salt[GR_SALT_LEN]; ++ unsigned char sum[GR_SHA_LEN]; /* 256-bit SHA hash of the password */ ++}; ++ ++struct name_entry { ++ __u32 key; ++ u64 inode; ++ dev_t device; ++ char *name; ++ __u16 len; ++ __u8 deleted; ++ struct name_entry *prev; ++ struct name_entry *next; ++}; ++ ++struct inodev_entry { ++ struct name_entry *nentry; ++ struct inodev_entry *prev; ++ struct inodev_entry *next; ++}; ++ ++struct acl_role_db { ++ struct acl_role_label **r_hash; ++ __u32 r_size; ++}; ++ ++struct inodev_db { ++ struct inodev_entry **i_hash; ++ __u32 i_size; ++}; ++ ++struct name_db { ++ struct name_entry **n_hash; ++ __u32 n_size; ++}; ++ ++struct crash_uid { ++ uid_t uid; ++ unsigned long expires; ++}; ++ ++struct gr_hash_struct { ++ void **table; ++ void **nametable; ++ void *first; ++ __u32 table_size; ++ __u32 used_size; ++ int type; ++}; ++ ++/* Userspace Grsecurity ACL data structures */ ++ ++struct acl_subject_label { ++ char *filename; ++ u64 inode; ++ dev_t device; ++ __u32 mode; ++ kernel_cap_t cap_mask; ++ kernel_cap_t cap_lower; ++ kernel_cap_t cap_invert_audit; ++ ++ struct rlimit res[GR_NLIMITS]; ++ __u32 resmask; ++ ++ __u8 user_trans_type; ++ __u8 group_trans_type; ++ uid_t *user_transitions; ++ gid_t *group_transitions; ++ __u16 user_trans_num; ++ __u16 group_trans_num; ++ ++ __u32 sock_families[2]; ++ __u32 ip_proto[8]; ++ __u32 ip_type; ++ struct acl_ip_label **ips; ++ __u32 ip_num; ++ __u32 inaddr_any_override; ++ ++ __u32 crashes; ++ unsigned long expires; ++ ++ struct acl_subject_label *parent_subject; ++ struct gr_hash_struct *hash; ++ struct acl_subject_label *prev; ++ struct acl_subject_label *next; ++ ++ struct acl_object_label **obj_hash; ++ __u32 obj_hash_size; ++ __u16 pax_flags; ++}; ++ ++struct role_allowed_ip { ++ __u32 addr; ++ __u32 netmask; ++ ++ struct role_allowed_ip *prev; ++ struct role_allowed_ip *next; ++}; ++ ++struct role_transition { ++ char *rolename; ++ ++ struct role_transition *prev; ++ struct role_transition *next; ++}; ++ ++struct acl_role_label { ++ char *rolename; ++ uid_t uidgid; ++ __u16 roletype; ++ ++ __u16 auth_attempts; ++ unsigned long expires; ++ ++ struct acl_subject_label *root_label; ++ struct gr_hash_struct *hash; ++ ++ struct acl_role_label *prev; ++ struct acl_role_label *next; ++ ++ struct role_transition *transitions; ++ struct role_allowed_ip *allowed_ips; ++ uid_t *domain_children; ++ __u16 domain_child_num; ++ ++ umode_t umask; ++ ++ struct acl_subject_label **subj_hash; ++ __u32 subj_hash_size; ++}; ++ ++struct user_acl_role_db { ++ struct acl_role_label **r_table; ++ __u32 num_pointers; /* Number of allocations to track */ ++ __u32 num_roles; /* Number of roles */ ++ __u32 num_domain_children; /* Number of domain children */ ++ __u32 num_subjects; /* Number of subjects */ ++ __u32 num_objects; /* Number of objects */ ++}; ++ ++struct acl_object_label { ++ char *filename; ++ u64 inode; ++ dev_t device; ++ __u32 mode; ++ ++ struct acl_subject_label *nested; ++ struct acl_object_label *globbed; ++ ++ /* next two structures not used */ ++ ++ struct acl_object_label *prev; ++ struct acl_object_label *next; ++}; ++ ++struct acl_ip_label { ++ char *iface; ++ __u32 addr; ++ __u32 netmask; ++ __u16 low, high; ++ __u8 mode; ++ __u32 type; ++ __u32 proto[8]; ++ ++ /* next two structures not used */ ++ ++ struct acl_ip_label *prev; ++ struct acl_ip_label *next; ++}; ++ ++struct gr_arg { ++ struct user_acl_role_db role_db; ++ unsigned char pw[GR_PW_LEN]; ++ unsigned char salt[GR_SALT_LEN]; ++ unsigned char sum[GR_SHA_LEN]; ++ unsigned char sp_role[GR_SPROLE_LEN]; ++ struct sprole_pw *sprole_pws; ++ dev_t segv_device; ++ u64 segv_inode; ++ uid_t segv_uid; ++ __u16 num_sprole_pws; ++ __u16 mode; ++}; ++ ++struct gr_arg_wrapper { ++ struct gr_arg *arg; ++ __u32 version; ++ __u32 size; ++}; ++ ++struct subject_map { ++ struct acl_subject_label *user; ++ struct acl_subject_label *kernel; ++ struct subject_map *prev; ++ struct subject_map *next; ++}; ++ ++struct acl_subj_map_db { ++ struct subject_map **s_hash; ++ __u32 s_size; ++}; ++ ++struct gr_policy_state { ++ struct sprole_pw **acl_special_roles; ++ __u16 num_sprole_pws; ++ struct acl_role_label *kernel_role; ++ struct acl_role_label *role_list; ++ struct acl_role_label *default_role; ++ struct acl_role_db acl_role_set; ++ struct acl_subj_map_db subj_map_set; ++ struct name_db name_set; ++ struct inodev_db inodev_set; ++}; ++ ++struct gr_alloc_state { ++ unsigned long alloc_stack_next; ++ unsigned long alloc_stack_size; ++ void **alloc_stack; ++}; ++ ++struct gr_reload_state { ++ struct gr_policy_state oldpolicy; ++ struct gr_alloc_state oldalloc; ++ struct gr_policy_state newpolicy; ++ struct gr_alloc_state newalloc; ++ struct gr_policy_state *oldpolicy_ptr; ++ struct gr_alloc_state *oldalloc_ptr; ++ unsigned char oldmode; ++}; ++ ++/* End Data Structures Section */ ++ ++/* Hash functions generated by empirical testing by Brad Spengler ++ Makes good use of the low bits of the inode. Generally 0-1 times ++ in loop for successful match. 0-3 for unsuccessful match. ++ Shift/add algorithm with modulus of table size and an XOR*/ ++ ++static __inline__ unsigned int ++gr_rhash(const uid_t uid, const __u16 type, const unsigned int sz) ++{ ++ return ((((uid + type) << (16 + type)) ^ uid) % sz); ++} ++ ++ static __inline__ unsigned int ++gr_shash(const struct acl_subject_label *userp, const unsigned int sz) ++{ ++ return ((const unsigned long)userp % sz); ++} ++ ++static __inline__ unsigned int ++gr_fhash(const u64 ino, const dev_t dev, const unsigned int sz) ++{ ++ unsigned int rem; ++ div_u64_rem((ino + dev) ^ ((ino << 13) + (ino << 23) + (dev << 9)), sz, &rem); ++ return rem; ++} ++ ++static __inline__ unsigned int ++gr_nhash(const char *name, const __u16 len, const unsigned int sz) ++{ ++ return full_name_hash((const unsigned char *)name, len) % sz; ++} ++ ++#define FOR_EACH_SUBJECT_START(role,subj,iter) \ ++ subj = NULL; \ ++ iter = 0; \ ++ while (iter < role->subj_hash_size) { \ ++ if (subj == NULL) \ ++ subj = role->subj_hash[iter]; \ ++ if (subj == NULL) { \ ++ iter++; \ ++ continue; \ ++ } ++ ++#define FOR_EACH_SUBJECT_END(subj,iter) \ ++ subj = subj->next; \ ++ if (subj == NULL) \ ++ iter++; \ ++ } ++ ++ ++#define FOR_EACH_NESTED_SUBJECT_START(role,subj) \ ++ subj = role->hash->first; \ ++ while (subj != NULL) { ++ ++#define FOR_EACH_NESTED_SUBJECT_END(subj) \ ++ subj = subj->next; \ ++ } ++ ++#endif ++ +diff --git a/include/linux/gracl_compat.h b/include/linux/gracl_compat.h +new file mode 100644 +index 0000000..af64092 +--- /dev/null ++++ b/include/linux/gracl_compat.h +@@ -0,0 +1,156 @@ ++#ifndef GR_ACL_COMPAT_H ++#define GR_ACL_COMPAT_H ++ ++#include <linux/resource.h> ++#include <asm/resource.h> ++ ++struct sprole_pw_compat { ++ compat_uptr_t rolename; ++ unsigned char salt[GR_SALT_LEN]; ++ unsigned char sum[GR_SHA_LEN]; ++}; ++ ++struct gr_hash_struct_compat { ++ compat_uptr_t table; ++ compat_uptr_t nametable; ++ compat_uptr_t first; ++ __u32 table_size; ++ __u32 used_size; ++ int type; ++}; ++ ++struct acl_subject_label_compat { ++ compat_uptr_t filename; ++ compat_u64 inode; ++ __u32 device; ++ __u32 mode; ++ kernel_cap_t cap_mask; ++ kernel_cap_t cap_lower; ++ kernel_cap_t cap_invert_audit; ++ ++ struct compat_rlimit res[GR_NLIMITS]; ++ __u32 resmask; ++ ++ __u8 user_trans_type; ++ __u8 group_trans_type; ++ compat_uptr_t user_transitions; ++ compat_uptr_t group_transitions; ++ __u16 user_trans_num; ++ __u16 group_trans_num; ++ ++ __u32 sock_families[2]; ++ __u32 ip_proto[8]; ++ __u32 ip_type; ++ compat_uptr_t ips; ++ __u32 ip_num; ++ __u32 inaddr_any_override; ++ ++ __u32 crashes; ++ compat_ulong_t expires; ++ ++ compat_uptr_t parent_subject; ++ compat_uptr_t hash; ++ compat_uptr_t prev; ++ compat_uptr_t next; ++ ++ compat_uptr_t obj_hash; ++ __u32 obj_hash_size; ++ __u16 pax_flags; ++}; ++ ++struct role_allowed_ip_compat { ++ __u32 addr; ++ __u32 netmask; ++ ++ compat_uptr_t prev; ++ compat_uptr_t next; ++}; ++ ++struct role_transition_compat { ++ compat_uptr_t rolename; ++ ++ compat_uptr_t prev; ++ compat_uptr_t next; ++}; ++ ++struct acl_role_label_compat { ++ compat_uptr_t rolename; ++ uid_t uidgid; ++ __u16 roletype; ++ ++ __u16 auth_attempts; ++ compat_ulong_t expires; ++ ++ compat_uptr_t root_label; ++ compat_uptr_t hash; ++ ++ compat_uptr_t prev; ++ compat_uptr_t next; ++ ++ compat_uptr_t transitions; ++ compat_uptr_t allowed_ips; ++ compat_uptr_t domain_children; ++ __u16 domain_child_num; ++ ++ umode_t umask; ++ ++ compat_uptr_t subj_hash; ++ __u32 subj_hash_size; ++}; ++ ++struct user_acl_role_db_compat { ++ compat_uptr_t r_table; ++ __u32 num_pointers; ++ __u32 num_roles; ++ __u32 num_domain_children; ++ __u32 num_subjects; ++ __u32 num_objects; ++}; ++ ++struct acl_object_label_compat { ++ compat_uptr_t filename; ++ compat_u64 inode; ++ __u32 device; ++ __u32 mode; ++ ++ compat_uptr_t nested; ++ compat_uptr_t globbed; ++ ++ compat_uptr_t prev; ++ compat_uptr_t next; ++}; ++ ++struct acl_ip_label_compat { ++ compat_uptr_t iface; ++ __u32 addr; ++ __u32 netmask; ++ __u16 low, high; ++ __u8 mode; ++ __u32 type; ++ __u32 proto[8]; ++ ++ compat_uptr_t prev; ++ compat_uptr_t next; ++}; ++ ++struct gr_arg_compat { ++ struct user_acl_role_db_compat role_db; ++ unsigned char pw[GR_PW_LEN]; ++ unsigned char salt[GR_SALT_LEN]; ++ unsigned char sum[GR_SHA_LEN]; ++ unsigned char sp_role[GR_SPROLE_LEN]; ++ compat_uptr_t sprole_pws; ++ __u32 segv_device; ++ compat_u64 segv_inode; ++ uid_t segv_uid; ++ __u16 num_sprole_pws; ++ __u16 mode; ++}; ++ ++struct gr_arg_wrapper_compat { ++ compat_uptr_t arg; ++ __u32 version; ++ __u32 size; ++}; ++ ++#endif +diff --git a/include/linux/gralloc.h b/include/linux/gralloc.h +new file mode 100644 +index 0000000..323ecf2 +--- /dev/null ++++ b/include/linux/gralloc.h +@@ -0,0 +1,9 @@ ++#ifndef __GRALLOC_H ++#define __GRALLOC_H ++ ++void acl_free_all(void); ++int acl_alloc_stack_init(unsigned long size); ++void *acl_alloc(unsigned long len); ++void *acl_alloc_num(unsigned long num, unsigned long len); ++ ++#endif +diff --git a/include/linux/grdefs.h b/include/linux/grdefs.h +new file mode 100644 +index 0000000..be66033 +--- /dev/null ++++ b/include/linux/grdefs.h +@@ -0,0 +1,140 @@ ++#ifndef GRDEFS_H ++#define GRDEFS_H ++ ++/* Begin grsecurity status declarations */ ++ ++enum { ++ GR_READY = 0x01, ++ GR_STATUS_INIT = 0x00 // disabled state ++}; ++ ++/* Begin ACL declarations */ ++ ++/* Role flags */ ++ ++enum { ++ GR_ROLE_USER = 0x0001, ++ GR_ROLE_GROUP = 0x0002, ++ GR_ROLE_DEFAULT = 0x0004, ++ GR_ROLE_SPECIAL = 0x0008, ++ GR_ROLE_AUTH = 0x0010, ++ GR_ROLE_NOPW = 0x0020, ++ GR_ROLE_GOD = 0x0040, ++ GR_ROLE_LEARN = 0x0080, ++ GR_ROLE_TPE = 0x0100, ++ GR_ROLE_DOMAIN = 0x0200, ++ GR_ROLE_PAM = 0x0400, ++ GR_ROLE_PERSIST = 0x0800 ++}; ++ ++/* ACL Subject and Object mode flags */ ++enum { ++ GR_DELETED = 0x80000000 ++}; ++ ++/* ACL Object-only mode flags */ ++enum { ++ GR_READ = 0x00000001, ++ GR_APPEND = 0x00000002, ++ GR_WRITE = 0x00000004, ++ GR_EXEC = 0x00000008, ++ GR_FIND = 0x00000010, ++ GR_INHERIT = 0x00000020, ++ GR_SETID = 0x00000040, ++ GR_CREATE = 0x00000080, ++ GR_DELETE = 0x00000100, ++ GR_LINK = 0x00000200, ++ GR_AUDIT_READ = 0x00000400, ++ GR_AUDIT_APPEND = 0x00000800, ++ GR_AUDIT_WRITE = 0x00001000, ++ GR_AUDIT_EXEC = 0x00002000, ++ GR_AUDIT_FIND = 0x00004000, ++ GR_AUDIT_INHERIT= 0x00008000, ++ GR_AUDIT_SETID = 0x00010000, ++ GR_AUDIT_CREATE = 0x00020000, ++ GR_AUDIT_DELETE = 0x00040000, ++ GR_AUDIT_LINK = 0x00080000, ++ GR_PTRACERD = 0x00100000, ++ GR_NOPTRACE = 0x00200000, ++ GR_SUPPRESS = 0x00400000, ++ GR_NOLEARN = 0x00800000, ++ GR_INIT_TRANSFER= 0x01000000 ++}; ++ ++#define GR_AUDITS (GR_AUDIT_READ | GR_AUDIT_WRITE | GR_AUDIT_APPEND | GR_AUDIT_EXEC | \ ++ GR_AUDIT_FIND | GR_AUDIT_INHERIT | GR_AUDIT_SETID | \ ++ GR_AUDIT_CREATE | GR_AUDIT_DELETE | GR_AUDIT_LINK) ++ ++/* ACL subject-only mode flags */ ++enum { ++ GR_KILL = 0x00000001, ++ GR_VIEW = 0x00000002, ++ GR_PROTECTED = 0x00000004, ++ GR_LEARN = 0x00000008, ++ GR_OVERRIDE = 0x00000010, ++ /* just a placeholder, this mode is only used in userspace */ ++ GR_DUMMY = 0x00000020, ++ GR_PROTSHM = 0x00000040, ++ GR_KILLPROC = 0x00000080, ++ GR_KILLIPPROC = 0x00000100, ++ /* just a placeholder, this mode is only used in userspace */ ++ GR_NOTROJAN = 0x00000200, ++ GR_PROTPROCFD = 0x00000400, ++ GR_PROCACCT = 0x00000800, ++ GR_RELAXPTRACE = 0x00001000, ++ //GR_NESTED = 0x00002000, ++ GR_INHERITLEARN = 0x00004000, ++ GR_PROCFIND = 0x00008000, ++ GR_POVERRIDE = 0x00010000, ++ GR_KERNELAUTH = 0x00020000, ++ GR_ATSECURE = 0x00040000, ++ GR_SHMEXEC = 0x00080000 ++}; ++ ++enum { ++ GR_PAX_ENABLE_SEGMEXEC = 0x0001, ++ GR_PAX_ENABLE_PAGEEXEC = 0x0002, ++ GR_PAX_ENABLE_MPROTECT = 0x0004, ++ GR_PAX_ENABLE_RANDMMAP = 0x0008, ++ GR_PAX_ENABLE_EMUTRAMP = 0x0010, ++ GR_PAX_DISABLE_SEGMEXEC = 0x0100, ++ GR_PAX_DISABLE_PAGEEXEC = 0x0200, ++ GR_PAX_DISABLE_MPROTECT = 0x0400, ++ GR_PAX_DISABLE_RANDMMAP = 0x0800, ++ GR_PAX_DISABLE_EMUTRAMP = 0x1000, ++}; ++ ++enum { ++ GR_ID_USER = 0x01, ++ GR_ID_GROUP = 0x02, ++}; ++ ++enum { ++ GR_ID_ALLOW = 0x01, ++ GR_ID_DENY = 0x02, ++}; ++ ++#define GR_CRASH_RES 31 ++#define GR_UIDTABLE_MAX 500 ++ ++/* begin resource learning section */ ++enum { ++ GR_RLIM_CPU_BUMP = 60, ++ GR_RLIM_FSIZE_BUMP = 50000, ++ GR_RLIM_DATA_BUMP = 10000, ++ GR_RLIM_STACK_BUMP = 1000, ++ GR_RLIM_CORE_BUMP = 10000, ++ GR_RLIM_RSS_BUMP = 500000, ++ GR_RLIM_NPROC_BUMP = 1, ++ GR_RLIM_NOFILE_BUMP = 5, ++ GR_RLIM_MEMLOCK_BUMP = 50000, ++ GR_RLIM_AS_BUMP = 500000, ++ GR_RLIM_LOCKS_BUMP = 2, ++ GR_RLIM_SIGPENDING_BUMP = 5, ++ GR_RLIM_MSGQUEUE_BUMP = 10000, ++ GR_RLIM_NICE_BUMP = 1, ++ GR_RLIM_RTPRIO_BUMP = 1, ++ GR_RLIM_RTTIME_BUMP = 1000000 ++}; ++ ++#endif +diff --git a/include/linux/grinternal.h b/include/linux/grinternal.h +new file mode 100644 +index 0000000..fb1de5d +--- /dev/null ++++ b/include/linux/grinternal.h +@@ -0,0 +1,230 @@ ++#ifndef __GRINTERNAL_H ++#define __GRINTERNAL_H ++ ++#ifdef CONFIG_GRKERNSEC ++ ++#include <linux/fs.h> ++#include <linux/mnt_namespace.h> ++#include <linux/nsproxy.h> ++#include <linux/gracl.h> ++#include <linux/grdefs.h> ++#include <linux/grmsg.h> ++ ++void gr_add_learn_entry(const char *fmt, ...) ++ __attribute__ ((format (printf, 1, 2))); ++__u32 gr_search_file(const struct dentry *dentry, const __u32 mode, ++ const struct vfsmount *mnt); ++__u32 gr_check_create(const struct dentry *new_dentry, ++ const struct dentry *parent, ++ const struct vfsmount *mnt, const __u32 mode); ++int gr_check_protected_task(const struct task_struct *task); ++__u32 to_gr_audit(const __u32 reqmode); ++int gr_set_acls(const int type); ++int gr_acl_is_enabled(void); ++char gr_roletype_to_char(void); ++ ++void gr_handle_alertkill(struct task_struct *task); ++char *gr_to_filename(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++char *gr_to_filename1(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++char *gr_to_filename2(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++char *gr_to_filename3(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++ ++extern int grsec_enable_ptrace_readexec; ++extern int grsec_enable_harden_ptrace; ++extern int grsec_enable_link; ++extern int grsec_enable_fifo; ++extern int grsec_enable_execve; ++extern int grsec_enable_shm; ++extern int grsec_enable_execlog; ++extern int grsec_enable_signal; ++extern int grsec_enable_audit_ptrace; ++extern int grsec_enable_forkfail; ++extern int grsec_enable_time; ++extern int grsec_enable_rofs; ++extern int grsec_deny_new_usb; ++extern int grsec_enable_chroot_shmat; ++extern int grsec_enable_chroot_mount; ++extern int grsec_enable_chroot_double; ++extern int grsec_enable_chroot_pivot; ++extern int grsec_enable_chroot_chdir; ++extern int grsec_enable_chroot_chmod; ++extern int grsec_enable_chroot_mknod; ++extern int grsec_enable_chroot_fchdir; ++extern int grsec_enable_chroot_nice; ++extern int grsec_enable_chroot_execlog; ++extern int grsec_enable_chroot_caps; ++extern int grsec_enable_chroot_rename; ++extern int grsec_enable_chroot_sysctl; ++extern int grsec_enable_chroot_unix; ++extern int grsec_enable_symlinkown; ++extern kgid_t grsec_symlinkown_gid; ++extern int grsec_enable_tpe; ++extern kgid_t grsec_tpe_gid; ++extern int grsec_enable_tpe_all; ++extern int grsec_enable_tpe_invert; ++extern int grsec_enable_socket_all; ++extern kgid_t grsec_socket_all_gid; ++extern int grsec_enable_socket_client; ++extern kgid_t grsec_socket_client_gid; ++extern int grsec_enable_socket_server; ++extern kgid_t grsec_socket_server_gid; ++extern kgid_t grsec_audit_gid; ++extern int grsec_enable_group; ++extern int grsec_enable_log_rwxmaps; ++extern int grsec_enable_mount; ++extern int grsec_enable_chdir; ++extern int grsec_resource_logging; ++extern int grsec_enable_blackhole; ++extern int grsec_lastack_retries; ++extern int grsec_enable_brute; ++extern int grsec_enable_harden_ipc; ++extern int grsec_lock; ++ ++extern spinlock_t grsec_alert_lock; ++extern unsigned long grsec_alert_wtime; ++extern unsigned long grsec_alert_fyet; ++ ++extern spinlock_t grsec_audit_lock; ++ ++extern rwlock_t grsec_exec_file_lock; ++ ++#define gr_task_fullpath(tsk) ((tsk)->exec_file ? \ ++ gr_to_filename2((tsk)->exec_file->f_path.dentry, \ ++ (tsk)->exec_file->f_path.mnt) : "/") ++ ++#define gr_parent_task_fullpath(tsk) ((tsk)->real_parent->exec_file ? \ ++ gr_to_filename3((tsk)->real_parent->exec_file->f_path.dentry, \ ++ (tsk)->real_parent->exec_file->f_path.mnt) : "/") ++ ++#define gr_task_fullpath0(tsk) ((tsk)->exec_file ? \ ++ gr_to_filename((tsk)->exec_file->f_path.dentry, \ ++ (tsk)->exec_file->f_path.mnt) : "/") ++ ++#define gr_parent_task_fullpath0(tsk) ((tsk)->real_parent->exec_file ? \ ++ gr_to_filename1((tsk)->real_parent->exec_file->f_path.dentry, \ ++ (tsk)->real_parent->exec_file->f_path.mnt) : "/") ++ ++#define proc_is_chrooted(tsk_a) ((tsk_a)->gr_is_chrooted) ++ ++#define have_same_root(tsk_a,tsk_b) ((tsk_a)->gr_chroot_dentry == (tsk_b)->gr_chroot_dentry) ++ ++static inline bool gr_is_same_file(const struct file *file1, const struct file *file2) ++{ ++ if (file1 && file2) { ++ const struct inode *inode1 = file1->f_path.dentry->d_inode; ++ const struct inode *inode2 = file2->f_path.dentry->d_inode; ++ if (inode1->i_ino == inode2->i_ino && inode1->i_sb->s_dev == inode2->i_sb->s_dev) ++ return true; ++ } ++ ++ return false; ++} ++ ++#define GR_CHROOT_CAPS {{ \ ++ CAP_TO_MASK(CAP_LINUX_IMMUTABLE) | CAP_TO_MASK(CAP_NET_ADMIN) | \ ++ CAP_TO_MASK(CAP_SYS_MODULE) | CAP_TO_MASK(CAP_SYS_RAWIO) | \ ++ CAP_TO_MASK(CAP_SYS_PACCT) | CAP_TO_MASK(CAP_SYS_ADMIN) | \ ++ CAP_TO_MASK(CAP_SYS_BOOT) | CAP_TO_MASK(CAP_SYS_TIME) | \ ++ CAP_TO_MASK(CAP_NET_RAW) | CAP_TO_MASK(CAP_SYS_TTY_CONFIG) | \ ++ CAP_TO_MASK(CAP_IPC_OWNER) | CAP_TO_MASK(CAP_SETFCAP), \ ++ CAP_TO_MASK(CAP_SYSLOG) | CAP_TO_MASK(CAP_MAC_ADMIN) }} ++ ++#define security_learn(normal_msg,args...) \ ++({ \ ++ read_lock(&grsec_exec_file_lock); \ ++ gr_add_learn_entry(normal_msg "\n", ## args); \ ++ read_unlock(&grsec_exec_file_lock); \ ++}) ++ ++enum { ++ GR_DO_AUDIT, ++ GR_DONT_AUDIT, ++ /* used for non-audit messages that we shouldn't kill the task on */ ++ GR_DONT_AUDIT_GOOD ++}; ++ ++enum { ++ GR_TTYSNIFF, ++ GR_RBAC, ++ GR_RBAC_STR, ++ GR_STR_RBAC, ++ GR_RBAC_MODE2, ++ GR_RBAC_MODE3, ++ GR_FILENAME, ++ GR_SYSCTL_HIDDEN, ++ GR_NOARGS, ++ GR_ONE_INT, ++ GR_ONE_INT_TWO_STR, ++ GR_ONE_STR, ++ GR_STR_INT, ++ GR_TWO_STR_INT, ++ GR_TWO_INT, ++ GR_TWO_U64, ++ GR_THREE_INT, ++ GR_FIVE_INT_TWO_STR, ++ GR_TWO_STR, ++ GR_THREE_STR, ++ GR_FOUR_STR, ++ GR_STR_FILENAME, ++ GR_FILENAME_STR, ++ GR_FILENAME_TWO_INT, ++ GR_FILENAME_TWO_INT_STR, ++ GR_TEXTREL, ++ GR_PTRACE, ++ GR_RESOURCE, ++ GR_CAP, ++ GR_SIG, ++ GR_SIG2, ++ GR_CRASH1, ++ GR_CRASH2, ++ GR_PSACCT, ++ GR_RWXMAP, ++ GR_RWXMAPVMA ++}; ++ ++#define gr_log_hidden_sysctl(audit, msg, str) gr_log_varargs(audit, msg, GR_SYSCTL_HIDDEN, str) ++#define gr_log_ttysniff(audit, msg, task) gr_log_varargs(audit, msg, GR_TTYSNIFF, task) ++#define gr_log_fs_rbac_generic(audit, msg, dentry, mnt) gr_log_varargs(audit, msg, GR_RBAC, dentry, mnt) ++#define gr_log_fs_rbac_str(audit, msg, dentry, mnt, str) gr_log_varargs(audit, msg, GR_RBAC_STR, dentry, mnt, str) ++#define gr_log_fs_str_rbac(audit, msg, str, dentry, mnt) gr_log_varargs(audit, msg, GR_STR_RBAC, str, dentry, mnt) ++#define gr_log_fs_rbac_mode2(audit, msg, dentry, mnt, str1, str2) gr_log_varargs(audit, msg, GR_RBAC_MODE2, dentry, mnt, str1, str2) ++#define gr_log_fs_rbac_mode3(audit, msg, dentry, mnt, str1, str2, str3) gr_log_varargs(audit, msg, GR_RBAC_MODE3, dentry, mnt, str1, str2, str3) ++#define gr_log_fs_generic(audit, msg, dentry, mnt) gr_log_varargs(audit, msg, GR_FILENAME, dentry, mnt) ++#define gr_log_noargs(audit, msg) gr_log_varargs(audit, msg, GR_NOARGS) ++#define gr_log_int(audit, msg, num) gr_log_varargs(audit, msg, GR_ONE_INT, num) ++#define gr_log_int_str2(audit, msg, num, str1, str2) gr_log_varargs(audit, msg, GR_ONE_INT_TWO_STR, num, str1, str2) ++#define gr_log_str(audit, msg, str) gr_log_varargs(audit, msg, GR_ONE_STR, str) ++#define gr_log_str_int(audit, msg, str, num) gr_log_varargs(audit, msg, GR_STR_INT, str, num) ++#define gr_log_int_int(audit, msg, num1, num2) gr_log_varargs(audit, msg, GR_TWO_INT, num1, num2) ++#define gr_log_two_u64(audit, msg, num1, num2) gr_log_varargs(audit, msg, GR_TWO_U64, num1, num2) ++#define gr_log_int3(audit, msg, num1, num2, num3) gr_log_varargs(audit, msg, GR_THREE_INT, num1, num2, num3) ++#define gr_log_int5_str2(audit, msg, num1, num2, str1, str2) gr_log_varargs(audit, msg, GR_FIVE_INT_TWO_STR, num1, num2, str1, str2) ++#define gr_log_str_str(audit, msg, str1, str2) gr_log_varargs(audit, msg, GR_TWO_STR, str1, str2) ++#define gr_log_str2_int(audit, msg, str1, str2, num) gr_log_varargs(audit, msg, GR_TWO_STR_INT, str1, str2, num) ++#define gr_log_str3(audit, msg, str1, str2, str3) gr_log_varargs(audit, msg, GR_THREE_STR, str1, str2, str3) ++#define gr_log_str4(audit, msg, str1, str2, str3, str4) gr_log_varargs(audit, msg, GR_FOUR_STR, str1, str2, str3, str4) ++#define gr_log_str_fs(audit, msg, str, dentry, mnt) gr_log_varargs(audit, msg, GR_STR_FILENAME, str, dentry, mnt) ++#define gr_log_fs_str(audit, msg, dentry, mnt, str) gr_log_varargs(audit, msg, GR_FILENAME_STR, dentry, mnt, str) ++#define gr_log_fs_int2(audit, msg, dentry, mnt, num1, num2) gr_log_varargs(audit, msg, GR_FILENAME_TWO_INT, dentry, mnt, num1, num2) ++#define gr_log_fs_int2_str(audit, msg, dentry, mnt, num1, num2, str) gr_log_varargs(audit, msg, GR_FILENAME_TWO_INT_STR, dentry, mnt, num1, num2, str) ++#define gr_log_textrel_ulong_ulong(audit, msg, file, ulong1, ulong2) gr_log_varargs(audit, msg, GR_TEXTREL, file, ulong1, ulong2) ++#define gr_log_ptrace(audit, msg, task) gr_log_varargs(audit, msg, GR_PTRACE, task) ++#define gr_log_res_ulong2_str(audit, msg, task, ulong1, str, ulong2) gr_log_varargs(audit, msg, GR_RESOURCE, task, ulong1, str, ulong2) ++#define gr_log_cap(audit, msg, task, str) gr_log_varargs(audit, msg, GR_CAP, task, str) ++#define gr_log_sig_addr(audit, msg, str, addr) gr_log_varargs(audit, msg, GR_SIG, str, addr) ++#define gr_log_sig_task(audit, msg, task, num) gr_log_varargs(audit, msg, GR_SIG2, task, num) ++#define gr_log_crash1(audit, msg, task, ulong) gr_log_varargs(audit, msg, GR_CRASH1, task, ulong) ++#define gr_log_crash2(audit, msg, task, ulong1) gr_log_varargs(audit, msg, GR_CRASH2, task, ulong1) ++#define gr_log_procacct(audit, msg, task, num1, num2, num3, num4, num5, num6, num7, num8, num9) gr_log_varargs(audit, msg, GR_PSACCT, task, num1, num2, num3, num4, num5, num6, num7, num8, num9) ++#define gr_log_rwxmap(audit, msg, str) gr_log_varargs(audit, msg, GR_RWXMAP, str) ++#define gr_log_rwxmap_vma(audit, msg, str) gr_log_varargs(audit, msg, GR_RWXMAPVMA, str) ++ ++void gr_log_varargs(int audit, const char *msg, int argtypes, ...); ++ ++#endif ++ ++#endif +diff --git a/include/linux/grmsg.h b/include/linux/grmsg.h +new file mode 100644 +index 0000000..26ef560 +--- /dev/null ++++ b/include/linux/grmsg.h +@@ -0,0 +1,118 @@ ++#define DEFAULTSECMSG "%.256s[%.16s:%d] uid/euid:%u/%u gid/egid:%u/%u, parent %.256s[%.16s:%d] uid/euid:%u/%u gid/egid:%u/%u" ++#define GR_ACL_PROCACCT_MSG "%.256s[%.16s:%d] IP:%pI4 TTY:%.64s uid/euid:%u/%u gid/egid:%u/%u run time:[%ud %uh %um %us] cpu time:[%ud %uh %um %us] %s with exit code %ld, parent %.256s[%.16s:%d] IP:%pI4 TTY:%.64s uid/euid:%u/%u gid/egid:%u/%u" ++#define GR_PTRACE_ACL_MSG "denied ptrace of %.950s(%.16s:%d) by " ++#define GR_STOPMOD_MSG "denied modification of module state by " ++#define GR_ROFS_BLOCKWRITE_MSG "denied write to block device %.950s by " ++#define GR_ROFS_MOUNT_MSG "denied writable mount of %.950s by " ++#define GR_IOPERM_MSG "denied use of ioperm() by " ++#define GR_IOPL_MSG "denied use of iopl() by " ++#define GR_SHMAT_ACL_MSG "denied attach of shared memory of UID %u, PID %d, ID %u by " ++#define GR_UNIX_CHROOT_MSG "denied connect() to abstract AF_UNIX socket outside of chroot by " ++#define GR_SHMAT_CHROOT_MSG "denied attach of shared memory outside of chroot by " ++#define GR_MEM_READWRITE_MSG "denied access of range %Lx -> %Lx in /dev/mem by " ++#define GR_SYMLINK_MSG "not following symlink %.950s owned by %d.%d by " ++#define GR_LEARN_AUDIT_MSG "%s\t%u\t%u\t%u\t%.4095s\t%.4095s\t%lu\t%lu\t%.4095s\t%lu\t%pI4" ++#define GR_ID_LEARN_MSG "%s\t%u\t%u\t%u\t%.4095s\t%.4095s\t%c\t%d\t%d\t%d\t%pI4" ++#define GR_HIDDEN_ACL_MSG "%s access to hidden file %.950s by " ++#define GR_OPEN_ACL_MSG "%s open of %.950s for%s%s by " ++#define GR_CREATE_ACL_MSG "%s create of %.950s for%s%s by " ++#define GR_FIFO_MSG "denied writing FIFO %.950s of %d.%d by " ++#define GR_MKNOD_CHROOT_MSG "denied mknod of %.950s from chroot by " ++#define GR_MKNOD_ACL_MSG "%s mknod of %.950s by " ++#define GR_UNIXCONNECT_ACL_MSG "%s connect() to the unix domain socket %.950s by " ++#define GR_TTYSNIFF_ACL_MSG "terminal being sniffed by IP:%pI4 %.480s[%.16s:%d], parent %.480s[%.16s:%d] against " ++#define GR_MKDIR_ACL_MSG "%s mkdir of %.950s by " ++#define GR_RMDIR_ACL_MSG "%s rmdir of %.950s by " ++#define GR_UNLINK_ACL_MSG "%s unlink of %.950s by " ++#define GR_SYMLINK_ACL_MSG "%s symlink from %.480s to %.480s by " ++#define GR_HARDLINK_MSG "denied hardlink of %.930s (owned by %d.%d) to %.30s for " ++#define GR_LINK_ACL_MSG "%s link of %.480s to %.480s by " ++#define GR_INHERIT_ACL_MSG "successful inherit of %.480s's ACL for %.480s by " ++#define GR_RENAME_ACL_MSG "%s rename of %.480s to %.480s by " ++#define GR_UNSAFESHARE_EXEC_ACL_MSG "denied exec with cloned fs of %.950s by " ++#define GR_PTRACE_EXEC_ACL_MSG "denied ptrace of %.950s by " ++#define GR_EXEC_ACL_MSG "%s execution of %.950s by " ++#define GR_EXEC_TPE_MSG "denied untrusted exec (due to %.70s) of %.950s by " ++#define GR_SEGVSTART_ACL_MSG "possible exploit bruteforcing on " DEFAULTSECMSG " banning uid %u from login for %lu seconds" ++#define GR_SEGVNOSUID_ACL_MSG "possible exploit bruteforcing on " DEFAULTSECMSG " banning execution for %lu seconds" ++#define GR_MOUNT_CHROOT_MSG "denied mount of %.256s as %.930s from chroot by " ++#define GR_PIVOT_CHROOT_MSG "denied pivot_root from chroot by " ++#define GR_TRUNCATE_ACL_MSG "%s truncate of %.950s by " ++#define GR_ATIME_ACL_MSG "%s access time change of %.950s by " ++#define GR_ACCESS_ACL_MSG "%s access of %.950s for%s%s%s by " ++#define GR_CHROOT_CHROOT_MSG "denied double chroot to %.950s by " ++#define GR_CHROOT_RENAME_MSG "denied bad rename of %.950s out of a chroot by " ++#define GR_CHMOD_CHROOT_MSG "denied chmod +s of %.950s by " ++#define GR_CHMOD_ACL_MSG "%s chmod of %.950s by " ++#define GR_CHROOT_FCHDIR_MSG "denied fchdir outside of chroot to %.950s by " ++#define GR_CHROOT_FHANDLE_MSG "denied use of file handles inside chroot by " ++#define GR_CHOWN_ACL_MSG "%s chown of %.950s by " ++#define GR_SETXATTR_ACL_MSG "%s setting extended attribute of %.950s by " ++#define GR_REMOVEXATTR_ACL_MSG "%s removing extended attribute of %.950s by " ++#define GR_WRITLIB_ACL_MSG "denied load of writable library %.950s by " ++#define GR_INITF_ACL_MSG "init_variables() failed %s by " ++#define GR_DISABLED_ACL_MSG "Error loading %s, trying to run kernel with acls disabled. To disable acls at startup use <kernel image name> gracl=off from your boot loader" ++#define GR_DEV_ACL_MSG "/dev/grsec: %d bytes sent %d required, being fed garbage by " ++#define GR_SHUTS_ACL_MSG "shutdown auth success for " ++#define GR_SHUTF_ACL_MSG "shutdown auth failure for " ++#define GR_SHUTI_ACL_MSG "ignoring shutdown for disabled RBAC system for " ++#define GR_SEGVMODS_ACL_MSG "segvmod auth success for " ++#define GR_SEGVMODF_ACL_MSG "segvmod auth failure for " ++#define GR_SEGVMODI_ACL_MSG "ignoring segvmod for disabled RBAC system for " ++#define GR_ENABLE_ACL_MSG "%s RBAC system loaded by " ++#define GR_ENABLEF_ACL_MSG "unable to load %s for " ++#define GR_RELOADI_ACL_MSG "ignoring reload request for disabled RBAC system" ++#define GR_RELOAD_ACL_MSG "%s RBAC system reloaded by " ++#define GR_RELOADF_ACL_MSG "failed reload of %s for " ++#define GR_SPROLEI_ACL_MSG "ignoring change to special role for disabled RBAC system for " ++#define GR_SPROLES_ACL_MSG "successful change to special role %s (id %d) by " ++#define GR_SPROLEL_ACL_MSG "special role %s (id %d) exited by " ++#define GR_SPROLEF_ACL_MSG "special role %s failure for " ++#define GR_UNSPROLEI_ACL_MSG "ignoring unauth of special role for disabled RBAC system for " ++#define GR_UNSPROLES_ACL_MSG "successful unauth of special role %s (id %d) by " ++#define GR_INVMODE_ACL_MSG "invalid mode %d by " ++#define GR_PRIORITY_CHROOT_MSG "denied priority change of process (%.16s:%d) by " ++#define GR_FAILFORK_MSG "failed fork with errno %s by " ++#define GR_NICE_CHROOT_MSG "denied priority change by " ++#define GR_UNISIGLOG_MSG "%.32s occurred at %p in " ++#define GR_DUALSIGLOG_MSG "signal %d sent to " DEFAULTSECMSG " by " ++#define GR_SIG_ACL_MSG "denied send of signal %d to protected task " DEFAULTSECMSG " by " ++#define GR_SYSCTL_MSG "denied modification of grsecurity sysctl value : %.32s by " ++#define GR_SYSCTL_ACL_MSG "%s sysctl of %.950s for%s%s by " ++#define GR_TIME_MSG "time set by " ++#define GR_DEFACL_MSG "fatal: unable to find subject for (%.16s:%d), loaded by " ++#define GR_MMAP_ACL_MSG "%s executable mmap of %.950s by " ++#define GR_MPROTECT_ACL_MSG "%s executable mprotect of %.950s by " ++#define GR_SOCK_MSG "denied socket(%.16s,%.16s,%.16s) by " ++#define GR_SOCK_NOINET_MSG "denied socket(%.16s,%.16s,%d) by " ++#define GR_BIND_MSG "denied bind() by " ++#define GR_CONNECT_MSG "denied connect() by " ++#define GR_BIND_ACL_MSG "denied bind() to %pI4 port %u sock type %.16s protocol %.16s by " ++#define GR_CONNECT_ACL_MSG "denied connect() to %pI4 port %u sock type %.16s protocol %.16s by " ++#define GR_IP_LEARN_MSG "%s\t%u\t%u\t%u\t%.4095s\t%.4095s\t%pI4\t%u\t%u\t%u\t%u\t%pI4" ++#define GR_EXEC_CHROOT_MSG "exec of %.980s within chroot by process " ++#define GR_CAP_ACL_MSG "use of %s denied for " ++#define GR_CAP_CHROOT_MSG "use of %s in chroot denied for " ++#define GR_CAP_ACL_MSG2 "use of %s permitted for " ++#define GR_USRCHANGE_ACL_MSG "change to uid %u denied for " ++#define GR_GRPCHANGE_ACL_MSG "change to gid %u denied for " ++#define GR_REMOUNT_AUDIT_MSG "remount of %.256s by " ++#define GR_UNMOUNT_AUDIT_MSG "unmount of %.256s by " ++#define GR_MOUNT_AUDIT_MSG "mount of %.256s to %.256s by " ++#define GR_CHDIR_AUDIT_MSG "chdir to %.980s by " ++#define GR_EXEC_AUDIT_MSG "exec of %.930s (%.128s) by " ++#define GR_RESOURCE_MSG "denied resource overstep by requesting %lu for %.16s against limit %lu for " ++#define GR_RWXMMAP_MSG "denied RWX mmap of %.950s by " ++#define GR_RWXMPROTECT_MSG "denied RWX mprotect of %.950s by " ++#define GR_TEXTREL_AUDIT_MSG "denied text relocation in %.950s, VMA:0x%08lx 0x%08lx by " ++#define GR_PTGNUSTACK_MSG "denied marking stack executable as requested by PT_GNU_STACK marking in %.950s by " ++#define GR_VM86_MSG "denied use of vm86 by " ++#define GR_PTRACE_AUDIT_MSG "process %.950s(%.16s:%d) attached to via ptrace by " ++#define GR_PTRACE_READEXEC_MSG "denied ptrace of unreadable binary %.950s by " ++#define GR_INIT_TRANSFER_MSG "persistent special role transferred privilege to init by " ++#define GR_BADPROCPID_MSG "denied read of sensitive /proc/pid/%s entry via fd passed across exec by " ++#define GR_SYMLINKOWNER_MSG "denied following symlink %.950s since symlink owner %u does not match target owner %u, by " ++#define GR_BRUTE_DAEMON_MSG "bruteforce prevention initiated for the next 30 minutes or until service restarted, stalling each fork 30 seconds. Please investigate the crash report for " ++#define GR_BRUTE_SUID_MSG "bruteforce prevention initiated due to crash of %.950s against uid %u, banning suid/sgid execs for %u minutes. Please investigate the crash report for " ++#define GR_IPC_DENIED_MSG "denied %s of overly-permissive IPC object with creator uid %u by " ++#define GR_MSRWRITE_MSG "denied write to CPU MSR by " +diff --git a/include/linux/grsecurity.h b/include/linux/grsecurity.h +new file mode 100644 +index 0000000..63c1850 +--- /dev/null ++++ b/include/linux/grsecurity.h +@@ -0,0 +1,250 @@ ++#ifndef GR_SECURITY_H ++#define GR_SECURITY_H ++#include <linux/fs.h> ++#include <linux/fs_struct.h> ++#include <linux/binfmts.h> ++#include <linux/gracl.h> ++ ++/* notify of brain-dead configs */ ++#if defined(CONFIG_GRKERNSEC_PROC_USER) && defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++#error "CONFIG_GRKERNSEC_PROC_USER and CONFIG_GRKERNSEC_PROC_USERGROUP cannot both be enabled." ++#endif ++#if defined(CONFIG_GRKERNSEC_PROC) && !defined(CONFIG_GRKERNSEC_PROC_USER) && !defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++#error "CONFIG_GRKERNSEC_PROC enabled, but neither CONFIG_GRKERNSEC_PROC_USER nor CONFIG_GRKERNSEC_PROC_USERGROUP enabled" ++#endif ++#if defined(CONFIG_PAX_NOEXEC) && !defined(CONFIG_PAX_PAGEEXEC) && !defined(CONFIG_PAX_SEGMEXEC) && !defined(CONFIG_PAX_KERNEXEC) ++#error "CONFIG_PAX_NOEXEC enabled, but PAGEEXEC, SEGMEXEC, and KERNEXEC are disabled." ++#endif ++#if defined(CONFIG_PAX_ASLR) && !defined(CONFIG_PAX_RANDKSTACK) && !defined(CONFIG_PAX_RANDUSTACK) && !defined(CONFIG_PAX_RANDMMAP) ++#error "CONFIG_PAX_ASLR enabled, but RANDKSTACK, RANDUSTACK, and RANDMMAP are disabled." ++#endif ++#if defined(CONFIG_PAX) && !defined(CONFIG_PAX_NOEXEC) && !defined(CONFIG_PAX_ASLR) ++#error "CONFIG_PAX enabled, but no PaX options are enabled." ++#endif ++ ++int gr_handle_new_usb(void); ++ ++void gr_handle_brute_attach(int dumpable); ++void gr_handle_brute_check(void); ++void gr_handle_kernel_exploit(void); ++ ++char gr_roletype_to_char(void); ++ ++int gr_proc_is_restricted(void); ++ ++int gr_acl_enable_at_secure(void); ++ ++int gr_check_user_change(kuid_t real, kuid_t effective, kuid_t fs); ++int gr_check_group_change(kgid_t real, kgid_t effective, kgid_t fs); ++ ++int gr_learn_cap(const struct task_struct *task, const struct cred *cred, const int cap); ++ ++void gr_del_task_from_ip_table(struct task_struct *p); ++ ++int gr_pid_is_chrooted(struct task_struct *p); ++int gr_handle_chroot_fowner(struct pid *pid, enum pid_type type); ++int gr_handle_chroot_nice(void); ++int gr_handle_chroot_sysctl(const int op); ++int gr_handle_chroot_setpriority(struct task_struct *p, ++ const int niceval); ++int gr_chroot_fchdir(struct dentry *u_dentry, struct vfsmount *u_mnt); ++int gr_chroot_fhandle(void); ++int gr_handle_chroot_chroot(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++void gr_handle_chroot_chdir(const struct path *path); ++int gr_handle_chroot_chmod(const struct dentry *dentry, ++ const struct vfsmount *mnt, const int mode); ++int gr_handle_chroot_mknod(const struct dentry *dentry, ++ const struct vfsmount *mnt, const int mode); ++int gr_handle_chroot_mount(const struct dentry *dentry, ++ const struct vfsmount *mnt, ++ const char *dev_name); ++int gr_handle_chroot_pivot(void); ++int gr_handle_chroot_unix(const pid_t pid); ++ ++int gr_handle_rawio(const struct inode *inode); ++ ++void gr_handle_ioperm(void); ++void gr_handle_iopl(void); ++void gr_handle_msr_write(void); ++ ++umode_t gr_acl_umask(void); ++ ++int gr_tpe_allow(const struct file *file); ++ ++void gr_set_chroot_entries(struct task_struct *task, const struct path *path); ++void gr_clear_chroot_entries(struct task_struct *task); ++ ++void gr_log_forkfail(const int retval); ++void gr_log_timechange(void); ++void gr_log_signal(const int sig, const void *addr, const struct task_struct *t); ++void gr_log_chdir(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++void gr_log_chroot_exec(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++void gr_log_remount(const char *devname, const int retval); ++void gr_log_unmount(const char *devname, const int retval); ++void gr_log_mount(const char *from, struct path *to, const int retval); ++void gr_log_textrel(struct vm_area_struct *vma); ++void gr_log_ptgnustack(struct file *file); ++void gr_log_rwxmmap(struct file *file); ++void gr_log_rwxmprotect(struct vm_area_struct *vma); ++ ++int gr_handle_follow_link(const struct inode *parent, ++ const struct inode *inode, ++ const struct dentry *dentry, ++ const struct vfsmount *mnt); ++int gr_handle_fifo(const struct dentry *dentry, ++ const struct vfsmount *mnt, ++ const struct dentry *dir, const int flag, ++ const int acc_mode); ++int gr_handle_hardlink(const struct dentry *dentry, ++ const struct vfsmount *mnt, ++ struct inode *inode, ++ const int mode, const struct filename *to); ++ ++int gr_is_capable(const int cap); ++int gr_is_capable_nolog(const int cap); ++int gr_task_is_capable(const struct task_struct *task, const struct cred *cred, const int cap); ++int gr_task_is_capable_nolog(const struct task_struct *task, const int cap); ++ ++void gr_copy_label(struct task_struct *tsk); ++void gr_handle_crash(struct task_struct *task, const int sig); ++int gr_handle_signal(const struct task_struct *p, const int sig); ++int gr_check_crash_uid(const kuid_t uid); ++int gr_check_protected_task(const struct task_struct *task); ++int gr_check_protected_task_fowner(struct pid *pid, enum pid_type type); ++int gr_acl_handle_mmap(const struct file *file, ++ const unsigned long prot); ++int gr_acl_handle_mprotect(const struct file *file, ++ const unsigned long prot); ++int gr_check_hidden_task(const struct task_struct *tsk); ++__u32 gr_acl_handle_truncate(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++__u32 gr_acl_handle_utime(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++__u32 gr_acl_handle_access(const struct dentry *dentry, ++ const struct vfsmount *mnt, const int fmode); ++__u32 gr_acl_handle_chmod(const struct dentry *dentry, ++ const struct vfsmount *mnt, umode_t *mode); ++__u32 gr_acl_handle_chown(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++__u32 gr_acl_handle_setxattr(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++__u32 gr_acl_handle_removexattr(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++int gr_handle_ptrace(struct task_struct *task, const long request); ++int gr_handle_proc_ptrace(struct task_struct *task); ++__u32 gr_acl_handle_execve(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++int gr_check_crash_exec(const struct file *filp); ++int gr_acl_is_enabled(void); ++void gr_set_role_label(struct task_struct *task, const kuid_t uid, ++ const kgid_t gid); ++int gr_set_proc_label(const struct dentry *dentry, ++ const struct vfsmount *mnt, ++ const int unsafe_flags); ++__u32 gr_acl_handle_hidden_file(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++__u32 gr_acl_handle_open(const struct dentry *dentry, ++ const struct vfsmount *mnt, int acc_mode); ++__u32 gr_acl_handle_creat(const struct dentry *dentry, ++ const struct dentry *p_dentry, ++ const struct vfsmount *p_mnt, ++ int open_flags, int acc_mode, const int imode); ++void gr_handle_create(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++void gr_handle_proc_create(const struct dentry *dentry, ++ const struct inode *inode); ++__u32 gr_acl_handle_mknod(const struct dentry *new_dentry, ++ const struct dentry *parent_dentry, ++ const struct vfsmount *parent_mnt, ++ const int mode); ++__u32 gr_acl_handle_mkdir(const struct dentry *new_dentry, ++ const struct dentry *parent_dentry, ++ const struct vfsmount *parent_mnt); ++__u32 gr_acl_handle_rmdir(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++void gr_handle_delete(const u64 ino, const dev_t dev); ++__u32 gr_acl_handle_unlink(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++__u32 gr_acl_handle_symlink(const struct dentry *new_dentry, ++ const struct dentry *parent_dentry, ++ const struct vfsmount *parent_mnt, ++ const struct filename *from); ++__u32 gr_acl_handle_link(const struct dentry *new_dentry, ++ const struct dentry *parent_dentry, ++ const struct vfsmount *parent_mnt, ++ const struct dentry *old_dentry, ++ const struct vfsmount *old_mnt, const struct filename *to); ++int gr_handle_symlink_owner(const struct path *link, const struct inode *target); ++int gr_acl_handle_rename(struct dentry *new_dentry, ++ struct dentry *parent_dentry, ++ const struct vfsmount *parent_mnt, ++ struct dentry *old_dentry, ++ struct inode *old_parent_inode, ++ struct vfsmount *old_mnt, const struct filename *newname, unsigned int flags); ++void gr_handle_rename(struct inode *old_dir, struct inode *new_dir, ++ struct dentry *old_dentry, ++ struct dentry *new_dentry, ++ struct vfsmount *mnt, const __u8 replace, unsigned int flags); ++__u32 gr_check_link(const struct dentry *new_dentry, ++ const struct dentry *parent_dentry, ++ const struct vfsmount *parent_mnt, ++ const struct dentry *old_dentry, ++ const struct vfsmount *old_mnt); ++int gr_acl_handle_filldir(const struct file *file, const char *name, ++ const unsigned int namelen, const u64 ino); ++ ++__u32 gr_acl_handle_unix(const struct dentry *dentry, ++ const struct vfsmount *mnt); ++void gr_acl_handle_exit(void); ++void gr_acl_handle_psacct(struct task_struct *task, const long code); ++int gr_acl_handle_procpidmem(const struct task_struct *task); ++int gr_handle_rofs_mount(struct dentry *dentry, struct vfsmount *mnt, int mnt_flags); ++int gr_handle_rofs_blockwrite(struct dentry *dentry, struct vfsmount *mnt, int acc_mode); ++void gr_audit_ptrace(struct task_struct *task); ++dev_t gr_get_dev_from_dentry(struct dentry *dentry); ++u64 gr_get_ino_from_dentry(struct dentry *dentry); ++void gr_put_exec_file(struct task_struct *task); ++ ++int gr_ptrace_readexec(struct file *file, int unsafe_flags); ++ ++void gr_inc_chroot_refcnts(struct dentry *dentry, struct vfsmount *mnt); ++void gr_dec_chroot_refcnts(struct dentry *dentry, struct vfsmount *mnt); ++int gr_bad_chroot_rename(struct dentry *olddentry, struct vfsmount *oldmnt, ++ struct dentry *newdentry, struct vfsmount *newmnt); ++ ++#ifdef CONFIG_GRKERNSEC_RESLOG ++extern void gr_log_resource(const struct task_struct *task, const int res, ++ const unsigned long wanted, const int gt); ++#else ++static inline void gr_log_resource(const struct task_struct *task, const int res, ++ const unsigned long wanted, const int gt) ++{ ++} ++#endif ++ ++#ifdef CONFIG_GRKERNSEC ++void task_grsec_rbac(struct seq_file *m, struct task_struct *p); ++void gr_handle_vm86(void); ++void gr_handle_mem_readwrite(u64 from, u64 to); ++ ++void gr_log_badprocpid(const char *entry); ++ ++extern int grsec_enable_dmesg; ++extern int grsec_disable_privio; ++ ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++extern kgid_t grsec_proc_gid; ++#endif ++ ++#ifdef CONFIG_GRKERNSEC_CHROOT_FINDTASK ++extern int grsec_enable_chroot_findtask; ++#endif ++#ifdef CONFIG_GRKERNSEC_SETXID ++extern int grsec_enable_setxid; ++#endif ++#endif ++ ++#endif +diff --git a/include/linux/grsock.h b/include/linux/grsock.h +new file mode 100644 +index 0000000..e7ffaaf +--- /dev/null ++++ b/include/linux/grsock.h +@@ -0,0 +1,19 @@ ++#ifndef __GRSOCK_H ++#define __GRSOCK_H ++ ++extern void gr_attach_curr_ip(const struct sock *sk); ++extern int gr_handle_sock_all(const int family, const int type, ++ const int protocol); ++extern int gr_handle_sock_server(const struct sockaddr *sck); ++extern int gr_handle_sock_server_other(const struct sock *sck); ++extern int gr_handle_sock_client(const struct sockaddr *sck); ++extern int gr_search_connect(struct socket * sock, ++ struct sockaddr_in * addr); ++extern int gr_search_bind(struct socket * sock, ++ struct sockaddr_in * addr); ++extern int gr_search_listen(struct socket * sock); ++extern int gr_search_accept(struct socket * sock); ++extern int gr_search_socket(const int domain, const int type, ++ const int protocol); ++ ++#endif +diff --git a/include/linux/hash.h b/include/linux/hash.h +index d0494c3..69b7715 100644 +--- a/include/linux/hash.h ++++ b/include/linux/hash.h +@@ -87,7 +87,7 @@ static inline u32 hash32_ptr(const void *ptr) + struct fast_hash_ops { + u32 (*hash)(const void *data, u32 len, u32 seed); + u32 (*hash2)(const u32 *data, u32 len, u32 seed); +-}; ++} __no_const; + + /** + * arch_fast_hash - Caclulates a hash over a given buffer that can have +diff --git a/include/linux/highmem.h b/include/linux/highmem.h +index 9286a46..373f27f 100644 +--- a/include/linux/highmem.h ++++ b/include/linux/highmem.h +@@ -189,6 +189,18 @@ static inline void clear_highpage(struct page *page) + kunmap_atomic(kaddr); + } + ++static inline void sanitize_highpage(struct page *page) ++{ ++ void *kaddr; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ kaddr = kmap_atomic(page); ++ clear_page(kaddr); ++ kunmap_atomic(kaddr); ++ local_irq_restore(flags); ++} ++ + static inline void zero_user_segments(struct page *page, + unsigned start1, unsigned end1, + unsigned start2, unsigned end2) +diff --git a/include/linux/hwmon-sysfs.h b/include/linux/hwmon-sysfs.h +index 1c7b89a..7dda400 100644 +--- a/include/linux/hwmon-sysfs.h ++++ b/include/linux/hwmon-sysfs.h +@@ -25,7 +25,8 @@ + struct sensor_device_attribute{ + struct device_attribute dev_attr; + int index; +-}; ++} __do_const; ++typedef struct sensor_device_attribute __no_const sensor_device_attribute_no_const; + #define to_sensor_dev_attr(_dev_attr) \ + container_of(_dev_attr, struct sensor_device_attribute, dev_attr) + +@@ -41,7 +42,8 @@ struct sensor_device_attribute_2 { + struct device_attribute dev_attr; + u8 index; + u8 nr; +-}; ++} __do_const; ++typedef struct sensor_device_attribute_2 __no_const sensor_device_attribute_2_no_const; + #define to_sensor_dev_attr_2(_dev_attr) \ + container_of(_dev_attr, struct sensor_device_attribute_2, dev_attr) + +diff --git a/include/linux/i2c.h b/include/linux/i2c.h +index b556e0a..c10a515 100644 +--- a/include/linux/i2c.h ++++ b/include/linux/i2c.h +@@ -378,6 +378,7 @@ struct i2c_algorithm { + /* To determine what the adapter supports */ + u32 (*functionality) (struct i2c_adapter *); + }; ++typedef struct i2c_algorithm __no_const i2c_algorithm_no_const; + + /** + * struct i2c_bus_recovery_info - I2C bus recovery information +diff --git a/include/linux/i2o.h b/include/linux/i2o.h +index d23c3c2..eb63c81 100644 +--- a/include/linux/i2o.h ++++ b/include/linux/i2o.h +@@ -565,7 +565,7 @@ struct i2o_controller { + struct i2o_device *exec; /* Executive */ + #if BITS_PER_LONG == 64 + spinlock_t context_list_lock; /* lock for context_list */ +- atomic_t context_list_counter; /* needed for unique contexts */ ++ atomic_unchecked_t context_list_counter; /* needed for unique contexts */ + struct list_head context_list; /* list of context id's + and pointers */ + #endif +diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h +index aff7ad8..3942bbd 100644 +--- a/include/linux/if_pppox.h ++++ b/include/linux/if_pppox.h +@@ -76,7 +76,7 @@ struct pppox_proto { + int (*ioctl)(struct socket *sock, unsigned int cmd, + unsigned long arg); + struct module *owner; +-}; ++} __do_const; + + extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp); + extern void unregister_pppox_proto(int proto_num); +diff --git a/include/linux/init.h b/include/linux/init.h +index 2df8e8d..3e1280d 100644 +--- a/include/linux/init.h ++++ b/include/linux/init.h +@@ -37,9 +37,17 @@ + * section. + */ + ++#define add_init_latent_entropy __latent_entropy ++ ++#ifdef CONFIG_MEMORY_HOTPLUG ++#define add_meminit_latent_entropy ++#else ++#define add_meminit_latent_entropy __latent_entropy ++#endif ++ + /* These are for everybody (although not all archs will actually + discard it in modules) */ +-#define __init __section(.init.text) __cold notrace ++#define __init __section(.init.text) __cold notrace add_init_latent_entropy + #define __initdata __section(.init.data) + #define __initconst __constsection(.init.rodata) + #define __exitdata __section(.exit.data) +@@ -100,7 +108,7 @@ + #define __cpuexitconst + + /* Used for MEMORY_HOTPLUG */ +-#define __meminit __section(.meminit.text) __cold notrace ++#define __meminit __section(.meminit.text) __cold notrace add_meminit_latent_entropy + #define __meminitdata __section(.meminit.data) + #define __meminitconst __constsection(.meminit.rodata) + #define __memexit __section(.memexit.text) __exitused __cold notrace +diff --git a/include/linux/init_task.h b/include/linux/init_task.h +index 77fc43f..73caf92 100644 +--- a/include/linux/init_task.h ++++ b/include/linux/init_task.h +@@ -158,6 +158,12 @@ extern struct task_group root_task_group; + + #define INIT_TASK_COMM "swapper" + ++#ifdef CONFIG_X86 ++#define INIT_TASK_THREAD_INFO .tinfo = INIT_THREAD_INFO, ++#else ++#define INIT_TASK_THREAD_INFO ++#endif ++ + #ifdef CONFIG_RT_MUTEXES + # define INIT_RT_MUTEXES(tsk) \ + .pi_waiters = RB_ROOT, \ +@@ -205,6 +211,7 @@ extern struct task_group root_task_group; + RCU_POINTER_INITIALIZER(cred, &init_cred), \ + .comm = INIT_TASK_COMM, \ + .thread = INIT_THREAD, \ ++ INIT_TASK_THREAD_INFO \ + .fs = &init_fs, \ + .files = &init_files, \ + .signal = &init_signals, \ +diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h +index 69517a2..6b12d37 100644 +--- a/include/linux/interrupt.h ++++ b/include/linux/interrupt.h +@@ -413,8 +413,8 @@ extern const char * const softirq_to_name[NR_SOFTIRQS]; + + struct softirq_action + { +- void (*action)(struct softirq_action *); +-}; ++ void (*action)(void); ++} __no_const; + + asmlinkage void do_softirq(void); + asmlinkage void __do_softirq(void); +@@ -428,7 +428,7 @@ static inline void do_softirq_own_stack(void) + } + #endif + +-extern void open_softirq(int nr, void (*action)(struct softirq_action *)); ++extern void open_softirq(int nr, void (*action)(void)); + extern void softirq_init(void); + extern void __raise_softirq_irqoff(unsigned int nr); + +diff --git a/include/linux/iommu.h b/include/linux/iommu.h +index e6a7c9f..5804745 100644 +--- a/include/linux/iommu.h ++++ b/include/linux/iommu.h +@@ -133,7 +133,7 @@ struct iommu_ops { + u32 (*domain_get_windows)(struct iommu_domain *domain); + + unsigned long pgsize_bitmap; +-}; ++} __do_const; + + #define IOMMU_GROUP_NOTIFY_ADD_DEVICE 1 /* Device added */ + #define IOMMU_GROUP_NOTIFY_DEL_DEVICE 2 /* Pre Device removed */ +diff --git a/include/linux/ioport.h b/include/linux/ioport.h +index 2c525022..345b106 100644 +--- a/include/linux/ioport.h ++++ b/include/linux/ioport.h +@@ -161,7 +161,7 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start); + int adjust_resource(struct resource *res, resource_size_t start, + resource_size_t size); + resource_size_t resource_alignment(struct resource *res); +-static inline resource_size_t resource_size(const struct resource *res) ++static inline resource_size_t __intentional_overflow(-1) resource_size(const struct resource *res) + { + return res->end - res->start + 1; + } +diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h +index 35e7eca..6afb7ad 100644 +--- a/include/linux/ipc_namespace.h ++++ b/include/linux/ipc_namespace.h +@@ -69,7 +69,7 @@ struct ipc_namespace { + struct user_namespace *user_ns; + + unsigned int proc_inum; +-}; ++} __randomize_layout; + + extern struct ipc_namespace init_ipc_ns; + extern atomic_t nr_ipc_ns; +diff --git a/include/linux/irq.h b/include/linux/irq.h +index 03f48d9..e86af0c 100644 +--- a/include/linux/irq.h ++++ b/include/linux/irq.h +@@ -352,7 +352,8 @@ struct irq_chip { + void (*irq_release_resources)(struct irq_data *data); + + unsigned long flags; +-}; ++} __do_const; ++typedef struct irq_chip __no_const irq_chip_no_const; + + /* + * irq_chip specific flags +diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h +index 13eed92..3261c86 100644 +--- a/include/linux/irqchip/arm-gic.h ++++ b/include/linux/irqchip/arm-gic.h +@@ -91,9 +91,11 @@ + + #ifndef __ASSEMBLY__ + ++#include <linux/irq.h> ++ + struct device_node; + +-extern struct irq_chip gic_arch_extn; ++extern irq_chip_no_const gic_arch_extn; + + void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *, + u32 offset, struct device_node *); +diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h +index faf433a..7dcb186 100644 +--- a/include/linux/irqdesc.h ++++ b/include/linux/irqdesc.h +@@ -61,7 +61,7 @@ struct irq_desc { + unsigned int irq_count; /* For detecting broken IRQs */ + unsigned long last_unhandled; /* Aging timer for unhandled count */ + unsigned int irqs_unhandled; +- atomic_t threads_handled; ++ atomic_unchecked_t threads_handled; + int threads_handled_last; + raw_spinlock_t lock; + struct cpumask *percpu_enabled; +diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h +index c367cbd..c9b79e6 100644 +--- a/include/linux/jiffies.h ++++ b/include/linux/jiffies.h +@@ -280,20 +280,20 @@ extern unsigned long preset_lpj; + /* + * Convert various time units to each other: + */ +-extern unsigned int jiffies_to_msecs(const unsigned long j); +-extern unsigned int jiffies_to_usecs(const unsigned long j); ++extern unsigned int jiffies_to_msecs(const unsigned long j) __intentional_overflow(-1); ++extern unsigned int jiffies_to_usecs(const unsigned long j) __intentional_overflow(-1); + +-static inline u64 jiffies_to_nsecs(const unsigned long j) ++static inline u64 __intentional_overflow(-1) jiffies_to_nsecs(const unsigned long j) + { + return (u64)jiffies_to_usecs(j) * NSEC_PER_USEC; + } + +-extern unsigned long msecs_to_jiffies(const unsigned int m); +-extern unsigned long usecs_to_jiffies(const unsigned int u); ++extern unsigned long msecs_to_jiffies(const unsigned int m) __intentional_overflow(-1); ++extern unsigned long usecs_to_jiffies(const unsigned int u) __intentional_overflow(-1); + extern unsigned long timespec_to_jiffies(const struct timespec *value); + extern void jiffies_to_timespec(const unsigned long jiffies, +- struct timespec *value); +-extern unsigned long timeval_to_jiffies(const struct timeval *value); ++ struct timespec *value) __intentional_overflow(-1); ++extern unsigned long timeval_to_jiffies(const struct timeval *value) __intentional_overflow(-1); + extern void jiffies_to_timeval(const unsigned long jiffies, + struct timeval *value); + +diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h +index 6883e19..e854fcb 100644 +--- a/include/linux/kallsyms.h ++++ b/include/linux/kallsyms.h +@@ -15,7 +15,8 @@ + + struct module; + +-#ifdef CONFIG_KALLSYMS ++#if !defined(__INCLUDED_BY_HIDESYM) || !defined(CONFIG_KALLSYMS) ++#if defined(CONFIG_KALLSYMS) && !defined(CONFIG_GRKERNSEC_HIDESYM) + /* Lookup the address for a symbol. Returns 0 if not found. */ + unsigned long kallsyms_lookup_name(const char *name); + +@@ -106,6 +107,21 @@ static inline int lookup_symbol_attrs(unsigned long addr, unsigned long *size, u + /* Stupid that this does nothing, but I didn't create this mess. */ + #define __print_symbol(fmt, addr) + #endif /*CONFIG_KALLSYMS*/ ++#else /* when included by kallsyms.c, vsnprintf.c, kprobes.c, or ++ arch/x86/kernel/dumpstack.c, with HIDESYM enabled */ ++extern unsigned long kallsyms_lookup_name(const char *name); ++extern void __print_symbol(const char *fmt, unsigned long address); ++extern int sprint_backtrace(char *buffer, unsigned long address); ++extern int sprint_symbol(char *buffer, unsigned long address); ++extern int sprint_symbol_no_offset(char *buffer, unsigned long address); ++const char *kallsyms_lookup(unsigned long addr, ++ unsigned long *symbolsize, ++ unsigned long *offset, ++ char **modname, char *namebuf); ++extern int kallsyms_lookup_size_offset(unsigned long addr, ++ unsigned long *symbolsize, ++ unsigned long *offset); ++#endif + + /* This macro allows us to keep printk typechecking */ + static __printf(1, 2) +diff --git a/include/linux/key-type.h b/include/linux/key-type.h +index ff9f1d3..6712be5 100644 +--- a/include/linux/key-type.h ++++ b/include/linux/key-type.h +@@ -152,7 +152,7 @@ struct key_type { + /* internal fields */ + struct list_head link; /* link in types list */ + struct lock_class_key lock_class; /* key->sem lock class */ +-}; ++} __do_const; + + extern struct key_type key_type_keyring; + +diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h +index e465bb1..19f605f 100644 +--- a/include/linux/kgdb.h ++++ b/include/linux/kgdb.h +@@ -52,7 +52,7 @@ extern int kgdb_connected; + extern int kgdb_io_module_registered; + + extern atomic_t kgdb_setting_breakpoint; +-extern atomic_t kgdb_cpu_doing_single_step; ++extern atomic_unchecked_t kgdb_cpu_doing_single_step; + + extern struct task_struct *kgdb_usethread; + extern struct task_struct *kgdb_contthread; +@@ -254,7 +254,7 @@ struct kgdb_arch { + void (*correct_hw_break)(void); + + void (*enable_nmi)(bool on); +-}; ++} __do_const; + + /** + * struct kgdb_io - Describe the interface for an I/O driver to talk with KGDB. +@@ -279,7 +279,7 @@ struct kgdb_io { + void (*pre_exception) (void); + void (*post_exception) (void); + int is_console; +-}; ++} __do_const; + + extern struct kgdb_arch arch_kgdb_ops; + +diff --git a/include/linux/kmod.h b/include/linux/kmod.h +index 0555cc6..40116ce 100644 +--- a/include/linux/kmod.h ++++ b/include/linux/kmod.h +@@ -34,6 +34,8 @@ extern char modprobe_path[]; /* for sysctl */ + * usually useless though. */ + extern __printf(2, 3) + int __request_module(bool wait, const char *name, ...); ++extern __printf(3, 4) ++int ___request_module(bool wait, char *param_name, const char *name, ...); + #define request_module(mod...) __request_module(true, mod) + #define request_module_nowait(mod...) __request_module(false, mod) + #define try_then_request_module(x, mod...) \ +@@ -57,6 +59,9 @@ struct subprocess_info { + struct work_struct work; + struct completion *complete; + char *path; ++#ifdef CONFIG_GRKERNSEC ++ char *origpath; ++#endif + char **argv; + char **envp; + int wait; +diff --git a/include/linux/kobject.h b/include/linux/kobject.h +index 2d61b90..a1d0a13 100644 +--- a/include/linux/kobject.h ++++ b/include/linux/kobject.h +@@ -118,7 +118,7 @@ struct kobj_type { + struct attribute **default_attrs; + const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj); + const void *(*namespace)(struct kobject *kobj); +-}; ++} __do_const; + + struct kobj_uevent_env { + char *argv[3]; +@@ -142,6 +142,7 @@ struct kobj_attribute { + ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr, + const char *buf, size_t count); + }; ++typedef struct kobj_attribute __no_const kobj_attribute_no_const; + + extern const struct sysfs_ops kobj_sysfs_ops; + +@@ -169,7 +170,7 @@ struct kset { + spinlock_t list_lock; + struct kobject kobj; + const struct kset_uevent_ops *uevent_ops; +-}; ++} __randomize_layout; + + extern void kset_init(struct kset *kset); + extern int __must_check kset_register(struct kset *kset); +diff --git a/include/linux/kobject_ns.h b/include/linux/kobject_ns.h +index df32d25..fb52e27 100644 +--- a/include/linux/kobject_ns.h ++++ b/include/linux/kobject_ns.h +@@ -44,7 +44,7 @@ struct kobj_ns_type_operations { + const void *(*netlink_ns)(struct sock *sk); + const void *(*initial_ns)(void); + void (*drop_ns)(void *); +-}; ++} __do_const; + + int kobj_ns_type_register(const struct kobj_ns_type_operations *ops); + int kobj_ns_type_registered(enum kobj_ns_type type); +diff --git a/include/linux/kref.h b/include/linux/kref.h +index 484604d..0f6c5b6 100644 +--- a/include/linux/kref.h ++++ b/include/linux/kref.h +@@ -68,7 +68,7 @@ static inline void kref_get(struct kref *kref) + static inline int kref_sub(struct kref *kref, unsigned int count, + void (*release)(struct kref *kref)) + { +- WARN_ON(release == NULL); ++ BUG_ON(release == NULL); + + if (atomic_sub_and_test((int) count, &kref->refcount)) { + release(kref); +diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h +index a6059bd..8126d5c 100644 +--- a/include/linux/kvm_host.h ++++ b/include/linux/kvm_host.h +@@ -460,7 +460,7 @@ static inline void kvm_irqfd_exit(void) + { + } + #endif +-int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, ++int kvm_init(const void *opaque, unsigned vcpu_size, unsigned vcpu_align, + struct module *module); + void kvm_exit(void); + +@@ -629,7 +629,7 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, + struct kvm_guest_debug *dbg); + int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run); + +-int kvm_arch_init(void *opaque); ++int kvm_arch_init(const void *opaque); + void kvm_arch_exit(void); + + int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu); +diff --git a/include/linux/libata.h b/include/linux/libata.h +index fe0bf8d..c511ca6 100644 +--- a/include/linux/libata.h ++++ b/include/linux/libata.h +@@ -977,7 +977,7 @@ struct ata_port_operations { + * fields must be pointers. + */ + const struct ata_port_operations *inherits; +-}; ++} __do_const; + + struct ata_port_info { + unsigned long flags; +diff --git a/include/linux/linkage.h b/include/linux/linkage.h +index a6a42dd..6c5ebce 100644 +--- a/include/linux/linkage.h ++++ b/include/linux/linkage.h +@@ -36,6 +36,7 @@ + #endif + + #define __page_aligned_data __section(.data..page_aligned) __aligned(PAGE_SIZE) ++#define __page_aligned_rodata __read_only __aligned(PAGE_SIZE) + #define __page_aligned_bss __section(.bss..page_aligned) __aligned(PAGE_SIZE) + + /* +diff --git a/include/linux/list.h b/include/linux/list.h +index f33f831..1ffe5e2 100644 +--- a/include/linux/list.h ++++ b/include/linux/list.h +@@ -113,6 +113,19 @@ extern void __list_del_entry(struct list_head *entry); + extern void list_del(struct list_head *entry); + #endif + ++extern void __pax_list_add(struct list_head *new, ++ struct list_head *prev, ++ struct list_head *next); ++static inline void pax_list_add(struct list_head *new, struct list_head *head) ++{ ++ __pax_list_add(new, head, head->next); ++} ++static inline void pax_list_add_tail(struct list_head *new, struct list_head *head) ++{ ++ __pax_list_add(new, head->prev, head); ++} ++extern void pax_list_del(struct list_head *entry); ++ + /** + * list_replace - replace old entry by new one + * @old : the element to be replaced +@@ -146,6 +159,8 @@ static inline void list_del_init(struct list_head *entry) + INIT_LIST_HEAD(entry); + } + ++extern void pax_list_del_init(struct list_head *entry); ++ + /** + * list_move - delete from one list and add as another's head + * @list: the entry to move +diff --git a/include/linux/lockref.h b/include/linux/lockref.h +index 4bfde0e..d6e2e09 100644 +--- a/include/linux/lockref.h ++++ b/include/linux/lockref.h +@@ -47,4 +47,36 @@ static inline int __lockref_is_dead(const struct lockref *l) + return ((int)l->count < 0); + } + ++static inline unsigned int __lockref_read(struct lockref *lockref) ++{ ++ return lockref->count; ++} ++ ++static inline void __lockref_set(struct lockref *lockref, unsigned int count) ++{ ++ lockref->count = count; ++} ++ ++static inline void __lockref_inc(struct lockref *lockref) ++{ ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ atomic_inc((atomic_t *)&lockref->count); ++#else ++ lockref->count++; ++#endif ++ ++} ++ ++static inline void __lockref_dec(struct lockref *lockref) ++{ ++ ++#ifdef CONFIG_PAX_REFCOUNT ++ atomic_dec((atomic_t *)&lockref->count); ++#else ++ lockref->count--; ++#endif ++ ++} ++ + #endif /* __LINUX_LOCKREF_H */ +diff --git a/include/linux/math64.h b/include/linux/math64.h +index c45c089..298841c 100644 +--- a/include/linux/math64.h ++++ b/include/linux/math64.h +@@ -15,7 +15,7 @@ + * This is commonly provided by 32bit archs to provide an optimized 64bit + * divide. + */ +-static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) ++static inline u64 __intentional_overflow(-1) div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) + { + *remainder = dividend % divisor; + return dividend / divisor; +@@ -42,7 +42,7 @@ static inline u64 div64_u64_rem(u64 dividend, u64 divisor, u64 *remainder) + /** + * div64_u64 - unsigned 64bit divide with 64bit divisor + */ +-static inline u64 div64_u64(u64 dividend, u64 divisor) ++static inline u64 __intentional_overflow(-1) div64_u64(u64 dividend, u64 divisor) + { + return dividend / divisor; + } +@@ -61,7 +61,7 @@ static inline s64 div64_s64(s64 dividend, s64 divisor) + #define div64_ul(x, y) div_u64((x), (y)) + + #ifndef div_u64_rem +-static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) ++static inline u64 __intentional_overflow(-1) div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) + { + *remainder = do_div(dividend, divisor); + return dividend; +@@ -77,7 +77,7 @@ extern u64 div64_u64_rem(u64 dividend, u64 divisor, u64 *remainder); + #endif + + #ifndef div64_u64 +-extern u64 div64_u64(u64 dividend, u64 divisor); ++extern u64 __intentional_overflow(-1) div64_u64(u64 dividend, u64 divisor); + #endif + + #ifndef div64_s64 +@@ -94,7 +94,7 @@ extern s64 div64_s64(s64 dividend, s64 divisor); + * divide. + */ + #ifndef div_u64 +-static inline u64 div_u64(u64 dividend, u32 divisor) ++static inline u64 __intentional_overflow(-1) div_u64(u64 dividend, u32 divisor) + { + u32 remainder; + return div_u64_rem(dividend, divisor, &remainder); +diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h +index 3d385c8..deacb6a 100644 +--- a/include/linux/mempolicy.h ++++ b/include/linux/mempolicy.h +@@ -91,6 +91,10 @@ static inline struct mempolicy *mpol_dup(struct mempolicy *pol) + } + + #define vma_policy(vma) ((vma)->vm_policy) ++static inline void set_vma_policy(struct vm_area_struct *vma, struct mempolicy *pol) ++{ ++ vma->vm_policy = pol; ++} + + static inline void mpol_get(struct mempolicy *pol) + { +@@ -229,6 +233,9 @@ static inline void mpol_free_shared_policy(struct shared_policy *p) + } + + #define vma_policy(vma) NULL ++static inline void set_vma_policy(struct vm_area_struct *vma, struct mempolicy *pol) ++{ ++} + + static inline int + vma_dup_policy(struct vm_area_struct *src, struct vm_area_struct *dst) +diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h +index 37e4404..26ebbd0 100644 +--- a/include/linux/mlx4/device.h ++++ b/include/linux/mlx4/device.h +@@ -97,7 +97,7 @@ enum { + MLX4_MAX_NUM_PF = 16, + MLX4_MAX_NUM_VF = 64, + MLX4_MAX_NUM_VF_P_PORT = 64, +- MLX4_MFUNC_MAX = 80, ++ MLX4_MFUNC_MAX = 128, + MLX4_MAX_EQ_NUM = 1024, + MLX4_MFUNC_EQ_NUM = 4, + MLX4_MFUNC_MAX_EQES = 8, +diff --git a/include/linux/mm.h b/include/linux/mm.h +index 86a977b..8122960 100644 +--- a/include/linux/mm.h ++++ b/include/linux/mm.h +@@ -128,6 +128,11 @@ extern unsigned int kobjsize(const void *objp); + #define VM_HUGETLB 0x00400000 /* Huge TLB Page VM */ + #define VM_NONLINEAR 0x00800000 /* Is non-linear (remap_file_pages) */ + #define VM_ARCH_1 0x01000000 /* Architecture-specific flag */ ++ ++#if defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_X86_32) ++#define VM_PAGEEXEC 0x02000000 /* vma->vm_page_prot needs special handling */ ++#endif ++ + #define VM_DONTDUMP 0x04000000 /* Do not include in the core dump */ + + #ifdef CONFIG_MEM_SOFT_DIRTY +@@ -238,8 +243,8 @@ struct vm_operations_struct { + /* called by access_process_vm when get_user_pages() fails, typically + * for use by special VMAs that can switch between memory and hardware + */ +- int (*access)(struct vm_area_struct *vma, unsigned long addr, +- void *buf, int len, int write); ++ ssize_t (*access)(struct vm_area_struct *vma, unsigned long addr, ++ void *buf, size_t len, int write); + + /* Called by the /proc/PID/maps code to ask the vma whether it + * has a special name. Returning non-NULL will also cause this +@@ -275,6 +280,7 @@ struct vm_operations_struct { + int (*remap_pages)(struct vm_area_struct *vma, unsigned long addr, + unsigned long size, pgoff_t pgoff); + }; ++typedef struct vm_operations_struct __no_const vm_operations_struct_no_const; + + struct mmu_gather; + struct inode; +@@ -1167,8 +1173,8 @@ int follow_pfn(struct vm_area_struct *vma, unsigned long address, + unsigned long *pfn); + int follow_phys(struct vm_area_struct *vma, unsigned long address, + unsigned int flags, unsigned long *prot, resource_size_t *phys); +-int generic_access_phys(struct vm_area_struct *vma, unsigned long addr, +- void *buf, int len, int write); ++ssize_t generic_access_phys(struct vm_area_struct *vma, unsigned long addr, ++ void *buf, size_t len, int write); + + static inline void unmap_shared_mapping_range(struct address_space *mapping, + loff_t const holebegin, loff_t const holelen) +@@ -1208,9 +1214,9 @@ static inline int fixup_user_fault(struct task_struct *tsk, + } + #endif + +-extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write); +-extern int access_remote_vm(struct mm_struct *mm, unsigned long addr, +- void *buf, int len, int write); ++extern ssize_t access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, size_t len, int write); ++extern ssize_t access_remote_vm(struct mm_struct *mm, unsigned long addr, ++ void *buf, size_t len, int write); + + long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, + unsigned long start, unsigned long nr_pages, +@@ -1242,34 +1248,6 @@ int set_page_dirty_lock(struct page *page); + int clear_page_dirty_for_io(struct page *page); + int get_cmdline(struct task_struct *task, char *buffer, int buflen); + +-/* Is the vma a continuation of the stack vma above it? */ +-static inline int vma_growsdown(struct vm_area_struct *vma, unsigned long addr) +-{ +- return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN); +-} +- +-static inline int stack_guard_page_start(struct vm_area_struct *vma, +- unsigned long addr) +-{ +- return (vma->vm_flags & VM_GROWSDOWN) && +- (vma->vm_start == addr) && +- !vma_growsdown(vma->vm_prev, addr); +-} +- +-/* Is the vma a continuation of the stack vma below it? */ +-static inline int vma_growsup(struct vm_area_struct *vma, unsigned long addr) +-{ +- return vma && (vma->vm_start == addr) && (vma->vm_flags & VM_GROWSUP); +-} +- +-static inline int stack_guard_page_end(struct vm_area_struct *vma, +- unsigned long addr) +-{ +- return (vma->vm_flags & VM_GROWSUP) && +- (vma->vm_end == addr) && +- !vma_growsup(vma->vm_next, addr); +-} +- + extern struct task_struct *task_of_stack(struct task_struct *task, + struct vm_area_struct *vma, bool in_group); + +@@ -1387,8 +1365,15 @@ static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, + { + return 0; + } ++ ++static inline int __pud_alloc_kernel(struct mm_struct *mm, pgd_t *pgd, ++ unsigned long address) ++{ ++ return 0; ++} + #else + int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address); ++int __pud_alloc_kernel(struct mm_struct *mm, pgd_t *pgd, unsigned long address); + #endif + + #ifdef __PAGETABLE_PMD_FOLDED +@@ -1397,8 +1382,15 @@ static inline int __pmd_alloc(struct mm_struct *mm, pud_t *pud, + { + return 0; + } ++ ++static inline int __pmd_alloc_kernel(struct mm_struct *mm, pud_t *pud, ++ unsigned long address) ++{ ++ return 0; ++} + #else + int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address); ++int __pmd_alloc_kernel(struct mm_struct *mm, pud_t *pud, unsigned long address); + #endif + + int __pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, +@@ -1416,11 +1408,23 @@ static inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long a + NULL: pud_offset(pgd, address); + } + ++static inline pud_t *pud_alloc_kernel(struct mm_struct *mm, pgd_t *pgd, unsigned long address) ++{ ++ return (unlikely(pgd_none(*pgd)) && __pud_alloc_kernel(mm, pgd, address))? ++ NULL: pud_offset(pgd, address); ++} ++ + static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address) + { + return (unlikely(pud_none(*pud)) && __pmd_alloc(mm, pud, address))? + NULL: pmd_offset(pud, address); + } ++ ++static inline pmd_t *pmd_alloc_kernel(struct mm_struct *mm, pud_t *pud, unsigned long address) ++{ ++ return (unlikely(pud_none(*pud)) && __pmd_alloc_kernel(mm, pud, address))? ++ NULL: pmd_offset(pud, address); ++} + #endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */ + + #if USE_SPLIT_PTE_PTLOCKS +@@ -1803,12 +1807,23 @@ extern struct vm_area_struct *copy_vma(struct vm_area_struct **, + bool *need_rmap_locks); + extern void exit_mmap(struct mm_struct *); + ++#if defined(CONFIG_GRKERNSEC) && (defined(CONFIG_GRKERNSEC_RESLOG) || !defined(CONFIG_GRKERNSEC_NO_RBAC)) ++extern void gr_learn_resource(const struct task_struct *task, const int res, ++ const unsigned long wanted, const int gt); ++#else ++static inline void gr_learn_resource(const struct task_struct *task, const int res, ++ const unsigned long wanted, const int gt) ++{ ++} ++#endif ++ + static inline int check_data_rlimit(unsigned long rlim, + unsigned long new, + unsigned long start, + unsigned long end_data, + unsigned long start_data) + { ++ gr_learn_resource(current, RLIMIT_DATA, (new - start) + (end_data - start_data), 1); + if (rlim < RLIM_INFINITY) { + if (((new - start) + (end_data - start_data)) > rlim) + return -ENOSPC; +@@ -1833,7 +1848,7 @@ extern int install_special_mapping(struct mm_struct *mm, + unsigned long addr, unsigned long len, + unsigned long flags, struct page **pages); + +-extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); ++extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long) __intentional_overflow(-1); + + extern unsigned long mmap_region(struct file *file, unsigned long addr, + unsigned long len, vm_flags_t vm_flags, unsigned long pgoff); +@@ -1841,6 +1856,7 @@ extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, + unsigned long len, unsigned long prot, unsigned long flags, + unsigned long pgoff, unsigned long *populate); + extern int do_munmap(struct mm_struct *, unsigned long, size_t); ++extern int __do_munmap(struct mm_struct *, unsigned long, size_t); + + #ifdef CONFIG_MMU + extern int __mm_populate(unsigned long addr, unsigned long len, +@@ -1869,10 +1885,11 @@ struct vm_unmapped_area_info { + unsigned long high_limit; + unsigned long align_mask; + unsigned long align_offset; ++ unsigned long threadstack_offset; + }; + +-extern unsigned long unmapped_area(struct vm_unmapped_area_info *info); +-extern unsigned long unmapped_area_topdown(struct vm_unmapped_area_info *info); ++extern unsigned long unmapped_area(const struct vm_unmapped_area_info *info); ++extern unsigned long unmapped_area_topdown(const struct vm_unmapped_area_info *info); + + /* + * Search for an unmapped address range. +@@ -1884,7 +1901,7 @@ extern unsigned long unmapped_area_topdown(struct vm_unmapped_area_info *info); + * - satisfies (begin_addr & align_mask) == (align_offset & align_mask) + */ + static inline unsigned long +-vm_unmapped_area(struct vm_unmapped_area_info *info) ++vm_unmapped_area(const struct vm_unmapped_area_info *info) + { + if (!(info->flags & VM_UNMAPPED_AREA_TOPDOWN)) + return unmapped_area(info); +@@ -1946,6 +1963,10 @@ extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long add + extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr, + struct vm_area_struct **pprev); + ++extern struct vm_area_struct *pax_find_mirror_vma(struct vm_area_struct *vma); ++extern __must_check long pax_mirror_vma(struct vm_area_struct *vma_m, struct vm_area_struct *vma); ++extern void pax_mirror_file_pte(struct vm_area_struct *vma, unsigned long address, struct page *page_m, spinlock_t *ptl); ++ + /* Look up the first VMA which intersects the interval start_addr..end_addr-1, + NULL if none. Assume start_addr < end_addr. */ + static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr) +@@ -1975,10 +1996,10 @@ static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm, + } + + #ifdef CONFIG_MMU +-pgprot_t vm_get_page_prot(unsigned long vm_flags); ++pgprot_t vm_get_page_prot(vm_flags_t vm_flags); + void vma_set_page_prot(struct vm_area_struct *vma); + #else +-static inline pgprot_t vm_get_page_prot(unsigned long vm_flags) ++static inline pgprot_t vm_get_page_prot(vm_flags_t vm_flags) + { + return __pgprot(0); + } +@@ -2040,6 +2061,11 @@ void vm_stat_account(struct mm_struct *, unsigned long, struct file *, long); + static inline void vm_stat_account(struct mm_struct *mm, + unsigned long flags, struct file *file, long pages) + { ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP) || (flags & (VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC))) ++#endif ++ + mm->total_vm += pages; + } + #endif /* CONFIG_PROC_FS */ +@@ -2128,7 +2154,7 @@ extern int unpoison_memory(unsigned long pfn); + extern int sysctl_memory_failure_early_kill; + extern int sysctl_memory_failure_recovery; + extern void shake_page(struct page *p, int access); +-extern atomic_long_t num_poisoned_pages; ++extern atomic_long_unchecked_t num_poisoned_pages; + extern int soft_offline_page(struct page *page, int flags); + + #if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_HUGETLBFS) +@@ -2163,5 +2189,11 @@ void __init setup_nr_node_ids(void); + static inline void setup_nr_node_ids(void) {} + #endif + ++#ifdef CONFIG_ARCH_TRACK_EXEC_LIMIT ++extern void track_exec_limit(struct mm_struct *mm, unsigned long start, unsigned long end, unsigned long prot); ++#else ++static inline void track_exec_limit(struct mm_struct *mm, unsigned long start, unsigned long end, unsigned long prot) {} ++#endif ++ + #endif /* __KERNEL__ */ + #endif /* _LINUX_MM_H */ +diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h +index 6e0b286..90d9c0d 100644 +--- a/include/linux/mm_types.h ++++ b/include/linux/mm_types.h +@@ -308,7 +308,9 @@ struct vm_area_struct { + #ifdef CONFIG_NUMA + struct mempolicy *vm_policy; /* NUMA policy for the VMA */ + #endif +-}; ++ ++ struct vm_area_struct *vm_mirror;/* PaX: mirror vma or NULL */ ++} __randomize_layout; + + struct core_thread { + struct task_struct *task; +@@ -454,7 +456,25 @@ struct mm_struct { + bool tlb_flush_pending; + #endif + struct uprobes_state uprobes_state; +-}; ++ ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++ unsigned long pax_flags; ++#endif ++ ++#ifdef CONFIG_PAX_DLRESOLVE ++ unsigned long call_dl_resolve; ++#endif ++ ++#if defined(CONFIG_PPC32) && defined(CONFIG_PAX_EMUSIGRT) ++ unsigned long call_syscall; ++#endif ++ ++#ifdef CONFIG_PAX_ASLR ++ unsigned long delta_mmap; /* randomized offset */ ++ unsigned long delta_stack; /* randomized offset */ ++#endif ++ ++} __randomize_layout; + + static inline void mm_init_cpumask(struct mm_struct *mm) + { +diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h +index f206e29..6e65d2f 100644 +--- a/include/linux/mmc/core.h ++++ b/include/linux/mmc/core.h +@@ -79,7 +79,7 @@ struct mmc_command { + #define mmc_cmd_type(cmd) ((cmd)->flags & MMC_CMD_MASK) + + unsigned int retries; /* max number of retries */ +- unsigned int error; /* command error */ ++ int error; /* command error */ + + /* + * Standard errno values are used for errors, but some have specific +diff --git a/include/linux/mmiotrace.h b/include/linux/mmiotrace.h +index c5d5278..f0b68c8 100644 +--- a/include/linux/mmiotrace.h ++++ b/include/linux/mmiotrace.h +@@ -46,7 +46,7 @@ extern int kmmio_handler(struct pt_regs *regs, unsigned long addr); + /* Called from ioremap.c */ + extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size, + void __iomem *addr); +-extern void mmiotrace_iounmap(volatile void __iomem *addr); ++extern void mmiotrace_iounmap(const volatile void __iomem *addr); + + /* For anyone to insert markers. Remember trailing newline. */ + extern __printf(1, 2) int mmiotrace_printk(const char *fmt, ...); +@@ -66,7 +66,7 @@ static inline void mmiotrace_ioremap(resource_size_t offset, + { + } + +-static inline void mmiotrace_iounmap(volatile void __iomem *addr) ++static inline void mmiotrace_iounmap(const volatile void __iomem *addr) + { + } + +diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h +index ffe66e3..b310722 100644 +--- a/include/linux/mmzone.h ++++ b/include/linux/mmzone.h +@@ -527,7 +527,7 @@ struct zone { + + ZONE_PADDING(_pad3_) + /* Zone statistics */ +- atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; ++ atomic_long_unchecked_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; + } ____cacheline_internodealigned_in_smp; + + enum zone_flags { +diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h +index 44eeef0..a92d3f9 100644 +--- a/include/linux/mod_devicetable.h ++++ b/include/linux/mod_devicetable.h +@@ -139,7 +139,7 @@ struct usb_device_id { + #define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200 + #define USB_DEVICE_ID_MATCH_INT_NUMBER 0x0400 + +-#define HID_ANY_ID (~0) ++#define HID_ANY_ID (~0U) + #define HID_BUS_ANY 0xffff + #define HID_GROUP_ANY 0x0000 + +@@ -475,7 +475,7 @@ struct dmi_system_id { + const char *ident; + struct dmi_strmatch matches[4]; + void *driver_data; +-}; ++} __do_const; + /* + * struct dmi_device_id appears during expansion of + * "MODULE_DEVICE_TABLE(dmi, x)". Compiler doesn't look inside it +diff --git a/include/linux/module.h b/include/linux/module.h +index 71f282a..b2387e2 100644 +--- a/include/linux/module.h ++++ b/include/linux/module.h +@@ -17,9 +17,11 @@ + #include <linux/moduleparam.h> + #include <linux/jump_label.h> + #include <linux/export.h> ++#include <linux/fs.h> + + #include <linux/percpu.h> + #include <asm/module.h> ++#include <asm/pgtable.h> + + /* In stripped ARM and x86-64 modules, ~ is surprisingly rare. */ + #define MODULE_SIG_STRING "~Module signature appended~\n" +@@ -42,7 +44,7 @@ struct module_kobject { + struct kobject *drivers_dir; + struct module_param_attrs *mp; + struct completion *kobj_completion; +-}; ++} __randomize_layout; + + struct module_attribute { + struct attribute attr; +@@ -54,12 +56,13 @@ struct module_attribute { + int (*test)(struct module *); + void (*free)(struct module *); + }; ++typedef struct module_attribute __no_const module_attribute_no_const; + + struct module_version_attribute { + struct module_attribute mattr; + const char *module_name; + const char *version; +-} __attribute__ ((__aligned__(sizeof(void *)))); ++} __do_const __attribute__ ((__aligned__(sizeof(void *)))); + + extern ssize_t __modver_version_show(struct module_attribute *, + struct module_kobject *, char *); +@@ -235,7 +238,7 @@ struct module { + + /* Sysfs stuff. */ + struct module_kobject mkobj; +- struct module_attribute *modinfo_attrs; ++ module_attribute_no_const *modinfo_attrs; + const char *version; + const char *srcversion; + struct kobject *holders_dir; +@@ -284,19 +287,16 @@ struct module { + int (*init)(void); + + /* If this is non-NULL, vfree after init() returns */ +- void *module_init; ++ void *module_init_rx, *module_init_rw; + + /* Here is the actual code + data, vfree'd on unload. */ +- void *module_core; ++ void *module_core_rx, *module_core_rw; + + /* Here are the sizes of the init and core sections */ +- unsigned int init_size, core_size; ++ unsigned int init_size_rw, core_size_rw; + + /* The size of the executable code in each section. */ +- unsigned int init_text_size, core_text_size; +- +- /* Size of RO sections of the module (text+rodata) */ +- unsigned int init_ro_size, core_ro_size; ++ unsigned int init_size_rx, core_size_rx; + + /* Arch-specific module values */ + struct mod_arch_specific arch; +@@ -352,6 +352,10 @@ struct module { + #ifdef CONFIG_EVENT_TRACING + struct ftrace_event_call **trace_events; + unsigned int num_trace_events; ++ struct file_operations trace_id; ++ struct file_operations trace_enable; ++ struct file_operations trace_format; ++ struct file_operations trace_filter; + #endif + #ifdef CONFIG_FTRACE_MCOUNT_RECORD + unsigned int num_ftrace_callsites; +@@ -375,7 +379,7 @@ struct module { + ctor_fn_t *ctors; + unsigned int num_ctors; + #endif +-}; ++} __randomize_layout; + #ifndef MODULE_ARCH_INIT + #define MODULE_ARCH_INIT {} + #endif +@@ -396,18 +400,48 @@ bool is_module_address(unsigned long addr); + bool is_module_percpu_address(unsigned long addr); + bool is_module_text_address(unsigned long addr); + ++static inline int within_module_range(unsigned long addr, void *start, unsigned long size) ++{ ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ if (ktla_ktva(addr) >= (unsigned long)start && ++ ktla_ktva(addr) < (unsigned long)start + size) ++ return 1; ++#endif ++ ++ return ((void *)addr >= start && (void *)addr < start + size); ++} ++ ++static inline int within_module_core_rx(unsigned long addr, const struct module *mod) ++{ ++ return within_module_range(addr, mod->module_core_rx, mod->core_size_rx); ++} ++ ++static inline int within_module_core_rw(unsigned long addr, const struct module *mod) ++{ ++ return within_module_range(addr, mod->module_core_rw, mod->core_size_rw); ++} ++ ++static inline int within_module_init_rx(unsigned long addr, const struct module *mod) ++{ ++ return within_module_range(addr, mod->module_init_rx, mod->init_size_rx); ++} ++ ++static inline int within_module_init_rw(unsigned long addr, const struct module *mod) ++{ ++ return within_module_range(addr, mod->module_init_rw, mod->init_size_rw); ++} ++ + static inline bool within_module_core(unsigned long addr, + const struct module *mod) + { +- return (unsigned long)mod->module_core <= addr && +- addr < (unsigned long)mod->module_core + mod->core_size; ++ return within_module_core_rx(addr, mod) || within_module_core_rw(addr, mod); + } + + static inline bool within_module_init(unsigned long addr, + const struct module *mod) + { +- return (unsigned long)mod->module_init <= addr && +- addr < (unsigned long)mod->module_init + mod->init_size; ++ return within_module_init_rx(addr, mod) || within_module_init_rw(addr, mod); + } + + static inline bool within_module(unsigned long addr, const struct module *mod) +diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h +index 7eeb9bb..68f37e0 100644 +--- a/include/linux/moduleloader.h ++++ b/include/linux/moduleloader.h +@@ -25,9 +25,21 @@ unsigned int arch_mod_section_prepend(struct module *mod, unsigned int section); + sections. Returns NULL on failure. */ + void *module_alloc(unsigned long size); + ++#ifdef CONFIG_PAX_KERNEXEC ++void *module_alloc_exec(unsigned long size); ++#else ++#define module_alloc_exec(x) module_alloc(x) ++#endif ++ + /* Free memory returned from module_alloc. */ + void module_free(struct module *mod, void *module_region); + ++#ifdef CONFIG_PAX_KERNEXEC ++void module_free_exec(struct module *mod, void *module_region); ++#else ++#define module_free_exec(x, y) module_free((x), (y)) ++#endif ++ + /* + * Apply the given relocation to the (simplified) ELF. Return -error + * or 0. +@@ -45,8 +57,10 @@ static inline int apply_relocate(Elf_Shdr *sechdrs, + unsigned int relsec, + struct module *me) + { ++#ifdef CONFIG_MODULES + printk(KERN_ERR "module %s: REL relocation unsupported\n", + module_name(me)); ++#endif + return -ENOEXEC; + } + #endif +@@ -68,8 +82,10 @@ static inline int apply_relocate_add(Elf_Shdr *sechdrs, + unsigned int relsec, + struct module *me) + { ++#ifdef CONFIG_MODULES + printk(KERN_ERR "module %s: REL relocation unsupported\n", + module_name(me)); ++#endif + return -ENOEXEC; + } + #endif +diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h +index 1c9effa..1160bdd 100644 +--- a/include/linux/moduleparam.h ++++ b/include/linux/moduleparam.h +@@ -323,7 +323,7 @@ static inline void __kernel_param_unlock(void) + * @len is usually just sizeof(string). + */ + #define module_param_string(name, string, len, perm) \ +- static const struct kparam_string __param_string_##name \ ++ static const struct kparam_string __param_string_##name __used \ + = { len, string }; \ + __module_param_call(MODULE_PARAM_PREFIX, name, \ + ¶m_ops_string, \ +@@ -467,7 +467,7 @@ extern int param_set_bint(const char *val, const struct kernel_param *kp); + */ + #define module_param_array_named(name, array, type, nump, perm) \ + param_check_##type(name, &(array)[0]); \ +- static const struct kparam_array __param_arr_##name \ ++ static const struct kparam_array __param_arr_##name __used \ + = { .max = ARRAY_SIZE(array), .num = nump, \ + .ops = ¶m_ops_##type, \ + .elemsize = sizeof(array[0]), .elem = array }; \ +diff --git a/include/linux/mount.h b/include/linux/mount.h +index c2c561d..a5f2a8c 100644 +--- a/include/linux/mount.h ++++ b/include/linux/mount.h +@@ -66,7 +66,7 @@ struct vfsmount { + struct dentry *mnt_root; /* root of the mounted tree */ + struct super_block *mnt_sb; /* pointer to superblock */ + int mnt_flags; +-}; ++} __randomize_layout; + + struct file; /* forward dec */ + struct path; +diff --git a/include/linux/namei.h b/include/linux/namei.h +index 492de72..1bddcd4 100644 +--- a/include/linux/namei.h ++++ b/include/linux/namei.h +@@ -19,7 +19,7 @@ struct nameidata { + unsigned seq, m_seq; + int last_type; + unsigned depth; +- char *saved_names[MAX_NESTED_LINKS + 1]; ++ const char *saved_names[MAX_NESTED_LINKS + 1]; + }; + + /* +@@ -83,12 +83,12 @@ extern void unlock_rename(struct dentry *, struct dentry *); + + extern void nd_jump_link(struct nameidata *nd, struct path *path); + +-static inline void nd_set_link(struct nameidata *nd, char *path) ++static inline void nd_set_link(struct nameidata *nd, const char *path) + { + nd->saved_names[nd->depth] = path; + } + +-static inline char *nd_get_link(struct nameidata *nd) ++static inline const char *nd_get_link(const struct nameidata *nd) + { + return nd->saved_names[nd->depth]; + } +diff --git a/include/linux/net.h b/include/linux/net.h +index 17d8339..81656c0 100644 +--- a/include/linux/net.h ++++ b/include/linux/net.h +@@ -192,7 +192,7 @@ struct net_proto_family { + int (*create)(struct net *net, struct socket *sock, + int protocol, int kern); + struct module *owner; +-}; ++} __do_const; + + struct iovec; + struct kvec; +diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h +index c3fd34d..ce00f24 100644 +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -1160,6 +1160,7 @@ struct net_device_ops { + struct net_device *dev, + netdev_features_t features); + }; ++typedef struct net_device_ops __no_const net_device_ops_no_const; + + /** + * enum net_device_priv_flags - &struct net_device priv_flags +@@ -1502,10 +1503,10 @@ struct net_device { + + struct net_device_stats stats; + +- atomic_long_t rx_dropped; +- atomic_long_t tx_dropped; ++ atomic_long_unchecked_t rx_dropped; ++ atomic_long_unchecked_t tx_dropped; + +- atomic_t carrier_changes; ++ atomic_unchecked_t carrier_changes; + + #ifdef CONFIG_WIRELESS_EXT + const struct iw_handler_def * wireless_handlers; +diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h +index 2517ece..0bbfcfb 100644 +--- a/include/linux/netfilter.h ++++ b/include/linux/netfilter.h +@@ -85,7 +85,7 @@ struct nf_sockopt_ops { + #endif + /* Use the module struct to lock set/get code in place */ + struct module *owner; +-}; ++} __do_const; + + /* Function to register/unregister hook points. */ + int nf_register_hook(struct nf_hook_ops *reg); +diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h +index e955d47..04a5338 100644 +--- a/include/linux/netfilter/nfnetlink.h ++++ b/include/linux/netfilter/nfnetlink.h +@@ -19,7 +19,7 @@ struct nfnl_callback { + const struct nlattr * const cda[]); + const struct nla_policy *policy; /* netlink attribute policy */ + const u_int16_t attr_count; /* number of nlattr's */ +-}; ++} __do_const; + + struct nfnetlink_subsystem { + const char *name; +diff --git a/include/linux/netfilter/xt_gradm.h b/include/linux/netfilter/xt_gradm.h +new file mode 100644 +index 0000000..33f4af8 +--- /dev/null ++++ b/include/linux/netfilter/xt_gradm.h +@@ -0,0 +1,9 @@ ++#ifndef _LINUX_NETFILTER_XT_GRADM_H ++#define _LINUX_NETFILTER_XT_GRADM_H 1 ++ ++struct xt_gradm_mtinfo { ++ __u16 flags; ++ __u16 invflags; ++}; ++ ++#endif +diff --git a/include/linux/nls.h b/include/linux/nls.h +index 520681b..2b7fabb 100644 +--- a/include/linux/nls.h ++++ b/include/linux/nls.h +@@ -31,7 +31,7 @@ struct nls_table { + const unsigned char *charset2upper; + struct module *owner; + struct nls_table *next; +-}; ++} __do_const; + + /* this value hold the maximum octet of charset */ + #define NLS_MAX_CHARSET_SIZE 6 /* for UTF-8 */ +@@ -46,7 +46,7 @@ enum utf16_endian { + /* nls_base.c */ + extern int __register_nls(struct nls_table *, struct module *); + extern int unregister_nls(struct nls_table *); +-extern struct nls_table *load_nls(char *); ++extern struct nls_table *load_nls(const char *); + extern void unload_nls(struct nls_table *); + extern struct nls_table *load_nls_default(void); + #define register_nls(nls) __register_nls((nls), THIS_MODULE) +diff --git a/include/linux/notifier.h b/include/linux/notifier.h +index d14a4c3..a078786 100644 +--- a/include/linux/notifier.h ++++ b/include/linux/notifier.h +@@ -54,7 +54,8 @@ struct notifier_block { + notifier_fn_t notifier_call; + struct notifier_block __rcu *next; + int priority; +-}; ++} __do_const; ++typedef struct notifier_block __no_const notifier_block_no_const; + + struct atomic_notifier_head { + spinlock_t lock; +diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h +index b2a0f15..4d7da32 100644 +--- a/include/linux/oprofile.h ++++ b/include/linux/oprofile.h +@@ -138,9 +138,9 @@ int oprofilefs_create_ulong(struct dentry * root, + int oprofilefs_create_ro_ulong(struct dentry * root, + char const * name, ulong * val); + +-/** Create a file for read-only access to an atomic_t. */ ++/** Create a file for read-only access to an atomic_unchecked_t. */ + int oprofilefs_create_ro_atomic(struct dentry * root, +- char const * name, atomic_t * val); ++ char const * name, atomic_unchecked_t * val); + + /** create a directory */ + struct dentry *oprofilefs_mkdir(struct dentry *parent, char const *name); +diff --git a/include/linux/padata.h b/include/linux/padata.h +index 4386946..f50c615 100644 +--- a/include/linux/padata.h ++++ b/include/linux/padata.h +@@ -129,7 +129,7 @@ struct parallel_data { + struct padata_serial_queue __percpu *squeue; + atomic_t reorder_objects; + atomic_t refcnt; +- atomic_t seq_nr; ++ atomic_unchecked_t seq_nr; + struct padata_cpumask cpumask; + spinlock_t lock ____cacheline_aligned; + unsigned int processed; +diff --git a/include/linux/path.h b/include/linux/path.h +index d137218..be0c176 100644 +--- a/include/linux/path.h ++++ b/include/linux/path.h +@@ -1,13 +1,15 @@ + #ifndef _LINUX_PATH_H + #define _LINUX_PATH_H + ++#include <linux/compiler.h> ++ + struct dentry; + struct vfsmount; + + struct path { + struct vfsmount *mnt; + struct dentry *dentry; +-}; ++} __randomize_layout; + + extern void path_get(const struct path *); + extern void path_put(const struct path *); +diff --git a/include/linux/pci_hotplug.h b/include/linux/pci_hotplug.h +index 2706ee9..e691f7c 100644 +--- a/include/linux/pci_hotplug.h ++++ b/include/linux/pci_hotplug.h +@@ -71,7 +71,8 @@ struct hotplug_slot_ops { + int (*get_latch_status) (struct hotplug_slot *slot, u8 *value); + int (*get_adapter_status) (struct hotplug_slot *slot, u8 *value); + int (*reset_slot) (struct hotplug_slot *slot, int probe); +-}; ++} __do_const; ++typedef struct hotplug_slot_ops __no_const hotplug_slot_ops_no_const; + + /** + * struct hotplug_slot_info - used to notify the hotplug pci core of the state of the slot +diff --git a/include/linux/percpu.h b/include/linux/percpu.h +index a3aa63e..92d137f 100644 +--- a/include/linux/percpu.h ++++ b/include/linux/percpu.h +@@ -33,7 +33,7 @@ + * preallocate for this. Keep PERCPU_DYNAMIC_RESERVE equal to or + * larger than PERCPU_DYNAMIC_EARLY_SIZE. + */ +-#define PERCPU_DYNAMIC_EARLY_SLOTS 128 ++#define PERCPU_DYNAMIC_EARLY_SLOTS 256 + #define PERCPU_DYNAMIC_EARLY_SIZE (12 << 10) + + /* +diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h +index 893a0d0..d5f996e 100644 +--- a/include/linux/perf_event.h ++++ b/include/linux/perf_event.h +@@ -341,8 +341,8 @@ struct perf_event { + + enum perf_event_active_state state; + unsigned int attach_state; +- local64_t count; +- atomic64_t child_count; ++ local64_t count; /* PaX: fix it one day */ ++ atomic64_unchecked_t child_count; + + /* + * These are the total time in nanoseconds that the event +@@ -393,8 +393,8 @@ struct perf_event { + * These accumulate total time (in nanoseconds) that children + * events have been enabled and running, respectively. + */ +- atomic64_t child_total_time_enabled; +- atomic64_t child_total_time_running; ++ atomic64_unchecked_t child_total_time_enabled; ++ atomic64_unchecked_t child_total_time_running; + + /* + * Protect attach/detach and child_list: +@@ -734,7 +734,7 @@ static inline void perf_callchain_store(struct perf_callchain_entry *entry, u64 + entry->ip[entry->nr++] = ip; + } + +-extern int sysctl_perf_event_paranoid; ++extern int sysctl_perf_event_legitimately_concerned; + extern int sysctl_perf_event_mlock; + extern int sysctl_perf_event_sample_rate; + extern int sysctl_perf_cpu_time_max_percent; +@@ -749,19 +749,24 @@ extern int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write, + loff_t *ppos); + + ++static inline bool perf_paranoid_any(void) ++{ ++ return sysctl_perf_event_legitimately_concerned > 2; ++} ++ + static inline bool perf_paranoid_tracepoint_raw(void) + { +- return sysctl_perf_event_paranoid > -1; ++ return sysctl_perf_event_legitimately_concerned > -1; + } + + static inline bool perf_paranoid_cpu(void) + { +- return sysctl_perf_event_paranoid > 0; ++ return sysctl_perf_event_legitimately_concerned > 0; + } + + static inline bool perf_paranoid_kernel(void) + { +- return sysctl_perf_event_paranoid > 1; ++ return sysctl_perf_event_legitimately_concerned > 1; + } + + extern void perf_event_init(void); +@@ -892,7 +897,7 @@ struct perf_pmu_events_attr { + struct device_attribute attr; + u64 id; + const char *event_str; +-}; ++} __do_const; + + #define PMU_EVENT_ATTR(_name, _var, _id, _show) \ + static struct perf_pmu_events_attr _var = { \ +diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h +index 1997ffc..4f1f44d 100644 +--- a/include/linux/pid_namespace.h ++++ b/include/linux/pid_namespace.h +@@ -44,7 +44,7 @@ struct pid_namespace { + int hide_pid; + int reboot; /* group exit code if this pidns was rebooted */ + unsigned int proc_inum; +-}; ++} __randomize_layout; + + extern struct pid_namespace init_pid_ns; + +diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h +index eb8b8ac..62649e1 100644 +--- a/include/linux/pipe_fs_i.h ++++ b/include/linux/pipe_fs_i.h +@@ -47,10 +47,10 @@ struct pipe_inode_info { + struct mutex mutex; + wait_queue_head_t wait; + unsigned int nrbufs, curbuf, buffers; +- unsigned int readers; +- unsigned int writers; +- unsigned int files; +- unsigned int waiting_writers; ++ atomic_t readers; ++ atomic_t writers; ++ atomic_t files; ++ atomic_t waiting_writers; + unsigned int r_counter; + unsigned int w_counter; + struct page *tmp_page; +diff --git a/include/linux/pm.h b/include/linux/pm.h +index 383fd68..7a11504 100644 +--- a/include/linux/pm.h ++++ b/include/linux/pm.h +@@ -621,6 +621,7 @@ struct dev_pm_domain { + struct dev_pm_ops ops; + void (*detach)(struct device *dev, bool power_off); + }; ++typedef struct dev_pm_domain __no_const dev_pm_domain_no_const; + + /* + * The PM_EVENT_ messages are also used by drivers implementing the legacy +diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h +index 2e0e06d..824cc9b 100644 +--- a/include/linux/pm_domain.h ++++ b/include/linux/pm_domain.h +@@ -36,11 +36,11 @@ struct gpd_dev_ops { + int (*save_state)(struct device *dev); + int (*restore_state)(struct device *dev); + bool (*active_wakeup)(struct device *dev); +-}; ++} __no_const; + + struct gpd_cpuidle_data { + unsigned int saved_exit_latency; +- struct cpuidle_state *idle_state; ++ cpuidle_state_no_const *idle_state; + }; + + struct generic_pm_domain { +diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h +index 367f49b..d2f5a14 100644 +--- a/include/linux/pm_runtime.h ++++ b/include/linux/pm_runtime.h +@@ -125,7 +125,7 @@ static inline bool pm_runtime_callbacks_present(struct device *dev) + + static inline void pm_runtime_mark_last_busy(struct device *dev) + { +- ACCESS_ONCE(dev->power.last_busy) = jiffies; ++ ACCESS_ONCE_RW(dev->power.last_busy) = jiffies; + } + + #else /* !CONFIG_PM_RUNTIME */ +diff --git a/include/linux/pnp.h b/include/linux/pnp.h +index 195aafc..49a7bc2 100644 +--- a/include/linux/pnp.h ++++ b/include/linux/pnp.h +@@ -297,7 +297,7 @@ static inline void pnp_set_drvdata(struct pnp_dev *pdev, void *data) + struct pnp_fixup { + char id[7]; + void (*quirk_function) (struct pnp_dev * dev); /* fixup function */ +-}; ++} __do_const; + + /* config parameters */ + #define PNP_CONFIG_NORMAL 0x0001 +diff --git a/include/linux/poison.h b/include/linux/poison.h +index 2110a81..13a11bb 100644 +--- a/include/linux/poison.h ++++ b/include/linux/poison.h +@@ -19,8 +19,8 @@ + * under normal circumstances, used to verify that nobody uses + * non-initialized list entries. + */ +-#define LIST_POISON1 ((void *) 0x00100100 + POISON_POINTER_DELTA) +-#define LIST_POISON2 ((void *) 0x00200200 + POISON_POINTER_DELTA) ++#define LIST_POISON1 ((void *) (long)0xFFFFFF01) ++#define LIST_POISON2 ((void *) (long)0xFFFFFF02) + + /********** include/linux/timer.h **********/ + /* +diff --git a/include/linux/power/smartreflex.h b/include/linux/power/smartreflex.h +index d8b187c3..9a9257a 100644 +--- a/include/linux/power/smartreflex.h ++++ b/include/linux/power/smartreflex.h +@@ -238,7 +238,7 @@ struct omap_sr_class_data { + int (*notify)(struct omap_sr *sr, u32 status); + u8 notify_flags; + u8 class_type; +-}; ++} __do_const; + + /** + * struct omap_sr_nvalue_table - Smartreflex n-target value info +diff --git a/include/linux/ppp-comp.h b/include/linux/ppp-comp.h +index 4ea1d37..80f4b33 100644 +--- a/include/linux/ppp-comp.h ++++ b/include/linux/ppp-comp.h +@@ -84,7 +84,7 @@ struct compressor { + struct module *owner; + /* Extra skb space needed by the compressor algorithm */ + unsigned int comp_extra; +-}; ++} __do_const; + + /* + * The return value from decompress routine is the length of the +diff --git a/include/linux/preempt.h b/include/linux/preempt.h +index de83b4e..c4b997d 100644 +--- a/include/linux/preempt.h ++++ b/include/linux/preempt.h +@@ -27,11 +27,16 @@ extern void preempt_count_sub(int val); + #define preempt_count_dec_and_test() __preempt_count_dec_and_test() + #endif + ++#define raw_preempt_count_add(val) __preempt_count_add(val) ++#define raw_preempt_count_sub(val) __preempt_count_sub(val) ++ + #define __preempt_count_inc() __preempt_count_add(1) + #define __preempt_count_dec() __preempt_count_sub(1) + + #define preempt_count_inc() preempt_count_add(1) ++#define raw_preempt_count_inc() raw_preempt_count_add(1) + #define preempt_count_dec() preempt_count_sub(1) ++#define raw_preempt_count_dec() raw_preempt_count_sub(1) + + #ifdef CONFIG_PREEMPT_COUNT + +@@ -41,6 +46,12 @@ do { \ + barrier(); \ + } while (0) + ++#define raw_preempt_disable() \ ++do { \ ++ raw_preempt_count_inc(); \ ++ barrier(); \ ++} while (0) ++ + #define sched_preempt_enable_no_resched() \ + do { \ + barrier(); \ +@@ -49,6 +60,12 @@ do { \ + + #define preempt_enable_no_resched() sched_preempt_enable_no_resched() + ++#define raw_preempt_enable_no_resched() \ ++do { \ ++ barrier(); \ ++ raw_preempt_count_dec(); \ ++} while (0) ++ + #ifdef CONFIG_PREEMPT + #define preempt_enable() \ + do { \ +@@ -113,8 +130,10 @@ do { \ + * region. + */ + #define preempt_disable() barrier() ++#define raw_preempt_disable() barrier() + #define sched_preempt_enable_no_resched() barrier() + #define preempt_enable_no_resched() barrier() ++#define raw_preempt_enable_no_resched() barrier() + #define preempt_enable() barrier() + #define preempt_check_resched() do { } while (0) + +@@ -128,11 +147,13 @@ do { \ + /* + * Modules have no business playing preemption tricks. + */ ++#ifndef CONFIG_PAX_KERNEXEC + #undef sched_preempt_enable_no_resched + #undef preempt_enable_no_resched + #undef preempt_enable_no_resched_notrace + #undef preempt_check_resched + #endif ++#endif + + #define preempt_set_need_resched() \ + do { \ +diff --git a/include/linux/printk.h b/include/linux/printk.h +index d78125f..7f36596 100644 +--- a/include/linux/printk.h ++++ b/include/linux/printk.h +@@ -124,6 +124,8 @@ static inline __printf(1, 2) __cold + void early_printk(const char *s, ...) { } + #endif + ++extern int kptr_restrict; ++ + #ifdef CONFIG_PRINTK + asmlinkage __printf(5, 0) + int vprintk_emit(int facility, int level, +@@ -158,7 +160,6 @@ extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, + + extern int printk_delay_msec; + extern int dmesg_restrict; +-extern int kptr_restrict; + + extern void wake_up_klogd(void); + +diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h +index b97bf2e..f14c92d 100644 +--- a/include/linux/proc_fs.h ++++ b/include/linux/proc_fs.h +@@ -17,8 +17,11 @@ extern void proc_flush_task(struct task_struct *); + extern struct proc_dir_entry *proc_symlink(const char *, + struct proc_dir_entry *, const char *); + extern struct proc_dir_entry *proc_mkdir(const char *, struct proc_dir_entry *); ++extern struct proc_dir_entry *proc_mkdir_restrict(const char *, struct proc_dir_entry *); + extern struct proc_dir_entry *proc_mkdir_data(const char *, umode_t, + struct proc_dir_entry *, void *); ++extern struct proc_dir_entry *proc_mkdir_data_restrict(const char *, umode_t, ++ struct proc_dir_entry *, void *); + extern struct proc_dir_entry *proc_mkdir_mode(const char *, umode_t, + struct proc_dir_entry *); + +@@ -34,6 +37,19 @@ static inline struct proc_dir_entry *proc_create( + return proc_create_data(name, mode, parent, proc_fops, NULL); + } + ++static inline struct proc_dir_entry *proc_create_grsec(const char *name, umode_t mode, ++ struct proc_dir_entry *parent, const struct file_operations *proc_fops) ++{ ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ return proc_create_data(name, S_IRUSR, parent, proc_fops, NULL); ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ return proc_create_data(name, S_IRUSR | S_IRGRP, parent, proc_fops, NULL); ++#else ++ return proc_create_data(name, mode, parent, proc_fops, NULL); ++#endif ++} ++ ++ + extern void proc_set_size(struct proc_dir_entry *, loff_t); + extern void proc_set_user(struct proc_dir_entry *, kuid_t, kgid_t); + extern void *PDE_DATA(const struct inode *); +@@ -56,8 +72,12 @@ static inline struct proc_dir_entry *proc_symlink(const char *name, + struct proc_dir_entry *parent,const char *dest) { return NULL;} + static inline struct proc_dir_entry *proc_mkdir(const char *name, + struct proc_dir_entry *parent) {return NULL;} ++static inline struct proc_dir_entry *proc_mkdir_restrict(const char *name, ++ struct proc_dir_entry *parent) { return NULL; } + static inline struct proc_dir_entry *proc_mkdir_data(const char *name, + umode_t mode, struct proc_dir_entry *parent, void *data) { return NULL; } ++static inline struct proc_dir_entry *proc_mkdir_data_restrict(const char *name, ++ umode_t mode, struct proc_dir_entry *parent, void *data) { return NULL; } + static inline struct proc_dir_entry *proc_mkdir_mode(const char *name, + umode_t mode, struct proc_dir_entry *parent) { return NULL; } + #define proc_create(name, mode, parent, proc_fops) ({NULL;}) +@@ -79,7 +99,7 @@ struct net; + static inline struct proc_dir_entry *proc_net_mkdir( + struct net *net, const char *name, struct proc_dir_entry *parent) + { +- return proc_mkdir_data(name, 0, parent, net); ++ return proc_mkdir_data_restrict(name, 0, parent, net); + } + + #endif /* _LINUX_PROC_FS_H */ +diff --git a/include/linux/proc_ns.h b/include/linux/proc_ns.h +index 34a1e10..70f6bde 100644 +--- a/include/linux/proc_ns.h ++++ b/include/linux/proc_ns.h +@@ -14,7 +14,7 @@ struct proc_ns_operations { + void (*put)(void *ns); + int (*install)(struct nsproxy *nsproxy, void *ns); + unsigned int (*inum)(void *ns); +-}; ++} __do_const __randomize_layout; + + struct proc_ns { + void *ns; +diff --git a/include/linux/quota.h b/include/linux/quota.h +index 8b0877f..b1071c5 100644 +--- a/include/linux/quota.h ++++ b/include/linux/quota.h +@@ -70,7 +70,7 @@ struct kqid { /* Type in which we store the quota identifier */ + + extern bool qid_eq(struct kqid left, struct kqid right); + extern bool qid_lt(struct kqid left, struct kqid right); +-extern qid_t from_kqid(struct user_namespace *to, struct kqid qid); ++extern qid_t from_kqid(struct user_namespace *to, struct kqid qid) __intentional_overflow(-1); + extern qid_t from_kqid_munged(struct user_namespace *to, struct kqid qid); + extern bool qid_valid(struct kqid qid); + +diff --git a/include/linux/random.h b/include/linux/random.h +index b05856e..0a9f14e 100644 +--- a/include/linux/random.h ++++ b/include/linux/random.h +@@ -9,9 +9,19 @@ + #include <uapi/linux/random.h> + + extern void add_device_randomness(const void *, unsigned int); ++ ++static inline void add_latent_entropy(void) ++{ ++ ++#ifdef LATENT_ENTROPY_PLUGIN ++ add_device_randomness((const void *)&latent_entropy, sizeof(latent_entropy)); ++#endif ++ ++} ++ + extern void add_input_randomness(unsigned int type, unsigned int code, +- unsigned int value); +-extern void add_interrupt_randomness(int irq, int irq_flags); ++ unsigned int value) __latent_entropy; ++extern void add_interrupt_randomness(int irq, int irq_flags) __latent_entropy; + + extern void get_random_bytes(void *buf, int nbytes); + extern void get_random_bytes_arch(void *buf, int nbytes); +@@ -22,10 +32,10 @@ extern int random_int_secret_init(void); + extern const struct file_operations random_fops, urandom_fops; + #endif + +-unsigned int get_random_int(void); ++unsigned int __intentional_overflow(-1) get_random_int(void); + unsigned long randomize_range(unsigned long start, unsigned long end, unsigned long len); + +-u32 prandom_u32(void); ++u32 prandom_u32(void) __intentional_overflow(-1); + void prandom_bytes(void *buf, size_t nbytes); + void prandom_seed(u32 seed); + void prandom_reseed_late(void); +@@ -37,6 +47,11 @@ struct rnd_state { + u32 prandom_u32_state(struct rnd_state *state); + void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes); + ++static inline unsigned long __intentional_overflow(-1) pax_get_random_long(void) ++{ ++ return prandom_u32() + (sizeof(long) > 4 ? (unsigned long)prandom_u32() << 32 : 0); ++} ++ + /** + * prandom_u32_max - returns a pseudo-random number in interval [0, ep_ro) + * @ep_ro: right open interval endpoint +@@ -49,7 +64,7 @@ void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes); + * + * Returns: pseudo-random number in interval [0, ep_ro) + */ +-static inline u32 prandom_u32_max(u32 ep_ro) ++static inline u32 __intentional_overflow(-1) prandom_u32_max(u32 ep_ro) + { + return (u32)(((u64) prandom_u32() * ep_ro) >> 32); + } +diff --git a/include/linux/rbtree_augmented.h b/include/linux/rbtree_augmented.h +index 378c5ee..aa84a47 100644 +--- a/include/linux/rbtree_augmented.h ++++ b/include/linux/rbtree_augmented.h +@@ -90,7 +90,9 @@ rbname ## _rotate(struct rb_node *rb_old, struct rb_node *rb_new) \ + old->rbaugmented = rbcompute(old); \ + } \ + rbstatic const struct rb_augment_callbacks rbname = { \ +- rbname ## _propagate, rbname ## _copy, rbname ## _rotate \ ++ .propagate = rbname ## _propagate, \ ++ .copy = rbname ## _copy, \ ++ .rotate = rbname ## _rotate \ + }; + + +diff --git a/include/linux/rculist.h b/include/linux/rculist.h +index 372ad5e..d4373f8 100644 +--- a/include/linux/rculist.h ++++ b/include/linux/rculist.h +@@ -29,8 +29,8 @@ + */ + static inline void INIT_LIST_HEAD_RCU(struct list_head *list) + { +- ACCESS_ONCE(list->next) = list; +- ACCESS_ONCE(list->prev) = list; ++ ACCESS_ONCE_RW(list->next) = list; ++ ACCESS_ONCE_RW(list->prev) = list; + } + + /* +@@ -59,6 +59,9 @@ void __list_add_rcu(struct list_head *new, + struct list_head *prev, struct list_head *next); + #endif + ++void __pax_list_add_rcu(struct list_head *new, ++ struct list_head *prev, struct list_head *next); ++ + /** + * list_add_rcu - add a new entry to rcu-protected list + * @new: new entry to be added +@@ -80,6 +83,11 @@ static inline void list_add_rcu(struct list_head *new, struct list_head *head) + __list_add_rcu(new, head, head->next); + } + ++static inline void pax_list_add_rcu(struct list_head *new, struct list_head *head) ++{ ++ __pax_list_add_rcu(new, head, head->next); ++} ++ + /** + * list_add_tail_rcu - add a new entry to rcu-protected list + * @new: new entry to be added +@@ -102,6 +110,12 @@ static inline void list_add_tail_rcu(struct list_head *new, + __list_add_rcu(new, head->prev, head); + } + ++static inline void pax_list_add_tail_rcu(struct list_head *new, ++ struct list_head *head) ++{ ++ __pax_list_add_rcu(new, head->prev, head); ++} ++ + /** + * list_del_rcu - deletes entry from list without re-initialization + * @entry: the element to delete from the list. +@@ -132,6 +146,8 @@ static inline void list_del_rcu(struct list_head *entry) + entry->prev = LIST_POISON2; + } + ++extern void pax_list_del_rcu(struct list_head *entry); ++ + /** + * hlist_del_init_rcu - deletes entry from hash list with re-initialization + * @n: the element to delete from the hash list. +diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h +index 53ff1a7..c40f0ab 100644 +--- a/include/linux/rcupdate.h ++++ b/include/linux/rcupdate.h +@@ -332,7 +332,7 @@ extern struct srcu_struct tasks_rcu_exit_srcu; + #define rcu_note_voluntary_context_switch(t) \ + do { \ + if (ACCESS_ONCE((t)->rcu_tasks_holdout)) \ +- ACCESS_ONCE((t)->rcu_tasks_holdout) = false; \ ++ ACCESS_ONCE_RW((t)->rcu_tasks_holdout) = false; \ + } while (0) + #else /* #ifdef CONFIG_TASKS_RCU */ + #define TASKS_RCU(x) do { } while (0) +diff --git a/include/linux/reboot.h b/include/linux/reboot.h +index 67fc8fc..a90f7d8 100644 +--- a/include/linux/reboot.h ++++ b/include/linux/reboot.h +@@ -47,9 +47,9 @@ extern void do_kernel_restart(char *cmd); + */ + + extern void migrate_to_reboot_cpu(void); +-extern void machine_restart(char *cmd); +-extern void machine_halt(void); +-extern void machine_power_off(void); ++extern void machine_restart(char *cmd) __noreturn; ++extern void machine_halt(void) __noreturn; ++extern void machine_power_off(void) __noreturn; + + extern void machine_shutdown(void); + struct pt_regs; +@@ -60,9 +60,9 @@ extern void machine_crash_shutdown(struct pt_regs *); + */ + + extern void kernel_restart_prepare(char *cmd); +-extern void kernel_restart(char *cmd); +-extern void kernel_halt(void); +-extern void kernel_power_off(void); ++extern void kernel_restart(char *cmd) __noreturn; ++extern void kernel_halt(void) __noreturn; ++extern void kernel_power_off(void) __noreturn; + + extern int C_A_D; /* for sysctl */ + void ctrl_alt_del(void); +@@ -76,7 +76,7 @@ extern int orderly_poweroff(bool force); + * Emergency restart, callable from an interrupt handler. + */ + +-extern void emergency_restart(void); ++extern void emergency_restart(void) __noreturn; + #include <asm/emergency-restart.h> + + #endif /* _LINUX_REBOOT_H */ +diff --git a/include/linux/regset.h b/include/linux/regset.h +index 8e0c9fe..ac4d221 100644 +--- a/include/linux/regset.h ++++ b/include/linux/regset.h +@@ -161,7 +161,8 @@ struct user_regset { + unsigned int align; + unsigned int bias; + unsigned int core_note_type; +-}; ++} __do_const; ++typedef struct user_regset __no_const user_regset_no_const; + + /** + * struct user_regset_view - available regsets +diff --git a/include/linux/relay.h b/include/linux/relay.h +index d7c8359..818daf5 100644 +--- a/include/linux/relay.h ++++ b/include/linux/relay.h +@@ -157,7 +157,7 @@ struct rchan_callbacks + * The callback should return 0 if successful, negative if not. + */ + int (*remove_buf_file)(struct dentry *dentry); +-}; ++} __no_const; + + /* + * CONFIG_RELAY kernel API, kernel/relay.c +diff --git a/include/linux/rio.h b/include/linux/rio.h +index 6bda06f..bf39a9b 100644 +--- a/include/linux/rio.h ++++ b/include/linux/rio.h +@@ -358,7 +358,7 @@ struct rio_ops { + int (*map_inb)(struct rio_mport *mport, dma_addr_t lstart, + u64 rstart, u32 size, u32 flags); + void (*unmap_inb)(struct rio_mport *mport, dma_addr_t lstart); +-}; ++} __no_const; + + #define RIO_RESOURCE_MEM 0x00000100 + #define RIO_RESOURCE_DOORBELL 0x00000200 +diff --git a/include/linux/rmap.h b/include/linux/rmap.h +index d9d7e7e..86f47ac 100644 +--- a/include/linux/rmap.h ++++ b/include/linux/rmap.h +@@ -154,8 +154,8 @@ static inline void anon_vma_unlock_read(struct anon_vma *anon_vma) + void anon_vma_init(void); /* create anon_vma_cachep */ + int anon_vma_prepare(struct vm_area_struct *); + void unlink_anon_vmas(struct vm_area_struct *); +-int anon_vma_clone(struct vm_area_struct *, struct vm_area_struct *); +-int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *); ++int anon_vma_clone(struct vm_area_struct *, const struct vm_area_struct *); ++int anon_vma_fork(struct vm_area_struct *, const struct vm_area_struct *); + + static inline void anon_vma_merge(struct vm_area_struct *vma, + struct vm_area_struct *next) +diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h +index ed8f9e7..999bc96 100644 +--- a/include/linux/scatterlist.h ++++ b/include/linux/scatterlist.h +@@ -1,6 +1,7 @@ + #ifndef _LINUX_SCATTERLIST_H + #define _LINUX_SCATTERLIST_H + ++#include <linux/sched.h> + #include <linux/string.h> + #include <linux/bug.h> + #include <linux/mm.h> +@@ -114,6 +115,12 @@ static inline void sg_set_buf(struct scatterlist *sg, const void *buf, + #ifdef CONFIG_DEBUG_SG + BUG_ON(!virt_addr_valid(buf)); + #endif ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++ if (object_starts_on_stack(buf)) { ++ void *adjbuf = buf - current->stack + current->lowmem_stack; ++ sg_set_page(sg, virt_to_page(adjbuf), buflen, offset_in_page(adjbuf)); ++ } else ++#endif + sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf)); + } + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 5e344bb..0743255 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -133,6 +133,7 @@ struct fs_struct; + struct perf_event_context; + struct blk_plug; + struct filename; ++struct linux_binprm; + + #define VMACACHE_BITS 2 + #define VMACACHE_SIZE (1U << VMACACHE_BITS) +@@ -376,7 +377,7 @@ extern char __sched_text_start[], __sched_text_end[]; + extern int in_sched_functions(unsigned long addr); + + #define MAX_SCHEDULE_TIMEOUT LONG_MAX +-extern signed long schedule_timeout(signed long timeout); ++extern signed long schedule_timeout(signed long timeout) __intentional_overflow(-1); + extern signed long schedule_timeout_interruptible(signed long timeout); + extern signed long schedule_timeout_killable(signed long timeout); + extern signed long schedule_timeout_uninterruptible(signed long timeout); +@@ -387,6 +388,19 @@ struct nsproxy; + struct user_namespace; + + #ifdef CONFIG_MMU ++ ++#ifdef CONFIG_GRKERNSEC_RAND_THREADSTACK ++extern unsigned long gr_rand_threadstack_offset(const struct mm_struct *mm, const struct file *filp, unsigned long flags); ++#else ++static inline unsigned long gr_rand_threadstack_offset(const struct mm_struct *mm, const struct file *filp, unsigned long flags) ++{ ++ return 0; ++} ++#endif ++ ++extern bool check_heap_stack_gap(const struct vm_area_struct *vma, unsigned long addr, unsigned long len, unsigned long offset); ++extern unsigned long skip_heap_stack_gap(const struct vm_area_struct *vma, unsigned long len, unsigned long offset); ++ + extern void arch_pick_mmap_layout(struct mm_struct *mm); + extern unsigned long + arch_get_unmapped_area(struct file *, unsigned long, unsigned long, +@@ -685,6 +699,17 @@ struct signal_struct { + #ifdef CONFIG_TASKSTATS + struct taskstats *stats; + #endif ++ ++#ifdef CONFIG_GRKERNSEC ++ u32 curr_ip; ++ u32 saved_ip; ++ u32 gr_saddr; ++ u32 gr_daddr; ++ u16 gr_sport; ++ u16 gr_dport; ++ u8 used_accept:1; ++#endif ++ + #ifdef CONFIG_AUDIT + unsigned audit_tty; + unsigned audit_tty_log_passwd; +@@ -711,7 +736,7 @@ struct signal_struct { + struct mutex cred_guard_mutex; /* guard against foreign influences on + * credential calculations + * (notably. ptrace) */ +-}; ++} __randomize_layout; + + /* + * Bits in flags field of signal_struct. +@@ -764,6 +789,14 @@ struct user_struct { + struct key *session_keyring; /* UID's default session keyring */ + #endif + ++#ifdef CONFIG_GRKERNSEC_KERN_LOCKOUT ++ unsigned char kernel_banned; ++#endif ++#ifdef CONFIG_GRKERNSEC_BRUTE ++ unsigned char suid_banned; ++ unsigned long suid_ban_expires; ++#endif ++ + /* Hash table maintenance information */ + struct hlist_node uidhash_node; + kuid_t uid; +@@ -771,7 +804,7 @@ struct user_struct { + #ifdef CONFIG_PERF_EVENTS + atomic_long_t locked_vm; + #endif +-}; ++} __randomize_layout; + + extern int uids_sysfs_init(void); + +@@ -1235,6 +1268,9 @@ enum perf_event_task_context { + struct task_struct { + volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ + void *stack; ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++ void *lowmem_stack; ++#endif + atomic_t usage; + unsigned int flags; /* per process flags, defined below */ + unsigned int ptrace; +@@ -1362,8 +1398,8 @@ struct task_struct { + struct list_head thread_node; + + struct completion *vfork_done; /* for vfork() */ +- int __user *set_child_tid; /* CLONE_CHILD_SETTID */ +- int __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */ ++ pid_t __user *set_child_tid; /* CLONE_CHILD_SETTID */ ++ pid_t __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */ + + cputime_t utime, stime, utimescaled, stimescaled; + cputime_t gtime; +@@ -1388,11 +1424,6 @@ struct task_struct { + struct task_cputime cputime_expires; + struct list_head cpu_timers[3]; + +-/* process credentials */ +- const struct cred __rcu *real_cred; /* objective and real subjective task +- * credentials (COW) */ +- const struct cred __rcu *cred; /* effective (overridable) subjective task +- * credentials (COW) */ + char comm[TASK_COMM_LEN]; /* executable name excluding path + - access with [gs]et_task_comm (which lock + it with task_lock()) +@@ -1410,6 +1441,10 @@ struct task_struct { + #endif + /* CPU-specific state of this task */ + struct thread_struct thread; ++/* thread_info moved to task_struct */ ++#ifdef CONFIG_X86 ++ struct thread_info tinfo; ++#endif + /* filesystem information */ + struct fs_struct *fs; + /* open file information */ +@@ -1484,6 +1519,10 @@ struct task_struct { + gfp_t lockdep_reclaim_gfp; + #endif + ++/* process credentials */ ++ const struct cred __rcu *real_cred; /* objective and real subjective task ++ * credentials (COW) */ ++ + /* journalling filesystem info */ + void *journal_info; + +@@ -1522,6 +1561,10 @@ struct task_struct { + /* cg_list protected by css_set_lock and tsk->alloc_lock */ + struct list_head cg_list; + #endif ++ ++ const struct cred __rcu *cred; /* effective (overridable) subjective task ++ * credentials (COW) */ ++ + #ifdef CONFIG_FUTEX + struct robust_list_head __user *robust_list; + #ifdef CONFIG_COMPAT +@@ -1635,7 +1678,7 @@ struct task_struct { + * Number of functions that haven't been traced + * because of depth overrun. + */ +- atomic_t trace_overrun; ++ atomic_unchecked_t trace_overrun; + /* Pause for the tracing */ + atomic_t tracing_graph_pause; + #endif +@@ -1661,7 +1704,78 @@ struct task_struct { + unsigned int sequential_io; + unsigned int sequential_io_avg; + #endif +-}; ++ ++#ifdef CONFIG_GRKERNSEC ++ /* grsecurity */ ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ u64 exec_id; ++#endif ++#ifdef CONFIG_GRKERNSEC_SETXID ++ const struct cred *delayed_cred; ++#endif ++ struct dentry *gr_chroot_dentry; ++ struct acl_subject_label *acl; ++ struct acl_subject_label *tmpacl; ++ struct acl_role_label *role; ++ struct file *exec_file; ++ unsigned long brute_expires; ++ u16 acl_role_id; ++ u8 inherited; ++ /* is this the task that authenticated to the special role */ ++ u8 acl_sp_role; ++ u8 is_writable; ++ u8 brute; ++ u8 gr_is_chrooted; ++#endif ++ ++} __randomize_layout; ++ ++#define MF_PAX_PAGEEXEC 0x01000000 /* Paging based non-executable pages */ ++#define MF_PAX_EMUTRAMP 0x02000000 /* Emulate trampolines */ ++#define MF_PAX_MPROTECT 0x04000000 /* Restrict mprotect() */ ++#define MF_PAX_RANDMMAP 0x08000000 /* Randomize mmap() base */ ++/*#define MF_PAX_RANDEXEC 0x10000000*/ /* Randomize ET_EXEC base */ ++#define MF_PAX_SEGMEXEC 0x20000000 /* Segmentation based non-executable pages */ ++ ++#ifdef CONFIG_PAX_SOFTMODE ++extern int pax_softmode; ++#endif ++ ++extern int pax_check_flags(unsigned long *); ++#define PAX_PARSE_FLAGS_FALLBACK (~0UL) ++ ++/* if tsk != current then task_lock must be held on it */ ++#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR) ++static inline unsigned long pax_get_flags(struct task_struct *tsk) ++{ ++ if (likely(tsk->mm)) ++ return tsk->mm->pax_flags; ++ else ++ return 0UL; ++} ++ ++/* if tsk != current then task_lock must be held on it */ ++static inline long pax_set_flags(struct task_struct *tsk, unsigned long flags) ++{ ++ if (likely(tsk->mm)) { ++ tsk->mm->pax_flags = flags; ++ return 0; ++ } ++ return -EINVAL; ++} ++#endif ++ ++#ifdef CONFIG_PAX_HAVE_ACL_FLAGS ++extern void pax_set_initial_flags(struct linux_binprm *bprm); ++#elif defined(CONFIG_PAX_HOOK_ACL_FLAGS) ++extern void (*pax_set_initial_flags_func)(struct linux_binprm *bprm); ++#endif ++ ++struct path; ++extern char *pax_get_path(const struct path *path, char *buf, int buflen); ++extern void pax_report_fault(struct pt_regs *regs, void *pc, void *sp); ++extern void pax_report_insns(struct pt_regs *regs, void *pc, void *sp); ++extern void pax_report_refcount_overflow(struct pt_regs *regs); + + /* Future-safe accessor for struct task_struct's cpus_allowed. */ + #define tsk_cpus_allowed(tsk) (&(tsk)->cpus_allowed) +@@ -1743,7 +1857,7 @@ struct pid_namespace; + pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type, + struct pid_namespace *ns); + +-static inline pid_t task_pid_nr(struct task_struct *tsk) ++static inline pid_t task_pid_nr(const struct task_struct *tsk) + { + return tsk->pid; + } +@@ -2106,6 +2220,25 @@ extern u64 sched_clock_cpu(int cpu); + + extern void sched_clock_init(void); + ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++static inline void populate_stack(void) ++{ ++ struct task_struct *curtask = current; ++ int c; ++ int *ptr = curtask->stack; ++ int *end = curtask->stack + THREAD_SIZE; ++ ++ while (ptr < end) { ++ c = *(volatile int *)ptr; ++ ptr += PAGE_SIZE/sizeof(int); ++ } ++} ++#else ++static inline void populate_stack(void) ++{ ++} ++#endif ++ + #ifndef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK + static inline void sched_clock_tick(void) + { +@@ -2239,7 +2372,9 @@ void yield(void); + extern struct exec_domain default_exec_domain; + + union thread_union { ++#ifndef CONFIG_X86 + struct thread_info thread_info; ++#endif + unsigned long stack[THREAD_SIZE/sizeof(long)]; + }; + +@@ -2272,6 +2407,7 @@ extern struct pid_namespace init_pid_ns; + */ + + extern struct task_struct *find_task_by_vpid(pid_t nr); ++extern struct task_struct *find_task_by_vpid_unrestricted(pid_t nr); + extern struct task_struct *find_task_by_pid_ns(pid_t nr, + struct pid_namespace *ns); + +@@ -2436,7 +2572,7 @@ extern void __cleanup_sighand(struct sighand_struct *); + extern void exit_itimers(struct signal_struct *); + extern void flush_itimer_signals(void); + +-extern void do_group_exit(int); ++extern __noreturn void do_group_exit(int); + + extern int do_execve(struct filename *, + const char __user * const __user *, +@@ -2653,9 +2789,9 @@ static inline unsigned long *end_of_stack(struct task_struct *p) + #define task_stack_end_corrupted(task) \ + (*(end_of_stack(task)) != STACK_END_MAGIC) + +-static inline int object_is_on_stack(void *obj) ++static inline int object_starts_on_stack(const void *obj) + { +- void *stack = task_stack_page(current); ++ const void *stack = task_stack_page(current); + + return (obj >= stack) && (obj < (stack + THREAD_SIZE)); + } +diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h +index 596a0e0..bea77ec 100644 +--- a/include/linux/sched/sysctl.h ++++ b/include/linux/sched/sysctl.h +@@ -34,6 +34,7 @@ enum { sysctl_hung_task_timeout_secs = 0 }; + #define DEFAULT_MAX_MAP_COUNT (USHRT_MAX - MAPCOUNT_ELF_CORE_MARGIN) + + extern int sysctl_max_map_count; ++extern unsigned long sysctl_heap_stack_gap; + + extern unsigned int sysctl_sched_latency; + extern unsigned int sysctl_sched_min_granularity; +diff --git a/include/linux/security.h b/include/linux/security.h +index ba96471..74fb3f6 100644 +--- a/include/linux/security.h ++++ b/include/linux/security.h +@@ -27,6 +27,7 @@ + #include <linux/slab.h> + #include <linux/err.h> + #include <linux/string.h> ++#include <linux/grsecurity.h> + + struct linux_binprm; + struct cred; +@@ -116,8 +117,6 @@ struct seq_file; + + extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb); + +-void reset_security_ops(void); +- + #ifdef CONFIG_MMU + extern unsigned long mmap_min_addr; + extern unsigned long dac_mmap_min_addr; +@@ -1729,7 +1728,7 @@ struct security_operations { + struct audit_context *actx); + void (*audit_rule_free) (void *lsmrule); + #endif /* CONFIG_AUDIT */ +-}; ++} __randomize_layout; + + /* prototypes */ + extern int security_init(void); +diff --git a/include/linux/semaphore.h b/include/linux/semaphore.h +index dc368b8..e895209 100644 +--- a/include/linux/semaphore.h ++++ b/include/linux/semaphore.h +@@ -37,7 +37,7 @@ static inline void sema_init(struct semaphore *sem, int val) + } + + extern void down(struct semaphore *sem); +-extern int __must_check down_interruptible(struct semaphore *sem); ++extern int __must_check down_interruptible(struct semaphore *sem) __intentional_overflow(-1); + extern int __must_check down_killable(struct semaphore *sem); + extern int __must_check down_trylock(struct semaphore *sem); + extern int __must_check down_timeout(struct semaphore *sem, long jiffies); +diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h +index 52e0097..383f21d 100644 +--- a/include/linux/seq_file.h ++++ b/include/linux/seq_file.h +@@ -27,6 +27,9 @@ struct seq_file { + struct mutex lock; + const struct seq_operations *op; + int poll_event; ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ u64 exec_id; ++#endif + #ifdef CONFIG_USER_NS + struct user_namespace *user_ns; + #endif +@@ -39,6 +42,7 @@ struct seq_operations { + void * (*next) (struct seq_file *m, void *v, loff_t *pos); + int (*show) (struct seq_file *m, void *v); + }; ++typedef struct seq_operations __no_const seq_operations_no_const; + + #define SEQ_SKIP 1 + +@@ -96,6 +100,7 @@ void seq_pad(struct seq_file *m, char c); + + char *mangle_path(char *s, const char *p, const char *esc); + int seq_open(struct file *, const struct seq_operations *); ++int seq_open_restrict(struct file *, const struct seq_operations *); + ssize_t seq_read(struct file *, char __user *, size_t, loff_t *); + loff_t seq_lseek(struct file *, loff_t, int); + int seq_release(struct inode *, struct file *); +@@ -138,6 +143,7 @@ static inline int seq_nodemask_list(struct seq_file *m, nodemask_t *mask) + } + + int single_open(struct file *, int (*)(struct seq_file *, void *), void *); ++int single_open_restrict(struct file *, int (*)(struct seq_file *, void *), void *); + int single_open_size(struct file *, int (*)(struct seq_file *, void *), void *, size_t); + int single_release(struct inode *, struct file *); + void *__seq_open_private(struct file *, const struct seq_operations *, int); +diff --git a/include/linux/shm.h b/include/linux/shm.h +index 6fb8016..ab4465e 100644 +--- a/include/linux/shm.h ++++ b/include/linux/shm.h +@@ -22,6 +22,10 @@ struct shmid_kernel /* private to the kernel */ + /* The task created the shm object. NULL if the task is dead. */ + struct task_struct *shm_creator; + struct list_head shm_clist; /* list by creator */ ++#ifdef CONFIG_GRKERNSEC ++ u64 shm_createtime; ++ pid_t shm_lapid; ++#endif + }; + + /* shm_mode upper byte flags */ +diff --git a/include/linux/signal.h b/include/linux/signal.h +index ab1e039..ad4229e 100644 +--- a/include/linux/signal.h ++++ b/include/linux/signal.h +@@ -289,7 +289,7 @@ static inline void allow_signal(int sig) + * know it'll be handled, so that they don't get converted to + * SIGKILL or just silently dropped. + */ +- kernel_sigaction(sig, (__force __sighandler_t)2); ++ kernel_sigaction(sig, (__force_user __sighandler_t)2); + } + + static inline void disallow_signal(int sig) +diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h +index 6c8b6f6..5a0f4bd 100644 +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -773,7 +773,7 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, + struct sk_buff *__alloc_skb(unsigned int size, gfp_t priority, int flags, + int node); + struct sk_buff *build_skb(void *data, unsigned int frag_size); +-static inline struct sk_buff *alloc_skb(unsigned int size, ++static inline struct sk_buff * __intentional_overflow(0) alloc_skb(unsigned int size, + gfp_t priority) + { + return __alloc_skb(size, priority, 0, NUMA_NO_NODE); +@@ -1962,7 +1962,7 @@ static inline u32 skb_inner_network_header_len(const struct sk_buff *skb) + return skb->inner_transport_header - skb->inner_network_header; + } + +-static inline int skb_network_offset(const struct sk_buff *skb) ++static inline int __intentional_overflow(0) skb_network_offset(const struct sk_buff *skb) + { + return skb_network_header(skb) - skb->data; + } +@@ -2022,7 +2022,7 @@ static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len) + * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8) + */ + #ifndef NET_SKB_PAD +-#define NET_SKB_PAD max(32, L1_CACHE_BYTES) ++#define NET_SKB_PAD max(_AC(32,UL), L1_CACHE_BYTES) + #endif + + int ___pskb_trim(struct sk_buff *skb, unsigned int len); +@@ -2629,7 +2629,7 @@ struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock, + int *err); + unsigned int datagram_poll(struct file *file, struct socket *sock, + struct poll_table_struct *wait); +-int skb_copy_datagram_iovec(const struct sk_buff *from, int offset, ++int __intentional_overflow(0) skb_copy_datagram_iovec(const struct sk_buff *from, int offset, + struct iovec *to, int size); + int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen, + struct iovec *iov); +@@ -3091,6 +3091,9 @@ static inline void nf_reset(struct sk_buff *skb) + nf_bridge_put(skb->nf_bridge); + skb->nf_bridge = NULL; + #endif ++#if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) ++ skb->nf_trace = 0; ++#endif + } + + static inline void nf_reset_trace(struct sk_buff *skb) +diff --git a/include/linux/slab.h b/include/linux/slab.h +index c265bec..4867d28 100644 +--- a/include/linux/slab.h ++++ b/include/linux/slab.h +@@ -14,15 +14,29 @@ + #include <linux/gfp.h> + #include <linux/types.h> + #include <linux/workqueue.h> +- ++#include <linux/err.h> + + /* + * Flags to pass to kmem_cache_create(). + * The ones marked DEBUG are only valid if CONFIG_SLAB_DEBUG is set. + */ + #define SLAB_DEBUG_FREE 0x00000100UL /* DEBUG: Perform (expensive) checks on free */ ++ ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++#define SLAB_USERCOPY 0x00000200UL /* PaX: Allow copying objs to/from userland */ ++#else ++#define SLAB_USERCOPY 0x00000000UL ++#endif ++ + #define SLAB_RED_ZONE 0x00000400UL /* DEBUG: Red zone objs in a cache */ + #define SLAB_POISON 0x00000800UL /* DEBUG: Poison objects */ ++ ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++#define SLAB_NO_SANITIZE 0x00001000UL /* PaX: Do not sanitize objs on free */ ++#else ++#define SLAB_NO_SANITIZE 0x00000000UL ++#endif ++ + #define SLAB_HWCACHE_ALIGN 0x00002000UL /* Align objs on cache lines */ + #define SLAB_CACHE_DMA 0x00004000UL /* Use GFP_DMA memory */ + #define SLAB_STORE_USER 0x00010000UL /* DEBUG: Store the last owner for bug hunting */ +@@ -98,10 +112,13 @@ + * ZERO_SIZE_PTR can be passed to kfree though in the same way that NULL can. + * Both make kfree a no-op. + */ +-#define ZERO_SIZE_PTR ((void *)16) ++#define ZERO_SIZE_PTR \ ++({ \ ++ BUILD_BUG_ON(!(MAX_ERRNO & ~PAGE_MASK));\ ++ (void *)(-MAX_ERRNO-1L); \ ++}) + +-#define ZERO_OR_NULL_PTR(x) ((unsigned long)(x) <= \ +- (unsigned long)ZERO_SIZE_PTR) ++#define ZERO_OR_NULL_PTR(x) ((unsigned long)(x) - 1 >= (unsigned long)ZERO_SIZE_PTR - 1) + + #include <linux/kmemleak.h> + +@@ -144,6 +161,8 @@ void * __must_check krealloc(const void *, size_t, gfp_t); + void kfree(const void *); + void kzfree(const void *); + size_t ksize(const void *); ++const char *check_heap_object(const void *ptr, unsigned long n); ++bool is_usercopy_object(const void *ptr); + + /* + * Some archs want to perform DMA into kmalloc caches and need a guaranteed +@@ -236,6 +255,10 @@ extern struct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH + 1]; + extern struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH + 1]; + #endif + ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++extern struct kmem_cache *kmalloc_usercopy_caches[KMALLOC_SHIFT_HIGH + 1]; ++#endif ++ + /* + * Figure out which kmalloc slab an allocation of a certain size + * belongs to. +@@ -244,7 +267,7 @@ extern struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH + 1]; + * 2 = 120 .. 192 bytes + * n = 2^(n-1) .. 2^n -1 + */ +-static __always_inline int kmalloc_index(size_t size) ++static __always_inline __size_overflow(1) int kmalloc_index(size_t size) + { + if (!size) + return 0; +@@ -287,11 +310,11 @@ static __always_inline int kmalloc_index(size_t size) + } + #endif /* !CONFIG_SLOB */ + +-void *__kmalloc(size_t size, gfp_t flags); ++void *__kmalloc(size_t size, gfp_t flags) __alloc_size(1); + void *kmem_cache_alloc(struct kmem_cache *, gfp_t flags); + + #ifdef CONFIG_NUMA +-void *__kmalloc_node(size_t size, gfp_t flags, int node); ++void *__kmalloc_node(size_t size, gfp_t flags, int node) __alloc_size(1); + void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node); + #else + static __always_inline void *__kmalloc_node(size_t size, gfp_t flags, int node) +diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h +index b869d16..1453c73 100644 +--- a/include/linux/slab_def.h ++++ b/include/linux/slab_def.h +@@ -40,7 +40,7 @@ struct kmem_cache { + /* 4) cache creation/removal */ + const char *name; + struct list_head list; +- int refcount; ++ atomic_t refcount; + int object_size; + int align; + +@@ -56,10 +56,14 @@ struct kmem_cache { + unsigned long node_allocs; + unsigned long node_frees; + unsigned long node_overflow; +- atomic_t allochit; +- atomic_t allocmiss; +- atomic_t freehit; +- atomic_t freemiss; ++ atomic_unchecked_t allochit; ++ atomic_unchecked_t allocmiss; ++ atomic_unchecked_t freehit; ++ atomic_unchecked_t freemiss; ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ atomic_unchecked_t sanitized; ++ atomic_unchecked_t not_sanitized; ++#endif + + /* + * If debugging is enabled, then the allocator can add additional +diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h +index d82abd4..408c3a0 100644 +--- a/include/linux/slub_def.h ++++ b/include/linux/slub_def.h +@@ -74,7 +74,7 @@ struct kmem_cache { + struct kmem_cache_order_objects max; + struct kmem_cache_order_objects min; + gfp_t allocflags; /* gfp flags to use on each alloc */ +- int refcount; /* Refcount for slab cache destroy */ ++ atomic_t refcount; /* Refcount for slab cache destroy */ + void (*ctor)(void *); + int inuse; /* Offset to metadata */ + int align; /* Alignment */ +diff --git a/include/linux/smp.h b/include/linux/smp.h +index 93dff5f..933c561 100644 +--- a/include/linux/smp.h ++++ b/include/linux/smp.h +@@ -176,7 +176,9 @@ static inline void wake_up_all_idle_cpus(void) { } + #endif + + #define get_cpu() ({ preempt_disable(); smp_processor_id(); }) ++#define raw_get_cpu() ({ raw_preempt_disable(); raw_smp_processor_id(); }) + #define put_cpu() preempt_enable() ++#define raw_put_cpu_no_resched() raw_preempt_enable_no_resched() + + /* + * Callback to arch code if there's nosmp or maxcpus=0 on the +diff --git a/include/linux/sock_diag.h b/include/linux/sock_diag.h +index 46cca4c..3323536 100644 +--- a/include/linux/sock_diag.h ++++ b/include/linux/sock_diag.h +@@ -11,7 +11,7 @@ struct sock; + struct sock_diag_handler { + __u8 family; + int (*dump)(struct sk_buff *skb, struct nlmsghdr *nlh); +-}; ++} __do_const; + + int sock_diag_register(const struct sock_diag_handler *h); + void sock_diag_unregister(const struct sock_diag_handler *h); +diff --git a/include/linux/sonet.h b/include/linux/sonet.h +index 680f9a3..f13aeb0 100644 +--- a/include/linux/sonet.h ++++ b/include/linux/sonet.h +@@ -7,7 +7,7 @@ + #include <uapi/linux/sonet.h> + + struct k_sonet_stats { +-#define __HANDLE_ITEM(i) atomic_t i ++#define __HANDLE_ITEM(i) atomic_unchecked_t i + __SONET_ITEMS + #undef __HANDLE_ITEM + }; +diff --git a/include/linux/sunrpc/addr.h b/include/linux/sunrpc/addr.h +index 07d8e53..dc934c9 100644 +--- a/include/linux/sunrpc/addr.h ++++ b/include/linux/sunrpc/addr.h +@@ -23,9 +23,9 @@ static inline unsigned short rpc_get_port(const struct sockaddr *sap) + { + switch (sap->sa_family) { + case AF_INET: +- return ntohs(((struct sockaddr_in *)sap)->sin_port); ++ return ntohs(((const struct sockaddr_in *)sap)->sin_port); + case AF_INET6: +- return ntohs(((struct sockaddr_in6 *)sap)->sin6_port); ++ return ntohs(((const struct sockaddr_in6 *)sap)->sin6_port); + } + return 0; + } +@@ -58,7 +58,7 @@ static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1, + static inline bool __rpc_copy_addr4(struct sockaddr *dst, + const struct sockaddr *src) + { +- const struct sockaddr_in *ssin = (struct sockaddr_in *) src; ++ const struct sockaddr_in *ssin = (const struct sockaddr_in *) src; + struct sockaddr_in *dsin = (struct sockaddr_in *) dst; + + dsin->sin_family = ssin->sin_family; +@@ -164,7 +164,7 @@ static inline u32 rpc_get_scope_id(const struct sockaddr *sa) + if (sa->sa_family != AF_INET6) + return 0; + +- return ((struct sockaddr_in6 *) sa)->sin6_scope_id; ++ return ((const struct sockaddr_in6 *) sa)->sin6_scope_id; + } + + #endif /* _LINUX_SUNRPC_ADDR_H */ +diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h +index b363a0f..f09861d 100644 +--- a/include/linux/sunrpc/clnt.h ++++ b/include/linux/sunrpc/clnt.h +@@ -97,7 +97,7 @@ struct rpc_procinfo { + unsigned int p_timer; /* Which RTT timer to use */ + u32 p_statidx; /* Which procedure to account */ + const char * p_name; /* name of procedure */ +-}; ++} __do_const; + + #ifdef __KERNEL__ + +diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h +index 2167846..0648fc3 100644 +--- a/include/linux/sunrpc/svc.h ++++ b/include/linux/sunrpc/svc.h +@@ -416,7 +416,7 @@ struct svc_procedure { + unsigned int pc_count; /* call count */ + unsigned int pc_cachetype; /* cache info (NFS) */ + unsigned int pc_xdrressize; /* maximum size of XDR reply */ +-}; ++} __do_const; + + /* + * Function prototypes. +diff --git a/include/linux/sunrpc/svc_rdma.h b/include/linux/sunrpc/svc_rdma.h +index 975da75..318c083 100644 +--- a/include/linux/sunrpc/svc_rdma.h ++++ b/include/linux/sunrpc/svc_rdma.h +@@ -53,15 +53,15 @@ extern unsigned int svcrdma_ord; + extern unsigned int svcrdma_max_requests; + extern unsigned int svcrdma_max_req_size; + +-extern atomic_t rdma_stat_recv; +-extern atomic_t rdma_stat_read; +-extern atomic_t rdma_stat_write; +-extern atomic_t rdma_stat_sq_starve; +-extern atomic_t rdma_stat_rq_starve; +-extern atomic_t rdma_stat_rq_poll; +-extern atomic_t rdma_stat_rq_prod; +-extern atomic_t rdma_stat_sq_poll; +-extern atomic_t rdma_stat_sq_prod; ++extern atomic_unchecked_t rdma_stat_recv; ++extern atomic_unchecked_t rdma_stat_read; ++extern atomic_unchecked_t rdma_stat_write; ++extern atomic_unchecked_t rdma_stat_sq_starve; ++extern atomic_unchecked_t rdma_stat_rq_starve; ++extern atomic_unchecked_t rdma_stat_rq_poll; ++extern atomic_unchecked_t rdma_stat_rq_prod; ++extern atomic_unchecked_t rdma_stat_sq_poll; ++extern atomic_unchecked_t rdma_stat_sq_prod; + + #define RPCRDMA_VERSION 1 + +diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h +index 8d71d65..f79586e 100644 +--- a/include/linux/sunrpc/svcauth.h ++++ b/include/linux/sunrpc/svcauth.h +@@ -120,7 +120,7 @@ struct auth_ops { + int (*release)(struct svc_rqst *rq); + void (*domain_release)(struct auth_domain *); + int (*set_client)(struct svc_rqst *rq); +-}; ++} __do_const; + + #define SVC_GARBAGE 1 + #define SVC_SYSERR 2 +diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h +index e7a018e..49f8b17 100644 +--- a/include/linux/swiotlb.h ++++ b/include/linux/swiotlb.h +@@ -60,7 +60,8 @@ extern void + + extern void + swiotlb_free_coherent(struct device *hwdev, size_t size, +- void *vaddr, dma_addr_t dma_handle); ++ void *vaddr, dma_addr_t dma_handle, ++ struct dma_attrs *attrs); + + extern dma_addr_t swiotlb_map_page(struct device *dev, struct page *page, + unsigned long offset, size_t size, +diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h +index bda9b81..23d45f7 100644 +--- a/include/linux/syscalls.h ++++ b/include/linux/syscalls.h +@@ -102,7 +102,12 @@ union bpf_attr; + #define __TYPE_IS_L(t) (__same_type((t)0, 0L)) + #define __TYPE_IS_UL(t) (__same_type((t)0, 0UL)) + #define __TYPE_IS_LL(t) (__same_type((t)0, 0LL) || __same_type((t)0, 0ULL)) +-#define __SC_LONG(t, a) __typeof(__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)) a ++#define __SC_LONG(t, a) __typeof__( \ ++ __builtin_choose_expr( \ ++ sizeof(t) > sizeof(int), \ ++ (t) 0, \ ++ __builtin_choose_expr(__type_is_unsigned(t), 0UL, 0L) \ ++ )) a + #define __SC_CAST(t, a) (t) a + #define __SC_ARGS(t, a) a + #define __SC_TEST(t, a) (void)BUILD_BUG_ON_ZERO(!__TYPE_IS_LL(t) && sizeof(t) > sizeof(long)) +@@ -384,11 +389,11 @@ asmlinkage long sys_sync(void); + asmlinkage long sys_fsync(unsigned int fd); + asmlinkage long sys_fdatasync(unsigned int fd); + asmlinkage long sys_bdflush(int func, long data); +-asmlinkage long sys_mount(char __user *dev_name, char __user *dir_name, +- char __user *type, unsigned long flags, ++asmlinkage long sys_mount(const char __user *dev_name, const char __user *dir_name, ++ const char __user *type, unsigned long flags, + void __user *data); +-asmlinkage long sys_umount(char __user *name, int flags); +-asmlinkage long sys_oldumount(char __user *name); ++asmlinkage long sys_umount(const char __user *name, int flags); ++asmlinkage long sys_oldumount(const char __user *name); + asmlinkage long sys_truncate(const char __user *path, long length); + asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length); + asmlinkage long sys_stat(const char __user *filename, +@@ -600,7 +605,7 @@ asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *); + asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *); + asmlinkage long sys_send(int, void __user *, size_t, unsigned); + asmlinkage long sys_sendto(int, void __user *, size_t, unsigned, +- struct sockaddr __user *, int); ++ struct sockaddr __user *, int) __intentional_overflow(0); + asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags); + asmlinkage long sys_sendmmsg(int fd, struct mmsghdr __user *msg, + unsigned int vlen, unsigned flags); +diff --git a/include/linux/syscore_ops.h b/include/linux/syscore_ops.h +index 27b3b0b..e093dd9 100644 +--- a/include/linux/syscore_ops.h ++++ b/include/linux/syscore_ops.h +@@ -16,7 +16,7 @@ struct syscore_ops { + int (*suspend)(void); + void (*resume)(void); + void (*shutdown)(void); +-}; ++} __do_const; + + extern void register_syscore_ops(struct syscore_ops *ops); + extern void unregister_syscore_ops(struct syscore_ops *ops); +diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h +index b7361f8..341a15a 100644 +--- a/include/linux/sysctl.h ++++ b/include/linux/sysctl.h +@@ -39,6 +39,8 @@ typedef int proc_handler (struct ctl_table *ctl, int write, + + extern int proc_dostring(struct ctl_table *, int, + void __user *, size_t *, loff_t *); ++extern int proc_dostring_modpriv(struct ctl_table *, int, ++ void __user *, size_t *, loff_t *); + extern int proc_dointvec(struct ctl_table *, int, + void __user *, size_t *, loff_t *); + extern int proc_dointvec_minmax(struct ctl_table *, int, +@@ -113,7 +115,8 @@ struct ctl_table + struct ctl_table_poll *poll; + void *extra1; + void *extra2; +-}; ++} __do_const __randomize_layout; ++typedef struct ctl_table __no_const ctl_table_no_const; + + struct ctl_node { + struct rb_node node; +diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h +index f97d0db..c1187dc 100644 +--- a/include/linux/sysfs.h ++++ b/include/linux/sysfs.h +@@ -34,7 +34,8 @@ struct attribute { + struct lock_class_key *key; + struct lock_class_key skey; + #endif +-}; ++} __do_const; ++typedef struct attribute __no_const attribute_no_const; + + /** + * sysfs_attr_init - initialize a dynamically allocated sysfs attribute +@@ -63,7 +64,8 @@ struct attribute_group { + struct attribute *, int); + struct attribute **attrs; + struct bin_attribute **bin_attrs; +-}; ++} __do_const; ++typedef struct attribute_group __no_const attribute_group_no_const; + + /** + * Use these macros to make defining attributes easier. See include/linux/device.h +@@ -128,7 +130,8 @@ struct bin_attribute { + char *, loff_t, size_t); + int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr, + struct vm_area_struct *vma); +-}; ++} __do_const; ++typedef struct bin_attribute __no_const bin_attribute_no_const; + + /** + * sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute +diff --git a/include/linux/sysrq.h b/include/linux/sysrq.h +index 387fa7d..3fcde6b 100644 +--- a/include/linux/sysrq.h ++++ b/include/linux/sysrq.h +@@ -16,6 +16,7 @@ + + #include <linux/errno.h> + #include <linux/types.h> ++#include <linux/compiler.h> + + /* Possible values of bitmask for enabling sysrq functions */ + /* 0x0001 is reserved for enable everything */ +@@ -33,7 +34,7 @@ struct sysrq_key_op { + char *help_msg; + char *action_msg; + int enable_mask; +-}; ++} __do_const; + + #ifdef CONFIG_MAGIC_SYSRQ + +diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h +index ff307b5..f1a4468 100644 +--- a/include/linux/thread_info.h ++++ b/include/linux/thread_info.h +@@ -145,6 +145,13 @@ static inline bool test_and_clear_restore_sigmask(void) + #error "no set_restore_sigmask() provided and default one won't work" + #endif + ++extern void __check_object_size(const void *ptr, unsigned long n, bool to_user, bool const_size); ++ ++static inline void check_object_size(const void *ptr, unsigned long n, bool to_user) ++{ ++ __check_object_size(ptr, n, to_user, __builtin_constant_p(n)); ++} ++ + #endif /* __KERNEL__ */ + + #endif /* _LINUX_THREAD_INFO_H */ +diff --git a/include/linux/tty.h b/include/linux/tty.h +index 5171ef8..1048d83e 100644 +--- a/include/linux/tty.h ++++ b/include/linux/tty.h +@@ -202,7 +202,7 @@ struct tty_port { + const struct tty_port_operations *ops; /* Port operations */ + spinlock_t lock; /* Lock protecting tty field */ + int blocked_open; /* Waiting to open */ +- int count; /* Usage count */ ++ atomic_t count; /* Usage count */ + wait_queue_head_t open_wait; /* Open waiters */ + wait_queue_head_t close_wait; /* Close waiters */ + wait_queue_head_t delta_msr_wait; /* Modem status change */ +@@ -290,7 +290,7 @@ struct tty_struct { + /* If the tty has a pending do_SAK, queue it here - akpm */ + struct work_struct SAK_work; + struct tty_port *port; +-}; ++} __randomize_layout; + + /* Each of a tty's open files has private_data pointing to tty_file_private */ + struct tty_file_private { +@@ -555,7 +555,7 @@ extern int tty_port_open(struct tty_port *port, + struct tty_struct *tty, struct file *filp); + static inline int tty_port_users(struct tty_port *port) + { +- return port->count + port->blocked_open; ++ return atomic_read(&port->count) + port->blocked_open; + } + + extern int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc); +diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h +index 92e337c..f46757b 100644 +--- a/include/linux/tty_driver.h ++++ b/include/linux/tty_driver.h +@@ -291,7 +291,7 @@ struct tty_operations { + void (*poll_put_char)(struct tty_driver *driver, int line, char ch); + #endif + const struct file_operations *proc_fops; +-}; ++} __do_const __randomize_layout; + + struct tty_driver { + int magic; /* magic number for this structure */ +@@ -325,7 +325,7 @@ struct tty_driver { + + const struct tty_operations *ops; + struct list_head tty_drivers; +-}; ++} __randomize_layout; + + extern struct list_head tty_drivers; + +diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h +index 00c9d68..bc0188b 100644 +--- a/include/linux/tty_ldisc.h ++++ b/include/linux/tty_ldisc.h +@@ -215,7 +215,7 @@ struct tty_ldisc_ops { + + struct module *owner; + +- int refcount; ++ atomic_t refcount; + }; + + struct tty_ldisc { +diff --git a/include/linux/types.h b/include/linux/types.h +index a0bb704..f511c77 100644 +--- a/include/linux/types.h ++++ b/include/linux/types.h +@@ -177,10 +177,26 @@ typedef struct { + int counter; + } atomic_t; + ++#ifdef CONFIG_PAX_REFCOUNT ++typedef struct { ++ int counter; ++} atomic_unchecked_t; ++#else ++typedef atomic_t atomic_unchecked_t; ++#endif ++ + #ifdef CONFIG_64BIT + typedef struct { + long counter; + } atomic64_t; ++ ++#ifdef CONFIG_PAX_REFCOUNT ++typedef struct { ++ long counter; ++} atomic64_unchecked_t; ++#else ++typedef atomic64_t atomic64_unchecked_t; ++#endif + #endif + + struct list_head { +diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h +index ecd3319..8a36ded 100644 +--- a/include/linux/uaccess.h ++++ b/include/linux/uaccess.h +@@ -75,11 +75,11 @@ static inline unsigned long __copy_from_user_nocache(void *to, + long ret; \ + mm_segment_t old_fs = get_fs(); \ + \ +- set_fs(KERNEL_DS); \ + pagefault_disable(); \ +- ret = __copy_from_user_inatomic(&(retval), (__force typeof(retval) __user *)(addr), sizeof(retval)); \ +- pagefault_enable(); \ ++ set_fs(KERNEL_DS); \ ++ ret = __copy_from_user_inatomic(&(retval), (typeof(retval) __force_user *)(addr), sizeof(retval)); \ + set_fs(old_fs); \ ++ pagefault_enable(); \ + ret; \ + }) + +diff --git a/include/linux/uidgid.h b/include/linux/uidgid.h +index 2d1f9b6..d7a9fce 100644 +--- a/include/linux/uidgid.h ++++ b/include/linux/uidgid.h +@@ -175,4 +175,9 @@ static inline bool kgid_has_mapping(struct user_namespace *ns, kgid_t gid) + + #endif /* CONFIG_USER_NS */ + ++#define GR_GLOBAL_UID(x) from_kuid_munged(&init_user_ns, (x)) ++#define GR_GLOBAL_GID(x) from_kgid_munged(&init_user_ns, (x)) ++#define gr_is_global_root(x) uid_eq((x), GLOBAL_ROOT_UID) ++#define gr_is_global_nonroot(x) (!uid_eq((x), GLOBAL_ROOT_UID)) ++ + #endif /* _LINUX_UIDGID_H */ +diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h +index baa8171..9ca98ba 100644 +--- a/include/linux/uio_driver.h ++++ b/include/linux/uio_driver.h +@@ -67,7 +67,7 @@ struct uio_device { + struct module *owner; + struct device *dev; + int minor; +- atomic_t event; ++ atomic_unchecked_t event; + struct fasync_struct *async_queue; + wait_queue_head_t wait; + struct uio_info *info; +diff --git a/include/linux/unaligned/access_ok.h b/include/linux/unaligned/access_ok.h +index 99c1b4d..562e6f3 100644 +--- a/include/linux/unaligned/access_ok.h ++++ b/include/linux/unaligned/access_ok.h +@@ -4,34 +4,34 @@ + #include <linux/kernel.h> + #include <asm/byteorder.h> + +-static inline u16 get_unaligned_le16(const void *p) ++static inline u16 __intentional_overflow(-1) get_unaligned_le16(const void *p) + { +- return le16_to_cpup((__le16 *)p); ++ return le16_to_cpup((const __le16 *)p); + } + +-static inline u32 get_unaligned_le32(const void *p) ++static inline u32 __intentional_overflow(-1) get_unaligned_le32(const void *p) + { +- return le32_to_cpup((__le32 *)p); ++ return le32_to_cpup((const __le32 *)p); + } + +-static inline u64 get_unaligned_le64(const void *p) ++static inline u64 __intentional_overflow(-1) get_unaligned_le64(const void *p) + { +- return le64_to_cpup((__le64 *)p); ++ return le64_to_cpup((const __le64 *)p); + } + +-static inline u16 get_unaligned_be16(const void *p) ++static inline u16 __intentional_overflow(-1) get_unaligned_be16(const void *p) + { +- return be16_to_cpup((__be16 *)p); ++ return be16_to_cpup((const __be16 *)p); + } + +-static inline u32 get_unaligned_be32(const void *p) ++static inline u32 __intentional_overflow(-1) get_unaligned_be32(const void *p) + { +- return be32_to_cpup((__be32 *)p); ++ return be32_to_cpup((const __be32 *)p); + } + +-static inline u64 get_unaligned_be64(const void *p) ++static inline u64 __intentional_overflow(-1) get_unaligned_be64(const void *p) + { +- return be64_to_cpup((__be64 *)p); ++ return be64_to_cpup((const __be64 *)p); + } + + static inline void put_unaligned_le16(u16 val, void *p) +diff --git a/include/linux/usb.h b/include/linux/usb.h +index 3827bff..f1730fc 100644 +--- a/include/linux/usb.h ++++ b/include/linux/usb.h +@@ -566,7 +566,7 @@ struct usb_device { + int maxchild; + + u32 quirks; +- atomic_t urbnum; ++ atomic_unchecked_t urbnum; + + unsigned long active_duration; + +@@ -1650,7 +1650,7 @@ void usb_buffer_unmap_sg(const struct usb_device *dev, int is_in, + + extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, + __u8 request, __u8 requesttype, __u16 value, __u16 index, +- void *data, __u16 size, int timeout); ++ void *data, __u16 size, int timeout) __intentional_overflow(-1); + extern int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, + void *data, int len, int *actual_length, int timeout); + extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, +diff --git a/include/linux/usb/renesas_usbhs.h b/include/linux/usb/renesas_usbhs.h +index d5952bb..9a626d4 100644 +--- a/include/linux/usb/renesas_usbhs.h ++++ b/include/linux/usb/renesas_usbhs.h +@@ -39,7 +39,7 @@ enum { + */ + struct renesas_usbhs_driver_callback { + int (*notify_hotplug)(struct platform_device *pdev); +-}; ++} __no_const; + + /* + * callback functions for platform +diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h +index 9f3579f..3b2afa5 100644 +--- a/include/linux/user_namespace.h ++++ b/include/linux/user_namespace.h +@@ -38,7 +38,7 @@ struct user_namespace { + struct key *persistent_keyring_register; + struct rw_semaphore persistent_keyring_register_sem; + #endif +-}; ++} __randomize_layout; + + extern struct user_namespace init_user_ns; + +diff --git a/include/linux/utsname.h b/include/linux/utsname.h +index 239e277..22a5cf5 100644 +--- a/include/linux/utsname.h ++++ b/include/linux/utsname.h +@@ -24,7 +24,7 @@ struct uts_namespace { + struct new_utsname name; + struct user_namespace *user_ns; + unsigned int proc_inum; +-}; ++} __randomize_layout; + extern struct uts_namespace init_uts_ns; + + #ifdef CONFIG_UTS_NS +diff --git a/include/linux/vermagic.h b/include/linux/vermagic.h +index 6f8fbcf..4efc177 100644 +--- a/include/linux/vermagic.h ++++ b/include/linux/vermagic.h +@@ -25,9 +25,42 @@ + #define MODULE_ARCH_VERMAGIC "" + #endif + ++#ifdef CONFIG_PAX_REFCOUNT ++#define MODULE_PAX_REFCOUNT "REFCOUNT " ++#else ++#define MODULE_PAX_REFCOUNT "" ++#endif ++ ++#ifdef CONSTIFY_PLUGIN ++#define MODULE_CONSTIFY_PLUGIN "CONSTIFY_PLUGIN " ++#else ++#define MODULE_CONSTIFY_PLUGIN "" ++#endif ++ ++#ifdef STACKLEAK_PLUGIN ++#define MODULE_STACKLEAK_PLUGIN "STACKLEAK_PLUGIN " ++#else ++#define MODULE_STACKLEAK_PLUGIN "" ++#endif ++ ++#ifdef RANDSTRUCT_PLUGIN ++#include <generated/randomize_layout_hash.h> ++#define MODULE_RANDSTRUCT_PLUGIN "RANDSTRUCT_PLUGIN_" RANDSTRUCT_HASHED_SEED ++#else ++#define MODULE_RANDSTRUCT_PLUGIN ++#endif ++ ++#ifdef CONFIG_GRKERNSEC ++#define MODULE_GRSEC "GRSEC " ++#else ++#define MODULE_GRSEC "" ++#endif ++ + #define VERMAGIC_STRING \ + UTS_RELEASE " " \ + MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT \ + MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \ +- MODULE_ARCH_VERMAGIC ++ MODULE_ARCH_VERMAGIC \ ++ MODULE_PAX_REFCOUNT MODULE_CONSTIFY_PLUGIN MODULE_STACKLEAK_PLUGIN \ ++ MODULE_GRSEC MODULE_RANDSTRUCT_PLUGIN + +diff --git a/include/linux/vga_switcheroo.h b/include/linux/vga_switcheroo.h +index b483abd..af305ad 100644 +--- a/include/linux/vga_switcheroo.h ++++ b/include/linux/vga_switcheroo.h +@@ -63,9 +63,9 @@ int vga_switcheroo_get_client_state(struct pci_dev *dev); + + void vga_switcheroo_set_dynamic_switch(struct pci_dev *pdev, enum vga_switcheroo_state dynamic); + +-int vga_switcheroo_init_domain_pm_ops(struct device *dev, struct dev_pm_domain *domain); ++int vga_switcheroo_init_domain_pm_ops(struct device *dev, dev_pm_domain_no_const *domain); + void vga_switcheroo_fini_domain_pm_ops(struct device *dev); +-int vga_switcheroo_init_domain_pm_optimus_hdmi_audio(struct device *dev, struct dev_pm_domain *domain); ++int vga_switcheroo_init_domain_pm_optimus_hdmi_audio(struct device *dev, dev_pm_domain_no_const *domain); + #else + + static inline void vga_switcheroo_unregister_client(struct pci_dev *dev) {} +@@ -82,9 +82,9 @@ static inline int vga_switcheroo_get_client_state(struct pci_dev *dev) { return + + static inline void vga_switcheroo_set_dynamic_switch(struct pci_dev *pdev, enum vga_switcheroo_state dynamic) {} + +-static inline int vga_switcheroo_init_domain_pm_ops(struct device *dev, struct dev_pm_domain *domain) { return -EINVAL; } ++static inline int vga_switcheroo_init_domain_pm_ops(struct device *dev, dev_pm_domain_no_const *domain) { return -EINVAL; } + static inline void vga_switcheroo_fini_domain_pm_ops(struct device *dev) {} +-static inline int vga_switcheroo_init_domain_pm_optimus_hdmi_audio(struct device *dev, struct dev_pm_domain *domain) { return -EINVAL; } ++static inline int vga_switcheroo_init_domain_pm_optimus_hdmi_audio(struct device *dev, dev_pm_domain_no_const *domain) { return -EINVAL; } + + #endif + #endif /* _LINUX_VGA_SWITCHEROO_H_ */ +diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h +index b87696f..1d11de7 100644 +--- a/include/linux/vmalloc.h ++++ b/include/linux/vmalloc.h +@@ -16,6 +16,11 @@ struct vm_area_struct; /* vma defining user mapping in mm_types.h */ + #define VM_USERMAP 0x00000008 /* suitable for remap_vmalloc_range */ + #define VM_VPAGES 0x00000010 /* buffer for pages was vmalloc'ed */ + #define VM_UNINITIALIZED 0x00000020 /* vm_struct is not fully initialized */ ++ ++#if defined(CONFIG_X86) && defined(CONFIG_PAX_KERNEXEC) ++#define VM_KERNEXEC 0x00000040 /* allocate from executable kernel memory range */ ++#endif ++ + /* bits [20..32] reserved for arch specific ioremap internals */ + + /* +@@ -82,6 +87,10 @@ extern void *vmap(struct page **pages, unsigned int count, + unsigned long flags, pgprot_t prot); + extern void vunmap(const void *addr); + ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++extern void unmap_process_stacks(struct task_struct *task); ++#endif ++ + extern int remap_vmalloc_range_partial(struct vm_area_struct *vma, + unsigned long uaddr, void *kaddr, + unsigned long size); +@@ -142,7 +151,7 @@ extern void free_vm_area(struct vm_struct *area); + + /* for /dev/kmem */ + extern long vread(char *buf, char *addr, unsigned long count); +-extern long vwrite(char *buf, char *addr, unsigned long count); ++extern long vwrite(char *buf, char *addr, unsigned long count) __size_overflow(3); + + /* + * Internals. Dont't use.. +diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h +index 82e7db7..f8ce3d0 100644 +--- a/include/linux/vmstat.h ++++ b/include/linux/vmstat.h +@@ -108,18 +108,18 @@ static inline void vm_events_fold_cpu(int cpu) + /* + * Zone based page accounting with per cpu differentials. + */ +-extern atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; ++extern atomic_long_unchecked_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; + + static inline void zone_page_state_add(long x, struct zone *zone, + enum zone_stat_item item) + { +- atomic_long_add(x, &zone->vm_stat[item]); +- atomic_long_add(x, &vm_stat[item]); ++ atomic_long_add_unchecked(x, &zone->vm_stat[item]); ++ atomic_long_add_unchecked(x, &vm_stat[item]); + } + +-static inline unsigned long global_page_state(enum zone_stat_item item) ++static inline unsigned long __intentional_overflow(-1) global_page_state(enum zone_stat_item item) + { +- long x = atomic_long_read(&vm_stat[item]); ++ long x = atomic_long_read_unchecked(&vm_stat[item]); + #ifdef CONFIG_SMP + if (x < 0) + x = 0; +@@ -127,10 +127,10 @@ static inline unsigned long global_page_state(enum zone_stat_item item) + return x; + } + +-static inline unsigned long zone_page_state(struct zone *zone, ++static inline unsigned long __intentional_overflow(-1) zone_page_state(struct zone *zone, + enum zone_stat_item item) + { +- long x = atomic_long_read(&zone->vm_stat[item]); ++ long x = atomic_long_read_unchecked(&zone->vm_stat[item]); + #ifdef CONFIG_SMP + if (x < 0) + x = 0; +@@ -147,7 +147,7 @@ static inline unsigned long zone_page_state(struct zone *zone, + static inline unsigned long zone_page_state_snapshot(struct zone *zone, + enum zone_stat_item item) + { +- long x = atomic_long_read(&zone->vm_stat[item]); ++ long x = atomic_long_read_unchecked(&zone->vm_stat[item]); + + #ifdef CONFIG_SMP + int cpu; +@@ -234,14 +234,14 @@ static inline void __mod_zone_page_state(struct zone *zone, + + static inline void __inc_zone_state(struct zone *zone, enum zone_stat_item item) + { +- atomic_long_inc(&zone->vm_stat[item]); +- atomic_long_inc(&vm_stat[item]); ++ atomic_long_inc_unchecked(&zone->vm_stat[item]); ++ atomic_long_inc_unchecked(&vm_stat[item]); + } + + static inline void __dec_zone_state(struct zone *zone, enum zone_stat_item item) + { +- atomic_long_dec(&zone->vm_stat[item]); +- atomic_long_dec(&vm_stat[item]); ++ atomic_long_dec_unchecked(&zone->vm_stat[item]); ++ atomic_long_dec_unchecked(&vm_stat[item]); + } + + static inline void __inc_zone_page_state(struct page *page, +diff --git a/include/linux/xattr.h b/include/linux/xattr.h +index 91b0a68..0e9adf6 100644 +--- a/include/linux/xattr.h ++++ b/include/linux/xattr.h +@@ -28,7 +28,7 @@ struct xattr_handler { + size_t size, int handler_flags); + int (*set)(struct dentry *dentry, const char *name, const void *buffer, + size_t size, int flags, int handler_flags); +-}; ++} __do_const; + + struct xattr { + const char *name; +@@ -37,6 +37,9 @@ struct xattr { + }; + + ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t); ++#ifdef CONFIG_PAX_XATTR_PAX_FLAGS ++ssize_t pax_getxattr(struct dentry *, void *, size_t); ++#endif + ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t); + ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); + int __vfs_setxattr_noperm(struct dentry *, const char *, const void *, size_t, int); +diff --git a/include/linux/zlib.h b/include/linux/zlib.h +index 92dbbd3..13ab0b3 100644 +--- a/include/linux/zlib.h ++++ b/include/linux/zlib.h +@@ -31,6 +31,7 @@ + #define _ZLIB_H + + #include <linux/zconf.h> ++#include <linux/compiler.h> + + /* zlib deflate based on ZLIB_VERSION "1.1.3" */ + /* zlib inflate based on ZLIB_VERSION "1.2.3" */ +@@ -179,7 +180,7 @@ typedef z_stream *z_streamp; + + /* basic functions */ + +-extern int zlib_deflate_workspacesize (int windowBits, int memLevel); ++extern int zlib_deflate_workspacesize (int windowBits, int memLevel) __intentional_overflow(0); + /* + Returns the number of bytes that needs to be allocated for a per- + stream workspace with the specified parameters. A pointer to this +diff --git a/include/media/v4l2-dev.h b/include/media/v4l2-dev.h +index eb76cfd..9fd0e7c 100644 +--- a/include/media/v4l2-dev.h ++++ b/include/media/v4l2-dev.h +@@ -75,7 +75,7 @@ struct v4l2_file_operations { + int (*mmap) (struct file *, struct vm_area_struct *); + int (*open) (struct file *); + int (*release) (struct file *); +-}; ++} __do_const; + + /* + * Newer version of video_device, handled by videodev2.c +diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h +index ffb69da..040393e 100644 +--- a/include/media/v4l2-device.h ++++ b/include/media/v4l2-device.h +@@ -95,7 +95,7 @@ int __must_check v4l2_device_register(struct device *dev, struct v4l2_device *v4 + this function returns 0. If the name ends with a digit (e.g. cx18), + then the name will be set to cx18-0 since cx180 looks really odd. */ + int v4l2_device_set_name(struct v4l2_device *v4l2_dev, const char *basename, +- atomic_t *instance); ++ atomic_unchecked_t *instance); + + /* Set v4l2_dev->dev to NULL. Call when the USB parent disconnects. + Since the parent disappears this ensures that v4l2_dev doesn't have an +diff --git a/include/net/9p/transport.h b/include/net/9p/transport.h +index 2a25dec..bf6dd8a 100644 +--- a/include/net/9p/transport.h ++++ b/include/net/9p/transport.h +@@ -62,7 +62,7 @@ struct p9_trans_module { + int (*cancelled)(struct p9_client *, struct p9_req_t *req); + int (*zc_request)(struct p9_client *, struct p9_req_t *, + char *, char *, int , int, int, int); +-}; ++} __do_const; + + void v9fs_register_trans(struct p9_trans_module *m); + void v9fs_unregister_trans(struct p9_trans_module *m); +diff --git a/include/net/af_unix.h b/include/net/af_unix.h +index a175ba4..196eb82 100644 +--- a/include/net/af_unix.h ++++ b/include/net/af_unix.h +@@ -36,7 +36,7 @@ struct unix_skb_parms { + u32 secid; /* Security ID */ + #endif + u32 consumed; +-}; ++} __randomize_layout; + + #define UNIXCB(skb) (*(struct unix_skb_parms *)&((skb)->cb)) + #define UNIXSID(skb) (&UNIXCB((skb)).secid) +diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h +index ead99f0..6263c4b 100644 +--- a/include/net/bluetooth/l2cap.h ++++ b/include/net/bluetooth/l2cap.h +@@ -608,7 +608,7 @@ struct l2cap_ops { + unsigned char *kdata, + struct iovec *iov, + int len); +-}; ++} __do_const; + + struct l2cap_conn { + struct hci_conn *hcon; +diff --git a/include/net/caif/cfctrl.h b/include/net/caif/cfctrl.h +index f2ae33d..c457cf0 100644 +--- a/include/net/caif/cfctrl.h ++++ b/include/net/caif/cfctrl.h +@@ -52,7 +52,7 @@ struct cfctrl_rsp { + void (*radioset_rsp)(void); + void (*reject_rsp)(struct cflayer *layer, u8 linkid, + struct cflayer *client_layer); +-}; ++} __no_const; + + /* Link Setup Parameters for CAIF-Links. */ + struct cfctrl_link_param { +@@ -101,8 +101,8 @@ struct cfctrl_request_info { + struct cfctrl { + struct cfsrvl serv; + struct cfctrl_rsp res; +- atomic_t req_seq_no; +- atomic_t rsp_seq_no; ++ atomic_unchecked_t req_seq_no; ++ atomic_unchecked_t rsp_seq_no; + struct list_head list; + /* Protects from simultaneous access to first_req list */ + spinlock_t info_list_lock; +diff --git a/include/net/flow.h b/include/net/flow.h +index 8109a15..504466d 100644 +--- a/include/net/flow.h ++++ b/include/net/flow.h +@@ -231,6 +231,6 @@ void flow_cache_fini(struct net *net); + + void flow_cache_flush(struct net *net); + void flow_cache_flush_deferred(struct net *net); +-extern atomic_t flow_cache_genid; ++extern atomic_unchecked_t flow_cache_genid; + + #endif +diff --git a/include/net/flow_keys.h b/include/net/flow_keys.h +index 7ee2df0..dc8fd81 100644 +--- a/include/net/flow_keys.h ++++ b/include/net/flow_keys.h +@@ -22,9 +22,9 @@ struct flow_keys { + __be32 ports; + __be16 port16[2]; + }; +- u16 thoff; +- u16 n_proto; +- u8 ip_proto; ++ u16 thoff; ++ __be16 n_proto; ++ u8 ip_proto; + }; + + bool __skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow, +diff --git a/include/net/genetlink.h b/include/net/genetlink.h +index af10c2c..a431cc5 100644 +--- a/include/net/genetlink.h ++++ b/include/net/genetlink.h +@@ -120,7 +120,7 @@ struct genl_ops { + u8 cmd; + u8 internal_flags; + u8 flags; +-}; ++} __do_const; + + int __genl_register_family(struct genl_family *family); + +diff --git a/include/net/gro_cells.h b/include/net/gro_cells.h +index 734d9b5..48a9a4b 100644 +--- a/include/net/gro_cells.h ++++ b/include/net/gro_cells.h +@@ -29,7 +29,7 @@ static inline void gro_cells_receive(struct gro_cells *gcells, struct sk_buff *s + cell += skb_get_rx_queue(skb) & gcells->gro_cells_mask; + + if (skb_queue_len(&cell->napi_skbs) > netdev_max_backlog) { +- atomic_long_inc(&dev->rx_dropped); ++ atomic_long_inc_unchecked(&dev->rx_dropped); + kfree_skb(skb); + return; + } +diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h +index 848e85c..051c7de 100644 +--- a/include/net/inet_connection_sock.h ++++ b/include/net/inet_connection_sock.h +@@ -63,7 +63,7 @@ struct inet_connection_sock_af_ops { + int (*bind_conflict)(const struct sock *sk, + const struct inet_bind_bucket *tb, bool relax); + void (*mtu_reduced)(struct sock *sk); +-}; ++} __do_const; + + /** inet_connection_sock - INET connection oriented sock + * +diff --git a/include/net/inetpeer.h b/include/net/inetpeer.h +index 80479ab..0c3f647 100644 +--- a/include/net/inetpeer.h ++++ b/include/net/inetpeer.h +@@ -47,7 +47,7 @@ struct inet_peer { + */ + union { + struct { +- atomic_t rid; /* Frag reception counter */ ++ atomic_unchecked_t rid; /* Frag reception counter */ + }; + struct rcu_head rcu; + struct inet_peer *gc_next; +diff --git a/include/net/ip.h b/include/net/ip.h +index c0c26c3..29f0420 100644 +--- a/include/net/ip.h ++++ b/include/net/ip.h +@@ -317,7 +317,7 @@ static inline unsigned int ip_skb_dst_mtu(const struct sk_buff *skb) + } + } + +-u32 ip_idents_reserve(u32 hash, int segs); ++u32 ip_idents_reserve(u32 hash, int segs) __intentional_overflow(-1); + void __ip_select_ident(struct iphdr *iph, int segs); + + static inline void ip_select_ident_segs(struct sk_buff *skb, struct sock *sk, int segs) +diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h +index dc9d2a2..d985691 100644 +--- a/include/net/ip_fib.h ++++ b/include/net/ip_fib.h +@@ -170,7 +170,7 @@ __be32 fib_info_update_nh_saddr(struct net *net, struct fib_nh *nh); + + #define FIB_RES_SADDR(net, res) \ + ((FIB_RES_NH(res).nh_saddr_genid == \ +- atomic_read(&(net)->ipv4.dev_addr_genid)) ? \ ++ atomic_read_unchecked(&(net)->ipv4.dev_addr_genid)) ? \ + FIB_RES_NH(res).nh_saddr : \ + fib_info_update_nh_saddr((net), &FIB_RES_NH(res))) + #define FIB_RES_GW(res) (FIB_RES_NH(res).nh_gw) +diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h +index 615b20b..fd4cbd8 100644 +--- a/include/net/ip_vs.h ++++ b/include/net/ip_vs.h +@@ -534,7 +534,7 @@ struct ip_vs_conn { + struct ip_vs_conn *control; /* Master control connection */ + atomic_t n_control; /* Number of controlled ones */ + struct ip_vs_dest *dest; /* real server */ +- atomic_t in_pkts; /* incoming packet counter */ ++ atomic_unchecked_t in_pkts; /* incoming packet counter */ + + /* Packet transmitter for different forwarding methods. If it + * mangles the packet, it must return NF_DROP or better NF_STOLEN, +@@ -682,7 +682,7 @@ struct ip_vs_dest { + __be16 port; /* port number of the server */ + union nf_inet_addr addr; /* IP address of the server */ + volatile unsigned int flags; /* dest status flags */ +- atomic_t conn_flags; /* flags to copy to conn */ ++ atomic_unchecked_t conn_flags; /* flags to copy to conn */ + atomic_t weight; /* server weight */ + + atomic_t refcnt; /* reference counter */ +@@ -928,11 +928,11 @@ struct netns_ipvs { + /* ip_vs_lblc */ + int sysctl_lblc_expiration; + struct ctl_table_header *lblc_ctl_header; +- struct ctl_table *lblc_ctl_table; ++ ctl_table_no_const *lblc_ctl_table; + /* ip_vs_lblcr */ + int sysctl_lblcr_expiration; + struct ctl_table_header *lblcr_ctl_header; +- struct ctl_table *lblcr_ctl_table; ++ ctl_table_no_const *lblcr_ctl_table; + /* ip_vs_est */ + struct list_head est_list; /* estimator list */ + spinlock_t est_lock; +diff --git a/include/net/ipv6.h b/include/net/ipv6.h +index 4292929..7e21d2e 100644 +--- a/include/net/ipv6.h ++++ b/include/net/ipv6.h +@@ -708,7 +708,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, + __be32 flowlabel, bool autolabel) + { + if (!flowlabel && (autolabel || net->ipv6.sysctl.auto_flowlabels)) { +- __be32 hash; ++ u32 hash; + + hash = skb_get_hash(skb); + +@@ -718,7 +718,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, + */ + hash ^= hash >> 12; + +- flowlabel = hash & IPV6_FLOWLABEL_MASK; ++ flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK; + } + + return flowlabel; +diff --git a/include/net/irda/ircomm_tty.h b/include/net/irda/ircomm_tty.h +index 8d4f588..2e37ad2 100644 +--- a/include/net/irda/ircomm_tty.h ++++ b/include/net/irda/ircomm_tty.h +@@ -33,6 +33,7 @@ + #include <linux/termios.h> + #include <linux/timer.h> + #include <linux/tty.h> /* struct tty_struct */ ++#include <asm/local.h> + + #include <net/irda/irias_object.h> + #include <net/irda/ircomm_core.h> +diff --git a/include/net/iucv/af_iucv.h b/include/net/iucv/af_iucv.h +index 714cc9a..ea05f3e 100644 +--- a/include/net/iucv/af_iucv.h ++++ b/include/net/iucv/af_iucv.h +@@ -149,7 +149,7 @@ struct iucv_skb_cb { + struct iucv_sock_list { + struct hlist_head head; + rwlock_t lock; +- atomic_t autobind_name; ++ atomic_unchecked_t autobind_name; + }; + + unsigned int iucv_sock_poll(struct file *file, struct socket *sock, +diff --git a/include/net/llc_c_ac.h b/include/net/llc_c_ac.h +index f3be818..bf46196 100644 +--- a/include/net/llc_c_ac.h ++++ b/include/net/llc_c_ac.h +@@ -87,7 +87,7 @@ + #define LLC_CONN_AC_STOP_SENDACK_TMR 70 + #define LLC_CONN_AC_START_SENDACK_TMR_IF_NOT_RUNNING 71 + +-typedef int (*llc_conn_action_t)(struct sock *sk, struct sk_buff *skb); ++typedef int (* const llc_conn_action_t)(struct sock *sk, struct sk_buff *skb); + + int llc_conn_ac_clear_remote_busy(struct sock *sk, struct sk_buff *skb); + int llc_conn_ac_conn_ind(struct sock *sk, struct sk_buff *skb); +diff --git a/include/net/llc_c_ev.h b/include/net/llc_c_ev.h +index 3948cf1..83b28c4 100644 +--- a/include/net/llc_c_ev.h ++++ b/include/net/llc_c_ev.h +@@ -125,8 +125,8 @@ static __inline__ struct llc_conn_state_ev *llc_conn_ev(struct sk_buff *skb) + return (struct llc_conn_state_ev *)skb->cb; + } + +-typedef int (*llc_conn_ev_t)(struct sock *sk, struct sk_buff *skb); +-typedef int (*llc_conn_ev_qfyr_t)(struct sock *sk, struct sk_buff *skb); ++typedef int (* const llc_conn_ev_t)(struct sock *sk, struct sk_buff *skb); ++typedef int (* const llc_conn_ev_qfyr_t)(struct sock *sk, struct sk_buff *skb); + + int llc_conn_ev_conn_req(struct sock *sk, struct sk_buff *skb); + int llc_conn_ev_data_req(struct sock *sk, struct sk_buff *skb); +diff --git a/include/net/llc_c_st.h b/include/net/llc_c_st.h +index 0e79cfb..f46db31 100644 +--- a/include/net/llc_c_st.h ++++ b/include/net/llc_c_st.h +@@ -37,7 +37,7 @@ struct llc_conn_state_trans { + u8 next_state; + llc_conn_ev_qfyr_t *ev_qualifiers; + llc_conn_action_t *ev_actions; +-}; ++} __do_const; + + struct llc_conn_state { + u8 current_state; +diff --git a/include/net/llc_s_ac.h b/include/net/llc_s_ac.h +index a61b98c..aade1eb 100644 +--- a/include/net/llc_s_ac.h ++++ b/include/net/llc_s_ac.h +@@ -23,7 +23,7 @@ + #define SAP_ACT_TEST_IND 9 + + /* All action functions must look like this */ +-typedef int (*llc_sap_action_t)(struct llc_sap *sap, struct sk_buff *skb); ++typedef int (* const llc_sap_action_t)(struct llc_sap *sap, struct sk_buff *skb); + + int llc_sap_action_unitdata_ind(struct llc_sap *sap, struct sk_buff *skb); + int llc_sap_action_send_ui(struct llc_sap *sap, struct sk_buff *skb); +diff --git a/include/net/llc_s_st.h b/include/net/llc_s_st.h +index 567c681..cd73ac02 100644 +--- a/include/net/llc_s_st.h ++++ b/include/net/llc_s_st.h +@@ -20,7 +20,7 @@ struct llc_sap_state_trans { + llc_sap_ev_t ev; + u8 next_state; + llc_sap_action_t *ev_actions; +-}; ++} __do_const; + + struct llc_sap_state { + u8 curr_state; +diff --git a/include/net/mac80211.h b/include/net/mac80211.h +index a9de1da..df72057 100644 +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -4645,7 +4645,7 @@ struct rate_control_ops { + void (*remove_sta_debugfs)(void *priv, void *priv_sta); + + u32 (*get_expected_throughput)(void *priv_sta); +-}; ++} __do_const; + + static inline int rate_supported(struct ieee80211_sta *sta, + enum ieee80211_band band, +diff --git a/include/net/neighbour.h b/include/net/neighbour.h +index f60558d..e5ed9bd 100644 +--- a/include/net/neighbour.h ++++ b/include/net/neighbour.h +@@ -163,7 +163,7 @@ struct neigh_ops { + void (*error_report)(struct neighbour *, struct sk_buff *); + int (*output)(struct neighbour *, struct sk_buff *); + int (*connected_output)(struct neighbour *, struct sk_buff *); +-}; ++} __do_const; + + struct pneigh_entry { + struct pneigh_entry *next; +@@ -217,7 +217,7 @@ struct neigh_table { + struct neigh_statistics __percpu *stats; + struct neigh_hash_table __rcu *nht; + struct pneigh_entry **phash_buckets; +-}; ++} __randomize_layout; + + static inline int neigh_parms_family(struct neigh_parms *p) + { +diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h +index e0d6466..e2f3003 100644 +--- a/include/net/net_namespace.h ++++ b/include/net/net_namespace.h +@@ -129,8 +129,8 @@ struct net { + struct netns_ipvs *ipvs; + #endif + struct sock *diag_nlsk; +- atomic_t fnhe_genid; +-}; ++ atomic_unchecked_t fnhe_genid; ++} __randomize_layout; + + #include <linux/seq_file_net.h> + +@@ -286,7 +286,11 @@ static inline struct net *read_pnet(struct net * const *pnet) + #define __net_init __init + #define __net_exit __exit_refok + #define __net_initdata __initdata ++#ifdef CONSTIFY_PLUGIN + #define __net_initconst __initconst ++#else ++#define __net_initconst __initdata ++#endif + #endif + + struct pernet_operations { +@@ -296,7 +300,7 @@ struct pernet_operations { + void (*exit_batch)(struct list_head *net_exit_list); + int *id; + size_t size; +-}; ++} __do_const; + + /* + * Use these carefully. If you implement a network device and it +@@ -344,12 +348,12 @@ static inline void unregister_net_sysctl_table(struct ctl_table_header *header) + + static inline int rt_genid_ipv4(struct net *net) + { +- return atomic_read(&net->ipv4.rt_genid); ++ return atomic_read_unchecked(&net->ipv4.rt_genid); + } + + static inline void rt_genid_bump_ipv4(struct net *net) + { +- atomic_inc(&net->ipv4.rt_genid); ++ atomic_inc_unchecked(&net->ipv4.rt_genid); + } + + extern void (*__fib6_flush_trees)(struct net *net); +@@ -376,12 +380,12 @@ static inline void rt_genid_bump_all(struct net *net) + + static inline int fnhe_genid(struct net *net) + { +- return atomic_read(&net->fnhe_genid); ++ return atomic_read_unchecked(&net->fnhe_genid); + } + + static inline void fnhe_genid_bump(struct net *net) + { +- atomic_inc(&net->fnhe_genid); ++ atomic_inc_unchecked(&net->fnhe_genid); + } + + #endif /* __NET_NET_NAMESPACE_H */ +diff --git a/include/net/netlink.h b/include/net/netlink.h +index 7b903e1..ad9ca4b 100644 +--- a/include/net/netlink.h ++++ b/include/net/netlink.h +@@ -521,7 +521,7 @@ static inline void *nlmsg_get_pos(struct sk_buff *skb) + static inline void nlmsg_trim(struct sk_buff *skb, const void *mark) + { + if (mark) +- skb_trim(skb, (unsigned char *) mark - skb->data); ++ skb_trim(skb, (const unsigned char *) mark - skb->data); + } + + /** +diff --git a/include/net/netns/conntrack.h b/include/net/netns/conntrack.h +index 29d6a94..235d3d8 100644 +--- a/include/net/netns/conntrack.h ++++ b/include/net/netns/conntrack.h +@@ -14,10 +14,10 @@ struct nf_conntrack_ecache; + struct nf_proto_net { + #ifdef CONFIG_SYSCTL + struct ctl_table_header *ctl_table_header; +- struct ctl_table *ctl_table; ++ ctl_table_no_const *ctl_table; + #ifdef CONFIG_NF_CONNTRACK_PROC_COMPAT + struct ctl_table_header *ctl_compat_header; +- struct ctl_table *ctl_compat_table; ++ ctl_table_no_const *ctl_compat_table; + #endif + #endif + unsigned int users; +@@ -60,7 +60,7 @@ struct nf_ip_net { + struct nf_icmp_net icmpv6; + #if defined(CONFIG_SYSCTL) && defined(CONFIG_NF_CONNTRACK_PROC_COMPAT) + struct ctl_table_header *ctl_table_header; +- struct ctl_table *ctl_table; ++ ctl_table_no_const *ctl_table; + #endif + }; + +diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h +index 0ffef1a..2ce1ceb 100644 +--- a/include/net/netns/ipv4.h ++++ b/include/net/netns/ipv4.h +@@ -84,7 +84,7 @@ struct netns_ipv4 { + + struct ping_group_range ping_group_range; + +- atomic_t dev_addr_genid; ++ atomic_unchecked_t dev_addr_genid; + + #ifdef CONFIG_SYSCTL + unsigned long *sysctl_local_reserved_ports; +@@ -98,6 +98,6 @@ struct netns_ipv4 { + struct fib_rules_ops *mr_rules_ops; + #endif + #endif +- atomic_t rt_genid; ++ atomic_unchecked_t rt_genid; + }; + #endif +diff --git a/include/net/netns/ipv6.h b/include/net/netns/ipv6.h +index 69ae41f..4f94868 100644 +--- a/include/net/netns/ipv6.h ++++ b/include/net/netns/ipv6.h +@@ -75,8 +75,8 @@ struct netns_ipv6 { + struct fib_rules_ops *mr6_rules_ops; + #endif + #endif +- atomic_t dev_addr_genid; +- atomic_t fib6_sernum; ++ atomic_unchecked_t dev_addr_genid; ++ atomic_unchecked_t fib6_sernum; + }; + + #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6) +diff --git a/include/net/netns/xfrm.h b/include/net/netns/xfrm.h +index 9da7982..099321b9 100644 +--- a/include/net/netns/xfrm.h ++++ b/include/net/netns/xfrm.h +@@ -78,7 +78,7 @@ struct netns_xfrm { + + /* flow cache part */ + struct flow_cache flow_cache_global; +- atomic_t flow_cache_genid; ++ atomic_unchecked_t flow_cache_genid; + struct list_head flow_cache_gc_list; + spinlock_t flow_cache_gc_lock; + struct work_struct flow_cache_gc_work; +diff --git a/include/net/ping.h b/include/net/ping.h +index 026479b..d9b2829 100644 +--- a/include/net/ping.h ++++ b/include/net/ping.h +@@ -54,7 +54,7 @@ struct ping_iter_state { + + extern struct proto ping_prot; + #if IS_ENABLED(CONFIG_IPV6) +-extern struct pingv6_ops pingv6_ops; ++extern struct pingv6_ops *pingv6_ops; + #endif + + struct pingfakehdr { +diff --git a/include/net/protocol.h b/include/net/protocol.h +index d6fcc1f..ca277058 100644 +--- a/include/net/protocol.h ++++ b/include/net/protocol.h +@@ -49,7 +49,7 @@ struct net_protocol { + * socket lookup? + */ + icmp_strict_tag_validation:1; +-}; ++} __do_const; + + #if IS_ENABLED(CONFIG_IPV6) + struct inet6_protocol { +@@ -62,7 +62,7 @@ struct inet6_protocol { + u8 type, u8 code, int offset, + __be32 info); + unsigned int flags; /* INET6_PROTO_xxx */ +-}; ++} __do_const; + + #define INET6_PROTO_NOPOLICY 0x1 + #define INET6_PROTO_FINAL 0x2 +diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h +index e21b9f9..0191ef0 100644 +--- a/include/net/rtnetlink.h ++++ b/include/net/rtnetlink.h +@@ -93,7 +93,7 @@ struct rtnl_link_ops { + int (*fill_slave_info)(struct sk_buff *skb, + const struct net_device *dev, + const struct net_device *slave_dev); +-}; ++} __do_const; + + int __rtnl_link_register(struct rtnl_link_ops *ops); + void __rtnl_link_unregister(struct rtnl_link_ops *ops); +diff --git a/include/net/sctp/checksum.h b/include/net/sctp/checksum.h +index 4a5b9a3..ca27d73 100644 +--- a/include/net/sctp/checksum.h ++++ b/include/net/sctp/checksum.h +@@ -61,8 +61,8 @@ static inline __le32 sctp_compute_cksum(const struct sk_buff *skb, + unsigned int offset) + { + struct sctphdr *sh = sctp_hdr(skb); +- __le32 ret, old = sh->checksum; +- const struct skb_checksum_ops ops = { ++ __le32 ret, old = sh->checksum; ++ static const struct skb_checksum_ops ops = { + .update = sctp_csum_update, + .combine = sctp_csum_combine, + }; +diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h +index 72a31db..aaa63d9 100644 +--- a/include/net/sctp/sm.h ++++ b/include/net/sctp/sm.h +@@ -80,7 +80,7 @@ typedef void (sctp_timer_event_t) (unsigned long); + typedef struct { + sctp_state_fn_t *fn; + const char *name; +-} sctp_sm_table_entry_t; ++} __do_const sctp_sm_table_entry_t; + + /* A naming convention of "sctp_sf_xxx" applies to all the state functions + * currently in use. +@@ -292,7 +292,7 @@ __u32 sctp_generate_tag(const struct sctp_endpoint *); + __u32 sctp_generate_tsn(const struct sctp_endpoint *); + + /* Extern declarations for major data structures. */ +-extern sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES]; ++extern sctp_timer_event_t * const sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES]; + + + /* Get the size of a DATA chunk payload. */ +diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h +index 4ff3f67..89ae38e 100644 +--- a/include/net/sctp/structs.h ++++ b/include/net/sctp/structs.h +@@ -509,7 +509,7 @@ struct sctp_pf { + void (*to_sk_saddr)(union sctp_addr *, struct sock *sk); + void (*to_sk_daddr)(union sctp_addr *, struct sock *sk); + struct sctp_af *af; +-}; ++} __do_const; + + + /* Structure to track chunk fragments that have been acked, but peer +diff --git a/include/net/sock.h b/include/net/sock.h +index c8146ed..c5bb49c 100644 +--- a/include/net/sock.h ++++ b/include/net/sock.h +@@ -355,7 +355,7 @@ struct sock { + unsigned int sk_napi_id; + unsigned int sk_ll_usec; + #endif +- atomic_t sk_drops; ++ atomic_unchecked_t sk_drops; + int sk_rcvbuf; + + struct sk_filter __rcu *sk_filter; +@@ -1048,7 +1048,7 @@ struct proto { + void (*destroy_cgroup)(struct mem_cgroup *memcg); + struct cg_proto *(*proto_cgroup)(struct mem_cgroup *memcg); + #endif +-}; ++} __randomize_layout; + + /* + * Bits in struct cg_proto.flags +@@ -1235,7 +1235,7 @@ static inline u64 memcg_memory_allocated_read(struct cg_proto *prot) + return ret >> PAGE_SHIFT; + } + +-static inline long ++static inline long __intentional_overflow(-1) + sk_memory_allocated(const struct sock *sk) + { + struct proto *prot = sk->sk_prot; +@@ -1380,7 +1380,7 @@ struct sock_iocb { + struct scm_cookie *scm; + struct msghdr *msg, async_msg; + struct kiocb *kiocb; +-}; ++} __randomize_layout; + + static inline struct sock_iocb *kiocb_to_siocb(struct kiocb *iocb) + { +@@ -1822,7 +1822,7 @@ static inline void sk_nocaps_add(struct sock *sk, netdev_features_t flags) + } + + static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb, +- char __user *from, char *to, ++ char __user *from, unsigned char *to, + int copy, int offset) + { + if (skb->ip_summed == CHECKSUM_NONE) { +@@ -2094,7 +2094,7 @@ static inline void sk_stream_moderate_sndbuf(struct sock *sk) + } + } + +-struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp); ++struct sk_buff * __intentional_overflow(0) sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp); + + /** + * sk_page_frag - return an appropriate page_frag +diff --git a/include/net/tcp.h b/include/net/tcp.h +index 4062b4f..9ff45e7 100644 +--- a/include/net/tcp.h ++++ b/include/net/tcp.h +@@ -519,7 +519,7 @@ void tcp_retransmit_timer(struct sock *sk); + void tcp_xmit_retransmit_queue(struct sock *); + void tcp_simple_retransmit(struct sock *); + int tcp_trim_head(struct sock *, struct sk_buff *, u32); +-int tcp_fragment(struct sock *, struct sk_buff *, u32, unsigned int, gfp_t); ++int __intentional_overflow(3) tcp_fragment(struct sock *, struct sk_buff *, u32, unsigned int, gfp_t); + + void tcp_send_probe0(struct sock *); + void tcp_send_partial(struct sock *); +@@ -692,8 +692,8 @@ static inline u32 tcp_skb_timestamp(const struct sk_buff *skb) + * If this grows please adjust skbuff.h:skbuff->cb[xxx] size appropriately. + */ + struct tcp_skb_cb { +- __u32 seq; /* Starting sequence number */ +- __u32 end_seq; /* SEQ + FIN + SYN + datalen */ ++ __u32 seq __intentional_overflow(0); /* Starting sequence number */ ++ __u32 end_seq __intentional_overflow(0); /* SEQ + FIN + SYN + datalen */ + union { + /* Note : tcp_tw_isn is used in input path only + * (isn chosen by tcp_timewait_state_process()) +@@ -718,7 +718,7 @@ struct tcp_skb_cb { + + __u8 ip_dsfield; /* IPv4 tos or IPv6 dsfield */ + /* 1 byte hole */ +- __u32 ack_seq; /* Sequence number ACK'd */ ++ __u32 ack_seq __intentional_overflow(0); /* Sequence number ACK'd */ + union { + struct inet_skb_parm h4; + #if IS_ENABLED(CONFIG_IPV6) +diff --git a/include/net/xfrm.h b/include/net/xfrm.h +index dc4865e..152ee4c 100644 +--- a/include/net/xfrm.h ++++ b/include/net/xfrm.h +@@ -285,7 +285,6 @@ struct xfrm_dst; + struct xfrm_policy_afinfo { + unsigned short family; + struct dst_ops *dst_ops; +- void (*garbage_collect)(struct net *net); + struct dst_entry *(*dst_lookup)(struct net *net, int tos, + const xfrm_address_t *saddr, + const xfrm_address_t *daddr); +@@ -303,7 +302,7 @@ struct xfrm_policy_afinfo { + struct net_device *dev, + const struct flowi *fl); + struct dst_entry *(*blackhole_route)(struct net *net, struct dst_entry *orig); +-}; ++} __do_const; + + int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); + int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo); +@@ -342,7 +341,7 @@ struct xfrm_state_afinfo { + int (*transport_finish)(struct sk_buff *skb, + int async); + void (*local_error)(struct sk_buff *skb, u32 mtu); +-}; ++} __do_const; + + int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo); + int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo); +@@ -437,7 +436,7 @@ struct xfrm_mode { + struct module *owner; + unsigned int encap; + int flags; +-}; ++} __do_const; + + /* Flags for xfrm_mode. */ + enum { +@@ -534,7 +533,7 @@ struct xfrm_policy { + struct timer_list timer; + + struct flow_cache_object flo; +- atomic_t genid; ++ atomic_unchecked_t genid; + u32 priority; + u32 index; + struct xfrm_mark mark; +@@ -1167,6 +1166,7 @@ static inline void xfrm_sk_free_policy(struct sock *sk) + } + + void xfrm_garbage_collect(struct net *net); ++void xfrm_garbage_collect_deferred(struct net *net); + + #else + +@@ -1205,6 +1205,9 @@ static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir, + static inline void xfrm_garbage_collect(struct net *net) + { + } ++static inline void xfrm_garbage_collect_deferred(struct net *net) ++{ ++} + #endif + + static __inline__ +diff --git a/include/rdma/iw_cm.h b/include/rdma/iw_cm.h +index 1017e0b..227aa4d 100644 +--- a/include/rdma/iw_cm.h ++++ b/include/rdma/iw_cm.h +@@ -122,7 +122,7 @@ struct iw_cm_verbs { + int backlog); + + int (*destroy_listen)(struct iw_cm_id *cm_id); +-}; ++} __no_const; + + /** + * iw_create_cm_id - Create an IW CM identifier. +diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h +index 52beadf..598734c 100644 +--- a/include/scsi/libfc.h ++++ b/include/scsi/libfc.h +@@ -771,6 +771,7 @@ struct libfc_function_template { + */ + void (*disc_stop_final) (struct fc_lport *); + }; ++typedef struct libfc_function_template __no_const libfc_function_template_no_const; + + /** + * struct fc_disc - Discovery context +@@ -875,7 +876,7 @@ struct fc_lport { + struct fc_vport *vport; + + /* Operational Information */ +- struct libfc_function_template tt; ++ libfc_function_template_no_const tt; + u8 link_up; + u8 qfull; + enum fc_lport_state state; +diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h +index 27ecee7..5f42632 100644 +--- a/include/scsi/scsi_device.h ++++ b/include/scsi/scsi_device.h +@@ -186,9 +186,9 @@ struct scsi_device { + unsigned int max_device_blocked; /* what device_blocked counts down from */ + #define SCSI_DEFAULT_DEVICE_BLOCKED 3 + +- atomic_t iorequest_cnt; +- atomic_t iodone_cnt; +- atomic_t ioerr_cnt; ++ atomic_unchecked_t iorequest_cnt; ++ atomic_unchecked_t iodone_cnt; ++ atomic_unchecked_t ioerr_cnt; + + struct device sdev_gendev, + sdev_dev; +diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h +index 007a0bc..7188db8 100644 +--- a/include/scsi/scsi_transport_fc.h ++++ b/include/scsi/scsi_transport_fc.h +@@ -756,7 +756,8 @@ struct fc_function_template { + unsigned long show_host_system_hostname:1; + + unsigned long disable_target_scan:1; +-}; ++} __do_const; ++typedef struct fc_function_template __no_const fc_function_template_no_const; + + + /** +diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h +index ae6c3b8..fd748ac 100644 +--- a/include/sound/compress_driver.h ++++ b/include/sound/compress_driver.h +@@ -128,7 +128,7 @@ struct snd_compr_ops { + struct snd_compr_caps *caps); + int (*get_codec_caps) (struct snd_compr_stream *stream, + struct snd_compr_codec_caps *codec); +-}; ++} __no_const; + + /** + * struct snd_compr: Compressed device +diff --git a/include/sound/soc.h b/include/sound/soc.h +index 7ba7130..d46594d 100644 +--- a/include/sound/soc.h ++++ b/include/sound/soc.h +@@ -853,7 +853,7 @@ struct snd_soc_codec_driver { + enum snd_soc_dapm_type, int); + + bool ignore_pmdown_time; /* Doesn't benefit from pmdown delay */ +-}; ++} __do_const; + + /* SoC platform interface */ + struct snd_soc_platform_driver { +@@ -882,7 +882,7 @@ struct snd_soc_platform_driver { + const struct snd_compr_ops *compr_ops; + + int (*bespoke_trigger)(struct snd_pcm_substream *, int); +-}; ++} __do_const; + + struct snd_soc_dai_link_component { + const char *name; +diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h +index 1fbd69c..f7943dc 100644 +--- a/include/target/target_core_base.h ++++ b/include/target/target_core_base.h +@@ -764,7 +764,7 @@ struct se_device { + atomic_long_t write_bytes; + /* Active commands on this virtual SE device */ + atomic_t simple_cmds; +- atomic_t dev_ordered_id; ++ atomic_unchecked_t dev_ordered_id; + atomic_t dev_ordered_sync; + atomic_t dev_qf_count; + int export_count; +diff --git a/include/trace/events/fs.h b/include/trace/events/fs.h +new file mode 100644 +index 0000000..fb634b7 +--- /dev/null ++++ b/include/trace/events/fs.h +@@ -0,0 +1,53 @@ ++#undef TRACE_SYSTEM ++#define TRACE_SYSTEM fs ++ ++#if !defined(_TRACE_FS_H) || defined(TRACE_HEADER_MULTI_READ) ++#define _TRACE_FS_H ++ ++#include <linux/fs.h> ++#include <linux/tracepoint.h> ++ ++TRACE_EVENT(do_sys_open, ++ ++ TP_PROTO(const char *filename, int flags, int mode), ++ ++ TP_ARGS(filename, flags, mode), ++ ++ TP_STRUCT__entry( ++ __string( filename, filename ) ++ __field( int, flags ) ++ __field( int, mode ) ++ ), ++ ++ TP_fast_assign( ++ __assign_str(filename, filename); ++ __entry->flags = flags; ++ __entry->mode = mode; ++ ), ++ ++ TP_printk("\"%s\" %x %o", ++ __get_str(filename), __entry->flags, __entry->mode) ++); ++ ++TRACE_EVENT(open_exec, ++ ++ TP_PROTO(const char *filename), ++ ++ TP_ARGS(filename), ++ ++ TP_STRUCT__entry( ++ __string( filename, filename ) ++ ), ++ ++ TP_fast_assign( ++ __assign_str(filename, filename); ++ ), ++ ++ TP_printk("\"%s\"", ++ __get_str(filename)) ++); ++ ++#endif /* _TRACE_FS_H */ ++ ++/* This part must be outside protection */ ++#include <trace/define_trace.h> +diff --git a/include/trace/events/irq.h b/include/trace/events/irq.h +index 3608beb..df39d8a 100644 +--- a/include/trace/events/irq.h ++++ b/include/trace/events/irq.h +@@ -36,7 +36,7 @@ struct softirq_action; + */ + TRACE_EVENT(irq_handler_entry, + +- TP_PROTO(int irq, struct irqaction *action), ++ TP_PROTO(int irq, const struct irqaction *action), + + TP_ARGS(irq, action), + +@@ -66,7 +66,7 @@ TRACE_EVENT(irq_handler_entry, + */ + TRACE_EVENT(irq_handler_exit, + +- TP_PROTO(int irq, struct irqaction *action, int ret), ++ TP_PROTO(int irq, const struct irqaction *action, int ret), + + TP_ARGS(irq, action, ret), + +diff --git a/include/uapi/linux/a.out.h b/include/uapi/linux/a.out.h +index 7caf44c..23c6f27 100644 +--- a/include/uapi/linux/a.out.h ++++ b/include/uapi/linux/a.out.h +@@ -39,6 +39,14 @@ enum machine_type { + M_MIPS2 = 152 /* MIPS R6000/R4000 binary */ + }; + ++/* Constants for the N_FLAGS field */ ++#define F_PAX_PAGEEXEC 1 /* Paging based non-executable pages */ ++#define F_PAX_EMUTRAMP 2 /* Emulate trampolines */ ++#define F_PAX_MPROTECT 4 /* Restrict mprotect() */ ++#define F_PAX_RANDMMAP 8 /* Randomize mmap() base */ ++/*#define F_PAX_RANDEXEC 16*/ /* Randomize ET_EXEC base */ ++#define F_PAX_SEGMEXEC 32 /* Segmentation based non-executable pages */ ++ + #if !defined (N_MAGIC) + #define N_MAGIC(exec) ((exec).a_info & 0xffff) + #endif +diff --git a/include/uapi/linux/bcache.h b/include/uapi/linux/bcache.h +index 22b6ad3..aeba37e 100644 +--- a/include/uapi/linux/bcache.h ++++ b/include/uapi/linux/bcache.h +@@ -5,6 +5,7 @@ + * Bcache on disk data structures + */ + ++#include <linux/compiler.h> + #include <asm/types.h> + + #define BITMASK(name, type, field, offset, size) \ +@@ -20,8 +21,8 @@ static inline void SET_##name(type *k, __u64 v) \ + /* Btree keys - all units are in sectors */ + + struct bkey { +- __u64 high; +- __u64 low; ++ __u64 high __intentional_overflow(-1); ++ __u64 low __intentional_overflow(-1); + __u64 ptr[]; + }; + +diff --git a/include/uapi/linux/byteorder/little_endian.h b/include/uapi/linux/byteorder/little_endian.h +index d876736..ccce5c0 100644 +--- a/include/uapi/linux/byteorder/little_endian.h ++++ b/include/uapi/linux/byteorder/little_endian.h +@@ -42,51 +42,51 @@ + + static inline __le64 __cpu_to_le64p(const __u64 *p) + { +- return (__force __le64)*p; ++ return (__force const __le64)*p; + } +-static inline __u64 __le64_to_cpup(const __le64 *p) ++static inline __u64 __intentional_overflow(-1) __le64_to_cpup(const __le64 *p) + { +- return (__force __u64)*p; ++ return (__force const __u64)*p; + } + static inline __le32 __cpu_to_le32p(const __u32 *p) + { +- return (__force __le32)*p; ++ return (__force const __le32)*p; + } + static inline __u32 __le32_to_cpup(const __le32 *p) + { +- return (__force __u32)*p; ++ return (__force const __u32)*p; + } + static inline __le16 __cpu_to_le16p(const __u16 *p) + { +- return (__force __le16)*p; ++ return (__force const __le16)*p; + } + static inline __u16 __le16_to_cpup(const __le16 *p) + { +- return (__force __u16)*p; ++ return (__force const __u16)*p; + } + static inline __be64 __cpu_to_be64p(const __u64 *p) + { +- return (__force __be64)__swab64p(p); ++ return (__force const __be64)__swab64p(p); + } + static inline __u64 __be64_to_cpup(const __be64 *p) + { +- return __swab64p((__u64 *)p); ++ return __swab64p((const __u64 *)p); + } + static inline __be32 __cpu_to_be32p(const __u32 *p) + { +- return (__force __be32)__swab32p(p); ++ return (__force const __be32)__swab32p(p); + } +-static inline __u32 __be32_to_cpup(const __be32 *p) ++static inline __u32 __intentional_overflow(-1) __be32_to_cpup(const __be32 *p) + { +- return __swab32p((__u32 *)p); ++ return __swab32p((const __u32 *)p); + } + static inline __be16 __cpu_to_be16p(const __u16 *p) + { +- return (__force __be16)__swab16p(p); ++ return (__force const __be16)__swab16p(p); + } + static inline __u16 __be16_to_cpup(const __be16 *p) + { +- return __swab16p((__u16 *)p); ++ return __swab16p((const __u16 *)p); + } + #define __cpu_to_le64s(x) do { (void)(x); } while (0) + #define __le64_to_cpus(x) do { (void)(x); } while (0) +diff --git a/include/uapi/linux/elf.h b/include/uapi/linux/elf.h +index ea9bf25..5140c61 100644 +--- a/include/uapi/linux/elf.h ++++ b/include/uapi/linux/elf.h +@@ -37,6 +37,17 @@ typedef __s64 Elf64_Sxword; + #define PT_GNU_EH_FRAME 0x6474e550 + + #define PT_GNU_STACK (PT_LOOS + 0x474e551) ++#define PT_GNU_RELRO (PT_LOOS + 0x474e552) ++ ++#define PT_PAX_FLAGS (PT_LOOS + 0x5041580) ++ ++/* Constants for the e_flags field */ ++#define EF_PAX_PAGEEXEC 1 /* Paging based non-executable pages */ ++#define EF_PAX_EMUTRAMP 2 /* Emulate trampolines */ ++#define EF_PAX_MPROTECT 4 /* Restrict mprotect() */ ++#define EF_PAX_RANDMMAP 8 /* Randomize mmap() base */ ++/*#define EF_PAX_RANDEXEC 16*/ /* Randomize ET_EXEC base */ ++#define EF_PAX_SEGMEXEC 32 /* Segmentation based non-executable pages */ + + /* + * Extended Numbering +@@ -94,6 +105,8 @@ typedef __s64 Elf64_Sxword; + #define DT_DEBUG 21 + #define DT_TEXTREL 22 + #define DT_JMPREL 23 ++#define DT_FLAGS 30 ++ #define DF_TEXTREL 0x00000004 + #define DT_ENCODING 32 + #define OLD_DT_LOOS 0x60000000 + #define DT_LOOS 0x6000000d +@@ -240,6 +253,19 @@ typedef struct elf64_hdr { + #define PF_W 0x2 + #define PF_X 0x1 + ++#define PF_PAGEEXEC (1U << 4) /* Enable PAGEEXEC */ ++#define PF_NOPAGEEXEC (1U << 5) /* Disable PAGEEXEC */ ++#define PF_SEGMEXEC (1U << 6) /* Enable SEGMEXEC */ ++#define PF_NOSEGMEXEC (1U << 7) /* Disable SEGMEXEC */ ++#define PF_MPROTECT (1U << 8) /* Enable MPROTECT */ ++#define PF_NOMPROTECT (1U << 9) /* Disable MPROTECT */ ++/*#define PF_RANDEXEC (1U << 10)*/ /* Enable RANDEXEC */ ++/*#define PF_NORANDEXEC (1U << 11)*/ /* Disable RANDEXEC */ ++#define PF_EMUTRAMP (1U << 12) /* Enable EMUTRAMP */ ++#define PF_NOEMUTRAMP (1U << 13) /* Disable EMUTRAMP */ ++#define PF_RANDMMAP (1U << 14) /* Enable RANDMMAP */ ++#define PF_NORANDMMAP (1U << 15) /* Disable RANDMMAP */ ++ + typedef struct elf32_phdr{ + Elf32_Word p_type; + Elf32_Off p_offset; +@@ -332,6 +358,8 @@ typedef struct elf64_shdr { + #define EI_OSABI 7 + #define EI_PAD 8 + ++#define EI_PAX 14 ++ + #define ELFMAG0 0x7f /* EI_MAG */ + #define ELFMAG1 'E' + #define ELFMAG2 'L' +diff --git a/include/uapi/linux/netfilter/xt_connlimit.h b/include/uapi/linux/netfilter/xt_connlimit.h +index f165609..d1366f0 100644 +--- a/include/uapi/linux/netfilter/xt_connlimit.h ++++ b/include/uapi/linux/netfilter/xt_connlimit.h +@@ -22,8 +22,13 @@ struct xt_connlimit_info { + #endif + }; + unsigned int limit; +- /* revision 1 */ +- __u32 flags; ++ union { ++ /* revision 0 */ ++ unsigned int inverse; ++ ++ /* revision 1 */ ++ __u32 flags; ++ }; + + /* Used internally by the kernel */ + struct xt_connlimit_data *data __attribute__((aligned(8))); +diff --git a/include/uapi/linux/personality.h b/include/uapi/linux/personality.h +index aa169c4..6a2771d 100644 +--- a/include/uapi/linux/personality.h ++++ b/include/uapi/linux/personality.h +@@ -30,6 +30,7 @@ enum { + #define PER_CLEAR_ON_SETID (READ_IMPLIES_EXEC | \ + ADDR_NO_RANDOMIZE | \ + ADDR_COMPAT_LAYOUT | \ ++ ADDR_LIMIT_3GB | \ + MMAP_PAGE_ZERO) + + /* +diff --git a/include/uapi/linux/screen_info.h b/include/uapi/linux/screen_info.h +index 7530e74..e714828 100644 +--- a/include/uapi/linux/screen_info.h ++++ b/include/uapi/linux/screen_info.h +@@ -43,7 +43,8 @@ struct screen_info { + __u16 pages; /* 0x32 */ + __u16 vesa_attributes; /* 0x34 */ + __u32 capabilities; /* 0x36 */ +- __u8 _reserved[6]; /* 0x3a */ ++ __u16 vesapm_size; /* 0x3a */ ++ __u8 _reserved[4]; /* 0x3c */ + } __attribute__((packed)); + + #define VIDEO_TYPE_MDA 0x10 /* Monochrome Text Display */ +diff --git a/include/uapi/linux/swab.h b/include/uapi/linux/swab.h +index 0e011eb..82681b1 100644 +--- a/include/uapi/linux/swab.h ++++ b/include/uapi/linux/swab.h +@@ -43,7 +43,7 @@ + * ___swab16, ___swab32, ___swab64, ___swahw32, ___swahb32 + */ + +-static inline __attribute_const__ __u16 __fswab16(__u16 val) ++static inline __intentional_overflow(-1) __attribute_const__ __u16 __fswab16(__u16 val) + { + #ifdef __HAVE_BUILTIN_BSWAP16__ + return __builtin_bswap16(val); +@@ -54,7 +54,7 @@ static inline __attribute_const__ __u16 __fswab16(__u16 val) + #endif + } + +-static inline __attribute_const__ __u32 __fswab32(__u32 val) ++static inline __intentional_overflow(-1) __attribute_const__ __u32 __fswab32(__u32 val) + { + #ifdef __HAVE_BUILTIN_BSWAP32__ + return __builtin_bswap32(val); +@@ -65,7 +65,7 @@ static inline __attribute_const__ __u32 __fswab32(__u32 val) + #endif + } + +-static inline __attribute_const__ __u64 __fswab64(__u64 val) ++static inline __intentional_overflow(-1) __attribute_const__ __u64 __fswab64(__u64 val) + { + #ifdef __HAVE_BUILTIN_BSWAP64__ + return __builtin_bswap64(val); +diff --git a/include/uapi/linux/sysctl.h b/include/uapi/linux/sysctl.h +index 43aaba1..1c30b48 100644 +--- a/include/uapi/linux/sysctl.h ++++ b/include/uapi/linux/sysctl.h +@@ -155,8 +155,6 @@ enum + KERN_PANIC_ON_NMI=76, /* int: whether we will panic on an unrecovered */ + }; + +- +- + /* CTL_VM names: */ + enum + { +diff --git a/include/uapi/linux/xattr.h b/include/uapi/linux/xattr.h +index 1590c49..5eab462 100644 +--- a/include/uapi/linux/xattr.h ++++ b/include/uapi/linux/xattr.h +@@ -73,5 +73,9 @@ + #define XATTR_POSIX_ACL_DEFAULT "posix_acl_default" + #define XATTR_NAME_POSIX_ACL_DEFAULT XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_DEFAULT + ++/* User namespace */ ++#define XATTR_PAX_PREFIX XATTR_USER_PREFIX "pax." ++#define XATTR_PAX_FLAGS_SUFFIX "flags" ++#define XATTR_NAME_PAX_FLAGS XATTR_PAX_PREFIX XATTR_PAX_FLAGS_SUFFIX + + #endif /* _UAPI_LINUX_XATTR_H */ +diff --git a/include/video/udlfb.h b/include/video/udlfb.h +index f9466fa..f4e2b81 100644 +--- a/include/video/udlfb.h ++++ b/include/video/udlfb.h +@@ -53,10 +53,10 @@ struct dlfb_data { + u32 pseudo_palette[256]; + int blank_mode; /*one of FB_BLANK_ */ + /* blit-only rendering path metrics, exposed through sysfs */ +- atomic_t bytes_rendered; /* raw pixel-bytes driver asked to render */ +- atomic_t bytes_identical; /* saved effort with backbuffer comparison */ +- atomic_t bytes_sent; /* to usb, after compression including overhead */ +- atomic_t cpu_kcycles_used; /* transpired during pixel processing */ ++ atomic_unchecked_t bytes_rendered; /* raw pixel-bytes driver asked to render */ ++ atomic_unchecked_t bytes_identical; /* saved effort with backbuffer comparison */ ++ atomic_unchecked_t bytes_sent; /* to usb, after compression including overhead */ ++ atomic_unchecked_t cpu_kcycles_used; /* transpired during pixel processing */ + }; + + #define NR_USB_REQUEST_I2C_SUB_IO 0x02 +diff --git a/include/video/uvesafb.h b/include/video/uvesafb.h +index 30f5362..8ed8ac9 100644 +--- a/include/video/uvesafb.h ++++ b/include/video/uvesafb.h +@@ -122,6 +122,7 @@ struct uvesafb_par { + u8 ypan; /* 0 - nothing, 1 - ypan, 2 - ywrap */ + u8 pmi_setpal; /* PMI for palette changes */ + u16 *pmi_base; /* protected mode interface location */ ++ u8 *pmi_code; /* protected mode code location */ + void *pmi_start; + void *pmi_pal; + u8 *vbe_state_orig; /* +diff --git a/init/Kconfig b/init/Kconfig +index 2081a4d..98d1149 100644 +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -1150,6 +1150,7 @@ endif # CGROUPS + + config CHECKPOINT_RESTORE + bool "Checkpoint/restore support" if EXPERT ++ depends on !GRKERNSEC + default n + help + Enables additional kernel features in a sake of checkpoint/restore. +@@ -1659,7 +1660,7 @@ config SLUB_DEBUG + + config COMPAT_BRK + bool "Disable heap randomization" +- default y ++ default n + help + Randomizing heap placement makes heap exploits harder, but it + also breaks ancient binaries (including anything libc5 based). +@@ -1990,7 +1991,7 @@ config INIT_ALL_POSSIBLE + config STOP_MACHINE + bool + default y +- depends on (SMP && MODULE_UNLOAD) || HOTPLUG_CPU ++ depends on (SMP && MODULE_UNLOAD) || HOTPLUG_CPU || GRKERNSEC + help + Need stop_machine() primitive. + +diff --git a/init/Makefile b/init/Makefile +index 7bc47ee..6da2dc7 100644 +--- a/init/Makefile ++++ b/init/Makefile +@@ -2,6 +2,9 @@ + # Makefile for the linux kernel. + # + ++ccflags-y := $(GCC_PLUGINS_CFLAGS) ++asflags-y := $(GCC_PLUGINS_AFLAGS) ++ + obj-y := main.o version.o mounts.o + ifneq ($(CONFIG_BLK_DEV_INITRD),y) + obj-y += noinitramfs.o +diff --git a/init/do_mounts.c b/init/do_mounts.c +index 9b3565c..3f90cf9 100644 +--- a/init/do_mounts.c ++++ b/init/do_mounts.c +@@ -360,11 +360,11 @@ static void __init get_fs_names(char *page) + static int __init do_mount_root(char *name, char *fs, int flags, void *data) + { + struct super_block *s; +- int err = sys_mount(name, "/root", fs, flags, data); ++ int err = sys_mount((char __force_user *)name, (char __force_user *)"/root", (char __force_user *)fs, flags, (void __force_user *)data); + if (err) + return err; + +- sys_chdir("/root"); ++ sys_chdir((const char __force_user *)"/root"); + s = current->fs->pwd.dentry->d_sb; + ROOT_DEV = s->s_dev; + printk(KERN_INFO +@@ -485,18 +485,18 @@ void __init change_floppy(char *fmt, ...) + va_start(args, fmt); + vsprintf(buf, fmt, args); + va_end(args); +- fd = sys_open("/dev/root", O_RDWR | O_NDELAY, 0); ++ fd = sys_open((char __user *)"/dev/root", O_RDWR | O_NDELAY, 0); + if (fd >= 0) { + sys_ioctl(fd, FDEJECT, 0); + sys_close(fd); + } + printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf); +- fd = sys_open("/dev/console", O_RDWR, 0); ++ fd = sys_open((__force const char __user *)"/dev/console", O_RDWR, 0); + if (fd >= 0) { + sys_ioctl(fd, TCGETS, (long)&termios); + termios.c_lflag &= ~ICANON; + sys_ioctl(fd, TCSETSF, (long)&termios); +- sys_read(fd, &c, 1); ++ sys_read(fd, (char __user *)&c, 1); + termios.c_lflag |= ICANON; + sys_ioctl(fd, TCSETSF, (long)&termios); + sys_close(fd); +@@ -590,8 +590,8 @@ void __init prepare_namespace(void) + mount_root(); + out: + devtmpfs_mount("dev"); +- sys_mount(".", "/", NULL, MS_MOVE, NULL); +- sys_chroot("."); ++ sys_mount((char __force_user *)".", (char __force_user *)"/", NULL, MS_MOVE, NULL); ++ sys_chroot((const char __force_user *)"."); + } + + static bool is_tmpfs; +diff --git a/init/do_mounts.h b/init/do_mounts.h +index f5b978a..69dbfe8 100644 +--- a/init/do_mounts.h ++++ b/init/do_mounts.h +@@ -15,15 +15,15 @@ extern int root_mountflags; + + static inline int create_dev(char *name, dev_t dev) + { +- sys_unlink(name); +- return sys_mknod(name, S_IFBLK|0600, new_encode_dev(dev)); ++ sys_unlink((char __force_user *)name); ++ return sys_mknod((char __force_user *)name, S_IFBLK|0600, new_encode_dev(dev)); + } + + #if BITS_PER_LONG == 32 + static inline u32 bstat(char *name) + { + struct stat64 stat; +- if (sys_stat64(name, &stat) != 0) ++ if (sys_stat64((char __force_user *)name, (struct stat64 __force_user *)&stat) != 0) + return 0; + if (!S_ISBLK(stat.st_mode)) + return 0; +@@ -35,7 +35,7 @@ static inline u32 bstat(char *name) + static inline u32 bstat(char *name) + { + struct stat stat; +- if (sys_newstat(name, &stat) != 0) ++ if (sys_newstat((const char __force_user *)name, (struct stat __force_user *)&stat) != 0) + return 0; + if (!S_ISBLK(stat.st_mode)) + return 0; +diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c +index 3e0878e..8a9d7a0 100644 +--- a/init/do_mounts_initrd.c ++++ b/init/do_mounts_initrd.c +@@ -37,13 +37,13 @@ static int init_linuxrc(struct subprocess_info *info, struct cred *new) + { + sys_unshare(CLONE_FS | CLONE_FILES); + /* stdin/stdout/stderr for /linuxrc */ +- sys_open("/dev/console", O_RDWR, 0); ++ sys_open((const char __force_user *)"/dev/console", O_RDWR, 0); + sys_dup(0); + sys_dup(0); + /* move initrd over / and chdir/chroot in initrd root */ +- sys_chdir("/root"); +- sys_mount(".", "/", NULL, MS_MOVE, NULL); +- sys_chroot("."); ++ sys_chdir((const char __force_user *)"/root"); ++ sys_mount((char __force_user *)".", (char __force_user *)"/", NULL, MS_MOVE, NULL); ++ sys_chroot((const char __force_user *)"."); + sys_setsid(); + return 0; + } +@@ -59,8 +59,8 @@ static void __init handle_initrd(void) + create_dev("/dev/root.old", Root_RAM0); + /* mount initrd on rootfs' /root */ + mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY); +- sys_mkdir("/old", 0700); +- sys_chdir("/old"); ++ sys_mkdir((const char __force_user *)"/old", 0700); ++ sys_chdir((const char __force_user *)"/old"); + + /* try loading default modules from initrd */ + load_default_modules(); +@@ -80,31 +80,31 @@ static void __init handle_initrd(void) + current->flags &= ~PF_FREEZER_SKIP; + + /* move initrd to rootfs' /old */ +- sys_mount("..", ".", NULL, MS_MOVE, NULL); ++ sys_mount((char __force_user *)"..", (char __force_user *)".", NULL, MS_MOVE, NULL); + /* switch root and cwd back to / of rootfs */ +- sys_chroot(".."); ++ sys_chroot((const char __force_user *)".."); + + if (new_decode_dev(real_root_dev) == Root_RAM0) { +- sys_chdir("/old"); ++ sys_chdir((const char __force_user *)"/old"); + return; + } + +- sys_chdir("/"); ++ sys_chdir((const char __force_user *)"/"); + ROOT_DEV = new_decode_dev(real_root_dev); + mount_root(); + + printk(KERN_NOTICE "Trying to move old root to /initrd ... "); +- error = sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL); ++ error = sys_mount((char __force_user *)"/old", (char __force_user *)"/root/initrd", NULL, MS_MOVE, NULL); + if (!error) + printk("okay\n"); + else { +- int fd = sys_open("/dev/root.old", O_RDWR, 0); ++ int fd = sys_open((const char __force_user *)"/dev/root.old", O_RDWR, 0); + if (error == -ENOENT) + printk("/initrd does not exist. Ignored.\n"); + else + printk("failed\n"); + printk(KERN_NOTICE "Unmounting old root\n"); +- sys_umount("/old", MNT_DETACH); ++ sys_umount((char __force_user *)"/old", MNT_DETACH); + printk(KERN_NOTICE "Trying to free ramdisk memory ... "); + if (fd < 0) { + error = fd; +@@ -127,11 +127,11 @@ int __init initrd_load(void) + * mounted in the normal path. + */ + if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) { +- sys_unlink("/initrd.image"); ++ sys_unlink((const char __force_user *)"/initrd.image"); + handle_initrd(); + return 1; + } + } +- sys_unlink("/initrd.image"); ++ sys_unlink((const char __force_user *)"/initrd.image"); + return 0; + } +diff --git a/init/do_mounts_md.c b/init/do_mounts_md.c +index 8cb6db5..d729f50 100644 +--- a/init/do_mounts_md.c ++++ b/init/do_mounts_md.c +@@ -180,7 +180,7 @@ static void __init md_setup_drive(void) + partitioned ? "_d" : "", minor, + md_setup_args[ent].device_names); + +- fd = sys_open(name, 0, 0); ++ fd = sys_open((char __force_user *)name, 0, 0); + if (fd < 0) { + printk(KERN_ERR "md: open failed - cannot start " + "array %s\n", name); +@@ -243,7 +243,7 @@ static void __init md_setup_drive(void) + * array without it + */ + sys_close(fd); +- fd = sys_open(name, 0, 0); ++ fd = sys_open((char __force_user *)name, 0, 0); + sys_ioctl(fd, BLKRRPART, 0); + } + sys_close(fd); +@@ -293,7 +293,7 @@ static void __init autodetect_raid(void) + + wait_for_device_probe(); + +- fd = sys_open("/dev/md0", 0, 0); ++ fd = sys_open((const char __force_user *) "/dev/md0", 0, 0); + if (fd >= 0) { + sys_ioctl(fd, RAID_AUTORUN, raid_autopart); + sys_close(fd); +diff --git a/init/init_task.c b/init/init_task.c +index ba0a7f36..2bcf1d5 100644 +--- a/init/init_task.c ++++ b/init/init_task.c +@@ -22,5 +22,9 @@ EXPORT_SYMBOL(init_task); + * Initial thread structure. Alignment of this is handled by a special + * linker map entry. + */ ++#ifdef CONFIG_X86 ++union thread_union init_thread_union __init_task_data; ++#else + union thread_union init_thread_union __init_task_data = + { INIT_THREAD_INFO(init_task) }; ++#endif +diff --git a/init/initramfs.c b/init/initramfs.c +index ad1bd77..dca2c1b 100644 +--- a/init/initramfs.c ++++ b/init/initramfs.c +@@ -25,7 +25,7 @@ static ssize_t __init xwrite(int fd, const char *p, size_t count) + + /* sys_write only can write MAX_RW_COUNT aka 2G-4K bytes at most */ + while (count) { +- ssize_t rv = sys_write(fd, p, count); ++ ssize_t rv = sys_write(fd, (char __force_user *)p, count); + + if (rv < 0) { + if (rv == -EINTR || rv == -EAGAIN) +@@ -107,7 +107,7 @@ static void __init free_hash(void) + } + } + +-static long __init do_utime(char *filename, time_t mtime) ++static long __init do_utime(char __force_user *filename, time_t mtime) + { + struct timespec t[2]; + +@@ -142,7 +142,7 @@ static void __init dir_utime(void) + struct dir_entry *de, *tmp; + list_for_each_entry_safe(de, tmp, &dir_list, list) { + list_del(&de->list); +- do_utime(de->name, de->mtime); ++ do_utime((char __force_user *)de->name, de->mtime); + kfree(de->name); + kfree(de); + } +@@ -304,7 +304,7 @@ static int __init maybe_link(void) + if (nlink >= 2) { + char *old = find_link(major, minor, ino, mode, collected); + if (old) +- return (sys_link(old, collected) < 0) ? -1 : 1; ++ return (sys_link((char __force_user *)old, (char __force_user *)collected) < 0) ? -1 : 1; + } + return 0; + } +@@ -313,11 +313,11 @@ static void __init clean_path(char *path, umode_t fmode) + { + struct stat st; + +- if (!sys_newlstat(path, &st) && (st.st_mode ^ fmode) & S_IFMT) { ++ if (!sys_newlstat((char __force_user *)path, (struct stat __force_user *)&st) && (st.st_mode ^ fmode) & S_IFMT) { + if (S_ISDIR(st.st_mode)) +- sys_rmdir(path); ++ sys_rmdir((char __force_user *)path); + else +- sys_unlink(path); ++ sys_unlink((char __force_user *)path); + } + } + +@@ -338,7 +338,7 @@ static int __init do_name(void) + int openflags = O_WRONLY|O_CREAT; + if (ml != 1) + openflags |= O_TRUNC; +- wfd = sys_open(collected, openflags, mode); ++ wfd = sys_open((char __force_user *)collected, openflags, mode); + + if (wfd >= 0) { + sys_fchown(wfd, uid, gid); +@@ -350,17 +350,17 @@ static int __init do_name(void) + } + } + } else if (S_ISDIR(mode)) { +- sys_mkdir(collected, mode); +- sys_chown(collected, uid, gid); +- sys_chmod(collected, mode); ++ sys_mkdir((char __force_user *)collected, mode); ++ sys_chown((char __force_user *)collected, uid, gid); ++ sys_chmod((char __force_user *)collected, mode); + dir_add(collected, mtime); + } else if (S_ISBLK(mode) || S_ISCHR(mode) || + S_ISFIFO(mode) || S_ISSOCK(mode)) { + if (maybe_link() == 0) { +- sys_mknod(collected, mode, rdev); +- sys_chown(collected, uid, gid); +- sys_chmod(collected, mode); +- do_utime(collected, mtime); ++ sys_mknod((char __force_user *)collected, mode, rdev); ++ sys_chown((char __force_user *)collected, uid, gid); ++ sys_chmod((char __force_user *)collected, mode); ++ do_utime((char __force_user *)collected, mtime); + } + } + return 0; +@@ -372,7 +372,7 @@ static int __init do_copy(void) + if (xwrite(wfd, victim, body_len) != body_len) + error("write error"); + sys_close(wfd); +- do_utime(vcollected, mtime); ++ do_utime((char __force_user *)vcollected, mtime); + kfree(vcollected); + eat(body_len); + state = SkipIt; +@@ -390,9 +390,9 @@ static int __init do_symlink(void) + { + collected[N_ALIGN(name_len) + body_len] = '\0'; + clean_path(collected, 0); +- sys_symlink(collected + N_ALIGN(name_len), collected); +- sys_lchown(collected, uid, gid); +- do_utime(collected, mtime); ++ sys_symlink((char __force_user *)collected + N_ALIGN(name_len), (char __force_user *)collected); ++ sys_lchown((char __force_user *)collected, uid, gid); ++ do_utime((char __force_user *)collected, mtime); + state = SkipIt; + next_state = Reset; + return 0; +diff --git a/init/main.c b/init/main.c +index 321d0ce..c0b695f 100644 +--- a/init/main.c ++++ b/init/main.c +@@ -98,6 +98,8 @@ extern void radix_tree_init(void); + static inline void mark_rodata_ro(void) { } + #endif + ++extern void grsecurity_init(void); ++ + /* + * Debug helper: via this flag we know that we are in 'early bootup code' + * where only the boot processor is running with IRQ disabled. This means +@@ -159,6 +161,85 @@ static int __init set_reset_devices(char *str) + + __setup("reset_devices", set_reset_devices); + ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++kgid_t grsec_proc_gid = KGIDT_INIT(CONFIG_GRKERNSEC_PROC_GID); ++static int __init setup_grsec_proc_gid(char *str) ++{ ++ grsec_proc_gid = KGIDT_INIT(simple_strtol(str, NULL, 0)); ++ return 1; ++} ++__setup("grsec_proc_gid=", setup_grsec_proc_gid); ++#endif ++#ifdef CONFIG_GRKERNSEC_SYSFS_RESTRICT ++int grsec_enable_sysfs_restrict = 1; ++static int __init setup_grsec_sysfs_restrict(char *str) ++{ ++ if (!simple_strtol(str, NULL, 0)) ++ grsec_enable_sysfs_restrict = 0; ++ return 1; ++} ++__setup("grsec_sysfs_restrict", setup_grsec_sysfs_restrict); ++#endif ++ ++#if defined(CONFIG_X86_64) && defined(CONFIG_PAX_MEMORY_UDEREF) ++unsigned long pax_user_shadow_base __read_only; ++EXPORT_SYMBOL(pax_user_shadow_base); ++extern char pax_enter_kernel_user[]; ++extern char pax_exit_kernel_user[]; ++#endif ++ ++#if defined(CONFIG_X86) && defined(CONFIG_PAX_MEMORY_UDEREF) ++static int __init setup_pax_nouderef(char *str) ++{ ++#ifdef CONFIG_X86_32 ++ unsigned int cpu; ++ struct desc_struct *gdt; ++ ++ for (cpu = 0; cpu < nr_cpu_ids; cpu++) { ++ gdt = get_cpu_gdt_table(cpu); ++ gdt[GDT_ENTRY_KERNEL_DS].type = 3; ++ gdt[GDT_ENTRY_KERNEL_DS].limit = 0xf; ++ gdt[GDT_ENTRY_DEFAULT_USER_CS].limit = 0xf; ++ gdt[GDT_ENTRY_DEFAULT_USER_DS].limit = 0xf; ++ } ++ loadsegment(ds, __KERNEL_DS); ++ loadsegment(es, __KERNEL_DS); ++ loadsegment(ss, __KERNEL_DS); ++#else ++ memcpy(pax_enter_kernel_user, (unsigned char []){0xc3}, 1); ++ memcpy(pax_exit_kernel_user, (unsigned char []){0xc3}, 1); ++ clone_pgd_mask = ~(pgdval_t)0UL; ++ pax_user_shadow_base = 0UL; ++ setup_clear_cpu_cap(X86_FEATURE_PCID); ++ setup_clear_cpu_cap(X86_FEATURE_INVPCID); ++#endif ++ ++ return 0; ++} ++early_param("pax_nouderef", setup_pax_nouderef); ++ ++#ifdef CONFIG_X86_64 ++static int __init setup_pax_weakuderef(char *str) ++{ ++ if (clone_pgd_mask != ~(pgdval_t)0UL) ++ pax_user_shadow_base = 1UL << TASK_SIZE_MAX_SHIFT; ++ return 1; ++} ++__setup("pax_weakuderef", setup_pax_weakuderef); ++#endif ++#endif ++ ++#ifdef CONFIG_PAX_SOFTMODE ++int pax_softmode; ++ ++static int __init setup_pax_softmode(char *str) ++{ ++ get_option(&str, &pax_softmode); ++ return 1; ++} ++__setup("pax_softmode=", setup_pax_softmode); ++#endif ++ + static const char *argv_init[MAX_INIT_ARGS+2] = { "init", NULL, }; + const char *envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, }; + static const char *panic_later, *panic_param; +@@ -728,7 +809,7 @@ static bool __init_or_module initcall_blacklisted(initcall_t fn) + struct blacklist_entry *entry; + char *fn_name; + +- fn_name = kasprintf(GFP_KERNEL, "%pf", fn); ++ fn_name = kasprintf(GFP_KERNEL, "%pX", fn); + if (!fn_name) + return false; + +@@ -780,7 +861,7 @@ int __init_or_module do_one_initcall(initcall_t fn) + { + int count = preempt_count(); + int ret; +- char msgbuf[64]; ++ const char *msg1 = "", *msg2 = ""; + + if (initcall_blacklisted(fn)) + return -EPERM; +@@ -790,18 +871,17 @@ int __init_or_module do_one_initcall(initcall_t fn) + else + ret = fn(); + +- msgbuf[0] = 0; +- + if (preempt_count() != count) { +- sprintf(msgbuf, "preemption imbalance "); ++ msg1 = " preemption imbalance"; + preempt_count_set(count); + } + if (irqs_disabled()) { +- strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf)); ++ msg2 = " disabled interrupts"; + local_irq_enable(); + } +- WARN(msgbuf[0], "initcall %pF returned with %s\n", fn, msgbuf); ++ WARN(*msg1 || *msg2, "initcall %pF returned with%s%s\n", fn, msg1, msg2); + ++ add_latent_entropy(); + return ret; + } + +@@ -907,8 +987,8 @@ static int run_init_process(const char *init_filename) + { + argv_init[0] = init_filename; + return do_execve(getname_kernel(init_filename), +- (const char __user *const __user *)argv_init, +- (const char __user *const __user *)envp_init); ++ (const char __user *const __force_user *)argv_init, ++ (const char __user *const __force_user *)envp_init); + } + + static int try_to_run_init_process(const char *init_filename) +@@ -925,6 +1005,10 @@ static int try_to_run_init_process(const char *init_filename) + return ret; + } + ++#ifdef CONFIG_GRKERNSEC_CHROOT_INITRD ++extern int gr_init_ran; ++#endif ++ + static noinline void __init kernel_init_freeable(void); + + static int __ref kernel_init(void *unused) +@@ -949,6 +1033,11 @@ static int __ref kernel_init(void *unused) + ramdisk_execute_command, ret); + } + ++#ifdef CONFIG_GRKERNSEC_CHROOT_INITRD ++ /* if no initrd was used, be extra sure we enforce chroot restrictions */ ++ gr_init_ran = 1; ++#endif ++ + /* + * We try each of these until one succeeds. + * +@@ -1004,7 +1093,7 @@ static noinline void __init kernel_init_freeable(void) + do_basic_setup(); + + /* Open the /dev/console on the rootfs, this should never fail */ +- if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) ++ if (sys_open((const char __force_user *) "/dev/console", O_RDWR, 0) < 0) + pr_err("Warning: unable to open an initial console.\n"); + + (void) sys_dup(0); +@@ -1017,11 +1106,13 @@ static noinline void __init kernel_init_freeable(void) + if (!ramdisk_execute_command) + ramdisk_execute_command = "/init"; + +- if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) { ++ if (sys_access((const char __force_user *) ramdisk_execute_command, 0) != 0) { + ramdisk_execute_command = NULL; + prepare_namespace(); + } + ++ grsecurity_init(); ++ + /* + * Ok, we have completed the initial bootup, and + * we're essentially up and running. Get rid of the +diff --git a/ipc/compat.c b/ipc/compat.c +index 9b3c85f..1c4d897 100644 +--- a/ipc/compat.c ++++ b/ipc/compat.c +@@ -396,7 +396,7 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second, + COMPAT_SHMLBA); + if (err < 0) + return err; +- return put_user(raddr, (compat_ulong_t *)compat_ptr(third)); ++ return put_user(raddr, (compat_ulong_t __user *)compat_ptr(third)); + } + case SHMDT: + return sys_shmdt(compat_ptr(ptr)); +diff --git a/ipc/ipc_sysctl.c b/ipc/ipc_sysctl.c +index e8075b2..76f2c6a 100644 +--- a/ipc/ipc_sysctl.c ++++ b/ipc/ipc_sysctl.c +@@ -30,7 +30,7 @@ static void *get_ipc(struct ctl_table *table) + static int proc_ipc_dointvec(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table ipc_table; ++ ctl_table_no_const ipc_table; + + memcpy(&ipc_table, table, sizeof(ipc_table)); + ipc_table.data = get_ipc(table); +@@ -41,7 +41,7 @@ static int proc_ipc_dointvec(struct ctl_table *table, int write, + static int proc_ipc_dointvec_minmax(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table ipc_table; ++ ctl_table_no_const ipc_table; + + memcpy(&ipc_table, table, sizeof(ipc_table)); + ipc_table.data = get_ipc(table); +@@ -65,7 +65,7 @@ static int proc_ipc_dointvec_minmax_orphans(struct ctl_table *table, int write, + static int proc_ipc_callback_dointvec_minmax(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table ipc_table; ++ ctl_table_no_const ipc_table; + size_t lenp_bef = *lenp; + int rc; + +@@ -88,7 +88,7 @@ static int proc_ipc_callback_dointvec_minmax(struct ctl_table *table, int write, + static int proc_ipc_doulongvec_minmax(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table ipc_table; ++ ctl_table_no_const ipc_table; + memcpy(&ipc_table, table, sizeof(ipc_table)); + ipc_table.data = get_ipc(table); + +@@ -122,7 +122,7 @@ static void ipc_auto_callback(int val) + static int proc_ipcauto_dointvec_minmax(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table ipc_table; ++ ctl_table_no_const ipc_table; + int oldval; + int rc; + +diff --git a/ipc/mq_sysctl.c b/ipc/mq_sysctl.c +index 68d4e95..1477ded 100644 +--- a/ipc/mq_sysctl.c ++++ b/ipc/mq_sysctl.c +@@ -25,7 +25,7 @@ static void *get_mq(struct ctl_table *table) + static int proc_mq_dointvec(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table mq_table; ++ ctl_table_no_const mq_table; + memcpy(&mq_table, table, sizeof(mq_table)); + mq_table.data = get_mq(table); + +@@ -35,7 +35,7 @@ static int proc_mq_dointvec(struct ctl_table *table, int write, + static int proc_mq_dointvec_minmax(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table mq_table; ++ ctl_table_no_const mq_table; + memcpy(&mq_table, table, sizeof(mq_table)); + mq_table.data = get_mq(table); + +diff --git a/ipc/mqueue.c b/ipc/mqueue.c +index 4fcf39a..d3cc2ec 100644 +--- a/ipc/mqueue.c ++++ b/ipc/mqueue.c +@@ -278,6 +278,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb, + mq_bytes = mq_treesize + (info->attr.mq_maxmsg * + info->attr.mq_msgsize); + ++ gr_learn_resource(current, RLIMIT_MSGQUEUE, u->mq_bytes + mq_bytes, 1); + spin_lock(&mq_lock); + if (u->mq_bytes + mq_bytes < u->mq_bytes || + u->mq_bytes + mq_bytes > rlimit(RLIMIT_MSGQUEUE)) { +diff --git a/ipc/shm.c b/ipc/shm.c +index 0145479..3d27947 100644 +--- a/ipc/shm.c ++++ b/ipc/shm.c +@@ -72,6 +72,14 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp); + static int sysvipc_shm_proc_show(struct seq_file *s, void *it); + #endif + ++#ifdef CONFIG_GRKERNSEC ++extern int gr_handle_shmat(const pid_t shm_cprid, const pid_t shm_lapid, ++ const u64 shm_createtime, const kuid_t cuid, ++ const int shmid); ++extern int gr_chroot_shmat(const pid_t shm_cprid, const pid_t shm_lapid, ++ const u64 shm_createtime); ++#endif ++ + void shm_init_ns(struct ipc_namespace *ns) + { + ns->shm_ctlmax = SHMMAX; +@@ -559,6 +567,9 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) + shp->shm_lprid = 0; + shp->shm_atim = shp->shm_dtim = 0; + shp->shm_ctim = get_seconds(); ++#ifdef CONFIG_GRKERNSEC ++ shp->shm_createtime = ktime_get_ns(); ++#endif + shp->shm_segsz = size; + shp->shm_nattch = 0; + shp->shm_file = file; +@@ -1095,6 +1106,12 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr, + f_mode = FMODE_READ | FMODE_WRITE; + } + if (shmflg & SHM_EXEC) { ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (current->mm->pax_flags & MF_PAX_MPROTECT) ++ goto out; ++#endif ++ + prot |= PROT_EXEC; + acc_mode |= S_IXUGO; + } +@@ -1119,6 +1136,15 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr, + if (err) + goto out_unlock; + ++#ifdef CONFIG_GRKERNSEC ++ if (!gr_handle_shmat(shp->shm_cprid, shp->shm_lapid, shp->shm_createtime, ++ shp->shm_perm.cuid, shmid) || ++ !gr_chroot_shmat(shp->shm_cprid, shp->shm_lapid, shp->shm_createtime)) { ++ err = -EACCES; ++ goto out_unlock; ++ } ++#endif ++ + ipc_lock_object(&shp->shm_perm); + + /* check if shm_destroy() is tearing down shp */ +@@ -1131,6 +1157,9 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr, + path = shp->shm_file->f_path; + path_get(&path); + shp->shm_nattch++; ++#ifdef CONFIG_GRKERNSEC ++ shp->shm_lapid = current->pid; ++#endif + size = i_size_read(path.dentry->d_inode); + ipc_unlock_object(&shp->shm_perm); + rcu_read_unlock(); +diff --git a/ipc/util.c b/ipc/util.c +index 88adc32..3867c68 100644 +--- a/ipc/util.c ++++ b/ipc/util.c +@@ -71,6 +71,8 @@ struct ipc_proc_iface { + int (*show)(struct seq_file *, void *); + }; + ++extern int gr_ipc_permitted(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, int requested_mode, int granted_mode); ++ + static void ipc_memory_notifier(struct work_struct *work) + { + ipcns_notify(IPCNS_MEMCHANGED); +@@ -537,6 +539,10 @@ int ipcperms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flag) + granted_mode >>= 6; + else if (in_group_p(ipcp->cgid) || in_group_p(ipcp->gid)) + granted_mode >>= 3; ++ ++ if (!gr_ipc_permitted(ns, ipcp, requested_mode, granted_mode)) ++ return -1; ++ + /* is there some bit set in requested_mode but not in granted_mode? */ + if ((requested_mode & ~granted_mode & 0007) && + !ns_capable(ns->user_ns, CAP_IPC_OWNER)) +diff --git a/kernel/audit.c b/kernel/audit.c +index c6df990..fde80b4 100644 +--- a/kernel/audit.c ++++ b/kernel/audit.c +@@ -122,7 +122,7 @@ u32 audit_sig_sid = 0; + 3) suppressed due to audit_rate_limit + 4) suppressed due to audit_backlog_limit + */ +-static atomic_t audit_lost = ATOMIC_INIT(0); ++static atomic_unchecked_t audit_lost = ATOMIC_INIT(0); + + /* The netlink socket. */ + static struct sock *audit_sock; +@@ -256,7 +256,7 @@ void audit_log_lost(const char *message) + unsigned long now; + int print; + +- atomic_inc(&audit_lost); ++ atomic_inc_unchecked(&audit_lost); + + print = (audit_failure == AUDIT_FAIL_PANIC || !audit_rate_limit); + +@@ -273,7 +273,7 @@ void audit_log_lost(const char *message) + if (print) { + if (printk_ratelimit()) + pr_warn("audit_lost=%u audit_rate_limit=%u audit_backlog_limit=%u\n", +- atomic_read(&audit_lost), ++ atomic_read_unchecked(&audit_lost), + audit_rate_limit, + audit_backlog_limit); + audit_panic(message); +@@ -840,7 +840,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) + s.pid = audit_pid; + s.rate_limit = audit_rate_limit; + s.backlog_limit = audit_backlog_limit; +- s.lost = atomic_read(&audit_lost); ++ s.lost = atomic_read_unchecked(&audit_lost); + s.backlog = skb_queue_len(&audit_skb_queue); + s.version = AUDIT_VERSION_LATEST; + s.backlog_wait_time = audit_backlog_wait_time; +diff --git a/kernel/auditsc.c b/kernel/auditsc.c +index e420a0c..38137fa 100644 +--- a/kernel/auditsc.c ++++ b/kernel/auditsc.c +@@ -2014,7 +2014,7 @@ int auditsc_get_stamp(struct audit_context *ctx, + } + + /* global counter which is incremented every time something logs in */ +-static atomic_t session_id = ATOMIC_INIT(0); ++static atomic_unchecked_t session_id = ATOMIC_INIT(0); + + static int audit_set_loginuid_perm(kuid_t loginuid) + { +@@ -2081,7 +2081,7 @@ int audit_set_loginuid(kuid_t loginuid) + + /* are we setting or clearing? */ + if (uid_valid(loginuid)) +- sessionid = (unsigned int)atomic_inc_return(&session_id); ++ sessionid = (unsigned int)atomic_inc_return_unchecked(&session_id); + + task->sessionid = sessionid; + task->loginuid = loginuid; +diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c +index d6594e4..597264b 100644 +--- a/kernel/bpf/core.c ++++ b/kernel/bpf/core.c +@@ -143,14 +143,17 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr, + * random section of illegal instructions. + */ + size = round_up(proglen + sizeof(*hdr) + 128, PAGE_SIZE); +- hdr = module_alloc(size); ++ hdr = module_alloc_exec(size); + if (hdr == NULL) + return NULL; + + /* Fill space with illegal/arch-dep instructions. */ + bpf_fill_ill_insns(hdr, size); + ++ pax_open_kernel(); + hdr->pages = size / PAGE_SIZE; ++ pax_close_kernel(); ++ + hole = min_t(unsigned int, size - (proglen + sizeof(*hdr)), + PAGE_SIZE - sizeof(*hdr)); + start = (prandom_u32() % hole) & ~(alignment - 1); +@@ -163,7 +166,7 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr, + + void bpf_jit_binary_free(struct bpf_binary_header *hdr) + { +- module_free(NULL, hdr); ++ module_free_exec(NULL, hdr); + } + #endif /* CONFIG_BPF_JIT */ + +diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c +index ba61c8c..c60c486 100644 +--- a/kernel/bpf/syscall.c ++++ b/kernel/bpf/syscall.c +@@ -539,11 +539,15 @@ SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, siz + int err; + + /* the syscall is limited to root temporarily. This restriction will be +- * lifted when security audit is clean. Note that eBPF+tracing must have +- * this restriction, since it may pass kernel data to user space ++ * lifted by upstream when a half-assed security audit is clean. Note ++ * that eBPF+tracing must have this restriction, since it may pass ++ * kernel data to user space + */ + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; ++#ifdef CONFIG_GRKERNSEC ++ return -EPERM; ++#endif + + if (!access_ok(VERIFY_READ, uattr, 1)) + return -EFAULT; +diff --git a/kernel/capability.c b/kernel/capability.c +index 989f5bf..d317ca0 100644 +--- a/kernel/capability.c ++++ b/kernel/capability.c +@@ -192,6 +192,9 @@ SYSCALL_DEFINE2(capget, cap_user_header_t, header, cap_user_data_t, dataptr) + * before modification is attempted and the application + * fails. + */ ++ if (tocopy > ARRAY_SIZE(kdata)) ++ return -EFAULT; ++ + if (copy_to_user(dataptr, kdata, tocopy + * sizeof(struct __user_cap_data_struct))) { + return -EFAULT; +@@ -297,10 +300,11 @@ bool has_ns_capability(struct task_struct *t, + int ret; + + rcu_read_lock(); +- ret = security_capable(__task_cred(t), ns, cap); ++ ret = security_capable(__task_cred(t), ns, cap) == 0 && ++ gr_task_is_capable(t, __task_cred(t), cap); + rcu_read_unlock(); + +- return (ret == 0); ++ return ret; + } + + /** +@@ -337,10 +341,10 @@ bool has_ns_capability_noaudit(struct task_struct *t, + int ret; + + rcu_read_lock(); +- ret = security_capable_noaudit(__task_cred(t), ns, cap); ++ ret = security_capable_noaudit(__task_cred(t), ns, cap) == 0 && gr_task_is_capable_nolog(t, cap); + rcu_read_unlock(); + +- return (ret == 0); ++ return ret; + } + + /** +@@ -378,7 +382,7 @@ bool ns_capable(struct user_namespace *ns, int cap) + BUG(); + } + +- if (security_capable(current_cred(), ns, cap) == 0) { ++ if (security_capable(current_cred(), ns, cap) == 0 && gr_is_capable(cap)) { + current->flags |= PF_SUPERPRIV; + return true; + } +@@ -386,6 +390,21 @@ bool ns_capable(struct user_namespace *ns, int cap) + } + EXPORT_SYMBOL(ns_capable); + ++bool ns_capable_nolog(struct user_namespace *ns, int cap) ++{ ++ if (unlikely(!cap_valid(cap))) { ++ printk(KERN_CRIT "capable_nolog() called with invalid cap=%u\n", cap); ++ BUG(); ++ } ++ ++ if (security_capable_noaudit(current_cred(), ns, cap) == 0 && gr_is_capable_nolog(cap)) { ++ current->flags |= PF_SUPERPRIV; ++ return true; ++ } ++ return false; ++} ++EXPORT_SYMBOL(ns_capable_nolog); ++ + /** + * file_ns_capable - Determine if the file's opener had a capability in effect + * @file: The file we want to check +@@ -427,6 +446,12 @@ bool capable(int cap) + } + EXPORT_SYMBOL(capable); + ++bool capable_nolog(int cap) ++{ ++ return ns_capable_nolog(&init_user_ns, cap); ++} ++EXPORT_SYMBOL(capable_nolog); ++ + /** + * capable_wrt_inode_uidgid - Check nsown_capable and uid and gid mapped + * @inode: The inode in question +@@ -444,3 +469,12 @@ bool capable_wrt_inode_uidgid(const struct inode *inode, int cap) + kgid_has_mapping(ns, inode->i_gid); + } + EXPORT_SYMBOL(capable_wrt_inode_uidgid); ++ ++bool capable_wrt_inode_uidgid_nolog(const struct inode *inode, int cap) ++{ ++ struct user_namespace *ns = current_user_ns(); ++ ++ return ns_capable_nolog(ns, cap) && kuid_has_mapping(ns, inode->i_uid) && ++ kgid_has_mapping(ns, inode->i_gid); ++} ++EXPORT_SYMBOL(capable_wrt_inode_uidgid_nolog); +diff --git a/kernel/cgroup.c b/kernel/cgroup.c +index 136ecea..45157a6 100644 +--- a/kernel/cgroup.c ++++ b/kernel/cgroup.c +@@ -5276,6 +5276,9 @@ static void cgroup_release_agent(struct work_struct *work) + if (!pathbuf || !agentbuf) + goto out; + ++ if (agentbuf[0] == '\0') ++ goto out; ++ + path = cgroup_path(cgrp, pathbuf, PATH_MAX); + if (!path) + goto out; +@@ -5461,7 +5464,7 @@ static int cgroup_css_links_read(struct seq_file *seq, void *v) + struct task_struct *task; + int count = 0; + +- seq_printf(seq, "css_set %p\n", cset); ++ seq_printf(seq, "css_set %pK\n", cset); + + list_for_each_entry(task, &cset->tasks, cg_list) { + if (count++ > MAX_TASKS_SHOWN_PER_CSS) +diff --git a/kernel/compat.c b/kernel/compat.c +index ebb3c36..1df606e 100644 +--- a/kernel/compat.c ++++ b/kernel/compat.c +@@ -13,6 +13,7 @@ + + #include <linux/linkage.h> + #include <linux/compat.h> ++#include <linux/module.h> + #include <linux/errno.h> + #include <linux/time.h> + #include <linux/signal.h> +@@ -220,7 +221,7 @@ static long compat_nanosleep_restart(struct restart_block *restart) + mm_segment_t oldfs; + long ret; + +- restart->nanosleep.rmtp = (struct timespec __user *) &rmt; ++ restart->nanosleep.rmtp = (struct timespec __force_user *) &rmt; + oldfs = get_fs(); + set_fs(KERNEL_DS); + ret = hrtimer_nanosleep_restart(restart); +@@ -252,7 +253,7 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, + oldfs = get_fs(); + set_fs(KERNEL_DS); + ret = hrtimer_nanosleep(&tu, +- rmtp ? (struct timespec __user *)&rmt : NULL, ++ rmtp ? (struct timespec __force_user *)&rmt : NULL, + HRTIMER_MODE_REL, CLOCK_MONOTONIC); + set_fs(oldfs); + +@@ -379,7 +380,7 @@ COMPAT_SYSCALL_DEFINE1(sigpending, compat_old_sigset_t __user *, set) + mm_segment_t old_fs = get_fs(); + + set_fs(KERNEL_DS); +- ret = sys_sigpending((old_sigset_t __user *) &s); ++ ret = sys_sigpending((old_sigset_t __force_user *) &s); + set_fs(old_fs); + if (ret == 0) + ret = put_user(s, set); +@@ -469,7 +470,7 @@ COMPAT_SYSCALL_DEFINE2(old_getrlimit, unsigned int, resource, + mm_segment_t old_fs = get_fs(); + + set_fs(KERNEL_DS); +- ret = sys_old_getrlimit(resource, (struct rlimit __user *)&r); ++ ret = sys_old_getrlimit(resource, (struct rlimit __force_user *)&r); + set_fs(old_fs); + + if (!ret) { +@@ -551,8 +552,8 @@ COMPAT_SYSCALL_DEFINE4(wait4, + set_fs (KERNEL_DS); + ret = sys_wait4(pid, + (stat_addr ? +- (unsigned int __user *) &status : NULL), +- options, (struct rusage __user *) &r); ++ (unsigned int __force_user *) &status : NULL), ++ options, (struct rusage __force_user *) &r); + set_fs (old_fs); + + if (ret > 0) { +@@ -578,8 +579,8 @@ COMPAT_SYSCALL_DEFINE5(waitid, + memset(&info, 0, sizeof(info)); + + set_fs(KERNEL_DS); +- ret = sys_waitid(which, pid, (siginfo_t __user *)&info, options, +- uru ? (struct rusage __user *)&ru : NULL); ++ ret = sys_waitid(which, pid, (siginfo_t __force_user *)&info, options, ++ uru ? (struct rusage __force_user *)&ru : NULL); + set_fs(old_fs); + + if ((ret < 0) || (info.si_signo == 0)) +@@ -713,8 +714,8 @@ COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags, + oldfs = get_fs(); + set_fs(KERNEL_DS); + err = sys_timer_settime(timer_id, flags, +- (struct itimerspec __user *) &newts, +- (struct itimerspec __user *) &oldts); ++ (struct itimerspec __force_user *) &newts, ++ (struct itimerspec __force_user *) &oldts); + set_fs(oldfs); + if (!err && old && put_compat_itimerspec(old, &oldts)) + return -EFAULT; +@@ -731,7 +732,7 @@ COMPAT_SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id, + oldfs = get_fs(); + set_fs(KERNEL_DS); + err = sys_timer_gettime(timer_id, +- (struct itimerspec __user *) &ts); ++ (struct itimerspec __force_user *) &ts); + set_fs(oldfs); + if (!err && put_compat_itimerspec(setting, &ts)) + return -EFAULT; +@@ -750,7 +751,7 @@ COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock, + oldfs = get_fs(); + set_fs(KERNEL_DS); + err = sys_clock_settime(which_clock, +- (struct timespec __user *) &ts); ++ (struct timespec __force_user *) &ts); + set_fs(oldfs); + return err; + } +@@ -765,7 +766,7 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock, + oldfs = get_fs(); + set_fs(KERNEL_DS); + err = sys_clock_gettime(which_clock, +- (struct timespec __user *) &ts); ++ (struct timespec __force_user *) &ts); + set_fs(oldfs); + if (!err && compat_put_timespec(&ts, tp)) + return -EFAULT; +@@ -785,7 +786,7 @@ COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock, + + oldfs = get_fs(); + set_fs(KERNEL_DS); +- ret = sys_clock_adjtime(which_clock, (struct timex __user *) &txc); ++ ret = sys_clock_adjtime(which_clock, (struct timex __force_user *) &txc); + set_fs(oldfs); + + err = compat_put_timex(utp, &txc); +@@ -805,7 +806,7 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock, + oldfs = get_fs(); + set_fs(KERNEL_DS); + err = sys_clock_getres(which_clock, +- (struct timespec __user *) &ts); ++ (struct timespec __force_user *) &ts); + set_fs(oldfs); + if (!err && tp && compat_put_timespec(&ts, tp)) + return -EFAULT; +@@ -819,7 +820,7 @@ static long compat_clock_nanosleep_restart(struct restart_block *restart) + struct timespec tu; + struct compat_timespec __user *rmtp = restart->nanosleep.compat_rmtp; + +- restart->nanosleep.rmtp = (struct timespec __user *) &tu; ++ restart->nanosleep.rmtp = (struct timespec __force_user *) &tu; + oldfs = get_fs(); + set_fs(KERNEL_DS); + err = clock_nanosleep_restart(restart); +@@ -851,8 +852,8 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags, + oldfs = get_fs(); + set_fs(KERNEL_DS); + err = sys_clock_nanosleep(which_clock, flags, +- (struct timespec __user *) &in, +- (struct timespec __user *) &out); ++ (struct timespec __force_user *) &in, ++ (struct timespec __force_user *) &out); + set_fs(oldfs); + + if ((err == -ERESTART_RESTARTBLOCK) && rmtp && +@@ -1146,7 +1147,7 @@ COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval, + mm_segment_t old_fs = get_fs(); + + set_fs(KERNEL_DS); +- ret = sys_sched_rr_get_interval(pid, (struct timespec __user *)&t); ++ ret = sys_sched_rr_get_interval(pid, (struct timespec __force_user *)&t); + set_fs(old_fs); + if (compat_put_timespec(&t, interval)) + return -EFAULT; +diff --git a/kernel/configs.c b/kernel/configs.c +index c18b1f1..b9a0132 100644 +--- a/kernel/configs.c ++++ b/kernel/configs.c +@@ -74,8 +74,19 @@ static int __init ikconfig_init(void) + struct proc_dir_entry *entry; + + /* create the current config file */ ++#if defined(CONFIG_GRKERNSEC_PROC_ADD) || defined(CONFIG_GRKERNSEC_HIDESYM) ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_HIDESYM) ++ entry = proc_create("config.gz", S_IFREG | S_IRUSR, NULL, ++ &ikconfig_file_ops); ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ entry = proc_create("config.gz", S_IFREG | S_IRUSR | S_IRGRP, NULL, ++ &ikconfig_file_ops); ++#endif ++#else + entry = proc_create("config.gz", S_IFREG | S_IRUGO, NULL, + &ikconfig_file_ops); ++#endif ++ + if (!entry) + return -ENOMEM; + +diff --git a/kernel/cred.c b/kernel/cred.c +index e0573a4..26c0fd3 100644 +--- a/kernel/cred.c ++++ b/kernel/cred.c +@@ -164,6 +164,16 @@ void exit_creds(struct task_struct *tsk) + validate_creds(cred); + alter_cred_subscribers(cred, -1); + put_cred(cred); ++ ++#ifdef CONFIG_GRKERNSEC_SETXID ++ cred = (struct cred *) tsk->delayed_cred; ++ if (cred != NULL) { ++ tsk->delayed_cred = NULL; ++ validate_creds(cred); ++ alter_cred_subscribers(cred, -1); ++ put_cred(cred); ++ } ++#endif + } + + /** +@@ -411,7 +421,7 @@ static bool cred_cap_issubset(const struct cred *set, const struct cred *subset) + * Always returns 0 thus allowing this function to be tail-called at the end + * of, say, sys_setgid(). + */ +-int commit_creds(struct cred *new) ++static int __commit_creds(struct cred *new) + { + struct task_struct *task = current; + const struct cred *old = task->real_cred; +@@ -430,6 +440,8 @@ int commit_creds(struct cred *new) + + get_cred(new); /* we will require a ref for the subj creds too */ + ++ gr_set_role_label(task, new->uid, new->gid); ++ + /* dumpability changes */ + if (!uid_eq(old->euid, new->euid) || + !gid_eq(old->egid, new->egid) || +@@ -479,6 +491,105 @@ int commit_creds(struct cred *new) + put_cred(old); + return 0; + } ++#ifdef CONFIG_GRKERNSEC_SETXID ++extern int set_user(struct cred *new); ++ ++void gr_delayed_cred_worker(void) ++{ ++ const struct cred *new = current->delayed_cred; ++ struct cred *ncred; ++ ++ current->delayed_cred = NULL; ++ ++ if (!uid_eq(current_uid(), GLOBAL_ROOT_UID) && new != NULL) { ++ // from doing get_cred on it when queueing this ++ put_cred(new); ++ return; ++ } else if (new == NULL) ++ return; ++ ++ ncred = prepare_creds(); ++ if (!ncred) ++ goto die; ++ // uids ++ ncred->uid = new->uid; ++ ncred->euid = new->euid; ++ ncred->suid = new->suid; ++ ncred->fsuid = new->fsuid; ++ // gids ++ ncred->gid = new->gid; ++ ncred->egid = new->egid; ++ ncred->sgid = new->sgid; ++ ncred->fsgid = new->fsgid; ++ // groups ++ set_groups(ncred, new->group_info); ++ // caps ++ ncred->securebits = new->securebits; ++ ncred->cap_inheritable = new->cap_inheritable; ++ ncred->cap_permitted = new->cap_permitted; ++ ncred->cap_effective = new->cap_effective; ++ ncred->cap_bset = new->cap_bset; ++ ++ if (set_user(ncred)) { ++ abort_creds(ncred); ++ goto die; ++ } ++ ++ // from doing get_cred on it when queueing this ++ put_cred(new); ++ ++ __commit_creds(ncred); ++ return; ++die: ++ // from doing get_cred on it when queueing this ++ put_cred(new); ++ do_group_exit(SIGKILL); ++} ++#endif ++ ++int commit_creds(struct cred *new) ++{ ++#ifdef CONFIG_GRKERNSEC_SETXID ++ int ret; ++ int schedule_it = 0; ++ struct task_struct *t; ++ unsigned oldsecurebits = current_cred()->securebits; ++ ++ /* we won't get called with tasklist_lock held for writing ++ and interrupts disabled as the cred struct in that case is ++ init_cred ++ */ ++ if (grsec_enable_setxid && !current_is_single_threaded() && ++ uid_eq(current_uid(), GLOBAL_ROOT_UID) && ++ !uid_eq(new->uid, GLOBAL_ROOT_UID)) { ++ schedule_it = 1; ++ } ++ ret = __commit_creds(new); ++ if (schedule_it) { ++ rcu_read_lock(); ++ read_lock(&tasklist_lock); ++ for (t = next_thread(current); t != current; ++ t = next_thread(t)) { ++ /* we'll check if the thread has uid 0 in ++ * the delayed worker routine ++ */ ++ if (task_securebits(t) == oldsecurebits && ++ t->delayed_cred == NULL) { ++ t->delayed_cred = get_cred(new); ++ set_tsk_thread_flag(t, TIF_GRSEC_SETXID); ++ set_tsk_need_resched(t); ++ } ++ } ++ read_unlock(&tasklist_lock); ++ rcu_read_unlock(); ++ } ++ ++ return ret; ++#else ++ return __commit_creds(new); ++#endif ++} ++ + EXPORT_SYMBOL(commit_creds); + + /** +diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c +index 1adf62b..7736e06 100644 +--- a/kernel/debug/debug_core.c ++++ b/kernel/debug/debug_core.c +@@ -124,7 +124,7 @@ static DEFINE_RAW_SPINLOCK(dbg_slave_lock); + */ + static atomic_t masters_in_kgdb; + static atomic_t slaves_in_kgdb; +-static atomic_t kgdb_break_tasklet_var; ++static atomic_unchecked_t kgdb_break_tasklet_var; + atomic_t kgdb_setting_breakpoint; + + struct task_struct *kgdb_usethread; +@@ -134,7 +134,7 @@ int kgdb_single_step; + static pid_t kgdb_sstep_pid; + + /* to keep track of the CPU which is doing the single stepping*/ +-atomic_t kgdb_cpu_doing_single_step = ATOMIC_INIT(-1); ++atomic_unchecked_t kgdb_cpu_doing_single_step = ATOMIC_INIT(-1); + + /* + * If you are debugging a problem where roundup (the collection of +@@ -549,7 +549,7 @@ return_normal: + * kernel will only try for the value of sstep_tries before + * giving up and continuing on. + */ +- if (atomic_read(&kgdb_cpu_doing_single_step) != -1 && ++ if (atomic_read_unchecked(&kgdb_cpu_doing_single_step) != -1 && + (kgdb_info[cpu].task && + kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) { + atomic_set(&kgdb_active, -1); +@@ -647,8 +647,8 @@ cpu_master_loop: + } + + kgdb_restore: +- if (atomic_read(&kgdb_cpu_doing_single_step) != -1) { +- int sstep_cpu = atomic_read(&kgdb_cpu_doing_single_step); ++ if (atomic_read_unchecked(&kgdb_cpu_doing_single_step) != -1) { ++ int sstep_cpu = atomic_read_unchecked(&kgdb_cpu_doing_single_step); + if (kgdb_info[sstep_cpu].task) + kgdb_sstep_pid = kgdb_info[sstep_cpu].task->pid; + else +@@ -925,18 +925,18 @@ static void kgdb_unregister_callbacks(void) + static void kgdb_tasklet_bpt(unsigned long ing) + { + kgdb_breakpoint(); +- atomic_set(&kgdb_break_tasklet_var, 0); ++ atomic_set_unchecked(&kgdb_break_tasklet_var, 0); + } + + static DECLARE_TASKLET(kgdb_tasklet_breakpoint, kgdb_tasklet_bpt, 0); + + void kgdb_schedule_breakpoint(void) + { +- if (atomic_read(&kgdb_break_tasklet_var) || ++ if (atomic_read_unchecked(&kgdb_break_tasklet_var) || + atomic_read(&kgdb_active) != -1 || + atomic_read(&kgdb_setting_breakpoint)) + return; +- atomic_inc(&kgdb_break_tasklet_var); ++ atomic_inc_unchecked(&kgdb_break_tasklet_var); + tasklet_schedule(&kgdb_tasklet_breakpoint); + } + EXPORT_SYMBOL_GPL(kgdb_schedule_breakpoint); +diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c +index 6ffdc96..af24441 100644 +--- a/kernel/debug/kdb/kdb_main.c ++++ b/kernel/debug/kdb/kdb_main.c +@@ -1977,7 +1977,7 @@ static int kdb_lsmod(int argc, const char **argv) + continue; + + kdb_printf("%-20s%8u 0x%p ", mod->name, +- mod->core_size, (void *)mod); ++ mod->core_size_rx + mod->core_size_rw, (void *)mod); + #ifdef CONFIG_MODULE_UNLOAD + kdb_printf("%4ld ", module_refcount(mod)); + #endif +@@ -1987,7 +1987,7 @@ static int kdb_lsmod(int argc, const char **argv) + kdb_printf(" (Loading)"); + else + kdb_printf(" (Live)"); +- kdb_printf(" 0x%p", mod->module_core); ++ kdb_printf(" 0x%p 0x%p", mod->module_core_rx, mod->module_core_rw); + + #ifdef CONFIG_MODULE_UNLOAD + { +diff --git a/kernel/events/core.c b/kernel/events/core.c +index e631dac..afdf2bb 100644 +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -170,8 +170,15 @@ static struct srcu_struct pmus_srcu; + * 0 - disallow raw tracepoint access for unpriv + * 1 - disallow cpu events for unpriv + * 2 - disallow kernel profiling for unpriv ++ * 3 - disallow all unpriv perf event use + */ +-int sysctl_perf_event_paranoid __read_mostly = 1; ++#ifdef CONFIG_GRKERNSEC_PERF_HARDEN ++int sysctl_perf_event_legitimately_concerned __read_mostly = 3; ++#elif defined(CONFIG_GRKERNSEC_HIDESYM) ++int sysctl_perf_event_legitimately_concerned __read_mostly = 2; ++#else ++int sysctl_perf_event_legitimately_concerned __read_mostly = 1; ++#endif + + /* Minimum for 512 kiB + 1 user control page */ + int sysctl_perf_event_mlock __read_mostly = 512 + (PAGE_SIZE / 1024); /* 'free' kiB per user */ +@@ -197,7 +204,7 @@ void update_perf_cpu_limits(void) + + tmp *= sysctl_perf_cpu_time_max_percent; + do_div(tmp, 100); +- ACCESS_ONCE(perf_sample_allowed_ns) = tmp; ++ ACCESS_ONCE_RW(perf_sample_allowed_ns) = tmp; + } + + static int perf_rotate_context(struct perf_cpu_context *cpuctx); +@@ -303,7 +310,7 @@ void perf_sample_event_took(u64 sample_len_ns) + } + } + +-static atomic64_t perf_event_id; ++static atomic64_unchecked_t perf_event_id; + + static void cpu_ctx_sched_out(struct perf_cpu_context *cpuctx, + enum event_type_t event_type); +@@ -3102,7 +3109,7 @@ static void __perf_event_read(void *info) + + static inline u64 perf_event_count(struct perf_event *event) + { +- return local64_read(&event->count) + atomic64_read(&event->child_count); ++ return local64_read(&event->count) + atomic64_read_unchecked(&event->child_count); + } + + static u64 perf_event_read(struct perf_event *event) +@@ -3528,9 +3535,9 @@ u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running) + mutex_lock(&event->child_mutex); + total += perf_event_read(event); + *enabled += event->total_time_enabled + +- atomic64_read(&event->child_total_time_enabled); ++ atomic64_read_unchecked(&event->child_total_time_enabled); + *running += event->total_time_running + +- atomic64_read(&event->child_total_time_running); ++ atomic64_read_unchecked(&event->child_total_time_running); + + list_for_each_entry(child, &event->child_list, child_list) { + total += perf_event_read(child); +@@ -3994,10 +4001,10 @@ void perf_event_update_userpage(struct perf_event *event) + userpg->offset -= local64_read(&event->hw.prev_count); + + userpg->time_enabled = enabled + +- atomic64_read(&event->child_total_time_enabled); ++ atomic64_read_unchecked(&event->child_total_time_enabled); + + userpg->time_running = running + +- atomic64_read(&event->child_total_time_running); ++ atomic64_read_unchecked(&event->child_total_time_running); + + arch_perf_update_userpage(userpg, now); + +@@ -4571,7 +4578,7 @@ perf_output_sample_ustack(struct perf_output_handle *handle, u64 dump_size, + + /* Data. */ + sp = perf_user_stack_pointer(regs); +- rem = __output_copy_user(handle, (void *) sp, dump_size); ++ rem = __output_copy_user(handle, (void __user *) sp, dump_size); + dyn_size = dump_size - rem; + + perf_output_skip(handle, rem); +@@ -4662,11 +4669,11 @@ static void perf_output_read_one(struct perf_output_handle *handle, + values[n++] = perf_event_count(event); + if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) { + values[n++] = enabled + +- atomic64_read(&event->child_total_time_enabled); ++ atomic64_read_unchecked(&event->child_total_time_enabled); + } + if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) { + values[n++] = running + +- atomic64_read(&event->child_total_time_running); ++ atomic64_read_unchecked(&event->child_total_time_running); + } + if (read_format & PERF_FORMAT_ID) + values[n++] = primary_event_id(event); +@@ -6968,7 +6975,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, + event->parent = parent_event; + + event->ns = get_pid_ns(task_active_pid_ns(current)); +- event->id = atomic64_inc_return(&perf_event_id); ++ event->id = atomic64_inc_return_unchecked(&perf_event_id); + + event->state = PERF_EVENT_STATE_INACTIVE; + +@@ -7247,6 +7254,11 @@ SYSCALL_DEFINE5(perf_event_open, + if (flags & ~PERF_FLAG_ALL) + return -EINVAL; + ++#ifdef CONFIG_GRKERNSEC_PERF_HARDEN ++ if (perf_paranoid_any() && !capable(CAP_SYS_ADMIN)) ++ return -EACCES; ++#endif ++ + err = perf_copy_attr(attr_uptr, &attr); + if (err) + return err; +@@ -7602,10 +7614,10 @@ static void sync_child_event(struct perf_event *child_event, + /* + * Add back the child's count to the parent's count: + */ +- atomic64_add(child_val, &parent_event->child_count); +- atomic64_add(child_event->total_time_enabled, ++ atomic64_add_unchecked(child_val, &parent_event->child_count); ++ atomic64_add_unchecked(child_event->total_time_enabled, + &parent_event->child_total_time_enabled); +- atomic64_add(child_event->total_time_running, ++ atomic64_add_unchecked(child_event->total_time_running, + &parent_event->child_total_time_running); + + /* +diff --git a/kernel/events/internal.h b/kernel/events/internal.h +index 569b2187..19940d9 100644 +--- a/kernel/events/internal.h ++++ b/kernel/events/internal.h +@@ -81,10 +81,10 @@ static inline unsigned long perf_data_size(struct ring_buffer *rb) + return rb->nr_pages << (PAGE_SHIFT + page_order(rb)); + } + +-#define DEFINE_OUTPUT_COPY(func_name, memcpy_func) \ ++#define DEFINE_OUTPUT_COPY(func_name, memcpy_func, user) \ + static inline unsigned long \ + func_name(struct perf_output_handle *handle, \ +- const void *buf, unsigned long len) \ ++ const void user *buf, unsigned long len) \ + { \ + unsigned long size, written; \ + \ +@@ -117,7 +117,7 @@ memcpy_common(void *dst, const void *src, unsigned long n) + return 0; + } + +-DEFINE_OUTPUT_COPY(__output_copy, memcpy_common) ++DEFINE_OUTPUT_COPY(__output_copy, memcpy_common, ) + + static inline unsigned long + memcpy_skip(void *dst, const void *src, unsigned long n) +@@ -125,7 +125,7 @@ memcpy_skip(void *dst, const void *src, unsigned long n) + return 0; + } + +-DEFINE_OUTPUT_COPY(__output_skip, memcpy_skip) ++DEFINE_OUTPUT_COPY(__output_skip, memcpy_skip, ) + + #ifndef arch_perf_out_copy_user + #define arch_perf_out_copy_user arch_perf_out_copy_user +@@ -143,7 +143,7 @@ arch_perf_out_copy_user(void *dst, const void *src, unsigned long n) + } + #endif + +-DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user) ++DEFINE_OUTPUT_COPY(__output_copy_user, arch_perf_out_copy_user, __user) + + /* Callchain handling */ + extern struct perf_callchain_entry * +diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c +index ed8f2cd..fe8030c 100644 +--- a/kernel/events/uprobes.c ++++ b/kernel/events/uprobes.c +@@ -1670,7 +1670,7 @@ static int is_trap_at_addr(struct mm_struct *mm, unsigned long vaddr) + { + struct page *page; + uprobe_opcode_t opcode; +- int result; ++ long result; + + pagefault_disable(); + result = __copy_from_user_inatomic(&opcode, (void __user*)vaddr, +diff --git a/kernel/exit.c b/kernel/exit.c +index 2116aac..d95df2a 100644 +--- a/kernel/exit.c ++++ b/kernel/exit.c +@@ -174,6 +174,10 @@ void release_task(struct task_struct *p) + struct task_struct *leader; + int zap_leader; + repeat: ++#ifdef CONFIG_NET ++ gr_del_task_from_ip_table(p); ++#endif ++ + /* don't need to get the RCU readlock here - the process is dead and + * can't be modifying its own credentials. But shut RCU-lockdep up */ + rcu_read_lock(); +@@ -670,6 +674,8 @@ void do_exit(long code) + int group_dead; + TASKS_RCU(int tasks_rcu_i); + ++ set_fs(USER_DS); ++ + profile_task_exit(tsk); + + WARN_ON(blk_needs_flush_plug(tsk)); +@@ -686,7 +692,6 @@ void do_exit(long code) + * mm_release()->clear_child_tid() from writing to a user-controlled + * kernel address. + */ +- set_fs(USER_DS); + + ptrace_event(PTRACE_EVENT_EXIT, code); + +@@ -744,6 +749,9 @@ void do_exit(long code) + tsk->exit_code = code; + taskstats_exit(tsk, group_dead); + ++ gr_acl_handle_psacct(tsk, code); ++ gr_acl_handle_exit(); ++ + exit_mm(tsk); + + if (group_dead) +@@ -863,7 +871,7 @@ SYSCALL_DEFINE1(exit, int, error_code) + * Take down every thread in the group. This is called by fatal signals + * as well as by sys_exit_group (below). + */ +-void ++__noreturn void + do_group_exit(int exit_code) + { + struct signal_struct *sig = current->signal; +diff --git a/kernel/fork.c b/kernel/fork.c +index 9b7d746..6083ebb 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -177,12 +177,54 @@ static void free_thread_info(struct thread_info *ti) + void thread_info_cache_init(void) + { + thread_info_cache = kmem_cache_create("thread_info", THREAD_SIZE, +- THREAD_SIZE, 0, NULL); ++ THREAD_SIZE, SLAB_USERCOPY, NULL); + BUG_ON(thread_info_cache == NULL); + } + # endif + #endif + ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++static inline struct thread_info *gr_alloc_thread_info_node(struct task_struct *tsk, ++ int node, void **lowmem_stack) ++{ ++ struct page *pages[THREAD_SIZE / PAGE_SIZE]; ++ void *ret = NULL; ++ unsigned int i; ++ ++ *lowmem_stack = alloc_thread_info_node(tsk, node); ++ if (*lowmem_stack == NULL) ++ goto out; ++ ++ for (i = 0; i < THREAD_SIZE / PAGE_SIZE; i++) ++ pages[i] = virt_to_page(*lowmem_stack + (i * PAGE_SIZE)); ++ ++ /* use VM_IOREMAP to gain THREAD_SIZE alignment */ ++ ret = vmap(pages, THREAD_SIZE / PAGE_SIZE, VM_IOREMAP, PAGE_KERNEL); ++ if (ret == NULL) { ++ free_thread_info(*lowmem_stack); ++ *lowmem_stack = NULL; ++ } ++ ++out: ++ return ret; ++} ++ ++static inline void gr_free_thread_info(struct task_struct *tsk, struct thread_info *ti) ++{ ++ unmap_process_stacks(tsk); ++} ++#else ++static inline struct thread_info *gr_alloc_thread_info_node(struct task_struct *tsk, ++ int node, void **lowmem_stack) ++{ ++ return alloc_thread_info_node(tsk, node); ++} ++static inline void gr_free_thread_info(struct task_struct *tsk, struct thread_info *ti) ++{ ++ free_thread_info(ti); ++} ++#endif ++ + /* SLAB cache for signal_struct structures (tsk->signal) */ + static struct kmem_cache *signal_cachep; + +@@ -201,18 +243,22 @@ struct kmem_cache *vm_area_cachep; + /* SLAB cache for mm_struct structures (tsk->mm) */ + static struct kmem_cache *mm_cachep; + +-static void account_kernel_stack(struct thread_info *ti, int account) ++static void account_kernel_stack(struct task_struct *tsk, struct thread_info *ti, int account) + { ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++ struct zone *zone = page_zone(virt_to_page(tsk->lowmem_stack)); ++#else + struct zone *zone = page_zone(virt_to_page(ti)); ++#endif + + mod_zone_page_state(zone, NR_KERNEL_STACK, account); + } + + void free_task(struct task_struct *tsk) + { +- account_kernel_stack(tsk->stack, -1); ++ account_kernel_stack(tsk, tsk->stack, -1); + arch_release_thread_info(tsk->stack); +- free_thread_info(tsk->stack); ++ gr_free_thread_info(tsk, tsk->stack); + rt_mutex_debug_task_free(tsk); + ftrace_graph_exit_task(tsk); + put_seccomp_filter(tsk); +@@ -306,6 +352,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) + { + struct task_struct *tsk; + struct thread_info *ti; ++ void *lowmem_stack; + int node = tsk_fork_get_node(orig); + int err; + +@@ -313,7 +360,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) + if (!tsk) + return NULL; + +- ti = alloc_thread_info_node(tsk, node); ++ ti = gr_alloc_thread_info_node(tsk, node, &lowmem_stack); + if (!ti) + goto free_tsk; + +@@ -322,6 +369,9 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) + goto free_ti; + + tsk->stack = ti; ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++ tsk->lowmem_stack = lowmem_stack; ++#endif + #ifdef CONFIG_SECCOMP + /* + * We must handle setting up seccomp filters once we're under +@@ -338,7 +388,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) + set_task_stack_end_magic(tsk); + + #ifdef CONFIG_CC_STACKPROTECTOR +- tsk->stack_canary = get_random_int(); ++ tsk->stack_canary = pax_get_random_long(); + #endif + + /* +@@ -352,24 +402,92 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) + tsk->splice_pipe = NULL; + tsk->task_frag.page = NULL; + +- account_kernel_stack(ti, 1); ++ account_kernel_stack(tsk, ti, 1); + + return tsk; + + free_ti: +- free_thread_info(ti); ++ gr_free_thread_info(tsk, ti); + free_tsk: + free_task_struct(tsk); + return NULL; + } + + #ifdef CONFIG_MMU +-static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) ++static struct vm_area_struct *dup_vma(struct mm_struct *mm, struct mm_struct *oldmm, struct vm_area_struct *mpnt) ++{ ++ struct vm_area_struct *tmp; ++ unsigned long charge; ++ struct file *file; ++ int retval; ++ ++ charge = 0; ++ if (mpnt->vm_flags & VM_ACCOUNT) { ++ unsigned long len = vma_pages(mpnt); ++ ++ if (security_vm_enough_memory_mm(oldmm, len)) /* sic */ ++ goto fail_nomem; ++ charge = len; ++ } ++ tmp = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); ++ if (!tmp) ++ goto fail_nomem; ++ *tmp = *mpnt; ++ tmp->vm_mm = mm; ++ INIT_LIST_HEAD(&tmp->anon_vma_chain); ++ retval = vma_dup_policy(mpnt, tmp); ++ if (retval) ++ goto fail_nomem_policy; ++ if (anon_vma_fork(tmp, mpnt)) ++ goto fail_nomem_anon_vma_fork; ++ tmp->vm_flags &= ~VM_LOCKED; ++ tmp->vm_next = tmp->vm_prev = NULL; ++ tmp->vm_mirror = NULL; ++ file = tmp->vm_file; ++ if (file) { ++ struct inode *inode = file_inode(file); ++ struct address_space *mapping = file->f_mapping; ++ ++ get_file(file); ++ if (tmp->vm_flags & VM_DENYWRITE) ++ atomic_dec(&inode->i_writecount); ++ mutex_lock(&mapping->i_mmap_mutex); ++ if (tmp->vm_flags & VM_SHARED) ++ atomic_inc(&mapping->i_mmap_writable); ++ flush_dcache_mmap_lock(mapping); ++ /* insert tmp into the share list, just after mpnt */ ++ if (unlikely(tmp->vm_flags & VM_NONLINEAR)) ++ vma_nonlinear_insert(tmp, &mapping->i_mmap_nonlinear); ++ else ++ vma_interval_tree_insert_after(tmp, mpnt, &mapping->i_mmap); ++ flush_dcache_mmap_unlock(mapping); ++ mutex_unlock(&mapping->i_mmap_mutex); ++ } ++ ++ /* ++ * Clear hugetlb-related page reserves for children. This only ++ * affects MAP_PRIVATE mappings. Faults generated by the child ++ * are not guaranteed to succeed, even if read-only ++ */ ++ if (is_vm_hugetlb_page(tmp)) ++ reset_vma_resv_huge_pages(tmp); ++ ++ return tmp; ++ ++fail_nomem_anon_vma_fork: ++ mpol_put(vma_policy(tmp)); ++fail_nomem_policy: ++ kmem_cache_free(vm_area_cachep, tmp); ++fail_nomem: ++ vm_unacct_memory(charge); ++ return NULL; ++} ++ ++static __latent_entropy int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) + { + struct vm_area_struct *mpnt, *tmp, *prev, **pprev; + struct rb_node **rb_link, *rb_parent; + int retval; +- unsigned long charge; + + uprobe_start_dup_mmap(); + down_write(&oldmm->mmap_sem); +@@ -397,55 +515,15 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) + + prev = NULL; + for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) { +- struct file *file; +- + if (mpnt->vm_flags & VM_DONTCOPY) { + vm_stat_account(mm, mpnt->vm_flags, mpnt->vm_file, + -vma_pages(mpnt)); + continue; + } +- charge = 0; +- if (mpnt->vm_flags & VM_ACCOUNT) { +- unsigned long len = vma_pages(mpnt); +- +- if (security_vm_enough_memory_mm(oldmm, len)) /* sic */ +- goto fail_nomem; +- charge = len; +- } +- tmp = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); +- if (!tmp) +- goto fail_nomem; +- *tmp = *mpnt; +- INIT_LIST_HEAD(&tmp->anon_vma_chain); +- retval = vma_dup_policy(mpnt, tmp); +- if (retval) +- goto fail_nomem_policy; +- tmp->vm_mm = mm; +- if (anon_vma_fork(tmp, mpnt)) +- goto fail_nomem_anon_vma_fork; +- tmp->vm_flags &= ~VM_LOCKED; +- tmp->vm_next = tmp->vm_prev = NULL; +- file = tmp->vm_file; +- if (file) { +- struct inode *inode = file_inode(file); +- struct address_space *mapping = file->f_mapping; +- +- get_file(file); +- if (tmp->vm_flags & VM_DENYWRITE) +- atomic_dec(&inode->i_writecount); +- mutex_lock(&mapping->i_mmap_mutex); +- if (tmp->vm_flags & VM_SHARED) +- atomic_inc(&mapping->i_mmap_writable); +- flush_dcache_mmap_lock(mapping); +- /* insert tmp into the share list, just after mpnt */ +- if (unlikely(tmp->vm_flags & VM_NONLINEAR)) +- vma_nonlinear_insert(tmp, +- &mapping->i_mmap_nonlinear); +- else +- vma_interval_tree_insert_after(tmp, mpnt, +- &mapping->i_mmap); +- flush_dcache_mmap_unlock(mapping); +- mutex_unlock(&mapping->i_mmap_mutex); ++ tmp = dup_vma(mm, oldmm, mpnt); ++ if (!tmp) { ++ retval = -ENOMEM; ++ goto out; + } + + /* +@@ -477,6 +555,31 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) + if (retval) + goto out; + } ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (oldmm->pax_flags & MF_PAX_SEGMEXEC) { ++ struct vm_area_struct *mpnt_m; ++ ++ for (mpnt = oldmm->mmap, mpnt_m = mm->mmap; mpnt; mpnt = mpnt->vm_next, mpnt_m = mpnt_m->vm_next) { ++ BUG_ON(!mpnt_m || mpnt_m->vm_mirror || mpnt->vm_mm != oldmm || mpnt_m->vm_mm != mm); ++ ++ if (!mpnt->vm_mirror) ++ continue; ++ ++ if (mpnt->vm_end <= SEGMEXEC_TASK_SIZE) { ++ BUG_ON(mpnt->vm_mirror->vm_mirror != mpnt); ++ mpnt->vm_mirror = mpnt_m; ++ } else { ++ BUG_ON(mpnt->vm_mirror->vm_mirror == mpnt || mpnt->vm_mirror->vm_mirror->vm_mm != mm); ++ mpnt_m->vm_mirror = mpnt->vm_mirror->vm_mirror; ++ mpnt_m->vm_mirror->vm_mirror = mpnt_m; ++ mpnt->vm_mirror->vm_mirror = mpnt; ++ } ++ } ++ BUG_ON(mpnt_m); ++ } ++#endif ++ + /* a new mm has just been created */ + arch_dup_mmap(oldmm, mm); + retval = 0; +@@ -486,14 +589,6 @@ out: + up_write(&oldmm->mmap_sem); + uprobe_end_dup_mmap(); + return retval; +-fail_nomem_anon_vma_fork: +- mpol_put(vma_policy(tmp)); +-fail_nomem_policy: +- kmem_cache_free(vm_area_cachep, tmp); +-fail_nomem: +- retval = -ENOMEM; +- vm_unacct_memory(charge); +- goto out; + } + + static inline int mm_alloc_pgd(struct mm_struct *mm) +@@ -734,8 +829,8 @@ struct mm_struct *mm_access(struct task_struct *task, unsigned int mode) + return ERR_PTR(err); + + mm = get_task_mm(task); +- if (mm && mm != current->mm && +- !ptrace_may_access(task, mode)) { ++ if (mm && ((mm != current->mm && !ptrace_may_access(task, mode)) || ++ (mode == PTRACE_MODE_ATTACH && (gr_handle_proc_ptrace(task) || gr_acl_handle_procpidmem(task))))) { + mmput(mm); + mm = ERR_PTR(-EACCES); + } +@@ -938,13 +1033,20 @@ static int copy_fs(unsigned long clone_flags, struct task_struct *tsk) + spin_unlock(&fs->lock); + return -EAGAIN; + } +- fs->users++; ++ atomic_inc(&fs->users); + spin_unlock(&fs->lock); + return 0; + } + tsk->fs = copy_fs_struct(fs); + if (!tsk->fs) + return -ENOMEM; ++ /* Carry through gr_chroot_dentry and is_chrooted instead ++ of recomputing it here. Already copied when the task struct ++ is duplicated. This allows pivot_root to not be treated as ++ a chroot ++ */ ++ //gr_set_chroot_entries(tsk, &tsk->fs->root); ++ + return 0; + } + +@@ -1179,7 +1281,7 @@ init_task_pid(struct task_struct *task, enum pid_type type, struct pid *pid) + * parts of the process environment (as per the clone + * flags). The actual kick-off is left to the caller. + */ +-static struct task_struct *copy_process(unsigned long clone_flags, ++static __latent_entropy struct task_struct *copy_process(unsigned long clone_flags, + unsigned long stack_start, + unsigned long stack_size, + int __user *child_tidptr, +@@ -1250,6 +1352,9 @@ static struct task_struct *copy_process(unsigned long clone_flags, + DEBUG_LOCKS_WARN_ON(!p->softirqs_enabled); + #endif + retval = -EAGAIN; ++ ++ gr_learn_resource(p, RLIMIT_NPROC, atomic_read(&p->real_cred->user->processes), 0); ++ + if (atomic_read(&p->real_cred->user->processes) >= + task_rlimit(p, RLIMIT_NPROC)) { + if (p->real_cred->user != INIT_USER && +@@ -1499,6 +1604,11 @@ static struct task_struct *copy_process(unsigned long clone_flags, + goto bad_fork_free_pid; + } + ++ /* synchronizes with gr_set_acls() ++ we need to call this past the point of no return for fork() ++ */ ++ gr_copy_label(p); ++ + if (likely(p->pid)) { + ptrace_init_task(p, (clone_flags & CLONE_PTRACE) || trace); + +@@ -1589,6 +1699,8 @@ bad_fork_cleanup_count: + bad_fork_free: + free_task(p); + fork_out: ++ gr_log_forkfail(retval); ++ + return ERR_PTR(retval); + } + +@@ -1650,6 +1762,7 @@ long do_fork(unsigned long clone_flags, + + p = copy_process(clone_flags, stack_start, stack_size, + child_tidptr, NULL, trace); ++ add_latent_entropy(); + /* + * Do this prior waking up the new thread - the thread pointer + * might get invalid after that point, if the thread exits quickly. +@@ -1666,6 +1779,8 @@ long do_fork(unsigned long clone_flags, + if (clone_flags & CLONE_PARENT_SETTID) + put_user(nr, parent_tidptr); + ++ gr_handle_brute_check(); ++ + if (clone_flags & CLONE_VFORK) { + p->vfork_done = &vfork; + init_completion(&vfork); +@@ -1784,7 +1899,7 @@ void __init proc_caches_init(void) + mm_cachep = kmem_cache_create("mm_struct", + sizeof(struct mm_struct), ARCH_MIN_MMSTRUCT_ALIGN, + SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_NOTRACK, NULL); +- vm_area_cachep = KMEM_CACHE(vm_area_struct, SLAB_PANIC); ++ vm_area_cachep = KMEM_CACHE(vm_area_struct, SLAB_PANIC | SLAB_NO_SANITIZE); + mmap_init(); + nsproxy_cache_init(); + } +@@ -1824,7 +1939,7 @@ static int unshare_fs(unsigned long unshare_flags, struct fs_struct **new_fsp) + return 0; + + /* don't need lock here; in the worst case we'll do useless copy */ +- if (fs->users == 1) ++ if (atomic_read(&fs->users) == 1) + return 0; + + *new_fsp = copy_fs_struct(fs); +@@ -1936,7 +2051,8 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags) + fs = current->fs; + spin_lock(&fs->lock); + current->fs = new_fs; +- if (--fs->users) ++ gr_set_chroot_entries(current, ¤t->fs->root); ++ if (atomic_dec_return(&fs->users)) + new_fs = NULL; + else + new_fs = fs; +diff --git a/kernel/futex.c b/kernel/futex.c +index 63678b5..512f9af 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -201,7 +201,7 @@ struct futex_pi_state { + atomic_t refcount; + + union futex_key key; +-}; ++} __randomize_layout; + + /** + * struct futex_q - The hashed futex queue entry, one per waiting task +@@ -235,7 +235,7 @@ struct futex_q { + struct rt_mutex_waiter *rt_waiter; + union futex_key *requeue_pi_key; + u32 bitset; +-}; ++} __randomize_layout; + + static const struct futex_q futex_q_init = { + /* list gets initialized in queue_me()*/ +@@ -402,6 +402,11 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) + struct page *page, *page_head; + int err, ro = 0; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((mm->pax_flags & MF_PAX_SEGMEXEC) && address >= SEGMEXEC_TASK_SIZE) ++ return -EFAULT; ++#endif ++ + /* + * The futex address must be "naturally" aligned. + */ +@@ -601,7 +606,7 @@ static int cmpxchg_futex_value_locked(u32 *curval, u32 __user *uaddr, + + static int get_futex_value_locked(u32 *dest, u32 __user *from) + { +- int ret; ++ unsigned long ret; + + pagefault_disable(); + ret = __copy_from_user_inatomic(dest, from, sizeof(u32)); +@@ -3006,6 +3011,7 @@ static void __init futex_detect_cmpxchg(void) + { + #ifndef CONFIG_HAVE_FUTEX_CMPXCHG + u32 curval; ++ mm_segment_t oldfs; + + /* + * This will fail and we want it. Some arch implementations do +@@ -3017,8 +3023,11 @@ static void __init futex_detect_cmpxchg(void) + * implementation, the non-functional ones will return + * -ENOSYS. + */ ++ oldfs = get_fs(); ++ set_fs(USER_DS); + if (cmpxchg_futex_value_locked(&curval, NULL, 0, 0) == -EFAULT) + futex_cmpxchg_enabled = 1; ++ set_fs(oldfs); + #endif + } + +diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c +index 55c8c93..9ba7ad6 100644 +--- a/kernel/futex_compat.c ++++ b/kernel/futex_compat.c +@@ -32,7 +32,7 @@ fetch_robust_entry(compat_uptr_t *uentry, struct robust_list __user **entry, + return 0; + } + +-static void __user *futex_uaddr(struct robust_list __user *entry, ++static void __user __intentional_overflow(-1) *futex_uaddr(struct robust_list __user *entry, + compat_long_t futex_offset) + { + compat_uptr_t base = ptr_to_compat(entry); +diff --git a/kernel/gcov/base.c b/kernel/gcov/base.c +index b358a80..fc25240 100644 +--- a/kernel/gcov/base.c ++++ b/kernel/gcov/base.c +@@ -114,11 +114,6 @@ void gcov_enable_events(void) + } + + #ifdef CONFIG_MODULES +-static inline int within(void *addr, void *start, unsigned long size) +-{ +- return ((addr >= start) && (addr < start + size)); +-} +- + /* Update list and generate events when modules are unloaded. */ + static int gcov_module_notifier(struct notifier_block *nb, unsigned long event, + void *data) +@@ -133,7 +128,7 @@ static int gcov_module_notifier(struct notifier_block *nb, unsigned long event, + + /* Remove entries located in module from linked list. */ + while ((info = gcov_info_next(info))) { +- if (within(info, mod->module_core, mod->core_size)) { ++ if (within_module_core_rw((unsigned long)info, mod)) { + gcov_info_unlink(prev, info); + if (gcov_events_enabled) + gcov_event(GCOV_REMOVE, info); +diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c +index 0a9104b..fc260e4 100644 +--- a/kernel/irq/manage.c ++++ b/kernel/irq/manage.c +@@ -869,7 +869,7 @@ static int irq_thread(void *data) + + action_ret = handler_fn(desc, action); + if (action_ret == IRQ_HANDLED) +- atomic_inc(&desc->threads_handled); ++ atomic_inc_unchecked(&desc->threads_handled); + + wake_threads_waitq(desc); + } +diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c +index e2514b0..de3dfe0 100644 +--- a/kernel/irq/spurious.c ++++ b/kernel/irq/spurious.c +@@ -337,7 +337,7 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc, + * count. We just care about the count being + * different than the one we saw before. + */ +- handled = atomic_read(&desc->threads_handled); ++ handled = atomic_read_unchecked(&desc->threads_handled); + handled |= SPURIOUS_DEFERRED; + if (handled != desc->threads_handled_last) { + action_ret = IRQ_HANDLED; +diff --git a/kernel/jump_label.c b/kernel/jump_label.c +index 9019f15..9a3c42e 100644 +--- a/kernel/jump_label.c ++++ b/kernel/jump_label.c +@@ -14,6 +14,7 @@ + #include <linux/err.h> + #include <linux/static_key.h> + #include <linux/jump_label_ratelimit.h> ++#include <linux/mm.h> + + #ifdef HAVE_JUMP_LABEL + +@@ -51,7 +52,9 @@ jump_label_sort_entries(struct jump_entry *start, struct jump_entry *stop) + + size = (((unsigned long)stop - (unsigned long)start) + / sizeof(struct jump_entry)); ++ pax_open_kernel(); + sort(start, size, sizeof(struct jump_entry), jump_label_cmp, NULL); ++ pax_close_kernel(); + } + + static void jump_label_update(struct static_key *key, int enable); +@@ -363,10 +366,12 @@ static void jump_label_invalidate_module_init(struct module *mod) + struct jump_entry *iter_stop = iter_start + mod->num_jump_entries; + struct jump_entry *iter; + ++ pax_open_kernel(); + for (iter = iter_start; iter < iter_stop; iter++) { + if (within_module_init(iter->code, mod)) + iter->code = 0; + } ++ pax_close_kernel(); + } + + static int +diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c +index 5c5987f..bc502b0 100644 +--- a/kernel/kallsyms.c ++++ b/kernel/kallsyms.c +@@ -11,6 +11,9 @@ + * Changed the compression method from stem compression to "table lookup" + * compression (see scripts/kallsyms.c for a more complete description) + */ ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++#define __INCLUDED_BY_HIDESYM 1 ++#endif + #include <linux/kallsyms.h> + #include <linux/module.h> + #include <linux/init.h> +@@ -54,12 +57,33 @@ extern const unsigned long kallsyms_markers[] __weak; + + static inline int is_kernel_inittext(unsigned long addr) + { ++ if (system_state != SYSTEM_BOOTING) ++ return 0; ++ + if (addr >= (unsigned long)_sinittext + && addr <= (unsigned long)_einittext) + return 1; + return 0; + } + ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++#ifdef CONFIG_MODULES ++static inline int is_module_text(unsigned long addr) ++{ ++ if ((unsigned long)MODULES_EXEC_VADDR <= addr && addr <= (unsigned long)MODULES_EXEC_END) ++ return 1; ++ ++ addr = ktla_ktva(addr); ++ return (unsigned long)MODULES_EXEC_VADDR <= addr && addr <= (unsigned long)MODULES_EXEC_END; ++} ++#else ++static inline int is_module_text(unsigned long addr) ++{ ++ return 0; ++} ++#endif ++#endif ++ + static inline int is_kernel_text(unsigned long addr) + { + if ((addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) || +@@ -70,13 +94,28 @@ static inline int is_kernel_text(unsigned long addr) + + static inline int is_kernel(unsigned long addr) + { ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if (is_kernel_text(addr) || is_kernel_inittext(addr)) ++ return 1; ++ ++ if (ktla_ktva((unsigned long)_text) <= addr && addr < (unsigned long)_end) ++#else + if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end) ++#endif ++ + return 1; + return in_gate_area_no_mm(addr); + } + + static int is_ksym_addr(unsigned long addr) + { ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if (is_module_text(addr)) ++ return 0; ++#endif ++ + if (all_var) + return is_kernel(addr); + +@@ -481,7 +520,6 @@ static unsigned long get_ksymbol_core(struct kallsym_iter *iter) + + static void reset_iter(struct kallsym_iter *iter, loff_t new_pos) + { +- iter->name[0] = '\0'; + iter->nameoff = get_symbol_offset(new_pos); + iter->pos = new_pos; + } +@@ -529,6 +567,11 @@ static int s_show(struct seq_file *m, void *p) + { + struct kallsym_iter *iter = m->private; + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ if (!uid_eq(current_uid(), GLOBAL_ROOT_UID)) ++ return 0; ++#endif ++ + /* Some debugging symbols have no name. Ignore them. */ + if (!iter->name[0]) + return 0; +@@ -542,6 +585,7 @@ static int s_show(struct seq_file *m, void *p) + */ + type = iter->exported ? toupper(iter->type) : + tolower(iter->type); ++ + seq_printf(m, "%pK %c %s\t[%s]\n", (void *)iter->value, + type, iter->name, iter->module_name); + } else +diff --git a/kernel/kcmp.c b/kernel/kcmp.c +index 0aa69ea..a7fcafb 100644 +--- a/kernel/kcmp.c ++++ b/kernel/kcmp.c +@@ -100,6 +100,10 @@ SYSCALL_DEFINE5(kcmp, pid_t, pid1, pid_t, pid2, int, type, + struct task_struct *task1, *task2; + int ret; + ++#ifdef CONFIG_GRKERNSEC ++ return -ENOSYS; ++#endif ++ + rcu_read_lock(); + + /* +diff --git a/kernel/kexec.c b/kernel/kexec.c +index 2abf9f6..c40cf85 100644 +--- a/kernel/kexec.c ++++ b/kernel/kexec.c +@@ -1349,7 +1349,8 @@ COMPAT_SYSCALL_DEFINE4(kexec_load, compat_ulong_t, entry, + compat_ulong_t, flags) + { + struct compat_kexec_segment in; +- struct kexec_segment out, __user *ksegments; ++ struct kexec_segment out; ++ struct kexec_segment __user *ksegments; + unsigned long i, result; + + /* Don't allow clients that don't understand the native +diff --git a/kernel/kmod.c b/kernel/kmod.c +index 80f7a6d..585e5a4 100644 +--- a/kernel/kmod.c ++++ b/kernel/kmod.c +@@ -75,7 +75,7 @@ static void free_modprobe_argv(struct subprocess_info *info) + kfree(info->argv); + } + +-static int call_modprobe(char *module_name, int wait) ++static int call_modprobe(char *module_name, char *module_param, int wait) + { + struct subprocess_info *info; + static char *envp[] = { +@@ -85,7 +85,7 @@ static int call_modprobe(char *module_name, int wait) + NULL + }; + +- char **argv = kmalloc(sizeof(char *[5]), GFP_KERNEL); ++ char **argv = kmalloc(sizeof(char *[6]), GFP_KERNEL); + if (!argv) + goto out; + +@@ -97,7 +97,8 @@ static int call_modprobe(char *module_name, int wait) + argv[1] = "-q"; + argv[2] = "--"; + argv[3] = module_name; /* check free_modprobe_argv() */ +- argv[4] = NULL; ++ argv[4] = module_param; ++ argv[5] = NULL; + + info = call_usermodehelper_setup(modprobe_path, argv, envp, GFP_KERNEL, + NULL, free_modprobe_argv, NULL); +@@ -129,9 +130,8 @@ out: + * If module auto-loading support is disabled then this function + * becomes a no-operation. + */ +-int __request_module(bool wait, const char *fmt, ...) ++static int ____request_module(bool wait, char *module_param, const char *fmt, va_list ap) + { +- va_list args; + char module_name[MODULE_NAME_LEN]; + unsigned int max_modprobes; + int ret; +@@ -150,9 +150,7 @@ int __request_module(bool wait, const char *fmt, ...) + if (!modprobe_path[0]) + return 0; + +- va_start(args, fmt); +- ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args); +- va_end(args); ++ ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, ap); + if (ret >= MODULE_NAME_LEN) + return -ENAMETOOLONG; + +@@ -160,6 +158,20 @@ int __request_module(bool wait, const char *fmt, ...) + if (ret) + return ret; + ++#ifdef CONFIG_GRKERNSEC_MODHARDEN ++ if (uid_eq(current_uid(), GLOBAL_ROOT_UID)) { ++ /* hack to workaround consolekit/udisks stupidity */ ++ read_lock(&tasklist_lock); ++ if (!strcmp(current->comm, "mount") && ++ current->real_parent && !strncmp(current->real_parent->comm, "udisk", 5)) { ++ read_unlock(&tasklist_lock); ++ printk(KERN_ALERT "grsec: denied attempt to auto-load fs module %.64s by udisks\n", module_name); ++ return -EPERM; ++ } ++ read_unlock(&tasklist_lock); ++ } ++#endif ++ + /* If modprobe needs a service that is in a module, we get a recursive + * loop. Limit the number of running kmod threads to max_threads/2 or + * MAX_KMOD_CONCURRENT, whichever is the smaller. A cleaner method +@@ -188,16 +200,61 @@ int __request_module(bool wait, const char *fmt, ...) + + trace_module_request(module_name, wait, _RET_IP_); + +- ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC); ++ ret = call_modprobe(module_name, module_param, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC); + + atomic_dec(&kmod_concurrent); + return ret; + } ++ ++int ___request_module(bool wait, char *module_param, const char *fmt, ...) ++{ ++ va_list args; ++ int ret; ++ ++ va_start(args, fmt); ++ ret = ____request_module(wait, module_param, fmt, args); ++ va_end(args); ++ ++ return ret; ++} ++ ++int __request_module(bool wait, const char *fmt, ...) ++{ ++ va_list args; ++ int ret; ++ ++#ifdef CONFIG_GRKERNSEC_MODHARDEN ++ if (!uid_eq(current_uid(), GLOBAL_ROOT_UID)) { ++ char module_param[MODULE_NAME_LEN]; ++ ++ memset(module_param, 0, sizeof(module_param)); ++ ++ snprintf(module_param, sizeof(module_param) - 1, "grsec_modharden_normal%u_", GR_GLOBAL_UID(current_uid())); ++ ++ va_start(args, fmt); ++ ret = ____request_module(wait, module_param, fmt, args); ++ va_end(args); ++ ++ return ret; ++ } ++#endif ++ ++ va_start(args, fmt); ++ ret = ____request_module(wait, NULL, fmt, args); ++ va_end(args); ++ ++ return ret; ++} ++ + EXPORT_SYMBOL(__request_module); + #endif /* CONFIG_MODULES */ + + static void call_usermodehelper_freeinfo(struct subprocess_info *info) + { ++#ifdef CONFIG_GRKERNSEC ++ kfree(info->path); ++ info->path = info->origpath; ++#endif + if (info->cleanup) + (*info->cleanup)(info); + kfree(info); +@@ -240,6 +297,21 @@ static int ____call_usermodehelper(void *data) + */ + set_user_nice(current, 0); + ++#ifdef CONFIG_GRKERNSEC ++ /* this is race-free as far as userland is concerned as we copied ++ out the path to be used prior to this point and are now operating ++ on that copy ++ */ ++ if ((strncmp(sub_info->path, "/sbin/", 6) && strncmp(sub_info->path, "/usr/lib/", 9) && ++ strncmp(sub_info->path, "/lib/", 5) && strncmp(sub_info->path, "/lib64/", 7) && ++ strncmp(sub_info->path, "/usr/libexec/", 13) && strncmp(sub_info->path, "/usr/bin/", 9) && ++ strcmp(sub_info->path, "/usr/share/apport/apport")) || strstr(sub_info->path, "..")) { ++ printk(KERN_ALERT "grsec: denied exec of usermode helper binary %.950s located outside of permitted system paths\n", sub_info->path); ++ retval = -EPERM; ++ goto out; ++ } ++#endif ++ + retval = -ENOMEM; + new = prepare_kernel_cred(current); + if (!new) +@@ -262,8 +334,8 @@ static int ____call_usermodehelper(void *data) + commit_creds(new); + + retval = do_execve(getname_kernel(sub_info->path), +- (const char __user *const __user *)sub_info->argv, +- (const char __user *const __user *)sub_info->envp); ++ (const char __user *const __force_user *)sub_info->argv, ++ (const char __user *const __force_user *)sub_info->envp); + out: + sub_info->retval = retval; + /* wait_for_helper() will call umh_complete if UHM_WAIT_PROC. */ +@@ -303,7 +375,7 @@ static int wait_for_helper(void *data) + * + * Thus the __user pointer cast is valid here. + */ +- sys_wait4(pid, (int __user *)&ret, 0, NULL); ++ sys_wait4(pid, (int __force_user *)&ret, 0, NULL); + + /* + * If ret is 0, either ____call_usermodehelper failed and the +@@ -532,7 +604,12 @@ struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, + goto out; + + INIT_WORK(&sub_info->work, __call_usermodehelper); ++#ifdef CONFIG_GRKERNSEC ++ sub_info->origpath = path; ++ sub_info->path = kstrdup(path, gfp_mask); ++#else + sub_info->path = path; ++#endif + sub_info->argv = argv; + sub_info->envp = envp; + +@@ -645,7 +722,7 @@ EXPORT_SYMBOL(call_usermodehelper); + static int proc_cap_handler(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table t; ++ ctl_table_no_const t; + unsigned long cap_array[_KERNEL_CAPABILITY_U32S]; + kernel_cap_t new_cap; + int err, i; +diff --git a/kernel/kprobes.c b/kernel/kprobes.c +index 3995f54..e247879 100644 +--- a/kernel/kprobes.c ++++ b/kernel/kprobes.c +@@ -31,6 +31,9 @@ + * <jkenisto@us.ibm.com> and Prasanna S Panchamukhi + * <prasanna@in.ibm.com> added function-return probes. + */ ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++#define __INCLUDED_BY_HIDESYM 1 ++#endif + #include <linux/kprobes.h> + #include <linux/hash.h> + #include <linux/init.h> +@@ -122,12 +125,12 @@ enum kprobe_slot_state { + + static void *alloc_insn_page(void) + { +- return module_alloc(PAGE_SIZE); ++ return module_alloc_exec(PAGE_SIZE); + } + + static void free_insn_page(void *page) + { +- module_free(NULL, page); ++ module_free_exec(NULL, page); + } + + struct kprobe_insn_cache kprobe_insn_slots = { +@@ -2187,11 +2190,11 @@ static void report_probe(struct seq_file *pi, struct kprobe *p, + kprobe_type = "k"; + + if (sym) +- seq_printf(pi, "%p %s %s+0x%x %s ", ++ seq_printf(pi, "%pK %s %s+0x%x %s ", + p->addr, kprobe_type, sym, offset, + (modname ? modname : " ")); + else +- seq_printf(pi, "%p %s %p ", ++ seq_printf(pi, "%pK %s %pK ", + p->addr, kprobe_type, p->addr); + + if (!pp) +diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c +index 6683cce..daf8999 100644 +--- a/kernel/ksysfs.c ++++ b/kernel/ksysfs.c +@@ -50,6 +50,8 @@ static ssize_t uevent_helper_store(struct kobject *kobj, + { + if (count+1 > UEVENT_HELPER_PATH_LEN) + return -ENOENT; ++ if (!capable(CAP_SYS_ADMIN)) ++ return -EPERM; + memcpy(uevent_helper, buf, count); + uevent_helper[count] = '\0'; + if (count && uevent_helper[count-1] == '\n') +@@ -176,7 +178,7 @@ static ssize_t notes_read(struct file *filp, struct kobject *kobj, + return count; + } + +-static struct bin_attribute notes_attr = { ++static bin_attribute_no_const notes_attr __read_only = { + .attr = { + .name = "notes", + .mode = S_IRUGO, +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index 88d0d44..e9ce0ee 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -599,6 +599,10 @@ static int static_obj(void *obj) + end = (unsigned long) &_end, + addr = (unsigned long) obj; + ++#ifdef CONFIG_PAX_KERNEXEC ++ start = ktla_ktva(start); ++#endif ++ + /* + * static variable? + */ +@@ -740,6 +744,7 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force) + if (!static_obj(lock->key)) { + debug_locks_off(); + printk("INFO: trying to register non-static key.\n"); ++ printk("lock:%pS key:%pS.\n", lock, lock->key); + printk("the code is fine but needs lockdep annotation.\n"); + printk("turning off the locking correctness validator.\n"); + dump_stack(); +@@ -3081,7 +3086,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, + if (!class) + return 0; + } +- atomic_inc((atomic_t *)&class->ops); ++ atomic_long_inc_unchecked((atomic_long_unchecked_t *)&class->ops); + if (very_verbose(class)) { + printk("\nacquire class [%p] %s", class->key, class->name); + if (class->name_version > 1) +diff --git a/kernel/locking/lockdep_proc.c b/kernel/locking/lockdep_proc.c +index ef43ac4..2720dfa 100644 +--- a/kernel/locking/lockdep_proc.c ++++ b/kernel/locking/lockdep_proc.c +@@ -65,7 +65,7 @@ static int l_show(struct seq_file *m, void *v) + return 0; + } + +- seq_printf(m, "%p", class->key); ++ seq_printf(m, "%pK", class->key); + #ifdef CONFIG_DEBUG_LOCKDEP + seq_printf(m, " OPS:%8ld", class->ops); + #endif +@@ -83,7 +83,7 @@ static int l_show(struct seq_file *m, void *v) + + list_for_each_entry(entry, &class->locks_after, entry) { + if (entry->distance == 1) { +- seq_printf(m, " -> [%p] ", entry->class->key); ++ seq_printf(m, " -> [%pK] ", entry->class->key); + print_name(m, entry->class); + seq_puts(m, "\n"); + } +@@ -152,7 +152,7 @@ static int lc_show(struct seq_file *m, void *v) + if (!class->key) + continue; + +- seq_printf(m, "[%p] ", class->key); ++ seq_printf(m, "[%pK] ", class->key); + print_name(m, class); + seq_puts(m, "\n"); + } +@@ -496,7 +496,7 @@ static void seq_stats(struct seq_file *m, struct lock_stat_data *data) + if (!i) + seq_line(m, '-', 40-namelen, namelen); + +- snprintf(ip, sizeof(ip), "[<%p>]", ++ snprintf(ip, sizeof(ip), "[<%pK>]", + (void *)class->contention_point[i]); + seq_printf(m, "%40s %14lu %29s %pS\n", + name, stats->contention_point[i], +@@ -511,7 +511,7 @@ static void seq_stats(struct seq_file *m, struct lock_stat_data *data) + if (!i) + seq_line(m, '-', 40-namelen, namelen); + +- snprintf(ip, sizeof(ip), "[<%p>]", ++ snprintf(ip, sizeof(ip), "[<%pK>]", + (void *)class->contending_point[i]); + seq_printf(m, "%40s %14lu %29s %pS\n", + name, stats->contending_point[i], +diff --git a/kernel/locking/mcs_spinlock.c b/kernel/locking/mcs_spinlock.c +index 9887a90..0cd2b1d 100644 +--- a/kernel/locking/mcs_spinlock.c ++++ b/kernel/locking/mcs_spinlock.c +@@ -100,7 +100,7 @@ bool osq_lock(struct optimistic_spin_queue *lock) + + prev = decode_cpu(old); + node->prev = prev; +- ACCESS_ONCE(prev->next) = node; ++ ACCESS_ONCE_RW(prev->next) = node; + + /* + * Normally @prev is untouchable after the above store; because at that +@@ -172,8 +172,8 @@ unqueue: + * it will wait in Step-A. + */ + +- ACCESS_ONCE(next->prev) = prev; +- ACCESS_ONCE(prev->next) = next; ++ ACCESS_ONCE_RW(next->prev) = prev; ++ ACCESS_ONCE_RW(prev->next) = next; + + return false; + } +@@ -195,13 +195,13 @@ void osq_unlock(struct optimistic_spin_queue *lock) + node = this_cpu_ptr(&osq_node); + next = xchg(&node->next, NULL); + if (next) { +- ACCESS_ONCE(next->locked) = 1; ++ ACCESS_ONCE_RW(next->locked) = 1; + return; + } + + next = osq_wait_next(lock, node, NULL); + if (next) +- ACCESS_ONCE(next->locked) = 1; ++ ACCESS_ONCE_RW(next->locked) = 1; + } + + #endif +diff --git a/kernel/locking/mcs_spinlock.h b/kernel/locking/mcs_spinlock.h +index 4d60986..5d351c1 100644 +--- a/kernel/locking/mcs_spinlock.h ++++ b/kernel/locking/mcs_spinlock.h +@@ -78,7 +78,7 @@ void mcs_spin_lock(struct mcs_spinlock **lock, struct mcs_spinlock *node) + */ + return; + } +- ACCESS_ONCE(prev->next) = node; ++ ACCESS_ONCE_RW(prev->next) = node; + + /* Wait until the lock holder passes the lock down. */ + arch_mcs_spin_lock_contended(&node->locked); +diff --git a/kernel/locking/mutex-debug.c b/kernel/locking/mutex-debug.c +index 5cf6731..ce3bc5a 100644 +--- a/kernel/locking/mutex-debug.c ++++ b/kernel/locking/mutex-debug.c +@@ -49,21 +49,21 @@ void debug_mutex_free_waiter(struct mutex_waiter *waiter) + } + + void debug_mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter, +- struct thread_info *ti) ++ struct task_struct *task) + { + SMP_DEBUG_LOCKS_WARN_ON(!spin_is_locked(&lock->wait_lock)); + + /* Mark the current thread as blocked on the lock: */ +- ti->task->blocked_on = waiter; ++ task->blocked_on = waiter; + } + + void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter, +- struct thread_info *ti) ++ struct task_struct *task) + { + DEBUG_LOCKS_WARN_ON(list_empty(&waiter->list)); +- DEBUG_LOCKS_WARN_ON(waiter->task != ti->task); +- DEBUG_LOCKS_WARN_ON(ti->task->blocked_on != waiter); +- ti->task->blocked_on = NULL; ++ DEBUG_LOCKS_WARN_ON(waiter->task != task); ++ DEBUG_LOCKS_WARN_ON(task->blocked_on != waiter); ++ task->blocked_on = NULL; + + list_del_init(&waiter->list); + waiter->task = NULL; +diff --git a/kernel/locking/mutex-debug.h b/kernel/locking/mutex-debug.h +index 0799fd3..d06ae3b 100644 +--- a/kernel/locking/mutex-debug.h ++++ b/kernel/locking/mutex-debug.h +@@ -20,9 +20,9 @@ extern void debug_mutex_wake_waiter(struct mutex *lock, + extern void debug_mutex_free_waiter(struct mutex_waiter *waiter); + extern void debug_mutex_add_waiter(struct mutex *lock, + struct mutex_waiter *waiter, +- struct thread_info *ti); ++ struct task_struct *task); + extern void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter, +- struct thread_info *ti); ++ struct task_struct *task); + extern void debug_mutex_unlock(struct mutex *lock); + extern void debug_mutex_init(struct mutex *lock, const char *name, + struct lock_class_key *key); +diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c +index dadbf88..4500507 100644 +--- a/kernel/locking/mutex.c ++++ b/kernel/locking/mutex.c +@@ -518,7 +518,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + goto skip_wait; + + debug_mutex_lock_common(lock, &waiter); +- debug_mutex_add_waiter(lock, &waiter, task_thread_info(task)); ++ debug_mutex_add_waiter(lock, &waiter, task); + + /* add waiting tasks to the end of the waitqueue (FIFO): */ + list_add_tail(&waiter.list, &lock->wait_list); +@@ -563,7 +563,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + schedule_preempt_disabled(); + spin_lock_mutex(&lock->wait_lock, flags); + } +- mutex_remove_waiter(lock, &waiter, current_thread_info()); ++ mutex_remove_waiter(lock, &waiter, task); + /* set it to 0 if there are no waiters left: */ + if (likely(list_empty(&lock->wait_list))) + atomic_set(&lock->count, 0); +@@ -600,7 +600,7 @@ skip_wait: + return 0; + + err: +- mutex_remove_waiter(lock, &waiter, task_thread_info(task)); ++ mutex_remove_waiter(lock, &waiter, task); + spin_unlock_mutex(&lock->wait_lock, flags); + debug_mutex_free_waiter(&waiter); + mutex_release(&lock->dep_map, 1, ip); +diff --git a/kernel/locking/rtmutex-tester.c b/kernel/locking/rtmutex-tester.c +index 1d96dd0..994ff19 100644 +--- a/kernel/locking/rtmutex-tester.c ++++ b/kernel/locking/rtmutex-tester.c +@@ -22,7 +22,7 @@ + #define MAX_RT_TEST_MUTEXES 8 + + static spinlock_t rttest_lock; +-static atomic_t rttest_event; ++static atomic_unchecked_t rttest_event; + + struct test_thread_data { + int opcode; +@@ -63,7 +63,7 @@ static int handle_op(struct test_thread_data *td, int lockwakeup) + + case RTTEST_LOCKCONT: + td->mutexes[td->opdata] = 1; +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + return 0; + + case RTTEST_RESET: +@@ -76,7 +76,7 @@ static int handle_op(struct test_thread_data *td, int lockwakeup) + return 0; + + case RTTEST_RESETEVENT: +- atomic_set(&rttest_event, 0); ++ atomic_set_unchecked(&rttest_event, 0); + return 0; + + default: +@@ -93,9 +93,9 @@ static int handle_op(struct test_thread_data *td, int lockwakeup) + return ret; + + td->mutexes[id] = 1; +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + rt_mutex_lock(&mutexes[id]); +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + td->mutexes[id] = 4; + return 0; + +@@ -106,9 +106,9 @@ static int handle_op(struct test_thread_data *td, int lockwakeup) + return ret; + + td->mutexes[id] = 1; +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + ret = rt_mutex_lock_interruptible(&mutexes[id], 0); +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + td->mutexes[id] = ret ? 0 : 4; + return ret ? -EINTR : 0; + +@@ -117,9 +117,9 @@ static int handle_op(struct test_thread_data *td, int lockwakeup) + if (id < 0 || id >= MAX_RT_TEST_MUTEXES || td->mutexes[id] != 4) + return ret; + +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + rt_mutex_unlock(&mutexes[id]); +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + td->mutexes[id] = 0; + return 0; + +@@ -166,7 +166,7 @@ void schedule_rt_mutex_test(struct rt_mutex *mutex) + break; + + td->mutexes[dat] = 2; +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + break; + + default: +@@ -186,7 +186,7 @@ void schedule_rt_mutex_test(struct rt_mutex *mutex) + return; + + td->mutexes[dat] = 3; +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + break; + + case RTTEST_LOCKNOWAIT: +@@ -198,7 +198,7 @@ void schedule_rt_mutex_test(struct rt_mutex *mutex) + return; + + td->mutexes[dat] = 1; +- td->event = atomic_add_return(1, &rttest_event); ++ td->event = atomic_add_return_unchecked(1, &rttest_event); + return; + + default: +diff --git a/kernel/module.c b/kernel/module.c +index 88cec1d..d097c28 100644 +--- a/kernel/module.c ++++ b/kernel/module.c +@@ -60,6 +60,7 @@ + #include <linux/jump_label.h> + #include <linux/pfn.h> + #include <linux/bsearch.h> ++#include <linux/grsecurity.h> + #include <uapi/linux/module.h> + #include "module-internal.h" + +@@ -156,7 +157,8 @@ static BLOCKING_NOTIFIER_HEAD(module_notify_list); + + /* Bounds of module allocation, for speeding __module_address. + * Protected by module_mutex. */ +-static unsigned long module_addr_min = -1UL, module_addr_max = 0; ++static unsigned long module_addr_min_rw = -1UL, module_addr_max_rw = 0; ++static unsigned long module_addr_min_rx = -1UL, module_addr_max_rx = 0; + + int register_module_notifier(struct notifier_block * nb) + { +@@ -323,7 +325,7 @@ bool each_symbol_section(bool (*fn)(const struct symsearch *arr, + return true; + + list_for_each_entry_rcu(mod, &modules, list) { +- struct symsearch arr[] = { ++ struct symsearch modarr[] = { + { mod->syms, mod->syms + mod->num_syms, mod->crcs, + NOT_GPL_ONLY, false }, + { mod->gpl_syms, mod->gpl_syms + mod->num_gpl_syms, +@@ -348,7 +350,7 @@ bool each_symbol_section(bool (*fn)(const struct symsearch *arr, + if (mod->state == MODULE_STATE_UNFORMED) + continue; + +- if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data)) ++ if (each_symbol_in_section(modarr, ARRAY_SIZE(modarr), mod, fn, data)) + return true; + } + return false; +@@ -488,7 +490,7 @@ static int percpu_modalloc(struct module *mod, struct load_info *info) + if (!pcpusec->sh_size) + return 0; + +- if (align > PAGE_SIZE) { ++ if (align-1 >= PAGE_SIZE) { + pr_warn("%s: per-cpu alignment %li > %li\n", + mod->name, align, PAGE_SIZE); + align = PAGE_SIZE; +@@ -1060,7 +1062,7 @@ struct module_attribute module_uevent = + static ssize_t show_coresize(struct module_attribute *mattr, + struct module_kobject *mk, char *buffer) + { +- return sprintf(buffer, "%u\n", mk->mod->core_size); ++ return sprintf(buffer, "%u\n", mk->mod->core_size_rx + mk->mod->core_size_rw); + } + + static struct module_attribute modinfo_coresize = +@@ -1069,7 +1071,7 @@ static struct module_attribute modinfo_coresize = + static ssize_t show_initsize(struct module_attribute *mattr, + struct module_kobject *mk, char *buffer) + { +- return sprintf(buffer, "%u\n", mk->mod->init_size); ++ return sprintf(buffer, "%u\n", mk->mod->init_size_rx + mk->mod->init_size_rw); + } + + static struct module_attribute modinfo_initsize = +@@ -1161,12 +1163,29 @@ static int check_version(Elf_Shdr *sechdrs, + goto bad_version; + } + ++#ifdef CONFIG_GRKERNSEC_RANDSTRUCT ++ /* ++ * avoid potentially printing jibberish on attempted load ++ * of a module randomized with a different seed ++ */ ++ pr_warn("no symbol version for %s\n", symname); ++#else + pr_warn("%s: no symbol version for %s\n", mod->name, symname); ++#endif + return 0; + + bad_version: ++#ifdef CONFIG_GRKERNSEC_RANDSTRUCT ++ /* ++ * avoid potentially printing jibberish on attempted load ++ * of a module randomized with a different seed ++ */ ++ printk("attempted module disagrees about version of symbol %s\n", ++ symname); ++#else + printk("%s: disagrees about version of symbol %s\n", + mod->name, symname); ++#endif + return 0; + } + +@@ -1282,7 +1301,7 @@ resolve_symbol_wait(struct module *mod, + */ + #ifdef CONFIG_SYSFS + +-#ifdef CONFIG_KALLSYMS ++#if defined(CONFIG_KALLSYMS) && !defined(CONFIG_GRKERNSEC_HIDESYM) + static inline bool sect_empty(const Elf_Shdr *sect) + { + return !(sect->sh_flags & SHF_ALLOC) || sect->sh_size == 0; +@@ -1422,7 +1441,7 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info) + { + unsigned int notes, loaded, i; + struct module_notes_attrs *notes_attrs; +- struct bin_attribute *nattr; ++ bin_attribute_no_const *nattr; + + /* failed to create section attributes, so can't create notes */ + if (!mod->sect_attrs) +@@ -1534,7 +1553,7 @@ static void del_usage_links(struct module *mod) + static int module_add_modinfo_attrs(struct module *mod) + { + struct module_attribute *attr; +- struct module_attribute *temp_attr; ++ module_attribute_no_const *temp_attr; + int error = 0; + int i; + +@@ -1755,21 +1774,21 @@ static void set_section_ro_nx(void *base, + + static void unset_module_core_ro_nx(struct module *mod) + { +- set_page_attributes(mod->module_core + mod->core_text_size, +- mod->module_core + mod->core_size, ++ set_page_attributes(mod->module_core_rw, ++ mod->module_core_rw + mod->core_size_rw, + set_memory_x); +- set_page_attributes(mod->module_core, +- mod->module_core + mod->core_ro_size, ++ set_page_attributes(mod->module_core_rx, ++ mod->module_core_rx + mod->core_size_rx, + set_memory_rw); + } + + static void unset_module_init_ro_nx(struct module *mod) + { +- set_page_attributes(mod->module_init + mod->init_text_size, +- mod->module_init + mod->init_size, ++ set_page_attributes(mod->module_init_rw, ++ mod->module_init_rw + mod->init_size_rw, + set_memory_x); +- set_page_attributes(mod->module_init, +- mod->module_init + mod->init_ro_size, ++ set_page_attributes(mod->module_init_rx, ++ mod->module_init_rx + mod->init_size_rx, + set_memory_rw); + } + +@@ -1782,14 +1801,14 @@ void set_all_modules_text_rw(void) + list_for_each_entry_rcu(mod, &modules, list) { + if (mod->state == MODULE_STATE_UNFORMED) + continue; +- if ((mod->module_core) && (mod->core_text_size)) { +- set_page_attributes(mod->module_core, +- mod->module_core + mod->core_text_size, ++ if ((mod->module_core_rx) && (mod->core_size_rx)) { ++ set_page_attributes(mod->module_core_rx, ++ mod->module_core_rx + mod->core_size_rx, + set_memory_rw); + } +- if ((mod->module_init) && (mod->init_text_size)) { +- set_page_attributes(mod->module_init, +- mod->module_init + mod->init_text_size, ++ if ((mod->module_init_rx) && (mod->init_size_rx)) { ++ set_page_attributes(mod->module_init_rx, ++ mod->module_init_rx + mod->init_size_rx, + set_memory_rw); + } + } +@@ -1805,14 +1824,14 @@ void set_all_modules_text_ro(void) + list_for_each_entry_rcu(mod, &modules, list) { + if (mod->state == MODULE_STATE_UNFORMED) + continue; +- if ((mod->module_core) && (mod->core_text_size)) { +- set_page_attributes(mod->module_core, +- mod->module_core + mod->core_text_size, ++ if ((mod->module_core_rx) && (mod->core_size_rx)) { ++ set_page_attributes(mod->module_core_rx, ++ mod->module_core_rx + mod->core_size_rx, + set_memory_ro); + } +- if ((mod->module_init) && (mod->init_text_size)) { +- set_page_attributes(mod->module_init, +- mod->module_init + mod->init_text_size, ++ if ((mod->module_init_rx) && (mod->init_size_rx)) { ++ set_page_attributes(mod->module_init_rx, ++ mod->module_init_rx + mod->init_size_rx, + set_memory_ro); + } + } +@@ -1865,16 +1884,19 @@ static void free_module(struct module *mod) + + /* This may be NULL, but that's OK */ + unset_module_init_ro_nx(mod); +- module_free(mod, mod->module_init); ++ module_free(mod, mod->module_init_rw); ++ module_free_exec(mod, mod->module_init_rx); + kfree(mod->args); + percpu_modfree(mod); + + /* Free lock-classes: */ +- lockdep_free_key_range(mod->module_core, mod->core_size); ++ lockdep_free_key_range(mod->module_core_rx, mod->core_size_rx); ++ lockdep_free_key_range(mod->module_core_rw, mod->core_size_rw); + + /* Finally, free the core (containing the module structure) */ + unset_module_core_ro_nx(mod); +- module_free(mod, mod->module_core); ++ module_free_exec(mod, mod->module_core_rx); ++ module_free(mod, mod->module_core_rw); + + #ifdef CONFIG_MPU + update_protections(current->mm); +@@ -1943,9 +1965,31 @@ static int simplify_symbols(struct module *mod, const struct load_info *info) + int ret = 0; + const struct kernel_symbol *ksym; + ++#ifdef CONFIG_GRKERNSEC_MODHARDEN ++ int is_fs_load = 0; ++ int register_filesystem_found = 0; ++ char *p; ++ ++ p = strstr(mod->args, "grsec_modharden_fs"); ++ if (p) { ++ char *endptr = p + sizeof("grsec_modharden_fs") - 1; ++ /* copy \0 as well */ ++ memmove(p, endptr, strlen(mod->args) - (unsigned int)(endptr - mod->args) + 1); ++ is_fs_load = 1; ++ } ++#endif ++ + for (i = 1; i < symsec->sh_size / sizeof(Elf_Sym); i++) { + const char *name = info->strtab + sym[i].st_name; + ++#ifdef CONFIG_GRKERNSEC_MODHARDEN ++ /* it's a real shame this will never get ripped and copied ++ upstream! ;( ++ */ ++ if (is_fs_load && !strcmp(name, "register_filesystem")) ++ register_filesystem_found = 1; ++#endif ++ + switch (sym[i].st_shndx) { + case SHN_COMMON: + /* Ignore common symbols */ +@@ -1970,7 +2014,9 @@ static int simplify_symbols(struct module *mod, const struct load_info *info) + ksym = resolve_symbol_wait(mod, info, name); + /* Ok if resolved. */ + if (ksym && !IS_ERR(ksym)) { ++ pax_open_kernel(); + sym[i].st_value = ksym->value; ++ pax_close_kernel(); + break; + } + +@@ -1989,11 +2035,20 @@ static int simplify_symbols(struct module *mod, const struct load_info *info) + secbase = (unsigned long)mod_percpu(mod); + else + secbase = info->sechdrs[sym[i].st_shndx].sh_addr; ++ pax_open_kernel(); + sym[i].st_value += secbase; ++ pax_close_kernel(); + break; + } + } + ++#ifdef CONFIG_GRKERNSEC_MODHARDEN ++ if (is_fs_load && !register_filesystem_found) { ++ printk(KERN_ALERT "grsec: Denied attempt to load non-fs module %.64s through mount\n", mod->name); ++ ret = -EPERM; ++ } ++#endif ++ + return ret; + } + +@@ -2077,22 +2132,12 @@ static void layout_sections(struct module *mod, struct load_info *info) + || s->sh_entsize != ~0UL + || strstarts(sname, ".init")) + continue; +- s->sh_entsize = get_offset(mod, &mod->core_size, s, i); ++ if ((s->sh_flags & SHF_WRITE) || !(s->sh_flags & SHF_ALLOC)) ++ s->sh_entsize = get_offset(mod, &mod->core_size_rw, s, i); ++ else ++ s->sh_entsize = get_offset(mod, &mod->core_size_rx, s, i); + pr_debug("\t%s\n", sname); + } +- switch (m) { +- case 0: /* executable */ +- mod->core_size = debug_align(mod->core_size); +- mod->core_text_size = mod->core_size; +- break; +- case 1: /* RO: text and ro-data */ +- mod->core_size = debug_align(mod->core_size); +- mod->core_ro_size = mod->core_size; +- break; +- case 3: /* whole core */ +- mod->core_size = debug_align(mod->core_size); +- break; +- } + } + + pr_debug("Init section allocation order:\n"); +@@ -2106,23 +2151,13 @@ static void layout_sections(struct module *mod, struct load_info *info) + || s->sh_entsize != ~0UL + || !strstarts(sname, ".init")) + continue; +- s->sh_entsize = (get_offset(mod, &mod->init_size, s, i) +- | INIT_OFFSET_MASK); ++ if ((s->sh_flags & SHF_WRITE) || !(s->sh_flags & SHF_ALLOC)) ++ s->sh_entsize = get_offset(mod, &mod->init_size_rw, s, i); ++ else ++ s->sh_entsize = get_offset(mod, &mod->init_size_rx, s, i); ++ s->sh_entsize |= INIT_OFFSET_MASK; + pr_debug("\t%s\n", sname); + } +- switch (m) { +- case 0: /* executable */ +- mod->init_size = debug_align(mod->init_size); +- mod->init_text_size = mod->init_size; +- break; +- case 1: /* RO: text and ro-data */ +- mod->init_size = debug_align(mod->init_size); +- mod->init_ro_size = mod->init_size; +- break; +- case 3: /* whole init */ +- mod->init_size = debug_align(mod->init_size); +- break; +- } + } + } + +@@ -2295,7 +2330,7 @@ static void layout_symtab(struct module *mod, struct load_info *info) + + /* Put symbol section at end of init part of module. */ + symsect->sh_flags |= SHF_ALLOC; +- symsect->sh_entsize = get_offset(mod, &mod->init_size, symsect, ++ symsect->sh_entsize = get_offset(mod, &mod->init_size_rx, symsect, + info->index.sym) | INIT_OFFSET_MASK; + pr_debug("\t%s\n", info->secstrings + symsect->sh_name); + +@@ -2312,13 +2347,13 @@ static void layout_symtab(struct module *mod, struct load_info *info) + } + + /* Append room for core symbols at end of core part. */ +- info->symoffs = ALIGN(mod->core_size, symsect->sh_addralign ?: 1); +- info->stroffs = mod->core_size = info->symoffs + ndst * sizeof(Elf_Sym); +- mod->core_size += strtab_size; ++ info->symoffs = ALIGN(mod->core_size_rx, symsect->sh_addralign ?: 1); ++ info->stroffs = mod->core_size_rx = info->symoffs + ndst * sizeof(Elf_Sym); ++ mod->core_size_rx += strtab_size; + + /* Put string table section at end of init part of module. */ + strsect->sh_flags |= SHF_ALLOC; +- strsect->sh_entsize = get_offset(mod, &mod->init_size, strsect, ++ strsect->sh_entsize = get_offset(mod, &mod->init_size_rx, strsect, + info->index.str) | INIT_OFFSET_MASK; + pr_debug("\t%s\n", info->secstrings + strsect->sh_name); + } +@@ -2336,12 +2371,14 @@ static void add_kallsyms(struct module *mod, const struct load_info *info) + /* Make sure we get permanent strtab: don't use info->strtab. */ + mod->strtab = (void *)info->sechdrs[info->index.str].sh_addr; + ++ pax_open_kernel(); ++ + /* Set types up while we still have access to sections. */ + for (i = 0; i < mod->num_symtab; i++) + mod->symtab[i].st_info = elf_type(&mod->symtab[i], info); + +- mod->core_symtab = dst = mod->module_core + info->symoffs; +- mod->core_strtab = s = mod->module_core + info->stroffs; ++ mod->core_symtab = dst = mod->module_core_rx + info->symoffs; ++ mod->core_strtab = s = mod->module_core_rx + info->stroffs; + src = mod->symtab; + for (ndst = i = 0; i < mod->num_symtab; i++) { + if (i == 0 || +@@ -2353,6 +2390,8 @@ static void add_kallsyms(struct module *mod, const struct load_info *info) + } + } + mod->core_num_syms = ndst; ++ ++ pax_close_kernel(); + } + #else + static inline void layout_symtab(struct module *mod, struct load_info *info) +@@ -2386,17 +2425,33 @@ void * __weak module_alloc(unsigned long size) + return vmalloc_exec(size); + } + +-static void *module_alloc_update_bounds(unsigned long size) ++static void *module_alloc_update_bounds_rw(unsigned long size) + { + void *ret = module_alloc(size); + + if (ret) { + mutex_lock(&module_mutex); + /* Update module bounds. */ +- if ((unsigned long)ret < module_addr_min) +- module_addr_min = (unsigned long)ret; +- if ((unsigned long)ret + size > module_addr_max) +- module_addr_max = (unsigned long)ret + size; ++ if ((unsigned long)ret < module_addr_min_rw) ++ module_addr_min_rw = (unsigned long)ret; ++ if ((unsigned long)ret + size > module_addr_max_rw) ++ module_addr_max_rw = (unsigned long)ret + size; ++ mutex_unlock(&module_mutex); ++ } ++ return ret; ++} ++ ++static void *module_alloc_update_bounds_rx(unsigned long size) ++{ ++ void *ret = module_alloc_exec(size); ++ ++ if (ret) { ++ mutex_lock(&module_mutex); ++ /* Update module bounds. */ ++ if ((unsigned long)ret < module_addr_min_rx) ++ module_addr_min_rx = (unsigned long)ret; ++ if ((unsigned long)ret + size > module_addr_max_rx) ++ module_addr_max_rx = (unsigned long)ret + size; + mutex_unlock(&module_mutex); + } + return ret; +@@ -2650,7 +2705,15 @@ static struct module *setup_load_info(struct load_info *info, int flags) + mod = (void *)info->sechdrs[info->index.mod].sh_addr; + + if (info->index.sym == 0) { ++#ifdef CONFIG_GRKERNSEC_RANDSTRUCT ++ /* ++ * avoid potentially printing jibberish on attempted load ++ * of a module randomized with a different seed ++ */ ++ pr_warn("module has no symbols (stripped?)\n"); ++#else + pr_warn("%s: module has no symbols (stripped?)\n", mod->name); ++#endif + return ERR_PTR(-ENOEXEC); + } + +@@ -2666,8 +2729,14 @@ static struct module *setup_load_info(struct load_info *info, int flags) + static int check_modinfo(struct module *mod, struct load_info *info, int flags) + { + const char *modmagic = get_modinfo(info, "vermagic"); ++ const char *license = get_modinfo(info, "license"); + int err; + ++#ifdef CONFIG_PAX_KERNEXEC_PLUGIN_METHOD_OR ++ if (!license || !license_is_gpl_compatible(license)) ++ return -ENOEXEC; ++#endif ++ + if (flags & MODULE_INIT_IGNORE_VERMAGIC) + modmagic = NULL; + +@@ -2692,7 +2761,7 @@ static int check_modinfo(struct module *mod, struct load_info *info, int flags) + } + + /* Set up license info based on the info section */ +- set_license(mod, get_modinfo(info, "license")); ++ set_license(mod, license); + + return 0; + } +@@ -2786,7 +2855,7 @@ static int move_module(struct module *mod, struct load_info *info) + void *ptr; + + /* Do the allocs. */ +- ptr = module_alloc_update_bounds(mod->core_size); ++ ptr = module_alloc_update_bounds_rw(mod->core_size_rw); + /* + * The pointer to this block is stored in the module structure + * which is inside the block. Just mark it as not being a +@@ -2796,11 +2865,11 @@ static int move_module(struct module *mod, struct load_info *info) + if (!ptr) + return -ENOMEM; + +- memset(ptr, 0, mod->core_size); +- mod->module_core = ptr; ++ memset(ptr, 0, mod->core_size_rw); ++ mod->module_core_rw = ptr; + +- if (mod->init_size) { +- ptr = module_alloc_update_bounds(mod->init_size); ++ if (mod->init_size_rw) { ++ ptr = module_alloc_update_bounds_rw(mod->init_size_rw); + /* + * The pointer to this block is stored in the module structure + * which is inside the block. This block doesn't need to be +@@ -2809,13 +2878,45 @@ static int move_module(struct module *mod, struct load_info *info) + */ + kmemleak_ignore(ptr); + if (!ptr) { +- module_free(mod, mod->module_core); ++ module_free(mod, mod->module_core_rw); ++ return -ENOMEM; ++ } ++ memset(ptr, 0, mod->init_size_rw); ++ mod->module_init_rw = ptr; ++ } else ++ mod->module_init_rw = NULL; ++ ++ ptr = module_alloc_update_bounds_rx(mod->core_size_rx); ++ kmemleak_not_leak(ptr); ++ if (!ptr) { ++ if (mod->module_init_rw) ++ module_free(mod, mod->module_init_rw); ++ module_free(mod, mod->module_core_rw); ++ return -ENOMEM; ++ } ++ ++ pax_open_kernel(); ++ memset(ptr, 0, mod->core_size_rx); ++ pax_close_kernel(); ++ mod->module_core_rx = ptr; ++ ++ if (mod->init_size_rx) { ++ ptr = module_alloc_update_bounds_rx(mod->init_size_rx); ++ kmemleak_ignore(ptr); ++ if (!ptr && mod->init_size_rx) { ++ module_free_exec(mod, mod->module_core_rx); ++ if (mod->module_init_rw) ++ module_free(mod, mod->module_init_rw); ++ module_free(mod, mod->module_core_rw); + return -ENOMEM; + } +- memset(ptr, 0, mod->init_size); +- mod->module_init = ptr; ++ ++ pax_open_kernel(); ++ memset(ptr, 0, mod->init_size_rx); ++ pax_close_kernel(); ++ mod->module_init_rx = ptr; + } else +- mod->module_init = NULL; ++ mod->module_init_rx = NULL; + + /* Transfer each section which specifies SHF_ALLOC */ + pr_debug("final section addresses:\n"); +@@ -2826,16 +2927,45 @@ static int move_module(struct module *mod, struct load_info *info) + if (!(shdr->sh_flags & SHF_ALLOC)) + continue; + +- if (shdr->sh_entsize & INIT_OFFSET_MASK) +- dest = mod->module_init +- + (shdr->sh_entsize & ~INIT_OFFSET_MASK); +- else +- dest = mod->module_core + shdr->sh_entsize; ++ if (shdr->sh_entsize & INIT_OFFSET_MASK) { ++ if ((shdr->sh_flags & SHF_WRITE) || !(shdr->sh_flags & SHF_ALLOC)) ++ dest = mod->module_init_rw ++ + (shdr->sh_entsize & ~INIT_OFFSET_MASK); ++ else ++ dest = mod->module_init_rx ++ + (shdr->sh_entsize & ~INIT_OFFSET_MASK); ++ } else { ++ if ((shdr->sh_flags & SHF_WRITE) || !(shdr->sh_flags & SHF_ALLOC)) ++ dest = mod->module_core_rw + shdr->sh_entsize; ++ else ++ dest = mod->module_core_rx + shdr->sh_entsize; ++ } ++ ++ if (shdr->sh_type != SHT_NOBITS) { ++ ++#ifdef CONFIG_PAX_KERNEXEC ++#ifdef CONFIG_X86_64 ++ if ((shdr->sh_flags & SHF_WRITE) && (shdr->sh_flags & SHF_EXECINSTR)) ++ set_memory_x((unsigned long)dest, (shdr->sh_size + PAGE_SIZE) >> PAGE_SHIFT); ++#endif ++ if (!(shdr->sh_flags & SHF_WRITE) && (shdr->sh_flags & SHF_ALLOC)) { ++ pax_open_kernel(); ++ memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size); ++ pax_close_kernel(); ++ } else ++#endif + +- if (shdr->sh_type != SHT_NOBITS) + memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size); ++ } + /* Update sh_addr to point to copy in image. */ +- shdr->sh_addr = (unsigned long)dest; ++ ++#ifdef CONFIG_PAX_KERNEXEC ++ if (shdr->sh_flags & SHF_EXECINSTR) ++ shdr->sh_addr = ktva_ktla((unsigned long)dest); ++ else ++#endif ++ ++ shdr->sh_addr = (unsigned long)dest; + pr_debug("\t0x%lx %s\n", + (long)shdr->sh_addr, info->secstrings + shdr->sh_name); + } +@@ -2892,12 +3022,12 @@ static void flush_module_icache(const struct module *mod) + * Do it before processing of module parameters, so the module + * can provide parameter accessor functions of its own. + */ +- if (mod->module_init) +- flush_icache_range((unsigned long)mod->module_init, +- (unsigned long)mod->module_init +- + mod->init_size); +- flush_icache_range((unsigned long)mod->module_core, +- (unsigned long)mod->module_core + mod->core_size); ++ if (mod->module_init_rx) ++ flush_icache_range((unsigned long)mod->module_init_rx, ++ (unsigned long)mod->module_init_rx ++ + mod->init_size_rx); ++ flush_icache_range((unsigned long)mod->module_core_rx, ++ (unsigned long)mod->module_core_rx + mod->core_size_rx); + + set_fs(old_fs); + } +@@ -2954,8 +3084,10 @@ static struct module *layout_and_allocate(struct load_info *info, int flags) + static void module_deallocate(struct module *mod, struct load_info *info) + { + percpu_modfree(mod); +- module_free(mod, mod->module_init); +- module_free(mod, mod->module_core); ++ module_free_exec(mod, mod->module_init_rx); ++ module_free_exec(mod, mod->module_core_rx); ++ module_free(mod, mod->module_init_rw); ++ module_free(mod, mod->module_core_rw); + } + + int __weak module_finalize(const Elf_Ehdr *hdr, +@@ -2968,7 +3100,9 @@ int __weak module_finalize(const Elf_Ehdr *hdr, + static int post_relocation(struct module *mod, const struct load_info *info) + { + /* Sort exception table now relocations are done. */ ++ pax_open_kernel(); + sort_extable(mod->extable, mod->extable + mod->num_exentries); ++ pax_close_kernel(); + + /* Copy relocated percpu area over. */ + percpu_modcopy(mod, (void *)info->sechdrs[info->index.pcpu].sh_addr, +@@ -3077,11 +3211,12 @@ static int do_init_module(struct module *mod) + mod->strtab = mod->core_strtab; + #endif + unset_module_init_ro_nx(mod); +- module_free(mod, mod->module_init); +- mod->module_init = NULL; +- mod->init_size = 0; +- mod->init_ro_size = 0; +- mod->init_text_size = 0; ++ module_free(mod, mod->module_init_rw); ++ module_free_exec(mod, mod->module_init_rx); ++ mod->module_init_rw = NULL; ++ mod->module_init_rx = NULL; ++ mod->init_size_rw = 0; ++ mod->init_size_rx = 0; + mutex_unlock(&module_mutex); + wake_up_all(&module_wq); + +@@ -3149,16 +3284,16 @@ static int complete_formation(struct module *mod, struct load_info *info) + module_bug_finalize(info->hdr, info->sechdrs, mod); + + /* Set RO and NX regions for core */ +- set_section_ro_nx(mod->module_core, +- mod->core_text_size, +- mod->core_ro_size, +- mod->core_size); ++ set_section_ro_nx(mod->module_core_rx, ++ mod->core_size_rx, ++ mod->core_size_rx, ++ mod->core_size_rx); + + /* Set RO and NX regions for init */ +- set_section_ro_nx(mod->module_init, +- mod->init_text_size, +- mod->init_ro_size, +- mod->init_size); ++ set_section_ro_nx(mod->module_init_rx, ++ mod->init_size_rx, ++ mod->init_size_rx, ++ mod->init_size_rx); + + /* Mark state as coming so strong_try_module_get() ignores us, + * but kallsyms etc. can see us. */ +@@ -3242,9 +3377,38 @@ static int load_module(struct load_info *info, const char __user *uargs, + if (err) + goto free_unload; + ++ /* Now copy in args */ ++ mod->args = strndup_user(uargs, ~0UL >> 1); ++ if (IS_ERR(mod->args)) { ++ err = PTR_ERR(mod->args); ++ goto free_unload; ++ } ++ + /* Set up MODINFO_ATTR fields */ + setup_modinfo(mod, info); + ++#ifdef CONFIG_GRKERNSEC_MODHARDEN ++ { ++ char *p, *p2; ++ ++ if (strstr(mod->args, "grsec_modharden_netdev")) { ++ printk(KERN_ALERT "grsec: denied auto-loading kernel module for a network device with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev-%.64s instead.", mod->name); ++ err = -EPERM; ++ goto free_modinfo; ++ } else if ((p = strstr(mod->args, "grsec_modharden_normal"))) { ++ p += sizeof("grsec_modharden_normal") - 1; ++ p2 = strstr(p, "_"); ++ if (p2) { ++ *p2 = '\0'; ++ printk(KERN_ALERT "grsec: denied kernel module auto-load of %.64s by uid %.9s\n", mod->name, p); ++ *p2 = '_'; ++ } ++ err = -EPERM; ++ goto free_modinfo; ++ } ++ } ++#endif ++ + /* Fix up syms, so that st_value is a pointer to location. */ + err = simplify_symbols(mod, info); + if (err < 0) +@@ -3260,13 +3424,6 @@ static int load_module(struct load_info *info, const char __user *uargs, + + flush_module_icache(mod); + +- /* Now copy in args */ +- mod->args = strndup_user(uargs, ~0UL >> 1); +- if (IS_ERR(mod->args)) { +- err = PTR_ERR(mod->args); +- goto free_arch_cleanup; +- } +- + dynamic_debug_setup(info->debug, info->num_debug); + + /* Ftrace init must be called in the MODULE_STATE_UNFORMED state */ +@@ -3314,11 +3471,10 @@ static int load_module(struct load_info *info, const char __user *uargs, + ddebug_cleanup: + dynamic_debug_remove(info->debug); + synchronize_sched(); +- kfree(mod->args); +- free_arch_cleanup: + module_arch_cleanup(mod); + free_modinfo: + free_modinfo(mod); ++ kfree(mod->args); + free_unload: + module_unload_free(mod); + unlink_mod: +@@ -3403,10 +3559,16 @@ static const char *get_ksymbol(struct module *mod, + unsigned long nextval; + + /* At worse, next value is at end of module */ +- if (within_module_init(addr, mod)) +- nextval = (unsigned long)mod->module_init+mod->init_text_size; ++ if (within_module_init_rx(addr, mod)) ++ nextval = (unsigned long)mod->module_init_rx+mod->init_size_rx; ++ else if (within_module_init_rw(addr, mod)) ++ nextval = (unsigned long)mod->module_init_rw+mod->init_size_rw; ++ else if (within_module_core_rx(addr, mod)) ++ nextval = (unsigned long)mod->module_core_rx+mod->core_size_rx; ++ else if (within_module_core_rw(addr, mod)) ++ nextval = (unsigned long)mod->module_core_rw+mod->core_size_rw; + else +- nextval = (unsigned long)mod->module_core+mod->core_text_size; ++ return NULL; + + /* Scan for closest preceding symbol, and next symbol. (ELF + starts real symbols at 1). */ +@@ -3654,7 +3816,7 @@ static int m_show(struct seq_file *m, void *p) + return 0; + + seq_printf(m, "%s %u", +- mod->name, mod->init_size + mod->core_size); ++ mod->name, mod->init_size_rx + mod->init_size_rw + mod->core_size_rx + mod->core_size_rw); + print_unload_info(m, mod); + + /* Informative for users. */ +@@ -3663,7 +3825,7 @@ static int m_show(struct seq_file *m, void *p) + mod->state == MODULE_STATE_COMING ? "Loading": + "Live"); + /* Used by oprofile and other similar tools. */ +- seq_printf(m, " 0x%pK", mod->module_core); ++ seq_printf(m, " 0x%pK 0x%pK", mod->module_core_rx, mod->module_core_rw); + + /* Taints info */ + if (mod->taints) +@@ -3699,7 +3861,17 @@ static const struct file_operations proc_modules_operations = { + + static int __init proc_modules_init(void) + { ++#ifndef CONFIG_GRKERNSEC_HIDESYM ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ proc_create("modules", S_IRUSR, NULL, &proc_modules_operations); ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ proc_create("modules", S_IRUSR | S_IRGRP, NULL, &proc_modules_operations); ++#else + proc_create("modules", 0, NULL, &proc_modules_operations); ++#endif ++#else ++ proc_create("modules", S_IRUSR, NULL, &proc_modules_operations); ++#endif + return 0; + } + module_init(proc_modules_init); +@@ -3760,7 +3932,8 @@ struct module *__module_address(unsigned long addr) + { + struct module *mod; + +- if (addr < module_addr_min || addr > module_addr_max) ++ if ((addr < module_addr_min_rx || addr > module_addr_max_rx) && ++ (addr < module_addr_min_rw || addr > module_addr_max_rw)) + return NULL; + + list_for_each_entry_rcu(mod, &modules, list) { +@@ -3801,11 +3974,20 @@ bool is_module_text_address(unsigned long addr) + */ + struct module *__module_text_address(unsigned long addr) + { +- struct module *mod = __module_address(addr); ++ struct module *mod; ++ ++#ifdef CONFIG_X86_32 ++ addr = ktla_ktva(addr); ++#endif ++ ++ if (addr < module_addr_min_rx || addr > module_addr_max_rx) ++ return NULL; ++ ++ mod = __module_address(addr); ++ + if (mod) { + /* Make sure it's within the text section. */ +- if (!within(addr, mod->module_init, mod->init_text_size) +- && !within(addr, mod->module_core, mod->core_text_size)) ++ if (!within_module_init_rx(addr, mod) && !within_module_core_rx(addr, mod)) + mod = NULL; + } + return mod; +diff --git a/kernel/notifier.c b/kernel/notifier.c +index 4803da6..1c5eea6 100644 +--- a/kernel/notifier.c ++++ b/kernel/notifier.c +@@ -5,6 +5,7 @@ + #include <linux/rcupdate.h> + #include <linux/vmalloc.h> + #include <linux/reboot.h> ++#include <linux/mm.h> + + /* + * Notifier list for kernel code which wants to be called +@@ -24,10 +25,12 @@ static int notifier_chain_register(struct notifier_block **nl, + while ((*nl) != NULL) { + if (n->priority > (*nl)->priority) + break; +- nl = &((*nl)->next); ++ nl = (struct notifier_block **)&((*nl)->next); + } +- n->next = *nl; ++ pax_open_kernel(); ++ *(const void **)&n->next = *nl; + rcu_assign_pointer(*nl, n); ++ pax_close_kernel(); + return 0; + } + +@@ -39,10 +42,12 @@ static int notifier_chain_cond_register(struct notifier_block **nl, + return 0; + if (n->priority > (*nl)->priority) + break; +- nl = &((*nl)->next); ++ nl = (struct notifier_block **)&((*nl)->next); + } +- n->next = *nl; ++ pax_open_kernel(); ++ *(const void **)&n->next = *nl; + rcu_assign_pointer(*nl, n); ++ pax_close_kernel(); + return 0; + } + +@@ -51,10 +56,12 @@ static int notifier_chain_unregister(struct notifier_block **nl, + { + while ((*nl) != NULL) { + if ((*nl) == n) { ++ pax_open_kernel(); + rcu_assign_pointer(*nl, n->next); ++ pax_close_kernel(); + return 0; + } +- nl = &((*nl)->next); ++ nl = (struct notifier_block **)&((*nl)->next); + } + return -ENOENT; + } +diff --git a/kernel/padata.c b/kernel/padata.c +index 161402f..598814c 100644 +--- a/kernel/padata.c ++++ b/kernel/padata.c +@@ -54,7 +54,7 @@ static int padata_cpu_hash(struct parallel_data *pd) + * seq_nr mod. number of cpus in use. + */ + +- seq_nr = atomic_inc_return(&pd->seq_nr); ++ seq_nr = atomic_inc_return_unchecked(&pd->seq_nr); + cpu_index = seq_nr % cpumask_weight(pd->cpumask.pcpu); + + return padata_index_to_cpu(pd, cpu_index); +@@ -428,7 +428,7 @@ static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst, + padata_init_pqueues(pd); + padata_init_squeues(pd); + setup_timer(&pd->timer, padata_reorder_timer, (unsigned long)pd); +- atomic_set(&pd->seq_nr, -1); ++ atomic_set_unchecked(&pd->seq_nr, -1); + atomic_set(&pd->reorder_objects, 0); + atomic_set(&pd->refcnt, 0); + pd->pinst = pinst; +diff --git a/kernel/panic.c b/kernel/panic.c +index cf80672..f6771b2 100644 +--- a/kernel/panic.c ++++ b/kernel/panic.c +@@ -53,7 +53,7 @@ EXPORT_SYMBOL(panic_blink); + /* + * Stop ourself in panic -- architecture code may override this + */ +-void __weak panic_smp_self_stop(void) ++void __weak __noreturn panic_smp_self_stop(void) + { + while (1) + cpu_relax(); +@@ -422,7 +422,7 @@ static void warn_slowpath_common(const char *file, int line, void *caller, + disable_trace_on_warning(); + + pr_warn("------------[ cut here ]------------\n"); +- pr_warn("WARNING: CPU: %d PID: %d at %s:%d %pS()\n", ++ pr_warn("WARNING: CPU: %d PID: %d at %s:%d %pA()\n", + raw_smp_processor_id(), current->pid, file, line, caller); + + if (args) +@@ -476,7 +476,8 @@ EXPORT_SYMBOL(warn_slowpath_null); + */ + __visible void __stack_chk_fail(void) + { +- panic("stack-protector: Kernel stack is corrupted in: %p\n", ++ dump_stack(); ++ panic("stack-protector: Kernel stack is corrupted in: %pA\n", + __builtin_return_address(0)); + } + EXPORT_SYMBOL(__stack_chk_fail); +diff --git a/kernel/pid.c b/kernel/pid.c +index 82430c8..53d7793 100644 +--- a/kernel/pid.c ++++ b/kernel/pid.c +@@ -33,6 +33,7 @@ + #include <linux/rculist.h> + #include <linux/bootmem.h> + #include <linux/hash.h> ++#include <linux/security.h> + #include <linux/pid_namespace.h> + #include <linux/init_task.h> + #include <linux/syscalls.h> +@@ -47,7 +48,7 @@ struct pid init_struct_pid = INIT_STRUCT_PID; + + int pid_max = PID_MAX_DEFAULT; + +-#define RESERVED_PIDS 300 ++#define RESERVED_PIDS 500 + + int pid_max_min = RESERVED_PIDS + 1; + int pid_max_max = PID_MAX_LIMIT; +@@ -447,10 +448,18 @@ EXPORT_SYMBOL(pid_task); + */ + struct task_struct *find_task_by_pid_ns(pid_t nr, struct pid_namespace *ns) + { ++ struct task_struct *task; ++ + rcu_lockdep_assert(rcu_read_lock_held(), + "find_task_by_pid_ns() needs rcu_read_lock()" + " protection"); +- return pid_task(find_pid_ns(nr, ns), PIDTYPE_PID); ++ ++ task = pid_task(find_pid_ns(nr, ns), PIDTYPE_PID); ++ ++ if (gr_pid_is_chrooted(task)) ++ return NULL; ++ ++ return task; + } + + struct task_struct *find_task_by_vpid(pid_t vnr) +@@ -458,6 +467,14 @@ struct task_struct *find_task_by_vpid(pid_t vnr) + return find_task_by_pid_ns(vnr, task_active_pid_ns(current)); + } + ++struct task_struct *find_task_by_vpid_unrestricted(pid_t vnr) ++{ ++ rcu_lockdep_assert(rcu_read_lock_held(), ++ "find_task_by_pid_ns() needs rcu_read_lock()" ++ " protection"); ++ return pid_task(find_pid_ns(vnr, task_active_pid_ns(current)), PIDTYPE_PID); ++} ++ + struct pid *get_task_pid(struct task_struct *task, enum pid_type type) + { + struct pid *pid; +diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c +index db95d8e..a0ca23f 100644 +--- a/kernel/pid_namespace.c ++++ b/kernel/pid_namespace.c +@@ -253,7 +253,7 @@ static int pid_ns_ctl_handler(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { + struct pid_namespace *pid_ns = task_active_pid_ns(current); +- struct ctl_table tmp = *table; ++ ctl_table_no_const tmp = *table; + + if (write && !ns_capable(pid_ns->user_ns, CAP_SYS_ADMIN)) + return -EPERM; +diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig +index bbef57f..5f94462 100644 +--- a/kernel/power/Kconfig ++++ b/kernel/power/Kconfig +@@ -24,6 +24,8 @@ config HIBERNATE_CALLBACKS + config HIBERNATION + bool "Hibernation (aka 'suspend to disk')" + depends on SWAP && ARCH_HIBERNATION_POSSIBLE ++ depends on !GRKERNSEC_KMEM ++ depends on !PAX_MEMORY_SANITIZE + select HIBERNATE_CALLBACKS + select LZO_COMPRESS + select LZO_DECOMPRESS +diff --git a/kernel/power/process.c b/kernel/power/process.c +index 5a6ec86..3a8c884 100644 +--- a/kernel/power/process.c ++++ b/kernel/power/process.c +@@ -35,6 +35,7 @@ static int try_to_freeze_tasks(bool user_only) + unsigned int elapsed_msecs; + bool wakeup = false; + int sleep_usecs = USEC_PER_MSEC; ++ bool timedout = false; + + do_gettimeofday(&start); + +@@ -45,13 +46,20 @@ static int try_to_freeze_tasks(bool user_only) + + while (true) { + todo = 0; ++ if (time_after(jiffies, end_time)) ++ timedout = true; + read_lock(&tasklist_lock); + for_each_process_thread(g, p) { + if (p == current || !freeze_task(p)) + continue; + +- if (!freezer_should_skip(p)) ++ if (!freezer_should_skip(p)) { + todo++; ++ if (timedout) { ++ printk(KERN_ERR "Task refusing to freeze:\n"); ++ sched_show_task(p); ++ } ++ } + } + read_unlock(&tasklist_lock); + +@@ -60,7 +68,7 @@ static int try_to_freeze_tasks(bool user_only) + todo += wq_busy; + } + +- if (!todo || time_after(jiffies, end_time)) ++ if (!todo || timedout) + break; + + if (pm_wakeup_pending()) { +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index bf95fda..68b84ae 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -489,6 +489,11 @@ static int check_syslog_permissions(int type, bool from_file) + if (from_file && type != SYSLOG_ACTION_OPEN) + return 0; + ++#ifdef CONFIG_GRKERNSEC_DMESG ++ if (grsec_enable_dmesg && !capable(CAP_SYSLOG) && !capable_nolog(CAP_SYS_ADMIN)) ++ return -EPERM; ++#endif ++ + if (syslog_action_restricted(type)) { + if (capable(CAP_SYSLOG)) + return 0; +diff --git a/kernel/profile.c b/kernel/profile.c +index 54bf5ba..df6e0a2 100644 +--- a/kernel/profile.c ++++ b/kernel/profile.c +@@ -37,7 +37,7 @@ struct profile_hit { + #define NR_PROFILE_HIT (PAGE_SIZE/sizeof(struct profile_hit)) + #define NR_PROFILE_GRP (NR_PROFILE_HIT/PROFILE_GRPSZ) + +-static atomic_t *prof_buffer; ++static atomic_unchecked_t *prof_buffer; + static unsigned long prof_len, prof_shift; + + int prof_on __read_mostly; +@@ -256,7 +256,7 @@ static void profile_flip_buffers(void) + hits[i].pc = 0; + continue; + } +- atomic_add(hits[i].hits, &prof_buffer[hits[i].pc]); ++ atomic_add_unchecked(hits[i].hits, &prof_buffer[hits[i].pc]); + hits[i].hits = hits[i].pc = 0; + } + } +@@ -317,9 +317,9 @@ static void do_profile_hits(int type, void *__pc, unsigned int nr_hits) + * Add the current hit(s) and flush the write-queue out + * to the global buffer: + */ +- atomic_add(nr_hits, &prof_buffer[pc]); ++ atomic_add_unchecked(nr_hits, &prof_buffer[pc]); + for (i = 0; i < NR_PROFILE_HIT; ++i) { +- atomic_add(hits[i].hits, &prof_buffer[hits[i].pc]); ++ atomic_add_unchecked(hits[i].hits, &prof_buffer[hits[i].pc]); + hits[i].pc = hits[i].hits = 0; + } + out: +@@ -394,7 +394,7 @@ static void do_profile_hits(int type, void *__pc, unsigned int nr_hits) + { + unsigned long pc; + pc = ((unsigned long)__pc - (unsigned long)_stext) >> prof_shift; +- atomic_add(nr_hits, &prof_buffer[min(pc, prof_len - 1)]); ++ atomic_add_unchecked(nr_hits, &prof_buffer[min(pc, prof_len - 1)]); + } + #endif /* !CONFIG_SMP */ + +@@ -490,7 +490,7 @@ read_profile(struct file *file, char __user *buf, size_t count, loff_t *ppos) + return -EFAULT; + buf++; p++; count--; read++; + } +- pnt = (char *)prof_buffer + p - sizeof(atomic_t); ++ pnt = (char *)prof_buffer + p - sizeof(atomic_unchecked_t); + if (copy_to_user(buf, (void *)pnt, count)) + return -EFAULT; + read += count; +@@ -521,7 +521,7 @@ static ssize_t write_profile(struct file *file, const char __user *buf, + } + #endif + profile_discard_flip_buffers(); +- memset(prof_buffer, 0, prof_len * sizeof(atomic_t)); ++ memset(prof_buffer, 0, prof_len * sizeof(atomic_unchecked_t)); + return count; + } + +diff --git a/kernel/ptrace.c b/kernel/ptrace.c +index 54e7522..5b82dd6 100644 +--- a/kernel/ptrace.c ++++ b/kernel/ptrace.c +@@ -321,7 +321,7 @@ static int ptrace_attach(struct task_struct *task, long request, + if (seize) + flags |= PT_SEIZED; + rcu_read_lock(); +- if (ns_capable(__task_cred(task)->user_ns, CAP_SYS_PTRACE)) ++ if (ns_capable_nolog(__task_cred(task)->user_ns, CAP_SYS_PTRACE)) + flags |= PT_PTRACE_CAP; + rcu_read_unlock(); + task->ptrace = flags; +@@ -532,7 +532,7 @@ int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst + break; + return -EIO; + } +- if (copy_to_user(dst, buf, retval)) ++ if (retval > sizeof(buf) || copy_to_user(dst, buf, retval)) + return -EFAULT; + copied += retval; + src += retval; +@@ -800,7 +800,7 @@ int ptrace_request(struct task_struct *child, long request, + bool seized = child->ptrace & PT_SEIZED; + int ret = -EIO; + siginfo_t siginfo, *si; +- void __user *datavp = (void __user *) data; ++ void __user *datavp = (__force void __user *) data; + unsigned long __user *datalp = datavp; + unsigned long flags; + +@@ -1046,14 +1046,21 @@ SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr, + goto out; + } + ++ if (gr_handle_ptrace(child, request)) { ++ ret = -EPERM; ++ goto out_put_task_struct; ++ } ++ + if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { + ret = ptrace_attach(child, request, addr, data); + /* + * Some architectures need to do book-keeping after + * a ptrace attach. + */ +- if (!ret) ++ if (!ret) { + arch_ptrace_attach(child); ++ gr_audit_ptrace(child); ++ } + goto out_put_task_struct; + } + +@@ -1081,7 +1088,7 @@ int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, + copied = access_process_vm(tsk, addr, &tmp, sizeof(tmp), 0); + if (copied != sizeof(tmp)) + return -EIO; +- return put_user(tmp, (unsigned long __user *)data); ++ return put_user(tmp, (__force unsigned long __user *)data); + } + + int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, +@@ -1175,7 +1182,7 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request, + } + + COMPAT_SYSCALL_DEFINE4(ptrace, compat_long_t, request, compat_long_t, pid, +- compat_long_t, addr, compat_long_t, data) ++ compat_ulong_t, addr, compat_ulong_t, data) + { + struct task_struct *child; + long ret; +@@ -1191,14 +1198,21 @@ COMPAT_SYSCALL_DEFINE4(ptrace, compat_long_t, request, compat_long_t, pid, + goto out; + } + ++ if (gr_handle_ptrace(child, request)) { ++ ret = -EPERM; ++ goto out_put_task_struct; ++ } ++ + if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) { + ret = ptrace_attach(child, request, addr, data); + /* + * Some architectures need to do book-keeping after + * a ptrace attach. + */ +- if (!ret) ++ if (!ret) { + arch_ptrace_attach(child); ++ gr_audit_ptrace(child); ++ } + goto out_put_task_struct; + } + +diff --git a/kernel/range.c b/kernel/range.c +index 322ea8e..82cfc28 100644 +--- a/kernel/range.c ++++ b/kernel/range.c +@@ -113,12 +113,12 @@ static int cmp_range(const void *x1, const void *x2) + { + const struct range *r1 = x1; + const struct range *r2 = x2; +- s64 start1, start2; + +- start1 = r1->start; +- start2 = r2->start; +- +- return start1 - start2; ++ if (r1->start < r2->start) ++ return -1; ++ if (r1->start > r2->start) ++ return 1; ++ return 0; + } + + int clean_sort_range(struct range *range, int az) +diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c +index 240fa90..5fa56bd 100644 +--- a/kernel/rcu/rcutorture.c ++++ b/kernel/rcu/rcutorture.c +@@ -134,12 +134,12 @@ static DEFINE_PER_CPU(long [RCU_TORTURE_PIPE_LEN + 1], + rcu_torture_count) = { 0 }; + static DEFINE_PER_CPU(long [RCU_TORTURE_PIPE_LEN + 1], + rcu_torture_batch) = { 0 }; +-static atomic_t rcu_torture_wcount[RCU_TORTURE_PIPE_LEN + 1]; +-static atomic_t n_rcu_torture_alloc; +-static atomic_t n_rcu_torture_alloc_fail; +-static atomic_t n_rcu_torture_free; +-static atomic_t n_rcu_torture_mberror; +-static atomic_t n_rcu_torture_error; ++static atomic_unchecked_t rcu_torture_wcount[RCU_TORTURE_PIPE_LEN + 1]; ++static atomic_unchecked_t n_rcu_torture_alloc; ++static atomic_unchecked_t n_rcu_torture_alloc_fail; ++static atomic_unchecked_t n_rcu_torture_free; ++static atomic_unchecked_t n_rcu_torture_mberror; ++static atomic_unchecked_t n_rcu_torture_error; + static long n_rcu_torture_barrier_error; + static long n_rcu_torture_boost_ktrerror; + static long n_rcu_torture_boost_rterror; +@@ -148,7 +148,7 @@ static long n_rcu_torture_boosts; + static long n_rcu_torture_timers; + static long n_barrier_attempts; + static long n_barrier_successes; +-static atomic_long_t n_cbfloods; ++static atomic_long_unchecked_t n_cbfloods; + static struct list_head rcu_torture_removed; + + static int rcu_torture_writer_state; +@@ -211,11 +211,11 @@ rcu_torture_alloc(void) + + spin_lock_bh(&rcu_torture_lock); + if (list_empty(&rcu_torture_freelist)) { +- atomic_inc(&n_rcu_torture_alloc_fail); ++ atomic_inc_unchecked(&n_rcu_torture_alloc_fail); + spin_unlock_bh(&rcu_torture_lock); + return NULL; + } +- atomic_inc(&n_rcu_torture_alloc); ++ atomic_inc_unchecked(&n_rcu_torture_alloc); + p = rcu_torture_freelist.next; + list_del_init(p); + spin_unlock_bh(&rcu_torture_lock); +@@ -228,7 +228,7 @@ rcu_torture_alloc(void) + static void + rcu_torture_free(struct rcu_torture *p) + { +- atomic_inc(&n_rcu_torture_free); ++ atomic_inc_unchecked(&n_rcu_torture_free); + spin_lock_bh(&rcu_torture_lock); + list_add_tail(&p->rtort_free, &rcu_torture_freelist); + spin_unlock_bh(&rcu_torture_lock); +@@ -312,7 +312,7 @@ rcu_torture_pipe_update_one(struct rcu_torture *rp) + i = rp->rtort_pipe_count; + if (i > RCU_TORTURE_PIPE_LEN) + i = RCU_TORTURE_PIPE_LEN; +- atomic_inc(&rcu_torture_wcount[i]); ++ atomic_inc_unchecked(&rcu_torture_wcount[i]); + if (++rp->rtort_pipe_count >= RCU_TORTURE_PIPE_LEN) { + rp->rtort_mbtest = 0; + return true; +@@ -799,7 +799,7 @@ rcu_torture_cbflood(void *arg) + VERBOSE_TOROUT_STRING("rcu_torture_cbflood task started"); + do { + schedule_timeout_interruptible(cbflood_inter_holdoff); +- atomic_long_inc(&n_cbfloods); ++ atomic_long_inc_unchecked(&n_cbfloods); + WARN_ON(signal_pending(current)); + for (i = 0; i < cbflood_n_burst; i++) { + for (j = 0; j < cbflood_n_per_burst; j++) { +@@ -917,7 +917,7 @@ rcu_torture_writer(void *arg) + i = old_rp->rtort_pipe_count; + if (i > RCU_TORTURE_PIPE_LEN) + i = RCU_TORTURE_PIPE_LEN; +- atomic_inc(&rcu_torture_wcount[i]); ++ atomic_inc_unchecked(&rcu_torture_wcount[i]); + old_rp->rtort_pipe_count++; + switch (synctype[torture_random(&rand) % nsynctypes]) { + case RTWS_DEF_FREE: +@@ -1035,7 +1035,7 @@ static void rcu_torture_timer(unsigned long unused) + return; + } + if (p->rtort_mbtest == 0) +- atomic_inc(&n_rcu_torture_mberror); ++ atomic_inc_unchecked(&n_rcu_torture_mberror); + spin_lock(&rand_lock); + cur_ops->read_delay(&rand); + n_rcu_torture_timers++; +@@ -1105,7 +1105,7 @@ rcu_torture_reader(void *arg) + continue; + } + if (p->rtort_mbtest == 0) +- atomic_inc(&n_rcu_torture_mberror); ++ atomic_inc_unchecked(&n_rcu_torture_mberror); + cur_ops->read_delay(&rand); + preempt_disable(); + pipe_count = p->rtort_pipe_count; +@@ -1172,11 +1172,11 @@ rcu_torture_stats_print(void) + rcu_torture_current, + rcu_torture_current_version, + list_empty(&rcu_torture_freelist), +- atomic_read(&n_rcu_torture_alloc), +- atomic_read(&n_rcu_torture_alloc_fail), +- atomic_read(&n_rcu_torture_free)); ++ atomic_read_unchecked(&n_rcu_torture_alloc), ++ atomic_read_unchecked(&n_rcu_torture_alloc_fail), ++ atomic_read_unchecked(&n_rcu_torture_free)); + pr_cont("rtmbe: %d rtbke: %ld rtbre: %ld ", +- atomic_read(&n_rcu_torture_mberror), ++ atomic_read_unchecked(&n_rcu_torture_mberror), + n_rcu_torture_boost_ktrerror, + n_rcu_torture_boost_rterror); + pr_cont("rtbf: %ld rtb: %ld nt: %ld ", +@@ -1188,17 +1188,17 @@ rcu_torture_stats_print(void) + n_barrier_successes, + n_barrier_attempts, + n_rcu_torture_barrier_error); +- pr_cont("cbflood: %ld\n", atomic_long_read(&n_cbfloods)); ++ pr_cont("cbflood: %ld\n", atomic_long_read_unchecked(&n_cbfloods)); + + pr_alert("%s%s ", torture_type, TORTURE_FLAG); +- if (atomic_read(&n_rcu_torture_mberror) != 0 || ++ if (atomic_read_unchecked(&n_rcu_torture_mberror) != 0 || + n_rcu_torture_barrier_error != 0 || + n_rcu_torture_boost_ktrerror != 0 || + n_rcu_torture_boost_rterror != 0 || + n_rcu_torture_boost_failure != 0 || + i > 1) { + pr_cont("%s", "!!! "); +- atomic_inc(&n_rcu_torture_error); ++ atomic_inc_unchecked(&n_rcu_torture_error); + WARN_ON_ONCE(1); + } + pr_cont("Reader Pipe: "); +@@ -1215,7 +1215,7 @@ rcu_torture_stats_print(void) + pr_alert("%s%s ", torture_type, TORTURE_FLAG); + pr_cont("Free-Block Circulation: "); + for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++) { +- pr_cont(" %d", atomic_read(&rcu_torture_wcount[i])); ++ pr_cont(" %d", atomic_read_unchecked(&rcu_torture_wcount[i])); + } + pr_cont("\n"); + +@@ -1559,7 +1559,7 @@ rcu_torture_cleanup(void) + + rcu_torture_stats_print(); /* -After- the stats thread is stopped! */ + +- if (atomic_read(&n_rcu_torture_error) || n_rcu_torture_barrier_error) ++ if (atomic_read_unchecked(&n_rcu_torture_error) || n_rcu_torture_barrier_error) + rcu_torture_print_module_parms(cur_ops, "End of test: FAILURE"); + else if (torture_onoff_failures()) + rcu_torture_print_module_parms(cur_ops, +@@ -1684,18 +1684,18 @@ rcu_torture_init(void) + + rcu_torture_current = NULL; + rcu_torture_current_version = 0; +- atomic_set(&n_rcu_torture_alloc, 0); +- atomic_set(&n_rcu_torture_alloc_fail, 0); +- atomic_set(&n_rcu_torture_free, 0); +- atomic_set(&n_rcu_torture_mberror, 0); +- atomic_set(&n_rcu_torture_error, 0); ++ atomic_set_unchecked(&n_rcu_torture_alloc, 0); ++ atomic_set_unchecked(&n_rcu_torture_alloc_fail, 0); ++ atomic_set_unchecked(&n_rcu_torture_free, 0); ++ atomic_set_unchecked(&n_rcu_torture_mberror, 0); ++ atomic_set_unchecked(&n_rcu_torture_error, 0); + n_rcu_torture_barrier_error = 0; + n_rcu_torture_boost_ktrerror = 0; + n_rcu_torture_boost_rterror = 0; + n_rcu_torture_boost_failure = 0; + n_rcu_torture_boosts = 0; + for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++) +- atomic_set(&rcu_torture_wcount[i], 0); ++ atomic_set_unchecked(&rcu_torture_wcount[i], 0); + for_each_possible_cpu(cpu) { + for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++) { + per_cpu(rcu_torture_count, cpu)[i] = 0; +diff --git a/kernel/rcu/tiny.c b/kernel/rcu/tiny.c +index c0623fc..329c091 100644 +--- a/kernel/rcu/tiny.c ++++ b/kernel/rcu/tiny.c +@@ -42,7 +42,7 @@ + /* Forward declarations for tiny_plugin.h. */ + struct rcu_ctrlblk; + static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp); +-static void rcu_process_callbacks(struct softirq_action *unused); ++static void rcu_process_callbacks(void); + static void __call_rcu(struct rcu_head *head, + void (*func)(struct rcu_head *rcu), + struct rcu_ctrlblk *rcp); +@@ -310,7 +310,7 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp) + false)); + } + +-static void rcu_process_callbacks(struct softirq_action *unused) ++static __latent_entropy void rcu_process_callbacks(void) + { + __rcu_process_callbacks(&rcu_sched_ctrlblk); + __rcu_process_callbacks(&rcu_bh_ctrlblk); +diff --git a/kernel/rcu/tiny_plugin.h b/kernel/rcu/tiny_plugin.h +index 858c565..7efd915 100644 +--- a/kernel/rcu/tiny_plugin.h ++++ b/kernel/rcu/tiny_plugin.h +@@ -152,17 +152,17 @@ static void check_cpu_stall(struct rcu_ctrlblk *rcp) + dump_stack(); + } + if (*rcp->curtail && ULONG_CMP_GE(j, js)) +- ACCESS_ONCE(rcp->jiffies_stall) = jiffies + ++ ACCESS_ONCE_RW(rcp->jiffies_stall) = jiffies + + 3 * rcu_jiffies_till_stall_check() + 3; + else if (ULONG_CMP_GE(j, js)) +- ACCESS_ONCE(rcp->jiffies_stall) = jiffies + rcu_jiffies_till_stall_check(); ++ ACCESS_ONCE_RW(rcp->jiffies_stall) = jiffies + rcu_jiffies_till_stall_check(); + } + + static void reset_cpu_stall_ticks(struct rcu_ctrlblk *rcp) + { + rcp->ticks_this_gp = 0; + rcp->gp_start = jiffies; +- ACCESS_ONCE(rcp->jiffies_stall) = jiffies + rcu_jiffies_till_stall_check(); ++ ACCESS_ONCE_RW(rcp->jiffies_stall) = jiffies + rcu_jiffies_till_stall_check(); + } + + static void check_cpu_stalls(void) +diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c +index 9815447..2cdf92a 100644 +--- a/kernel/rcu/tree.c ++++ b/kernel/rcu/tree.c +@@ -274,7 +274,7 @@ static void rcu_momentary_dyntick_idle(void) + */ + rdtp = this_cpu_ptr(&rcu_dynticks); + smp_mb__before_atomic(); /* Earlier stuff before QS. */ +- atomic_add(2, &rdtp->dynticks); /* QS. */ ++ atomic_add_unchecked(2, &rdtp->dynticks); /* QS. */ + smp_mb__after_atomic(); /* Later stuff after QS. */ + break; + } +@@ -534,9 +534,9 @@ static void rcu_eqs_enter_common(struct rcu_dynticks *rdtp, long long oldval, + rcu_prepare_for_idle(smp_processor_id()); + /* CPUs seeing atomic_inc() must see prior RCU read-side crit sects */ + smp_mb__before_atomic(); /* See above. */ +- atomic_inc(&rdtp->dynticks); ++ atomic_inc_unchecked(&rdtp->dynticks); + smp_mb__after_atomic(); /* Force ordering with next sojourn. */ +- WARN_ON_ONCE(atomic_read(&rdtp->dynticks) & 0x1); ++ WARN_ON_ONCE(atomic_read_unchecked(&rdtp->dynticks) & 0x1); + rcu_dynticks_task_enter(); + + /* +@@ -656,10 +656,10 @@ static void rcu_eqs_exit_common(struct rcu_dynticks *rdtp, long long oldval, + { + rcu_dynticks_task_exit(); + smp_mb__before_atomic(); /* Force ordering w/previous sojourn. */ +- atomic_inc(&rdtp->dynticks); ++ atomic_inc_unchecked(&rdtp->dynticks); + /* CPUs seeing atomic_inc() must see later RCU read-side crit sects */ + smp_mb__after_atomic(); /* See above. */ +- WARN_ON_ONCE(!(atomic_read(&rdtp->dynticks) & 0x1)); ++ WARN_ON_ONCE(!(atomic_read_unchecked(&rdtp->dynticks) & 0x1)); + rcu_cleanup_after_idle(smp_processor_id()); + trace_rcu_dyntick(TPS("End"), oldval, rdtp->dynticks_nesting); + if (!user && !is_idle_task(current)) { +@@ -780,14 +780,14 @@ void rcu_nmi_enter(void) + struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks); + + if (rdtp->dynticks_nmi_nesting == 0 && +- (atomic_read(&rdtp->dynticks) & 0x1)) ++ (atomic_read_unchecked(&rdtp->dynticks) & 0x1)) + return; + rdtp->dynticks_nmi_nesting++; + smp_mb__before_atomic(); /* Force delay from prior write. */ +- atomic_inc(&rdtp->dynticks); ++ atomic_inc_unchecked(&rdtp->dynticks); + /* CPUs seeing atomic_inc() must see later RCU read-side crit sects */ + smp_mb__after_atomic(); /* See above. */ +- WARN_ON_ONCE(!(atomic_read(&rdtp->dynticks) & 0x1)); ++ WARN_ON_ONCE(!(atomic_read_unchecked(&rdtp->dynticks) & 0x1)); + } + + /** +@@ -806,9 +806,9 @@ void rcu_nmi_exit(void) + return; + /* CPUs seeing atomic_inc() must see prior RCU read-side crit sects */ + smp_mb__before_atomic(); /* See above. */ +- atomic_inc(&rdtp->dynticks); ++ atomic_inc_unchecked(&rdtp->dynticks); + smp_mb__after_atomic(); /* Force delay to next write. */ +- WARN_ON_ONCE(atomic_read(&rdtp->dynticks) & 0x1); ++ WARN_ON_ONCE(atomic_read_unchecked(&rdtp->dynticks) & 0x1); + } + + /** +@@ -821,7 +821,7 @@ void rcu_nmi_exit(void) + */ + bool notrace __rcu_is_watching(void) + { +- return atomic_read(this_cpu_ptr(&rcu_dynticks.dynticks)) & 0x1; ++ return atomic_read_unchecked(this_cpu_ptr(&rcu_dynticks.dynticks)) & 0x1; + } + + /** +@@ -904,7 +904,7 @@ static int rcu_is_cpu_rrupt_from_idle(void) + static int dyntick_save_progress_counter(struct rcu_data *rdp, + bool *isidle, unsigned long *maxj) + { +- rdp->dynticks_snap = atomic_add_return(0, &rdp->dynticks->dynticks); ++ rdp->dynticks_snap = atomic_add_return_unchecked(0, &rdp->dynticks->dynticks); + rcu_sysidle_check_cpu(rdp, isidle, maxj); + if ((rdp->dynticks_snap & 0x1) == 0) { + trace_rcu_fqs(rdp->rsp->name, rdp->gpnum, rdp->cpu, TPS("dti")); +@@ -933,7 +933,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp, + int *rcrmp; + unsigned int snap; + +- curr = (unsigned int)atomic_add_return(0, &rdp->dynticks->dynticks); ++ curr = (unsigned int)atomic_add_return_unchecked(0, &rdp->dynticks->dynticks); + snap = (unsigned int)rdp->dynticks_snap; + + /* +@@ -996,10 +996,10 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp, + rdp->rsp->gp_start + jiffies_till_sched_qs) || + ULONG_CMP_GE(jiffies, rdp->rsp->jiffies_resched)) { + if (!(ACCESS_ONCE(*rcrmp) & rdp->rsp->flavor_mask)) { +- ACCESS_ONCE(rdp->cond_resched_completed) = ++ ACCESS_ONCE_RW(rdp->cond_resched_completed) = + ACCESS_ONCE(rdp->mynode->completed); + smp_mb(); /* ->cond_resched_completed before *rcrmp. */ +- ACCESS_ONCE(*rcrmp) = ++ ACCESS_ONCE_RW(*rcrmp) = + ACCESS_ONCE(*rcrmp) + rdp->rsp->flavor_mask; + resched_cpu(rdp->cpu); /* Force CPU into scheduler. */ + rdp->rsp->jiffies_resched += 5; /* Enable beating. */ +@@ -1021,7 +1021,7 @@ static void record_gp_stall_check_time(struct rcu_state *rsp) + rsp->gp_start = j; + smp_wmb(); /* Record start time before stall time. */ + j1 = rcu_jiffies_till_stall_check(); +- ACCESS_ONCE(rsp->jiffies_stall) = j + j1; ++ ACCESS_ONCE_RW(rsp->jiffies_stall) = j + j1; + rsp->jiffies_resched = j + j1 / 2; + } + +@@ -1062,7 +1062,7 @@ static void print_other_cpu_stall(struct rcu_state *rsp) + raw_spin_unlock_irqrestore(&rnp->lock, flags); + return; + } +- ACCESS_ONCE(rsp->jiffies_stall) = jiffies + 3 * rcu_jiffies_till_stall_check() + 3; ++ ACCESS_ONCE_RW(rsp->jiffies_stall) = jiffies + 3 * rcu_jiffies_till_stall_check() + 3; + raw_spin_unlock_irqrestore(&rnp->lock, flags); + + /* +@@ -1139,7 +1139,7 @@ static void print_cpu_stall(struct rcu_state *rsp) + + raw_spin_lock_irqsave(&rnp->lock, flags); + if (ULONG_CMP_GE(jiffies, ACCESS_ONCE(rsp->jiffies_stall))) +- ACCESS_ONCE(rsp->jiffies_stall) = jiffies + ++ ACCESS_ONCE_RW(rsp->jiffies_stall) = jiffies + + 3 * rcu_jiffies_till_stall_check() + 3; + raw_spin_unlock_irqrestore(&rnp->lock, flags); + +@@ -1223,7 +1223,7 @@ void rcu_cpu_stall_reset(void) + struct rcu_state *rsp; + + for_each_rcu_flavor(rsp) +- ACCESS_ONCE(rsp->jiffies_stall) = jiffies + ULONG_MAX / 2; ++ ACCESS_ONCE_RW(rsp->jiffies_stall) = jiffies + ULONG_MAX / 2; + } + + /* +@@ -1609,7 +1609,7 @@ static int rcu_gp_init(struct rcu_state *rsp) + raw_spin_unlock_irq(&rnp->lock); + return 0; + } +- ACCESS_ONCE(rsp->gp_flags) = 0; /* Clear all flags: New grace period. */ ++ ACCESS_ONCE_RW(rsp->gp_flags) = 0; /* Clear all flags: New grace period. */ + + if (WARN_ON_ONCE(rcu_gp_in_progress(rsp))) { + /* +@@ -1650,9 +1650,9 @@ static int rcu_gp_init(struct rcu_state *rsp) + rdp = this_cpu_ptr(rsp->rda); + rcu_preempt_check_blocked_tasks(rnp); + rnp->qsmask = rnp->qsmaskinit; +- ACCESS_ONCE(rnp->gpnum) = rsp->gpnum; ++ ACCESS_ONCE_RW(rnp->gpnum) = rsp->gpnum; + WARN_ON_ONCE(rnp->completed != rsp->completed); +- ACCESS_ONCE(rnp->completed) = rsp->completed; ++ ACCESS_ONCE_RW(rnp->completed) = rsp->completed; + if (rnp == rdp->mynode) + (void)__note_gp_changes(rsp, rnp, rdp); + rcu_preempt_boost_start_gp(rnp); +@@ -1697,7 +1697,7 @@ static int rcu_gp_fqs(struct rcu_state *rsp, int fqs_state_in) + if (ACCESS_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) { + raw_spin_lock_irq(&rnp->lock); + smp_mb__after_unlock_lock(); +- ACCESS_ONCE(rsp->gp_flags) = ++ ACCESS_ONCE_RW(rsp->gp_flags) = + ACCESS_ONCE(rsp->gp_flags) & ~RCU_GP_FLAG_FQS; + raw_spin_unlock_irq(&rnp->lock); + } +@@ -1743,7 +1743,7 @@ static void rcu_gp_cleanup(struct rcu_state *rsp) + rcu_for_each_node_breadth_first(rsp, rnp) { + raw_spin_lock_irq(&rnp->lock); + smp_mb__after_unlock_lock(); +- ACCESS_ONCE(rnp->completed) = rsp->gpnum; ++ ACCESS_ONCE_RW(rnp->completed) = rsp->gpnum; + rdp = this_cpu_ptr(rsp->rda); + if (rnp == rdp->mynode) + needgp = __note_gp_changes(rsp, rnp, rdp) || needgp; +@@ -1758,14 +1758,14 @@ static void rcu_gp_cleanup(struct rcu_state *rsp) + rcu_nocb_gp_set(rnp, nocb); + + /* Declare grace period done. */ +- ACCESS_ONCE(rsp->completed) = rsp->gpnum; ++ ACCESS_ONCE_RW(rsp->completed) = rsp->gpnum; + trace_rcu_grace_period(rsp->name, rsp->completed, TPS("end")); + rsp->fqs_state = RCU_GP_IDLE; + rdp = this_cpu_ptr(rsp->rda); + /* Advance CBs to reduce false positives below. */ + needgp = rcu_advance_cbs(rsp, rnp, rdp) || needgp; + if (needgp || cpu_needs_another_gp(rsp, rdp)) { +- ACCESS_ONCE(rsp->gp_flags) = RCU_GP_FLAG_INIT; ++ ACCESS_ONCE_RW(rsp->gp_flags) = RCU_GP_FLAG_INIT; + trace_rcu_grace_period(rsp->name, + ACCESS_ONCE(rsp->gpnum), + TPS("newreq")); +@@ -1890,7 +1890,7 @@ rcu_start_gp_advanced(struct rcu_state *rsp, struct rcu_node *rnp, + */ + return false; + } +- ACCESS_ONCE(rsp->gp_flags) = RCU_GP_FLAG_INIT; ++ ACCESS_ONCE_RW(rsp->gp_flags) = RCU_GP_FLAG_INIT; + trace_rcu_grace_period(rsp->name, ACCESS_ONCE(rsp->gpnum), + TPS("newreq")); + +@@ -2111,7 +2111,7 @@ rcu_send_cbs_to_orphanage(int cpu, struct rcu_state *rsp, + rsp->qlen += rdp->qlen; + rdp->n_cbs_orphaned += rdp->qlen; + rdp->qlen_lazy = 0; +- ACCESS_ONCE(rdp->qlen) = 0; ++ ACCESS_ONCE_RW(rdp->qlen) = 0; + } + + /* +@@ -2356,7 +2356,7 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp) + } + smp_mb(); /* List handling before counting for rcu_barrier(). */ + rdp->qlen_lazy -= count_lazy; +- ACCESS_ONCE(rdp->qlen) = rdp->qlen - count; ++ ACCESS_ONCE_RW(rdp->qlen) = rdp->qlen - count; + rdp->n_cbs_invoked += count; + + /* Reinstate batch limit if we have worked down the excess. */ +@@ -2519,7 +2519,7 @@ static void force_quiescent_state(struct rcu_state *rsp) + raw_spin_unlock_irqrestore(&rnp_old->lock, flags); + return; /* Someone beat us to it. */ + } +- ACCESS_ONCE(rsp->gp_flags) = ++ ACCESS_ONCE_RW(rsp->gp_flags) = + ACCESS_ONCE(rsp->gp_flags) | RCU_GP_FLAG_FQS; + raw_spin_unlock_irqrestore(&rnp_old->lock, flags); + rcu_gp_kthread_wake(rsp); +@@ -2565,7 +2565,7 @@ __rcu_process_callbacks(struct rcu_state *rsp) + /* + * Do RCU core processing for the current CPU. + */ +-static void rcu_process_callbacks(struct softirq_action *unused) ++static void rcu_process_callbacks(void) + { + struct rcu_state *rsp; + +@@ -2677,7 +2677,7 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu), + WARN_ON_ONCE((unsigned long)head & 0x1); /* Misaligned rcu_head! */ + if (debug_rcu_head_queue(head)) { + /* Probable double call_rcu(), so leak the callback. */ +- ACCESS_ONCE(head->func) = rcu_leak_callback; ++ ACCESS_ONCE_RW(head->func) = rcu_leak_callback; + WARN_ONCE(1, "__call_rcu(): Leaked duplicate callback\n"); + return; + } +@@ -2705,7 +2705,7 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu), + local_irq_restore(flags); + return; + } +- ACCESS_ONCE(rdp->qlen) = rdp->qlen + 1; ++ ACCESS_ONCE_RW(rdp->qlen) = rdp->qlen + 1; + if (lazy) + rdp->qlen_lazy++; + else +@@ -2975,11 +2975,11 @@ void synchronize_sched_expedited(void) + * counter wrap on a 32-bit system. Quite a few more CPUs would of + * course be required on a 64-bit system. + */ +- if (ULONG_CMP_GE((ulong)atomic_long_read(&rsp->expedited_start), ++ if (ULONG_CMP_GE((ulong)atomic_long_read_unchecked(&rsp->expedited_start), + (ulong)atomic_long_read(&rsp->expedited_done) + + ULONG_MAX / 8)) { + synchronize_sched(); +- atomic_long_inc(&rsp->expedited_wrap); ++ atomic_long_inc_unchecked(&rsp->expedited_wrap); + return; + } + +@@ -2987,12 +2987,12 @@ void synchronize_sched_expedited(void) + * Take a ticket. Note that atomic_inc_return() implies a + * full memory barrier. + */ +- snap = atomic_long_inc_return(&rsp->expedited_start); ++ snap = atomic_long_inc_return_unchecked(&rsp->expedited_start); + firstsnap = snap; + if (!try_get_online_cpus()) { + /* CPU hotplug operation in flight, fall back to normal GP. */ + wait_rcu_gp(call_rcu_sched); +- atomic_long_inc(&rsp->expedited_normal); ++ atomic_long_inc_unchecked(&rsp->expedited_normal); + return; + } + WARN_ON_ONCE(cpu_is_offline(raw_smp_processor_id())); +@@ -3005,14 +3005,14 @@ void synchronize_sched_expedited(void) + synchronize_sched_expedited_cpu_stop, + NULL) == -EAGAIN) { + put_online_cpus(); +- atomic_long_inc(&rsp->expedited_tryfail); ++ atomic_long_inc_unchecked(&rsp->expedited_tryfail); + + /* Check to see if someone else did our work for us. */ + s = atomic_long_read(&rsp->expedited_done); + if (ULONG_CMP_GE((ulong)s, (ulong)firstsnap)) { + /* ensure test happens before caller kfree */ + smp_mb__before_atomic(); /* ^^^ */ +- atomic_long_inc(&rsp->expedited_workdone1); ++ atomic_long_inc_unchecked(&rsp->expedited_workdone1); + return; + } + +@@ -3021,7 +3021,7 @@ void synchronize_sched_expedited(void) + udelay(trycount * num_online_cpus()); + } else { + wait_rcu_gp(call_rcu_sched); +- atomic_long_inc(&rsp->expedited_normal); ++ atomic_long_inc_unchecked(&rsp->expedited_normal); + return; + } + +@@ -3030,7 +3030,7 @@ void synchronize_sched_expedited(void) + if (ULONG_CMP_GE((ulong)s, (ulong)firstsnap)) { + /* ensure test happens before caller kfree */ + smp_mb__before_atomic(); /* ^^^ */ +- atomic_long_inc(&rsp->expedited_workdone2); ++ atomic_long_inc_unchecked(&rsp->expedited_workdone2); + return; + } + +@@ -3044,13 +3044,13 @@ void synchronize_sched_expedited(void) + if (!try_get_online_cpus()) { + /* CPU hotplug operation in flight, use normal GP. */ + wait_rcu_gp(call_rcu_sched); +- atomic_long_inc(&rsp->expedited_normal); ++ atomic_long_inc_unchecked(&rsp->expedited_normal); + return; + } +- snap = atomic_long_read(&rsp->expedited_start); ++ snap = atomic_long_read_unchecked(&rsp->expedited_start); + smp_mb(); /* ensure read is before try_stop_cpus(). */ + } +- atomic_long_inc(&rsp->expedited_stoppedcpus); ++ atomic_long_inc_unchecked(&rsp->expedited_stoppedcpus); + + /* + * Everyone up to our most recent fetch is covered by our grace +@@ -3059,16 +3059,16 @@ void synchronize_sched_expedited(void) + * than we did already did their update. + */ + do { +- atomic_long_inc(&rsp->expedited_done_tries); ++ atomic_long_inc_unchecked(&rsp->expedited_done_tries); + s = atomic_long_read(&rsp->expedited_done); + if (ULONG_CMP_GE((ulong)s, (ulong)snap)) { + /* ensure test happens before caller kfree */ + smp_mb__before_atomic(); /* ^^^ */ +- atomic_long_inc(&rsp->expedited_done_lost); ++ atomic_long_inc_unchecked(&rsp->expedited_done_lost); + break; + } + } while (atomic_long_cmpxchg(&rsp->expedited_done, s, snap) != s); +- atomic_long_inc(&rsp->expedited_done_exit); ++ atomic_long_inc_unchecked(&rsp->expedited_done_exit); + + put_online_cpus(); + } +@@ -3274,7 +3274,7 @@ static void _rcu_barrier(struct rcu_state *rsp) + * ACCESS_ONCE() to prevent the compiler from speculating + * the increment to precede the early-exit check. + */ +- ACCESS_ONCE(rsp->n_barrier_done) = rsp->n_barrier_done + 1; ++ ACCESS_ONCE_RW(rsp->n_barrier_done) = rsp->n_barrier_done + 1; + WARN_ON_ONCE((rsp->n_barrier_done & 0x1) != 1); + _rcu_barrier_trace(rsp, "Inc1", -1, rsp->n_barrier_done); + smp_mb(); /* Order ->n_barrier_done increment with below mechanism. */ +@@ -3329,7 +3329,7 @@ static void _rcu_barrier(struct rcu_state *rsp) + + /* Increment ->n_barrier_done to prevent duplicate work. */ + smp_mb(); /* Keep increment after above mechanism. */ +- ACCESS_ONCE(rsp->n_barrier_done) = rsp->n_barrier_done + 1; ++ ACCESS_ONCE_RW(rsp->n_barrier_done) = rsp->n_barrier_done + 1; + WARN_ON_ONCE((rsp->n_barrier_done & 0x1) != 0); + _rcu_barrier_trace(rsp, "Inc2", -1, rsp->n_barrier_done); + smp_mb(); /* Keep increment before caller's subsequent code. */ +@@ -3374,10 +3374,10 @@ rcu_boot_init_percpu_data(int cpu, struct rcu_state *rsp) + rdp->grpmask = 1UL << (cpu - rdp->mynode->grplo); + init_callback_list(rdp); + rdp->qlen_lazy = 0; +- ACCESS_ONCE(rdp->qlen) = 0; ++ ACCESS_ONCE_RW(rdp->qlen) = 0; + rdp->dynticks = &per_cpu(rcu_dynticks, cpu); + WARN_ON_ONCE(rdp->dynticks->dynticks_nesting != DYNTICK_TASK_EXIT_IDLE); +- WARN_ON_ONCE(atomic_read(&rdp->dynticks->dynticks) != 1); ++ WARN_ON_ONCE(atomic_read_unchecked(&rdp->dynticks->dynticks) != 1); + rdp->cpu = cpu; + rdp->rsp = rsp; + rcu_boot_init_nocb_percpu_data(rdp); +@@ -3410,8 +3410,8 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp) + init_callback_list(rdp); /* Re-enable callbacks on this CPU. */ + rdp->dynticks->dynticks_nesting = DYNTICK_TASK_EXIT_IDLE; + rcu_sysidle_init_percpu_data(rdp->dynticks); +- atomic_set(&rdp->dynticks->dynticks, +- (atomic_read(&rdp->dynticks->dynticks) & ~0x1) + 1); ++ atomic_set_unchecked(&rdp->dynticks->dynticks, ++ (atomic_read_unchecked(&rdp->dynticks->dynticks) & ~0x1) + 1); + raw_spin_unlock(&rnp->lock); /* irqs remain disabled. */ + + /* Add CPU to rcu_node bitmasks. */ +diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h +index bbdc45d..c882ccb 100644 +--- a/kernel/rcu/tree.h ++++ b/kernel/rcu/tree.h +@@ -87,11 +87,11 @@ struct rcu_dynticks { + long long dynticks_nesting; /* Track irq/process nesting level. */ + /* Process level is worth LLONG_MAX/2. */ + int dynticks_nmi_nesting; /* Track NMI nesting level. */ +- atomic_t dynticks; /* Even value for idle, else odd. */ ++ atomic_unchecked_t dynticks;/* Even value for idle, else odd. */ + #ifdef CONFIG_NO_HZ_FULL_SYSIDLE + long long dynticks_idle_nesting; + /* irq/process nesting level from idle. */ +- atomic_t dynticks_idle; /* Even value for idle, else odd. */ ++ atomic_unchecked_t dynticks_idle;/* Even value for idle, else odd. */ + /* "Idle" excludes userspace execution. */ + unsigned long dynticks_idle_jiffies; + /* End of last non-NMI non-idle period. */ +@@ -466,17 +466,17 @@ struct rcu_state { + /* _rcu_barrier(). */ + /* End of fields guarded by barrier_mutex. */ + +- atomic_long_t expedited_start; /* Starting ticket. */ +- atomic_long_t expedited_done; /* Done ticket. */ +- atomic_long_t expedited_wrap; /* # near-wrap incidents. */ +- atomic_long_t expedited_tryfail; /* # acquisition failures. */ +- atomic_long_t expedited_workdone1; /* # done by others #1. */ +- atomic_long_t expedited_workdone2; /* # done by others #2. */ +- atomic_long_t expedited_normal; /* # fallbacks to normal. */ +- atomic_long_t expedited_stoppedcpus; /* # successful stop_cpus. */ +- atomic_long_t expedited_done_tries; /* # tries to update _done. */ +- atomic_long_t expedited_done_lost; /* # times beaten to _done. */ +- atomic_long_t expedited_done_exit; /* # times exited _done loop. */ ++ atomic_long_unchecked_t expedited_start; /* Starting ticket. */ ++ atomic_long_t expedited_done; /* Done ticket. */ ++ atomic_long_unchecked_t expedited_wrap; /* # near-wrap incidents. */ ++ atomic_long_unchecked_t expedited_tryfail; /* # acquisition failures. */ ++ atomic_long_unchecked_t expedited_workdone1; /* # done by others #1. */ ++ atomic_long_unchecked_t expedited_workdone2; /* # done by others #2. */ ++ atomic_long_unchecked_t expedited_normal; /* # fallbacks to normal. */ ++ atomic_long_unchecked_t expedited_stoppedcpus; /* # successful stop_cpus. */ ++ atomic_long_unchecked_t expedited_done_tries; /* # tries to update _done. */ ++ atomic_long_unchecked_t expedited_done_lost; /* # times beaten to _done. */ ++ atomic_long_unchecked_t expedited_done_exit; /* # times exited _done loop. */ + + unsigned long jiffies_force_qs; /* Time at which to invoke */ + /* force_quiescent_state(). */ +diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h +index c1d7f27..a64bf49 100644 +--- a/kernel/rcu/tree_plugin.h ++++ b/kernel/rcu/tree_plugin.h +@@ -709,7 +709,7 @@ static int rcu_preempted_readers_exp(struct rcu_node *rnp) + static int sync_rcu_preempt_exp_done(struct rcu_node *rnp) + { + return !rcu_preempted_readers_exp(rnp) && +- ACCESS_ONCE(rnp->expmask) == 0; ++ ACCESS_ONCE_RW(rnp->expmask) == 0; + } + + /* +@@ -870,7 +870,7 @@ void synchronize_rcu_expedited(void) + + /* Clean up and exit. */ + smp_mb(); /* ensure expedited GP seen before counter increment. */ +- ACCESS_ONCE(sync_rcu_preempt_exp_count) = ++ ACCESS_ONCE_RW(sync_rcu_preempt_exp_count) = + sync_rcu_preempt_exp_count + 1; + unlock_mb_ret: + mutex_unlock(&sync_rcu_preempt_exp_mutex); +@@ -1426,7 +1426,7 @@ static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, int outgoingcpu) + free_cpumask_var(cm); + } + +-static struct smp_hotplug_thread rcu_cpu_thread_spec = { ++static struct smp_hotplug_thread rcu_cpu_thread_spec __read_only = { + .store = &rcu_cpu_kthread_task, + .thread_should_run = rcu_cpu_kthread_should_run, + .thread_fn = rcu_cpu_kthread, +@@ -1900,7 +1900,7 @@ static void print_cpu_stall_info(struct rcu_state *rsp, int cpu) + print_cpu_stall_fast_no_hz(fast_no_hz, cpu); + pr_err("\t%d: (%lu %s) idle=%03x/%llx/%d softirq=%u/%u %s\n", + cpu, ticks_value, ticks_title, +- atomic_read(&rdtp->dynticks) & 0xfff, ++ atomic_read_unchecked(&rdtp->dynticks) & 0xfff, + rdtp->dynticks_nesting, rdtp->dynticks_nmi_nesting, + rdp->softirq_snap, kstat_softirqs_cpu(RCU_SOFTIRQ, cpu), + fast_no_hz); +@@ -2044,7 +2044,7 @@ static void wake_nocb_leader(struct rcu_data *rdp, bool force) + return; + if (ACCESS_ONCE(rdp_leader->nocb_leader_sleep) || force) { + /* Prior smp_mb__after_atomic() orders against prior enqueue. */ +- ACCESS_ONCE(rdp_leader->nocb_leader_sleep) = false; ++ ACCESS_ONCE_RW(rdp_leader->nocb_leader_sleep) = false; + wake_up(&rdp_leader->nocb_wq); + } + } +@@ -2096,7 +2096,7 @@ static void __call_rcu_nocb_enqueue(struct rcu_data *rdp, + + /* Enqueue the callback on the nocb list and update counts. */ + old_rhpp = xchg(&rdp->nocb_tail, rhtp); +- ACCESS_ONCE(*old_rhpp) = rhp; ++ ACCESS_ONCE_RW(*old_rhpp) = rhp; + atomic_long_add(rhcount, &rdp->nocb_q_count); + atomic_long_add(rhcount_lazy, &rdp->nocb_q_count_lazy); + smp_mb__after_atomic(); /* Store *old_rhpp before _wake test. */ +@@ -2286,7 +2286,7 @@ wait_again: + continue; /* No CBs here, try next follower. */ + + /* Move callbacks to wait-for-GP list, which is empty. */ +- ACCESS_ONCE(rdp->nocb_head) = NULL; ++ ACCESS_ONCE_RW(rdp->nocb_head) = NULL; + rdp->nocb_gp_tail = xchg(&rdp->nocb_tail, &rdp->nocb_head); + rdp->nocb_gp_count = atomic_long_xchg(&rdp->nocb_q_count, 0); + rdp->nocb_gp_count_lazy = +@@ -2413,7 +2413,7 @@ static int rcu_nocb_kthread(void *arg) + list = ACCESS_ONCE(rdp->nocb_follower_head); + BUG_ON(!list); + trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu, "WokeNonEmpty"); +- ACCESS_ONCE(rdp->nocb_follower_head) = NULL; ++ ACCESS_ONCE_RW(rdp->nocb_follower_head) = NULL; + tail = xchg(&rdp->nocb_follower_tail, &rdp->nocb_follower_head); + c = atomic_long_xchg(&rdp->nocb_follower_count, 0); + cl = atomic_long_xchg(&rdp->nocb_follower_count_lazy, 0); +@@ -2443,8 +2443,8 @@ static int rcu_nocb_kthread(void *arg) + list = next; + } + trace_rcu_batch_end(rdp->rsp->name, c, !!list, 0, 0, 1); +- ACCESS_ONCE(rdp->nocb_p_count) = rdp->nocb_p_count - c; +- ACCESS_ONCE(rdp->nocb_p_count_lazy) = ++ ACCESS_ONCE_RW(rdp->nocb_p_count) = rdp->nocb_p_count - c; ++ ACCESS_ONCE_RW(rdp->nocb_p_count_lazy) = + rdp->nocb_p_count_lazy - cl; + rdp->n_nocbs_invoked += c; + } +@@ -2465,7 +2465,7 @@ static void do_nocb_deferred_wakeup(struct rcu_data *rdp) + if (!rcu_nocb_need_deferred_wakeup(rdp)) + return; + ndw = ACCESS_ONCE(rdp->nocb_defer_wakeup); +- ACCESS_ONCE(rdp->nocb_defer_wakeup) = RCU_NOGP_WAKE_NOT; ++ ACCESS_ONCE_RW(rdp->nocb_defer_wakeup) = RCU_NOGP_WAKE_NOT; + wake_nocb_leader(rdp, ndw == RCU_NOGP_WAKE_FORCE); + trace_rcu_nocb_wake(rdp->rsp->name, rdp->cpu, TPS("DeferredWake")); + } +@@ -2584,7 +2584,7 @@ static void rcu_spawn_one_nocb_kthread(struct rcu_state *rsp, int cpu) + t = kthread_run(rcu_nocb_kthread, rdp_spawn, + "rcuo%c/%d", rsp->abbr, cpu); + BUG_ON(IS_ERR(t)); +- ACCESS_ONCE(rdp_spawn->nocb_kthread) = t; ++ ACCESS_ONCE_RW(rdp_spawn->nocb_kthread) = t; + } + + /* +@@ -2788,11 +2788,11 @@ static void rcu_sysidle_enter(struct rcu_dynticks *rdtp, int irq) + + /* Record start of fully idle period. */ + j = jiffies; +- ACCESS_ONCE(rdtp->dynticks_idle_jiffies) = j; ++ ACCESS_ONCE_RW(rdtp->dynticks_idle_jiffies) = j; + smp_mb__before_atomic(); +- atomic_inc(&rdtp->dynticks_idle); ++ atomic_inc_unchecked(&rdtp->dynticks_idle); + smp_mb__after_atomic(); +- WARN_ON_ONCE(atomic_read(&rdtp->dynticks_idle) & 0x1); ++ WARN_ON_ONCE(atomic_read_unchecked(&rdtp->dynticks_idle) & 0x1); + } + + /* +@@ -2861,9 +2861,9 @@ static void rcu_sysidle_exit(struct rcu_dynticks *rdtp, int irq) + + /* Record end of idle period. */ + smp_mb__before_atomic(); +- atomic_inc(&rdtp->dynticks_idle); ++ atomic_inc_unchecked(&rdtp->dynticks_idle); + smp_mb__after_atomic(); +- WARN_ON_ONCE(!(atomic_read(&rdtp->dynticks_idle) & 0x1)); ++ WARN_ON_ONCE(!(atomic_read_unchecked(&rdtp->dynticks_idle) & 0x1)); + + /* + * If we are the timekeeping CPU, we are permitted to be non-idle +@@ -2908,7 +2908,7 @@ static void rcu_sysidle_check_cpu(struct rcu_data *rdp, bool *isidle, + WARN_ON_ONCE(smp_processor_id() != tick_do_timer_cpu); + + /* Pick up current idle and NMI-nesting counter and check. */ +- cur = atomic_read(&rdtp->dynticks_idle); ++ cur = atomic_read_unchecked(&rdtp->dynticks_idle); + if (cur & 0x1) { + *isidle = false; /* We are not idle! */ + return; +@@ -2957,7 +2957,7 @@ static void rcu_sysidle(unsigned long j) + case RCU_SYSIDLE_NOT: + + /* First time all are idle, so note a short idle period. */ +- ACCESS_ONCE(full_sysidle_state) = RCU_SYSIDLE_SHORT; ++ ACCESS_ONCE_RW(full_sysidle_state) = RCU_SYSIDLE_SHORT; + break; + + case RCU_SYSIDLE_SHORT: +@@ -2995,7 +2995,7 @@ static void rcu_sysidle_cancel(void) + { + smp_mb(); + if (full_sysidle_state > RCU_SYSIDLE_SHORT) +- ACCESS_ONCE(full_sysidle_state) = RCU_SYSIDLE_NOT; ++ ACCESS_ONCE_RW(full_sysidle_state) = RCU_SYSIDLE_NOT; + } + + /* +@@ -3047,7 +3047,7 @@ static void rcu_sysidle_cb(struct rcu_head *rhp) + smp_mb(); /* grace period precedes setting inuse. */ + + rshp = container_of(rhp, struct rcu_sysidle_head, rh); +- ACCESS_ONCE(rshp->inuse) = 0; ++ ACCESS_ONCE_RW(rshp->inuse) = 0; + } + + /* +@@ -3200,7 +3200,7 @@ static void rcu_bind_gp_kthread(void) + static void rcu_dynticks_task_enter(void) + { + #if defined(CONFIG_TASKS_RCU) && defined(CONFIG_NO_HZ_FULL) +- ACCESS_ONCE(current->rcu_tasks_idle_cpu) = smp_processor_id(); ++ ACCESS_ONCE_RW(current->rcu_tasks_idle_cpu) = smp_processor_id(); + #endif /* #if defined(CONFIG_TASKS_RCU) && defined(CONFIG_NO_HZ_FULL) */ + } + +@@ -3208,6 +3208,6 @@ static void rcu_dynticks_task_enter(void) + static void rcu_dynticks_task_exit(void) + { + #if defined(CONFIG_TASKS_RCU) && defined(CONFIG_NO_HZ_FULL) +- ACCESS_ONCE(current->rcu_tasks_idle_cpu) = -1; ++ ACCESS_ONCE_RW(current->rcu_tasks_idle_cpu) = -1; + #endif /* #if defined(CONFIG_TASKS_RCU) && defined(CONFIG_NO_HZ_FULL) */ + } +diff --git a/kernel/rcu/tree_trace.c b/kernel/rcu/tree_trace.c +index 5cdc62e..cc52e88 100644 +--- a/kernel/rcu/tree_trace.c ++++ b/kernel/rcu/tree_trace.c +@@ -121,7 +121,7 @@ static void print_one_rcu_data(struct seq_file *m, struct rcu_data *rdp) + ulong2long(rdp->completed), ulong2long(rdp->gpnum), + rdp->passed_quiesce, rdp->qs_pending); + seq_printf(m, " dt=%d/%llx/%d df=%lu", +- atomic_read(&rdp->dynticks->dynticks), ++ atomic_read_unchecked(&rdp->dynticks->dynticks), + rdp->dynticks->dynticks_nesting, + rdp->dynticks->dynticks_nmi_nesting, + rdp->dynticks_fqs); +@@ -182,17 +182,17 @@ static int show_rcuexp(struct seq_file *m, void *v) + struct rcu_state *rsp = (struct rcu_state *)m->private; + + seq_printf(m, "s=%lu d=%lu w=%lu tf=%lu wd1=%lu wd2=%lu n=%lu sc=%lu dt=%lu dl=%lu dx=%lu\n", +- atomic_long_read(&rsp->expedited_start), ++ atomic_long_read_unchecked(&rsp->expedited_start), + atomic_long_read(&rsp->expedited_done), +- atomic_long_read(&rsp->expedited_wrap), +- atomic_long_read(&rsp->expedited_tryfail), +- atomic_long_read(&rsp->expedited_workdone1), +- atomic_long_read(&rsp->expedited_workdone2), +- atomic_long_read(&rsp->expedited_normal), +- atomic_long_read(&rsp->expedited_stoppedcpus), +- atomic_long_read(&rsp->expedited_done_tries), +- atomic_long_read(&rsp->expedited_done_lost), +- atomic_long_read(&rsp->expedited_done_exit)); ++ atomic_long_read_unchecked(&rsp->expedited_wrap), ++ atomic_long_read_unchecked(&rsp->expedited_tryfail), ++ atomic_long_read_unchecked(&rsp->expedited_workdone1), ++ atomic_long_read_unchecked(&rsp->expedited_workdone2), ++ atomic_long_read_unchecked(&rsp->expedited_normal), ++ atomic_long_read_unchecked(&rsp->expedited_stoppedcpus), ++ atomic_long_read_unchecked(&rsp->expedited_done_tries), ++ atomic_long_read_unchecked(&rsp->expedited_done_lost), ++ atomic_long_read_unchecked(&rsp->expedited_done_exit)); + return 0; + } + +diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c +index 3ef8ba5..8c5ebfb6 100644 +--- a/kernel/rcu/update.c ++++ b/kernel/rcu/update.c +@@ -342,10 +342,10 @@ int rcu_jiffies_till_stall_check(void) + * for CONFIG_RCU_CPU_STALL_TIMEOUT. + */ + if (till_stall_check < 3) { +- ACCESS_ONCE(rcu_cpu_stall_timeout) = 3; ++ ACCESS_ONCE_RW(rcu_cpu_stall_timeout) = 3; + till_stall_check = 3; + } else if (till_stall_check > 300) { +- ACCESS_ONCE(rcu_cpu_stall_timeout) = 300; ++ ACCESS_ONCE_RW(rcu_cpu_stall_timeout) = 300; + till_stall_check = 300; + } + return till_stall_check * HZ + RCU_STALL_DELAY_DELTA; +@@ -501,7 +501,7 @@ static void check_holdout_task(struct task_struct *t, + !ACCESS_ONCE(t->on_rq) || + (IS_ENABLED(CONFIG_NO_HZ_FULL) && + !is_idle_task(t) && t->rcu_tasks_idle_cpu >= 0)) { +- ACCESS_ONCE(t->rcu_tasks_holdout) = false; ++ ACCESS_ONCE_RW(t->rcu_tasks_holdout) = false; + list_del_init(&t->rcu_tasks_holdout_list); + put_task_struct(t); + return; +@@ -588,7 +588,7 @@ static int __noreturn rcu_tasks_kthread(void *arg) + !is_idle_task(t)) { + get_task_struct(t); + t->rcu_tasks_nvcsw = ACCESS_ONCE(t->nvcsw); +- ACCESS_ONCE(t->rcu_tasks_holdout) = true; ++ ACCESS_ONCE_RW(t->rcu_tasks_holdout) = true; + list_add(&t->rcu_tasks_holdout_list, + &rcu_tasks_holdouts); + } +@@ -685,7 +685,7 @@ static void rcu_spawn_tasks_kthread(void) + t = kthread_run(rcu_tasks_kthread, NULL, "rcu_tasks_kthread"); + BUG_ON(IS_ERR(t)); + smp_mb(); /* Ensure others see full kthread. */ +- ACCESS_ONCE(rcu_tasks_kthread_ptr) = t; ++ ACCESS_ONCE_RW(rcu_tasks_kthread_ptr) = t; + mutex_unlock(&rcu_tasks_kthread_mutex); + } + +diff --git a/kernel/resource.c b/kernel/resource.c +index 0bcebff..e7cd5b2 100644 +--- a/kernel/resource.c ++++ b/kernel/resource.c +@@ -161,8 +161,18 @@ static const struct file_operations proc_iomem_operations = { + + static int __init ioresources_init(void) + { ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++#ifdef CONFIG_GRKERNSEC_PROC_USER ++ proc_create("ioports", S_IRUSR, NULL, &proc_ioports_operations); ++ proc_create("iomem", S_IRUSR, NULL, &proc_iomem_operations); ++#elif defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ proc_create("ioports", S_IRUSR | S_IRGRP, NULL, &proc_ioports_operations); ++ proc_create("iomem", S_IRUSR | S_IRGRP, NULL, &proc_iomem_operations); ++#endif ++#else + proc_create("ioports", 0, NULL, &proc_ioports_operations); + proc_create("iomem", 0, NULL, &proc_iomem_operations); ++#endif + return 0; + } + __initcall(ioresources_init); +diff --git a/kernel/sched/auto_group.c b/kernel/sched/auto_group.c +index eae160d..c9aa22e 100644 +--- a/kernel/sched/auto_group.c ++++ b/kernel/sched/auto_group.c +@@ -11,7 +11,7 @@ + + unsigned int __read_mostly sysctl_sched_autogroup_enabled = 1; + static struct autogroup autogroup_default; +-static atomic_t autogroup_seq_nr; ++static atomic_unchecked_t autogroup_seq_nr; + + void __init autogroup_init(struct task_struct *init_task) + { +@@ -79,7 +79,7 @@ static inline struct autogroup *autogroup_create(void) + + kref_init(&ag->kref); + init_rwsem(&ag->lock); +- ag->id = atomic_inc_return(&autogroup_seq_nr); ++ ag->id = atomic_inc_return_unchecked(&autogroup_seq_nr); + ag->tg = tg; + #ifdef CONFIG_RT_GROUP_SCHED + /* +diff --git a/kernel/sched/completion.c b/kernel/sched/completion.c +index a63f4dc..349bbb0 100644 +--- a/kernel/sched/completion.c ++++ b/kernel/sched/completion.c +@@ -204,7 +204,7 @@ EXPORT_SYMBOL(wait_for_completion_interruptible); + * Return: -ERESTARTSYS if interrupted, 0 if timed out, positive (at least 1, + * or number of jiffies left till timeout) if completed. + */ +-long __sched ++long __sched __intentional_overflow(-1) + wait_for_completion_interruptible_timeout(struct completion *x, + unsigned long timeout) + { +@@ -221,7 +221,7 @@ EXPORT_SYMBOL(wait_for_completion_interruptible_timeout); + * + * Return: -ERESTARTSYS if interrupted, 0 if completed. + */ +-int __sched wait_for_completion_killable(struct completion *x) ++int __sched __intentional_overflow(-1) wait_for_completion_killable(struct completion *x) + { + long t = wait_for_common(x, MAX_SCHEDULE_TIMEOUT, TASK_KILLABLE); + if (t == -ERESTARTSYS) +@@ -242,7 +242,7 @@ EXPORT_SYMBOL(wait_for_completion_killable); + * Return: -ERESTARTSYS if interrupted, 0 if timed out, positive (at least 1, + * or number of jiffies left till timeout) if completed. + */ +-long __sched ++long __sched __intentional_overflow(-1) + wait_for_completion_killable_timeout(struct completion *x, + unsigned long timeout) + { +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index b794bde..8307891 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -1895,7 +1895,7 @@ void set_numabalancing_state(bool enabled) + int sysctl_numa_balancing(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table t; ++ ctl_table_no_const t; + int err; + int state = numabalancing_enabled; + +@@ -2358,8 +2358,10 @@ context_switch(struct rq *rq, struct task_struct *prev, + next->active_mm = oldmm; + atomic_inc(&oldmm->mm_count); + enter_lazy_tlb(oldmm, next); +- } else ++ } else { + switch_mm(oldmm, mm, next); ++ populate_stack(); ++ } + + if (!prev->mm) { + prev->active_mm = NULL; +@@ -3172,6 +3174,8 @@ int can_nice(const struct task_struct *p, const int nice) + /* convert nice value [19,-20] to rlimit style value [1,40] */ + int nice_rlim = nice_to_rlimit(nice); + ++ gr_learn_resource(p, RLIMIT_NICE, nice_rlim, 1); ++ + return (nice_rlim <= task_rlimit(p, RLIMIT_NICE) || + capable(CAP_SYS_NICE)); + } +@@ -3198,7 +3202,8 @@ SYSCALL_DEFINE1(nice, int, increment) + nice = task_nice(current) + increment; + + nice = clamp_val(nice, MIN_NICE, MAX_NICE); +- if (increment < 0 && !can_nice(current, nice)) ++ if (increment < 0 && (!can_nice(current, nice) || ++ gr_handle_chroot_nice())) + return -EPERM; + + retval = security_task_setnice(current, nice); +@@ -3477,6 +3482,7 @@ recheck: + if (policy != p->policy && !rlim_rtprio) + return -EPERM; + ++ gr_learn_resource(p, RLIMIT_RTPRIO, attr->sched_priority, 1); + /* can't increase priority */ + if (attr->sched_priority > p->rt_priority && + attr->sched_priority > rlim_rtprio) +@@ -4897,6 +4903,7 @@ void idle_task_exit(void) + + if (mm != &init_mm) { + switch_mm(mm, &init_mm, current); ++ populate_stack(); + finish_arch_post_lock_switch(); + } + mmdrop(mm); +@@ -4992,7 +4999,7 @@ static void migrate_tasks(unsigned int dead_cpu) + + #if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_SYSCTL) + +-static struct ctl_table sd_ctl_dir[] = { ++static ctl_table_no_const sd_ctl_dir[] __read_only = { + { + .procname = "sched_domain", + .mode = 0555, +@@ -5009,17 +5016,17 @@ static struct ctl_table sd_ctl_root[] = { + {} + }; + +-static struct ctl_table *sd_alloc_ctl_entry(int n) ++static ctl_table_no_const *sd_alloc_ctl_entry(int n) + { +- struct ctl_table *entry = ++ ctl_table_no_const *entry = + kcalloc(n, sizeof(struct ctl_table), GFP_KERNEL); + + return entry; + } + +-static void sd_free_ctl_entry(struct ctl_table **tablep) ++static void sd_free_ctl_entry(ctl_table_no_const *tablep) + { +- struct ctl_table *entry; ++ ctl_table_no_const *entry; + + /* + * In the intermediate directories, both the child directory and +@@ -5027,22 +5034,25 @@ static void sd_free_ctl_entry(struct ctl_table **tablep) + * will always be set. In the lowest directory the names are + * static strings and all have proc handlers. + */ +- for (entry = *tablep; entry->mode; entry++) { +- if (entry->child) +- sd_free_ctl_entry(&entry->child); ++ for (entry = tablep; entry->mode; entry++) { ++ if (entry->child) { ++ sd_free_ctl_entry(entry->child); ++ pax_open_kernel(); ++ entry->child = NULL; ++ pax_close_kernel(); ++ } + if (entry->proc_handler == NULL) + kfree(entry->procname); + } + +- kfree(*tablep); +- *tablep = NULL; ++ kfree(tablep); + } + + static int min_load_idx = 0; + static int max_load_idx = CPU_LOAD_IDX_MAX-1; + + static void +-set_table_entry(struct ctl_table *entry, ++set_table_entry(ctl_table_no_const *entry, + const char *procname, void *data, int maxlen, + umode_t mode, proc_handler *proc_handler, + bool load_idx) +@@ -5062,7 +5072,7 @@ set_table_entry(struct ctl_table *entry, + static struct ctl_table * + sd_alloc_ctl_domain_table(struct sched_domain *sd) + { +- struct ctl_table *table = sd_alloc_ctl_entry(14); ++ ctl_table_no_const *table = sd_alloc_ctl_entry(14); + + if (table == NULL) + return NULL; +@@ -5100,9 +5110,9 @@ sd_alloc_ctl_domain_table(struct sched_domain *sd) + return table; + } + +-static struct ctl_table *sd_alloc_ctl_cpu_table(int cpu) ++static ctl_table_no_const *sd_alloc_ctl_cpu_table(int cpu) + { +- struct ctl_table *entry, *table; ++ ctl_table_no_const *entry, *table; + struct sched_domain *sd; + int domain_num = 0, i; + char buf[32]; +@@ -5129,11 +5139,13 @@ static struct ctl_table_header *sd_sysctl_header; + static void register_sched_domain_sysctl(void) + { + int i, cpu_num = num_possible_cpus(); +- struct ctl_table *entry = sd_alloc_ctl_entry(cpu_num + 1); ++ ctl_table_no_const *entry = sd_alloc_ctl_entry(cpu_num + 1); + char buf[32]; + + WARN_ON(sd_ctl_dir[0].child); ++ pax_open_kernel(); + sd_ctl_dir[0].child = entry; ++ pax_close_kernel(); + + if (entry == NULL) + return; +@@ -5156,8 +5168,12 @@ static void unregister_sched_domain_sysctl(void) + if (sd_sysctl_header) + unregister_sysctl_table(sd_sysctl_header); + sd_sysctl_header = NULL; +- if (sd_ctl_dir[0].child) +- sd_free_ctl_entry(&sd_ctl_dir[0].child); ++ if (sd_ctl_dir[0].child) { ++ sd_free_ctl_entry(sd_ctl_dir[0].child); ++ pax_open_kernel(); ++ sd_ctl_dir[0].child = NULL; ++ pax_close_kernel(); ++ } + } + #else + static void register_sched_domain_sysctl(void) +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index ef2b104..69961f6 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -1906,7 +1906,7 @@ void task_numa_fault(int last_cpupid, int mem_node, int pages, int flags) + + static void reset_ptenuma_scan(struct task_struct *p) + { +- ACCESS_ONCE(p->mm->numa_scan_seq)++; ++ ACCESS_ONCE_RW(p->mm->numa_scan_seq)++; + p->mm->numa_scan_offset = 0; + } + +@@ -7465,7 +7465,7 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle) { } + * run_rebalance_domains is triggered when needed from the scheduler tick. + * Also triggered for nohz idle balancing (with nohz_balancing_kick set). + */ +-static void run_rebalance_domains(struct softirq_action *h) ++static __latent_entropy void run_rebalance_domains(void) + { + struct rq *this_rq = this_rq(); + enum cpu_idle_type idle = this_rq->idle_balance ? +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index 2df8ef0..aae070f 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -1140,7 +1140,7 @@ struct sched_class { + #ifdef CONFIG_FAIR_GROUP_SCHED + void (*task_move_group) (struct task_struct *p, int on_rq); + #endif +-}; ++} __do_const; + + static inline void put_prev_task(struct rq *rq, struct task_struct *prev) + { +diff --git a/kernel/seccomp.c b/kernel/seccomp.c +index 4ef9687..4f44028 100644 +--- a/kernel/seccomp.c ++++ b/kernel/seccomp.c +@@ -629,7 +629,9 @@ static u32 __seccomp_phase1_filter(int this_syscall, struct seccomp_data *sd) + + switch (action) { + case SECCOMP_RET_ERRNO: +- /* Set the low-order 16-bits as a errno. */ ++ /* Set low-order bits as an errno, capped at MAX_ERRNO. */ ++ if (data > MAX_ERRNO) ++ data = MAX_ERRNO; + syscall_set_return_value(current, task_pt_regs(current), + -data, 0); + goto skip; +diff --git a/kernel/signal.c b/kernel/signal.c +index 8f0876f..1153a5a 100644 +--- a/kernel/signal.c ++++ b/kernel/signal.c +@@ -53,12 +53,12 @@ static struct kmem_cache *sigqueue_cachep; + + int print_fatal_signals __read_mostly; + +-static void __user *sig_handler(struct task_struct *t, int sig) ++static __sighandler_t sig_handler(struct task_struct *t, int sig) + { + return t->sighand->action[sig - 1].sa.sa_handler; + } + +-static int sig_handler_ignored(void __user *handler, int sig) ++static int sig_handler_ignored(__sighandler_t handler, int sig) + { + /* Is it explicitly or implicitly ignored? */ + return handler == SIG_IGN || +@@ -67,7 +67,7 @@ static int sig_handler_ignored(void __user *handler, int sig) + + static int sig_task_ignored(struct task_struct *t, int sig, bool force) + { +- void __user *handler; ++ __sighandler_t handler; + + handler = sig_handler(t, sig); + +@@ -372,6 +372,9 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi + atomic_inc(&user->sigpending); + rcu_read_unlock(); + ++ if (!override_rlimit) ++ gr_learn_resource(t, RLIMIT_SIGPENDING, atomic_read(&user->sigpending), 1); ++ + if (override_rlimit || + atomic_read(&user->sigpending) <= + task_rlimit(t, RLIMIT_SIGPENDING)) { +@@ -499,7 +502,7 @@ flush_signal_handlers(struct task_struct *t, int force_default) + + int unhandled_signal(struct task_struct *tsk, int sig) + { +- void __user *handler = tsk->sighand->action[sig-1].sa.sa_handler; ++ __sighandler_t handler = tsk->sighand->action[sig-1].sa.sa_handler; + if (is_global_init(tsk)) + return 1; + if (handler != SIG_IGN && handler != SIG_DFL) +@@ -793,6 +796,13 @@ static int check_kill_permission(int sig, struct siginfo *info, + } + } + ++ /* allow glibc communication via tgkill to other threads in our ++ thread group */ ++ if ((info == SEND_SIG_NOINFO || info->si_code != SI_TKILL || ++ sig != (SIGRTMIN+1) || task_tgid_vnr(t) != info->si_pid) ++ && gr_handle_signal(t, sig)) ++ return -EPERM; ++ + return security_task_kill(t, info, sig, 0); + } + +@@ -1176,7 +1186,7 @@ __group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p) + return send_signal(sig, info, p, 1); + } + +-static int ++int + specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t) + { + return send_signal(sig, info, t, 0); +@@ -1213,6 +1223,7 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) + unsigned long int flags; + int ret, blocked, ignored; + struct k_sigaction *action; ++ int is_unhandled = 0; + + spin_lock_irqsave(&t->sighand->siglock, flags); + action = &t->sighand->action[sig-1]; +@@ -1227,9 +1238,18 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) + } + if (action->sa.sa_handler == SIG_DFL) + t->signal->flags &= ~SIGNAL_UNKILLABLE; ++ if (action->sa.sa_handler == SIG_IGN || action->sa.sa_handler == SIG_DFL) ++ is_unhandled = 1; + ret = specific_send_sig_info(sig, info, t); + spin_unlock_irqrestore(&t->sighand->siglock, flags); + ++ /* only deal with unhandled signals, java etc trigger SIGSEGV during ++ normal operation */ ++ if (is_unhandled) { ++ gr_log_signal(sig, !is_si_special(info) ? info->si_addr : NULL, t); ++ gr_handle_crash(t, sig); ++ } ++ + return ret; + } + +@@ -1300,8 +1320,11 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p) + ret = check_kill_permission(sig, info, p); + rcu_read_unlock(); + +- if (!ret && sig) ++ if (!ret && sig) { + ret = do_send_sig_info(sig, info, p, true); ++ if (!ret) ++ gr_log_signal(sig, !is_si_special(info) ? info->si_addr : NULL, p); ++ } + + return ret; + } +@@ -2903,7 +2926,15 @@ do_send_specific(pid_t tgid, pid_t pid, int sig, struct siginfo *info) + int error = -ESRCH; + + rcu_read_lock(); +- p = find_task_by_vpid(pid); ++#ifdef CONFIG_GRKERNSEC_CHROOT_FINDTASK ++ /* allow glibc communication via tgkill to other threads in our ++ thread group */ ++ if (grsec_enable_chroot_findtask && info->si_code == SI_TKILL && ++ sig == (SIGRTMIN+1) && tgid == info->si_pid) ++ p = find_task_by_vpid_unrestricted(pid); ++ else ++#endif ++ p = find_task_by_vpid(pid); + if (p && (tgid <= 0 || task_tgid_vnr(p) == tgid)) { + error = check_kill_permission(sig, info, p); + /* +@@ -3236,8 +3267,8 @@ COMPAT_SYSCALL_DEFINE2(sigaltstack, + } + seg = get_fs(); + set_fs(KERNEL_DS); +- ret = do_sigaltstack((stack_t __force __user *) (uss_ptr ? &uss : NULL), +- (stack_t __force __user *) &uoss, ++ ret = do_sigaltstack((stack_t __force_user *) (uss_ptr ? &uss : NULL), ++ (stack_t __force_user *) &uoss, + compat_user_stack_pointer()); + set_fs(seg); + if (ret >= 0 && uoss_ptr) { +diff --git a/kernel/smpboot.c b/kernel/smpboot.c +index 60d35ac5..59d289f 100644 +--- a/kernel/smpboot.c ++++ b/kernel/smpboot.c +@@ -289,7 +289,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread) + } + smpboot_unpark_thread(plug_thread, cpu); + } +- list_add(&plug_thread->list, &hotplug_threads); ++ pax_list_add(&plug_thread->list, &hotplug_threads); + out: + mutex_unlock(&smpboot_threads_lock); + put_online_cpus(); +@@ -307,7 +307,7 @@ void smpboot_unregister_percpu_thread(struct smp_hotplug_thread *plug_thread) + { + get_online_cpus(); + mutex_lock(&smpboot_threads_lock); +- list_del(&plug_thread->list); ++ pax_list_del(&plug_thread->list); + smpboot_destroy_threads(plug_thread); + mutex_unlock(&smpboot_threads_lock); + put_online_cpus(); +diff --git a/kernel/softirq.c b/kernel/softirq.c +index 0699add..d365ad8 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -53,7 +53,7 @@ irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned; + EXPORT_SYMBOL(irq_stat); + #endif + +-static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; ++static struct softirq_action softirq_vec[NR_SOFTIRQS] __read_only __aligned(PAGE_SIZE); + + DEFINE_PER_CPU(struct task_struct *, ksoftirqd); + +@@ -266,7 +266,7 @@ restart: + kstat_incr_softirqs_this_cpu(vec_nr); + + trace_softirq_entry(vec_nr); +- h->action(h); ++ h->action(); + trace_softirq_exit(vec_nr); + if (unlikely(prev_count != preempt_count())) { + pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n", +@@ -426,7 +426,7 @@ void __raise_softirq_irqoff(unsigned int nr) + or_softirq_pending(1UL << nr); + } + +-void open_softirq(int nr, void (*action)(struct softirq_action *)) ++void __init open_softirq(int nr, void (*action)(void)) + { + softirq_vec[nr].action = action; + } +@@ -478,7 +478,7 @@ void __tasklet_hi_schedule_first(struct tasklet_struct *t) + } + EXPORT_SYMBOL(__tasklet_hi_schedule_first); + +-static void tasklet_action(struct softirq_action *a) ++static void tasklet_action(void) + { + struct tasklet_struct *list; + +@@ -514,7 +514,7 @@ static void tasklet_action(struct softirq_action *a) + } + } + +-static void tasklet_hi_action(struct softirq_action *a) ++static __latent_entropy void tasklet_hi_action(void) + { + struct tasklet_struct *list; + +@@ -741,7 +741,7 @@ static struct notifier_block cpu_nfb = { + .notifier_call = cpu_callback + }; + +-static struct smp_hotplug_thread softirq_threads = { ++static struct smp_hotplug_thread softirq_threads __read_only = { + .store = &ksoftirqd, + .thread_should_run = ksoftirqd_should_run, + .thread_fn = run_ksoftirqd, +diff --git a/kernel/sys.c b/kernel/sys.c +index 1eaa2f0..d80d27c 100644 +--- a/kernel/sys.c ++++ b/kernel/sys.c +@@ -148,6 +148,12 @@ static int set_one_prio(struct task_struct *p, int niceval, int error) + error = -EACCES; + goto out; + } ++ ++ if (gr_handle_chroot_setpriority(p, niceval)) { ++ error = -EACCES; ++ goto out; ++ } ++ + no_nice = security_task_setnice(p, niceval); + if (no_nice) { + error = no_nice; +@@ -353,6 +359,20 @@ SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid) + goto error; + } + ++ if (gr_check_group_change(new->gid, new->egid, INVALID_GID)) ++ goto error; ++ ++ if (!gid_eq(new->gid, old->gid)) { ++ /* make sure we generate a learn log for what will ++ end up being a role transition after a full-learning ++ policy is generated ++ CAP_SETGID is required to perform a transition ++ we may not log a CAP_SETGID check above, e.g. ++ in the case where new rgid = old egid ++ */ ++ gr_learn_cap(current, new, CAP_SETGID); ++ } ++ + if (rgid != (gid_t) -1 || + (egid != (gid_t) -1 && !gid_eq(kegid, old->gid))) + new->sgid = new->egid; +@@ -388,6 +408,10 @@ SYSCALL_DEFINE1(setgid, gid_t, gid) + old = current_cred(); + + retval = -EPERM; ++ ++ if (gr_check_group_change(kgid, kgid, kgid)) ++ goto error; ++ + if (ns_capable(old->user_ns, CAP_SETGID)) + new->gid = new->egid = new->sgid = new->fsgid = kgid; + else if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->sgid)) +@@ -405,7 +429,7 @@ error: + /* + * change the user struct in a credentials set to match the new UID + */ +-static int set_user(struct cred *new) ++int set_user(struct cred *new) + { + struct user_struct *new_user; + +@@ -485,7 +509,18 @@ SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid) + goto error; + } + ++ if (gr_check_user_change(new->uid, new->euid, INVALID_UID)) ++ goto error; ++ + if (!uid_eq(new->uid, old->uid)) { ++ /* make sure we generate a learn log for what will ++ end up being a role transition after a full-learning ++ policy is generated ++ CAP_SETUID is required to perform a transition ++ we may not log a CAP_SETUID check above, e.g. ++ in the case where new ruid = old euid ++ */ ++ gr_learn_cap(current, new, CAP_SETUID); + retval = set_user(new); + if (retval < 0) + goto error; +@@ -535,6 +570,12 @@ SYSCALL_DEFINE1(setuid, uid_t, uid) + old = current_cred(); + + retval = -EPERM; ++ ++ if (gr_check_crash_uid(kuid)) ++ goto error; ++ if (gr_check_user_change(kuid, kuid, kuid)) ++ goto error; ++ + if (ns_capable(old->user_ns, CAP_SETUID)) { + new->suid = new->uid = kuid; + if (!uid_eq(kuid, old->uid)) { +@@ -604,6 +645,9 @@ SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid) + goto error; + } + ++ if (gr_check_user_change(kruid, keuid, INVALID_UID)) ++ goto error; ++ + if (ruid != (uid_t) -1) { + new->uid = kruid; + if (!uid_eq(kruid, old->uid)) { +@@ -688,6 +732,9 @@ SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid) + goto error; + } + ++ if (gr_check_group_change(krgid, kegid, INVALID_GID)) ++ goto error; ++ + if (rgid != (gid_t) -1) + new->gid = krgid; + if (egid != (gid_t) -1) +@@ -752,12 +799,16 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid) + uid_eq(kuid, old->suid) || uid_eq(kuid, old->fsuid) || + ns_capable(old->user_ns, CAP_SETUID)) { + if (!uid_eq(kuid, old->fsuid)) { ++ if (gr_check_user_change(INVALID_UID, INVALID_UID, kuid)) ++ goto error; ++ + new->fsuid = kuid; + if (security_task_fix_setuid(new, old, LSM_SETID_FS) == 0) + goto change_okay; + } + } + ++error: + abort_creds(new); + return old_fsuid; + +@@ -790,12 +841,16 @@ SYSCALL_DEFINE1(setfsgid, gid_t, gid) + if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->egid) || + gid_eq(kgid, old->sgid) || gid_eq(kgid, old->fsgid) || + ns_capable(old->user_ns, CAP_SETGID)) { ++ if (gr_check_group_change(INVALID_GID, INVALID_GID, kgid)) ++ goto error; ++ + if (!gid_eq(kgid, old->fsgid)) { + new->fsgid = kgid; + goto change_okay; + } + } + ++error: + abort_creds(new); + return old_fsgid; + +@@ -1172,19 +1227,19 @@ SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name) + return -EFAULT; + + down_read(&uts_sem); +- error = __copy_to_user(&name->sysname, &utsname()->sysname, ++ error = __copy_to_user(name->sysname, &utsname()->sysname, + __OLD_UTS_LEN); + error |= __put_user(0, name->sysname + __OLD_UTS_LEN); +- error |= __copy_to_user(&name->nodename, &utsname()->nodename, ++ error |= __copy_to_user(name->nodename, &utsname()->nodename, + __OLD_UTS_LEN); + error |= __put_user(0, name->nodename + __OLD_UTS_LEN); +- error |= __copy_to_user(&name->release, &utsname()->release, ++ error |= __copy_to_user(name->release, &utsname()->release, + __OLD_UTS_LEN); + error |= __put_user(0, name->release + __OLD_UTS_LEN); +- error |= __copy_to_user(&name->version, &utsname()->version, ++ error |= __copy_to_user(name->version, &utsname()->version, + __OLD_UTS_LEN); + error |= __put_user(0, name->version + __OLD_UTS_LEN); +- error |= __copy_to_user(&name->machine, &utsname()->machine, ++ error |= __copy_to_user(name->machine, &utsname()->machine, + __OLD_UTS_LEN); + error |= __put_user(0, name->machine + __OLD_UTS_LEN); + up_read(&uts_sem); +@@ -1385,6 +1440,13 @@ int do_prlimit(struct task_struct *tsk, unsigned int resource, + */ + new_rlim->rlim_cur = 1; + } ++ /* Handle the case where a fork and setuid occur and then RLIMIT_NPROC ++ is changed to a lower value. Since tasks can be created by the same ++ user in between this limit change and an execve by this task, force ++ a recheck only for this task by setting PF_NPROC_EXCEEDED ++ */ ++ if (resource == RLIMIT_NPROC && tsk->real_cred->user != INIT_USER) ++ tsk->flags |= PF_NPROC_EXCEEDED; + } + if (!retval) { + if (old_rlim) +diff --git a/kernel/sysctl.c b/kernel/sysctl.c +index cd0e835..95d4ced 100644 +--- a/kernel/sysctl.c ++++ b/kernel/sysctl.c +@@ -94,7 +94,6 @@ + + + #if defined(CONFIG_SYSCTL) +- + /* External variables not in a header file. */ + extern int max_threads; + extern int suid_dumpable; +@@ -115,19 +114,20 @@ extern int sysctl_nr_trim_pages; + + /* Constants used for minimum and maximum */ + #ifdef CONFIG_LOCKUP_DETECTOR +-static int sixty = 60; ++static int sixty __read_only = 60; + #endif + +-static int __maybe_unused neg_one = -1; ++static int __maybe_unused neg_one __read_only = -1; + +-static int zero; +-static int __maybe_unused one = 1; +-static int __maybe_unused two = 2; +-static int __maybe_unused four = 4; +-static unsigned long one_ul = 1; +-static int one_hundred = 100; ++static int zero __read_only = 0; ++static int __maybe_unused one __read_only = 1; ++static int __maybe_unused two __read_only = 2; ++static int __maybe_unused three __read_only = 3; ++static int __maybe_unused four __read_only = 4; ++static unsigned long one_ul __read_only = 1; ++static int one_hundred __read_only = 100; + #ifdef CONFIG_PRINTK +-static int ten_thousand = 10000; ++static int ten_thousand __read_only = 10000; + #endif + + /* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */ +@@ -181,10 +181,8 @@ static int proc_taint(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos); + #endif + +-#ifdef CONFIG_PRINTK + static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos); +-#endif + + static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos); +@@ -215,6 +213,8 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write, + + #endif + ++extern struct ctl_table grsecurity_table[]; ++ + static struct ctl_table kern_table[]; + static struct ctl_table vm_table[]; + static struct ctl_table fs_table[]; +@@ -229,6 +229,20 @@ extern struct ctl_table epoll_table[]; + int sysctl_legacy_va_layout; + #endif + ++#ifdef CONFIG_PAX_SOFTMODE ++static struct ctl_table pax_table[] = { ++ { ++ .procname = "softmode", ++ .data = &pax_softmode, ++ .maxlen = sizeof(unsigned int), ++ .mode = 0600, ++ .proc_handler = &proc_dointvec, ++ }, ++ ++ { } ++}; ++#endif ++ + /* The default sysctl tables: */ + + static struct ctl_table sysctl_base_table[] = { +@@ -277,6 +291,22 @@ static int max_extfrag_threshold = 1000; + #endif + + static struct ctl_table kern_table[] = { ++#if defined(CONFIG_GRKERNSEC_SYSCTL) || defined(CONFIG_GRKERNSEC_ROFS) ++ { ++ .procname = "grsecurity", ++ .mode = 0500, ++ .child = grsecurity_table, ++ }, ++#endif ++ ++#ifdef CONFIG_PAX_SOFTMODE ++ { ++ .procname = "pax", ++ .mode = 0500, ++ .child = pax_table, ++ }, ++#endif ++ + { + .procname = "sched_child_runs_first", + .data = &sysctl_sched_child_runs_first, +@@ -642,7 +672,7 @@ static struct ctl_table kern_table[] = { + .data = &modprobe_path, + .maxlen = KMOD_PATH_LEN, + .mode = 0644, +- .proc_handler = proc_dostring, ++ .proc_handler = proc_dostring_modpriv, + }, + { + .procname = "modules_disabled", +@@ -809,16 +839,20 @@ static struct ctl_table kern_table[] = { + .extra1 = &zero, + .extra2 = &one, + }, ++#endif + { + .procname = "kptr_restrict", + .data = &kptr_restrict, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax_sysadmin, ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ .extra1 = &two, ++#else + .extra1 = &zero, ++#endif + .extra2 = &two, + }, +-#endif + { + .procname = "ngroups_max", + .data = &ngroups_max, +@@ -1065,10 +1099,17 @@ static struct ctl_table kern_table[] = { + */ + { + .procname = "perf_event_paranoid", +- .data = &sysctl_perf_event_paranoid, +- .maxlen = sizeof(sysctl_perf_event_paranoid), ++ .data = &sysctl_perf_event_legitimately_concerned, ++ .maxlen = sizeof(sysctl_perf_event_legitimately_concerned), + .mode = 0644, +- .proc_handler = proc_dointvec, ++ /* go ahead, be a hero */ ++ .proc_handler = proc_dointvec_minmax_sysadmin, ++ .extra1 = &neg_one, ++#ifdef CONFIG_GRKERNSEC_PERF_HARDEN ++ .extra2 = &three, ++#else ++ .extra2 = &two, ++#endif + }, + { + .procname = "perf_event_mlock_kb", +@@ -1324,6 +1365,13 @@ static struct ctl_table vm_table[] = { + .proc_handler = proc_dointvec_minmax, + .extra1 = &zero, + }, ++ { ++ .procname = "heap_stack_gap", ++ .data = &sysctl_heap_stack_gap, ++ .maxlen = sizeof(sysctl_heap_stack_gap), ++ .mode = 0644, ++ .proc_handler = proc_doulongvec_minmax, ++ }, + #else + { + .procname = "nr_trim_pages", +@@ -1806,6 +1854,16 @@ int proc_dostring(struct ctl_table *table, int write, + (char __user *)buffer, lenp, ppos); + } + ++int proc_dostring_modpriv(struct ctl_table *table, int write, ++ void __user *buffer, size_t *lenp, loff_t *ppos) ++{ ++ if (write && !capable(CAP_SYS_MODULE)) ++ return -EPERM; ++ ++ return _proc_do_string(table->data, table->maxlen, write, ++ buffer, lenp, ppos); ++} ++ + static size_t proc_skip_spaces(char **buf) + { + size_t ret; +@@ -1911,6 +1969,8 @@ static int proc_put_long(void __user **buf, size_t *size, unsigned long val, + len = strlen(tmp); + if (len > *size) + len = *size; ++ if (len > sizeof(tmp)) ++ len = sizeof(tmp); + if (copy_to_user(*buf, tmp, len)) + return -EFAULT; + *size -= len; +@@ -2088,7 +2148,7 @@ int proc_dointvec(struct ctl_table *table, int write, + static int proc_taint(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table t; ++ ctl_table_no_const t; + unsigned long tmptaint = get_taint(); + int err; + +@@ -2116,7 +2176,6 @@ static int proc_taint(struct ctl_table *table, int write, + return err; + } + +-#ifdef CONFIG_PRINTK + static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +@@ -2125,7 +2184,6 @@ static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write, + + return proc_dointvec_minmax(table, write, buffer, lenp, ppos); + } +-#endif + + struct do_proc_dointvec_minmax_conv_param { + int *min; +@@ -2685,6 +2743,12 @@ int proc_dostring(struct ctl_table *table, int write, + return -ENOSYS; + } + ++int proc_dostring_modpriv(struct ctl_table *table, int write, ++ void __user *buffer, size_t *lenp, loff_t *ppos) ++{ ++ return -ENOSYS; ++} ++ + int proc_dointvec(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +@@ -2741,5 +2805,6 @@ EXPORT_SYMBOL(proc_dointvec_minmax); + EXPORT_SYMBOL(proc_dointvec_userhz_jiffies); + EXPORT_SYMBOL(proc_dointvec_ms_jiffies); + EXPORT_SYMBOL(proc_dostring); ++EXPORT_SYMBOL(proc_dostring_modpriv); + EXPORT_SYMBOL(proc_doulongvec_minmax); + EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); +diff --git a/kernel/taskstats.c b/kernel/taskstats.c +index b312fcc7..753d72d 100644 +--- a/kernel/taskstats.c ++++ b/kernel/taskstats.c +@@ -28,9 +28,12 @@ + #include <linux/fs.h> + #include <linux/file.h> + #include <linux/pid_namespace.h> ++#include <linux/grsecurity.h> + #include <net/genetlink.h> + #include <linux/atomic.h> + ++extern int gr_is_taskstats_denied(int pid); ++ + /* + * Maximum length of a cpumask that can be specified in + * the TASKSTATS_CMD_ATTR_REGISTER/DEREGISTER_CPUMASK attribute +@@ -576,6 +579,9 @@ err: + + static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info) + { ++ if (gr_is_taskstats_denied(current->pid)) ++ return -EACCES; ++ + if (info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK]) + return cmd_attr_register_cpumask(info); + else if (info->attrs[TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK]) +diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c +index a7077d3..dd48a49 100644 +--- a/kernel/time/alarmtimer.c ++++ b/kernel/time/alarmtimer.c +@@ -823,7 +823,7 @@ static int __init alarmtimer_init(void) + struct platform_device *pdev; + int error = 0; + int i; +- struct k_clock alarm_clock = { ++ static struct k_clock alarm_clock = { + .clock_getres = alarm_clock_getres, + .clock_get = alarm_clock_get, + .timer_create = alarm_timer_create, +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index d8c724c..6b331a4 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -1399,7 +1399,7 @@ void hrtimer_peek_ahead_timers(void) + local_irq_restore(flags); + } + +-static void run_hrtimer_softirq(struct softirq_action *h) ++static __latent_entropy void run_hrtimer_softirq(void) + { + hrtimer_peek_ahead_timers(); + } +diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c +index a16b678..8c5bd9d 100644 +--- a/kernel/time/posix-cpu-timers.c ++++ b/kernel/time/posix-cpu-timers.c +@@ -1450,14 +1450,14 @@ struct k_clock clock_posix_cpu = { + + static __init int init_posix_cpu_timers(void) + { +- struct k_clock process = { ++ static struct k_clock process = { + .clock_getres = process_cpu_clock_getres, + .clock_get = process_cpu_clock_get, + .timer_create = process_cpu_timer_create, + .nsleep = process_cpu_nsleep, + .nsleep_restart = process_cpu_nsleep_restart, + }; +- struct k_clock thread = { ++ static struct k_clock thread = { + .clock_getres = thread_cpu_clock_getres, + .clock_get = thread_cpu_clock_get, + .timer_create = thread_cpu_timer_create, +diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c +index 31ea01f..7fc61ef 100644 +--- a/kernel/time/posix-timers.c ++++ b/kernel/time/posix-timers.c +@@ -43,6 +43,7 @@ + #include <linux/hash.h> + #include <linux/posix-clock.h> + #include <linux/posix-timers.h> ++#include <linux/grsecurity.h> + #include <linux/syscalls.h> + #include <linux/wait.h> + #include <linux/workqueue.h> +@@ -124,7 +125,7 @@ static DEFINE_SPINLOCK(hash_lock); + * which we beg off on and pass to do_sys_settimeofday(). + */ + +-static struct k_clock posix_clocks[MAX_CLOCKS]; ++static struct k_clock *posix_clocks[MAX_CLOCKS]; + + /* + * These ones are defined below. +@@ -277,7 +278,7 @@ static int posix_get_tai(clockid_t which_clock, struct timespec *tp) + */ + static __init int init_posix_timers(void) + { +- struct k_clock clock_realtime = { ++ static struct k_clock clock_realtime = { + .clock_getres = hrtimer_get_res, + .clock_get = posix_clock_realtime_get, + .clock_set = posix_clock_realtime_set, +@@ -289,7 +290,7 @@ static __init int init_posix_timers(void) + .timer_get = common_timer_get, + .timer_del = common_timer_del, + }; +- struct k_clock clock_monotonic = { ++ static struct k_clock clock_monotonic = { + .clock_getres = hrtimer_get_res, + .clock_get = posix_ktime_get_ts, + .nsleep = common_nsleep, +@@ -299,19 +300,19 @@ static __init int init_posix_timers(void) + .timer_get = common_timer_get, + .timer_del = common_timer_del, + }; +- struct k_clock clock_monotonic_raw = { ++ static struct k_clock clock_monotonic_raw = { + .clock_getres = hrtimer_get_res, + .clock_get = posix_get_monotonic_raw, + }; +- struct k_clock clock_realtime_coarse = { ++ static struct k_clock clock_realtime_coarse = { + .clock_getres = posix_get_coarse_res, + .clock_get = posix_get_realtime_coarse, + }; +- struct k_clock clock_monotonic_coarse = { ++ static struct k_clock clock_monotonic_coarse = { + .clock_getres = posix_get_coarse_res, + .clock_get = posix_get_monotonic_coarse, + }; +- struct k_clock clock_tai = { ++ static struct k_clock clock_tai = { + .clock_getres = hrtimer_get_res, + .clock_get = posix_get_tai, + .nsleep = common_nsleep, +@@ -321,7 +322,7 @@ static __init int init_posix_timers(void) + .timer_get = common_timer_get, + .timer_del = common_timer_del, + }; +- struct k_clock clock_boottime = { ++ static struct k_clock clock_boottime = { + .clock_getres = hrtimer_get_res, + .clock_get = posix_get_boottime, + .nsleep = common_nsleep, +@@ -533,7 +534,7 @@ void posix_timers_register_clock(const clockid_t clock_id, + return; + } + +- posix_clocks[clock_id] = *new_clock; ++ posix_clocks[clock_id] = new_clock; + } + EXPORT_SYMBOL_GPL(posix_timers_register_clock); + +@@ -579,9 +580,9 @@ static struct k_clock *clockid_to_kclock(const clockid_t id) + return (id & CLOCKFD_MASK) == CLOCKFD ? + &clock_posix_dynamic : &clock_posix_cpu; + +- if (id >= MAX_CLOCKS || !posix_clocks[id].clock_getres) ++ if (id >= MAX_CLOCKS || !posix_clocks[id] || !posix_clocks[id]->clock_getres) + return NULL; +- return &posix_clocks[id]; ++ return posix_clocks[id]; + } + + static int common_timer_create(struct k_itimer *new_timer) +@@ -599,7 +600,7 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock, + struct k_clock *kc = clockid_to_kclock(which_clock); + struct k_itimer *new_timer; + int error, new_timer_id; +- sigevent_t event; ++ sigevent_t event = { }; + int it_id_set = IT_ID_NOT_SET; + + if (!kc) +@@ -1014,6 +1015,13 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, + if (copy_from_user(&new_tp, tp, sizeof (*tp))) + return -EFAULT; + ++ /* only the CLOCK_REALTIME clock can be set, all other clocks ++ have their clock_set fptr set to a nosettime dummy function ++ CLOCK_REALTIME has a NULL clock_set fptr which causes it to ++ call common_clock_set, which calls do_sys_settimeofday, which ++ we hook ++ */ ++ + return kc->clock_set(which_clock, &new_tp); + } + +diff --git a/kernel/time/time.c b/kernel/time/time.c +index 22d5d3b..70caeb2 100644 +--- a/kernel/time/time.c ++++ b/kernel/time/time.c +@@ -173,6 +173,11 @@ int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz) + return error; + + if (tz) { ++ /* we log in do_settimeofday called below, so don't log twice ++ */ ++ if (!tv) ++ gr_log_timechange(); ++ + sys_tz = *tz; + update_vsyscall_tz(); + if (firsttime) { +diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c +index ec1791f..6a086cd 100644 +--- a/kernel/time/timekeeping.c ++++ b/kernel/time/timekeeping.c +@@ -15,6 +15,7 @@ + #include <linux/init.h> + #include <linux/mm.h> + #include <linux/sched.h> ++#include <linux/grsecurity.h> + #include <linux/syscore_ops.h> + #include <linux/clocksource.h> + #include <linux/jiffies.h> +@@ -717,6 +718,8 @@ int do_settimeofday(const struct timespec *tv) + if (!timespec_valid_strict(tv)) + return -EINVAL; + ++ gr_log_timechange(); ++ + raw_spin_lock_irqsave(&timekeeper_lock, flags); + write_seqcount_begin(&tk_core.seq); + +diff --git a/kernel/time/timer.c b/kernel/time/timer.c +index 3260ffd..c93cd5e 100644 +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -1394,7 +1394,7 @@ void update_process_times(int user_tick) + /* + * This function runs timers and the timer-tq in bottom half context. + */ +-static void run_timer_softirq(struct softirq_action *h) ++static __latent_entropy void run_timer_softirq(void) + { + struct tvec_base *base = __this_cpu_read(tvec_bases); + +@@ -1457,7 +1457,7 @@ static void process_timeout(unsigned long __data) + * + * In all cases the return value is guaranteed to be non-negative. + */ +-signed long __sched schedule_timeout(signed long timeout) ++signed long __sched __intentional_overflow(-1) schedule_timeout(signed long timeout) + { + struct timer_list timer; + unsigned long expire; +diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c +index 61ed862..3b52c65 100644 +--- a/kernel/time/timer_list.c ++++ b/kernel/time/timer_list.c +@@ -45,12 +45,16 @@ DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases); + + static void print_name_offset(struct seq_file *m, void *sym) + { ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ SEQ_printf(m, "<%p>", NULL); ++#else + char symname[KSYM_NAME_LEN]; + + if (lookup_symbol_name((unsigned long)sym, symname) < 0) + SEQ_printf(m, "<%pK>", sym); + else + SEQ_printf(m, "%s", symname); ++#endif + } + + static void +@@ -119,7 +123,11 @@ next_one: + static void + print_base(struct seq_file *m, struct hrtimer_clock_base *base, u64 now) + { ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ SEQ_printf(m, " .base: %p\n", NULL); ++#else + SEQ_printf(m, " .base: %pK\n", base); ++#endif + SEQ_printf(m, " .index: %d\n", + base->index); + SEQ_printf(m, " .resolution: %Lu nsecs\n", +@@ -362,7 +370,11 @@ static int __init init_timer_list_procfs(void) + { + struct proc_dir_entry *pe; + ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ pe = proc_create("timer_list", 0400, NULL, &timer_list_fops); ++#else + pe = proc_create("timer_list", 0444, NULL, &timer_list_fops); ++#endif + if (!pe) + return -ENOMEM; + return 0; +diff --git a/kernel/time/timer_stats.c b/kernel/time/timer_stats.c +index 1fb08f2..ca4bb1e 100644 +--- a/kernel/time/timer_stats.c ++++ b/kernel/time/timer_stats.c +@@ -116,7 +116,7 @@ static ktime_t time_start, time_stop; + static unsigned long nr_entries; + static struct entry entries[MAX_ENTRIES]; + +-static atomic_t overflow_count; ++static atomic_unchecked_t overflow_count; + + /* + * The entries are in a hash-table, for fast lookup: +@@ -140,7 +140,7 @@ static void reset_entries(void) + nr_entries = 0; + memset(entries, 0, sizeof(entries)); + memset(tstat_hash_table, 0, sizeof(tstat_hash_table)); +- atomic_set(&overflow_count, 0); ++ atomic_set_unchecked(&overflow_count, 0); + } + + static struct entry *alloc_entry(void) +@@ -261,7 +261,7 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf, + if (likely(entry)) + entry->count++; + else +- atomic_inc(&overflow_count); ++ atomic_inc_unchecked(&overflow_count); + + out_unlock: + raw_spin_unlock_irqrestore(lock, flags); +@@ -269,12 +269,16 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf, + + static void print_name_offset(struct seq_file *m, unsigned long addr) + { ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ seq_printf(m, "<%p>", NULL); ++#else + char symname[KSYM_NAME_LEN]; + + if (lookup_symbol_name(addr, symname) < 0) +- seq_printf(m, "<%p>", (void *)addr); ++ seq_printf(m, "<%pK>", (void *)addr); + else + seq_printf(m, "%s", symname); ++#endif + } + + static int tstats_show(struct seq_file *m, void *v) +@@ -300,8 +304,8 @@ static int tstats_show(struct seq_file *m, void *v) + + seq_puts(m, "Timer Stats Version: v0.3\n"); + seq_printf(m, "Sample period: %ld.%03ld s\n", period.tv_sec, ms); +- if (atomic_read(&overflow_count)) +- seq_printf(m, "Overflow: %d entries\n", atomic_read(&overflow_count)); ++ if (atomic_read_unchecked(&overflow_count)) ++ seq_printf(m, "Overflow: %d entries\n", atomic_read_unchecked(&overflow_count)); + seq_printf(m, "Collection: %s\n", timer_stats_active ? "active" : "inactive"); + + for (i = 0; i < nr_entries; i++) { +@@ -417,7 +421,11 @@ static int __init init_tstats_procfs(void) + { + struct proc_dir_entry *pe; + ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ pe = proc_create("timer_stats", 0600, NULL, &tstats_fops); ++#else + pe = proc_create("timer_stats", 0644, NULL, &tstats_fops); ++#endif + if (!pe) + return -ENOMEM; + return 0; +diff --git a/kernel/torture.c b/kernel/torture.c +index dd70993..0bf694b 100644 +--- a/kernel/torture.c ++++ b/kernel/torture.c +@@ -482,7 +482,7 @@ static int torture_shutdown_notify(struct notifier_block *unused1, + mutex_lock(&fullstop_mutex); + if (ACCESS_ONCE(fullstop) == FULLSTOP_DONTSTOP) { + VERBOSE_TOROUT_STRING("Unscheduled system shutdown detected"); +- ACCESS_ONCE(fullstop) = FULLSTOP_SHUTDOWN; ++ ACCESS_ONCE_RW(fullstop) = FULLSTOP_SHUTDOWN; + } else { + pr_warn("Concurrent rmmod and shutdown illegal!\n"); + } +@@ -549,14 +549,14 @@ static int torture_stutter(void *arg) + if (!torture_must_stop()) { + if (stutter > 1) { + schedule_timeout_interruptible(stutter - 1); +- ACCESS_ONCE(stutter_pause_test) = 2; ++ ACCESS_ONCE_RW(stutter_pause_test) = 2; + } + schedule_timeout_interruptible(1); +- ACCESS_ONCE(stutter_pause_test) = 1; ++ ACCESS_ONCE_RW(stutter_pause_test) = 1; + } + if (!torture_must_stop()) + schedule_timeout_interruptible(stutter); +- ACCESS_ONCE(stutter_pause_test) = 0; ++ ACCESS_ONCE_RW(stutter_pause_test) = 0; + torture_shutdown_absorb("torture_stutter"); + } while (!torture_must_stop()); + torture_kthread_stopping("torture_stutter"); +@@ -648,7 +648,7 @@ bool torture_cleanup_begin(void) + schedule_timeout_uninterruptible(10); + return true; + } +- ACCESS_ONCE(fullstop) = FULLSTOP_RMMOD; ++ ACCESS_ONCE_RW(fullstop) = FULLSTOP_RMMOD; + mutex_unlock(&fullstop_mutex); + torture_shutdown_cleanup(); + torture_shuffle_cleanup(); +diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c +index c1bd4ad..4b861dc 100644 +--- a/kernel/trace/blktrace.c ++++ b/kernel/trace/blktrace.c +@@ -328,7 +328,7 @@ static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, + struct blk_trace *bt = filp->private_data; + char buf[16]; + +- snprintf(buf, sizeof(buf), "%u\n", atomic_read(&bt->dropped)); ++ snprintf(buf, sizeof(buf), "%u\n", atomic_read_unchecked(&bt->dropped)); + + return simple_read_from_buffer(buffer, count, ppos, buf, strlen(buf)); + } +@@ -386,7 +386,7 @@ static int blk_subbuf_start_callback(struct rchan_buf *buf, void *subbuf, + return 1; + + bt = buf->chan->private_data; +- atomic_inc(&bt->dropped); ++ atomic_inc_unchecked(&bt->dropped); + return 0; + } + +@@ -487,7 +487,7 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev, + + bt->dir = dir; + bt->dev = dev; +- atomic_set(&bt->dropped, 0); ++ atomic_set_unchecked(&bt->dropped, 0); + INIT_LIST_HEAD(&bt->running_list); + + ret = -EIO; +diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c +index d1eff3d..d76a6dd 100644 +--- a/kernel/trace/ftrace.c ++++ b/kernel/trace/ftrace.c +@@ -2193,12 +2193,17 @@ ftrace_code_disable(struct module *mod, struct dyn_ftrace *rec) + if (unlikely(ftrace_disabled)) + return 0; + ++ ret = ftrace_arch_code_modify_prepare(); ++ FTRACE_WARN_ON(ret); ++ if (ret) ++ return 0; ++ + ret = ftrace_make_nop(mod, rec, MCOUNT_ADDR); ++ FTRACE_WARN_ON(ftrace_arch_code_modify_post_process()); + if (ret) { + ftrace_bug(ret, ip); +- return 0; + } +- return 1; ++ return ret ? 0 : 1; + } + + /* +@@ -4551,8 +4556,10 @@ static int ftrace_process_locs(struct module *mod, + if (!count) + return 0; + ++ pax_open_kernel(); + sort(start, count, sizeof(*start), + ftrace_cmp_ips, ftrace_swap_ips); ++ pax_close_kernel(); + + start_pg = ftrace_allocate_pages(count); + if (!start_pg) +@@ -5397,7 +5404,7 @@ static int alloc_retstack_tasklist(struct ftrace_ret_stack **ret_stack_list) + + if (t->ret_stack == NULL) { + atomic_set(&t->tracing_graph_pause, 0); +- atomic_set(&t->trace_overrun, 0); ++ atomic_set_unchecked(&t->trace_overrun, 0); + t->curr_ret_stack = -1; + /* Make sure the tasks see the -1 first: */ + smp_wmb(); +@@ -5610,7 +5617,7 @@ static void + graph_init_task(struct task_struct *t, struct ftrace_ret_stack *ret_stack) + { + atomic_set(&t->tracing_graph_pause, 0); +- atomic_set(&t->trace_overrun, 0); ++ atomic_set_unchecked(&t->trace_overrun, 0); + t->ftrace_timestamp = 0; + /* make curr_ret_stack visible before we add the ret_stack */ + smp_wmb(); +diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c +index f4fbbfc..cba12a7 100644 +--- a/kernel/trace/ring_buffer.c ++++ b/kernel/trace/ring_buffer.c +@@ -352,9 +352,9 @@ struct buffer_data_page { + */ + struct buffer_page { + struct list_head list; /* list of buffer pages */ +- local_t write; /* index for next write */ ++ local_unchecked_t write; /* index for next write */ + unsigned read; /* index for next read */ +- local_t entries; /* entries on this page */ ++ local_unchecked_t entries; /* entries on this page */ + unsigned long real_end; /* real end of data */ + struct buffer_data_page *page; /* Actual data page */ + }; +@@ -476,11 +476,11 @@ struct ring_buffer_per_cpu { + unsigned long last_overrun; + local_t entries_bytes; + local_t entries; +- local_t overrun; +- local_t commit_overrun; +- local_t dropped_events; ++ local_unchecked_t overrun; ++ local_unchecked_t commit_overrun; ++ local_unchecked_t dropped_events; + local_t committing; +- local_t commits; ++ local_unchecked_t commits; + unsigned long read; + unsigned long read_bytes; + u64 write_stamp; +@@ -1050,8 +1050,8 @@ static int rb_tail_page_update(struct ring_buffer_per_cpu *cpu_buffer, + * + * We add a counter to the write field to denote this. + */ +- old_write = local_add_return(RB_WRITE_INTCNT, &next_page->write); +- old_entries = local_add_return(RB_WRITE_INTCNT, &next_page->entries); ++ old_write = local_add_return_unchecked(RB_WRITE_INTCNT, &next_page->write); ++ old_entries = local_add_return_unchecked(RB_WRITE_INTCNT, &next_page->entries); + + /* + * Just make sure we have seen our old_write and synchronize +@@ -1079,8 +1079,8 @@ static int rb_tail_page_update(struct ring_buffer_per_cpu *cpu_buffer, + * cmpxchg to only update if an interrupt did not already + * do it for us. If the cmpxchg fails, we don't care. + */ +- (void)local_cmpxchg(&next_page->write, old_write, val); +- (void)local_cmpxchg(&next_page->entries, old_entries, eval); ++ (void)local_cmpxchg_unchecked(&next_page->write, old_write, val); ++ (void)local_cmpxchg_unchecked(&next_page->entries, old_entries, eval); + + /* + * No need to worry about races with clearing out the commit. +@@ -1448,12 +1448,12 @@ static void rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer); + + static inline unsigned long rb_page_entries(struct buffer_page *bpage) + { +- return local_read(&bpage->entries) & RB_WRITE_MASK; ++ return local_read_unchecked(&bpage->entries) & RB_WRITE_MASK; + } + + static inline unsigned long rb_page_write(struct buffer_page *bpage) + { +- return local_read(&bpage->write) & RB_WRITE_MASK; ++ return local_read_unchecked(&bpage->write) & RB_WRITE_MASK; + } + + static int +@@ -1548,7 +1548,7 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned int nr_pages) + * bytes consumed in ring buffer from here. + * Increment overrun to account for the lost events. + */ +- local_add(page_entries, &cpu_buffer->overrun); ++ local_add_unchecked(page_entries, &cpu_buffer->overrun); + local_sub(BUF_PAGE_SIZE, &cpu_buffer->entries_bytes); + } + +@@ -2110,7 +2110,7 @@ rb_handle_head_page(struct ring_buffer_per_cpu *cpu_buffer, + * it is our responsibility to update + * the counters. + */ +- local_add(entries, &cpu_buffer->overrun); ++ local_add_unchecked(entries, &cpu_buffer->overrun); + local_sub(BUF_PAGE_SIZE, &cpu_buffer->entries_bytes); + + /* +@@ -2260,7 +2260,7 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, + if (tail == BUF_PAGE_SIZE) + tail_page->real_end = 0; + +- local_sub(length, &tail_page->write); ++ local_sub_unchecked(length, &tail_page->write); + return; + } + +@@ -2295,7 +2295,7 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, + rb_event_set_padding(event); + + /* Set the write back to the previous setting */ +- local_sub(length, &tail_page->write); ++ local_sub_unchecked(length, &tail_page->write); + return; + } + +@@ -2307,7 +2307,7 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, + + /* Set write to end of buffer */ + length = (tail + length) - BUF_PAGE_SIZE; +- local_sub(length, &tail_page->write); ++ local_sub_unchecked(length, &tail_page->write); + } + + /* +@@ -2333,7 +2333,7 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer, + * about it. + */ + if (unlikely(next_page == commit_page)) { +- local_inc(&cpu_buffer->commit_overrun); ++ local_inc_unchecked(&cpu_buffer->commit_overrun); + goto out_reset; + } + +@@ -2363,7 +2363,7 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer, + * this is easy, just stop here. + */ + if (!(buffer->flags & RB_FL_OVERWRITE)) { +- local_inc(&cpu_buffer->dropped_events); ++ local_inc_unchecked(&cpu_buffer->dropped_events); + goto out_reset; + } + +@@ -2389,7 +2389,7 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer, + cpu_buffer->tail_page) && + (cpu_buffer->commit_page == + cpu_buffer->reader_page))) { +- local_inc(&cpu_buffer->commit_overrun); ++ local_inc_unchecked(&cpu_buffer->commit_overrun); + goto out_reset; + } + } +@@ -2437,7 +2437,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, + length += RB_LEN_TIME_EXTEND; + + tail_page = cpu_buffer->tail_page; +- write = local_add_return(length, &tail_page->write); ++ write = local_add_return_unchecked(length, &tail_page->write); + + /* set write to only the index of the write */ + write &= RB_WRITE_MASK; +@@ -2461,7 +2461,7 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer, + kmemcheck_annotate_bitfield(event, bitfield); + rb_update_event(cpu_buffer, event, length, add_timestamp, delta); + +- local_inc(&tail_page->entries); ++ local_inc_unchecked(&tail_page->entries); + + /* + * If this is the first commit on the page, then update +@@ -2494,7 +2494,7 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer, + + if (bpage->page == (void *)addr && rb_page_write(bpage) == old_index) { + unsigned long write_mask = +- local_read(&bpage->write) & ~RB_WRITE_MASK; ++ local_read_unchecked(&bpage->write) & ~RB_WRITE_MASK; + unsigned long event_length = rb_event_length(event); + /* + * This is on the tail page. It is possible that +@@ -2504,7 +2504,7 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer, + */ + old_index += write_mask; + new_index += write_mask; +- index = local_cmpxchg(&bpage->write, old_index, new_index); ++ index = local_cmpxchg_unchecked(&bpage->write, old_index, new_index); + if (index == old_index) { + /* update counters */ + local_sub(event_length, &cpu_buffer->entries_bytes); +@@ -2519,7 +2519,7 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer, + static void rb_start_commit(struct ring_buffer_per_cpu *cpu_buffer) + { + local_inc(&cpu_buffer->committing); +- local_inc(&cpu_buffer->commits); ++ local_inc_unchecked(&cpu_buffer->commits); + } + + static inline void rb_end_commit(struct ring_buffer_per_cpu *cpu_buffer) +@@ -2531,7 +2531,7 @@ static inline void rb_end_commit(struct ring_buffer_per_cpu *cpu_buffer) + return; + + again: +- commits = local_read(&cpu_buffer->commits); ++ commits = local_read_unchecked(&cpu_buffer->commits); + /* synchronize with interrupts */ + barrier(); + if (local_read(&cpu_buffer->committing) == 1) +@@ -2547,7 +2547,7 @@ static inline void rb_end_commit(struct ring_buffer_per_cpu *cpu_buffer) + * updating of the commit page and the clearing of the + * committing counter. + */ +- if (unlikely(local_read(&cpu_buffer->commits) != commits) && ++ if (unlikely(local_read_unchecked(&cpu_buffer->commits) != commits) && + !local_read(&cpu_buffer->committing)) { + local_inc(&cpu_buffer->committing); + goto again; +@@ -2577,7 +2577,7 @@ rb_reserve_next_event(struct ring_buffer *buffer, + barrier(); + if (unlikely(ACCESS_ONCE(cpu_buffer->buffer) != buffer)) { + local_dec(&cpu_buffer->committing); +- local_dec(&cpu_buffer->commits); ++ local_dec_unchecked(&cpu_buffer->commits); + return NULL; + } + #endif +@@ -2907,7 +2907,7 @@ rb_decrement_entry(struct ring_buffer_per_cpu *cpu_buffer, + + /* Do the likely case first */ + if (likely(bpage->page == (void *)addr)) { +- local_dec(&bpage->entries); ++ local_dec_unchecked(&bpage->entries); + return; + } + +@@ -2919,7 +2919,7 @@ rb_decrement_entry(struct ring_buffer_per_cpu *cpu_buffer, + start = bpage; + do { + if (bpage->page == (void *)addr) { +- local_dec(&bpage->entries); ++ local_dec_unchecked(&bpage->entries); + return; + } + rb_inc_page(cpu_buffer, &bpage); +@@ -3203,7 +3203,7 @@ static inline unsigned long + rb_num_of_entries(struct ring_buffer_per_cpu *cpu_buffer) + { + return local_read(&cpu_buffer->entries) - +- (local_read(&cpu_buffer->overrun) + cpu_buffer->read); ++ (local_read_unchecked(&cpu_buffer->overrun) + cpu_buffer->read); + } + + /** +@@ -3292,7 +3292,7 @@ unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu) + return 0; + + cpu_buffer = buffer->buffers[cpu]; +- ret = local_read(&cpu_buffer->overrun); ++ ret = local_read_unchecked(&cpu_buffer->overrun); + + return ret; + } +@@ -3315,7 +3315,7 @@ ring_buffer_commit_overrun_cpu(struct ring_buffer *buffer, int cpu) + return 0; + + cpu_buffer = buffer->buffers[cpu]; +- ret = local_read(&cpu_buffer->commit_overrun); ++ ret = local_read_unchecked(&cpu_buffer->commit_overrun); + + return ret; + } +@@ -3337,7 +3337,7 @@ ring_buffer_dropped_events_cpu(struct ring_buffer *buffer, int cpu) + return 0; + + cpu_buffer = buffer->buffers[cpu]; +- ret = local_read(&cpu_buffer->dropped_events); ++ ret = local_read_unchecked(&cpu_buffer->dropped_events); + + return ret; + } +@@ -3400,7 +3400,7 @@ unsigned long ring_buffer_overruns(struct ring_buffer *buffer) + /* if you care about this being correct, lock the buffer */ + for_each_buffer_cpu(buffer, cpu) { + cpu_buffer = buffer->buffers[cpu]; +- overruns += local_read(&cpu_buffer->overrun); ++ overruns += local_read_unchecked(&cpu_buffer->overrun); + } + + return overruns; +@@ -3571,8 +3571,8 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) + /* + * Reset the reader page to size zero. + */ +- local_set(&cpu_buffer->reader_page->write, 0); +- local_set(&cpu_buffer->reader_page->entries, 0); ++ local_set_unchecked(&cpu_buffer->reader_page->write, 0); ++ local_set_unchecked(&cpu_buffer->reader_page->entries, 0); + local_set(&cpu_buffer->reader_page->page->commit, 0); + cpu_buffer->reader_page->real_end = 0; + +@@ -3606,7 +3606,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) + * want to compare with the last_overrun. + */ + smp_mb(); +- overwrite = local_read(&(cpu_buffer->overrun)); ++ overwrite = local_read_unchecked(&(cpu_buffer->overrun)); + + /* + * Here's the tricky part. +@@ -4178,8 +4178,8 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer) + + cpu_buffer->head_page + = list_entry(cpu_buffer->pages, struct buffer_page, list); +- local_set(&cpu_buffer->head_page->write, 0); +- local_set(&cpu_buffer->head_page->entries, 0); ++ local_set_unchecked(&cpu_buffer->head_page->write, 0); ++ local_set_unchecked(&cpu_buffer->head_page->entries, 0); + local_set(&cpu_buffer->head_page->page->commit, 0); + + cpu_buffer->head_page->read = 0; +@@ -4189,18 +4189,18 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer) + + INIT_LIST_HEAD(&cpu_buffer->reader_page->list); + INIT_LIST_HEAD(&cpu_buffer->new_pages); +- local_set(&cpu_buffer->reader_page->write, 0); +- local_set(&cpu_buffer->reader_page->entries, 0); ++ local_set_unchecked(&cpu_buffer->reader_page->write, 0); ++ local_set_unchecked(&cpu_buffer->reader_page->entries, 0); + local_set(&cpu_buffer->reader_page->page->commit, 0); + cpu_buffer->reader_page->read = 0; + + local_set(&cpu_buffer->entries_bytes, 0); +- local_set(&cpu_buffer->overrun, 0); +- local_set(&cpu_buffer->commit_overrun, 0); +- local_set(&cpu_buffer->dropped_events, 0); ++ local_set_unchecked(&cpu_buffer->overrun, 0); ++ local_set_unchecked(&cpu_buffer->commit_overrun, 0); ++ local_set_unchecked(&cpu_buffer->dropped_events, 0); + local_set(&cpu_buffer->entries, 0); + local_set(&cpu_buffer->committing, 0); +- local_set(&cpu_buffer->commits, 0); ++ local_set_unchecked(&cpu_buffer->commits, 0); + cpu_buffer->read = 0; + cpu_buffer->read_bytes = 0; + +@@ -4601,8 +4601,8 @@ int ring_buffer_read_page(struct ring_buffer *buffer, + rb_init_page(bpage); + bpage = reader->page; + reader->page = *data_page; +- local_set(&reader->write, 0); +- local_set(&reader->entries, 0); ++ local_set_unchecked(&reader->write, 0); ++ local_set_unchecked(&reader->entries, 0); + reader->read = 0; + *data_page = bpage; + +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c +index 72c7134..581f360 100644 +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -3488,7 +3488,7 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set) + return 0; + } + +-int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled) ++int set_tracer_flag(struct trace_array *tr, unsigned long mask, int enabled) + { + /* do nothing if flag is already set */ + if (!!(trace_flags & mask) == !!enabled) +diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h +index 385391f..8d2250f 100644 +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -1280,7 +1280,7 @@ extern const char *__stop___tracepoint_str[]; + void trace_printk_init_buffers(void); + void trace_printk_start_comm(void); + int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set); +-int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled); ++int set_tracer_flag(struct trace_array *tr, unsigned long mask, int enabled); + + /* + * Normal trace_printk() and friends allocates special buffers +diff --git a/kernel/trace/trace_clock.c b/kernel/trace/trace_clock.c +index 57b67b1..66082a9 100644 +--- a/kernel/trace/trace_clock.c ++++ b/kernel/trace/trace_clock.c +@@ -124,7 +124,7 @@ u64 notrace trace_clock_global(void) + return now; + } + +-static atomic64_t trace_counter; ++static atomic64_unchecked_t trace_counter; + + /* + * trace_clock_counter(): simply an atomic counter. +@@ -133,5 +133,5 @@ static atomic64_t trace_counter; + */ + u64 notrace trace_clock_counter(void) + { +- return atomic64_add_return(1, &trace_counter); ++ return atomic64_inc_return_unchecked(&trace_counter); + } +diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c +index 1b0df1e..4ebb965 100644 +--- a/kernel/trace/trace_events.c ++++ b/kernel/trace/trace_events.c +@@ -1720,7 +1720,6 @@ __trace_early_add_new_event(struct ftrace_event_call *call, + return 0; + } + +-struct ftrace_module_file_ops; + static void __add_event_to_tracers(struct ftrace_event_call *call); + + /* Add an additional event_call dynamically */ +diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c +index f0a0c98..3692dc8 100644 +--- a/kernel/trace/trace_functions_graph.c ++++ b/kernel/trace/trace_functions_graph.c +@@ -133,7 +133,7 @@ ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth, + + /* The return trace stack is full */ + if (current->curr_ret_stack == FTRACE_RETFUNC_DEPTH - 1) { +- atomic_inc(¤t->trace_overrun); ++ atomic_inc_unchecked(¤t->trace_overrun); + return -EBUSY; + } + +@@ -230,7 +230,7 @@ ftrace_pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret, + *ret = current->ret_stack[index].ret; + trace->func = current->ret_stack[index].func; + trace->calltime = current->ret_stack[index].calltime; +- trace->overrun = atomic_read(¤t->trace_overrun); ++ trace->overrun = atomic_read_unchecked(¤t->trace_overrun); + trace->depth = index; + } + +diff --git a/kernel/trace/trace_mmiotrace.c b/kernel/trace/trace_mmiotrace.c +index 0abd9b8..6a663a2 100644 +--- a/kernel/trace/trace_mmiotrace.c ++++ b/kernel/trace/trace_mmiotrace.c +@@ -24,7 +24,7 @@ struct header_iter { + static struct trace_array *mmio_trace_array; + static bool overrun_detected; + static unsigned long prev_overruns; +-static atomic_t dropped_count; ++static atomic_unchecked_t dropped_count; + + static void mmio_reset_data(struct trace_array *tr) + { +@@ -127,7 +127,7 @@ static void mmio_close(struct trace_iterator *iter) + + static unsigned long count_overruns(struct trace_iterator *iter) + { +- unsigned long cnt = atomic_xchg(&dropped_count, 0); ++ unsigned long cnt = atomic_xchg_unchecked(&dropped_count, 0); + unsigned long over = ring_buffer_overruns(iter->trace_buffer->buffer); + + if (over > prev_overruns) +@@ -317,7 +317,7 @@ static void __trace_mmiotrace_rw(struct trace_array *tr, + event = trace_buffer_lock_reserve(buffer, TRACE_MMIO_RW, + sizeof(*entry), 0, pc); + if (!event) { +- atomic_inc(&dropped_count); ++ atomic_inc_unchecked(&dropped_count); + return; + } + entry = ring_buffer_event_data(event); +@@ -347,7 +347,7 @@ static void __trace_mmiotrace_map(struct trace_array *tr, + event = trace_buffer_lock_reserve(buffer, TRACE_MMIO_MAP, + sizeof(*entry), 0, pc); + if (!event) { +- atomic_inc(&dropped_count); ++ atomic_inc_unchecked(&dropped_count); + return; + } + entry = ring_buffer_event_data(event); +diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c +index c6977d5..d243785 100644 +--- a/kernel/trace/trace_output.c ++++ b/kernel/trace/trace_output.c +@@ -712,14 +712,16 @@ int register_ftrace_event(struct trace_event *event) + goto out; + } + ++ pax_open_kernel(); + if (event->funcs->trace == NULL) +- event->funcs->trace = trace_nop_print; ++ *(void **)&event->funcs->trace = trace_nop_print; + if (event->funcs->raw == NULL) +- event->funcs->raw = trace_nop_print; ++ *(void **)&event->funcs->raw = trace_nop_print; + if (event->funcs->hex == NULL) +- event->funcs->hex = trace_nop_print; ++ *(void **)&event->funcs->hex = trace_nop_print; + if (event->funcs->binary == NULL) +- event->funcs->binary = trace_nop_print; ++ *(void **)&event->funcs->binary = trace_nop_print; ++ pax_close_kernel(); + + key = event->type & (EVENT_HASHSIZE - 1); + +diff --git a/kernel/trace/trace_seq.c b/kernel/trace/trace_seq.c +index 1f24ed9..10407ec 100644 +--- a/kernel/trace/trace_seq.c ++++ b/kernel/trace/trace_seq.c +@@ -367,7 +367,7 @@ int trace_seq_path(struct trace_seq *s, const struct path *path) + + p = d_path(path, s->buffer + s->len, PAGE_SIZE - s->len); + if (!IS_ERR(p)) { +- p = mangle_path(s->buffer + s->len, p, "\n"); ++ p = mangle_path(s->buffer + s->len, p, "\n\\"); + if (p) { + s->len = p - s->buffer; + return 1; +diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c +index 16eddb3..758b308 100644 +--- a/kernel/trace/trace_stack.c ++++ b/kernel/trace/trace_stack.c +@@ -90,7 +90,7 @@ check_stack(unsigned long ip, unsigned long *stack) + return; + + /* we do not handle interrupt stacks yet */ +- if (!object_is_on_stack(stack)) ++ if (!object_starts_on_stack(stack)) + return; + + local_irq_save(flags); +diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c +index 29228c4..301bc8c 100644 +--- a/kernel/trace/trace_syscalls.c ++++ b/kernel/trace/trace_syscalls.c +@@ -602,6 +602,8 @@ static int perf_sysenter_enable(struct ftrace_event_call *call) + int num; + + num = ((struct syscall_metadata *)call->data)->syscall_nr; ++ if (WARN_ON_ONCE(num < 0 || num >= NR_syscalls)) ++ return -EINVAL; + + mutex_lock(&syscall_trace_lock); + if (!sys_perf_refcount_enter) +@@ -622,6 +624,8 @@ static void perf_sysenter_disable(struct ftrace_event_call *call) + int num; + + num = ((struct syscall_metadata *)call->data)->syscall_nr; ++ if (WARN_ON_ONCE(num < 0 || num >= NR_syscalls)) ++ return; + + mutex_lock(&syscall_trace_lock); + sys_perf_refcount_enter--; +@@ -674,6 +678,8 @@ static int perf_sysexit_enable(struct ftrace_event_call *call) + int num; + + num = ((struct syscall_metadata *)call->data)->syscall_nr; ++ if (WARN_ON_ONCE(num < 0 || num >= NR_syscalls)) ++ return -EINVAL; + + mutex_lock(&syscall_trace_lock); + if (!sys_perf_refcount_exit) +@@ -694,6 +700,8 @@ static void perf_sysexit_disable(struct ftrace_event_call *call) + int num; + + num = ((struct syscall_metadata *)call->data)->syscall_nr; ++ if (WARN_ON_ONCE(num < 0 || num >= NR_syscalls)) ++ return; + + mutex_lock(&syscall_trace_lock); + sys_perf_refcount_exit--; +diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c +index a2e37c5..4fa859b 100644 +--- a/kernel/user_namespace.c ++++ b/kernel/user_namespace.c +@@ -83,6 +83,21 @@ int create_user_ns(struct cred *new) + !kgid_has_mapping(parent_ns, group)) + return -EPERM; + ++#ifdef CONFIG_GRKERNSEC ++ /* ++ * This doesn't really inspire confidence: ++ * http://marc.info/?l=linux-kernel&m=135543612731939&w=2 ++ * http://marc.info/?l=linux-kernel&m=135545831607095&w=2 ++ * Increases kernel attack surface in areas developers ++ * previously cared little about ("low importance due ++ * to requiring "root" capability") ++ * To be removed when this code receives *proper* review ++ */ ++ if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SETUID) || ++ !capable(CAP_SETGID)) ++ return -EPERM; ++#endif ++ + ns = kmem_cache_zalloc(user_ns_cachep, GFP_KERNEL); + if (!ns) + return -ENOMEM; +@@ -974,7 +989,7 @@ static int userns_install(struct nsproxy *nsproxy, void *ns) + if (atomic_read(¤t->mm->mm_users) > 1) + return -EINVAL; + +- if (current->fs->users != 1) ++ if (atomic_read(¤t->fs->users) != 1) + return -EINVAL; + + if (!ns_capable(user_ns, CAP_SYS_ADMIN)) +diff --git a/kernel/utsname_sysctl.c b/kernel/utsname_sysctl.c +index c8eac43..4b5f08f 100644 +--- a/kernel/utsname_sysctl.c ++++ b/kernel/utsname_sysctl.c +@@ -47,7 +47,7 @@ static void put_uts(struct ctl_table *table, int write, void *which) + static int proc_do_uts_string(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- struct ctl_table uts_table; ++ ctl_table_no_const uts_table; + int r; + memcpy(&uts_table, table, sizeof(uts_table)); + uts_table.data = get_uts(table, write); +diff --git a/kernel/watchdog.c b/kernel/watchdog.c +index 70bf118..4be3c37 100644 +--- a/kernel/watchdog.c ++++ b/kernel/watchdog.c +@@ -572,7 +572,7 @@ static int watchdog_nmi_enable(unsigned int cpu) { return 0; } + static void watchdog_nmi_disable(unsigned int cpu) { return; } + #endif /* CONFIG_HARDLOCKUP_DETECTOR */ + +-static struct smp_hotplug_thread watchdog_threads = { ++static struct smp_hotplug_thread watchdog_threads __read_only = { + .store = &softlockup_watchdog, + .thread_should_run = watchdog_should_run, + .thread_fn = watchdog, +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index 2273f53..d67bd67 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -4547,7 +4547,7 @@ static void rebind_workers(struct worker_pool *pool) + WARN_ON_ONCE(!(worker_flags & WORKER_UNBOUND)); + worker_flags |= WORKER_REBOUND; + worker_flags &= ~WORKER_UNBOUND; +- ACCESS_ONCE(worker->flags) = worker_flags; ++ ACCESS_ONCE_RW(worker->flags) = worker_flags; + } + + spin_unlock_irq(&pool->lock); +diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug +index 4e35a5d..8a1f3f0 100644 +--- a/lib/Kconfig.debug ++++ b/lib/Kconfig.debug +@@ -894,7 +894,7 @@ config DEBUG_MUTEXES + + config DEBUG_WW_MUTEX_SLOWPATH + bool "Wait/wound mutex debugging: Slowpath testing" +- depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT ++ depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT && !PAX_CONSTIFY_PLUGIN + select DEBUG_LOCK_ALLOC + select DEBUG_SPINLOCK + select DEBUG_MUTEXES +@@ -911,7 +911,7 @@ config DEBUG_WW_MUTEX_SLOWPATH + + config DEBUG_LOCK_ALLOC + bool "Lock debugging: detect incorrect freeing of live locks" +- depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT ++ depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT && !PAX_CONSTIFY_PLUGIN + select DEBUG_SPINLOCK + select DEBUG_MUTEXES + select LOCKDEP +@@ -925,7 +925,7 @@ config DEBUG_LOCK_ALLOC + + config PROVE_LOCKING + bool "Lock debugging: prove locking correctness" +- depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT ++ depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT && !PAX_CONSTIFY_PLUGIN + select LOCKDEP + select DEBUG_SPINLOCK + select DEBUG_MUTEXES +@@ -976,7 +976,7 @@ config LOCKDEP + + config LOCK_STAT + bool "Lock usage statistics" +- depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT ++ depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT && !PAX_CONSTIFY_PLUGIN + select LOCKDEP + select DEBUG_SPINLOCK + select DEBUG_MUTEXES +@@ -1449,6 +1449,7 @@ config LATENCYTOP + depends on DEBUG_KERNEL + depends on STACKTRACE_SUPPORT + depends on PROC_FS ++ depends on !GRKERNSEC_HIDESYM + select FRAME_POINTER if !MIPS && !PPC && !S390 && !MICROBLAZE && !ARM_UNWIND && !ARC + select KALLSYMS + select KALLSYMS_ALL +@@ -1465,7 +1466,7 @@ config ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS + config DEBUG_STRICT_USER_COPY_CHECKS + bool "Strict user copy size checks" + depends on ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS +- depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING ++ depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING && !PAX_SIZE_OVERFLOW + help + Enabling this option turns a certain set of sanity checks for user + copy operations into compile time failures. +@@ -1593,7 +1594,7 @@ endmenu # runtime tests + + config PROVIDE_OHCI1394_DMA_INIT + bool "Remote debugging over FireWire early on boot" +- depends on PCI && X86 ++ depends on PCI && X86 && !GRKERNSEC + help + If you want to debug problems which hang or crash the kernel early + on boot and the crashing machine has a FireWire port, you can use +diff --git a/lib/Makefile b/lib/Makefile +index 0211d2b..93f5cc3 100644 +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -55,7 +55,7 @@ obj-$(CONFIG_BTREE) += btree.o + obj-$(CONFIG_INTERVAL_TREE) += interval_tree.o + obj-$(CONFIG_ASSOCIATIVE_ARRAY) += assoc_array.o + obj-$(CONFIG_DEBUG_PREEMPT) += smp_processor_id.o +-obj-$(CONFIG_DEBUG_LIST) += list_debug.o ++obj-y += list_debug.o + obj-$(CONFIG_DEBUG_OBJECTS) += debugobjects.o + + ifneq ($(CONFIG_HAVE_DEC_LOCK),y) +diff --git a/lib/average.c b/lib/average.c +index 114d1be..ab0350c 100644 +--- a/lib/average.c ++++ b/lib/average.c +@@ -55,7 +55,7 @@ struct ewma *ewma_add(struct ewma *avg, unsigned long val) + { + unsigned long internal = ACCESS_ONCE(avg->internal); + +- ACCESS_ONCE(avg->internal) = internal ? ++ ACCESS_ONCE_RW(avg->internal) = internal ? + (((internal << avg->weight) - internal) + + (val << avg->factor)) >> avg->weight : + (val << avg->factor); +diff --git a/lib/bitmap.c b/lib/bitmap.c +index b499ab6..fbdb76c 100644 +--- a/lib/bitmap.c ++++ b/lib/bitmap.c +@@ -433,7 +433,7 @@ int __bitmap_parse(const char *buf, unsigned int buflen, + { + int c, old_c, totaldigits, ndigits, nchunks, nbits; + u32 chunk; +- const char __user __force *ubuf = (const char __user __force *)buf; ++ const char __user *ubuf = (const char __force_user *)buf; + + bitmap_zero(maskp, nmaskbits); + +@@ -518,7 +518,7 @@ int bitmap_parse_user(const char __user *ubuf, + { + if (!access_ok(VERIFY_READ, ubuf, ulen)) + return -EFAULT; +- return __bitmap_parse((const char __force *)ubuf, ++ return __bitmap_parse((const char __force_kernel *)ubuf, + ulen, 1, maskp, nmaskbits); + + } +@@ -609,7 +609,7 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen, + { + unsigned a, b; + int c, old_c, totaldigits; +- const char __user __force *ubuf = (const char __user __force *)buf; ++ const char __user *ubuf = (const char __force_user *)buf; + int exp_digit, in_range; + + totaldigits = c = 0; +@@ -704,7 +704,7 @@ int bitmap_parselist_user(const char __user *ubuf, + { + if (!access_ok(VERIFY_READ, ubuf, ulen)) + return -EFAULT; +- return __bitmap_parselist((const char __force *)ubuf, ++ return __bitmap_parselist((const char __force_kernel *)ubuf, + ulen, 1, maskp, nmaskbits); + } + EXPORT_SYMBOL(bitmap_parselist_user); +diff --git a/lib/bug.c b/lib/bug.c +index d1d7c78..b354235 100644 +--- a/lib/bug.c ++++ b/lib/bug.c +@@ -137,6 +137,8 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs) + return BUG_TRAP_TYPE_NONE; + + bug = find_bug(bugaddr); ++ if (!bug) ++ return BUG_TRAP_TYPE_NONE; + + file = NULL; + line = 0; +diff --git a/lib/debugobjects.c b/lib/debugobjects.c +index 547f7f9..a6d4ba0 100644 +--- a/lib/debugobjects.c ++++ b/lib/debugobjects.c +@@ -289,7 +289,7 @@ static void debug_object_is_on_stack(void *addr, int onstack) + if (limit > 4) + return; + +- is_on_stack = object_is_on_stack(addr); ++ is_on_stack = object_starts_on_stack(addr); + if (is_on_stack == onstack) + return; + +diff --git a/lib/div64.c b/lib/div64.c +index 4382ad7..08aa558 100644 +--- a/lib/div64.c ++++ b/lib/div64.c +@@ -59,7 +59,7 @@ uint32_t __attribute__((weak)) __div64_32(uint64_t *n, uint32_t base) + EXPORT_SYMBOL(__div64_32); + + #ifndef div_s64_rem +-s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder) ++s64 __intentional_overflow(-1) div_s64_rem(s64 dividend, s32 divisor, s32 *remainder) + { + u64 quotient; + +@@ -130,7 +130,7 @@ EXPORT_SYMBOL(div64_u64_rem); + * 'http://www.hackersdelight.org/HDcode/newCode/divDouble.c.txt' + */ + #ifndef div64_u64 +-u64 div64_u64(u64 dividend, u64 divisor) ++u64 __intentional_overflow(-1) div64_u64(u64 dividend, u64 divisor) + { + u32 high = divisor >> 32; + u64 quot; +diff --git a/lib/dma-debug.c b/lib/dma-debug.c +index add80cc..0d27550 100644 +--- a/lib/dma-debug.c ++++ b/lib/dma-debug.c +@@ -971,7 +971,7 @@ static int dma_debug_device_change(struct notifier_block *nb, unsigned long acti + + void dma_debug_add_bus(struct bus_type *bus) + { +- struct notifier_block *nb; ++ notifier_block_no_const *nb; + + if (global_disable) + return; +@@ -1148,7 +1148,7 @@ static void check_unmap(struct dma_debug_entry *ref) + + static void check_for_stack(struct device *dev, void *addr) + { +- if (object_is_on_stack(addr)) ++ if (object_starts_on_stack(addr)) + err_printk(dev, NULL, "DMA-API: device driver maps memory from " + "stack [addr=%p]\n", addr); + } +diff --git a/lib/hash.c b/lib/hash.c +index fea973f..386626f 100644 +--- a/lib/hash.c ++++ b/lib/hash.c +@@ -14,7 +14,7 @@ + #include <linux/hash.h> + #include <linux/cache.h> + +-static struct fast_hash_ops arch_hash_ops __read_mostly = { ++static struct fast_hash_ops arch_hash_ops __read_only = { + .hash = jhash, + .hash2 = jhash2, + }; +diff --git a/lib/inflate.c b/lib/inflate.c +index 013a761..c28f3fc 100644 +--- a/lib/inflate.c ++++ b/lib/inflate.c +@@ -269,7 +269,7 @@ static void free(void *where) + malloc_ptr = free_mem_ptr; + } + #else +-#define malloc(a) kmalloc(a, GFP_KERNEL) ++#define malloc(a) kmalloc((a), GFP_KERNEL) + #define free(a) kfree(a) + #endif + +diff --git a/lib/ioremap.c b/lib/ioremap.c +index 0c9216c..863bd89 100644 +--- a/lib/ioremap.c ++++ b/lib/ioremap.c +@@ -38,7 +38,7 @@ static inline int ioremap_pmd_range(pud_t *pud, unsigned long addr, + unsigned long next; + + phys_addr -= addr; +- pmd = pmd_alloc(&init_mm, pud, addr); ++ pmd = pmd_alloc_kernel(&init_mm, pud, addr); + if (!pmd) + return -ENOMEM; + do { +@@ -56,7 +56,7 @@ static inline int ioremap_pud_range(pgd_t *pgd, unsigned long addr, + unsigned long next; + + phys_addr -= addr; +- pud = pud_alloc(&init_mm, pgd, addr); ++ pud = pud_alloc_kernel(&init_mm, pgd, addr); + if (!pud) + return -ENOMEM; + do { +diff --git a/lib/is_single_threaded.c b/lib/is_single_threaded.c +index bd2bea9..6b3c95e 100644 +--- a/lib/is_single_threaded.c ++++ b/lib/is_single_threaded.c +@@ -22,6 +22,9 @@ bool current_is_single_threaded(void) + struct task_struct *p, *t; + bool ret; + ++ if (!mm) ++ return true; ++ + if (atomic_read(&task->signal->live) != 1) + return false; + +diff --git a/lib/kobject.c b/lib/kobject.c +index 58751bb..93a1853 100644 +--- a/lib/kobject.c ++++ b/lib/kobject.c +@@ -931,9 +931,9 @@ EXPORT_SYMBOL_GPL(kset_create_and_add); + + + static DEFINE_SPINLOCK(kobj_ns_type_lock); +-static const struct kobj_ns_type_operations *kobj_ns_ops_tbl[KOBJ_NS_TYPES]; ++static const struct kobj_ns_type_operations *kobj_ns_ops_tbl[KOBJ_NS_TYPES] __read_only; + +-int kobj_ns_type_register(const struct kobj_ns_type_operations *ops) ++int __init kobj_ns_type_register(const struct kobj_ns_type_operations *ops) + { + enum kobj_ns_type type = ops->type; + int error; +diff --git a/lib/list_debug.c b/lib/list_debug.c +index c24c2f7..f0296f4 100644 +--- a/lib/list_debug.c ++++ b/lib/list_debug.c +@@ -11,7 +11,9 @@ + #include <linux/bug.h> + #include <linux/kernel.h> + #include <linux/rculist.h> ++#include <linux/mm.h> + ++#ifdef CONFIG_DEBUG_LIST + /* + * Insert a new entry between two known consecutive entries. + * +@@ -19,21 +21,40 @@ + * the prev/next entries already! + */ + ++static bool __list_add_debug(struct list_head *new, ++ struct list_head *prev, ++ struct list_head *next) ++{ ++ if (unlikely(next->prev != prev)) { ++ printk(KERN_ERR "list_add corruption. next->prev should be " ++ "prev (%p), but was %p. (next=%p).\n", ++ prev, next->prev, next); ++ BUG(); ++ return false; ++ } ++ if (unlikely(prev->next != next)) { ++ printk(KERN_ERR "list_add corruption. prev->next should be " ++ "next (%p), but was %p. (prev=%p).\n", ++ next, prev->next, prev); ++ BUG(); ++ return false; ++ } ++ if (unlikely(new == prev || new == next)) { ++ printk(KERN_ERR "list_add double add: new=%p, prev=%p, next=%p.\n", ++ new, prev, next); ++ BUG(); ++ return false; ++ } ++ return true; ++} ++ + void __list_add(struct list_head *new, +- struct list_head *prev, +- struct list_head *next) ++ struct list_head *prev, ++ struct list_head *next) + { +- WARN(next->prev != prev, +- "list_add corruption. next->prev should be " +- "prev (%p), but was %p. (next=%p).\n", +- prev, next->prev, next); +- WARN(prev->next != next, +- "list_add corruption. prev->next should be " +- "next (%p), but was %p. (prev=%p).\n", +- next, prev->next, prev); +- WARN(new == prev || new == next, +- "list_add double add: new=%p, prev=%p, next=%p.\n", +- new, prev, next); ++ if (!__list_add_debug(new, prev, next)) ++ return; ++ + next->prev = new; + new->next = next; + new->prev = prev; +@@ -41,28 +62,46 @@ void __list_add(struct list_head *new, + } + EXPORT_SYMBOL(__list_add); + +-void __list_del_entry(struct list_head *entry) ++static bool __list_del_entry_debug(struct list_head *entry) + { + struct list_head *prev, *next; + + prev = entry->prev; + next = entry->next; + +- if (WARN(next == LIST_POISON1, +- "list_del corruption, %p->next is LIST_POISON1 (%p)\n", +- entry, LIST_POISON1) || +- WARN(prev == LIST_POISON2, +- "list_del corruption, %p->prev is LIST_POISON2 (%p)\n", +- entry, LIST_POISON2) || +- WARN(prev->next != entry, +- "list_del corruption. prev->next should be %p, " +- "but was %p\n", entry, prev->next) || +- WARN(next->prev != entry, +- "list_del corruption. next->prev should be %p, " +- "but was %p\n", entry, next->prev)) ++ if (unlikely(next == LIST_POISON1)) { ++ printk(KERN_ERR "list_del corruption, %p->next is LIST_POISON1 (%p)\n", ++ entry, LIST_POISON1); ++ BUG(); ++ return false; ++ } ++ if (unlikely(prev == LIST_POISON2)) { ++ printk(KERN_ERR "list_del corruption, %p->prev is LIST_POISON2 (%p)\n", ++ entry, LIST_POISON2); ++ BUG(); ++ return false; ++ } ++ if (unlikely(entry->prev->next != entry)) { ++ printk(KERN_ERR "list_del corruption. prev->next should be %p, " ++ "but was %p\n", entry, prev->next); ++ BUG(); ++ return false; ++ } ++ if (unlikely(entry->next->prev != entry)) { ++ printk(KERN_ERR "list_del corruption. next->prev should be %p, " ++ "but was %p\n", entry, next->prev); ++ BUG(); ++ return false; ++ } ++ return true; ++} ++ ++void __list_del_entry(struct list_head *entry) ++{ ++ if (!__list_del_entry_debug(entry)) + return; + +- __list_del(prev, next); ++ __list_del(entry->prev, entry->next); + } + EXPORT_SYMBOL(__list_del_entry); + +@@ -86,15 +125,85 @@ EXPORT_SYMBOL(list_del); + void __list_add_rcu(struct list_head *new, + struct list_head *prev, struct list_head *next) + { +- WARN(next->prev != prev, +- "list_add_rcu corruption. next->prev should be prev (%p), but was %p. (next=%p).\n", +- prev, next->prev, next); +- WARN(prev->next != next, +- "list_add_rcu corruption. prev->next should be next (%p), but was %p. (prev=%p).\n", +- next, prev->next, prev); ++ if (!__list_add_debug(new, prev, next)) ++ return; ++ + new->next = next; + new->prev = prev; + rcu_assign_pointer(list_next_rcu(prev), new); + next->prev = new; + } + EXPORT_SYMBOL(__list_add_rcu); ++#endif ++ ++void __pax_list_add(struct list_head *new, struct list_head *prev, struct list_head *next) ++{ ++#ifdef CONFIG_DEBUG_LIST ++ if (!__list_add_debug(new, prev, next)) ++ return; ++#endif ++ ++ pax_open_kernel(); ++ next->prev = new; ++ new->next = next; ++ new->prev = prev; ++ prev->next = new; ++ pax_close_kernel(); ++} ++EXPORT_SYMBOL(__pax_list_add); ++ ++void pax_list_del(struct list_head *entry) ++{ ++#ifdef CONFIG_DEBUG_LIST ++ if (!__list_del_entry_debug(entry)) ++ return; ++#endif ++ ++ pax_open_kernel(); ++ __list_del(entry->prev, entry->next); ++ entry->next = LIST_POISON1; ++ entry->prev = LIST_POISON2; ++ pax_close_kernel(); ++} ++EXPORT_SYMBOL(pax_list_del); ++ ++void pax_list_del_init(struct list_head *entry) ++{ ++ pax_open_kernel(); ++ __list_del(entry->prev, entry->next); ++ INIT_LIST_HEAD(entry); ++ pax_close_kernel(); ++} ++EXPORT_SYMBOL(pax_list_del_init); ++ ++void __pax_list_add_rcu(struct list_head *new, ++ struct list_head *prev, struct list_head *next) ++{ ++#ifdef CONFIG_DEBUG_LIST ++ if (!__list_add_debug(new, prev, next)) ++ return; ++#endif ++ ++ pax_open_kernel(); ++ new->next = next; ++ new->prev = prev; ++ rcu_assign_pointer(list_next_rcu(prev), new); ++ next->prev = new; ++ pax_close_kernel(); ++} ++EXPORT_SYMBOL(__pax_list_add_rcu); ++ ++void pax_list_del_rcu(struct list_head *entry) ++{ ++#ifdef CONFIG_DEBUG_LIST ++ if (!__list_del_entry_debug(entry)) ++ return; ++#endif ++ ++ pax_open_kernel(); ++ __list_del(entry->prev, entry->next); ++ entry->next = LIST_POISON1; ++ entry->prev = LIST_POISON2; ++ pax_close_kernel(); ++} ++EXPORT_SYMBOL(pax_list_del_rcu); +diff --git a/lib/lockref.c b/lib/lockref.c +index d2233de..fa1a2f6 100644 +--- a/lib/lockref.c ++++ b/lib/lockref.c +@@ -48,13 +48,13 @@ + void lockref_get(struct lockref *lockref) + { + CMPXCHG_LOOP( +- new.count++; ++ __lockref_inc(&new); + , + return; + ); + + spin_lock(&lockref->lock); +- lockref->count++; ++ __lockref_inc(lockref); + spin_unlock(&lockref->lock); + } + EXPORT_SYMBOL(lockref_get); +@@ -69,7 +69,7 @@ int lockref_get_not_zero(struct lockref *lockref) + int retval; + + CMPXCHG_LOOP( +- new.count++; ++ __lockref_inc(&new); + if (!old.count) + return 0; + , +@@ -79,7 +79,7 @@ int lockref_get_not_zero(struct lockref *lockref) + spin_lock(&lockref->lock); + retval = 0; + if (lockref->count) { +- lockref->count++; ++ __lockref_inc(lockref); + retval = 1; + } + spin_unlock(&lockref->lock); +@@ -96,7 +96,7 @@ EXPORT_SYMBOL(lockref_get_not_zero); + int lockref_get_or_lock(struct lockref *lockref) + { + CMPXCHG_LOOP( +- new.count++; ++ __lockref_inc(&new); + if (!old.count) + break; + , +@@ -106,7 +106,7 @@ int lockref_get_or_lock(struct lockref *lockref) + spin_lock(&lockref->lock); + if (!lockref->count) + return 0; +- lockref->count++; ++ __lockref_inc(lockref); + spin_unlock(&lockref->lock); + return 1; + } +@@ -120,7 +120,7 @@ EXPORT_SYMBOL(lockref_get_or_lock); + int lockref_put_or_lock(struct lockref *lockref) + { + CMPXCHG_LOOP( +- new.count--; ++ __lockref_dec(&new); + if (old.count <= 1) + break; + , +@@ -130,7 +130,7 @@ int lockref_put_or_lock(struct lockref *lockref) + spin_lock(&lockref->lock); + if (lockref->count <= 1) + return 0; +- lockref->count--; ++ __lockref_dec(lockref); + spin_unlock(&lockref->lock); + return 1; + } +@@ -157,7 +157,7 @@ int lockref_get_not_dead(struct lockref *lockref) + int retval; + + CMPXCHG_LOOP( +- new.count++; ++ __lockref_inc(&new); + if ((int)old.count < 0) + return 0; + , +@@ -167,7 +167,7 @@ int lockref_get_not_dead(struct lockref *lockref) + spin_lock(&lockref->lock); + retval = 0; + if ((int) lockref->count >= 0) { +- lockref->count++; ++ __lockref_inc(lockref); + retval = 1; + } + spin_unlock(&lockref->lock); +diff --git a/lib/nlattr.c b/lib/nlattr.c +index 9c3e85f..0affd1b 100644 +--- a/lib/nlattr.c ++++ b/lib/nlattr.c +@@ -279,7 +279,11 @@ int nla_memcpy(void *dest, const struct nlattr *src, int count) + { + int minlen = min_t(int, count, nla_len(src)); + ++ BUG_ON(minlen < 0); ++ + memcpy(dest, nla_data(src), minlen); ++ if (count > minlen) ++ memset(dest + minlen, 0, count - minlen); + + return minlen; + } +diff --git a/lib/percpu-refcount.c b/lib/percpu-refcount.c +index 6111bcb..02e816b 100644 +--- a/lib/percpu-refcount.c ++++ b/lib/percpu-refcount.c +@@ -31,7 +31,7 @@ + * atomic_long_t can't hit 0 before we've added up all the percpu refs. + */ + +-#define PERCPU_COUNT_BIAS (1LU << (BITS_PER_LONG - 1)) ++#define PERCPU_COUNT_BIAS (1LU << (BITS_PER_LONG - 2)) + + static DECLARE_WAIT_QUEUE_HEAD(percpu_ref_switch_waitq); + +diff --git a/lib/radix-tree.c b/lib/radix-tree.c +index 3291a8e..346a91e 100644 +--- a/lib/radix-tree.c ++++ b/lib/radix-tree.c +@@ -67,7 +67,7 @@ struct radix_tree_preload { + int nr; + struct radix_tree_node *nodes[RADIX_TREE_PRELOAD_SIZE]; + }; +-static DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, }; ++static DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads); + + static inline void *ptr_to_indirect(void *ptr) + { +diff --git a/lib/random32.c b/lib/random32.c +index 0bee183..526f12f 100644 +--- a/lib/random32.c ++++ b/lib/random32.c +@@ -47,7 +47,7 @@ static inline void prandom_state_selftest(void) + } + #endif + +-static DEFINE_PER_CPU(struct rnd_state, net_rand_state); ++static DEFINE_PER_CPU(struct rnd_state, net_rand_state) __latent_entropy; + + /** + * prandom_u32_state - seeded pseudo-random number generator. +diff --git a/lib/rbtree.c b/lib/rbtree.c +index c16c81a..4dcbda1 100644 +--- a/lib/rbtree.c ++++ b/lib/rbtree.c +@@ -380,7 +380,9 @@ static inline void dummy_copy(struct rb_node *old, struct rb_node *new) {} + static inline void dummy_rotate(struct rb_node *old, struct rb_node *new) {} + + static const struct rb_augment_callbacks dummy_callbacks = { +- dummy_propagate, dummy_copy, dummy_rotate ++ .propagate = dummy_propagate, ++ .copy = dummy_copy, ++ .rotate = dummy_rotate + }; + + void rb_insert_color(struct rb_node *node, struct rb_root *root) +diff --git a/lib/show_mem.c b/lib/show_mem.c +index 5e25627..3ed9d7f 100644 +--- a/lib/show_mem.c ++++ b/lib/show_mem.c +@@ -44,6 +44,6 @@ void show_mem(unsigned int filter) + quicklist_total_size()); + #endif + #ifdef CONFIG_MEMORY_FAILURE +- printk("%lu pages hwpoisoned\n", atomic_long_read(&num_poisoned_pages)); ++ printk("%lu pages hwpoisoned\n", atomic_long_read_unchecked(&num_poisoned_pages)); + #endif + } +diff --git a/lib/strncpy_from_user.c b/lib/strncpy_from_user.c +index bb2b201..46abaf9 100644 +--- a/lib/strncpy_from_user.c ++++ b/lib/strncpy_from_user.c +@@ -21,7 +21,7 @@ + */ + static inline long do_strncpy_from_user(char *dst, const char __user *src, long count, unsigned long max) + { +- const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; ++ static const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; + long res = 0; + + /* +diff --git a/lib/strnlen_user.c b/lib/strnlen_user.c +index a28df52..3d55877 100644 +--- a/lib/strnlen_user.c ++++ b/lib/strnlen_user.c +@@ -26,7 +26,7 @@ + */ + static inline long do_strnlen_user(const char __user *src, unsigned long count, unsigned long max) + { +- const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; ++ static const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; + long align, res = 0; + unsigned long c; + +diff --git a/lib/swiotlb.c b/lib/swiotlb.c +index 4abda07..b9d3765 100644 +--- a/lib/swiotlb.c ++++ b/lib/swiotlb.c +@@ -682,7 +682,7 @@ EXPORT_SYMBOL(swiotlb_alloc_coherent); + + void + swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr, +- dma_addr_t dev_addr) ++ dma_addr_t dev_addr, struct dma_attrs *attrs) + { + phys_addr_t paddr = dma_to_phys(hwdev, dev_addr); + +diff --git a/lib/usercopy.c b/lib/usercopy.c +index 4f5b1dd..7cab418 100644 +--- a/lib/usercopy.c ++++ b/lib/usercopy.c +@@ -7,3 +7,9 @@ void copy_from_user_overflow(void) + WARN(1, "Buffer overflow detected!\n"); + } + EXPORT_SYMBOL(copy_from_user_overflow); ++ ++void copy_to_user_overflow(void) ++{ ++ WARN(1, "Buffer overflow detected!\n"); ++} ++EXPORT_SYMBOL(copy_to_user_overflow); +diff --git a/lib/vsprintf.c b/lib/vsprintf.c +index ec337f6..8484eb2 100644 +--- a/lib/vsprintf.c ++++ b/lib/vsprintf.c +@@ -16,6 +16,9 @@ + * - scnprintf and vscnprintf + */ + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++#define __INCLUDED_BY_HIDESYM 1 ++#endif + #include <stdarg.h> + #include <linux/module.h> /* for KSYM_SYMBOL_LEN */ + #include <linux/types.h> +@@ -625,7 +628,7 @@ char *symbol_string(char *buf, char *end, void *ptr, + #ifdef CONFIG_KALLSYMS + if (*fmt == 'B') + sprint_backtrace(sym, value); +- else if (*fmt != 'f' && *fmt != 's') ++ else if (*fmt != 'f' && *fmt != 's' && *fmt != 'X') + sprint_symbol(sym, value); + else + sprint_symbol_no_offset(sym, value); +@@ -1240,7 +1243,11 @@ char *address_val(char *buf, char *end, const void *addr, + return number(buf, end, num, spec); + } + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++int kptr_restrict __read_mostly = 2; ++#else + int kptr_restrict __read_mostly; ++#endif + + /* + * Show a '%p' thing. A kernel extension is that the '%p' is followed +@@ -1251,8 +1258,10 @@ int kptr_restrict __read_mostly; + * + * - 'F' For symbolic function descriptor pointers with offset + * - 'f' For simple symbolic function names without offset ++ * - 'X' For simple symbolic function names without offset approved for use with GRKERNSEC_HIDESYM + * - 'S' For symbolic direct pointers with offset + * - 's' For symbolic direct pointers without offset ++ * - 'A' For symbolic direct pointers with offset approved for use with GRKERNSEC_HIDESYM + * - '[FfSs]R' as above with __builtin_extract_return_addr() translation + * - 'B' For backtraced symbolic direct pointers with offset + * - 'R' For decoded struct resource, e.g., [mem 0x0-0x1f 64bit pref] +@@ -1331,12 +1340,12 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, + + if (!ptr && *fmt != 'K') { + /* +- * Print (null) with the same width as a pointer so it makes ++ * Print (nil) with the same width as a pointer so it makes + * tabular output look nice. + */ + if (spec.field_width == -1) + spec.field_width = default_width; +- return string(buf, end, "(null)", spec); ++ return string(buf, end, "(nil)", spec); + } + + switch (*fmt) { +@@ -1346,6 +1355,14 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, + /* Fallthrough */ + case 'S': + case 's': ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ break; ++#else ++ return symbol_string(buf, end, ptr, spec, fmt); ++#endif ++ case 'X': ++ ptr = dereference_function_descriptor(ptr); ++ case 'A': + case 'B': + return symbol_string(buf, end, ptr, spec, fmt); + case 'R': +@@ -1403,6 +1420,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, + va_end(va); + return buf; + } ++ case 'P': ++ break; + case 'K': + /* + * %pK cannot be used in IRQ context because its test +@@ -1460,6 +1479,22 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, + ((const struct file *)ptr)->f_path.dentry, + spec, fmt); + } ++ ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ /* 'P' = approved pointers to copy to userland, ++ as in the /proc/kallsyms case, as we make it display nothing ++ for non-root users, and the real contents for root users ++ 'X' = approved simple symbols ++ Also ignore 'K' pointers, since we force their NULLing for non-root users ++ above ++ */ ++ if ((unsigned long)ptr > TASK_SIZE && *fmt != 'P' && *fmt != 'X' && *fmt != 'K' && is_usercopy_object(buf)) { ++ printk(KERN_ALERT "grsec: kernel infoleak detected! Please report this log to spender@grsecurity.net.\n"); ++ dump_stack(); ++ ptr = NULL; ++ } ++#endif ++ + spec.flags |= SMALL; + if (spec.field_width == -1) { + spec.field_width = default_width; +@@ -2160,11 +2195,11 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf) + typeof(type) value; \ + if (sizeof(type) == 8) { \ + args = PTR_ALIGN(args, sizeof(u32)); \ +- *(u32 *)&value = *(u32 *)args; \ +- *((u32 *)&value + 1) = *(u32 *)(args + 4); \ ++ *(u32 *)&value = *(const u32 *)args; \ ++ *((u32 *)&value + 1) = *(const u32 *)(args + 4); \ + } else { \ + args = PTR_ALIGN(args, sizeof(type)); \ +- value = *(typeof(type) *)args; \ ++ value = *(const typeof(type) *)args; \ + } \ + args += sizeof(type); \ + value; \ +@@ -2227,7 +2262,7 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf) + case FORMAT_TYPE_STR: { + const char *str_arg = args; + args += strlen(str_arg) + 1; +- str = string(str, end, (char *)str_arg, spec); ++ str = string(str, end, str_arg, spec); + break; + } + +diff --git a/localversion-grsec b/localversion-grsec +new file mode 100644 +index 0000000..7cd6065 +--- /dev/null ++++ b/localversion-grsec +@@ -0,0 +1 @@ ++-grsec +diff --git a/mm/Kconfig b/mm/Kconfig +index 1d1ae6b..0f05885 100644 +--- a/mm/Kconfig ++++ b/mm/Kconfig +@@ -341,10 +341,11 @@ config KSM + root has set /sys/kernel/mm/ksm/run to 1 (if CONFIG_SYSFS is set). + + config DEFAULT_MMAP_MIN_ADDR +- int "Low address space to protect from user allocation" ++ int "Low address space to protect from user allocation" + depends on MMU +- default 4096 +- help ++ default 32768 if ALPHA || ARM || PARISC || SPARC32 ++ default 65536 ++ help + This is the portion of low virtual memory which should be protected + from userspace allocation. Keeping a user from writing to low pages + can help reduce the impact of kernel NULL pointer bugs. +@@ -375,7 +376,7 @@ config MEMORY_FAILURE + + config HWPOISON_INJECT + tristate "HWPoison pages injector" +- depends on MEMORY_FAILURE && DEBUG_KERNEL && PROC_FS ++ depends on MEMORY_FAILURE && DEBUG_KERNEL && PROC_FS && !GRKERNSEC + select PROC_PAGE_MONITOR + + config NOMMU_INITIAL_TRIM_EXCESS +diff --git a/mm/Kconfig.debug b/mm/Kconfig.debug +index 4b24432..63a3e5e 100644 +--- a/mm/Kconfig.debug ++++ b/mm/Kconfig.debug +@@ -1,6 +1,7 @@ + config DEBUG_PAGEALLOC + bool "Debug page memory allocations" + depends on DEBUG_KERNEL ++ depends on !PAX_MEMORY_SANITIZE + depends on !HIBERNATION || ARCH_SUPPORTS_DEBUG_PAGEALLOC && !PPC && !SPARC + depends on !KMEMCHECK + select PAGE_POISONING if !ARCH_SUPPORTS_DEBUG_PAGEALLOC +diff --git a/mm/backing-dev.c b/mm/backing-dev.c +index 0ae0df5..82ac56b 100644 +--- a/mm/backing-dev.c ++++ b/mm/backing-dev.c +@@ -12,7 +12,7 @@ + #include <linux/device.h> + #include <trace/events/writeback.h> + +-static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); ++static atomic_long_unchecked_t bdi_seq = ATOMIC_LONG_INIT(0); + + struct backing_dev_info default_backing_dev_info = { + .name = "default", +@@ -525,7 +525,7 @@ int bdi_setup_and_register(struct backing_dev_info *bdi, char *name, + return err; + + err = bdi_register(bdi, NULL, "%.28s-%ld", name, +- atomic_long_inc_return(&bdi_seq)); ++ atomic_long_inc_return_unchecked(&bdi_seq)); + if (err) { + bdi_destroy(bdi); + return err; +diff --git a/mm/filemap.c b/mm/filemap.c +index 37beab9..2c55a85 100644 +--- a/mm/filemap.c ++++ b/mm/filemap.c +@@ -2097,7 +2097,7 @@ int generic_file_mmap(struct file * file, struct vm_area_struct * vma) + struct address_space *mapping = file->f_mapping; + + if (!mapping->a_ops->readpage) +- return -ENOEXEC; ++ return -ENODEV; + file_accessed(file); + vma->vm_ops = &generic_file_vm_ops; + return 0; +@@ -2275,6 +2275,7 @@ inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, i + *pos = i_size_read(inode); + + if (limit != RLIM_INFINITY) { ++ gr_learn_resource(current, RLIMIT_FSIZE,*pos, 0); + if (*pos >= limit) { + send_sig(SIGXFSZ, current, 0); + return -EFBIG; +diff --git a/mm/fremap.c b/mm/fremap.c +index 72b8fa3..c5b39f1 100644 +--- a/mm/fremap.c ++++ b/mm/fremap.c +@@ -180,6 +180,11 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, + retry: + vma = find_vma(mm, start); + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (vma && (mm->pax_flags & MF_PAX_SEGMEXEC) && (vma->vm_flags & VM_MAYEXEC)) ++ goto out; ++#endif ++ + /* + * Make sure the vma is shared, that it supports prefaulting, + * and that the remapped range is valid and fully within +diff --git a/mm/gup.c b/mm/gup.c +index a0d57ec..79d469ce 100644 +--- a/mm/gup.c ++++ b/mm/gup.c +@@ -274,11 +274,6 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, + unsigned int fault_flags = 0; + int ret; + +- /* For mlock, just skip the stack guard page. */ +- if ((*flags & FOLL_MLOCK) && +- (stack_guard_page_start(vma, address) || +- stack_guard_page_end(vma, address + PAGE_SIZE))) +- return -ENOENT; + if (*flags & FOLL_WRITE) + fault_flags |= FAULT_FLAG_WRITE; + if (nonblocking) +@@ -444,14 +439,14 @@ long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, + if (!(gup_flags & FOLL_FORCE)) + gup_flags |= FOLL_NUMA; + +- do { ++ while (nr_pages) { + struct page *page; + unsigned int foll_flags = gup_flags; + unsigned int page_increm; + + /* first iteration or cross vma bound */ + if (!vma || start >= vma->vm_end) { +- vma = find_extend_vma(mm, start); ++ vma = find_vma(mm, start); + if (!vma && in_gate_area(mm, start)) { + int ret; + ret = get_gate_page(mm, start & PAGE_MASK, +@@ -463,7 +458,7 @@ long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, + goto next_page; + } + +- if (!vma || check_vma_flags(vma, gup_flags)) ++ if (!vma || start < vma->vm_start || check_vma_flags(vma, gup_flags)) + return i ? : -EFAULT; + if (is_vm_hugetlb_page(vma)) { + i = follow_hugetlb_page(mm, vma, pages, vmas, +@@ -518,7 +513,7 @@ next_page: + i += page_increm; + start += page_increm * PAGE_SIZE; + nr_pages -= page_increm; +- } while (nr_pages); ++ } + return i; + } + EXPORT_SYMBOL(__get_user_pages); +diff --git a/mm/highmem.c b/mm/highmem.c +index 123bcd3..0de52ba 100644 +--- a/mm/highmem.c ++++ b/mm/highmem.c +@@ -195,8 +195,9 @@ static void flush_all_zero_pkmaps(void) + * So no dangers, even with speculative execution. + */ + page = pte_page(pkmap_page_table[i]); ++ pax_open_kernel(); + pte_clear(&init_mm, PKMAP_ADDR(i), &pkmap_page_table[i]); +- ++ pax_close_kernel(); + set_page_address(page, NULL); + need_flush = 1; + } +@@ -259,9 +260,11 @@ start: + } + } + vaddr = PKMAP_ADDR(last_pkmap_nr); ++ ++ pax_open_kernel(); + set_pte_at(&init_mm, vaddr, + &(pkmap_page_table[last_pkmap_nr]), mk_pte(page, kmap_prot)); +- ++ pax_close_kernel(); + pkmap_count[last_pkmap_nr] = 1; + set_page_address(page, (void *)vaddr); + +diff --git a/mm/hugetlb.c b/mm/hugetlb.c +index 4cacc6a..b140d31 100644 +--- a/mm/hugetlb.c ++++ b/mm/hugetlb.c +@@ -2258,6 +2258,7 @@ static int hugetlb_sysctl_handler_common(bool obey_mempolicy, + struct ctl_table *table, int write, + void __user *buffer, size_t *length, loff_t *ppos) + { ++ ctl_table_no_const t; + struct hstate *h = &default_hstate; + unsigned long tmp = h->max_huge_pages; + int ret; +@@ -2265,9 +2266,10 @@ static int hugetlb_sysctl_handler_common(bool obey_mempolicy, + if (!hugepages_supported()) + return -ENOTSUPP; + +- table->data = &tmp; +- table->maxlen = sizeof(unsigned long); +- ret = proc_doulongvec_minmax(table, write, buffer, length, ppos); ++ t = *table; ++ t.data = &tmp; ++ t.maxlen = sizeof(unsigned long); ++ ret = proc_doulongvec_minmax(&t, write, buffer, length, ppos); + if (ret) + goto out; + +@@ -2302,6 +2304,7 @@ int hugetlb_overcommit_handler(struct ctl_table *table, int write, + struct hstate *h = &default_hstate; + unsigned long tmp; + int ret; ++ ctl_table_no_const hugetlb_table; + + if (!hugepages_supported()) + return -ENOTSUPP; +@@ -2311,9 +2314,10 @@ int hugetlb_overcommit_handler(struct ctl_table *table, int write, + if (write && hstate_is_gigantic(h)) + return -EINVAL; + +- table->data = &tmp; +- table->maxlen = sizeof(unsigned long); +- ret = proc_doulongvec_minmax(table, write, buffer, length, ppos); ++ hugetlb_table = *table; ++ hugetlb_table.data = &tmp; ++ hugetlb_table.maxlen = sizeof(unsigned long); ++ ret = proc_doulongvec_minmax(&hugetlb_table, write, buffer, length, ppos); + if (ret) + goto out; + +@@ -2793,6 +2797,27 @@ static void unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, + mutex_unlock(&mapping->i_mmap_mutex); + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++static void pax_mirror_huge_pte(struct vm_area_struct *vma, unsigned long address, struct page *page_m) ++{ ++ struct mm_struct *mm = vma->vm_mm; ++ struct vm_area_struct *vma_m; ++ unsigned long address_m; ++ pte_t *ptep_m; ++ ++ vma_m = pax_find_mirror_vma(vma); ++ if (!vma_m) ++ return; ++ ++ BUG_ON(address >= SEGMEXEC_TASK_SIZE); ++ address_m = address + SEGMEXEC_TASK_SIZE; ++ ptep_m = huge_pte_offset(mm, address_m & HPAGE_MASK); ++ get_page(page_m); ++ hugepage_add_anon_rmap(page_m, vma_m, address_m); ++ set_huge_pte_at(mm, address_m, ptep_m, make_huge_pte(vma_m, page_m, 0)); ++} ++#endif ++ + /* + * Hugetlb_cow() should be called with page lock of the original hugepage held. + * Called with hugetlb_instantiation_mutex held and pte_page locked so we +@@ -2904,6 +2929,11 @@ retry_avoidcopy: + make_huge_pte(vma, new_page, 1)); + page_remove_rmap(old_page); + hugepage_add_new_anon_rmap(new_page, vma, address); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_mirror_huge_pte(vma, address, new_page); ++#endif ++ + /* Make the old page be freed below */ + new_page = old_page; + } +@@ -3064,6 +3094,10 @@ retry: + && (vma->vm_flags & VM_SHARED))); + set_huge_pte_at(mm, address, ptep, new_pte); + ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_mirror_huge_pte(vma, address, page); ++#endif ++ + if ((flags & FAULT_FLAG_WRITE) && !(vma->vm_flags & VM_SHARED)) { + /* Optimization, do the COW without a second fault */ + ret = hugetlb_cow(mm, vma, address, ptep, new_pte, page, ptl); +@@ -3131,6 +3165,10 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, + struct address_space *mapping; + int need_wait_lock = 0; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m; ++#endif ++ + address &= huge_page_mask(h); + + ptep = huge_pte_offset(mm, address); +@@ -3144,6 +3182,26 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, + VM_FAULT_SET_HINDEX(hstate_index(h)); + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++ vma_m = pax_find_mirror_vma(vma); ++ if (vma_m) { ++ unsigned long address_m; ++ ++ if (vma->vm_start > vma_m->vm_start) { ++ address_m = address; ++ address -= SEGMEXEC_TASK_SIZE; ++ vma = vma_m; ++ h = hstate_vma(vma); ++ } else ++ address_m = address + SEGMEXEC_TASK_SIZE; ++ ++ if (!huge_pte_alloc(mm, address_m, huge_page_size(h))) ++ return VM_FAULT_OOM; ++ address_m &= HPAGE_MASK; ++ unmap_hugepage_range(vma, address_m, address_m + HPAGE_SIZE, NULL); ++ } ++#endif ++ + ptep = huge_pte_alloc(mm, address, huge_page_size(h)); + if (!ptep) + return VM_FAULT_OOM; +diff --git a/mm/internal.h b/mm/internal.h +index a4f90ba..fbdc32b 100644 +--- a/mm/internal.h ++++ b/mm/internal.h +@@ -134,6 +134,7 @@ __find_buddy_index(unsigned long page_idx, unsigned int order) + + extern int __isolate_free_page(struct page *page, unsigned int order); + extern void __free_pages_bootmem(struct page *page, unsigned int order); ++extern void free_compound_page(struct page *page); + extern void prep_compound_page(struct page *page, unsigned long order); + #ifdef CONFIG_MEMORY_FAILURE + extern bool is_free_buddy_page(struct page *page); +@@ -390,7 +391,7 @@ extern u32 hwpoison_filter_enable; + + extern unsigned long vm_mmap_pgoff(struct file *, unsigned long, + unsigned long, unsigned long, +- unsigned long, unsigned long); ++ unsigned long, unsigned long) __intentional_overflow(-1); + + extern void set_pageblock_order(void); + unsigned long reclaim_clean_pages_from_list(struct zone *zone, +diff --git a/mm/iov_iter.c b/mm/iov_iter.c +index e34a3cb..a810efe 100644 +--- a/mm/iov_iter.c ++++ b/mm/iov_iter.c +@@ -307,7 +307,7 @@ static size_t __iovec_copy_from_user_inatomic(char *vaddr, + + while (bytes) { + char __user *buf = iov->iov_base + base; +- int copy = min(bytes, iov->iov_len - base); ++ size_t copy = min(bytes, iov->iov_len - base); + + base = 0; + left = __copy_from_user_inatomic(vaddr, buf, copy); +@@ -335,7 +335,7 @@ static size_t copy_from_user_atomic_iovec(struct page *page, + + kaddr = kmap_atomic(page); + if (likely(i->nr_segs == 1)) { +- int left; ++ size_t left; + char __user *buf = i->iov->iov_base + i->iov_offset; + left = __copy_from_user_inatomic(kaddr + offset, buf, bytes); + copied = bytes - left; +@@ -365,7 +365,7 @@ static void advance_iovec(struct iov_iter *i, size_t bytes) + * zero-length segments (without overruning the iovec). + */ + while (bytes || unlikely(i->count && !iov->iov_len)) { +- int copy; ++ size_t copy; + + copy = min(bytes, iov->iov_len - base); + BUG_ON(!i->count || i->count < copy); +diff --git a/mm/kmemleak.c b/mm/kmemleak.c +index 3cda50c..032ba634 100644 +--- a/mm/kmemleak.c ++++ b/mm/kmemleak.c +@@ -364,7 +364,7 @@ static void print_unreferenced(struct seq_file *seq, + + for (i = 0; i < object->trace_len; i++) { + void *ptr = (void *)object->trace[i]; +- seq_printf(seq, " [<%p>] %pS\n", ptr, ptr); ++ seq_printf(seq, " [<%pP>] %pA\n", ptr, ptr); + } + } + +@@ -1905,7 +1905,7 @@ static int __init kmemleak_late_init(void) + return -ENOMEM; + } + +- dentry = debugfs_create_file("kmemleak", S_IRUGO, NULL, NULL, ++ dentry = debugfs_create_file("kmemleak", S_IRUSR, NULL, NULL, + &kmemleak_fops); + if (!dentry) + pr_warning("Failed to create the debugfs kmemleak file\n"); +diff --git a/mm/maccess.c b/mm/maccess.c +index d53adf9..03a24bf 100644 +--- a/mm/maccess.c ++++ b/mm/maccess.c +@@ -26,7 +26,7 @@ long __probe_kernel_read(void *dst, const void *src, size_t size) + set_fs(KERNEL_DS); + pagefault_disable(); + ret = __copy_from_user_inatomic(dst, +- (__force const void __user *)src, size); ++ (const void __force_user *)src, size); + pagefault_enable(); + set_fs(old_fs); + +@@ -53,7 +53,7 @@ long __probe_kernel_write(void *dst, const void *src, size_t size) + + set_fs(KERNEL_DS); + pagefault_disable(); +- ret = __copy_to_user_inatomic((__force void __user *)dst, src, size); ++ ret = __copy_to_user_inatomic((void __force_user *)dst, src, size); + pagefault_enable(); + set_fs(old_fs); + +diff --git a/mm/madvise.c b/mm/madvise.c +index 0938b30..d5bb7c7 100644 +--- a/mm/madvise.c ++++ b/mm/madvise.c +@@ -51,6 +51,10 @@ static long madvise_behavior(struct vm_area_struct *vma, + pgoff_t pgoff; + unsigned long new_flags = vma->vm_flags; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m; ++#endif ++ + switch (behavior) { + case MADV_NORMAL: + new_flags = new_flags & ~VM_RAND_READ & ~VM_SEQ_READ; +@@ -126,6 +130,13 @@ success: + /* + * vm_flags is protected by the mmap_sem held in write mode. + */ ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ vma_m = pax_find_mirror_vma(vma); ++ if (vma_m) ++ vma_m->vm_flags = new_flags & ~(VM_WRITE | VM_MAYWRITE | VM_ACCOUNT); ++#endif ++ + vma->vm_flags = new_flags; + + out: +@@ -274,6 +285,11 @@ static long madvise_dontneed(struct vm_area_struct *vma, + struct vm_area_struct **prev, + unsigned long start, unsigned long end) + { ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m; ++#endif ++ + *prev = vma; + if (vma->vm_flags & (VM_LOCKED|VM_HUGETLB|VM_PFNMAP)) + return -EINVAL; +@@ -286,6 +302,21 @@ static long madvise_dontneed(struct vm_area_struct *vma, + zap_page_range(vma, start, end - start, &details); + } else + zap_page_range(vma, start, end - start, NULL); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ vma_m = pax_find_mirror_vma(vma); ++ if (vma_m) { ++ if (unlikely(vma->vm_flags & VM_NONLINEAR)) { ++ struct zap_details details = { ++ .nonlinear_vma = vma_m, ++ .last_index = ULONG_MAX, ++ }; ++ zap_page_range(vma_m, start + SEGMEXEC_TASK_SIZE, end - start, &details); ++ } else ++ zap_page_range(vma_m, start + SEGMEXEC_TASK_SIZE, end - start, NULL); ++ } ++#endif ++ + return 0; + } + +@@ -488,6 +519,16 @@ SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior) + if (end < start) + return error; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (current->mm->pax_flags & MF_PAX_SEGMEXEC) { ++ if (end > SEGMEXEC_TASK_SIZE) ++ return error; ++ } else ++#endif ++ ++ if (end > TASK_SIZE) ++ return error; ++ + error = 0; + if (end == start) + return error; +diff --git a/mm/memory-failure.c b/mm/memory-failure.c +index 3415e7a..32271c6 100644 +--- a/mm/memory-failure.c ++++ b/mm/memory-failure.c +@@ -61,7 +61,7 @@ int sysctl_memory_failure_early_kill __read_mostly = 0; + + int sysctl_memory_failure_recovery __read_mostly = 1; + +-atomic_long_t num_poisoned_pages __read_mostly = ATOMIC_LONG_INIT(0); ++atomic_long_unchecked_t num_poisoned_pages __read_mostly = ATOMIC_LONG_INIT(0); + + #if defined(CONFIG_HWPOISON_INJECT) || defined(CONFIG_HWPOISON_INJECT_MODULE) + +@@ -198,7 +198,7 @@ static int kill_proc(struct task_struct *t, unsigned long addr, int trapno, + pfn, t->comm, t->pid); + si.si_signo = SIGBUS; + si.si_errno = 0; +- si.si_addr = (void *)addr; ++ si.si_addr = (void __user *)addr; + #ifdef __ARCH_SI_TRAPNO + si.si_trapno = trapno; + #endif +@@ -791,7 +791,7 @@ static struct page_state { + unsigned long res; + char *msg; + int (*action)(struct page *p, unsigned long pfn); +-} error_states[] = { ++} __do_const error_states[] = { + { reserved, reserved, "reserved kernel", me_kernel }, + /* + * free pages are specially detected outside this table: +@@ -1099,7 +1099,7 @@ int memory_failure(unsigned long pfn, int trapno, int flags) + nr_pages = 1 << compound_order(hpage); + else /* normal page or thp */ + nr_pages = 1; +- atomic_long_add(nr_pages, &num_poisoned_pages); ++ atomic_long_add_unchecked(nr_pages, &num_poisoned_pages); + + /* + * We need/can do nothing about count=0 pages. +@@ -1128,7 +1128,7 @@ int memory_failure(unsigned long pfn, int trapno, int flags) + if (PageHWPoison(hpage)) { + if ((hwpoison_filter(p) && TestClearPageHWPoison(p)) + || (p != hpage && TestSetPageHWPoison(hpage))) { +- atomic_long_sub(nr_pages, &num_poisoned_pages); ++ atomic_long_sub_unchecked(nr_pages, &num_poisoned_pages); + unlock_page(hpage); + return 0; + } +@@ -1196,14 +1196,14 @@ int memory_failure(unsigned long pfn, int trapno, int flags) + */ + if (!PageHWPoison(p)) { + printk(KERN_ERR "MCE %#lx: just unpoisoned\n", pfn); +- atomic_long_sub(nr_pages, &num_poisoned_pages); ++ atomic_long_sub_unchecked(nr_pages, &num_poisoned_pages); + put_page(hpage); + res = 0; + goto out; + } + if (hwpoison_filter(p)) { + if (TestClearPageHWPoison(p)) +- atomic_long_sub(nr_pages, &num_poisoned_pages); ++ atomic_long_sub_unchecked(nr_pages, &num_poisoned_pages); + unlock_page(hpage); + put_page(hpage); + return 0; +@@ -1433,7 +1433,7 @@ int unpoison_memory(unsigned long pfn) + return 0; + } + if (TestClearPageHWPoison(p)) +- atomic_long_dec(&num_poisoned_pages); ++ atomic_long_dec_unchecked(&num_poisoned_pages); + pr_info("MCE: Software-unpoisoned free page %#lx\n", pfn); + return 0; + } +@@ -1447,7 +1447,7 @@ int unpoison_memory(unsigned long pfn) + */ + if (TestClearPageHWPoison(page)) { + pr_info("MCE: Software-unpoisoned page %#lx\n", pfn); +- atomic_long_sub(nr_pages, &num_poisoned_pages); ++ atomic_long_sub_unchecked(nr_pages, &num_poisoned_pages); + freeit = 1; + if (PageHuge(page)) + clear_page_hwpoison_huge_page(page); +@@ -1572,11 +1572,11 @@ static int soft_offline_huge_page(struct page *page, int flags) + if (PageHuge(page)) { + set_page_hwpoison_huge_page(hpage); + dequeue_hwpoisoned_huge_page(hpage); +- atomic_long_add(1 << compound_order(hpage), ++ atomic_long_add_unchecked(1 << compound_order(hpage), + &num_poisoned_pages); + } else { + SetPageHWPoison(page); +- atomic_long_inc(&num_poisoned_pages); ++ atomic_long_inc_unchecked(&num_poisoned_pages); + } + } + return ret; +@@ -1615,7 +1615,7 @@ static int __soft_offline_page(struct page *page, int flags) + put_page(page); + pr_info("soft_offline: %#lx: invalidated\n", pfn); + SetPageHWPoison(page); +- atomic_long_inc(&num_poisoned_pages); ++ atomic_long_inc_unchecked(&num_poisoned_pages); + return 0; + } + +@@ -1664,7 +1664,7 @@ static int __soft_offline_page(struct page *page, int flags) + if (!is_free_buddy_page(page)) + pr_info("soft offline: %#lx: page leaked\n", + pfn); +- atomic_long_inc(&num_poisoned_pages); ++ atomic_long_inc_unchecked(&num_poisoned_pages); + } + } else { + pr_info("soft offline: %#lx: isolation failed: %d, page count %d, type %lx\n", +@@ -1734,11 +1734,11 @@ int soft_offline_page(struct page *page, int flags) + if (PageHuge(page)) { + set_page_hwpoison_huge_page(hpage); + dequeue_hwpoisoned_huge_page(hpage); +- atomic_long_add(1 << compound_order(hpage), ++ atomic_long_add_unchecked(1 << compound_order(hpage), + &num_poisoned_pages); + } else { + SetPageHWPoison(page); +- atomic_long_inc(&num_poisoned_pages); ++ atomic_long_inc_unchecked(&num_poisoned_pages); + } + } + unset_migratetype_isolate(page, MIGRATE_MOVABLE); +diff --git a/mm/memory.c b/mm/memory.c +index 90fb265..806b574 100644 +--- a/mm/memory.c ++++ b/mm/memory.c +@@ -413,6 +413,7 @@ static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud, + free_pte_range(tlb, pmd, addr); + } while (pmd++, addr = next, addr != end); + ++#if !defined(CONFIG_X86_32) || !defined(CONFIG_PAX_PER_CPU_PGD) + start &= PUD_MASK; + if (start < floor) + return; +@@ -427,6 +428,8 @@ static inline void free_pmd_range(struct mmu_gather *tlb, pud_t *pud, + pmd = pmd_offset(pud, start); + pud_clear(pud); + pmd_free_tlb(tlb, pmd, start); ++#endif ++ + } + + static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, +@@ -446,6 +449,7 @@ static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, + free_pmd_range(tlb, pud, addr, next, floor, ceiling); + } while (pud++, addr = next, addr != end); + ++#if !defined(CONFIG_X86_64) || !defined(CONFIG_PAX_PER_CPU_PGD) + start &= PGDIR_MASK; + if (start < floor) + return; +@@ -460,6 +464,8 @@ static inline void free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, + pud = pud_offset(pgd, start); + pgd_clear(pgd); + pud_free_tlb(tlb, pud, start); ++#endif ++ + } + + /* +@@ -689,10 +695,10 @@ static void print_bad_pte(struct vm_area_struct *vma, unsigned long addr, + * Choose text because data symbols depend on CONFIG_KALLSYMS_ALL=y + */ + if (vma->vm_ops) +- printk(KERN_ALERT "vma->vm_ops->fault: %pSR\n", ++ printk(KERN_ALERT "vma->vm_ops->fault: %pAR\n", + vma->vm_ops->fault); + if (vma->vm_file) +- printk(KERN_ALERT "vma->vm_file->f_op->mmap: %pSR\n", ++ printk(KERN_ALERT "vma->vm_file->f_op->mmap: %pAR\n", + vma->vm_file->f_op->mmap); + dump_stack(); + add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE); +@@ -1487,6 +1493,10 @@ static int insert_page(struct vm_area_struct *vma, unsigned long addr, + page_add_file_rmap(page); + set_pte_at(mm, addr, pte, mk_pte(page, prot)); + ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_mirror_file_pte(vma, addr, page, ptl); ++#endif ++ + retval = 0; + pte_unmap_unlock(pte, ptl); + return retval; +@@ -1531,9 +1541,21 @@ int vm_insert_page(struct vm_area_struct *vma, unsigned long addr, + if (!page_count(page)) + return -EINVAL; + if (!(vma->vm_flags & VM_MIXEDMAP)) { ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m; ++#endif ++ + BUG_ON(down_read_trylock(&vma->vm_mm->mmap_sem)); + BUG_ON(vma->vm_flags & VM_PFNMAP); + vma->vm_flags |= VM_MIXEDMAP; ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ vma_m = pax_find_mirror_vma(vma); ++ if (vma_m) ++ vma_m->vm_flags |= VM_MIXEDMAP; ++#endif ++ + } + return insert_page(vma, addr, page, vma->vm_page_prot); + } +@@ -1616,6 +1638,7 @@ int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr, + unsigned long pfn) + { + BUG_ON(!(vma->vm_flags & VM_MIXEDMAP)); ++ BUG_ON(vma->vm_mirror); + + if (addr < vma->vm_start || addr >= vma->vm_end) + return -EFAULT; +@@ -1863,7 +1886,9 @@ static int apply_to_pmd_range(struct mm_struct *mm, pud_t *pud, + + BUG_ON(pud_huge(*pud)); + +- pmd = pmd_alloc(mm, pud, addr); ++ pmd = (mm == &init_mm) ? ++ pmd_alloc_kernel(mm, pud, addr) : ++ pmd_alloc(mm, pud, addr); + if (!pmd) + return -ENOMEM; + do { +@@ -1883,7 +1908,9 @@ static int apply_to_pud_range(struct mm_struct *mm, pgd_t *pgd, + unsigned long next; + int err; + +- pud = pud_alloc(mm, pgd, addr); ++ pud = (mm == &init_mm) ? ++ pud_alloc_kernel(mm, pgd, addr) : ++ pud_alloc(mm, pgd, addr); + if (!pud) + return -ENOMEM; + do { +@@ -2005,6 +2032,186 @@ static int do_page_mkwrite(struct vm_area_struct *vma, struct page *page, + return ret; + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++static void pax_unmap_mirror_pte(struct vm_area_struct *vma, unsigned long address, pmd_t *pmd) ++{ ++ struct mm_struct *mm = vma->vm_mm; ++ spinlock_t *ptl; ++ pte_t *pte, entry; ++ ++ pte = pte_offset_map_lock(mm, pmd, address, &ptl); ++ entry = *pte; ++ if (!pte_present(entry)) { ++ if (!pte_none(entry)) { ++ BUG_ON(pte_file(entry)); ++ free_swap_and_cache(pte_to_swp_entry(entry)); ++ pte_clear_not_present_full(mm, address, pte, 0); ++ } ++ } else { ++ struct page *page; ++ ++ flush_cache_page(vma, address, pte_pfn(entry)); ++ entry = ptep_clear_flush(vma, address, pte); ++ BUG_ON(pte_dirty(entry)); ++ page = vm_normal_page(vma, address, entry); ++ if (page) { ++ update_hiwater_rss(mm); ++ if (PageAnon(page)) ++ dec_mm_counter_fast(mm, MM_ANONPAGES); ++ else ++ dec_mm_counter_fast(mm, MM_FILEPAGES); ++ page_remove_rmap(page); ++ page_cache_release(page); ++ } ++ } ++ pte_unmap_unlock(pte, ptl); ++} ++ ++/* PaX: if vma is mirrored, synchronize the mirror's PTE ++ * ++ * the ptl of the lower mapped page is held on entry and is not released on exit ++ * or inside to ensure atomic changes to the PTE states (swapout, mremap, munmap, etc) ++ */ ++static void pax_mirror_anon_pte(struct vm_area_struct *vma, unsigned long address, struct page *page_m, spinlock_t *ptl) ++{ ++ struct mm_struct *mm = vma->vm_mm; ++ unsigned long address_m; ++ spinlock_t *ptl_m; ++ struct vm_area_struct *vma_m; ++ pmd_t *pmd_m; ++ pte_t *pte_m, entry_m; ++ ++ BUG_ON(!page_m || !PageAnon(page_m)); ++ ++ vma_m = pax_find_mirror_vma(vma); ++ if (!vma_m) ++ return; ++ ++ BUG_ON(!PageLocked(page_m)); ++ BUG_ON(address >= SEGMEXEC_TASK_SIZE); ++ address_m = address + SEGMEXEC_TASK_SIZE; ++ pmd_m = pmd_offset(pud_offset(pgd_offset(mm, address_m), address_m), address_m); ++ pte_m = pte_offset_map(pmd_m, address_m); ++ ptl_m = pte_lockptr(mm, pmd_m); ++ if (ptl != ptl_m) { ++ spin_lock_nested(ptl_m, SINGLE_DEPTH_NESTING); ++ if (!pte_none(*pte_m)) ++ goto out; ++ } ++ ++ entry_m = pfn_pte(page_to_pfn(page_m), vma_m->vm_page_prot); ++ page_cache_get(page_m); ++ page_add_anon_rmap(page_m, vma_m, address_m); ++ inc_mm_counter_fast(mm, MM_ANONPAGES); ++ set_pte_at(mm, address_m, pte_m, entry_m); ++ update_mmu_cache(vma_m, address_m, pte_m); ++out: ++ if (ptl != ptl_m) ++ spin_unlock(ptl_m); ++ pte_unmap(pte_m); ++ unlock_page(page_m); ++} ++ ++void pax_mirror_file_pte(struct vm_area_struct *vma, unsigned long address, struct page *page_m, spinlock_t *ptl) ++{ ++ struct mm_struct *mm = vma->vm_mm; ++ unsigned long address_m; ++ spinlock_t *ptl_m; ++ struct vm_area_struct *vma_m; ++ pmd_t *pmd_m; ++ pte_t *pte_m, entry_m; ++ ++ BUG_ON(!page_m || PageAnon(page_m)); ++ ++ vma_m = pax_find_mirror_vma(vma); ++ if (!vma_m) ++ return; ++ ++ BUG_ON(address >= SEGMEXEC_TASK_SIZE); ++ address_m = address + SEGMEXEC_TASK_SIZE; ++ pmd_m = pmd_offset(pud_offset(pgd_offset(mm, address_m), address_m), address_m); ++ pte_m = pte_offset_map(pmd_m, address_m); ++ ptl_m = pte_lockptr(mm, pmd_m); ++ if (ptl != ptl_m) { ++ spin_lock_nested(ptl_m, SINGLE_DEPTH_NESTING); ++ if (!pte_none(*pte_m)) ++ goto out; ++ } ++ ++ entry_m = pfn_pte(page_to_pfn(page_m), vma_m->vm_page_prot); ++ page_cache_get(page_m); ++ page_add_file_rmap(page_m); ++ inc_mm_counter_fast(mm, MM_FILEPAGES); ++ set_pte_at(mm, address_m, pte_m, entry_m); ++ update_mmu_cache(vma_m, address_m, pte_m); ++out: ++ if (ptl != ptl_m) ++ spin_unlock(ptl_m); ++ pte_unmap(pte_m); ++} ++ ++static void pax_mirror_pfn_pte(struct vm_area_struct *vma, unsigned long address, unsigned long pfn_m, spinlock_t *ptl) ++{ ++ struct mm_struct *mm = vma->vm_mm; ++ unsigned long address_m; ++ spinlock_t *ptl_m; ++ struct vm_area_struct *vma_m; ++ pmd_t *pmd_m; ++ pte_t *pte_m, entry_m; ++ ++ vma_m = pax_find_mirror_vma(vma); ++ if (!vma_m) ++ return; ++ ++ BUG_ON(address >= SEGMEXEC_TASK_SIZE); ++ address_m = address + SEGMEXEC_TASK_SIZE; ++ pmd_m = pmd_offset(pud_offset(pgd_offset(mm, address_m), address_m), address_m); ++ pte_m = pte_offset_map(pmd_m, address_m); ++ ptl_m = pte_lockptr(mm, pmd_m); ++ if (ptl != ptl_m) { ++ spin_lock_nested(ptl_m, SINGLE_DEPTH_NESTING); ++ if (!pte_none(*pte_m)) ++ goto out; ++ } ++ ++ entry_m = pfn_pte(pfn_m, vma_m->vm_page_prot); ++ set_pte_at(mm, address_m, pte_m, entry_m); ++out: ++ if (ptl != ptl_m) ++ spin_unlock(ptl_m); ++ pte_unmap(pte_m); ++} ++ ++static void pax_mirror_pte(struct vm_area_struct *vma, unsigned long address, pte_t *pte, pmd_t *pmd, spinlock_t *ptl) ++{ ++ struct page *page_m; ++ pte_t entry; ++ ++ if (!(vma->vm_mm->pax_flags & MF_PAX_SEGMEXEC)) ++ goto out; ++ ++ entry = *pte; ++ page_m = vm_normal_page(vma, address, entry); ++ if (!page_m) ++ pax_mirror_pfn_pte(vma, address, pte_pfn(entry), ptl); ++ else if (PageAnon(page_m)) { ++ if (pax_find_mirror_vma(vma)) { ++ pte_unmap_unlock(pte, ptl); ++ lock_page(page_m); ++ pte = pte_offset_map_lock(vma->vm_mm, pmd, address, &ptl); ++ if (pte_same(entry, *pte)) ++ pax_mirror_anon_pte(vma, address, page_m, ptl); ++ else ++ unlock_page(page_m); ++ } ++ } else ++ pax_mirror_file_pte(vma, address, page_m, ptl); ++ ++out: ++ pte_unmap_unlock(pte, ptl); ++} ++#endif ++ + /* + * This routine handles present pages, when users try to write + * to a shared page. It is done by copying the page to a new address +@@ -2211,6 +2418,12 @@ gotten: + */ + page_table = pte_offset_map_lock(mm, pmd, address, &ptl); + if (likely(pte_same(*page_table, orig_pte))) { ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (pax_find_mirror_vma(vma)) ++ BUG_ON(!trylock_page(new_page)); ++#endif ++ + if (old_page) { + if (!PageAnon(old_page)) { + dec_mm_counter_fast(mm, MM_FILEPAGES); +@@ -2264,6 +2477,10 @@ gotten: + page_remove_rmap(old_page); + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_mirror_anon_pte(vma, address, new_page, ptl); ++#endif ++ + /* Free the old page.. */ + new_page = old_page; + ret |= VM_FAULT_WRITE; +@@ -2538,6 +2755,11 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, + swap_free(entry); + if (vm_swap_full() || (vma->vm_flags & VM_LOCKED) || PageMlocked(page)) + try_to_free_swap(page); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((flags & FAULT_FLAG_WRITE) || !pax_find_mirror_vma(vma)) ++#endif ++ + unlock_page(page); + if (page != swapcache) { + /* +@@ -2561,6 +2783,11 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, + + /* No need to invalidate - it was non-present before */ + update_mmu_cache(vma, address, page_table); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_mirror_anon_pte(vma, address, page, ptl); ++#endif ++ + unlock: + pte_unmap_unlock(page_table, ptl); + out: +@@ -2580,40 +2807,6 @@ out_release: + } + + /* +- * This is like a special single-page "expand_{down|up}wards()", +- * except we must first make sure that 'address{-|+}PAGE_SIZE' +- * doesn't hit another vma. +- */ +-static inline int check_stack_guard_page(struct vm_area_struct *vma, unsigned long address) +-{ +- address &= PAGE_MASK; +- if ((vma->vm_flags & VM_GROWSDOWN) && address == vma->vm_start) { +- struct vm_area_struct *prev = vma->vm_prev; +- +- /* +- * Is there a mapping abutting this one below? +- * +- * That's only ok if it's the same stack mapping +- * that has gotten split.. +- */ +- if (prev && prev->vm_end == address) +- return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM; +- +- return expand_downwards(vma, address - PAGE_SIZE); +- } +- if ((vma->vm_flags & VM_GROWSUP) && address + PAGE_SIZE == vma->vm_end) { +- struct vm_area_struct *next = vma->vm_next; +- +- /* As VM_GROWSDOWN but s/below/above/ */ +- if (next && next->vm_start == address + PAGE_SIZE) +- return next->vm_flags & VM_GROWSUP ? 0 : -ENOMEM; +- +- return expand_upwards(vma, address + PAGE_SIZE); +- } +- return 0; +-} +- +-/* + * We enter with non-exclusive mmap_sem (to exclude vma changes, + * but allow concurrent faults), and pte mapped but not yet locked. + * We return with mmap_sem still held, but pte unmapped and unlocked. +@@ -2623,27 +2816,23 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, + unsigned int flags) + { + struct mem_cgroup *memcg; +- struct page *page; ++ struct page *page = NULL; + spinlock_t *ptl; + pte_t entry; + +- pte_unmap(page_table); +- +- /* Check if we need to add a guard page to the stack */ +- if (check_stack_guard_page(vma, address) < 0) +- return VM_FAULT_SIGSEGV; +- +- /* Use the zero-page for reads */ + if (!(flags & FAULT_FLAG_WRITE)) { + entry = pte_mkspecial(pfn_pte(my_zero_pfn(address), + vma->vm_page_prot)); +- page_table = pte_offset_map_lock(mm, pmd, address, &ptl); ++ ptl = pte_lockptr(mm, pmd); ++ spin_lock(ptl); + if (!pte_none(*page_table)) + goto unlock; + goto setpte; + } + + /* Allocate our own private page. */ ++ pte_unmap(page_table); ++ + if (unlikely(anon_vma_prepare(vma))) + goto oom; + page = alloc_zeroed_user_highpage_movable(vma, address); +@@ -2667,6 +2856,11 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, + if (!pte_none(*page_table)) + goto release; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (pax_find_mirror_vma(vma)) ++ BUG_ON(!trylock_page(page)); ++#endif ++ + inc_mm_counter_fast(mm, MM_ANONPAGES); + page_add_new_anon_rmap(page, vma, address); + mem_cgroup_commit_charge(page, memcg, false); +@@ -2676,6 +2870,12 @@ setpte: + + /* No need to invalidate - it was non-present before */ + update_mmu_cache(vma, address, page_table); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (page) ++ pax_mirror_anon_pte(vma, address, page, ptl); ++#endif ++ + unlock: + pte_unmap_unlock(page_table, ptl); + return 0; +@@ -2906,6 +3106,11 @@ static int do_read_fault(struct mm_struct *mm, struct vm_area_struct *vma, + return ret; + } + do_set_pte(vma, address, fault_page, pte, false, false); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_mirror_file_pte(vma, address, fault_page, ptl); ++#endif ++ + unlock_page(fault_page); + unlock_out: + pte_unmap_unlock(pte, ptl); +@@ -2948,7 +3153,18 @@ static int do_cow_fault(struct mm_struct *mm, struct vm_area_struct *vma, + page_cache_release(fault_page); + goto uncharge_out; + } ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (pax_find_mirror_vma(vma)) ++ BUG_ON(!trylock_page(new_page)); ++#endif ++ + do_set_pte(vma, address, new_page, pte, true, true); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_mirror_anon_pte(vma, address, new_page, ptl); ++#endif ++ + mem_cgroup_commit_charge(new_page, memcg, false); + lru_cache_add_active_or_unevictable(new_page, vma); + pte_unmap_unlock(pte, ptl); +@@ -2998,6 +3214,11 @@ static int do_shared_fault(struct mm_struct *mm, struct vm_area_struct *vma, + return ret; + } + do_set_pte(vma, address, fault_page, pte, true, false); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_mirror_file_pte(vma, address, fault_page, ptl); ++#endif ++ + pte_unmap_unlock(pte, ptl); + + if (set_page_dirty(fault_page)) +@@ -3239,6 +3460,12 @@ static int handle_pte_fault(struct mm_struct *mm, + if (flags & FAULT_FLAG_WRITE) + flush_tlb_fix_spurious_fault(vma, address); + } ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ pax_mirror_pte(vma, address, pte, pmd, ptl); ++ return 0; ++#endif ++ + unlock: + pte_unmap_unlock(pte, ptl); + return 0; +@@ -3258,9 +3485,41 @@ static int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, + pmd_t *pmd; + pte_t *pte; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m; ++#endif ++ + if (unlikely(is_vm_hugetlb_page(vma))) + return hugetlb_fault(mm, vma, address, flags); + ++#ifdef CONFIG_PAX_SEGMEXEC ++ vma_m = pax_find_mirror_vma(vma); ++ if (vma_m) { ++ unsigned long address_m; ++ pgd_t *pgd_m; ++ pud_t *pud_m; ++ pmd_t *pmd_m; ++ ++ if (vma->vm_start > vma_m->vm_start) { ++ address_m = address; ++ address -= SEGMEXEC_TASK_SIZE; ++ vma = vma_m; ++ } else ++ address_m = address + SEGMEXEC_TASK_SIZE; ++ ++ pgd_m = pgd_offset(mm, address_m); ++ pud_m = pud_alloc(mm, pgd_m, address_m); ++ if (!pud_m) ++ return VM_FAULT_OOM; ++ pmd_m = pmd_alloc(mm, pud_m, address_m); ++ if (!pmd_m) ++ return VM_FAULT_OOM; ++ if (!pmd_present(*pmd_m) && __pte_alloc(mm, vma_m, pmd_m, address_m)) ++ return VM_FAULT_OOM; ++ pax_unmap_mirror_pte(vma_m, address_m, pmd_m); ++ } ++#endif ++ + pgd = pgd_offset(mm, address); + pud = pud_alloc(mm, pgd, address); + if (!pud) +@@ -3394,6 +3653,23 @@ int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address) + spin_unlock(&mm->page_table_lock); + return 0; + } ++ ++int __pud_alloc_kernel(struct mm_struct *mm, pgd_t *pgd, unsigned long address) ++{ ++ pud_t *new = pud_alloc_one(mm, address); ++ if (!new) ++ return -ENOMEM; ++ ++ smp_wmb(); /* See comment in __pte_alloc */ ++ ++ spin_lock(&mm->page_table_lock); ++ if (pgd_present(*pgd)) /* Another has populated it */ ++ pud_free(mm, new); ++ else ++ pgd_populate_kernel(mm, pgd, new); ++ spin_unlock(&mm->page_table_lock); ++ return 0; ++} + #endif /* __PAGETABLE_PUD_FOLDED */ + + #ifndef __PAGETABLE_PMD_FOLDED +@@ -3424,6 +3700,30 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address) + spin_unlock(&mm->page_table_lock); + return 0; + } ++ ++int __pmd_alloc_kernel(struct mm_struct *mm, pud_t *pud, unsigned long address) ++{ ++ pmd_t *new = pmd_alloc_one(mm, address); ++ if (!new) ++ return -ENOMEM; ++ ++ smp_wmb(); /* See comment in __pte_alloc */ ++ ++ spin_lock(&mm->page_table_lock); ++#ifndef __ARCH_HAS_4LEVEL_HACK ++ if (pud_present(*pud)) /* Another has populated it */ ++ pmd_free(mm, new); ++ else ++ pud_populate_kernel(mm, pud, new); ++#else ++ if (pgd_present(*pud)) /* Another has populated it */ ++ pmd_free(mm, new); ++ else ++ pgd_populate_kernel(mm, pud, new); ++#endif /* __ARCH_HAS_4LEVEL_HACK */ ++ spin_unlock(&mm->page_table_lock); ++ return 0; ++} + #endif /* __PAGETABLE_PMD_FOLDED */ + + static int __follow_pte(struct mm_struct *mm, unsigned long address, +@@ -3533,8 +3833,8 @@ out: + return ret; + } + +-int generic_access_phys(struct vm_area_struct *vma, unsigned long addr, +- void *buf, int len, int write) ++ssize_t generic_access_phys(struct vm_area_struct *vma, unsigned long addr, ++ void *buf, size_t len, int write) + { + resource_size_t phys_addr; + unsigned long prot = 0; +@@ -3560,8 +3860,8 @@ EXPORT_SYMBOL_GPL(generic_access_phys); + * Access another process' address space as given in mm. If non-NULL, use the + * given task for page fault accounting. + */ +-static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, +- unsigned long addr, void *buf, int len, int write) ++static ssize_t __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, ++ unsigned long addr, void *buf, size_t len, int write) + { + struct vm_area_struct *vma; + void *old_buf = buf; +@@ -3569,7 +3869,7 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, + down_read(&mm->mmap_sem); + /* ignore errors, just check how much was successfully transferred */ + while (len) { +- int bytes, ret, offset; ++ ssize_t bytes, ret, offset; + void *maddr; + struct page *page = NULL; + +@@ -3630,8 +3930,8 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, + * + * The caller must hold a reference on @mm. + */ +-int access_remote_vm(struct mm_struct *mm, unsigned long addr, +- void *buf, int len, int write) ++ssize_t access_remote_vm(struct mm_struct *mm, unsigned long addr, ++ void *buf, size_t len, int write) + { + return __access_remote_vm(NULL, mm, addr, buf, len, write); + } +@@ -3641,11 +3941,11 @@ int access_remote_vm(struct mm_struct *mm, unsigned long addr, + * Source/target buffer must be kernel space, + * Do not walk the page table directly, use get_user_pages + */ +-int access_process_vm(struct task_struct *tsk, unsigned long addr, +- void *buf, int len, int write) ++ssize_t access_process_vm(struct task_struct *tsk, unsigned long addr, ++ void *buf, size_t len, int write) + { + struct mm_struct *mm; +- int ret; ++ ssize_t ret; + + mm = get_task_mm(tsk); + if (!mm) +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index e58725a..e0be017 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -750,6 +750,10 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, + unsigned long vmstart; + unsigned long vmend; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m; ++#endif ++ + vma = find_vma(mm, start); + if (!vma || vma->vm_start > start) + return -EFAULT; +@@ -793,6 +797,16 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, + err = vma_replace_policy(vma, new_pol); + if (err) + goto out; ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ vma_m = pax_find_mirror_vma(vma); ++ if (vma_m) { ++ err = vma_replace_policy(vma_m, new_pol); ++ if (err) ++ goto out; ++ } ++#endif ++ + } + + out: +@@ -1212,6 +1226,17 @@ static long do_mbind(unsigned long start, unsigned long len, + + if (end < start) + return -EINVAL; ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) { ++ if (end > SEGMEXEC_TASK_SIZE) ++ return -EINVAL; ++ } else ++#endif ++ ++ if (end > TASK_SIZE) ++ return -EINVAL; ++ + if (end == start) + return 0; + +@@ -1437,8 +1462,7 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode, + */ + tcred = __task_cred(task); + if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) && +- !uid_eq(cred->uid, tcred->suid) && !uid_eq(cred->uid, tcred->uid) && +- !capable(CAP_SYS_NICE)) { ++ !uid_eq(cred->uid, tcred->suid) && !capable(CAP_SYS_NICE)) { + rcu_read_unlock(); + err = -EPERM; + goto out_put; +@@ -1469,6 +1493,15 @@ SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode, + goto out; + } + ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ if (mm != current->mm && ++ (mm->pax_flags & MF_PAX_RANDMMAP || mm->pax_flags & MF_PAX_SEGMEXEC)) { ++ mmput(mm); ++ err = -EPERM; ++ goto out; ++ } ++#endif ++ + err = do_migrate_pages(mm, old, new, + capable(CAP_SYS_NICE) ? MPOL_MF_MOVE_ALL : MPOL_MF_MOVE); + +diff --git a/mm/migrate.c b/mm/migrate.c +index 0143995..b294728 100644 +--- a/mm/migrate.c ++++ b/mm/migrate.c +@@ -1495,8 +1495,7 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages, + */ + tcred = __task_cred(task); + if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) && +- !uid_eq(cred->uid, tcred->suid) && !uid_eq(cred->uid, tcred->uid) && +- !capable(CAP_SYS_NICE)) { ++ !uid_eq(cred->uid, tcred->suid) && !capable(CAP_SYS_NICE)) { + rcu_read_unlock(); + err = -EPERM; + goto out; +diff --git a/mm/mlock.c b/mm/mlock.c +index 73cf098..ab547c7 100644 +--- a/mm/mlock.c ++++ b/mm/mlock.c +@@ -14,6 +14,7 @@ + #include <linux/pagevec.h> + #include <linux/mempolicy.h> + #include <linux/syscalls.h> ++#include <linux/security.h> + #include <linux/sched.h> + #include <linux/export.h> + #include <linux/rmap.h> +@@ -613,7 +614,7 @@ static int do_mlock(unsigned long start, size_t len, int on) + { + unsigned long nstart, end, tmp; + struct vm_area_struct * vma, * prev; +- int error; ++ int error = 0; + + VM_BUG_ON(start & ~PAGE_MASK); + VM_BUG_ON(len != PAGE_ALIGN(len)); +@@ -622,6 +623,9 @@ static int do_mlock(unsigned long start, size_t len, int on) + return -EINVAL; + if (end == start) + return 0; ++ if (end > TASK_SIZE) ++ return -EINVAL; ++ + vma = find_vma(current->mm, start); + if (!vma || vma->vm_start > start) + return -ENOMEM; +@@ -633,6 +637,11 @@ static int do_mlock(unsigned long start, size_t len, int on) + for (nstart = start ; ; ) { + vm_flags_t newflags; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((current->mm->pax_flags & MF_PAX_SEGMEXEC) && (vma->vm_start >= SEGMEXEC_TASK_SIZE)) ++ break; ++#endif ++ + /* Here we know that vma->vm_start <= nstart < vma->vm_end. */ + + newflags = vma->vm_flags & ~VM_LOCKED; +@@ -746,6 +755,7 @@ SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len) + locked += current->mm->locked_vm; + + /* check against resource limits */ ++ gr_learn_resource(current, RLIMIT_MEMLOCK, (current->mm->locked_vm << PAGE_SHIFT) + len, 1); + if ((locked <= lock_limit) || capable(CAP_IPC_LOCK)) + error = do_mlock(start, len, 1); + +@@ -783,6 +793,11 @@ static int do_mlockall(int flags) + for (vma = current->mm->mmap; vma ; vma = prev->vm_next) { + vm_flags_t newflags; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((current->mm->pax_flags & MF_PAX_SEGMEXEC) && (vma->vm_start >= SEGMEXEC_TASK_SIZE)) ++ break; ++#endif ++ + newflags = vma->vm_flags & ~VM_LOCKED; + if (flags & MCL_CURRENT) + newflags |= VM_LOCKED; +@@ -814,8 +829,10 @@ SYSCALL_DEFINE1(mlockall, int, flags) + lock_limit >>= PAGE_SHIFT; + + ret = -ENOMEM; +- down_write(¤t->mm->mmap_sem); + ++ gr_learn_resource(current, RLIMIT_MEMLOCK, current->mm->total_vm << PAGE_SHIFT, 1); ++ ++ down_write(¤t->mm->mmap_sem); + if (!(flags & MCL_CURRENT) || (current->mm->total_vm <= lock_limit) || + capable(CAP_IPC_LOCK)) + ret = do_mlockall(flags); +diff --git a/mm/mmap.c b/mm/mmap.c +index f88b4f9..1e3189a 100644 +--- a/mm/mmap.c ++++ b/mm/mmap.c +@@ -41,6 +41,7 @@ + #include <linux/notifier.h> + #include <linux/memory.h> + #include <linux/printk.h> ++#include <linux/random.h> + + #include <asm/uaccess.h> + #include <asm/cacheflush.h> +@@ -57,6 +58,16 @@ + #define arch_rebalance_pgtables(addr, len) (addr) + #endif + ++static inline void verify_mm_writelocked(struct mm_struct *mm) ++{ ++#if defined(CONFIG_DEBUG_VM) || defined(CONFIG_PAX) ++ if (unlikely(down_read_trylock(&mm->mmap_sem))) { ++ up_read(&mm->mmap_sem); ++ BUG(); ++ } ++#endif ++} ++ + static void unmap_region(struct mm_struct *mm, + struct vm_area_struct *vma, struct vm_area_struct *prev, + unsigned long start, unsigned long end); +@@ -76,16 +87,25 @@ static void unmap_region(struct mm_struct *mm, + * x: (no) no x: (no) yes x: (no) yes x: (yes) yes + * + */ +-pgprot_t protection_map[16] = { ++pgprot_t protection_map[16] __read_only = { + __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111, + __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111 + }; + +-pgprot_t vm_get_page_prot(unsigned long vm_flags) ++pgprot_t vm_get_page_prot(vm_flags_t vm_flags) + { +- return __pgprot(pgprot_val(protection_map[vm_flags & ++ pgprot_t prot = __pgprot(pgprot_val(protection_map[vm_flags & + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) | + pgprot_val(arch_vm_get_page_prot(vm_flags))); ++ ++#if defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_X86_32) ++ if (!(__supported_pte_mask & _PAGE_NX) && ++ (vm_flags & (VM_PAGEEXEC | VM_EXEC)) == VM_PAGEEXEC && ++ (vm_flags & (VM_READ | VM_WRITE))) ++ prot = __pgprot(pte_val(pte_exprotect(__pte(pgprot_val(prot))))); ++#endif ++ ++ return prot; + } + EXPORT_SYMBOL(vm_get_page_prot); + +@@ -114,6 +134,7 @@ unsigned long sysctl_overcommit_kbytes __read_mostly; + int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT; + unsigned long sysctl_user_reserve_kbytes __read_mostly = 1UL << 17; /* 128MB */ + unsigned long sysctl_admin_reserve_kbytes __read_mostly = 1UL << 13; /* 8MB */ ++unsigned long sysctl_heap_stack_gap __read_mostly = 64*1024; + /* + * Make sure vm_committed_as in one cacheline and not cacheline shared with + * other variables. It can be updated by several CPUs frequently. +@@ -274,6 +295,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma) + struct vm_area_struct *next = vma->vm_next; + + might_sleep(); ++ BUG_ON(vma->vm_mirror); + if (vma->vm_ops && vma->vm_ops->close) + vma->vm_ops->close(vma); + if (vma->vm_file) +@@ -287,6 +309,7 @@ static unsigned long do_brk(unsigned long addr, unsigned long len); + + SYSCALL_DEFINE1(brk, unsigned long, brk) + { ++ unsigned long rlim; + unsigned long retval; + unsigned long newbrk, oldbrk; + struct mm_struct *mm = current->mm; +@@ -317,7 +340,13 @@ SYSCALL_DEFINE1(brk, unsigned long, brk) + * segment grow beyond its set limit the in case where the limit is + * not page aligned -Ram Gupta + */ +- if (check_data_rlimit(rlimit(RLIMIT_DATA), brk, mm->start_brk, ++ rlim = rlimit(RLIMIT_DATA); ++#ifdef CONFIG_GRKERNSEC_PROC_MEMMAP ++ /* force a minimum 16MB brk heap on setuid/setgid binaries */ ++ if (rlim < PAGE_SIZE && (get_dumpable(mm) != SUID_DUMP_USER) && gr_is_global_nonroot(current_uid())) ++ rlim = 4096 * PAGE_SIZE; ++#endif ++ if (check_data_rlimit(rlim, brk, mm->start_brk, + mm->end_data, mm->start_data)) + goto out; + +@@ -976,6 +1005,12 @@ static int + can_vma_merge_before(struct vm_area_struct *vma, unsigned long vm_flags, + struct anon_vma *anon_vma, struct file *file, pgoff_t vm_pgoff) + { ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((vma->vm_mm->pax_flags & MF_PAX_SEGMEXEC) && vma->vm_start == SEGMEXEC_TASK_SIZE) ++ return 0; ++#endif ++ + if (is_mergeable_vma(vma, file, vm_flags) && + is_mergeable_anon_vma(anon_vma, vma->anon_vma, vma)) { + if (vma->vm_pgoff == vm_pgoff) +@@ -995,6 +1030,12 @@ static int + can_vma_merge_after(struct vm_area_struct *vma, unsigned long vm_flags, + struct anon_vma *anon_vma, struct file *file, pgoff_t vm_pgoff) + { ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((vma->vm_mm->pax_flags & MF_PAX_SEGMEXEC) && vma->vm_end == SEGMEXEC_TASK_SIZE) ++ return 0; ++#endif ++ + if (is_mergeable_vma(vma, file, vm_flags) && + is_mergeable_anon_vma(anon_vma, vma->anon_vma, vma)) { + pgoff_t vm_pglen; +@@ -1044,6 +1085,13 @@ struct vm_area_struct *vma_merge(struct mm_struct *mm, + struct vm_area_struct *area, *next; + int err; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ unsigned long addr_m = addr + SEGMEXEC_TASK_SIZE, end_m = end + SEGMEXEC_TASK_SIZE; ++ struct vm_area_struct *area_m = NULL, *next_m = NULL, *prev_m = NULL; ++ ++ BUG_ON((mm->pax_flags & MF_PAX_SEGMEXEC) && SEGMEXEC_TASK_SIZE < end); ++#endif ++ + /* + * We later require that vma->vm_flags == vm_flags, + * so this tests vma->vm_flags & VM_SPECIAL, too. +@@ -1059,6 +1107,15 @@ struct vm_area_struct *vma_merge(struct mm_struct *mm, + if (next && next->vm_end == end) /* cases 6, 7, 8 */ + next = next->vm_next; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (prev) ++ prev_m = pax_find_mirror_vma(prev); ++ if (area) ++ area_m = pax_find_mirror_vma(area); ++ if (next) ++ next_m = pax_find_mirror_vma(next); ++#endif ++ + /* + * Can it merge with the predecessor? + */ +@@ -1078,9 +1135,24 @@ struct vm_area_struct *vma_merge(struct mm_struct *mm, + /* cases 1, 6 */ + err = vma_adjust(prev, prev->vm_start, + next->vm_end, prev->vm_pgoff, NULL); +- } else /* cases 2, 5, 7 */ ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (!err && prev_m) ++ err = vma_adjust(prev_m, prev_m->vm_start, ++ next_m->vm_end, prev_m->vm_pgoff, NULL); ++#endif ++ ++ } else { /* cases 2, 5, 7 */ + err = vma_adjust(prev, prev->vm_start, + end, prev->vm_pgoff, NULL); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (!err && prev_m) ++ err = vma_adjust(prev_m, prev_m->vm_start, ++ end_m, prev_m->vm_pgoff, NULL); ++#endif ++ ++ } + if (err) + return NULL; + khugepaged_enter_vma_merge(prev, vm_flags); +@@ -1094,12 +1166,27 @@ struct vm_area_struct *vma_merge(struct mm_struct *mm, + mpol_equal(policy, vma_policy(next)) && + can_vma_merge_before(next, vm_flags, + anon_vma, file, pgoff+pglen)) { +- if (prev && addr < prev->vm_end) /* case 4 */ ++ if (prev && addr < prev->vm_end) { /* case 4 */ + err = vma_adjust(prev, prev->vm_start, + addr, prev->vm_pgoff, NULL); +- else /* cases 3, 8 */ ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (!err && prev_m) ++ err = vma_adjust(prev_m, prev_m->vm_start, ++ addr_m, prev_m->vm_pgoff, NULL); ++#endif ++ ++ } else { /* cases 3, 8 */ + err = vma_adjust(area, addr, next->vm_end, + next->vm_pgoff - pglen, NULL); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (!err && area_m) ++ err = vma_adjust(area_m, addr_m, next_m->vm_end, ++ next_m->vm_pgoff - pglen, NULL); ++#endif ++ ++ } + if (err) + return NULL; + khugepaged_enter_vma_merge(area, vm_flags); +@@ -1208,8 +1295,10 @@ none: + void vm_stat_account(struct mm_struct *mm, unsigned long flags, + struct file *file, long pages) + { +- const unsigned long stack_flags +- = VM_STACK_FLAGS & (VM_GROWSUP|VM_GROWSDOWN); ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP) || (flags & (VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC))) ++#endif + + mm->total_vm += pages; + +@@ -1217,7 +1306,7 @@ void vm_stat_account(struct mm_struct *mm, unsigned long flags, + mm->shared_vm += pages; + if ((flags & (VM_EXEC|VM_WRITE)) == VM_EXEC) + mm->exec_vm += pages; +- } else if (flags & stack_flags) ++ } else if (flags & (VM_GROWSUP|VM_GROWSDOWN)) + mm->stack_vm += pages; + } + #endif /* CONFIG_PROC_FS */ +@@ -1247,6 +1336,7 @@ static inline int mlock_future_check(struct mm_struct *mm, + locked += mm->locked_vm; + lock_limit = rlimit(RLIMIT_MEMLOCK); + lock_limit >>= PAGE_SHIFT; ++ gr_learn_resource(current, RLIMIT_MEMLOCK, locked << PAGE_SHIFT, 1); + if (locked > lock_limit && !capable(CAP_IPC_LOCK)) + return -EAGAIN; + } +@@ -1273,7 +1363,7 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, + * (the exception is when the underlying filesystem is noexec + * mounted, in which case we dont add PROT_EXEC.) + */ +- if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC)) ++ if ((prot & (PROT_READ | PROT_WRITE)) && (current->personality & READ_IMPLIES_EXEC)) + if (!(file && (file->f_path.mnt->mnt_flags & MNT_NOEXEC))) + prot |= PROT_EXEC; + +@@ -1299,7 +1389,7 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, + /* Obtain the address to map to. we verify (or select) it and ensure + * that it represents a valid section of the address space. + */ +- addr = get_unmapped_area(file, addr, len, pgoff, flags); ++ addr = get_unmapped_area(file, addr, len, pgoff, flags | ((prot & PROT_EXEC) ? MAP_EXECUTABLE : 0)); + if (addr & ~PAGE_MASK) + return addr; + +@@ -1310,6 +1400,43 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, + vm_flags = calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags) | + mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; + ++#ifdef CONFIG_PAX_MPROTECT ++ if (mm->pax_flags & MF_PAX_MPROTECT) { ++ ++#ifdef CONFIG_GRKERNSEC_RWXMAP_LOG ++ if (file && !pgoff && (vm_flags & VM_EXEC) && mm->binfmt && ++ mm->binfmt->handle_mmap) ++ mm->binfmt->handle_mmap(file); ++#endif ++ ++#ifndef CONFIG_PAX_MPROTECT_COMPAT ++ if ((vm_flags & (VM_WRITE | VM_EXEC)) == (VM_WRITE | VM_EXEC)) { ++ gr_log_rwxmmap(file); ++ ++#ifdef CONFIG_PAX_EMUPLT ++ vm_flags &= ~VM_EXEC; ++#else ++ return -EPERM; ++#endif ++ ++ } ++ ++ if (!(vm_flags & VM_EXEC)) ++ vm_flags &= ~VM_MAYEXEC; ++#else ++ if ((vm_flags & (VM_WRITE | VM_EXEC)) != VM_EXEC) ++ vm_flags &= ~(VM_EXEC | VM_MAYEXEC); ++#endif ++ else ++ vm_flags &= ~VM_MAYWRITE; ++ } ++#endif ++ ++#if defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_X86_32) ++ if ((mm->pax_flags & MF_PAX_PAGEEXEC) && file) ++ vm_flags &= ~VM_PAGEEXEC; ++#endif ++ + if (flags & MAP_LOCKED) + if (!can_do_mlock()) + return -EPERM; +@@ -1397,6 +1524,9 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, + vm_flags |= VM_NORESERVE; + } + ++ if (!gr_acl_handle_mmap(file, prot)) ++ return -EACCES; ++ + addr = mmap_region(file, addr, len, vm_flags, pgoff); + if (!IS_ERR_VALUE(addr) && + ((vm_flags & VM_LOCKED) || +@@ -1490,7 +1620,7 @@ int vma_wants_writenotify(struct vm_area_struct *vma) + vm_flags_t vm_flags = vma->vm_flags; + + /* If it was private or non-writable, the write bit is already clear */ +- if ((vm_flags & (VM_WRITE|VM_SHARED)) != ((VM_WRITE|VM_SHARED))) ++ if ((vm_flags & (VM_WRITE|VM_SHARED)) != (VM_WRITE|VM_SHARED)) + return 0; + + /* The backer wishes to know when pages are first written to? */ +@@ -1541,7 +1671,22 @@ unsigned long mmap_region(struct file *file, unsigned long addr, + struct rb_node **rb_link, *rb_parent; + unsigned long charged = 0; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m = NULL; ++#endif ++ ++ /* ++ * mm->mmap_sem is required to protect against another thread ++ * changing the mappings in case we sleep. ++ */ ++ verify_mm_writelocked(mm); ++ + /* Check against address space limit. */ ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP) || (vm_flags & (VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC))) ++#endif ++ + if (!may_expand_vm(mm, len >> PAGE_SHIFT)) { + unsigned long nr_pages; + +@@ -1560,11 +1705,10 @@ unsigned long mmap_region(struct file *file, unsigned long addr, + + /* Clear old maps */ + error = -ENOMEM; +-munmap_back: + if (find_vma_links(mm, addr, addr + len, &prev, &rb_link, &rb_parent)) { + if (do_munmap(mm, addr, len)) + return -ENOMEM; +- goto munmap_back; ++ BUG_ON(find_vma_links(mm, addr, addr + len, &prev, &rb_link, &rb_parent)); + } + + /* +@@ -1595,6 +1739,16 @@ munmap_back: + goto unacct_error; + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((mm->pax_flags & MF_PAX_SEGMEXEC) && (vm_flags & VM_EXEC)) { ++ vma_m = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); ++ if (!vma_m) { ++ error = -ENOMEM; ++ goto free_vma; ++ } ++ } ++#endif ++ + vma->vm_mm = mm; + vma->vm_start = addr; + vma->vm_end = addr + len; +@@ -1625,6 +1779,13 @@ munmap_back: + if (error) + goto unmap_and_free_vma; + ++#if defined(CONFIG_PAX_PAGEEXEC) && defined(CONFIG_X86_32) ++ if ((mm->pax_flags & MF_PAX_PAGEEXEC) && !(vma->vm_flags & VM_SPECIAL)) { ++ vma->vm_flags |= VM_PAGEEXEC; ++ vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); ++ } ++#endif ++ + /* Can addr have changed?? + * + * Answer: Yes, several device drivers can do it in their +@@ -1643,6 +1804,12 @@ munmap_back: + } + + vma_link(mm, vma, prev, rb_link, rb_parent); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (vma_m) ++ BUG_ON(pax_mirror_vma(vma_m, vma)); ++#endif ++ + /* Once vma denies write, undo our temporary denial count */ + if (file) { + if (vm_flags & VM_SHARED) +@@ -1655,6 +1822,7 @@ out: + perf_event_mmap(vma); + + vm_stat_account(mm, vm_flags, file, len >> PAGE_SHIFT); ++ track_exec_limit(mm, addr, addr + len, vm_flags); + if (vm_flags & VM_LOCKED) { + if (!((vm_flags & VM_SPECIAL) || is_vm_hugetlb_page(vma) || + vma == get_gate_vma(current->mm))) +@@ -1692,6 +1860,12 @@ allow_write_and_free_vma: + if (vm_flags & VM_DENYWRITE) + allow_write_access(file); + free_vma: ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (vma_m) ++ kmem_cache_free(vm_area_cachep, vma_m); ++#endif ++ + kmem_cache_free(vm_area_cachep, vma); + unacct_error: + if (charged) +@@ -1699,7 +1873,63 @@ unacct_error: + return error; + } + +-unsigned long unmapped_area(struct vm_unmapped_area_info *info) ++#ifdef CONFIG_GRKERNSEC_RAND_THREADSTACK ++unsigned long gr_rand_threadstack_offset(const struct mm_struct *mm, const struct file *filp, unsigned long flags) ++{ ++ if ((mm->pax_flags & MF_PAX_RANDMMAP) && !filp && (flags & MAP_STACK)) ++ return ((prandom_u32() & 0xFF) + 1) << PAGE_SHIFT; ++ ++ return 0; ++} ++#endif ++ ++bool check_heap_stack_gap(const struct vm_area_struct *vma, unsigned long addr, unsigned long len, unsigned long offset) ++{ ++ if (!vma) { ++#ifdef CONFIG_STACK_GROWSUP ++ if (addr > sysctl_heap_stack_gap) ++ vma = find_vma(current->mm, addr - sysctl_heap_stack_gap); ++ else ++ vma = find_vma(current->mm, 0); ++ if (vma && (vma->vm_flags & VM_GROWSUP)) ++ return false; ++#endif ++ return true; ++ } ++ ++ if (addr + len > vma->vm_start) ++ return false; ++ ++ if (vma->vm_flags & VM_GROWSDOWN) ++ return sysctl_heap_stack_gap <= vma->vm_start - addr - len; ++#ifdef CONFIG_STACK_GROWSUP ++ else if (vma->vm_prev && (vma->vm_prev->vm_flags & VM_GROWSUP)) ++ return addr - vma->vm_prev->vm_end >= sysctl_heap_stack_gap; ++#endif ++ else if (offset) ++ return offset <= vma->vm_start - addr - len; ++ ++ return true; ++} ++ ++unsigned long skip_heap_stack_gap(const struct vm_area_struct *vma, unsigned long len, unsigned long offset) ++{ ++ if (vma->vm_start < len) ++ return -ENOMEM; ++ ++ if (!(vma->vm_flags & VM_GROWSDOWN)) { ++ if (offset <= vma->vm_start - len) ++ return vma->vm_start - len - offset; ++ else ++ return -ENOMEM; ++ } ++ ++ if (sysctl_heap_stack_gap <= vma->vm_start - len) ++ return vma->vm_start - len - sysctl_heap_stack_gap; ++ return -ENOMEM; ++} ++ ++unsigned long unmapped_area(const struct vm_unmapped_area_info *info) + { + /* + * We implement the search by looking for an rbtree node that +@@ -1747,11 +1977,29 @@ unsigned long unmapped_area(struct vm_unmapped_area_info *info) + } + } + +- gap_start = vma->vm_prev ? vma->vm_prev->vm_end : 0; ++ gap_start = vma->vm_prev ? vma->vm_prev->vm_end: 0; + check_current: + /* Check if current node has a suitable gap */ + if (gap_start > high_limit) + return -ENOMEM; ++ ++ if (gap_end - gap_start > info->threadstack_offset) ++ gap_start += info->threadstack_offset; ++ else ++ gap_start = gap_end; ++ ++ if (vma->vm_prev && (vma->vm_prev->vm_flags & VM_GROWSUP)) { ++ if (gap_end - gap_start > sysctl_heap_stack_gap) ++ gap_start += sysctl_heap_stack_gap; ++ else ++ gap_start = gap_end; ++ } ++ if (vma->vm_flags & VM_GROWSDOWN) { ++ if (gap_end - gap_start > sysctl_heap_stack_gap) ++ gap_end -= sysctl_heap_stack_gap; ++ else ++ gap_end = gap_start; ++ } + if (gap_end >= low_limit && gap_end - gap_start >= length) + goto found; + +@@ -1801,7 +2049,7 @@ found: + return gap_start; + } + +-unsigned long unmapped_area_topdown(struct vm_unmapped_area_info *info) ++unsigned long unmapped_area_topdown(const struct vm_unmapped_area_info *info) + { + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; +@@ -1855,6 +2103,24 @@ check_current: + gap_end = vma->vm_start; + if (gap_end < low_limit) + return -ENOMEM; ++ ++ if (gap_end - gap_start > info->threadstack_offset) ++ gap_end -= info->threadstack_offset; ++ else ++ gap_end = gap_start; ++ ++ if (vma->vm_prev && (vma->vm_prev->vm_flags & VM_GROWSUP)) { ++ if (gap_end - gap_start > sysctl_heap_stack_gap) ++ gap_start += sysctl_heap_stack_gap; ++ else ++ gap_start = gap_end; ++ } ++ if (vma->vm_flags & VM_GROWSDOWN) { ++ if (gap_end - gap_start > sysctl_heap_stack_gap) ++ gap_end -= sysctl_heap_stack_gap; ++ else ++ gap_end = gap_start; ++ } + if (gap_start <= high_limit && gap_end - gap_start >= length) + goto found; + +@@ -1918,6 +2184,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + + if (len > TASK_SIZE - mmap_min_addr) + return -ENOMEM; +@@ -1925,11 +2192,15 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + if (flags & MAP_FIXED) + return addr; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + if (addr) { + addr = PAGE_ALIGN(addr); + vma = find_vma(mm, addr); + if (TASK_SIZE - len >= addr && addr >= mmap_min_addr && +- (!vma || addr + len <= vma->vm_start)) ++ check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + +@@ -1938,6 +2209,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, + info.low_limit = mm->mmap_base; + info.high_limit = TASK_SIZE; + info.align_mask = 0; ++ info.threadstack_offset = offset; + return vm_unmapped_area(&info); + } + #endif +@@ -1956,6 +2228,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + struct mm_struct *mm = current->mm; + unsigned long addr = addr0; + struct vm_unmapped_area_info info; ++ unsigned long offset = gr_rand_threadstack_offset(mm, filp, flags); + + /* requested length too big for entire address space */ + if (len > TASK_SIZE - mmap_min_addr) +@@ -1964,12 +2237,16 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + if (flags & MAP_FIXED) + return addr; + ++#ifdef CONFIG_PAX_RANDMMAP ++ if (!(mm->pax_flags & MF_PAX_RANDMMAP)) ++#endif ++ + /* requesting a specific address */ + if (addr) { + addr = PAGE_ALIGN(addr); + vma = find_vma(mm, addr); + if (TASK_SIZE - len >= addr && addr >= mmap_min_addr && +- (!vma || addr + len <= vma->vm_start)) ++ check_heap_stack_gap(vma, addr, len, offset)) + return addr; + } + +@@ -1978,6 +2255,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + info.low_limit = max(PAGE_SIZE, mmap_min_addr); + info.high_limit = mm->mmap_base; + info.align_mask = 0; ++ info.threadstack_offset = offset; + addr = vm_unmapped_area(&info); + + /* +@@ -1990,6 +2268,12 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, + VM_BUG_ON(addr != -ENOMEM); + info.flags = 0; + info.low_limit = TASK_UNMAPPED_BASE; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ info.low_limit += mm->delta_mmap; ++#endif ++ + info.high_limit = TASK_SIZE; + addr = vm_unmapped_area(&info); + } +@@ -2090,6 +2374,28 @@ find_vma_prev(struct mm_struct *mm, unsigned long addr, + return vma; + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++struct vm_area_struct *pax_find_mirror_vma(struct vm_area_struct *vma) ++{ ++ struct vm_area_struct *vma_m; ++ ++ BUG_ON(!vma || vma->vm_start >= vma->vm_end); ++ if (!(vma->vm_mm->pax_flags & MF_PAX_SEGMEXEC) || !(vma->vm_flags & VM_EXEC)) { ++ BUG_ON(vma->vm_mirror); ++ return NULL; ++ } ++ BUG_ON(vma->vm_start < SEGMEXEC_TASK_SIZE && SEGMEXEC_TASK_SIZE < vma->vm_end); ++ vma_m = vma->vm_mirror; ++ BUG_ON(!vma_m || vma_m->vm_mirror != vma); ++ BUG_ON(vma->vm_file != vma_m->vm_file); ++ BUG_ON(vma->vm_end - vma->vm_start != vma_m->vm_end - vma_m->vm_start); ++ BUG_ON(vma->vm_pgoff != vma_m->vm_pgoff); ++ BUG_ON(vma->anon_vma != vma_m->anon_vma && vma->anon_vma->root != vma_m->anon_vma->root); ++ BUG_ON((vma->vm_flags ^ vma_m->vm_flags) & ~(VM_WRITE | VM_MAYWRITE | VM_ACCOUNT | VM_LOCKED)); ++ return vma_m; ++} ++#endif ++ + /* + * Verify that the stack growth is acceptable and + * update accounting. This is shared with both the +@@ -2107,8 +2413,7 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns + + /* Stack limit test */ + actual_size = size; +- if (size && (vma->vm_flags & (VM_GROWSUP | VM_GROWSDOWN))) +- actual_size -= PAGE_SIZE; ++ gr_learn_resource(current, RLIMIT_STACK, actual_size, 1); + if (actual_size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur)) + return -ENOMEM; + +@@ -2119,6 +2424,7 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns + locked = mm->locked_vm + grow; + limit = ACCESS_ONCE(rlim[RLIMIT_MEMLOCK].rlim_cur); + limit >>= PAGE_SHIFT; ++ gr_learn_resource(current, RLIMIT_MEMLOCK, locked << PAGE_SHIFT, 1); + if (locked > limit && !capable(CAP_IPC_LOCK)) + return -ENOMEM; + } +@@ -2148,37 +2454,48 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns + * PA-RISC uses this for its stack; IA64 for its Register Backing Store. + * vma is the last one with address > vma->vm_end. Have to extend vma. + */ ++#ifndef CONFIG_IA64 ++static ++#endif + int expand_upwards(struct vm_area_struct *vma, unsigned long address) + { + int error; ++ bool locknext; + + if (!(vma->vm_flags & VM_GROWSUP)) + return -EFAULT; + ++ /* Also guard against wrapping around to address 0. */ ++ if (address < PAGE_ALIGN(address+1)) ++ address = PAGE_ALIGN(address+1); ++ else ++ return -ENOMEM; ++ + /* + * We must make sure the anon_vma is allocated + * so that the anon_vma locking is not a noop. + */ + if (unlikely(anon_vma_prepare(vma))) + return -ENOMEM; ++ locknext = vma->vm_next && (vma->vm_next->vm_flags & VM_GROWSDOWN); ++ if (locknext && anon_vma_prepare(vma->vm_next)) ++ return -ENOMEM; + vma_lock_anon_vma(vma); ++ if (locknext) ++ vma_lock_anon_vma(vma->vm_next); + + /* + * vma->vm_start/vm_end cannot change under us because the caller + * is required to hold the mmap_sem in read mode. We need the +- * anon_vma lock to serialize against concurrent expand_stacks. +- * Also guard against wrapping around to address 0. ++ * anon_vma locks to serialize against concurrent expand_stacks ++ * and expand_upwards. + */ +- if (address < PAGE_ALIGN(address+4)) +- address = PAGE_ALIGN(address+4); +- else { +- vma_unlock_anon_vma(vma); +- return -ENOMEM; +- } + error = 0; + + /* Somebody else might have raced and expanded it already */ +- if (address > vma->vm_end) { ++ if (vma->vm_next && (vma->vm_next->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)) && vma->vm_next->vm_start - address < sysctl_heap_stack_gap) ++ error = -ENOMEM; ++ else if (address > vma->vm_end && (!locknext || vma->vm_next->vm_start >= address)) { + unsigned long size, grow; + + size = address - vma->vm_start; +@@ -2213,6 +2530,8 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address) + } + } + } ++ if (locknext) ++ vma_unlock_anon_vma(vma->vm_next); + vma_unlock_anon_vma(vma); + khugepaged_enter_vma_merge(vma, vma->vm_flags); + validate_mm(vma->vm_mm); +@@ -2227,6 +2546,8 @@ int expand_downwards(struct vm_area_struct *vma, + unsigned long address) + { + int error; ++ bool lockprev = false; ++ struct vm_area_struct *prev; + + /* + * We must make sure the anon_vma is allocated +@@ -2240,6 +2561,15 @@ int expand_downwards(struct vm_area_struct *vma, + if (error) + return error; + ++ prev = vma->vm_prev; ++#if defined(CONFIG_STACK_GROWSUP) || defined(CONFIG_IA64) ++ lockprev = prev && (prev->vm_flags & VM_GROWSUP); ++#endif ++ if (lockprev && anon_vma_prepare(prev)) ++ return -ENOMEM; ++ if (lockprev) ++ vma_lock_anon_vma(prev); ++ + vma_lock_anon_vma(vma); + + /* +@@ -2249,9 +2579,17 @@ int expand_downwards(struct vm_area_struct *vma, + */ + + /* Somebody else might have raced and expanded it already */ +- if (address < vma->vm_start) { ++ if (prev && (prev->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)) && address - prev->vm_end < sysctl_heap_stack_gap) ++ error = -ENOMEM; ++ else if (address < vma->vm_start && (!lockprev || prev->vm_end <= address)) { + unsigned long size, grow; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m; ++ ++ vma_m = pax_find_mirror_vma(vma); ++#endif ++ + size = vma->vm_end - address; + grow = (vma->vm_start - address) >> PAGE_SHIFT; + +@@ -2276,13 +2614,27 @@ int expand_downwards(struct vm_area_struct *vma, + vma->vm_pgoff -= grow; + anon_vma_interval_tree_post_update_vma(vma); + vma_gap_update(vma); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (vma_m) { ++ anon_vma_interval_tree_pre_update_vma(vma_m); ++ vma_m->vm_start -= grow << PAGE_SHIFT; ++ vma_m->vm_pgoff -= grow; ++ anon_vma_interval_tree_post_update_vma(vma_m); ++ vma_gap_update(vma_m); ++ } ++#endif ++ + spin_unlock(&vma->vm_mm->page_table_lock); + ++ track_exec_limit(vma->vm_mm, vma->vm_start, vma->vm_end, vma->vm_flags); + perf_event_mmap(vma); + } + } + } + vma_unlock_anon_vma(vma); ++ if (lockprev) ++ vma_unlock_anon_vma(prev); + khugepaged_enter_vma_merge(vma, vma->vm_flags); + validate_mm(vma->vm_mm); + return error; +@@ -2380,6 +2732,13 @@ static void remove_vma_list(struct mm_struct *mm, struct vm_area_struct *vma) + do { + long nrpages = vma_pages(vma); + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((mm->pax_flags & MF_PAX_SEGMEXEC) && (vma->vm_start >= SEGMEXEC_TASK_SIZE)) { ++ vma = remove_vma(vma); ++ continue; ++ } ++#endif ++ + if (vma->vm_flags & VM_ACCOUNT) + nr_accounted += nrpages; + vm_stat_account(mm, vma->vm_flags, vma->vm_file, -nrpages); +@@ -2424,6 +2783,16 @@ detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma, + insertion_point = (prev ? &prev->vm_next : &mm->mmap); + vma->vm_prev = NULL; + do { ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (vma->vm_mirror) { ++ BUG_ON(!vma->vm_mirror->vm_mirror || vma->vm_mirror->vm_mirror != vma); ++ vma->vm_mirror->vm_mirror = NULL; ++ vma->vm_mirror->vm_flags &= ~VM_EXEC; ++ vma->vm_mirror = NULL; ++ } ++#endif ++ + vma_rb_erase(vma, &mm->mm_rb); + mm->map_count--; + tail_vma = vma; +@@ -2451,14 +2820,33 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + struct vm_area_struct *new; + int err = -ENOMEM; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m, *new_m = NULL; ++ unsigned long addr_m = addr + SEGMEXEC_TASK_SIZE; ++#endif ++ + if (is_vm_hugetlb_page(vma) && (addr & + ~(huge_page_mask(hstate_vma(vma))))) + return -EINVAL; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ vma_m = pax_find_mirror_vma(vma); ++#endif ++ + new = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); + if (!new) + goto out_err; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (vma_m) { ++ new_m = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); ++ if (!new_m) { ++ kmem_cache_free(vm_area_cachep, new); ++ goto out_err; ++ } ++ } ++#endif ++ + /* most fields are the same, copy all, and then fixup */ + *new = *vma; + +@@ -2471,6 +2859,22 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + new->vm_pgoff += ((addr - vma->vm_start) >> PAGE_SHIFT); + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (vma_m) { ++ *new_m = *vma_m; ++ INIT_LIST_HEAD(&new_m->anon_vma_chain); ++ new_m->vm_mirror = new; ++ new->vm_mirror = new_m; ++ ++ if (new_below) ++ new_m->vm_end = addr_m; ++ else { ++ new_m->vm_start = addr_m; ++ new_m->vm_pgoff += ((addr_m - vma_m->vm_start) >> PAGE_SHIFT); ++ } ++ } ++#endif ++ + err = vma_dup_policy(vma, new); + if (err) + goto out_free_vma; +@@ -2491,6 +2895,38 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + else + err = vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new); + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (!err && vma_m) { ++ struct mempolicy *pol = vma_policy(new); ++ ++ if (anon_vma_clone(new_m, vma_m)) ++ goto out_free_mpol; ++ ++ mpol_get(pol); ++ set_vma_policy(new_m, pol); ++ ++ if (new_m->vm_file) ++ get_file(new_m->vm_file); ++ ++ if (new_m->vm_ops && new_m->vm_ops->open) ++ new_m->vm_ops->open(new_m); ++ ++ if (new_below) ++ err = vma_adjust(vma_m, addr_m, vma_m->vm_end, vma_m->vm_pgoff + ++ ((addr_m - new_m->vm_start) >> PAGE_SHIFT), new_m); ++ else ++ err = vma_adjust(vma_m, vma_m->vm_start, addr_m, vma_m->vm_pgoff, new_m); ++ ++ if (err) { ++ if (new_m->vm_ops && new_m->vm_ops->close) ++ new_m->vm_ops->close(new_m); ++ if (new_m->vm_file) ++ fput(new_m->vm_file); ++ mpol_put(pol); ++ } ++ } ++#endif ++ + /* Success. */ + if (!err) + return 0; +@@ -2500,10 +2936,18 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + new->vm_ops->close(new); + if (new->vm_file) + fput(new->vm_file); +- unlink_anon_vmas(new); + out_free_mpol: + mpol_put(vma_policy(new)); + out_free_vma: ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (new_m) { ++ unlink_anon_vmas(new_m); ++ kmem_cache_free(vm_area_cachep, new_m); ++ } ++#endif ++ ++ unlink_anon_vmas(new); + kmem_cache_free(vm_area_cachep, new); + out_err: + return err; +@@ -2516,6 +2960,15 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + int split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + unsigned long addr, int new_below) + { ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) { ++ BUG_ON(vma->vm_end > SEGMEXEC_TASK_SIZE); ++ if (mm->map_count >= sysctl_max_map_count-1) ++ return -ENOMEM; ++ } else ++#endif ++ + if (mm->map_count >= sysctl_max_map_count) + return -ENOMEM; + +@@ -2527,11 +2980,30 @@ int split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + * work. This now handles partial unmappings. + * Jeremy Fitzhardinge <jeremy@goop.org> + */ ++#ifdef CONFIG_PAX_SEGMEXEC + int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) + { ++ int ret = __do_munmap(mm, start, len); ++ if (ret || !(mm->pax_flags & MF_PAX_SEGMEXEC)) ++ return ret; ++ ++ return __do_munmap(mm, start + SEGMEXEC_TASK_SIZE, len); ++} ++ ++int __do_munmap(struct mm_struct *mm, unsigned long start, size_t len) ++#else ++int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) ++#endif ++{ + unsigned long end; + struct vm_area_struct *vma, *prev, *last; + ++ /* ++ * mm->mmap_sem is required to protect against another thread ++ * changing the mappings in case we sleep. ++ */ ++ verify_mm_writelocked(mm); ++ + if ((start & ~PAGE_MASK) || start > TASK_SIZE || len > TASK_SIZE-start) + return -EINVAL; + +@@ -2607,6 +3079,8 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) + /* Fix up all other VM information */ + remove_vma_list(mm, vma); + ++ track_exec_limit(mm, start, end, 0UL); ++ + return 0; + } + +@@ -2615,6 +3089,13 @@ int vm_munmap(unsigned long start, size_t len) + int ret; + struct mm_struct *mm = current->mm; + ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((mm->pax_flags & MF_PAX_SEGMEXEC) && ++ (len > SEGMEXEC_TASK_SIZE || start > SEGMEXEC_TASK_SIZE-len)) ++ return -EINVAL; ++#endif ++ + down_write(&mm->mmap_sem); + ret = do_munmap(mm, start, len); + up_write(&mm->mmap_sem); +@@ -2628,16 +3109,6 @@ SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) + return vm_munmap(addr, len); + } + +-static inline void verify_mm_writelocked(struct mm_struct *mm) +-{ +-#ifdef CONFIG_DEBUG_VM +- if (unlikely(down_read_trylock(&mm->mmap_sem))) { +- WARN_ON(1); +- up_read(&mm->mmap_sem); +- } +-#endif +-} +- + /* + * this is really a simplified "do_mmap". it only handles + * anonymous maps. eventually we may be able to do some +@@ -2651,6 +3122,7 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) + struct rb_node **rb_link, *rb_parent; + pgoff_t pgoff = addr >> PAGE_SHIFT; + int error; ++ unsigned long charged; + + len = PAGE_ALIGN(len); + if (!len) +@@ -2658,10 +3130,24 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) + + flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags; + ++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) ++ if (mm->pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) { ++ flags &= ~VM_EXEC; ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (mm->pax_flags & MF_PAX_MPROTECT) ++ flags &= ~VM_MAYEXEC; ++#endif ++ ++ } ++#endif ++ + error = get_unmapped_area(NULL, addr, len, 0, MAP_FIXED); + if (error & ~PAGE_MASK) + return error; + ++ charged = len >> PAGE_SHIFT; ++ + error = mlock_future_check(mm, mm->def_flags, len); + if (error) + return error; +@@ -2675,21 +3161,20 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) + /* + * Clear old maps. this also does some error checking for us + */ +- munmap_back: + if (find_vma_links(mm, addr, addr + len, &prev, &rb_link, &rb_parent)) { + if (do_munmap(mm, addr, len)) + return -ENOMEM; +- goto munmap_back; ++ BUG_ON(find_vma_links(mm, addr, addr + len, &prev, &rb_link, &rb_parent)); + } + + /* Check against address space limits *after* clearing old maps... */ +- if (!may_expand_vm(mm, len >> PAGE_SHIFT)) ++ if (!may_expand_vm(mm, charged)) + return -ENOMEM; + + if (mm->map_count > sysctl_max_map_count) + return -ENOMEM; + +- if (security_vm_enough_memory_mm(mm, len >> PAGE_SHIFT)) ++ if (security_vm_enough_memory_mm(mm, charged)) + return -ENOMEM; + + /* Can we just expand an old private anonymous mapping? */ +@@ -2703,7 +3188,7 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) + */ + vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); + if (!vma) { +- vm_unacct_memory(len >> PAGE_SHIFT); ++ vm_unacct_memory(charged); + return -ENOMEM; + } + +@@ -2717,10 +3202,11 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) + vma_link(mm, vma, prev, rb_link, rb_parent); + out: + perf_event_mmap(vma); +- mm->total_vm += len >> PAGE_SHIFT; ++ mm->total_vm += charged; + if (flags & VM_LOCKED) +- mm->locked_vm += (len >> PAGE_SHIFT); ++ mm->locked_vm += charged; + vma->vm_flags |= VM_SOFTDIRTY; ++ track_exec_limit(mm, addr, addr + len, flags); + return addr; + } + +@@ -2782,6 +3268,7 @@ void exit_mmap(struct mm_struct *mm) + while (vma) { + if (vma->vm_flags & VM_ACCOUNT) + nr_accounted += vma_pages(vma); ++ vma->vm_mirror = NULL; + vma = remove_vma(vma); + } + vm_unacct_memory(nr_accounted); +@@ -2799,6 +3286,13 @@ int insert_vm_struct(struct mm_struct *mm, struct vm_area_struct *vma) + struct vm_area_struct *prev; + struct rb_node **rb_link, *rb_parent; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m = NULL; ++#endif ++ ++ if (security_mmap_addr(vma->vm_start)) ++ return -EPERM; ++ + /* + * The vm_pgoff of a purely anonymous vma should be irrelevant + * until its first write fault, when page's anon_vma and index +@@ -2822,7 +3316,21 @@ int insert_vm_struct(struct mm_struct *mm, struct vm_area_struct *vma) + security_vm_enough_memory_mm(mm, vma_pages(vma))) + return -ENOMEM; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((mm->pax_flags & MF_PAX_SEGMEXEC) && (vma->vm_flags & VM_EXEC)) { ++ vma_m = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); ++ if (!vma_m) ++ return -ENOMEM; ++ } ++#endif ++ + vma_link(mm, vma, prev, rb_link, rb_parent); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (vma_m) ++ BUG_ON(pax_mirror_vma(vma_m, vma)); ++#endif ++ + return 0; + } + +@@ -2841,6 +3349,8 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, + struct rb_node **rb_link, *rb_parent; + bool faulted_in_anon_vma = true; + ++ BUG_ON(vma->vm_mirror); ++ + /* + * If anonymous vma has not yet been faulted, update new pgoff + * to match new location, to increase its chance of merging. +@@ -2905,6 +3415,39 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, + return NULL; + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++long pax_mirror_vma(struct vm_area_struct *vma_m, struct vm_area_struct *vma) ++{ ++ struct vm_area_struct *prev_m; ++ struct rb_node **rb_link_m, *rb_parent_m; ++ struct mempolicy *pol_m; ++ ++ BUG_ON(!(vma->vm_mm->pax_flags & MF_PAX_SEGMEXEC) || !(vma->vm_flags & VM_EXEC)); ++ BUG_ON(vma->vm_mirror || vma_m->vm_mirror); ++ BUG_ON(!mpol_equal(vma_policy(vma), vma_policy(vma_m))); ++ *vma_m = *vma; ++ INIT_LIST_HEAD(&vma_m->anon_vma_chain); ++ if (anon_vma_clone(vma_m, vma)) ++ return -ENOMEM; ++ pol_m = vma_policy(vma_m); ++ mpol_get(pol_m); ++ set_vma_policy(vma_m, pol_m); ++ vma_m->vm_start += SEGMEXEC_TASK_SIZE; ++ vma_m->vm_end += SEGMEXEC_TASK_SIZE; ++ vma_m->vm_flags &= ~(VM_WRITE | VM_MAYWRITE | VM_ACCOUNT | VM_LOCKED); ++ vma_m->vm_page_prot = vm_get_page_prot(vma_m->vm_flags); ++ if (vma_m->vm_file) ++ get_file(vma_m->vm_file); ++ if (vma_m->vm_ops && vma_m->vm_ops->open) ++ vma_m->vm_ops->open(vma_m); ++ BUG_ON(find_vma_links(vma->vm_mm, vma_m->vm_start, vma_m->vm_end, &prev_m, &rb_link_m, &rb_parent_m)); ++ vma_link(vma->vm_mm, vma_m, prev_m, rb_link_m, rb_parent_m); ++ vma_m->vm_mirror = vma; ++ vma->vm_mirror = vma_m; ++ return 0; ++} ++#endif ++ + /* + * Return true if the calling process may expand its vm space by the passed + * number of pages +@@ -2916,6 +3459,7 @@ int may_expand_vm(struct mm_struct *mm, unsigned long npages) + + lim = rlimit(RLIMIT_AS) >> PAGE_SHIFT; + ++ gr_learn_resource(current, RLIMIT_AS, (cur + npages) << PAGE_SHIFT, 1); + if (cur + npages > lim) + return 0; + return 1; +@@ -2998,6 +3542,22 @@ static struct vm_area_struct *__install_special_mapping( + vma->vm_start = addr; + vma->vm_end = addr + len; + ++#ifdef CONFIG_PAX_MPROTECT ++ if (mm->pax_flags & MF_PAX_MPROTECT) { ++#ifndef CONFIG_PAX_MPROTECT_COMPAT ++ if ((vm_flags & (VM_WRITE | VM_EXEC)) == (VM_WRITE | VM_EXEC)) ++ return ERR_PTR(-EPERM); ++ if (!(vm_flags & VM_EXEC)) ++ vm_flags &= ~VM_MAYEXEC; ++#else ++ if ((vm_flags & (VM_WRITE | VM_EXEC)) != VM_EXEC) ++ vm_flags &= ~(VM_EXEC | VM_MAYEXEC); ++#endif ++ else ++ vm_flags &= ~VM_MAYWRITE; ++ } ++#endif ++ + vma->vm_flags = vm_flags | mm->def_flags | VM_DONTEXPAND | VM_SOFTDIRTY; + vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); + +diff --git a/mm/mprotect.c b/mm/mprotect.c +index ace9345..63320dc 100644 +--- a/mm/mprotect.c ++++ b/mm/mprotect.c +@@ -24,10 +24,18 @@ + #include <linux/migrate.h> + #include <linux/perf_event.h> + #include <linux/ksm.h> ++#include <linux/sched/sysctl.h> ++ ++#ifdef CONFIG_PAX_MPROTECT ++#include <linux/elf.h> ++#include <linux/binfmts.h> ++#endif ++ + #include <asm/uaccess.h> + #include <asm/pgtable.h> + #include <asm/cacheflush.h> + #include <asm/tlbflush.h> ++#include <asm/mmu_context.h> + + /* + * For a prot_numa update we only hold mmap_sem for read so there is a +@@ -251,6 +259,48 @@ unsigned long change_protection(struct vm_area_struct *vma, unsigned long start, + return pages; + } + ++#ifdef CONFIG_ARCH_TRACK_EXEC_LIMIT ++/* called while holding the mmap semaphor for writing except stack expansion */ ++void track_exec_limit(struct mm_struct *mm, unsigned long start, unsigned long end, unsigned long prot) ++{ ++ unsigned long oldlimit, newlimit = 0UL; ++ ++ if (!(mm->pax_flags & MF_PAX_PAGEEXEC) || (__supported_pte_mask & _PAGE_NX)) ++ return; ++ ++ spin_lock(&mm->page_table_lock); ++ oldlimit = mm->context.user_cs_limit; ++ if ((prot & VM_EXEC) && oldlimit < end) ++ /* USER_CS limit moved up */ ++ newlimit = end; ++ else if (!(prot & VM_EXEC) && start < oldlimit && oldlimit <= end) ++ /* USER_CS limit moved down */ ++ newlimit = start; ++ ++ if (newlimit) { ++ mm->context.user_cs_limit = newlimit; ++ ++#ifdef CONFIG_SMP ++ wmb(); ++ cpus_clear(mm->context.cpu_user_cs_mask); ++ cpu_set(smp_processor_id(), mm->context.cpu_user_cs_mask); ++#endif ++ ++ set_user_cs(mm->context.user_cs_base, mm->context.user_cs_limit, smp_processor_id()); ++ } ++ spin_unlock(&mm->page_table_lock); ++ if (newlimit == end) { ++ struct vm_area_struct *vma = find_vma(mm, oldlimit); ++ ++ for (; vma && vma->vm_start < end; vma = vma->vm_next) ++ if (is_vm_hugetlb_page(vma)) ++ hugetlb_change_protection(vma, vma->vm_start, vma->vm_end, vma->vm_page_prot); ++ else ++ change_protection(vma, vma->vm_start, vma->vm_end, vma->vm_page_prot, vma_wants_writenotify(vma), 0); ++ } ++} ++#endif ++ + int + mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev, + unsigned long start, unsigned long end, unsigned long newflags) +@@ -263,11 +313,29 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev, + int error; + int dirty_accountable = 0; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m = NULL; ++ unsigned long start_m, end_m; ++ ++ start_m = start + SEGMEXEC_TASK_SIZE; ++ end_m = end + SEGMEXEC_TASK_SIZE; ++#endif ++ + if (newflags == oldflags) { + *pprev = vma; + return 0; + } + ++ if (newflags & (VM_READ | VM_WRITE | VM_EXEC)) { ++ struct vm_area_struct *prev = vma->vm_prev, *next = vma->vm_next; ++ ++ if (next && (next->vm_flags & VM_GROWSDOWN) && sysctl_heap_stack_gap > next->vm_start - end) ++ return -ENOMEM; ++ ++ if (prev && (prev->vm_flags & VM_GROWSUP) && sysctl_heap_stack_gap > start - prev->vm_end) ++ return -ENOMEM; ++ } ++ + /* + * If we make a private mapping writable we increase our commit; + * but (without finer accounting) cannot reduce our commit if we +@@ -284,6 +352,42 @@ mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev, + } + } + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((mm->pax_flags & MF_PAX_SEGMEXEC) && ((oldflags ^ newflags) & VM_EXEC)) { ++ if (start != vma->vm_start) { ++ error = split_vma(mm, vma, start, 1); ++ if (error) ++ goto fail; ++ BUG_ON(!*pprev || (*pprev)->vm_next == vma); ++ *pprev = (*pprev)->vm_next; ++ } ++ ++ if (end != vma->vm_end) { ++ error = split_vma(mm, vma, end, 0); ++ if (error) ++ goto fail; ++ } ++ ++ if (pax_find_mirror_vma(vma)) { ++ error = __do_munmap(mm, start_m, end_m - start_m); ++ if (error) ++ goto fail; ++ } else { ++ vma_m = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); ++ if (!vma_m) { ++ error = -ENOMEM; ++ goto fail; ++ } ++ vma->vm_flags = newflags; ++ error = pax_mirror_vma(vma_m, vma); ++ if (error) { ++ vma->vm_flags = oldflags; ++ goto fail; ++ } ++ } ++ } ++#endif ++ + /* + * First try to merge with previous and/or next vma. + */ +@@ -314,7 +418,19 @@ success: + * vm_flags and vm_page_prot are protected by the mmap_sem + * held in write mode. + */ ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if ((mm->pax_flags & MF_PAX_SEGMEXEC) && (newflags & VM_EXEC) && ((vma->vm_flags ^ newflags) & VM_READ)) ++ pax_find_mirror_vma(vma)->vm_flags ^= VM_READ; ++#endif ++ + vma->vm_flags = newflags; ++ ++#ifdef CONFIG_PAX_MPROTECT ++ if (mm->binfmt && mm->binfmt->handle_mprotect) ++ mm->binfmt->handle_mprotect(vma, newflags); ++#endif ++ + dirty_accountable = vma_wants_writenotify(vma); + vma_set_page_prot(vma); + +@@ -350,6 +466,17 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len, + end = start + len; + if (end <= start) + return -ENOMEM; ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (current->mm->pax_flags & MF_PAX_SEGMEXEC) { ++ if (end > SEGMEXEC_TASK_SIZE) ++ return -EINVAL; ++ } else ++#endif ++ ++ if (end > TASK_SIZE) ++ return -EINVAL; ++ + if (!arch_validate_prot(prot)) + return -EINVAL; + +@@ -357,7 +484,7 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len, + /* + * Does the application expect PROT_READ to imply PROT_EXEC: + */ +- if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC)) ++ if ((prot & (PROT_READ | PROT_WRITE)) && (current->personality & READ_IMPLIES_EXEC)) + prot |= PROT_EXEC; + + vm_flags = calc_vm_prot_bits(prot); +@@ -389,6 +516,11 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len, + if (start > vma->vm_start) + prev = vma; + ++#ifdef CONFIG_PAX_MPROTECT ++ if (current->mm->binfmt && current->mm->binfmt->handle_mprotect) ++ current->mm->binfmt->handle_mprotect(vma, vm_flags); ++#endif ++ + for (nstart = start ; ; ) { + unsigned long newflags; + +@@ -399,6 +531,14 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len, + + /* newflags >> 4 shift VM_MAY% in place of VM_% */ + if ((newflags & ~(newflags >> 4)) & (VM_READ | VM_WRITE | VM_EXEC)) { ++ if (prot & (PROT_WRITE | PROT_EXEC)) ++ gr_log_rwxmprotect(vma); ++ ++ error = -EACCES; ++ goto out; ++ } ++ ++ if (!gr_acl_handle_mprotect(vma->vm_file, prot)) { + error = -EACCES; + goto out; + } +@@ -413,6 +553,9 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len, + error = mprotect_fixup(vma, &prev, nstart, tmp, newflags); + if (error) + goto out; ++ ++ track_exec_limit(current->mm, nstart, tmp, vm_flags); ++ + nstart = tmp; + + if (nstart < prev->vm_end) +diff --git a/mm/mremap.c b/mm/mremap.c +index b147f66..98a695a 100644 +--- a/mm/mremap.c ++++ b/mm/mremap.c +@@ -144,6 +144,12 @@ static void move_ptes(struct vm_area_struct *vma, pmd_t *old_pmd, + continue; + pte = ptep_get_and_clear(mm, old_addr, old_pte); + pte = move_pte(pte, new_vma->vm_page_prot, old_addr, new_addr); ++ ++#ifdef CONFIG_ARCH_TRACK_EXEC_LIMIT ++ if (!(__supported_pte_mask & _PAGE_NX) && pte_present(pte) && (new_vma->vm_flags & (VM_PAGEEXEC | VM_EXEC)) == VM_PAGEEXEC) ++ pte = pte_exprotect(pte); ++#endif ++ + pte = move_soft_dirty_pte(pte); + set_pte_at(mm, new_addr, new_pte, pte); + } +@@ -345,6 +351,11 @@ static struct vm_area_struct *vma_to_resize(unsigned long addr, + if (is_vm_hugetlb_page(vma)) + goto Einval; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (pax_find_mirror_vma(vma)) ++ goto Einval; ++#endif ++ + /* We can't remap across vm area boundaries */ + if (old_len > vma->vm_end - addr) + goto Efault; +@@ -400,20 +411,25 @@ static unsigned long mremap_to(unsigned long addr, unsigned long old_len, + unsigned long ret = -EINVAL; + unsigned long charged = 0; + unsigned long map_flags; ++ unsigned long pax_task_size = TASK_SIZE; + + if (new_addr & ~PAGE_MASK) + goto out; + +- if (new_len > TASK_SIZE || new_addr > TASK_SIZE - new_len) ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) ++ pax_task_size = SEGMEXEC_TASK_SIZE; ++#endif ++ ++ pax_task_size -= PAGE_SIZE; ++ ++ if (new_len > TASK_SIZE || new_addr > pax_task_size - new_len) + goto out; + + /* Check if the location we're moving into overlaps the + * old location at all, and fail if it does. + */ +- if ((new_addr <= addr) && (new_addr+new_len) > addr) +- goto out; +- +- if ((addr <= new_addr) && (addr+old_len) > new_addr) ++ if (addr + old_len > new_addr && new_addr + new_len > addr) + goto out; + + ret = do_munmap(mm, new_addr, new_len); +@@ -482,6 +498,7 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len, + unsigned long ret = -EINVAL; + unsigned long charged = 0; + bool locked = false; ++ unsigned long pax_task_size = TASK_SIZE; + + if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE)) + return ret; +@@ -503,6 +520,17 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len, + if (!new_len) + return ret; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (mm->pax_flags & MF_PAX_SEGMEXEC) ++ pax_task_size = SEGMEXEC_TASK_SIZE; ++#endif ++ ++ pax_task_size -= PAGE_SIZE; ++ ++ if (new_len > pax_task_size || addr > pax_task_size-new_len || ++ old_len > pax_task_size || addr > pax_task_size-old_len) ++ return ret; ++ + down_write(¤t->mm->mmap_sem); + + if (flags & MREMAP_FIXED) { +@@ -553,6 +581,7 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len, + new_addr = addr; + } + ret = addr; ++ track_exec_limit(vma->vm_mm, vma->vm_start, addr + new_len, vma->vm_flags); + goto out; + } + } +@@ -576,7 +605,12 @@ SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len, + goto out; + } + ++ map_flags = vma->vm_flags; + ret = move_vma(vma, addr, old_len, new_len, new_addr, &locked); ++ if (!(ret & ~PAGE_MASK)) { ++ track_exec_limit(current->mm, addr, addr + old_len, 0UL); ++ track_exec_limit(current->mm, new_addr, new_addr + new_len, map_flags); ++ } + } + out: + if (ret & ~PAGE_MASK) +diff --git a/mm/nommu.c b/mm/nommu.c +index b5ba5bc..22cbc6a 100644 +--- a/mm/nommu.c ++++ b/mm/nommu.c +@@ -70,7 +70,6 @@ int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT; + int sysctl_nr_trim_pages = CONFIG_NOMMU_INITIAL_TRIM_EXCESS; + unsigned long sysctl_user_reserve_kbytes __read_mostly = 1UL << 17; /* 128MB */ + unsigned long sysctl_admin_reserve_kbytes __read_mostly = 1UL << 13; /* 8MB */ +-int heap_stack_gap = 0; + + atomic_long_t mmap_pages_allocated; + +@@ -857,15 +856,6 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr) + EXPORT_SYMBOL(find_vma); + + /* +- * find a VMA +- * - we don't extend stack VMAs under NOMMU conditions +- */ +-struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr) +-{ +- return find_vma(mm, addr); +-} +- +-/* + * expand a stack to a given address + * - not supported under NOMMU conditions + */ +@@ -1572,6 +1562,7 @@ int split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + + /* most fields are the same, copy all, and then fixup */ + *new = *vma; ++ INIT_LIST_HEAD(&new->anon_vma_chain); + *region = *vma->vm_region; + new->vm_region = region; + +@@ -2002,8 +1993,8 @@ int generic_file_remap_pages(struct vm_area_struct *vma, unsigned long addr, + } + EXPORT_SYMBOL(generic_file_remap_pages); + +-static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, +- unsigned long addr, void *buf, int len, int write) ++static ssize_t __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, ++ unsigned long addr, void *buf, size_t len, int write) + { + struct vm_area_struct *vma; + +@@ -2044,8 +2035,8 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, + * + * The caller must hold a reference on @mm. + */ +-int access_remote_vm(struct mm_struct *mm, unsigned long addr, +- void *buf, int len, int write) ++ssize_t access_remote_vm(struct mm_struct *mm, unsigned long addr, ++ void *buf, size_t len, int write) + { + return __access_remote_vm(NULL, mm, addr, buf, len, write); + } +@@ -2054,7 +2045,7 @@ int access_remote_vm(struct mm_struct *mm, unsigned long addr, + * Access another process' address space. + * - source/target buffer must be kernel space + */ +-int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write) ++ssize_t access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, size_t len, int write) + { + struct mm_struct *mm; + +diff --git a/mm/page-writeback.c b/mm/page-writeback.c +index c8abd20..576b3a5 100644 +--- a/mm/page-writeback.c ++++ b/mm/page-writeback.c +@@ -664,7 +664,7 @@ static long long pos_ratio_polynom(unsigned long setpoint, + * card's bdi_dirty may rush to many times higher than bdi_setpoint. + * - the bdi dirty thresh drops quickly due to change of JBOD workload + */ +-static unsigned long bdi_position_ratio(struct backing_dev_info *bdi, ++static unsigned long __intentional_overflow(-1) bdi_position_ratio(struct backing_dev_info *bdi, + unsigned long thresh, + unsigned long bg_thresh, + unsigned long dirty, +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index c32cb64..191c5eb 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -59,6 +59,7 @@ + #include <linux/page-debug-flags.h> + #include <linux/hugetlb.h> + #include <linux/sched/rt.h> ++#include <linux/random.h> + + #include <asm/sections.h> + #include <asm/tlbflush.h> +@@ -356,7 +357,7 @@ out: + * This usage means that zero-order pages may not be compound. + */ + +-static void free_compound_page(struct page *page) ++void free_compound_page(struct page *page) + { + __free_pages_ok(page, compound_order(page)); + } +@@ -741,6 +742,10 @@ static bool free_pages_prepare(struct page *page, unsigned int order) + int i; + int bad = 0; + ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ unsigned long index = 1UL << order; ++#endif ++ + trace_mm_page_free(page, order); + kmemcheck_free_shadow(page, order); + +@@ -757,6 +762,12 @@ static bool free_pages_prepare(struct page *page, unsigned int order) + debug_check_no_obj_freed(page_address(page), + PAGE_SIZE << order); + } ++ ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ for (; index; --index) ++ sanitize_highpage(page + index - 1); ++#endif ++ + arch_free_page(page, order); + kernel_map_pages(page, 1 << order, 0); + +@@ -780,6 +791,20 @@ static void __free_pages_ok(struct page *page, unsigned int order) + local_irq_restore(flags); + } + ++#ifdef CONFIG_PAX_LATENT_ENTROPY ++bool __meminitdata extra_latent_entropy; ++ ++static int __init setup_pax_extra_latent_entropy(char *str) ++{ ++ extra_latent_entropy = true; ++ return 0; ++} ++early_param("pax_extra_latent_entropy", setup_pax_extra_latent_entropy); ++ ++volatile u64 latent_entropy __latent_entropy; ++EXPORT_SYMBOL(latent_entropy); ++#endif ++ + void __init __free_pages_bootmem(struct page *page, unsigned int order) + { + unsigned int nr_pages = 1 << order; +@@ -795,6 +820,19 @@ void __init __free_pages_bootmem(struct page *page, unsigned int order) + __ClearPageReserved(p); + set_page_count(p, 0); + ++#ifdef CONFIG_PAX_LATENT_ENTROPY ++ if (extra_latent_entropy && !PageHighMem(page) && page_to_pfn(page) < 0x100000) { ++ u64 hash = 0; ++ size_t index, end = PAGE_SIZE * nr_pages / sizeof hash; ++ const u64 *data = lowmem_page_address(page); ++ ++ for (index = 0; index < end; index++) ++ hash ^= hash + data[index]; ++ latent_entropy ^= hash; ++ add_device_randomness((const void *)&latent_entropy, sizeof(latent_entropy)); ++ } ++#endif ++ + page_zone(page)->managed_pages += nr_pages; + set_page_refcounted(page); + __free_pages(page, order); +@@ -923,8 +961,10 @@ static int prep_new_page(struct page *page, unsigned int order, gfp_t gfp_flags) + arch_alloc_page(page, order); + kernel_map_pages(page, 1 << order, 1); + ++#ifndef CONFIG_PAX_MEMORY_SANITIZE + if (gfp_flags & __GFP_ZERO) + prep_zero_page(page, order, gfp_flags); ++#endif + + if (order && (gfp_flags & __GFP_COMP)) + prep_compound_page(page, order); +@@ -1600,7 +1640,7 @@ again: + } + + __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); +- if (atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH]) <= 0 && ++ if (atomic_long_read_unchecked(&zone->vm_stat[NR_ALLOC_BATCH]) <= 0 && + !test_bit(ZONE_FAIR_DEPLETED, &zone->flags)) + set_bit(ZONE_FAIR_DEPLETED, &zone->flags); + +@@ -1921,7 +1961,7 @@ static void reset_alloc_batches(struct zone *preferred_zone) + do { + mod_zone_page_state(zone, NR_ALLOC_BATCH, + high_wmark_pages(zone) - low_wmark_pages(zone) - +- atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH])); ++ atomic_long_read_unchecked(&zone->vm_stat[NR_ALLOC_BATCH])); + clear_bit(ZONE_FAIR_DEPLETED, &zone->flags); + } while (zone++ != preferred_zone); + } +@@ -5696,7 +5736,7 @@ static void __setup_per_zone_wmarks(void) + + __mod_zone_page_state(zone, NR_ALLOC_BATCH, + high_wmark_pages(zone) - low_wmark_pages(zone) - +- atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH])); ++ atomic_long_read_unchecked(&zone->vm_stat[NR_ALLOC_BATCH])); + + setup_zone_migrate_reserve(zone); + spin_unlock_irqrestore(&zone->lock, flags); +diff --git a/mm/percpu.c b/mm/percpu.c +index 014bab6..db5a76f 100644 +--- a/mm/percpu.c ++++ b/mm/percpu.c +@@ -131,7 +131,7 @@ static unsigned int pcpu_low_unit_cpu __read_mostly; + static unsigned int pcpu_high_unit_cpu __read_mostly; + + /* the address of the first chunk which starts with the kernel static area */ +-void *pcpu_base_addr __read_mostly; ++void *pcpu_base_addr __read_only; + EXPORT_SYMBOL_GPL(pcpu_base_addr); + + static const int *pcpu_unit_map __read_mostly; /* cpu -> unit */ +diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c +index 5077afc..846c9ef 100644 +--- a/mm/process_vm_access.c ++++ b/mm/process_vm_access.c +@@ -13,6 +13,7 @@ + #include <linux/uio.h> + #include <linux/sched.h> + #include <linux/highmem.h> ++#include <linux/security.h> + #include <linux/ptrace.h> + #include <linux/slab.h> + #include <linux/syscalls.h> +@@ -157,19 +158,19 @@ static ssize_t process_vm_rw_core(pid_t pid, struct iov_iter *iter, + ssize_t iov_len; + size_t total_len = iov_iter_count(iter); + ++ return -ENOSYS; // PaX: until properly audited ++ + /* + * Work out how many pages of struct pages we're going to need + * when eventually calling get_user_pages + */ + for (i = 0; i < riovcnt; i++) { + iov_len = rvec[i].iov_len; +- if (iov_len > 0) { +- nr_pages_iov = ((unsigned long)rvec[i].iov_base +- + iov_len) +- / PAGE_SIZE - (unsigned long)rvec[i].iov_base +- / PAGE_SIZE + 1; +- nr_pages = max(nr_pages, nr_pages_iov); +- } ++ if (iov_len <= 0) ++ continue; ++ nr_pages_iov = ((unsigned long)rvec[i].iov_base + iov_len) / PAGE_SIZE - ++ (unsigned long)rvec[i].iov_base / PAGE_SIZE + 1; ++ nr_pages = max(nr_pages, nr_pages_iov); + } + + if (nr_pages == 0) +@@ -197,6 +198,11 @@ static ssize_t process_vm_rw_core(pid_t pid, struct iov_iter *iter, + goto free_proc_pages; + } + ++ if (gr_handle_ptrace(task, vm_write ? PTRACE_POKETEXT : PTRACE_ATTACH)) { ++ rc = -EPERM; ++ goto put_task_struct; ++ } ++ + mm = mm_access(task, PTRACE_MODE_ATTACH); + if (!mm || IS_ERR(mm)) { + rc = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH; +diff --git a/mm/rmap.c b/mm/rmap.c +index 5fc824b..f0c5491 100644 +--- a/mm/rmap.c ++++ b/mm/rmap.c +@@ -166,6 +166,10 @@ int anon_vma_prepare(struct vm_area_struct *vma) + struct anon_vma *anon_vma = vma->anon_vma; + struct anon_vma_chain *avc; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct anon_vma_chain *avc_m = NULL; ++#endif ++ + might_sleep(); + if (unlikely(!anon_vma)) { + struct mm_struct *mm = vma->vm_mm; +@@ -175,6 +179,12 @@ int anon_vma_prepare(struct vm_area_struct *vma) + if (!avc) + goto out_enomem; + ++#ifdef CONFIG_PAX_SEGMEXEC ++ avc_m = anon_vma_chain_alloc(GFP_KERNEL); ++ if (!avc_m) ++ goto out_enomem_free_avc; ++#endif ++ + anon_vma = find_mergeable_anon_vma(vma); + allocated = NULL; + if (!anon_vma) { +@@ -188,6 +198,18 @@ int anon_vma_prepare(struct vm_area_struct *vma) + /* page_table_lock to protect against threads */ + spin_lock(&mm->page_table_lock); + if (likely(!vma->anon_vma)) { ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ struct vm_area_struct *vma_m = pax_find_mirror_vma(vma); ++ ++ if (vma_m) { ++ BUG_ON(vma_m->anon_vma); ++ vma_m->anon_vma = anon_vma; ++ anon_vma_chain_link(vma_m, avc_m, anon_vma); ++ avc_m = NULL; ++ } ++#endif ++ + vma->anon_vma = anon_vma; + anon_vma_chain_link(vma, avc, anon_vma); + /* vma reference or self-parent link for new root */ +@@ -200,12 +222,24 @@ int anon_vma_prepare(struct vm_area_struct *vma) + + if (unlikely(allocated)) + put_anon_vma(allocated); ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (unlikely(avc_m)) ++ anon_vma_chain_free(avc_m); ++#endif ++ + if (unlikely(avc)) + anon_vma_chain_free(avc); + } + return 0; + + out_enomem_free_avc: ++ ++#ifdef CONFIG_PAX_SEGMEXEC ++ if (avc_m) ++ anon_vma_chain_free(avc_m); ++#endif ++ + anon_vma_chain_free(avc); + out_enomem: + return -ENOMEM; +@@ -249,7 +283,7 @@ static inline void unlock_anon_vma_root(struct anon_vma *root) + * good chance of avoiding scanning the whole hierarchy when it searches where + * page is mapped. + */ +-int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src) ++int anon_vma_clone(struct vm_area_struct *dst, const struct vm_area_struct *src) + { + struct anon_vma_chain *avc, *pavc; + struct anon_vma *root = NULL; +@@ -303,7 +337,7 @@ int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src) + * the corresponding VMA in the parent process is attached to. + * Returns 0 on success, non-zero on failure. + */ +-int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma) ++int anon_vma_fork(struct vm_area_struct *vma, const struct vm_area_struct *pvma) + { + struct anon_vma_chain *avc; + struct anon_vma *anon_vma; +@@ -423,8 +457,10 @@ static void anon_vma_ctor(void *data) + void __init anon_vma_init(void) + { + anon_vma_cachep = kmem_cache_create("anon_vma", sizeof(struct anon_vma), +- 0, SLAB_DESTROY_BY_RCU|SLAB_PANIC, anon_vma_ctor); +- anon_vma_chain_cachep = KMEM_CACHE(anon_vma_chain, SLAB_PANIC); ++ 0, SLAB_DESTROY_BY_RCU|SLAB_PANIC|SLAB_NO_SANITIZE, ++ anon_vma_ctor); ++ anon_vma_chain_cachep = KMEM_CACHE(anon_vma_chain, ++ SLAB_PANIC|SLAB_NO_SANITIZE); + } + + /* +diff --git a/mm/shmem.c b/mm/shmem.c +index 0b4ba55..bcef4ae 100644 +--- a/mm/shmem.c ++++ b/mm/shmem.c +@@ -33,7 +33,7 @@ + #include <linux/swap.h> + #include <linux/aio.h> + +-static struct vfsmount *shm_mnt; ++struct vfsmount *shm_mnt; + + #ifdef CONFIG_SHMEM + /* +@@ -80,7 +80,7 @@ static struct vfsmount *shm_mnt; + #define BOGO_DIRENT_SIZE 20 + + /* Symlink up to this size is kmalloc'ed instead of using a swappable page */ +-#define SHORT_SYMLINK_LEN 128 ++#define SHORT_SYMLINK_LEN 64 + + /* + * shmem_fallocate communicates with shmem_fault or shmem_writepage via +@@ -2558,6 +2558,11 @@ static const struct xattr_handler *shmem_xattr_handlers[] = { + static int shmem_xattr_validate(const char *name) + { + struct { const char *prefix; size_t len; } arr[] = { ++ ++#ifdef CONFIG_PAX_XATTR_PAX_FLAGS ++ { XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN}, ++#endif ++ + { XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN }, + { XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN } + }; +@@ -2613,6 +2618,15 @@ static int shmem_setxattr(struct dentry *dentry, const char *name, + if (err) + return err; + ++#ifdef CONFIG_PAX_XATTR_PAX_FLAGS ++ if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) { ++ if (strcmp(name, XATTR_NAME_PAX_FLAGS)) ++ return -EOPNOTSUPP; ++ if (size > 8) ++ return -EINVAL; ++ } ++#endif ++ + return simple_xattr_set(&info->xattrs, name, value, size, flags); + } + +@@ -2996,8 +3010,7 @@ int shmem_fill_super(struct super_block *sb, void *data, int silent) + int err = -ENOMEM; + + /* Round up to L1_CACHE_BYTES to resist false sharing */ +- sbinfo = kzalloc(max((int)sizeof(struct shmem_sb_info), +- L1_CACHE_BYTES), GFP_KERNEL); ++ sbinfo = kzalloc(max(sizeof(struct shmem_sb_info), L1_CACHE_BYTES), GFP_KERNEL); + if (!sbinfo) + return -ENOMEM; + +diff --git a/mm/slab.c b/mm/slab.c +index f34e053..78a3839 100644 +--- a/mm/slab.c ++++ b/mm/slab.c +@@ -314,10 +314,12 @@ static void kmem_cache_node_init(struct kmem_cache_node *parent) + if ((x)->max_freeable < i) \ + (x)->max_freeable = i; \ + } while (0) +-#define STATS_INC_ALLOCHIT(x) atomic_inc(&(x)->allochit) +-#define STATS_INC_ALLOCMISS(x) atomic_inc(&(x)->allocmiss) +-#define STATS_INC_FREEHIT(x) atomic_inc(&(x)->freehit) +-#define STATS_INC_FREEMISS(x) atomic_inc(&(x)->freemiss) ++#define STATS_INC_ALLOCHIT(x) atomic_inc_unchecked(&(x)->allochit) ++#define STATS_INC_ALLOCMISS(x) atomic_inc_unchecked(&(x)->allocmiss) ++#define STATS_INC_FREEHIT(x) atomic_inc_unchecked(&(x)->freehit) ++#define STATS_INC_FREEMISS(x) atomic_inc_unchecked(&(x)->freemiss) ++#define STATS_INC_SANITIZED(x) atomic_inc_unchecked(&(x)->sanitized) ++#define STATS_INC_NOT_SANITIZED(x) atomic_inc_unchecked(&(x)->not_sanitized) + #else + #define STATS_INC_ACTIVE(x) do { } while (0) + #define STATS_DEC_ACTIVE(x) do { } while (0) +@@ -334,6 +336,8 @@ static void kmem_cache_node_init(struct kmem_cache_node *parent) + #define STATS_INC_ALLOCMISS(x) do { } while (0) + #define STATS_INC_FREEHIT(x) do { } while (0) + #define STATS_INC_FREEMISS(x) do { } while (0) ++#define STATS_INC_SANITIZED(x) do { } while (0) ++#define STATS_INC_NOT_SANITIZED(x) do { } while (0) + #endif + + #if DEBUG +@@ -450,7 +454,7 @@ static inline void *index_to_obj(struct kmem_cache *cache, struct page *page, + * reciprocal_divide(offset, cache->reciprocal_buffer_size) + */ + static inline unsigned int obj_to_index(const struct kmem_cache *cache, +- const struct page *page, void *obj) ++ const struct page *page, const void *obj) + { + u32 offset = (obj - page->s_mem); + return reciprocal_divide(offset, cache->reciprocal_buffer_size); +@@ -1438,7 +1442,7 @@ void __init kmem_cache_init(void) + * structures first. Without this, further allocations will bug. + */ + kmalloc_caches[INDEX_NODE] = create_kmalloc_cache("kmalloc-node", +- kmalloc_size(INDEX_NODE), ARCH_KMALLOC_FLAGS); ++ kmalloc_size(INDEX_NODE), SLAB_USERCOPY | ARCH_KMALLOC_FLAGS); + slab_state = PARTIAL_NODE; + + slab_early_init = 0; +@@ -2059,7 +2063,7 @@ __kmem_cache_alias(const char *name, size_t size, size_t align, + + cachep = find_mergeable(size, align, flags, name, ctor); + if (cachep) { +- cachep->refcount++; ++ atomic_inc(&cachep->refcount); + + /* + * Adjust the object sizes so that we clear +@@ -3352,6 +3356,20 @@ static inline void __cache_free(struct kmem_cache *cachep, void *objp, + struct array_cache *ac = cpu_cache_get(cachep); + + check_irq_off(); ++ ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ if (cachep->flags & (SLAB_POISON | SLAB_NO_SANITIZE)) ++ STATS_INC_NOT_SANITIZED(cachep); ++ else { ++ memset(objp, PAX_MEMORY_SANITIZE_VALUE, cachep->object_size); ++ ++ if (cachep->ctor) ++ cachep->ctor(objp); ++ ++ STATS_INC_SANITIZED(cachep); ++ } ++#endif ++ + kmemleak_free_recursive(objp, cachep->flags); + objp = cache_free_debugcheck(cachep, objp, caller); + +@@ -3557,6 +3575,7 @@ void kfree(const void *objp) + + if (unlikely(ZERO_OR_NULL_PTR(objp))) + return; ++ VM_BUG_ON(!virt_addr_valid(objp)); + local_irq_save(flags); + kfree_debugcheck(objp); + c = virt_to_cache(objp); +@@ -3979,14 +3998,22 @@ void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *cachep) + } + /* cpu stats */ + { +- unsigned long allochit = atomic_read(&cachep->allochit); +- unsigned long allocmiss = atomic_read(&cachep->allocmiss); +- unsigned long freehit = atomic_read(&cachep->freehit); +- unsigned long freemiss = atomic_read(&cachep->freemiss); ++ unsigned long allochit = atomic_read_unchecked(&cachep->allochit); ++ unsigned long allocmiss = atomic_read_unchecked(&cachep->allocmiss); ++ unsigned long freehit = atomic_read_unchecked(&cachep->freehit); ++ unsigned long freemiss = atomic_read_unchecked(&cachep->freemiss); + + seq_printf(m, " : cpustat %6lu %6lu %6lu %6lu", + allochit, allocmiss, freehit, freemiss); + } ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ { ++ unsigned long sanitized = atomic_read_unchecked(&cachep->sanitized); ++ unsigned long not_sanitized = atomic_read_unchecked(&cachep->not_sanitized); ++ ++ seq_printf(m, " : pax %6lu %6lu", sanitized, not_sanitized); ++ } ++#endif + #endif + } + +@@ -4200,13 +4227,69 @@ static const struct file_operations proc_slabstats_operations = { + static int __init slab_proc_init(void) + { + #ifdef CONFIG_DEBUG_SLAB_LEAK +- proc_create("slab_allocators", 0, NULL, &proc_slabstats_operations); ++ proc_create("slab_allocators", S_IRUSR, NULL, &proc_slabstats_operations); + #endif + return 0; + } + module_init(slab_proc_init); + #endif + ++bool is_usercopy_object(const void *ptr) ++{ ++ struct page *page; ++ struct kmem_cache *cachep; ++ ++ if (ZERO_OR_NULL_PTR(ptr)) ++ return false; ++ ++ if (!slab_is_available()) ++ return false; ++ ++ if (!virt_addr_valid(ptr)) ++ return false; ++ ++ page = virt_to_head_page(ptr); ++ ++ if (!PageSlab(page)) ++ return false; ++ ++ cachep = page->slab_cache; ++ return cachep->flags & SLAB_USERCOPY; ++} ++ ++#ifdef CONFIG_PAX_USERCOPY ++const char *check_heap_object(const void *ptr, unsigned long n) ++{ ++ struct page *page; ++ struct kmem_cache *cachep; ++ unsigned int objnr; ++ unsigned long offset; ++ ++ if (ZERO_OR_NULL_PTR(ptr)) ++ return "<null>"; ++ ++ if (!virt_addr_valid(ptr)) ++ return NULL; ++ ++ page = virt_to_head_page(ptr); ++ ++ if (!PageSlab(page)) ++ return NULL; ++ ++ cachep = page->slab_cache; ++ if (!(cachep->flags & SLAB_USERCOPY)) ++ return cachep->name; ++ ++ objnr = obj_to_index(cachep, page, ptr); ++ BUG_ON(objnr >= cachep->num); ++ offset = ptr - index_to_obj(cachep, page, objnr) - obj_offset(cachep); ++ if (offset <= cachep->object_size && n <= cachep->object_size - offset) ++ return NULL; ++ ++ return cachep->name; ++} ++#endif ++ + /** + * ksize - get the actual amount of memory allocated for a given object + * @objp: Pointer to the object +diff --git a/mm/slab.h b/mm/slab.h +index ab019e6..fbcac34 100644 +--- a/mm/slab.h ++++ b/mm/slab.h +@@ -22,7 +22,7 @@ struct kmem_cache { + unsigned int align; /* Alignment as calculated */ + unsigned long flags; /* Active flags on the slab */ + const char *name; /* Slab name for sysfs */ +- int refcount; /* Use counter */ ++ atomic_t refcount; /* Use counter */ + void (*ctor)(void *); /* Called on object slot creation */ + struct list_head list; /* List of all slab caches on the system */ + }; +@@ -66,6 +66,20 @@ extern struct list_head slab_caches; + /* The slab cache that manages slab cache information */ + extern struct kmem_cache *kmem_cache; + ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++#ifdef CONFIG_X86_64 ++#define PAX_MEMORY_SANITIZE_VALUE '\xfe' ++#else ++#define PAX_MEMORY_SANITIZE_VALUE '\xff' ++#endif ++enum pax_sanitize_mode { ++ PAX_SANITIZE_SLAB_OFF = 0, ++ PAX_SANITIZE_SLAB_FAST, ++ PAX_SANITIZE_SLAB_FULL, ++}; ++extern enum pax_sanitize_mode pax_sanitize_slab; ++#endif ++ + unsigned long calculate_alignment(unsigned long flags, + unsigned long align, unsigned long size); + +@@ -116,7 +130,8 @@ static inline unsigned long kmem_cache_flags(unsigned long object_size, + + /* Legal flag mask for kmem_cache_create(), for various configurations */ + #define SLAB_CORE_FLAGS (SLAB_HWCACHE_ALIGN | SLAB_CACHE_DMA | SLAB_PANIC | \ +- SLAB_DESTROY_BY_RCU | SLAB_DEBUG_OBJECTS ) ++ SLAB_DESTROY_BY_RCU | SLAB_DEBUG_OBJECTS | \ ++ SLAB_USERCOPY | SLAB_NO_SANITIZE) + + #if defined(CONFIG_DEBUG_SLAB) + #define SLAB_DEBUG_FLAGS (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER) +@@ -300,6 +315,9 @@ static inline struct kmem_cache *cache_from_obj(struct kmem_cache *s, void *x) + return s; + + page = virt_to_head_page(x); ++ ++ BUG_ON(!PageSlab(page)); ++ + cachep = page->slab_cache; + if (slab_equal_or_root(cachep, s)) + return cachep; +diff --git a/mm/slab_common.c b/mm/slab_common.c +index dcdab81..3576646 100644 +--- a/mm/slab_common.c ++++ b/mm/slab_common.c +@@ -25,11 +25,35 @@ + + #include "slab.h" + +-enum slab_state slab_state; ++enum slab_state slab_state __read_only; + LIST_HEAD(slab_caches); + DEFINE_MUTEX(slab_mutex); + struct kmem_cache *kmem_cache; + ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++enum pax_sanitize_mode pax_sanitize_slab __read_only = PAX_SANITIZE_SLAB_FAST; ++static int __init pax_sanitize_slab_setup(char *str) ++{ ++ if (!str) ++ return 0; ++ ++ if (!strcmp(str, "0") || !strcmp(str, "off")) { ++ pr_info("PaX slab sanitization: %s\n", "disabled"); ++ pax_sanitize_slab = PAX_SANITIZE_SLAB_OFF; ++ } else if (!strcmp(str, "1") || !strcmp(str, "fast")) { ++ pr_info("PaX slab sanitization: %s\n", "fast"); ++ pax_sanitize_slab = PAX_SANITIZE_SLAB_FAST; ++ } else if (!strcmp(str, "full")) { ++ pr_info("PaX slab sanitization: %s\n", "full"); ++ pax_sanitize_slab = PAX_SANITIZE_SLAB_FULL; ++ } else ++ pr_err("PaX slab sanitization: unsupported option '%s'\n", str); ++ ++ return 0; ++} ++early_param("pax_sanitize_slab", pax_sanitize_slab_setup); ++#endif ++ + /* + * Set of flags that will prevent slab merging + */ +@@ -44,7 +68,7 @@ struct kmem_cache *kmem_cache; + * Merge control. If this is set then no merging of slab caches will occur. + * (Could be removed. This was introduced to pacify the merge skeptics.) + */ +-static int slab_nomerge; ++static int slab_nomerge = 1; + + static int __init setup_slab_nomerge(char *str) + { +@@ -218,7 +242,7 @@ int slab_unmergeable(struct kmem_cache *s) + /* + * We may have set a slab to be unmergeable during bootstrap. + */ +- if (s->refcount < 0) ++ if (atomic_read(&s->refcount) < 0) + return 1; + + return 0; +@@ -322,7 +346,7 @@ do_kmem_cache_create(char *name, size_t object_size, size_t size, size_t align, + if (err) + goto out_free_cache; + +- s->refcount = 1; ++ atomic_set(&s->refcount, 1); + list_add(&s->list, &slab_caches); + out: + if (err) +@@ -386,6 +410,13 @@ kmem_cache_create(const char *name, size_t size, size_t align, + */ + flags &= CACHE_CREATE_MASK; + ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ if (pax_sanitize_slab == PAX_SANITIZE_SLAB_OFF || (flags & SLAB_DESTROY_BY_RCU)) ++ flags |= SLAB_NO_SANITIZE; ++ else if (pax_sanitize_slab == PAX_SANITIZE_SLAB_FULL) ++ flags &= ~SLAB_NO_SANITIZE; ++#endif ++ + s = __kmem_cache_alias(name, size, align, flags, ctor); + if (s) + goto out_unlock; +@@ -505,8 +536,7 @@ void kmem_cache_destroy(struct kmem_cache *s) + + mutex_lock(&slab_mutex); + +- s->refcount--; +- if (s->refcount) ++ if (!atomic_dec_and_test(&s->refcount)) + goto out_unlock; + + if (memcg_cleanup_cache_params(s) != 0) +@@ -526,7 +556,7 @@ void kmem_cache_destroy(struct kmem_cache *s) + rcu_barrier(); + + memcg_free_cache_params(s); +-#ifdef SLAB_SUPPORTS_SYSFS ++#if defined(SLAB_SUPPORTS_SYSFS) && !defined(CONFIG_GRKERNSEC_PROC_ADD) + sysfs_slab_remove(s); + #else + slab_kmem_cache_release(s); +@@ -582,7 +612,7 @@ void __init create_boot_cache(struct kmem_cache *s, const char *name, size_t siz + panic("Creation of kmalloc slab %s size=%zu failed. Reason %d\n", + name, size, err); + +- s->refcount = -1; /* Exempt from merging for now */ ++ atomic_set(&s->refcount, -1); /* Exempt from merging for now */ + } + + struct kmem_cache *__init create_kmalloc_cache(const char *name, size_t size, +@@ -595,7 +625,7 @@ struct kmem_cache *__init create_kmalloc_cache(const char *name, size_t size, + + create_boot_cache(s, name, size, flags); + list_add(&s->list, &slab_caches); +- s->refcount = 1; ++ atomic_set(&s->refcount, 1); + return s; + } + +@@ -607,6 +637,11 @@ struct kmem_cache *kmalloc_dma_caches[KMALLOC_SHIFT_HIGH + 1]; + EXPORT_SYMBOL(kmalloc_dma_caches); + #endif + ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++struct kmem_cache *kmalloc_usercopy_caches[KMALLOC_SHIFT_HIGH + 1]; ++EXPORT_SYMBOL(kmalloc_usercopy_caches); ++#endif ++ + /* + * Conversion table for small slabs sizes / 8 to the index in the + * kmalloc array. This is necessary for slabs < 192 since we have non power +@@ -671,6 +706,13 @@ struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags) + return kmalloc_dma_caches[index]; + + #endif ++ ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++ if (unlikely((flags & GFP_USERCOPY))) ++ return kmalloc_usercopy_caches[index]; ++ ++#endif ++ + return kmalloc_caches[index]; + } + +@@ -727,7 +769,7 @@ void __init create_kmalloc_caches(unsigned long flags) + for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) { + if (!kmalloc_caches[i]) { + kmalloc_caches[i] = create_kmalloc_cache(NULL, +- 1 << i, flags); ++ 1 << i, SLAB_USERCOPY | flags); + } + + /* +@@ -736,10 +778,10 @@ void __init create_kmalloc_caches(unsigned long flags) + * earlier power of two caches + */ + if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[1] && i == 6) +- kmalloc_caches[1] = create_kmalloc_cache(NULL, 96, flags); ++ kmalloc_caches[1] = create_kmalloc_cache(NULL, 96, SLAB_USERCOPY | flags); + + if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[2] && i == 7) +- kmalloc_caches[2] = create_kmalloc_cache(NULL, 192, flags); ++ kmalloc_caches[2] = create_kmalloc_cache(NULL, 192, SLAB_USERCOPY | flags); + } + + /* Kmalloc array is now usable */ +@@ -772,6 +814,23 @@ void __init create_kmalloc_caches(unsigned long flags) + } + } + #endif ++ ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++ for (i = 0; i <= KMALLOC_SHIFT_HIGH; i++) { ++ struct kmem_cache *s = kmalloc_caches[i]; ++ ++ if (s) { ++ int size = kmalloc_size(i); ++ char *n = kasprintf(GFP_NOWAIT, ++ "usercopy-kmalloc-%d", size); ++ ++ BUG_ON(!n); ++ kmalloc_usercopy_caches[i] = create_kmalloc_cache(n, ++ size, SLAB_USERCOPY | flags); ++ } ++ } ++#endif ++ + } + #endif /* !CONFIG_SLOB */ + +@@ -830,6 +889,9 @@ void print_slabinfo_header(struct seq_file *m) + seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> " + "<error> <maxfreeable> <nodeallocs> <remotefrees> <alienoverflow>"); + seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit> <freemiss>"); ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ seq_puts(m, " : pax <sanitized> <not_sanitized>"); ++#endif + #endif + seq_putc(m, '\n'); + } +diff --git a/mm/slob.c b/mm/slob.c +index 96a8620..3e7e663 100644 +--- a/mm/slob.c ++++ b/mm/slob.c +@@ -157,7 +157,7 @@ static void set_slob(slob_t *s, slobidx_t size, slob_t *next) + /* + * Return the size of a slob block. + */ +-static slobidx_t slob_units(slob_t *s) ++static slobidx_t slob_units(const slob_t *s) + { + if (s->units > 0) + return s->units; +@@ -167,7 +167,7 @@ static slobidx_t slob_units(slob_t *s) + /* + * Return the next free slob block pointer after this one. + */ +-static slob_t *slob_next(slob_t *s) ++static slob_t *slob_next(const slob_t *s) + { + slob_t *base = (slob_t *)((unsigned long)s & PAGE_MASK); + slobidx_t next; +@@ -182,14 +182,14 @@ static slob_t *slob_next(slob_t *s) + /* + * Returns true if s is the last free block in its page. + */ +-static int slob_last(slob_t *s) ++static int slob_last(const slob_t *s) + { + return !((unsigned long)slob_next(s) & ~PAGE_MASK); + } + +-static void *slob_new_pages(gfp_t gfp, int order, int node) ++static struct page *slob_new_pages(gfp_t gfp, unsigned int order, int node) + { +- void *page; ++ struct page *page; + + #ifdef CONFIG_NUMA + if (node != NUMA_NO_NODE) +@@ -201,14 +201,18 @@ static void *slob_new_pages(gfp_t gfp, int order, int node) + if (!page) + return NULL; + +- return page_address(page); ++ __SetPageSlab(page); ++ return page; + } + +-static void slob_free_pages(void *b, int order) ++static void slob_free_pages(struct page *sp, int order) + { + if (current->reclaim_state) + current->reclaim_state->reclaimed_slab += 1 << order; +- free_pages((unsigned long)b, order); ++ __ClearPageSlab(sp); ++ page_mapcount_reset(sp); ++ sp->private = 0; ++ __free_pages(sp, order); + } + + /* +@@ -313,15 +317,15 @@ static void *slob_alloc(size_t size, gfp_t gfp, int align, int node) + + /* Not enough space: must allocate a new page */ + if (!b) { +- b = slob_new_pages(gfp & ~__GFP_ZERO, 0, node); +- if (!b) ++ sp = slob_new_pages(gfp & ~__GFP_ZERO, 0, node); ++ if (!sp) + return NULL; +- sp = virt_to_page(b); +- __SetPageSlab(sp); ++ b = page_address(sp); + + spin_lock_irqsave(&slob_lock, flags); + sp->units = SLOB_UNITS(PAGE_SIZE); + sp->freelist = b; ++ sp->private = 0; + INIT_LIST_HEAD(&sp->lru); + set_slob(b, SLOB_UNITS(PAGE_SIZE), b + SLOB_UNITS(PAGE_SIZE)); + set_slob_page_free(sp, slob_list); +@@ -337,7 +341,7 @@ static void *slob_alloc(size_t size, gfp_t gfp, int align, int node) + /* + * slob_free: entry point into the slob allocator. + */ +-static void slob_free(void *block, int size) ++static void slob_free(struct kmem_cache *c, void *block, int size) + { + struct page *sp; + slob_t *prev, *next, *b = (slob_t *)block; +@@ -359,12 +363,15 @@ static void slob_free(void *block, int size) + if (slob_page_free(sp)) + clear_slob_page_free(sp); + spin_unlock_irqrestore(&slob_lock, flags); +- __ClearPageSlab(sp); +- page_mapcount_reset(sp); +- slob_free_pages(b, 0); ++ slob_free_pages(sp, 0); + return; + } + ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ if (pax_sanitize_slab && !(c && (c->flags & SLAB_NO_SANITIZE))) ++ memset(block, PAX_MEMORY_SANITIZE_VALUE, size); ++#endif ++ + if (!slob_page_free(sp)) { + /* This slob page is about to become partially free. Easy! */ + sp->units = units; +@@ -424,11 +431,10 @@ out: + */ + + static __always_inline void * +-__do_kmalloc_node(size_t size, gfp_t gfp, int node, unsigned long caller) ++__do_kmalloc_node_align(size_t size, gfp_t gfp, int node, unsigned long caller, int align) + { +- unsigned int *m; +- int align = max_t(size_t, ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN); +- void *ret; ++ slob_t *m; ++ void *ret = NULL; + + gfp &= gfp_allowed_mask; + +@@ -442,23 +448,41 @@ __do_kmalloc_node(size_t size, gfp_t gfp, int node, unsigned long caller) + + if (!m) + return NULL; +- *m = size; ++ BUILD_BUG_ON(ARCH_KMALLOC_MINALIGN < 2 * SLOB_UNIT); ++ BUILD_BUG_ON(ARCH_SLAB_MINALIGN < 2 * SLOB_UNIT); ++ m[0].units = size; ++ m[1].units = align; + ret = (void *)m + align; + + trace_kmalloc_node(caller, ret, + size, size + align, gfp, node); + } else { + unsigned int order = get_order(size); ++ struct page *page; + + if (likely(order)) + gfp |= __GFP_COMP; +- ret = slob_new_pages(gfp, order, node); ++ page = slob_new_pages(gfp, order, node); ++ if (page) { ++ ret = page_address(page); ++ page->private = size; ++ } + + trace_kmalloc_node(caller, ret, + size, PAGE_SIZE << order, gfp, node); + } + +- kmemleak_alloc(ret, size, 1, gfp); ++ return ret; ++} ++ ++static __always_inline void * ++__do_kmalloc_node(size_t size, gfp_t gfp, int node, unsigned long caller) ++{ ++ int align = max(ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN); ++ void *ret = __do_kmalloc_node_align(size, gfp, node, caller, align); ++ ++ if (!ZERO_OR_NULL_PTR(ret)) ++ kmemleak_alloc(ret, size, 1, gfp); + return ret; + } + +@@ -491,34 +515,112 @@ void kfree(const void *block) + return; + kmemleak_free(block); + ++ VM_BUG_ON(!virt_addr_valid(block)); + sp = virt_to_page(block); +- if (PageSlab(sp)) { ++ VM_BUG_ON(!PageSlab(sp)); ++ if (!sp->private) { + int align = max_t(size_t, ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN); +- unsigned int *m = (unsigned int *)(block - align); +- slob_free(m, *m + align); +- } else ++ slob_t *m = (slob_t *)(block - align); ++ slob_free(NULL, m, m[0].units + align); ++ } else { ++ __ClearPageSlab(sp); ++ page_mapcount_reset(sp); ++ sp->private = 0; + __free_pages(sp, compound_order(sp)); ++ } + } + EXPORT_SYMBOL(kfree); + ++bool is_usercopy_object(const void *ptr) ++{ ++ if (!slab_is_available()) ++ return false; ++ ++ // PAX: TODO ++ ++ return false; ++} ++ ++#ifdef CONFIG_PAX_USERCOPY ++const char *check_heap_object(const void *ptr, unsigned long n) ++{ ++ struct page *page; ++ const slob_t *free; ++ const void *base; ++ unsigned long flags; ++ ++ if (ZERO_OR_NULL_PTR(ptr)) ++ return "<null>"; ++ ++ if (!virt_addr_valid(ptr)) ++ return NULL; ++ ++ page = virt_to_head_page(ptr); ++ if (!PageSlab(page)) ++ return NULL; ++ ++ if (page->private) { ++ base = page; ++ if (base <= ptr && n <= page->private - (ptr - base)) ++ return NULL; ++ return "<slob>"; ++ } ++ ++ /* some tricky double walking to find the chunk */ ++ spin_lock_irqsave(&slob_lock, flags); ++ base = (void *)((unsigned long)ptr & PAGE_MASK); ++ free = page->freelist; ++ ++ while (!slob_last(free) && (void *)free <= ptr) { ++ base = free + slob_units(free); ++ free = slob_next(free); ++ } ++ ++ while (base < (void *)free) { ++ slobidx_t m = ((slob_t *)base)[0].units, align = ((slob_t *)base)[1].units; ++ int size = SLOB_UNIT * SLOB_UNITS(m + align); ++ int offset; ++ ++ if (ptr < base + align) ++ break; ++ ++ offset = ptr - base - align; ++ if (offset >= m) { ++ base += size; ++ continue; ++ } ++ ++ if (n > m - offset) ++ break; ++ ++ spin_unlock_irqrestore(&slob_lock, flags); ++ return NULL; ++ } ++ ++ spin_unlock_irqrestore(&slob_lock, flags); ++ return "<slob>"; ++} ++#endif ++ + /* can't use ksize for kmem_cache_alloc memory, only kmalloc */ + size_t ksize(const void *block) + { + struct page *sp; + int align; +- unsigned int *m; ++ slob_t *m; + + BUG_ON(!block); + if (unlikely(block == ZERO_SIZE_PTR)) + return 0; + + sp = virt_to_page(block); +- if (unlikely(!PageSlab(sp))) +- return PAGE_SIZE << compound_order(sp); ++ VM_BUG_ON(!PageSlab(sp)); ++ if (sp->private) ++ return sp->private; + + align = max_t(size_t, ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN); +- m = (unsigned int *)(block - align); +- return SLOB_UNITS(*m) * SLOB_UNIT; ++ m = (slob_t *)(block - align); ++ return SLOB_UNITS(m[0].units) * SLOB_UNIT; + } + EXPORT_SYMBOL(ksize); + +@@ -534,23 +636,33 @@ int __kmem_cache_create(struct kmem_cache *c, unsigned long flags) + + void *slob_alloc_node(struct kmem_cache *c, gfp_t flags, int node) + { +- void *b; ++ void *b = NULL; + + flags &= gfp_allowed_mask; + + lockdep_trace_alloc(flags); + ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++ b = __do_kmalloc_node_align(c->size, flags, node, _RET_IP_, c->align); ++#else + if (c->size < PAGE_SIZE) { + b = slob_alloc(c->size, flags, c->align, node); + trace_kmem_cache_alloc_node(_RET_IP_, b, c->object_size, + SLOB_UNITS(c->size) * SLOB_UNIT, + flags, node); + } else { +- b = slob_new_pages(flags, get_order(c->size), node); ++ struct page *sp; ++ ++ sp = slob_new_pages(flags, get_order(c->size), node); ++ if (sp) { ++ b = page_address(sp); ++ sp->private = c->size; ++ } + trace_kmem_cache_alloc_node(_RET_IP_, b, c->object_size, + PAGE_SIZE << get_order(c->size), + flags, node); + } ++#endif + + if (b && c->ctor) + c->ctor(b); +@@ -580,12 +692,16 @@ void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t gfp, int node) + EXPORT_SYMBOL(kmem_cache_alloc_node); + #endif + +-static void __kmem_cache_free(void *b, int size) ++static void __kmem_cache_free(struct kmem_cache *c, void *b, int size) + { +- if (size < PAGE_SIZE) +- slob_free(b, size); ++ struct page *sp; ++ ++ sp = virt_to_page(b); ++ BUG_ON(!PageSlab(sp)); ++ if (!sp->private) ++ slob_free(c, b, size); + else +- slob_free_pages(b, get_order(size)); ++ slob_free_pages(sp, get_order(size)); + } + + static void kmem_rcu_free(struct rcu_head *head) +@@ -593,22 +709,36 @@ static void kmem_rcu_free(struct rcu_head *head) + struct slob_rcu *slob_rcu = (struct slob_rcu *)head; + void *b = (void *)slob_rcu - (slob_rcu->size - sizeof(struct slob_rcu)); + +- __kmem_cache_free(b, slob_rcu->size); ++ __kmem_cache_free(NULL, b, slob_rcu->size); + } + + void kmem_cache_free(struct kmem_cache *c, void *b) + { ++ int size = c->size; ++ ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++ if (size + c->align < PAGE_SIZE) { ++ size += c->align; ++ b -= c->align; ++ } ++#endif ++ + kmemleak_free_recursive(b, c->flags); + if (unlikely(c->flags & SLAB_DESTROY_BY_RCU)) { + struct slob_rcu *slob_rcu; +- slob_rcu = b + (c->size - sizeof(struct slob_rcu)); +- slob_rcu->size = c->size; ++ slob_rcu = b + (size - sizeof(struct slob_rcu)); ++ slob_rcu->size = size; + call_rcu(&slob_rcu->head, kmem_rcu_free); + } else { +- __kmem_cache_free(b, c->size); ++ __kmem_cache_free(c, b, size); + } + ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++ trace_kfree(_RET_IP_, b); ++#else + trace_kmem_cache_free(_RET_IP_, b); ++#endif ++ + } + EXPORT_SYMBOL(kmem_cache_free); + +diff --git a/mm/slub.c b/mm/slub.c +index ae7b9f1..7b3fdbe 100644 +--- a/mm/slub.c ++++ b/mm/slub.c +@@ -197,7 +197,7 @@ struct track { + + enum track_item { TRACK_ALLOC, TRACK_FREE }; + +-#ifdef CONFIG_SYSFS ++#if defined(CONFIG_SYSFS) && !defined(CONFIG_GRKERNSEC_PROC_ADD) + static int sysfs_slab_add(struct kmem_cache *); + static int sysfs_slab_alias(struct kmem_cache *, const char *); + static void memcg_propagate_slab_attrs(struct kmem_cache *s); +@@ -535,7 +535,7 @@ static void print_track(const char *s, struct track *t) + if (!t->addr) + return; + +- pr_err("INFO: %s in %pS age=%lu cpu=%u pid=%d\n", ++ pr_err("INFO: %s in %pA age=%lu cpu=%u pid=%d\n", + s, (void *)t->addr, jiffies - t->when, t->cpu, t->pid); + #ifdef CONFIG_STACKTRACE + { +@@ -2645,6 +2645,14 @@ static __always_inline void slab_free(struct kmem_cache *s, + + slab_free_hook(s, x); + ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ if (!(s->flags & SLAB_NO_SANITIZE)) { ++ memset(x, PAX_MEMORY_SANITIZE_VALUE, s->object_size); ++ if (s->ctor) ++ s->ctor(x); ++ } ++#endif ++ + redo: + /* + * Determine the currently cpus per cpu slab. +@@ -2982,6 +2990,9 @@ static int calculate_sizes(struct kmem_cache *s, int forced_order) + s->inuse = size; + + if (((flags & (SLAB_DESTROY_BY_RCU | SLAB_POISON)) || ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ (!(flags & SLAB_NO_SANITIZE)) || ++#endif + s->ctor)) { + /* + * Relocate free pointer after the object if it is not +@@ -3301,6 +3312,59 @@ void *__kmalloc_node(size_t size, gfp_t flags, int node) + EXPORT_SYMBOL(__kmalloc_node); + #endif + ++bool is_usercopy_object(const void *ptr) ++{ ++ struct page *page; ++ struct kmem_cache *s; ++ ++ if (ZERO_OR_NULL_PTR(ptr)) ++ return false; ++ ++ if (!slab_is_available()) ++ return false; ++ ++ if (!virt_addr_valid(ptr)) ++ return false; ++ ++ page = virt_to_head_page(ptr); ++ ++ if (!PageSlab(page)) ++ return false; ++ ++ s = page->slab_cache; ++ return s->flags & SLAB_USERCOPY; ++} ++ ++#ifdef CONFIG_PAX_USERCOPY ++const char *check_heap_object(const void *ptr, unsigned long n) ++{ ++ struct page *page; ++ struct kmem_cache *s; ++ unsigned long offset; ++ ++ if (ZERO_OR_NULL_PTR(ptr)) ++ return "<null>"; ++ ++ if (!virt_addr_valid(ptr)) ++ return NULL; ++ ++ page = virt_to_head_page(ptr); ++ ++ if (!PageSlab(page)) ++ return NULL; ++ ++ s = page->slab_cache; ++ if (!(s->flags & SLAB_USERCOPY)) ++ return s->name; ++ ++ offset = (ptr - page_address(page)) % s->size; ++ if (offset <= s->object_size && n <= s->object_size - offset) ++ return NULL; ++ ++ return s->name; ++} ++#endif ++ + size_t ksize(const void *object) + { + struct page *page; +@@ -3329,6 +3393,7 @@ void kfree(const void *x) + if (unlikely(ZERO_OR_NULL_PTR(x))) + return; + ++ VM_BUG_ON(!virt_addr_valid(x)); + page = virt_to_head_page(x); + if (unlikely(!PageSlab(page))) { + BUG_ON(!PageCompound(page)); +@@ -3624,7 +3689,7 @@ __kmem_cache_alias(const char *name, size_t size, size_t align, + int i; + struct kmem_cache *c; + +- s->refcount++; ++ atomic_inc(&s->refcount); + + /* + * Adjust the object sizes so that we clear +@@ -3643,7 +3708,7 @@ __kmem_cache_alias(const char *name, size_t size, size_t align, + } + + if (sysfs_slab_alias(s, name)) { +- s->refcount--; ++ atomic_dec(&s->refcount); + s = NULL; + } + } +@@ -3760,7 +3825,7 @@ void *__kmalloc_node_track_caller(size_t size, gfp_t gfpflags, + } + #endif + +-#ifdef CONFIG_SYSFS ++#if defined(CONFIG_SYSFS) && !defined(CONFIG_GRKERNSEC_PROC_ADD) + static int count_inuse(struct page *page) + { + return page->inuse; +@@ -4041,7 +4106,11 @@ static int list_locations(struct kmem_cache *s, char *buf, + len += sprintf(buf + len, "%7ld ", l->count); + + if (l->addr) ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ len += sprintf(buf + len, "%pS", NULL); ++#else + len += sprintf(buf + len, "%pS", (void *)l->addr); ++#endif + else + len += sprintf(buf + len, "<not-available>"); + +@@ -4143,12 +4212,12 @@ static void __init resiliency_test(void) + validate_slab_cache(kmalloc_caches[9]); + } + #else +-#ifdef CONFIG_SYSFS ++#if defined(CONFIG_SYSFS) && !defined(CONFIG_GRKERNSEC_PROC_ADD) + static void resiliency_test(void) {}; + #endif + #endif + +-#ifdef CONFIG_SYSFS ++#if defined(CONFIG_SYSFS) && !defined(CONFIG_GRKERNSEC_PROC_ADD) + enum slab_stat_type { + SL_ALL, /* All slabs */ + SL_PARTIAL, /* Only partially allocated slabs */ +@@ -4385,13 +4454,17 @@ static ssize_t ctor_show(struct kmem_cache *s, char *buf) + { + if (!s->ctor) + return 0; ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ return sprintf(buf, "%pS\n", NULL); ++#else + return sprintf(buf, "%pS\n", s->ctor); ++#endif + } + SLAB_ATTR_RO(ctor); + + static ssize_t aliases_show(struct kmem_cache *s, char *buf) + { +- return sprintf(buf, "%d\n", s->refcount < 0 ? 0 : s->refcount - 1); ++ return sprintf(buf, "%d\n", atomic_read(&s->refcount) < 0 ? 0 : atomic_read(&s->refcount) - 1); + } + SLAB_ATTR_RO(aliases); + +@@ -4479,6 +4552,22 @@ static ssize_t cache_dma_show(struct kmem_cache *s, char *buf) + SLAB_ATTR_RO(cache_dma); + #endif + ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++static ssize_t usercopy_show(struct kmem_cache *s, char *buf) ++{ ++ return sprintf(buf, "%d\n", !!(s->flags & SLAB_USERCOPY)); ++} ++SLAB_ATTR_RO(usercopy); ++#endif ++ ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++static ssize_t sanitize_show(struct kmem_cache *s, char *buf) ++{ ++ return sprintf(buf, "%d\n", !(s->flags & SLAB_NO_SANITIZE)); ++} ++SLAB_ATTR_RO(sanitize); ++#endif ++ + static ssize_t destroy_by_rcu_show(struct kmem_cache *s, char *buf) + { + return sprintf(buf, "%d\n", !!(s->flags & SLAB_DESTROY_BY_RCU)); +@@ -4534,7 +4623,7 @@ static ssize_t trace_store(struct kmem_cache *s, const char *buf, + * as well as cause other issues like converting a mergeable + * cache into an umergeable one. + */ +- if (s->refcount > 1) ++ if (atomic_read(&s->refcount) > 1) + return -EINVAL; + + s->flags &= ~SLAB_TRACE; +@@ -4654,7 +4743,7 @@ static ssize_t failslab_show(struct kmem_cache *s, char *buf) + static ssize_t failslab_store(struct kmem_cache *s, const char *buf, + size_t length) + { +- if (s->refcount > 1) ++ if (atomic_read(&s->refcount) > 1) + return -EINVAL; + + s->flags &= ~SLAB_FAILSLAB; +@@ -4824,6 +4913,12 @@ static struct attribute *slab_attrs[] = { + #ifdef CONFIG_ZONE_DMA + &cache_dma_attr.attr, + #endif ++#ifdef CONFIG_PAX_USERCOPY_SLABS ++ &usercopy_attr.attr, ++#endif ++#ifdef CONFIG_PAX_MEMORY_SANITIZE ++ &sanitize_attr.attr, ++#endif + #ifdef CONFIG_NUMA + &remote_node_defrag_ratio_attr.attr, + #endif +@@ -5068,6 +5163,7 @@ static char *create_unique_id(struct kmem_cache *s) + return name; + } + ++#if defined(CONFIG_SYSFS) && !defined(CONFIG_GRKERNSEC_PROC_ADD) + static int sysfs_slab_add(struct kmem_cache *s) + { + int err; +@@ -5141,6 +5237,7 @@ void sysfs_slab_remove(struct kmem_cache *s) + kobject_del(&s->kobj); + kobject_put(&s->kobj); + } ++#endif + + /* + * Need to buffer aliases during bootup until sysfs becomes +@@ -5154,6 +5251,7 @@ struct saved_alias { + + static struct saved_alias *alias_list; + ++#if defined(CONFIG_SYSFS) && !defined(CONFIG_GRKERNSEC_PROC_ADD) + static int sysfs_slab_alias(struct kmem_cache *s, const char *name) + { + struct saved_alias *al; +@@ -5176,6 +5274,7 @@ static int sysfs_slab_alias(struct kmem_cache *s, const char *name) + alias_list = al; + return 0; + } ++#endif + + static int __init slab_sysfs_init(void) + { +diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c +index 4cba9c2..b4f9fcc 100644 +--- a/mm/sparse-vmemmap.c ++++ b/mm/sparse-vmemmap.c +@@ -131,7 +131,7 @@ pud_t * __meminit vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node) + void *p = vmemmap_alloc_block(PAGE_SIZE, node); + if (!p) + return NULL; +- pud_populate(&init_mm, pud, p); ++ pud_populate_kernel(&init_mm, pud, p); + } + return pud; + } +@@ -143,7 +143,7 @@ pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node) + void *p = vmemmap_alloc_block(PAGE_SIZE, node); + if (!p) + return NULL; +- pgd_populate(&init_mm, pgd, p); ++ pgd_populate_kernel(&init_mm, pgd, p); + } + return pgd; + } +diff --git a/mm/sparse.c b/mm/sparse.c +index d1b48b6..6e8590e 100644 +--- a/mm/sparse.c ++++ b/mm/sparse.c +@@ -750,7 +750,7 @@ static void clear_hwpoisoned_pages(struct page *memmap, int nr_pages) + + for (i = 0; i < PAGES_PER_SECTION; i++) { + if (PageHWPoison(&memmap[i])) { +- atomic_long_sub(1, &num_poisoned_pages); ++ atomic_long_sub_unchecked(1, &num_poisoned_pages); + ClearPageHWPoison(&memmap[i]); + } + } +diff --git a/mm/swap.c b/mm/swap.c +index 8a12b33..7068e78 100644 +--- a/mm/swap.c ++++ b/mm/swap.c +@@ -31,6 +31,7 @@ + #include <linux/memcontrol.h> + #include <linux/gfp.h> + #include <linux/uio.h> ++#include <linux/hugetlb.h> + + #include "internal.h" + +@@ -77,6 +78,8 @@ static void __put_compound_page(struct page *page) + + __page_cache_release(page); + dtor = get_compound_page_dtor(page); ++ if (!PageHuge(page)) ++ BUG_ON(dtor != free_compound_page); + (*dtor)(page); + } + +diff --git a/mm/swapfile.c b/mm/swapfile.c +index 8798b2e..348f9dd 100644 +--- a/mm/swapfile.c ++++ b/mm/swapfile.c +@@ -84,7 +84,7 @@ static DEFINE_MUTEX(swapon_mutex); + + static DECLARE_WAIT_QUEUE_HEAD(proc_poll_wait); + /* Activity counter to indicate that a swapon or swapoff has occurred */ +-static atomic_t proc_poll_event = ATOMIC_INIT(0); ++static atomic_unchecked_t proc_poll_event = ATOMIC_INIT(0); + + static inline unsigned char swap_count(unsigned char ent) + { +@@ -1944,7 +1944,7 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) + spin_unlock(&swap_lock); + + err = 0; +- atomic_inc(&proc_poll_event); ++ atomic_inc_unchecked(&proc_poll_event); + wake_up_interruptible(&proc_poll_wait); + + out_dput: +@@ -1961,8 +1961,8 @@ static unsigned swaps_poll(struct file *file, poll_table *wait) + + poll_wait(file, &proc_poll_wait, wait); + +- if (seq->poll_event != atomic_read(&proc_poll_event)) { +- seq->poll_event = atomic_read(&proc_poll_event); ++ if (seq->poll_event != atomic_read_unchecked(&proc_poll_event)) { ++ seq->poll_event = atomic_read_unchecked(&proc_poll_event); + return POLLIN | POLLRDNORM | POLLERR | POLLPRI; + } + +@@ -2060,7 +2060,7 @@ static int swaps_open(struct inode *inode, struct file *file) + return ret; + + seq = file->private_data; +- seq->poll_event = atomic_read(&proc_poll_event); ++ seq->poll_event = atomic_read_unchecked(&proc_poll_event); + return 0; + } + +@@ -2520,7 +2520,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) + (frontswap_map) ? "FS" : ""); + + mutex_unlock(&swapon_mutex); +- atomic_inc(&proc_poll_event); ++ atomic_inc_unchecked(&proc_poll_event); + wake_up_interruptible(&proc_poll_wait); + + if (S_ISREG(inode->i_mode)) +diff --git a/mm/util.c b/mm/util.c +index fec39d4..3e60325 100644 +--- a/mm/util.c ++++ b/mm/util.c +@@ -195,6 +195,12 @@ struct task_struct *task_of_stack(struct task_struct *task, + void arch_pick_mmap_layout(struct mm_struct *mm) + { + mm->mmap_base = TASK_UNMAPPED_BASE; ++ ++#ifdef CONFIG_PAX_RANDMMAP ++ if (mm->pax_flags & MF_PAX_RANDMMAP) ++ mm->mmap_base += mm->delta_mmap; ++#endif ++ + mm->get_unmapped_area = arch_get_unmapped_area; + } + #endif +@@ -371,6 +377,9 @@ int get_cmdline(struct task_struct *task, char *buffer, int buflen) + if (!mm->arg_end) + goto out_mm; /* Shh! No looking before we're done */ + ++ if (gr_acl_handle_procpidmem(task)) ++ goto out_mm; ++ + len = mm->arg_end - mm->arg_start; + + if (len > buflen) +diff --git a/mm/vmalloc.c b/mm/vmalloc.c +index 90520af..e87c0f7 100644 +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -39,20 +39,65 @@ struct vfree_deferred { + struct work_struct wq; + }; + static DEFINE_PER_CPU(struct vfree_deferred, vfree_deferred); ++static DEFINE_PER_CPU(struct vfree_deferred, vunmap_deferred); ++ ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++struct stack_deferred_llist { ++ struct llist_head list; ++ void *stack; ++ void *lowmem_stack; ++}; ++ ++struct stack_deferred { ++ struct stack_deferred_llist list; ++ struct work_struct wq; ++}; ++ ++static DEFINE_PER_CPU(struct stack_deferred, stack_deferred); ++#endif + + static void __vunmap(const void *, int); + +-static void free_work(struct work_struct *w) ++static void vfree_work(struct work_struct *w) ++{ ++ struct vfree_deferred *p = container_of(w, struct vfree_deferred, wq); ++ struct llist_node *llnode = llist_del_all(&p->list); ++ while (llnode) { ++ void *x = llnode; ++ llnode = llist_next(llnode); ++ __vunmap(x, 1); ++ } ++} ++ ++static void vunmap_work(struct work_struct *w) + { + struct vfree_deferred *p = container_of(w, struct vfree_deferred, wq); + struct llist_node *llnode = llist_del_all(&p->list); + while (llnode) { + void *p = llnode; + llnode = llist_next(llnode); +- __vunmap(p, 1); ++ __vunmap(p, 0); + } + } + ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++static void unmap_work(struct work_struct *w) ++{ ++ struct stack_deferred *p = container_of(w, struct stack_deferred, wq); ++ struct llist_node *llnode = llist_del_all(&p->list.list); ++ while (llnode) { ++ struct stack_deferred_llist *x = ++ llist_entry((struct llist_head *)llnode, ++ struct stack_deferred_llist, list); ++ void *stack = ACCESS_ONCE(x->stack); ++ void *lowmem_stack = ACCESS_ONCE(x->lowmem_stack); ++ llnode = llist_next(llnode); ++ __vunmap(stack, 0); ++ free_kmem_pages((unsigned long)lowmem_stack, THREAD_SIZE_ORDER); ++ } ++} ++#endif ++ + /*** Page table manipulation functions ***/ + + static void vunmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end) +@@ -61,8 +106,19 @@ static void vunmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end) + + pte = pte_offset_kernel(pmd, addr); + do { +- pte_t ptent = ptep_get_and_clear(&init_mm, addr, pte); +- WARN_ON(!pte_none(ptent) && !pte_present(ptent)); ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if ((unsigned long)MODULES_EXEC_VADDR <= addr && addr < (unsigned long)MODULES_EXEC_END) { ++ BUG_ON(!pte_exec(*pte)); ++ set_pte_at(&init_mm, addr, pte, pfn_pte(__pa(addr) >> PAGE_SHIFT, PAGE_KERNEL_EXEC)); ++ continue; ++ } ++#endif ++ ++ { ++ pte_t ptent = ptep_get_and_clear(&init_mm, addr, pte); ++ WARN_ON(!pte_none(ptent) && !pte_present(ptent)); ++ } + } while (pte++, addr += PAGE_SIZE, addr != end); + } + +@@ -122,16 +178,29 @@ static int vmap_pte_range(pmd_t *pmd, unsigned long addr, + pte = pte_alloc_kernel(pmd, addr); + if (!pte) + return -ENOMEM; ++ ++ pax_open_kernel(); + do { + struct page *page = pages[*nr]; + +- if (WARN_ON(!pte_none(*pte))) ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if (pgprot_val(prot) & _PAGE_NX) ++#endif ++ ++ if (!pte_none(*pte)) { ++ pax_close_kernel(); ++ WARN_ON(1); + return -EBUSY; +- if (WARN_ON(!page)) ++ } ++ if (!page) { ++ pax_close_kernel(); ++ WARN_ON(1); + return -ENOMEM; ++ } + set_pte_at(&init_mm, addr, pte, mk_pte(page, prot)); + (*nr)++; + } while (pte++, addr += PAGE_SIZE, addr != end); ++ pax_close_kernel(); + return 0; + } + +@@ -141,7 +210,7 @@ static int vmap_pmd_range(pud_t *pud, unsigned long addr, + pmd_t *pmd; + unsigned long next; + +- pmd = pmd_alloc(&init_mm, pud, addr); ++ pmd = pmd_alloc_kernel(&init_mm, pud, addr); + if (!pmd) + return -ENOMEM; + do { +@@ -158,7 +227,7 @@ static int vmap_pud_range(pgd_t *pgd, unsigned long addr, + pud_t *pud; + unsigned long next; + +- pud = pud_alloc(&init_mm, pgd, addr); ++ pud = pud_alloc_kernel(&init_mm, pgd, addr); + if (!pud) + return -ENOMEM; + do { +@@ -218,6 +287,12 @@ int is_vmalloc_or_module_addr(const void *x) + if (addr >= MODULES_VADDR && addr < MODULES_END) + return 1; + #endif ++ ++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC) ++ if (x >= (const void *)MODULES_EXEC_VADDR && x < (const void *)MODULES_EXEC_END) ++ return 1; ++#endif ++ + return is_vmalloc_addr(x); + } + +@@ -238,8 +313,14 @@ struct page *vmalloc_to_page(const void *vmalloc_addr) + + if (!pgd_none(*pgd)) { + pud_t *pud = pud_offset(pgd, addr); ++#ifdef CONFIG_X86 ++ if (!pud_large(*pud)) ++#endif + if (!pud_none(*pud)) { + pmd_t *pmd = pmd_offset(pud, addr); ++#ifdef CONFIG_X86 ++ if (!pmd_large(*pmd)) ++#endif + if (!pmd_none(*pmd)) { + pte_t *ptep, pte; + +@@ -1183,13 +1264,27 @@ void __init vmalloc_init(void) + for_each_possible_cpu(i) { + struct vmap_block_queue *vbq; + struct vfree_deferred *p; ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++ struct stack_deferred *p2; ++#endif + + vbq = &per_cpu(vmap_block_queue, i); + spin_lock_init(&vbq->lock); + INIT_LIST_HEAD(&vbq->free); ++ + p = &per_cpu(vfree_deferred, i); + init_llist_head(&p->list); +- INIT_WORK(&p->wq, free_work); ++ INIT_WORK(&p->wq, vfree_work); ++ ++ p = &per_cpu(vunmap_deferred, i); ++ init_llist_head(&p->list); ++ INIT_WORK(&p->wq, vunmap_work); ++ ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++ p2 = &per_cpu(stack_deferred, i); ++ init_llist_head(&p2->list.list); ++ INIT_WORK(&p2->wq, unmap_work); ++#endif + } + + /* Import existing vmlist entries. */ +@@ -1314,6 +1409,16 @@ static struct vm_struct *__get_vm_area_node(unsigned long size, + struct vm_struct *area; + + BUG_ON(in_interrupt()); ++ ++#if defined(CONFIG_X86) && defined(CONFIG_PAX_KERNEXEC) ++ if (flags & VM_KERNEXEC) { ++ if (start != VMALLOC_START || end != VMALLOC_END) ++ return NULL; ++ start = (unsigned long)MODULES_EXEC_VADDR; ++ end = (unsigned long)MODULES_EXEC_END; ++ } ++#endif ++ + if (flags & VM_IOREMAP) + align = 1ul << clamp(fls(size), PAGE_SHIFT, IOREMAP_MAX_ORDER); + +@@ -1512,13 +1617,37 @@ EXPORT_SYMBOL(vfree); + */ + void vunmap(const void *addr) + { +- BUG_ON(in_interrupt()); +- might_sleep(); +- if (addr) ++ if (!addr) ++ return; ++ ++ if (unlikely(in_interrupt())) { ++ struct vfree_deferred *p = this_cpu_ptr(&vunmap_deferred); ++ if (llist_add((struct llist_node *)addr, &p->list)) ++ schedule_work(&p->wq); ++ } else { ++ might_sleep(); + __vunmap(addr, 0); ++ } + } + EXPORT_SYMBOL(vunmap); + ++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW ++void unmap_process_stacks(struct task_struct *task) ++{ ++ if (unlikely(in_interrupt())) { ++ struct stack_deferred *p = &__get_cpu_var(stack_deferred); ++ struct stack_deferred_llist *list = task->stack; ++ list->stack = task->stack; ++ list->lowmem_stack = task->lowmem_stack; ++ if (llist_add((struct llist_node *)&list->list, &p->list.list)) ++ schedule_work(&p->wq); ++ } else { ++ __vunmap(task->stack, 0); ++ free_kmem_pages((unsigned long)task->lowmem_stack, THREAD_SIZE_ORDER); ++ } ++} ++#endif ++ + /** + * vmap - map an array of pages into virtually contiguous space + * @pages: array of page pointers +@@ -1539,6 +1668,11 @@ void *vmap(struct page **pages, unsigned int count, + if (count > totalram_pages) + return NULL; + ++#if defined(CONFIG_X86) && defined(CONFIG_PAX_KERNEXEC) ++ if (!(pgprot_val(prot) & _PAGE_NX)) ++ flags |= VM_KERNEXEC; ++#endif ++ + area = get_vm_area_caller((count << PAGE_SHIFT), flags, + __builtin_return_address(0)); + if (!area) +@@ -1641,6 +1775,13 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align, + if (!size || (size >> PAGE_SHIFT) > totalram_pages) + goto fail; + ++#if defined(CONFIG_X86) && defined(CONFIG_PAX_KERNEXEC) ++ if (!(pgprot_val(prot) & _PAGE_NX)) ++ area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNINITIALIZED | VM_KERNEXEC, ++ VMALLOC_START, VMALLOC_END, node, gfp_mask, caller); ++ else ++#endif ++ + area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNINITIALIZED, + start, end, node, gfp_mask, caller); + if (!area) +@@ -1817,10 +1958,9 @@ EXPORT_SYMBOL(vzalloc_node); + * For tight control over page level allocator and protection flags + * use __vmalloc() instead. + */ +- + void *vmalloc_exec(unsigned long size) + { +- return __vmalloc_node(size, 1, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC, ++ return __vmalloc_node(size, 1, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL_EXEC, + NUMA_NO_NODE, __builtin_return_address(0)); + } + +@@ -2127,6 +2267,8 @@ int remap_vmalloc_range_partial(struct vm_area_struct *vma, unsigned long uaddr, + { + struct vm_struct *area; + ++ BUG_ON(vma->vm_mirror); ++ + size = PAGE_ALIGN(size); + + if (!PAGE_ALIGNED(uaddr) || !PAGE_ALIGNED(kaddr)) +@@ -2609,7 +2751,11 @@ static int s_show(struct seq_file *m, void *p) + v->addr, v->addr + v->size, v->size); + + if (v->caller) ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ seq_printf(m, " %pK", v->caller); ++#else + seq_printf(m, " %pS", v->caller); ++#endif + + if (v->nr_pages) + seq_printf(m, " pages=%d", v->nr_pages); +diff --git a/mm/vmstat.c b/mm/vmstat.c +index 4590aa4..31a3b06 100644 +--- a/mm/vmstat.c ++++ b/mm/vmstat.c +@@ -22,6 +22,7 @@ + #include <linux/writeback.h> + #include <linux/compaction.h> + #include <linux/mm_inline.h> ++#include <linux/grsecurity.h> + + #include "internal.h" + +@@ -81,7 +82,7 @@ void vm_events_fold_cpu(int cpu) + * + * vm_stat contains the global counters + */ +-atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS] __cacheline_aligned_in_smp; ++atomic_long_unchecked_t vm_stat[NR_VM_ZONE_STAT_ITEMS] __cacheline_aligned_in_smp; + EXPORT_SYMBOL(vm_stat); + + #ifdef CONFIG_SMP +@@ -433,7 +434,7 @@ static int fold_diff(int *diff) + + for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++) + if (diff[i]) { +- atomic_long_add(diff[i], &vm_stat[i]); ++ atomic_long_add_unchecked(diff[i], &vm_stat[i]); + changes++; + } + return changes; +@@ -471,7 +472,7 @@ static int refresh_cpu_vm_stats(void) + v = this_cpu_xchg(p->vm_stat_diff[i], 0); + if (v) { + +- atomic_long_add(v, &zone->vm_stat[i]); ++ atomic_long_add_unchecked(v, &zone->vm_stat[i]); + global_diff[i] += v; + #ifdef CONFIG_NUMA + /* 3 seconds idle till flush */ +@@ -535,7 +536,7 @@ void cpu_vm_stats_fold(int cpu) + + v = p->vm_stat_diff[i]; + p->vm_stat_diff[i] = 0; +- atomic_long_add(v, &zone->vm_stat[i]); ++ atomic_long_add_unchecked(v, &zone->vm_stat[i]); + global_diff[i] += v; + } + } +@@ -555,8 +556,8 @@ void drain_zonestat(struct zone *zone, struct per_cpu_pageset *pset) + if (pset->vm_stat_diff[i]) { + int v = pset->vm_stat_diff[i]; + pset->vm_stat_diff[i] = 0; +- atomic_long_add(v, &zone->vm_stat[i]); +- atomic_long_add(v, &vm_stat[i]); ++ atomic_long_add_unchecked(v, &zone->vm_stat[i]); ++ atomic_long_add_unchecked(v, &vm_stat[i]); + } + } + #endif +@@ -1189,10 +1190,22 @@ static void *vmstat_start(struct seq_file *m, loff_t *pos) + stat_items_size += sizeof(struct vm_event_state); + #endif + +- v = kmalloc(stat_items_size, GFP_KERNEL); ++ v = kzalloc(stat_items_size, GFP_KERNEL); + m->private = v; + if (!v) + return ERR_PTR(-ENOMEM); ++ ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++#if defined(CONFIG_GRKERNSEC_PROC_USER) || defined(CONFIG_GRKERNSEC_PROC_USERGROUP) ++ if (!uid_eq(current_uid(), GLOBAL_ROOT_UID) ++#ifdef CONFIG_GRKERNSEC_PROC_USERGROUP ++ && !in_group_p(grsec_proc_gid) ++#endif ++ ) ++ return (unsigned long *)m->private + *pos; ++#endif ++#endif ++ + for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++) + v[i] = global_page_state(i); + v += NR_VM_ZONE_STAT_ITEMS; +@@ -1424,10 +1437,16 @@ static int __init setup_vmstat(void) + cpu_notifier_register_done(); + #endif + #ifdef CONFIG_PROC_FS +- proc_create("buddyinfo", S_IRUGO, NULL, &fragmentation_file_operations); +- proc_create("pagetypeinfo", S_IRUGO, NULL, &pagetypeinfo_file_ops); +- proc_create("vmstat", S_IRUGO, NULL, &proc_vmstat_file_operations); +- proc_create("zoneinfo", S_IRUGO, NULL, &proc_zoneinfo_file_operations); ++ { ++ mode_t gr_mode = S_IRUGO; ++#ifdef CONFIG_GRKERNSEC_PROC_ADD ++ gr_mode = S_IRUSR; ++#endif ++ proc_create("buddyinfo", gr_mode, NULL, &fragmentation_file_operations); ++ proc_create("pagetypeinfo", gr_mode, NULL, &pagetypeinfo_file_ops); ++ proc_create("vmstat", S_IRUGO, NULL, &proc_vmstat_file_operations); ++ proc_create("zoneinfo", gr_mode, NULL, &proc_zoneinfo_file_operations); ++ } + #endif + return 0; + } +diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c +index 64c6bed..b79a5de 100644 +--- a/net/8021q/vlan.c ++++ b/net/8021q/vlan.c +@@ -481,7 +481,7 @@ out: + return NOTIFY_DONE; + } + +-static struct notifier_block vlan_notifier_block __read_mostly = { ++static struct notifier_block vlan_notifier_block = { + .notifier_call = vlan_device_event, + }; + +@@ -556,8 +556,7 @@ static int vlan_ioctl_handler(struct net *net, void __user *arg) + err = -EPERM; + if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) + break; +- if ((args.u.name_type >= 0) && +- (args.u.name_type < VLAN_NAME_TYPE_HIGHEST)) { ++ if (args.u.name_type < VLAN_NAME_TYPE_HIGHEST) { + struct vlan_net *vn; + + vn = net_generic(net, vlan_net_id); +diff --git a/net/8021q/vlan_netlink.c b/net/8021q/vlan_netlink.c +index 8ac8a5c..991defc 100644 +--- a/net/8021q/vlan_netlink.c ++++ b/net/8021q/vlan_netlink.c +@@ -238,7 +238,7 @@ nla_put_failure: + return -EMSGSIZE; + } + +-struct rtnl_link_ops vlan_link_ops __read_mostly = { ++struct rtnl_link_ops vlan_link_ops = { + .kind = "vlan", + .maxtype = IFLA_VLAN_MAX, + .policy = vlan_policy, +diff --git a/net/9p/client.c b/net/9p/client.c +index e86a9be..e91f70e 100644 +--- a/net/9p/client.c ++++ b/net/9p/client.c +@@ -596,7 +596,7 @@ static int p9_check_zc_errors(struct p9_client *c, struct p9_req_t *req, + len - inline_len); + } else { + err = copy_from_user(ename + inline_len, +- uidata, len - inline_len); ++ (char __force_user *)uidata, len - inline_len); + if (err) { + err = -EFAULT; + goto out_err; +@@ -1570,7 +1570,7 @@ p9_client_read(struct p9_fid *fid, char *data, char __user *udata, u64 offset, + kernel_buf = 1; + indata = data; + } else +- indata = (__force char *)udata; ++ indata = (__force_kernel char *)udata; + /* + * response header len is 11 + * PDU Header(7) + IO Size (4) +@@ -1645,7 +1645,7 @@ p9_client_write(struct p9_fid *fid, char *data, const char __user *udata, + kernel_buf = 1; + odata = data; + } else +- odata = (char *)udata; ++ odata = (char __force_kernel *)udata; + req = p9_client_zc_rpc(clnt, P9_TWRITE, NULL, odata, 0, rsize, + P9_ZC_HDR_SZ, kernel_buf, "dqd", + fid->fid, offset, rsize); +diff --git a/net/9p/mod.c b/net/9p/mod.c +index 6ab36ae..6f1841b 100644 +--- a/net/9p/mod.c ++++ b/net/9p/mod.c +@@ -84,7 +84,7 @@ static LIST_HEAD(v9fs_trans_list); + void v9fs_register_trans(struct p9_trans_module *m) + { + spin_lock(&v9fs_trans_lock); +- list_add_tail(&m->list, &v9fs_trans_list); ++ pax_list_add_tail((struct list_head *)&m->list, &v9fs_trans_list); + spin_unlock(&v9fs_trans_lock); + } + EXPORT_SYMBOL(v9fs_register_trans); +@@ -97,7 +97,7 @@ EXPORT_SYMBOL(v9fs_register_trans); + void v9fs_unregister_trans(struct p9_trans_module *m) + { + spin_lock(&v9fs_trans_lock); +- list_del_init(&m->list); ++ pax_list_del_init((struct list_head *)&m->list); + spin_unlock(&v9fs_trans_lock); + } + EXPORT_SYMBOL(v9fs_unregister_trans); +diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c +index 80d08f6..de63fd1 100644 +--- a/net/9p/trans_fd.c ++++ b/net/9p/trans_fd.c +@@ -428,7 +428,7 @@ static int p9_fd_write(struct p9_client *client, void *v, int len) + oldfs = get_fs(); + set_fs(get_ds()); + /* The cast to a user pointer is valid due to the set_fs() */ +- ret = vfs_write(ts->wr, (__force void __user *)v, len, &ts->wr->f_pos); ++ ret = vfs_write(ts->wr, (void __force_user *)v, len, &ts->wr->f_pos); + set_fs(oldfs); + + if (ret <= 0 && ret != -ERESTARTSYS && ret != -EAGAIN) +diff --git a/net/appletalk/atalk_proc.c b/net/appletalk/atalk_proc.c +index af46bc4..f9adfcd 100644 +--- a/net/appletalk/atalk_proc.c ++++ b/net/appletalk/atalk_proc.c +@@ -256,7 +256,7 @@ int __init atalk_proc_init(void) + struct proc_dir_entry *p; + int rc = -ENOMEM; + +- atalk_proc_dir = proc_mkdir("atalk", init_net.proc_net); ++ atalk_proc_dir = proc_mkdir_restrict("atalk", init_net.proc_net); + if (!atalk_proc_dir) + goto out; + +diff --git a/net/atm/atm_misc.c b/net/atm/atm_misc.c +index 876fbe8..8bbea9f 100644 +--- a/net/atm/atm_misc.c ++++ b/net/atm/atm_misc.c +@@ -17,7 +17,7 @@ int atm_charge(struct atm_vcc *vcc, int truesize) + if (atomic_read(&sk_atm(vcc)->sk_rmem_alloc) <= sk_atm(vcc)->sk_rcvbuf) + return 1; + atm_return(vcc, truesize); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + return 0; + } + EXPORT_SYMBOL(atm_charge); +@@ -39,7 +39,7 @@ struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc, int pdu_size, + } + } + atm_return(vcc, guess); +- atomic_inc(&vcc->stats->rx_drop); ++ atomic_inc_unchecked(&vcc->stats->rx_drop); + return NULL; + } + EXPORT_SYMBOL(atm_alloc_charge); +@@ -86,7 +86,7 @@ EXPORT_SYMBOL(atm_pcr_goal); + + void sonet_copy_stats(struct k_sonet_stats *from, struct sonet_stats *to) + { +-#define __HANDLE_ITEM(i) to->i = atomic_read(&from->i) ++#define __HANDLE_ITEM(i) to->i = atomic_read_unchecked(&from->i) + __SONET_ITEMS + #undef __HANDLE_ITEM + } +@@ -94,7 +94,7 @@ EXPORT_SYMBOL(sonet_copy_stats); + + void sonet_subtract_stats(struct k_sonet_stats *from, struct sonet_stats *to) + { +-#define __HANDLE_ITEM(i) atomic_sub(to->i, &from->i) ++#define __HANDLE_ITEM(i) atomic_sub_unchecked(to->i,&from->i) + __SONET_ITEMS + #undef __HANDLE_ITEM + } +diff --git a/net/atm/lec.c b/net/atm/lec.c +index 4b98f89..5a2f6cb 100644 +--- a/net/atm/lec.c ++++ b/net/atm/lec.c +@@ -111,9 +111,9 @@ static inline void lec_arp_put(struct lec_arp_table *entry) + } + + static struct lane2_ops lane2_ops = { +- lane2_resolve, /* resolve, spec 3.1.3 */ +- lane2_associate_req, /* associate_req, spec 3.1.4 */ +- NULL /* associate indicator, spec 3.1.5 */ ++ .resolve = lane2_resolve, ++ .associate_req = lane2_associate_req, ++ .associate_indicator = NULL + }; + + static unsigned char bus_mac[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +diff --git a/net/atm/lec.h b/net/atm/lec.h +index 4149db1..f2ab682 100644 +--- a/net/atm/lec.h ++++ b/net/atm/lec.h +@@ -48,7 +48,7 @@ struct lane2_ops { + const u8 *tlvs, u32 sizeoftlvs); + void (*associate_indicator) (struct net_device *dev, const u8 *mac_addr, + const u8 *tlvs, u32 sizeoftlvs); +-}; ++} __no_const; + + /* + * ATM LAN Emulation supports both LLC & Dix Ethernet EtherType +diff --git a/net/atm/mpoa_caches.c b/net/atm/mpoa_caches.c +index d1b2d9a..d549f7f 100644 +--- a/net/atm/mpoa_caches.c ++++ b/net/atm/mpoa_caches.c +@@ -535,30 +535,30 @@ static void eg_destroy_cache(struct mpoa_client *mpc) + + + static struct in_cache_ops ingress_ops = { +- in_cache_add_entry, /* add_entry */ +- in_cache_get, /* get */ +- in_cache_get_with_mask, /* get_with_mask */ +- in_cache_get_by_vcc, /* get_by_vcc */ +- in_cache_put, /* put */ +- in_cache_remove_entry, /* remove_entry */ +- cache_hit, /* cache_hit */ +- clear_count_and_expired, /* clear_count */ +- check_resolving_entries, /* check_resolving */ +- refresh_entries, /* refresh */ +- in_destroy_cache /* destroy_cache */ ++ .add_entry = in_cache_add_entry, ++ .get = in_cache_get, ++ .get_with_mask = in_cache_get_with_mask, ++ .get_by_vcc = in_cache_get_by_vcc, ++ .put = in_cache_put, ++ .remove_entry = in_cache_remove_entry, ++ .cache_hit = cache_hit, ++ .clear_count = clear_count_and_expired, ++ .check_resolving = check_resolving_entries, ++ .refresh = refresh_entries, ++ .destroy_cache = in_destroy_cache + }; + + static struct eg_cache_ops egress_ops = { +- eg_cache_add_entry, /* add_entry */ +- eg_cache_get_by_cache_id, /* get_by_cache_id */ +- eg_cache_get_by_tag, /* get_by_tag */ +- eg_cache_get_by_vcc, /* get_by_vcc */ +- eg_cache_get_by_src_ip, /* get_by_src_ip */ +- eg_cache_put, /* put */ +- eg_cache_remove_entry, /* remove_entry */ +- update_eg_cache_entry, /* update */ +- clear_expired, /* clear_expired */ +- eg_destroy_cache /* destroy_cache */ ++ .add_entry = eg_cache_add_entry, ++ .get_by_cache_id = eg_cache_get_by_cache_id, ++ .get_by_tag = eg_cache_get_by_tag, ++ .get_by_vcc = eg_cache_get_by_vcc, ++ .get_by_src_ip = eg_cache_get_by_src_ip, ++ .put = eg_cache_put, ++ .remove_entry = eg_cache_remove_entry, ++ .update = update_eg_cache_entry, ++ .clear_expired = clear_expired, ++ .destroy_cache = eg_destroy_cache + }; + + +diff --git a/net/atm/proc.c b/net/atm/proc.c +index bbb6461..cf04016 100644 +--- a/net/atm/proc.c ++++ b/net/atm/proc.c +@@ -45,9 +45,9 @@ static void add_stats(struct seq_file *seq, const char *aal, + const struct k_atm_aal_stats *stats) + { + seq_printf(seq, "%s ( %d %d %d %d %d )", aal, +- atomic_read(&stats->tx), atomic_read(&stats->tx_err), +- atomic_read(&stats->rx), atomic_read(&stats->rx_err), +- atomic_read(&stats->rx_drop)); ++ atomic_read_unchecked(&stats->tx),atomic_read_unchecked(&stats->tx_err), ++ atomic_read_unchecked(&stats->rx),atomic_read_unchecked(&stats->rx_err), ++ atomic_read_unchecked(&stats->rx_drop)); + } + + static void atm_dev_info(struct seq_file *seq, const struct atm_dev *dev) +diff --git a/net/atm/resources.c b/net/atm/resources.c +index 0447d5d..3cf4728 100644 +--- a/net/atm/resources.c ++++ b/net/atm/resources.c +@@ -160,7 +160,7 @@ EXPORT_SYMBOL(atm_dev_deregister); + static void copy_aal_stats(struct k_atm_aal_stats *from, + struct atm_aal_stats *to) + { +-#define __HANDLE_ITEM(i) to->i = atomic_read(&from->i) ++#define __HANDLE_ITEM(i) to->i = atomic_read_unchecked(&from->i) + __AAL_STAT_ITEMS + #undef __HANDLE_ITEM + } +@@ -168,7 +168,7 @@ static void copy_aal_stats(struct k_atm_aal_stats *from, + static void subtract_aal_stats(struct k_atm_aal_stats *from, + struct atm_aal_stats *to) + { +-#define __HANDLE_ITEM(i) atomic_sub(to->i, &from->i) ++#define __HANDLE_ITEM(i) atomic_sub_unchecked(to->i, &from->i) + __AAL_STAT_ITEMS + #undef __HANDLE_ITEM + } +diff --git a/net/ax25/sysctl_net_ax25.c b/net/ax25/sysctl_net_ax25.c +index 919a5ce..cc6b444 100644 +--- a/net/ax25/sysctl_net_ax25.c ++++ b/net/ax25/sysctl_net_ax25.c +@@ -152,7 +152,7 @@ int ax25_register_dev_sysctl(ax25_dev *ax25_dev) + { + char path[sizeof("net/ax25/") + IFNAMSIZ]; + int k; +- struct ctl_table *table; ++ ctl_table_no_const *table; + + table = kmemdup(ax25_param_table, sizeof(ax25_param_table), GFP_KERNEL); + if (!table) +diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c +index 1e80539..676c37a 100644 +--- a/net/batman-adv/bat_iv_ogm.c ++++ b/net/batman-adv/bat_iv_ogm.c +@@ -313,7 +313,7 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface) + + /* randomize initial seqno to avoid collision */ + get_random_bytes(&random_seqno, sizeof(random_seqno)); +- atomic_set(&hard_iface->bat_iv.ogm_seqno, random_seqno); ++ atomic_set_unchecked(&hard_iface->bat_iv.ogm_seqno, random_seqno); + + hard_iface->bat_iv.ogm_buff_len = BATADV_OGM_HLEN; + ogm_buff = kmalloc(hard_iface->bat_iv.ogm_buff_len, GFP_ATOMIC); +@@ -918,9 +918,9 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface) + batadv_ogm_packet->tvlv_len = htons(tvlv_len); + + /* change sequence number to network order */ +- seqno = (uint32_t)atomic_read(&hard_iface->bat_iv.ogm_seqno); ++ seqno = (uint32_t)atomic_read_unchecked(&hard_iface->bat_iv.ogm_seqno); + batadv_ogm_packet->seqno = htonl(seqno); +- atomic_inc(&hard_iface->bat_iv.ogm_seqno); ++ atomic_inc_unchecked(&hard_iface->bat_iv.ogm_seqno); + + batadv_iv_ogm_slide_own_bcast_window(hard_iface); + +@@ -1597,7 +1597,7 @@ static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset, + return; + + /* could be changed by schedule_own_packet() */ +- if_incoming_seqno = atomic_read(&if_incoming->bat_iv.ogm_seqno); ++ if_incoming_seqno = atomic_read_unchecked(&if_incoming->bat_iv.ogm_seqno); + + if (ogm_packet->flags & BATADV_DIRECTLINK) + has_directlink_flag = true; +diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c +index 00f9e14..e1c7203 100644 +--- a/net/batman-adv/fragmentation.c ++++ b/net/batman-adv/fragmentation.c +@@ -450,7 +450,7 @@ bool batadv_frag_send_packet(struct sk_buff *skb, + frag_header.packet_type = BATADV_UNICAST_FRAG; + frag_header.version = BATADV_COMPAT_VERSION; + frag_header.ttl = BATADV_TTL; +- frag_header.seqno = htons(atomic_inc_return(&bat_priv->frag_seqno)); ++ frag_header.seqno = htons(atomic_inc_return_unchecked(&bat_priv->frag_seqno)); + frag_header.reserved = 0; + frag_header.no = 0; + frag_header.total_size = htons(skb->len); +diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c +index 5467955..75ad4e3 100644 +--- a/net/batman-adv/soft-interface.c ++++ b/net/batman-adv/soft-interface.c +@@ -296,7 +296,7 @@ send: + primary_if->net_dev->dev_addr); + + /* set broadcast sequence number */ +- seqno = atomic_inc_return(&bat_priv->bcast_seqno); ++ seqno = atomic_inc_return_unchecked(&bat_priv->bcast_seqno); + bcast_packet->seqno = htonl(seqno); + + batadv_add_bcast_packet_to_list(bat_priv, skb, brd_delay); +@@ -761,7 +761,7 @@ static int batadv_softif_init_late(struct net_device *dev) + atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN); + + atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE); +- atomic_set(&bat_priv->bcast_seqno, 1); ++ atomic_set_unchecked(&bat_priv->bcast_seqno, 1); + atomic_set(&bat_priv->tt.vn, 0); + atomic_set(&bat_priv->tt.local_changes, 0); + atomic_set(&bat_priv->tt.ogm_append_cnt, 0); +@@ -775,7 +775,7 @@ static int batadv_softif_init_late(struct net_device *dev) + + /* randomize initial seqno to avoid collision */ + get_random_bytes(&random_seqno, sizeof(random_seqno)); +- atomic_set(&bat_priv->frag_seqno, random_seqno); ++ atomic_set_unchecked(&bat_priv->frag_seqno, random_seqno); + + bat_priv->primary_if = NULL; + bat_priv->num_ifaces = 0; +@@ -983,7 +983,7 @@ int batadv_softif_is_valid(const struct net_device *net_dev) + return 0; + } + +-struct rtnl_link_ops batadv_link_ops __read_mostly = { ++struct rtnl_link_ops batadv_link_ops = { + .kind = "batadv", + .priv_size = sizeof(struct batadv_priv), + .setup = batadv_softif_init_early, +diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h +index 8854c05..ee5d5497 100644 +--- a/net/batman-adv/types.h ++++ b/net/batman-adv/types.h +@@ -67,7 +67,7 @@ enum batadv_dhcp_recipient { + struct batadv_hard_iface_bat_iv { + unsigned char *ogm_buff; + int ogm_buff_len; +- atomic_t ogm_seqno; ++ atomic_unchecked_t ogm_seqno; + }; + + /** +@@ -768,7 +768,7 @@ struct batadv_priv { + atomic_t bonding; + atomic_t fragmentation; + atomic_t packet_size_max; +- atomic_t frag_seqno; ++ atomic_unchecked_t frag_seqno; + #ifdef CONFIG_BATMAN_ADV_BLA + atomic_t bridge_loop_avoidance; + #endif +@@ -787,7 +787,7 @@ struct batadv_priv { + #endif + uint32_t isolation_mark; + uint32_t isolation_mark_mask; +- atomic_t bcast_seqno; ++ atomic_unchecked_t bcast_seqno; + atomic_t bcast_queue_left; + atomic_t batman_queue_left; + char num_ifaces; +diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c +index cfbb39e..0bbfc9d 100644 +--- a/net/bluetooth/6lowpan.c ++++ b/net/bluetooth/6lowpan.c +@@ -367,7 +367,6 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev, + + drop: + dev->stats.rx_dropped++; +- kfree_skb(skb); + return NET_RX_DROP; + } + +diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c +index 85bcc21..ce82722d 100644 +--- a/net/bluetooth/bnep/core.c ++++ b/net/bluetooth/bnep/core.c +@@ -533,6 +533,9 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) + + BT_DBG(""); + ++ if (!l2cap_is_socket(sock)) ++ return -EBADFD; ++ + baswap((void *) dst, &l2cap_pi(sock->sk)->chan->dst); + baswap((void *) src, &l2cap_pi(sock->sk)->chan->src); + +diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c +index 67fe5e8..278a194 100644 +--- a/net/bluetooth/cmtp/core.c ++++ b/net/bluetooth/cmtp/core.c +@@ -334,6 +334,9 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) + + BT_DBG(""); + ++ if (!l2cap_is_socket(sock)) ++ return -EBADFD; ++ + session = kzalloc(sizeof(struct cmtp_session), GFP_KERNEL); + if (!session) + return -ENOMEM; +diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c +index 115f149..f0ba286 100644 +--- a/net/bluetooth/hci_sock.c ++++ b/net/bluetooth/hci_sock.c +@@ -1067,7 +1067,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname, + uf.event_mask[1] = *((u32 *) f->event_mask + 1); + } + +- len = min_t(unsigned int, len, sizeof(uf)); ++ len = min((size_t)len, sizeof(uf)); + if (copy_from_user(&uf, optval, len)) { + err = -EFAULT; + break; +diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c +index 1b7d605..02ebd10 100644 +--- a/net/bluetooth/hidp/core.c ++++ b/net/bluetooth/hidp/core.c +@@ -1318,13 +1318,14 @@ int hidp_connection_add(struct hidp_connadd_req *req, + { + struct hidp_session *session; + struct l2cap_conn *conn; +- struct l2cap_chan *chan = l2cap_pi(ctrl_sock->sk)->chan; ++ struct l2cap_chan *chan; + int ret; + + ret = hidp_verify_sockets(ctrl_sock, intr_sock); + if (ret) + return ret; + ++ chan = l2cap_pi(ctrl_sock->sk)->chan; + conn = NULL; + l2cap_chan_lock(chan); + if (chan->conn) +diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c +index b6f9777..36d3039 100644 +--- a/net/bluetooth/l2cap_core.c ++++ b/net/bluetooth/l2cap_core.c +@@ -3512,8 +3512,10 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, + break; + + case L2CAP_CONF_RFC: +- if (olen == sizeof(rfc)) +- memcpy(&rfc, (void *)val, olen); ++ if (olen != sizeof(rfc)) ++ break; ++ ++ memcpy(&rfc, (void *)val, olen); + + if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) && + rfc.mode != chan->mode) +diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c +index 31f106e..323f606 100644 +--- a/net/bluetooth/l2cap_sock.c ++++ b/net/bluetooth/l2cap_sock.c +@@ -628,7 +628,8 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, + struct sock *sk = sock->sk; + struct l2cap_chan *chan = l2cap_pi(sk)->chan; + struct l2cap_options opts; +- int len, err = 0; ++ int err = 0; ++ size_t len = optlen; + u32 opt; + + BT_DBG("sk %p", sk); +@@ -655,7 +656,7 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, + opts.max_tx = chan->max_tx; + opts.txwin_size = chan->tx_win; + +- len = min_t(unsigned int, sizeof(opts), optlen); ++ len = min(sizeof(opts), len); + if (copy_from_user((char *) &opts, optval, len)) { + err = -EFAULT; + break; +@@ -742,7 +743,8 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, + struct bt_security sec; + struct bt_power pwr; + struct l2cap_conn *conn; +- int len, err = 0; ++ int err = 0; ++ size_t len = optlen; + u32 opt; + + BT_DBG("sk %p", sk); +@@ -766,7 +768,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, + + sec.level = BT_SECURITY_LOW; + +- len = min_t(unsigned int, sizeof(sec), optlen); ++ len = min(sizeof(sec), len); + if (copy_from_user((char *) &sec, optval, len)) { + err = -EFAULT; + break; +@@ -862,7 +864,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, + + pwr.force_active = BT_POWER_FORCE_ACTIVE_ON; + +- len = min_t(unsigned int, sizeof(pwr), optlen); ++ len = min(sizeof(pwr), len); + if (copy_from_user((char *) &pwr, optval, len)) { + err = -EFAULT; + break; +diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c +index 8bbbb5e..6fc0950 100644 +--- a/net/bluetooth/rfcomm/sock.c ++++ b/net/bluetooth/rfcomm/sock.c +@@ -687,7 +687,7 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c + struct sock *sk = sock->sk; + struct bt_security sec; + int err = 0; +- size_t len; ++ size_t len = optlen; + u32 opt; + + BT_DBG("sk %p", sk); +@@ -709,7 +709,7 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c + + sec.level = BT_SECURITY_LOW; + +- len = min_t(unsigned int, sizeof(sec), optlen); ++ len = min(sizeof(sec), len); + if (copy_from_user((char *) &sec, optval, len)) { + err = -EFAULT; + break; +diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c +index 8e385a0..a5bdd8e 100644 +--- a/net/bluetooth/rfcomm/tty.c ++++ b/net/bluetooth/rfcomm/tty.c +@@ -752,7 +752,7 @@ static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp) + BT_DBG("tty %p id %d", tty, tty->index); + + BT_DBG("dev %p dst %pMR channel %d opened %d", dev, &dev->dst, +- dev->channel, dev->port.count); ++ dev->channel, atomic_read(&dev->port.count)); + + err = tty_port_open(&dev->port, tty, filp); + if (err) +@@ -775,7 +775,7 @@ static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp) + struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data; + + BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, +- dev->port.count); ++ atomic_read(&dev->port.count)); + + tty_port_close(&dev->port, tty, filp); + } +diff --git a/net/bridge/br.c b/net/bridge/br.c +index 44425af..4ee730e 100644 +--- a/net/bridge/br.c ++++ b/net/bridge/br.c +@@ -147,6 +147,8 @@ static int __init br_init(void) + { + int err; + ++ BUILD_BUG_ON(sizeof(struct br_input_skb_cb) > FIELD_SIZEOF(struct sk_buff, cb)); ++ + err = stp_proto_register(&br_stp_proto); + if (err < 0) { + pr_err("bridge: can't register sap for STP\n"); +diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c +index e5ec470..cbfabd1 100644 +--- a/net/bridge/br_netlink.c ++++ b/net/bridge/br_netlink.c +@@ -564,7 +564,7 @@ static struct rtnl_af_ops br_af_ops = { + .get_link_af_size = br_get_link_af_size, + }; + +-struct rtnl_link_ops br_link_ops __read_mostly = { ++struct rtnl_link_ops br_link_ops = { + .kind = "bridge", + .priv_size = sizeof(struct net_bridge), + .setup = br_dev_setup, +diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c +index d9a8c05..8dadc6c 100644 +--- a/net/bridge/netfilter/ebtables.c ++++ b/net/bridge/netfilter/ebtables.c +@@ -1533,7 +1533,7 @@ static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) + tmp.valid_hooks = t->table->valid_hooks; + } + mutex_unlock(&ebt_mutex); +- if (copy_to_user(user, &tmp, *len) != 0) { ++ if (*len > sizeof(tmp) || copy_to_user(user, &tmp, *len) != 0) { + BUGPRINT("c2u Didn't work\n"); + ret = -EFAULT; + break; +@@ -2339,7 +2339,7 @@ static int compat_do_ebt_get_ctl(struct sock *sk, int cmd, + goto out; + tmp.valid_hooks = t->valid_hooks; + +- if (copy_to_user(user, &tmp, *len) != 0) { ++ if (*len > sizeof(tmp) || copy_to_user(user, &tmp, *len) != 0) { + ret = -EFAULT; + break; + } +@@ -2350,7 +2350,7 @@ static int compat_do_ebt_get_ctl(struct sock *sk, int cmd, + tmp.entries_size = t->table->entries_size; + tmp.valid_hooks = t->table->valid_hooks; + +- if (copy_to_user(user, &tmp, *len) != 0) { ++ if (*len > sizeof(tmp) || copy_to_user(user, &tmp, *len) != 0) { + ret = -EFAULT; + break; + } +diff --git a/net/caif/cfctrl.c b/net/caif/cfctrl.c +index f5afda1..dcf770a 100644 +--- a/net/caif/cfctrl.c ++++ b/net/caif/cfctrl.c +@@ -10,6 +10,7 @@ + #include <linux/spinlock.h> + #include <linux/slab.h> + #include <linux/pkt_sched.h> ++#include <linux/sched.h> + #include <net/caif/caif_layer.h> + #include <net/caif/cfpkt.h> + #include <net/caif/cfctrl.h> +@@ -43,8 +44,8 @@ struct cflayer *cfctrl_create(void) + memset(&dev_info, 0, sizeof(dev_info)); + dev_info.id = 0xff; + cfsrvl_init(&this->serv, 0, &dev_info, false); +- atomic_set(&this->req_seq_no, 1); +- atomic_set(&this->rsp_seq_no, 1); ++ atomic_set_unchecked(&this->req_seq_no, 1); ++ atomic_set_unchecked(&this->rsp_seq_no, 1); + this->serv.layer.receive = cfctrl_recv; + sprintf(this->serv.layer.name, "ctrl"); + this->serv.layer.ctrlcmd = cfctrl_ctrlcmd; +@@ -130,8 +131,8 @@ static void cfctrl_insert_req(struct cfctrl *ctrl, + struct cfctrl_request_info *req) + { + spin_lock_bh(&ctrl->info_list_lock); +- atomic_inc(&ctrl->req_seq_no); +- req->sequence_no = atomic_read(&ctrl->req_seq_no); ++ atomic_inc_unchecked(&ctrl->req_seq_no); ++ req->sequence_no = atomic_read_unchecked(&ctrl->req_seq_no); + list_add_tail(&req->list, &ctrl->list); + spin_unlock_bh(&ctrl->info_list_lock); + } +@@ -149,7 +150,7 @@ static struct cfctrl_request_info *cfctrl_remove_req(struct cfctrl *ctrl, + if (p != first) + pr_warn("Requests are not received in order\n"); + +- atomic_set(&ctrl->rsp_seq_no, ++ atomic_set_unchecked(&ctrl->rsp_seq_no, + p->sequence_no); + list_del(&p->list); + goto out; +diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c +index 4589ff67..46d6b8f 100644 +--- a/net/caif/chnl_net.c ++++ b/net/caif/chnl_net.c +@@ -516,7 +516,7 @@ static const struct nla_policy ipcaif_policy[IFLA_CAIF_MAX + 1] = { + }; + + +-static struct rtnl_link_ops ipcaif_link_ops __read_mostly = { ++static struct rtnl_link_ops ipcaif_link_ops = { + .kind = "caif", + .priv_size = sizeof(struct chnl_net), + .setup = ipcaif_net_setup, +diff --git a/net/can/af_can.c b/net/can/af_can.c +index d6030d6..4e1e310 100644 +--- a/net/can/af_can.c ++++ b/net/can/af_can.c +@@ -887,7 +887,7 @@ static const struct net_proto_family can_family_ops = { + }; + + /* notifier block for netdevice event */ +-static struct notifier_block can_netdev_notifier __read_mostly = { ++static struct notifier_block can_netdev_notifier = { + .notifier_call = can_notifier, + }; + +diff --git a/net/can/bcm.c b/net/can/bcm.c +index dcb75c0..24b1b43 100644 +--- a/net/can/bcm.c ++++ b/net/can/bcm.c +@@ -1624,7 +1624,7 @@ static int __init bcm_module_init(void) + } + + /* create /proc/net/can-bcm directory */ +- proc_dir = proc_mkdir("can-bcm", init_net.proc_net); ++ proc_dir = proc_mkdir_restrict("can-bcm", init_net.proc_net); + return 0; + } + +diff --git a/net/can/gw.c b/net/can/gw.c +index 050a211..bb9fe33 100644 +--- a/net/can/gw.c ++++ b/net/can/gw.c +@@ -80,7 +80,6 @@ MODULE_PARM_DESC(max_hops, + "default: " __stringify(CGW_DEFAULT_HOPS) ")"); + + static HLIST_HEAD(cgw_list); +-static struct notifier_block notifier; + + static struct kmem_cache *cgw_cache __read_mostly; + +@@ -947,6 +946,10 @@ static int cgw_remove_job(struct sk_buff *skb, struct nlmsghdr *nlh) + return err; + } + ++static struct notifier_block notifier = { ++ .notifier_call = cgw_notifier ++}; ++ + static __init int cgw_module_init(void) + { + /* sanitize given module parameter */ +@@ -962,7 +965,6 @@ static __init int cgw_module_init(void) + return -ENOMEM; + + /* set notifier */ +- notifier.notifier_call = cgw_notifier; + register_netdevice_notifier(¬ifier); + + if (__rtnl_register(PF_CAN, RTM_GETROUTE, NULL, cgw_dump_jobs, NULL)) { +diff --git a/net/can/proc.c b/net/can/proc.c +index 1a19b98..df2b4ec 100644 +--- a/net/can/proc.c ++++ b/net/can/proc.c +@@ -514,7 +514,7 @@ static void can_remove_proc_readentry(const char *name) + void can_init_proc(void) + { + /* create /proc/net/can directory */ +- can_dir = proc_mkdir("can", init_net.proc_net); ++ can_dir = proc_mkdir_restrict("can", init_net.proc_net); + + if (!can_dir) { + printk(KERN_INFO "can: failed to create /proc/net/can . " +diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c +index 56a6553..65aea98 100644 +--- a/net/ceph/messenger.c ++++ b/net/ceph/messenger.c +@@ -188,7 +188,7 @@ static void con_fault(struct ceph_connection *con); + #define MAX_ADDR_STR_LEN 64 /* 54 is enough */ + + static char addr_str[ADDR_STR_COUNT][MAX_ADDR_STR_LEN]; +-static atomic_t addr_str_seq = ATOMIC_INIT(0); ++static atomic_unchecked_t addr_str_seq = ATOMIC_INIT(0); + + static struct page *zero_page; /* used in certain error cases */ + +@@ -199,7 +199,7 @@ const char *ceph_pr_addr(const struct sockaddr_storage *ss) + struct sockaddr_in *in4 = (struct sockaddr_in *) ss; + struct sockaddr_in6 *in6 = (struct sockaddr_in6 *) ss; + +- i = atomic_inc_return(&addr_str_seq) & ADDR_STR_COUNT_MASK; ++ i = atomic_inc_return_unchecked(&addr_str_seq) & ADDR_STR_COUNT_MASK; + s = addr_str[i]; + + switch (ss->ss_family) { +diff --git a/net/compat.c b/net/compat.c +index 53e933e..756fcf8 100644 +--- a/net/compat.c ++++ b/net/compat.c +@@ -80,9 +80,9 @@ int get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr __user *umsg) + + if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) + kmsg->msg_namelen = sizeof(struct sockaddr_storage); +- kmsg->msg_name = compat_ptr(tmp1); +- kmsg->msg_iov = compat_ptr(tmp2); +- kmsg->msg_control = compat_ptr(tmp3); ++ kmsg->msg_name = (void __force_kernel *)compat_ptr(tmp1); ++ kmsg->msg_iov = (void __force_kernel *)compat_ptr(tmp2); ++ kmsg->msg_control = (void __force_kernel *)compat_ptr(tmp3); + return 0; + } + +@@ -94,7 +94,7 @@ int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov, + + if (kern_msg->msg_name && kern_msg->msg_namelen) { + if (mode == VERIFY_READ) { +- int err = move_addr_to_kernel(kern_msg->msg_name, ++ int err = move_addr_to_kernel((void __force_user *)kern_msg->msg_name, + kern_msg->msg_namelen, + kern_address); + if (err < 0) +@@ -107,7 +107,7 @@ int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov, + } + + tot_len = iov_from_user_compat_to_kern(kern_iov, +- (struct compat_iovec __user *)kern_msg->msg_iov, ++ (struct compat_iovec __force_user *)kern_msg->msg_iov, + kern_msg->msg_iovlen); + if (tot_len >= 0) + kern_msg->msg_iov = kern_iov; +@@ -127,20 +127,20 @@ int verify_compat_iovec(struct msghdr *kern_msg, struct iovec *kern_iov, + + #define CMSG_COMPAT_FIRSTHDR(msg) \ + (((msg)->msg_controllen) >= sizeof(struct compat_cmsghdr) ? \ +- (struct compat_cmsghdr __user *)((msg)->msg_control) : \ ++ (struct compat_cmsghdr __force_user *)((msg)->msg_control) : \ + (struct compat_cmsghdr __user *)NULL) + + #define CMSG_COMPAT_OK(ucmlen, ucmsg, mhdr) \ + ((ucmlen) >= sizeof(struct compat_cmsghdr) && \ + (ucmlen) <= (unsigned long) \ + ((mhdr)->msg_controllen - \ +- ((char *)(ucmsg) - (char *)(mhdr)->msg_control))) ++ ((char __force_kernel *)(ucmsg) - (char *)(mhdr)->msg_control))) + + static inline struct compat_cmsghdr __user *cmsg_compat_nxthdr(struct msghdr *msg, + struct compat_cmsghdr __user *cmsg, int cmsg_len) + { + char __user *ptr = (char __user *)cmsg + CMSG_COMPAT_ALIGN(cmsg_len); +- if ((unsigned long)(ptr + 1 - (char __user *)msg->msg_control) > ++ if ((unsigned long)(ptr + 1 - (char __force_user *)msg->msg_control) > + msg->msg_controllen) + return NULL; + return (struct compat_cmsghdr __user *)ptr; +@@ -230,7 +230,7 @@ Efault: + + int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *data) + { +- struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __user *) kmsg->msg_control; ++ struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __force_user *) kmsg->msg_control; + struct compat_cmsghdr cmhdr; + struct compat_timeval ctv; + struct compat_timespec cts[3]; +@@ -286,7 +286,7 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat + + void scm_detach_fds_compat(struct msghdr *kmsg, struct scm_cookie *scm) + { +- struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __user *) kmsg->msg_control; ++ struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __force_user *) kmsg->msg_control; + int fdmax = (kmsg->msg_controllen - sizeof(struct compat_cmsghdr)) / sizeof(int); + int fdnum = scm->fp->count; + struct file **fp = scm->fp->fp; +@@ -374,7 +374,7 @@ static int do_set_sock_timeout(struct socket *sock, int level, + return -EFAULT; + old_fs = get_fs(); + set_fs(KERNEL_DS); +- err = sock_setsockopt(sock, level, optname, (char *)&ktime, sizeof(ktime)); ++ err = sock_setsockopt(sock, level, optname, (char __force_user *)&ktime, sizeof(ktime)); + set_fs(old_fs); + + return err; +@@ -435,7 +435,7 @@ static int do_get_sock_timeout(struct socket *sock, int level, int optname, + len = sizeof(ktime); + old_fs = get_fs(); + set_fs(KERNEL_DS); +- err = sock_getsockopt(sock, level, optname, (char *) &ktime, &len); ++ err = sock_getsockopt(sock, level, optname, (char __force_user *) &ktime, (int __force_user *)&len); + set_fs(old_fs); + + if (!err) { +@@ -578,7 +578,7 @@ int compat_mc_setsockopt(struct sock *sock, int level, int optname, + case MCAST_JOIN_GROUP: + case MCAST_LEAVE_GROUP: + { +- struct compat_group_req __user *gr32 = (void *)optval; ++ struct compat_group_req __user *gr32 = (void __user *)optval; + struct group_req __user *kgr = + compat_alloc_user_space(sizeof(struct group_req)); + u32 interface; +@@ -599,7 +599,7 @@ int compat_mc_setsockopt(struct sock *sock, int level, int optname, + case MCAST_BLOCK_SOURCE: + case MCAST_UNBLOCK_SOURCE: + { +- struct compat_group_source_req __user *gsr32 = (void *)optval; ++ struct compat_group_source_req __user *gsr32 = (void __user *)optval; + struct group_source_req __user *kgsr = compat_alloc_user_space( + sizeof(struct group_source_req)); + u32 interface; +@@ -620,7 +620,7 @@ int compat_mc_setsockopt(struct sock *sock, int level, int optname, + } + case MCAST_MSFILTER: + { +- struct compat_group_filter __user *gf32 = (void *)optval; ++ struct compat_group_filter __user *gf32 = (void __user *)optval; + struct group_filter __user *kgf; + u32 interface, fmode, numsrc; + +@@ -658,7 +658,7 @@ int compat_mc_getsockopt(struct sock *sock, int level, int optname, + char __user *optval, int __user *optlen, + int (*getsockopt)(struct sock *, int, int, char __user *, int __user *)) + { +- struct compat_group_filter __user *gf32 = (void *)optval; ++ struct compat_group_filter __user *gf32 = (void __user *)optval; + struct group_filter __user *kgf; + int __user *koptlen; + u32 interface, fmode, numsrc; +@@ -802,7 +802,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args) + + if (call < SYS_SOCKET || call > SYS_SENDMMSG) + return -EINVAL; +- if (copy_from_user(a, args, nas[call])) ++ if (nas[call] > sizeof a || copy_from_user(a, args, nas[call])) + return -EFAULT; + a0 = a[0]; + a1 = a[1]; +diff --git a/net/core/datagram.c b/net/core/datagram.c +index fdbc9a8..cd6972c 100644 +--- a/net/core/datagram.c ++++ b/net/core/datagram.c +@@ -301,7 +301,7 @@ int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags) + } + + kfree_skb(skb); +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + sk_mem_reclaim_partial(sk); + + return err; +diff --git a/net/core/dev.c b/net/core/dev.c +index 5cdbc1b..93c3211 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -1683,14 +1683,14 @@ int __dev_forward_skb(struct net_device *dev, struct sk_buff *skb) + { + if (skb_shinfo(skb)->tx_flags & SKBTX_DEV_ZEROCOPY) { + if (skb_copy_ubufs(skb, GFP_ATOMIC)) { +- atomic_long_inc(&dev->rx_dropped); ++ atomic_long_inc_unchecked(&dev->rx_dropped); + kfree_skb(skb); + return NET_RX_DROP; + } + } + + if (unlikely(!is_skb_forwardable(dev, skb))) { +- atomic_long_inc(&dev->rx_dropped); ++ atomic_long_inc_unchecked(&dev->rx_dropped); + kfree_skb(skb); + return NET_RX_DROP; + } +@@ -2992,7 +2992,7 @@ recursion_alert: + drop: + rcu_read_unlock_bh(); + +- atomic_long_inc(&dev->tx_dropped); ++ atomic_long_inc_unchecked(&dev->tx_dropped); + kfree_skb_list(skb); + return rc; + out: +@@ -3335,7 +3335,7 @@ enqueue: + + local_irq_restore(flags); + +- atomic_long_inc(&skb->dev->rx_dropped); ++ atomic_long_inc_unchecked(&skb->dev->rx_dropped); + kfree_skb(skb); + return NET_RX_DROP; + } +@@ -3412,7 +3412,7 @@ int netif_rx_ni(struct sk_buff *skb) + } + EXPORT_SYMBOL(netif_rx_ni); + +-static void net_tx_action(struct softirq_action *h) ++static __latent_entropy void net_tx_action(void) + { + struct softnet_data *sd = this_cpu_ptr(&softnet_data); + +@@ -3745,7 +3745,7 @@ ncls: + ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev); + } else { + drop: +- atomic_long_inc(&skb->dev->rx_dropped); ++ atomic_long_inc_unchecked(&skb->dev->rx_dropped); + kfree_skb(skb); + /* Jamal, now you will not able to escape explaining + * me how you were going to use this. :-) +@@ -4509,7 +4509,7 @@ void netif_napi_del(struct napi_struct *napi) + } + EXPORT_SYMBOL(netif_napi_del); + +-static void net_rx_action(struct softirq_action *h) ++static __latent_entropy void net_rx_action(void) + { + struct softnet_data *sd = this_cpu_ptr(&softnet_data); + unsigned long time_limit = jiffies + 2; +@@ -5245,7 +5245,7 @@ void netdev_upper_dev_unlink(struct net_device *dev, + } + EXPORT_SYMBOL(netdev_upper_dev_unlink); + +-void netdev_adjacent_add_links(struct net_device *dev) ++static void netdev_adjacent_add_links(struct net_device *dev) + { + struct netdev_adjacent *iter; + +@@ -5270,7 +5270,7 @@ void netdev_adjacent_add_links(struct net_device *dev) + } + } + +-void netdev_adjacent_del_links(struct net_device *dev) ++static void netdev_adjacent_del_links(struct net_device *dev) + { + struct netdev_adjacent *iter; + +@@ -6555,8 +6555,8 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev, + } else { + netdev_stats_to_stats64(storage, &dev->stats); + } +- storage->rx_dropped += atomic_long_read(&dev->rx_dropped); +- storage->tx_dropped += atomic_long_read(&dev->tx_dropped); ++ storage->rx_dropped += atomic_long_read_unchecked(&dev->rx_dropped); ++ storage->tx_dropped += atomic_long_read_unchecked(&dev->tx_dropped); + return storage; + } + EXPORT_SYMBOL(dev_get_stats); +@@ -6572,7 +6572,7 @@ struct netdev_queue *dev_ingress_queue_create(struct net_device *dev) + if (!queue) + return NULL; + netdev_init_one_queue(dev, queue, NULL); +- queue->qdisc = &noop_qdisc; ++ RCU_INIT_POINTER(queue->qdisc, &noop_qdisc); + queue->qdisc_sleeping = &noop_qdisc; + rcu_assign_pointer(dev->ingress_queue, queue); + #endif +diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c +index 72e899a..79a9409 100644 +--- a/net/core/dev_ioctl.c ++++ b/net/core/dev_ioctl.c +@@ -365,8 +365,13 @@ void dev_load(struct net *net, const char *name) + no_module = !dev; + if (no_module && capable(CAP_NET_ADMIN)) + no_module = request_module("netdev-%s", name); +- if (no_module && capable(CAP_SYS_MODULE)) ++ if (no_module && capable(CAP_SYS_MODULE)) { ++#ifdef CONFIG_GRKERNSEC_MODHARDEN ++ ___request_module(true, "grsec_modharden_netdev", "%s", name); ++#else + request_module("%s", name); ++#endif ++ } + } + EXPORT_SYMBOL(dev_load); + +diff --git a/net/core/filter.c b/net/core/filter.c +index 647b122..18a7ff6 100644 +--- a/net/core/filter.c ++++ b/net/core/filter.c +@@ -532,7 +532,11 @@ do_pass: + + /* Unkown instruction. */ + default: +- goto err; ++ WARN(1, KERN_ALERT "Unknown sock filter code:%u jt:%u tf:%u k:%u\n", ++ fp->code, fp->jt, fp->jf, fp->k); ++ kfree(addrs); ++ BUG(); ++ return -EINVAL; + } + + insn++; +@@ -576,7 +580,7 @@ static int check_load_and_stores(const struct sock_filter *filter, int flen) + u16 *masks, memvalid = 0; /* One bit per cell, 16 cells */ + int pc, ret = 0; + +- BUILD_BUG_ON(BPF_MEMWORDS > 16); ++ BUILD_BUG_ON(BPF_MEMWORDS != 16); + + masks = kmalloc_array(flen, sizeof(*masks), GFP_KERNEL); + if (!masks) +@@ -987,7 +991,7 @@ int bpf_prog_create(struct bpf_prog **pfp, struct sock_fprog_kern *fprog) + if (!fp) + return -ENOMEM; + +- memcpy(fp->insns, fprog->filter, fsize); ++ memcpy(fp->insns, (void __force_kernel *)fprog->filter, fsize); + + fp->len = fprog->len; + /* Since unattached filters are not copied back to user +diff --git a/net/core/flow.c b/net/core/flow.c +index 1033725..340f65d 100644 +--- a/net/core/flow.c ++++ b/net/core/flow.c +@@ -65,7 +65,7 @@ static void flow_cache_new_hashrnd(unsigned long arg) + static int flow_entry_valid(struct flow_cache_entry *fle, + struct netns_xfrm *xfrm) + { +- if (atomic_read(&xfrm->flow_cache_genid) != fle->genid) ++ if (atomic_read_unchecked(&xfrm->flow_cache_genid) != fle->genid) + return 0; + if (fle->object && !fle->object->ops->check(fle->object)) + return 0; +@@ -242,7 +242,7 @@ flow_cache_lookup(struct net *net, const struct flowi *key, u16 family, u8 dir, + hlist_add_head(&fle->u.hlist, &fcp->hash_table[hash]); + fcp->hash_count++; + } +- } else if (likely(fle->genid == atomic_read(&net->xfrm.flow_cache_genid))) { ++ } else if (likely(fle->genid == atomic_read_unchecked(&net->xfrm.flow_cache_genid))) { + flo = fle->object; + if (!flo) + goto ret_object; +@@ -263,7 +263,7 @@ nocache: + } + flo = resolver(net, key, family, dir, flo, ctx); + if (fle) { +- fle->genid = atomic_read(&net->xfrm.flow_cache_genid); ++ fle->genid = atomic_read_unchecked(&net->xfrm.flow_cache_genid); + if (!IS_ERR(flo)) + fle->object = flo; + else +diff --git a/net/core/iovec.c b/net/core/iovec.c +index e1ec45a..e5c6f16 100644 +--- a/net/core/iovec.c ++++ b/net/core/iovec.c +@@ -42,7 +42,7 @@ int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *a + if (m->msg_name && m->msg_namelen) { + if (mode == VERIFY_READ) { + void __user *namep; +- namep = (void __user __force *) m->msg_name; ++ namep = (void __force_user *) m->msg_name; + err = move_addr_to_kernel(namep, m->msg_namelen, + address); + if (err < 0) +@@ -55,7 +55,7 @@ int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr_storage *a + } + + size = m->msg_iovlen * sizeof(struct iovec); +- if (copy_from_user(iov, (void __user __force *) m->msg_iov, size)) ++ if (copy_from_user(iov, (void __force_user *) m->msg_iov, size)) + return -EFAULT; + + m->msg_iov = iov; +diff --git a/net/core/neighbour.c b/net/core/neighbour.c +index ef31fef..8be66d9 100644 +--- a/net/core/neighbour.c ++++ b/net/core/neighbour.c +@@ -2825,7 +2825,7 @@ static int proc_unres_qlen(struct ctl_table *ctl, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { + int size, ret; +- struct ctl_table tmp = *ctl; ++ ctl_table_no_const tmp = *ctl; + + tmp.extra1 = &zero; + tmp.extra2 = &unres_qlen_max; +@@ -2887,7 +2887,7 @@ static int neigh_proc_dointvec_zero_intmax(struct ctl_table *ctl, int write, + void __user *buffer, + size_t *lenp, loff_t *ppos) + { +- struct ctl_table tmp = *ctl; ++ ctl_table_no_const tmp = *ctl; + int ret; + + tmp.extra1 = &zero; +diff --git a/net/core/net-procfs.c b/net/core/net-procfs.c +index 2bf8329..2eb1423 100644 +--- a/net/core/net-procfs.c ++++ b/net/core/net-procfs.c +@@ -79,7 +79,13 @@ static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev) + struct rtnl_link_stats64 temp; + const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp); + +- seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu " ++ if (gr_proc_is_restricted()) ++ seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu " ++ "%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n", ++ dev->name, 0ULL, 0ULL, 0ULL, 0ULL, 0ULL, 0ULL, 0ULL, 0ULL, 0ULL, 0ULL, ++ 0ULL, 0ULL, 0ULL, 0ULL, 0ULL, 0ULL); ++ else ++ seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu " + "%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n", + dev->name, stats->rx_bytes, stats->rx_packets, + stats->rx_errors, +@@ -166,7 +172,7 @@ static int softnet_seq_show(struct seq_file *seq, void *v) + return 0; + } + +-static const struct seq_operations dev_seq_ops = { ++const struct seq_operations dev_seq_ops = { + .start = dev_seq_start, + .next = dev_seq_next, + .stop = dev_seq_stop, +@@ -196,7 +202,7 @@ static const struct seq_operations softnet_seq_ops = { + + static int softnet_seq_open(struct inode *inode, struct file *file) + { +- return seq_open(file, &softnet_seq_ops); ++ return seq_open_restrict(file, &softnet_seq_ops); + } + + static const struct file_operations softnet_seq_fops = { +@@ -283,8 +289,13 @@ static int ptype_seq_show(struct seq_file *seq, void *v) + else + seq_printf(seq, "%04x", ntohs(pt->type)); + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ seq_printf(seq, " %-8s %pf\n", ++ pt->dev ? pt->dev->name : "", NULL); ++#else + seq_printf(seq, " %-8s %pf\n", + pt->dev ? pt->dev->name : "", pt->func); ++#endif + } + + return 0; +diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c +index 9dd0669..c52fb1b 100644 +--- a/net/core/net-sysfs.c ++++ b/net/core/net-sysfs.c +@@ -278,7 +278,7 @@ static ssize_t carrier_changes_show(struct device *dev, + { + struct net_device *netdev = to_net_dev(dev); + return sprintf(buf, fmt_dec, +- atomic_read(&netdev->carrier_changes)); ++ atomic_read_unchecked(&netdev->carrier_changes)); + } + static DEVICE_ATTR_RO(carrier_changes); + +diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c +index 7f15517..f7d65c0 100644 +--- a/net/core/net_namespace.c ++++ b/net/core/net_namespace.c +@@ -445,7 +445,7 @@ static int __register_pernet_operations(struct list_head *list, + int error; + LIST_HEAD(net_exit_list); + +- list_add_tail(&ops->list, list); ++ pax_list_add_tail((struct list_head *)&ops->list, list); + if (ops->init || (ops->id && ops->size)) { + for_each_net(net) { + error = ops_init(ops, net); +@@ -458,7 +458,7 @@ static int __register_pernet_operations(struct list_head *list, + + out_undo: + /* If I have an error cleanup all namespaces I initialized */ +- list_del(&ops->list); ++ pax_list_del((struct list_head *)&ops->list); + ops_exit_list(ops, &net_exit_list); + ops_free_list(ops, &net_exit_list); + return error; +@@ -469,7 +469,7 @@ static void __unregister_pernet_operations(struct pernet_operations *ops) + struct net *net; + LIST_HEAD(net_exit_list); + +- list_del(&ops->list); ++ pax_list_del((struct list_head *)&ops->list); + for_each_net(net) + list_add_tail(&net->exit_list, &net_exit_list); + ops_exit_list(ops, &net_exit_list); +@@ -603,7 +603,7 @@ int register_pernet_device(struct pernet_operations *ops) + mutex_lock(&net_mutex); + error = register_pernet_operations(&pernet_list, ops); + if (!error && (first_device == &pernet_list)) +- first_device = &ops->list; ++ first_device = (struct list_head *)&ops->list; + mutex_unlock(&net_mutex); + return error; + } +diff --git a/net/core/netpoll.c b/net/core/netpoll.c +index e0ad5d1..04fa7f7 100644 +--- a/net/core/netpoll.c ++++ b/net/core/netpoll.c +@@ -377,7 +377,7 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len) + struct udphdr *udph; + struct iphdr *iph; + struct ethhdr *eth; +- static atomic_t ip_ident; ++ static atomic_unchecked_t ip_ident; + struct ipv6hdr *ip6h; + + udp_len = len + sizeof(*udph); +@@ -448,7 +448,7 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len) + put_unaligned(0x45, (unsigned char *)iph); + iph->tos = 0; + put_unaligned(htons(ip_len), &(iph->tot_len)); +- iph->id = htons(atomic_inc_return(&ip_ident)); ++ iph->id = htons(atomic_inc_return_unchecked(&ip_ident)); + iph->frag_off = 0; + iph->ttl = 64; + iph->protocol = IPPROTO_UDP; +diff --git a/net/core/pktgen.c b/net/core/pktgen.c +index 0b320d9..c0238b9 100644 +--- a/net/core/pktgen.c ++++ b/net/core/pktgen.c +@@ -3756,7 +3756,7 @@ static int __net_init pg_net_init(struct net *net) + pn->net = net; + INIT_LIST_HEAD(&pn->pktgen_threads); + pn->pktgen_exiting = false; +- pn->proc_dir = proc_mkdir(PG_PROC_DIR, pn->net->proc_net); ++ pn->proc_dir = proc_mkdir_restrict(PG_PROC_DIR, pn->net->proc_net); + if (!pn->proc_dir) { + pr_warn("cannot create /proc/net/%s\n", PG_PROC_DIR); + return -ENODEV; +diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c +index c522f7a..45b88358 100644 +--- a/net/core/rtnetlink.c ++++ b/net/core/rtnetlink.c +@@ -58,7 +58,7 @@ struct rtnl_link { + rtnl_doit_func doit; + rtnl_dumpit_func dumpit; + rtnl_calcit_func calcit; +-}; ++} __no_const; + + static DEFINE_MUTEX(rtnl_mutex); + +@@ -304,10 +304,13 @@ int __rtnl_link_register(struct rtnl_link_ops *ops) + * to use the ops for creating device. So do not + * fill up dellink as well. That disables rtnl_dellink. + */ +- if (ops->setup && !ops->dellink) +- ops->dellink = unregister_netdevice_queue; ++ if (ops->setup && !ops->dellink) { ++ pax_open_kernel(); ++ *(void **)&ops->dellink = unregister_netdevice_queue; ++ pax_close_kernel(); ++ } + +- list_add_tail(&ops->list, &link_ops); ++ pax_list_add_tail((struct list_head *)&ops->list, &link_ops); + return 0; + } + EXPORT_SYMBOL_GPL(__rtnl_link_register); +@@ -354,7 +357,7 @@ void __rtnl_link_unregister(struct rtnl_link_ops *ops) + for_each_net(net) { + __rtnl_kill_links(net, ops); + } +- list_del(&ops->list); ++ pax_list_del((struct list_head *)&ops->list); + } + EXPORT_SYMBOL_GPL(__rtnl_link_unregister); + +@@ -1014,7 +1017,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, + (dev->ifalias && + nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)) || + nla_put_u32(skb, IFLA_CARRIER_CHANGES, +- atomic_read(&dev->carrier_changes))) ++ atomic_read_unchecked(&dev->carrier_changes))) + goto nla_put_failure; + + if (1) { +@@ -2069,6 +2072,10 @@ replay: + if (IS_ERR(dest_net)) + return PTR_ERR(dest_net); + ++ err = -EPERM; ++ if (!netlink_ns_capable(skb, dest_net->user_ns, CAP_NET_ADMIN)) ++ goto out; ++ + dev = rtnl_create_link(dest_net, ifname, name_assign_type, ops, tb); + if (IS_ERR(dev)) { + err = PTR_ERR(dev); +diff --git a/net/core/scm.c b/net/core/scm.c +index b442e7e..6f5b5a2 100644 +--- a/net/core/scm.c ++++ b/net/core/scm.c +@@ -210,7 +210,7 @@ EXPORT_SYMBOL(__scm_send); + int put_cmsg(struct msghdr * msg, int level, int type, int len, void *data) + { + struct cmsghdr __user *cm +- = (__force struct cmsghdr __user *)msg->msg_control; ++ = (struct cmsghdr __force_user *)msg->msg_control; + struct cmsghdr cmhdr; + int cmlen = CMSG_LEN(len); + int err; +@@ -233,7 +233,7 @@ int put_cmsg(struct msghdr * msg, int level, int type, int len, void *data) + err = -EFAULT; + if (copy_to_user(cm, &cmhdr, sizeof cmhdr)) + goto out; +- if (copy_to_user(CMSG_DATA(cm), data, cmlen - sizeof(struct cmsghdr))) ++ if (copy_to_user((void __force_user *)CMSG_DATA((void __force_kernel *)cm), data, cmlen - sizeof(struct cmsghdr))) + goto out; + cmlen = CMSG_SPACE(len); + if (msg->msg_controllen < cmlen) +@@ -249,7 +249,7 @@ EXPORT_SYMBOL(put_cmsg); + void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm) + { + struct cmsghdr __user *cm +- = (__force struct cmsghdr __user*)msg->msg_control; ++ = (struct cmsghdr __force_user *)msg->msg_control; + + int fdmax = 0; + int fdnum = scm->fp->count; +@@ -269,7 +269,7 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm) + if (fdnum < fdmax) + fdmax = fdnum; + +- for (i=0, cmfptr=(__force int __user *)CMSG_DATA(cm); i<fdmax; ++ for (i=0, cmfptr=(int __force_user *)CMSG_DATA((void __force_kernel *)cm); i<fdmax; + i++, cmfptr++) + { + struct socket *sock; +diff --git a/net/core/skbuff.c b/net/core/skbuff.c +index 17fd8dc..e2ece2f 100644 +--- a/net/core/skbuff.c ++++ b/net/core/skbuff.c +@@ -2025,7 +2025,7 @@ EXPORT_SYMBOL(__skb_checksum); + __wsum skb_checksum(const struct sk_buff *skb, int offset, + int len, __wsum csum) + { +- const struct skb_checksum_ops ops = { ++ static const struct skb_checksum_ops ops = { + .update = csum_partial_ext, + .combine = csum_block_add_ext, + }; +@@ -3255,12 +3255,14 @@ void __init skb_init(void) + skbuff_head_cache = kmem_cache_create("skbuff_head_cache", + sizeof(struct sk_buff), + 0, +- SLAB_HWCACHE_ALIGN|SLAB_PANIC, ++ SLAB_HWCACHE_ALIGN|SLAB_PANIC| ++ SLAB_NO_SANITIZE, + NULL); + skbuff_fclone_cache = kmem_cache_create("skbuff_fclone_cache", + sizeof(struct sk_buff_fclones), + 0, +- SLAB_HWCACHE_ALIGN|SLAB_PANIC, ++ SLAB_HWCACHE_ALIGN|SLAB_PANIC| ++ SLAB_NO_SANITIZE, + NULL); + } + +diff --git a/net/core/sock.c b/net/core/sock.c +index 852acbc..4431aed 100644 +--- a/net/core/sock.c ++++ b/net/core/sock.c +@@ -441,7 +441,7 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) + struct sk_buff_head *list = &sk->sk_receive_queue; + + if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + trace_sock_rcvqueue_full(sk, skb); + return -ENOMEM; + } +@@ -451,7 +451,7 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) + return err; + + if (!sk_rmem_schedule(sk, skb, skb->truesize)) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + return -ENOBUFS; + } + +@@ -464,7 +464,7 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) + skb_dst_force(skb); + + spin_lock_irqsave(&list->lock, flags); +- skb->dropcount = atomic_read(&sk->sk_drops); ++ skb->dropcount = atomic_read_unchecked(&sk->sk_drops); + __skb_queue_tail(list, skb); + spin_unlock_irqrestore(&list->lock, flags); + +@@ -484,7 +484,7 @@ int sk_receive_skb(struct sock *sk, struct sk_buff *skb, const int nested) + skb->dev = NULL; + + if (sk_rcvqueues_full(sk, sk->sk_rcvbuf)) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + goto discard_and_relse; + } + if (nested) +@@ -502,7 +502,7 @@ int sk_receive_skb(struct sock *sk, struct sk_buff *skb, const int nested) + mutex_release(&sk->sk_lock.dep_map, 1, _RET_IP_); + } else if (sk_add_backlog(sk, skb, sk->sk_rcvbuf)) { + bh_unlock_sock(sk); +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + goto discard_and_relse; + } + +@@ -1010,12 +1010,12 @@ int sock_getsockopt(struct socket *sock, int level, int optname, + struct timeval tm; + } v; + +- int lv = sizeof(int); +- int len; ++ unsigned int lv = sizeof(int); ++ unsigned int len; + + if (get_user(len, optlen)) + return -EFAULT; +- if (len < 0) ++ if (len > INT_MAX) + return -EINVAL; + + memset(&v, 0, sizeof(v)); +@@ -1153,11 +1153,11 @@ int sock_getsockopt(struct socket *sock, int level, int optname, + + case SO_PEERNAME: + { +- char address[128]; ++ char address[_K_SS_MAXSIZE]; + + if (sock->ops->getname(sock, (struct sockaddr *)address, &lv, 2)) + return -ENOTCONN; +- if (lv < len) ++ if (lv < len || sizeof address < len) + return -EINVAL; + if (copy_to_user(optval, address, len)) + return -EFAULT; +@@ -1238,7 +1238,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, + + if (len > lv) + len = lv; +- if (copy_to_user(optval, &v, len)) ++ if (len > sizeof(v) || copy_to_user(optval, &v, len)) + return -EFAULT; + lenout: + if (put_user(len, optlen)) +@@ -2334,7 +2334,7 @@ void sock_init_data(struct socket *sock, struct sock *sk) + */ + smp_wmb(); + atomic_set(&sk->sk_refcnt, 1); +- atomic_set(&sk->sk_drops, 0); ++ atomic_set_unchecked(&sk->sk_drops, 0); + } + EXPORT_SYMBOL(sock_init_data); + +@@ -2462,6 +2462,7 @@ void sock_enable_timestamp(struct sock *sk, int flag) + int sock_recv_errqueue(struct sock *sk, struct msghdr *msg, int len, + int level, int type) + { ++ struct sock_extended_err ee; + struct sock_exterr_skb *serr; + struct sk_buff *skb; + int copied, err; +@@ -2483,7 +2484,8 @@ int sock_recv_errqueue(struct sock *sk, struct msghdr *msg, int len, + sock_recv_timestamp(msg, sk, skb); + + serr = SKB_EXT_ERR(skb); +- put_cmsg(msg, level, type, sizeof(serr->ee), &serr->ee); ++ ee = serr->ee; ++ put_cmsg(msg, level, type, sizeof ee, &ee); + + msg->msg_flags |= MSG_ERRQUEUE; + err = copied; +diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c +index ad704c7..ca48aff 100644 +--- a/net/core/sock_diag.c ++++ b/net/core/sock_diag.c +@@ -9,26 +9,33 @@ + #include <linux/inet_diag.h> + #include <linux/sock_diag.h> + +-static const struct sock_diag_handler *sock_diag_handlers[AF_MAX]; ++static const struct sock_diag_handler *sock_diag_handlers[AF_MAX] __read_only; + static int (*inet_rcv_compat)(struct sk_buff *skb, struct nlmsghdr *nlh); + static DEFINE_MUTEX(sock_diag_table_mutex); + + int sock_diag_check_cookie(void *sk, __u32 *cookie) + { ++#ifndef CONFIG_GRKERNSEC_HIDESYM + if ((cookie[0] != INET_DIAG_NOCOOKIE || + cookie[1] != INET_DIAG_NOCOOKIE) && + ((u32)(unsigned long)sk != cookie[0] || + (u32)((((unsigned long)sk) >> 31) >> 1) != cookie[1])) + return -ESTALE; + else ++#endif + return 0; + } + EXPORT_SYMBOL_GPL(sock_diag_check_cookie); + + void sock_diag_save_cookie(void *sk, __u32 *cookie) + { ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ cookie[0] = 0; ++ cookie[1] = 0; ++#else + cookie[0] = (u32)(unsigned long)sk; + cookie[1] = (u32)(((unsigned long)sk >> 31) >> 1); ++#endif + } + EXPORT_SYMBOL_GPL(sock_diag_save_cookie); + +@@ -110,8 +117,11 @@ int sock_diag_register(const struct sock_diag_handler *hndl) + mutex_lock(&sock_diag_table_mutex); + if (sock_diag_handlers[hndl->family]) + err = -EBUSY; +- else ++ else { ++ pax_open_kernel(); + sock_diag_handlers[hndl->family] = hndl; ++ pax_close_kernel(); ++ } + mutex_unlock(&sock_diag_table_mutex); + + return err; +@@ -127,7 +137,9 @@ void sock_diag_unregister(const struct sock_diag_handler *hnld) + + mutex_lock(&sock_diag_table_mutex); + BUG_ON(sock_diag_handlers[family] != hnld); ++ pax_open_kernel(); + sock_diag_handlers[family] = NULL; ++ pax_close_kernel(); + mutex_unlock(&sock_diag_table_mutex); + } + EXPORT_SYMBOL_GPL(sock_diag_unregister); +diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c +index e731c96..d0a5412 100644 +--- a/net/core/sysctl_net_core.c ++++ b/net/core/sysctl_net_core.c +@@ -34,7 +34,7 @@ static int rps_sock_flow_sysctl(struct ctl_table *table, int write, + { + unsigned int orig_size, size; + int ret, i; +- struct ctl_table tmp = { ++ ctl_table_no_const tmp = { + .data = &size, + .maxlen = sizeof(size), + .mode = table->mode +@@ -202,7 +202,7 @@ static int set_default_qdisc(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { + char id[IFNAMSIZ]; +- struct ctl_table tbl = { ++ ctl_table_no_const tbl = { + .data = id, + .maxlen = IFNAMSIZ, + }; +@@ -265,7 +265,7 @@ static struct ctl_table net_core_table[] = { + .mode = 0644, + .proc_handler = proc_dointvec + }, +-#ifdef CONFIG_BPF_JIT ++#if defined(CONFIG_BPF_JIT) && !defined(CONFIG_GRKERNSEC_BPF_HARDEN) + { + .procname = "bpf_jit_enable", + .data = &bpf_jit_enable, +@@ -381,13 +381,12 @@ static struct ctl_table netns_core_table[] = { + + static __net_init int sysctl_core_net_init(struct net *net) + { +- struct ctl_table *tbl; ++ ctl_table_no_const *tbl = NULL; + + net->core.sysctl_somaxconn = SOMAXCONN; + +- tbl = netns_core_table; + if (!net_eq(net, &init_net)) { +- tbl = kmemdup(tbl, sizeof(netns_core_table), GFP_KERNEL); ++ tbl = kmemdup(netns_core_table, sizeof(netns_core_table), GFP_KERNEL); + if (tbl == NULL) + goto err_dup; + +@@ -397,17 +396,16 @@ static __net_init int sysctl_core_net_init(struct net *net) + if (net->user_ns != &init_user_ns) { + tbl[0].procname = NULL; + } +- } +- +- net->core.sysctl_hdr = register_net_sysctl(net, "net/core", tbl); ++ net->core.sysctl_hdr = register_net_sysctl(net, "net/core", tbl); ++ } else ++ net->core.sysctl_hdr = register_net_sysctl(net, "net/core", netns_core_table); + if (net->core.sysctl_hdr == NULL) + goto err_reg; + + return 0; + + err_reg: +- if (tbl != netns_core_table) +- kfree(tbl); ++ kfree(tbl); + err_dup: + return -ENOMEM; + } +@@ -422,7 +420,7 @@ static __net_exit void sysctl_core_net_exit(struct net *net) + kfree(tbl); + } + +-static __net_initdata struct pernet_operations sysctl_core_ops = { ++static __net_initconst struct pernet_operations sysctl_core_ops = { + .init = sysctl_core_net_init, + .exit = sysctl_core_net_exit, + }; +diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c +index 25733d5..b9360f0 100644 +--- a/net/decnet/af_decnet.c ++++ b/net/decnet/af_decnet.c +@@ -466,6 +466,7 @@ static struct proto dn_proto = { + .sysctl_rmem = sysctl_decnet_rmem, + .max_header = DN_MAX_NSP_DATA_HEADER + 64, + .obj_size = sizeof(struct dn_sock), ++ .slab_flags = SLAB_USERCOPY, + }; + + static struct sock *dn_alloc_sock(struct net *net, struct socket *sock, gfp_t gfp) +diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c +index 4400da7..3429972 100644 +--- a/net/decnet/dn_dev.c ++++ b/net/decnet/dn_dev.c +@@ -201,7 +201,7 @@ static struct dn_dev_sysctl_table { + .extra1 = &min_t3, + .extra2 = &max_t3 + }, +- {0} ++ { } + }, + }; + +diff --git a/net/decnet/sysctl_net_decnet.c b/net/decnet/sysctl_net_decnet.c +index 5325b54..a0d4d69 100644 +--- a/net/decnet/sysctl_net_decnet.c ++++ b/net/decnet/sysctl_net_decnet.c +@@ -174,7 +174,7 @@ static int dn_node_address_handler(struct ctl_table *table, int write, + + if (len > *lenp) len = *lenp; + +- if (copy_to_user(buffer, addr, len)) ++ if (len > sizeof addr || copy_to_user(buffer, addr, len)) + return -EFAULT; + + *lenp = len; +@@ -237,7 +237,7 @@ static int dn_def_dev_handler(struct ctl_table *table, int write, + + if (len > *lenp) len = *lenp; + +- if (copy_to_user(buffer, devname, len)) ++ if (len > sizeof devname || copy_to_user(buffer, devname, len)) + return -EFAULT; + + *lenp = len; +diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c +index a2c7e4c..3dc9f67 100644 +--- a/net/hsr/hsr_netlink.c ++++ b/net/hsr/hsr_netlink.c +@@ -102,7 +102,7 @@ nla_put_failure: + return -EMSGSIZE; + } + +-static struct rtnl_link_ops hsr_link_ops __read_mostly = { ++static struct rtnl_link_ops hsr_link_ops = { + .kind = "hsr", + .maxtype = IFLA_HSR_MAX, + .policy = hsr_policy, +diff --git a/net/ieee802154/6lowpan_rtnl.c b/net/ieee802154/6lowpan_rtnl.c +index 4413629..dea596a 100644 +--- a/net/ieee802154/6lowpan_rtnl.c ++++ b/net/ieee802154/6lowpan_rtnl.c +@@ -635,7 +635,7 @@ static void lowpan_dellink(struct net_device *dev, struct list_head *head) + dev_put(real_dev); + } + +-static struct rtnl_link_ops lowpan_link_ops __read_mostly = { ++static struct rtnl_link_ops lowpan_link_ops = { + .kind = "lowpan", + .priv_size = sizeof(struct lowpan_dev_info), + .setup = lowpan_setup, +diff --git a/net/ieee802154/reassembly.c b/net/ieee802154/reassembly.c +index 7cfcd68..84ca5b7 100644 +--- a/net/ieee802154/reassembly.c ++++ b/net/ieee802154/reassembly.c +@@ -433,14 +433,13 @@ static struct ctl_table lowpan_frags_ctl_table[] = { + + static int __net_init lowpan_frags_ns_sysctl_register(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table = NULL; + struct ctl_table_header *hdr; + struct netns_ieee802154_lowpan *ieee802154_lowpan = + net_ieee802154_lowpan(net); + +- table = lowpan_frags_ns_ctl_table; + if (!net_eq(net, &init_net)) { +- table = kmemdup(table, sizeof(lowpan_frags_ns_ctl_table), ++ table = kmemdup(lowpan_frags_ns_ctl_table, sizeof(lowpan_frags_ns_ctl_table), + GFP_KERNEL); + if (table == NULL) + goto err_alloc; +@@ -455,9 +454,9 @@ static int __net_init lowpan_frags_ns_sysctl_register(struct net *net) + /* Don't export sysctls to unprivileged users */ + if (net->user_ns != &init_user_ns) + table[0].procname = NULL; +- } +- +- hdr = register_net_sysctl(net, "net/ieee802154/6lowpan", table); ++ hdr = register_net_sysctl(net, "net/ieee802154/6lowpan", table); ++ } else ++ hdr = register_net_sysctl(net, "net/ieee802154/6lowpan", lowpan_frags_ns_ctl_table); + if (hdr == NULL) + goto err_reg; + +@@ -465,8 +464,7 @@ static int __net_init lowpan_frags_ns_sysctl_register(struct net *net) + return 0; + + err_reg: +- if (!net_eq(net, &init_net)) +- kfree(table); ++ kfree(table); + err_alloc: + return -ENOMEM; + } +diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c +index e67da4e..da217942 100644 +--- a/net/ipv4/af_inet.c ++++ b/net/ipv4/af_inet.c +@@ -1392,7 +1392,7 @@ int inet_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) + return ip_recv_error(sk, msg, len, addr_len); + #if IS_ENABLED(CONFIG_IPV6) + if (sk->sk_family == AF_INET6) +- return pingv6_ops.ipv6_recv_error(sk, msg, len, addr_len); ++ return pingv6_ops->ipv6_recv_error(sk, msg, len, addr_len); + #endif + return -EINVAL; + } +diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c +index 214882e..ec032f6 100644 +--- a/net/ipv4/devinet.c ++++ b/net/ipv4/devinet.c +@@ -69,7 +69,8 @@ + + static struct ipv4_devconf ipv4_devconf = { + .data = { +- [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1, ++ [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 0, ++ [IPV4_DEVCONF_RP_FILTER - 1] = 1, + [IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1, + [IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1, + [IPV4_DEVCONF_SHARED_MEDIA - 1] = 1, +@@ -80,7 +81,8 @@ static struct ipv4_devconf ipv4_devconf = { + + static struct ipv4_devconf ipv4_devconf_dflt = { + .data = { +- [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1, ++ [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 0, ++ [IPV4_DEVCONF_RP_FILTER - 1] = 1, + [IPV4_DEVCONF_SEND_REDIRECTS - 1] = 1, + [IPV4_DEVCONF_SECURE_REDIRECTS - 1] = 1, + [IPV4_DEVCONF_SHARED_MEDIA - 1] = 1, +@@ -1548,7 +1550,7 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) + idx = 0; + head = &net->dev_index_head[h]; + rcu_read_lock(); +- cb->seq = atomic_read(&net->ipv4.dev_addr_genid) ^ ++ cb->seq = atomic_read_unchecked(&net->ipv4.dev_addr_genid) ^ + net->dev_base_seq; + hlist_for_each_entry_rcu(dev, head, index_hlist) { + if (idx < s_idx) +@@ -1866,7 +1868,7 @@ static int inet_netconf_dump_devconf(struct sk_buff *skb, + idx = 0; + head = &net->dev_index_head[h]; + rcu_read_lock(); +- cb->seq = atomic_read(&net->ipv4.dev_addr_genid) ^ ++ cb->seq = atomic_read_unchecked(&net->ipv4.dev_addr_genid) ^ + net->dev_base_seq; + hlist_for_each_entry_rcu(dev, head, index_hlist) { + if (idx < s_idx) +@@ -2101,7 +2103,7 @@ static int ipv4_doint_and_flush(struct ctl_table *ctl, int write, + #define DEVINET_SYSCTL_FLUSHING_ENTRY(attr, name) \ + DEVINET_SYSCTL_COMPLEX_ENTRY(attr, name, ipv4_doint_and_flush) + +-static struct devinet_sysctl_table { ++static const struct devinet_sysctl_table { + struct ctl_table_header *sysctl_header; + struct ctl_table devinet_vars[__IPV4_DEVCONF_MAX]; + } devinet_sysctl = { +@@ -2233,7 +2235,7 @@ static __net_init int devinet_init_net(struct net *net) + int err; + struct ipv4_devconf *all, *dflt; + #ifdef CONFIG_SYSCTL +- struct ctl_table *tbl = ctl_forward_entry; ++ ctl_table_no_const *tbl = NULL; + struct ctl_table_header *forw_hdr; + #endif + +@@ -2251,7 +2253,7 @@ static __net_init int devinet_init_net(struct net *net) + goto err_alloc_dflt; + + #ifdef CONFIG_SYSCTL +- tbl = kmemdup(tbl, sizeof(ctl_forward_entry), GFP_KERNEL); ++ tbl = kmemdup(ctl_forward_entry, sizeof(ctl_forward_entry), GFP_KERNEL); + if (tbl == NULL) + goto err_alloc_ctl; + +@@ -2271,7 +2273,10 @@ static __net_init int devinet_init_net(struct net *net) + goto err_reg_dflt; + + err = -ENOMEM; +- forw_hdr = register_net_sysctl(net, "net/ipv4", tbl); ++ if (!net_eq(net, &init_net)) ++ forw_hdr = register_net_sysctl(net, "net/ipv4", tbl); ++ else ++ forw_hdr = register_net_sysctl(net, "net/ipv4", ctl_forward_entry); + if (forw_hdr == NULL) + goto err_reg_ctl; + net->ipv4.forw_hdr = forw_hdr; +@@ -2287,8 +2292,7 @@ err_reg_ctl: + err_reg_dflt: + __devinet_sysctl_unregister(all); + err_reg_all: +- if (tbl != ctl_forward_entry) +- kfree(tbl); ++ kfree(tbl); + err_alloc_ctl: + #endif + if (dflt != &ipv4_devconf_dflt) +diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c +index 23104a3..9f5570b 100644 +--- a/net/ipv4/fib_frontend.c ++++ b/net/ipv4/fib_frontend.c +@@ -1017,12 +1017,12 @@ static int fib_inetaddr_event(struct notifier_block *this, unsigned long event, + #ifdef CONFIG_IP_ROUTE_MULTIPATH + fib_sync_up(dev); + #endif +- atomic_inc(&net->ipv4.dev_addr_genid); ++ atomic_inc_unchecked(&net->ipv4.dev_addr_genid); + rt_cache_flush(dev_net(dev)); + break; + case NETDEV_DOWN: + fib_del_ifaddr(ifa, NULL); +- atomic_inc(&net->ipv4.dev_addr_genid); ++ atomic_inc_unchecked(&net->ipv4.dev_addr_genid); + if (ifa->ifa_dev->ifa_list == NULL) { + /* Last address was deleted from this interface. + * Disable IP. +@@ -1060,7 +1060,7 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo + #ifdef CONFIG_IP_ROUTE_MULTIPATH + fib_sync_up(dev); + #endif +- atomic_inc(&net->ipv4.dev_addr_genid); ++ atomic_inc_unchecked(&net->ipv4.dev_addr_genid); + rt_cache_flush(net); + break; + case NETDEV_DOWN: +diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c +index f99f41b..1879da9 100644 +--- a/net/ipv4/fib_semantics.c ++++ b/net/ipv4/fib_semantics.c +@@ -770,7 +770,7 @@ __be32 fib_info_update_nh_saddr(struct net *net, struct fib_nh *nh) + nh->nh_saddr = inet_select_addr(nh->nh_dev, + nh->nh_gw, + nh->nh_parent->fib_scope); +- nh->nh_saddr_genid = atomic_read(&net->ipv4.dev_addr_genid); ++ nh->nh_saddr_genid = atomic_read_unchecked(&net->ipv4.dev_addr_genid); + + return nh->nh_saddr; + } +diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c +index 9111a4e..3576905 100644 +--- a/net/ipv4/inet_hashtables.c ++++ b/net/ipv4/inet_hashtables.c +@@ -18,6 +18,7 @@ + #include <linux/sched.h> + #include <linux/slab.h> + #include <linux/wait.h> ++#include <linux/security.h> + + #include <net/inet_connection_sock.h> + #include <net/inet_hashtables.h> +@@ -49,6 +50,8 @@ static unsigned int inet_sk_ehashfn(const struct sock *sk) + return inet_ehashfn(net, laddr, lport, faddr, fport); + } + ++extern void gr_update_task_in_ip_table(const struct inet_sock *inet); ++ + /* + * Allocate and initialize a new local port bind bucket. + * The bindhash mutex for snum's hash chain must be held here. +@@ -554,6 +557,8 @@ ok: + twrefcnt += inet_twsk_bind_unhash(tw, hinfo); + spin_unlock(&head->lock); + ++ gr_update_task_in_ip_table(inet_sk(sk)); ++ + if (tw) { + inet_twsk_deschedule(tw, death_row); + while (twrefcnt) { +diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c +index 241afd7..31b95d5 100644 +--- a/net/ipv4/inetpeer.c ++++ b/net/ipv4/inetpeer.c +@@ -461,7 +461,7 @@ relookup: + if (p) { + p->daddr = *daddr; + atomic_set(&p->refcnt, 1); +- atomic_set(&p->rid, 0); ++ atomic_set_unchecked(&p->rid, 0); + p->metrics[RTAX_LOCK-1] = INETPEER_METRICS_NEW; + p->rate_tokens = 0; + /* 60*HZ is arbitrary, but chosen enough high so that the first +diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c +index b48e03cd6..8aa3ac6 100644 +--- a/net/ipv4/ip_fragment.c ++++ b/net/ipv4/ip_fragment.c +@@ -268,7 +268,7 @@ static inline int ip_frag_too_far(struct ipq *qp) + return 0; + + start = qp->rid; +- end = atomic_inc_return(&peer->rid); ++ end = atomic_inc_return_unchecked(&peer->rid); + qp->rid = end; + + rc = qp->q.fragments && (end - start) > max; +@@ -749,12 +749,11 @@ static struct ctl_table ip4_frags_ctl_table[] = { + + static int __net_init ip4_frags_ns_ctl_register(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table = NULL; + struct ctl_table_header *hdr; + +- table = ip4_frags_ns_ctl_table; + if (!net_eq(net, &init_net)) { +- table = kmemdup(table, sizeof(ip4_frags_ns_ctl_table), GFP_KERNEL); ++ table = kmemdup(ip4_frags_ns_ctl_table, sizeof(ip4_frags_ns_ctl_table), GFP_KERNEL); + if (table == NULL) + goto err_alloc; + +@@ -768,9 +767,10 @@ static int __net_init ip4_frags_ns_ctl_register(struct net *net) + /* Don't export sysctls to unprivileged users */ + if (net->user_ns != &init_user_ns) + table[0].procname = NULL; +- } ++ hdr = register_net_sysctl(net, "net/ipv4", table); ++ } else ++ hdr = register_net_sysctl(net, "net/ipv4", ip4_frags_ns_ctl_table); + +- hdr = register_net_sysctl(net, "net/ipv4", table); + if (hdr == NULL) + goto err_reg; + +@@ -778,8 +778,7 @@ static int __net_init ip4_frags_ns_ctl_register(struct net *net) + return 0; + + err_reg: +- if (!net_eq(net, &init_net)) +- kfree(table); ++ kfree(table); + err_alloc: + return -ENOMEM; + } +diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c +index 69aaf0a..8298c029 100644 +--- a/net/ipv4/ip_gre.c ++++ b/net/ipv4/ip_gre.c +@@ -115,7 +115,7 @@ static bool log_ecn_error = true; + module_param(log_ecn_error, bool, 0644); + MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN"); + +-static struct rtnl_link_ops ipgre_link_ops __read_mostly; ++static struct rtnl_link_ops ipgre_link_ops; + static int ipgre_tunnel_init(struct net_device *dev); + + static int ipgre_net_id __read_mostly; +@@ -816,7 +816,7 @@ static const struct nla_policy ipgre_policy[IFLA_GRE_MAX + 1] = { + [IFLA_GRE_ENCAP_DPORT] = { .type = NLA_U16 }, + }; + +-static struct rtnl_link_ops ipgre_link_ops __read_mostly = { ++static struct rtnl_link_ops ipgre_link_ops = { + .kind = "gre", + .maxtype = IFLA_GRE_MAX, + .policy = ipgre_policy, +@@ -830,7 +830,7 @@ static struct rtnl_link_ops ipgre_link_ops __read_mostly = { + .fill_info = ipgre_fill_info, + }; + +-static struct rtnl_link_ops ipgre_tap_ops __read_mostly = { ++static struct rtnl_link_ops ipgre_tap_ops = { + .kind = "gretap", + .maxtype = IFLA_GRE_MAX, + .policy = ipgre_policy, +diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c +index 3d4da2c..40f9c29 100644 +--- a/net/ipv4/ip_input.c ++++ b/net/ipv4/ip_input.c +@@ -147,6 +147,10 @@ + #include <linux/mroute.h> + #include <linux/netlink.h> + ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++extern int grsec_enable_blackhole; ++#endif ++ + /* + * Process Router Attention IP option (RFC 2113) + */ +@@ -223,6 +227,9 @@ static int ip_local_deliver_finish(struct sk_buff *skb) + if (!raw) { + if (xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) { + IP_INC_STATS_BH(net, IPSTATS_MIB_INUNKNOWNPROTOS); ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole || (skb->dev->flags & IFF_LOOPBACK)) ++#endif + icmp_send(skb, ICMP_DEST_UNREACH, + ICMP_PROT_UNREACH, 0); + } +diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c +index 046fce0..4b28126 100644 +--- a/net/ipv4/ip_sockglue.c ++++ b/net/ipv4/ip_sockglue.c +@@ -1173,7 +1173,8 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname, + len = min_t(unsigned int, len, opt->optlen); + if (put_user(len, optlen)) + return -EFAULT; +- if (copy_to_user(optval, opt->__data, len)) ++ if ((len > (sizeof(optbuf) - sizeof(struct ip_options))) || ++ copy_to_user(optval, opt->__data, len)) + return -EFAULT; + return 0; + } +@@ -1304,7 +1305,7 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname, + if (sk->sk_type != SOCK_STREAM) + return -ENOPROTOOPT; + +- msg.msg_control = (__force void *) optval; ++ msg.msg_control = (__force_kernel void *) optval; + msg.msg_controllen = len; + msg.msg_flags = flags; + +diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c +index 1a7e979..fd05aa4 100644 +--- a/net/ipv4/ip_vti.c ++++ b/net/ipv4/ip_vti.c +@@ -45,7 +45,7 @@ + #include <net/net_namespace.h> + #include <net/netns/generic.h> + +-static struct rtnl_link_ops vti_link_ops __read_mostly; ++static struct rtnl_link_ops vti_link_ops; + + static int vti_net_id __read_mostly; + static int vti_tunnel_init(struct net_device *dev); +@@ -519,7 +519,7 @@ static const struct nla_policy vti_policy[IFLA_VTI_MAX + 1] = { + [IFLA_VTI_REMOTE] = { .len = FIELD_SIZEOF(struct iphdr, daddr) }, + }; + +-static struct rtnl_link_ops vti_link_ops __read_mostly = { ++static struct rtnl_link_ops vti_link_ops = { + .kind = "vti", + .maxtype = IFLA_VTI_MAX, + .policy = vti_policy, +diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c +index 648fa14..97864d0 100644 +--- a/net/ipv4/ipconfig.c ++++ b/net/ipv4/ipconfig.c +@@ -333,7 +333,7 @@ static int __init ic_devinet_ioctl(unsigned int cmd, struct ifreq *arg) + + mm_segment_t oldfs = get_fs(); + set_fs(get_ds()); +- res = devinet_ioctl(&init_net, cmd, (struct ifreq __user *) arg); ++ res = devinet_ioctl(&init_net, cmd, (struct ifreq __force_user *) arg); + set_fs(oldfs); + return res; + } +@@ -344,7 +344,7 @@ static int __init ic_dev_ioctl(unsigned int cmd, struct ifreq *arg) + + mm_segment_t oldfs = get_fs(); + set_fs(get_ds()); +- res = dev_ioctl(&init_net, cmd, (struct ifreq __user *) arg); ++ res = dev_ioctl(&init_net, cmd, (struct ifreq __force_user *) arg); + set_fs(oldfs); + return res; + } +@@ -355,7 +355,7 @@ static int __init ic_route_ioctl(unsigned int cmd, struct rtentry *arg) + + mm_segment_t oldfs = get_fs(); + set_fs(get_ds()); +- res = ip_rt_ioctl(&init_net, cmd, (void __user *) arg); ++ res = ip_rt_ioctl(&init_net, cmd, (void __force_user *) arg); + set_fs(oldfs); + return res; + } +diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c +index 37096d6..86abb03 100644 +--- a/net/ipv4/ipip.c ++++ b/net/ipv4/ipip.c +@@ -124,7 +124,7 @@ MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN"); + static int ipip_net_id __read_mostly; + + static int ipip_tunnel_init(struct net_device *dev); +-static struct rtnl_link_ops ipip_link_ops __read_mostly; ++static struct rtnl_link_ops ipip_link_ops; + + static int ipip_err(struct sk_buff *skb, u32 info) + { +@@ -487,7 +487,7 @@ static const struct nla_policy ipip_policy[IFLA_IPTUN_MAX + 1] = { + [IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 }, + }; + +-static struct rtnl_link_ops ipip_link_ops __read_mostly = { ++static struct rtnl_link_ops ipip_link_ops = { + .kind = "ipip", + .maxtype = IFLA_IPTUN_MAX, + .policy = ipip_policy, +diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c +index f95b6f9..2ee2097 100644 +--- a/net/ipv4/netfilter/arp_tables.c ++++ b/net/ipv4/netfilter/arp_tables.c +@@ -885,14 +885,14 @@ static int compat_table_info(const struct xt_table_info *info, + #endif + + static int get_info(struct net *net, void __user *user, +- const int *len, int compat) ++ int len, int compat) + { + char name[XT_TABLE_MAXNAMELEN]; + struct xt_table *t; + int ret; + +- if (*len != sizeof(struct arpt_getinfo)) { +- duprintf("length %u != %Zu\n", *len, ++ if (len != sizeof(struct arpt_getinfo)) { ++ duprintf("length %u != %Zu\n", len, + sizeof(struct arpt_getinfo)); + return -EINVAL; + } +@@ -929,7 +929,7 @@ static int get_info(struct net *net, void __user *user, + info.size = private->size; + strcpy(info.name, name); + +- if (copy_to_user(user, &info, *len) != 0) ++ if (copy_to_user(user, &info, len) != 0) + ret = -EFAULT; + else + ret = 0; +@@ -1690,7 +1690,7 @@ static int compat_do_arpt_get_ctl(struct sock *sk, int cmd, void __user *user, + + switch (cmd) { + case ARPT_SO_GET_INFO: +- ret = get_info(sock_net(sk), user, len, 1); ++ ret = get_info(sock_net(sk), user, *len, 1); + break; + case ARPT_SO_GET_ENTRIES: + ret = compat_get_entries(sock_net(sk), user, len); +@@ -1735,7 +1735,7 @@ static int do_arpt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len + + switch (cmd) { + case ARPT_SO_GET_INFO: +- ret = get_info(sock_net(sk), user, len, 0); ++ ret = get_info(sock_net(sk), user, *len, 0); + break; + + case ARPT_SO_GET_ENTRIES: +diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c +index 99e810f..3711b81 100644 +--- a/net/ipv4/netfilter/ip_tables.c ++++ b/net/ipv4/netfilter/ip_tables.c +@@ -1073,14 +1073,14 @@ static int compat_table_info(const struct xt_table_info *info, + #endif + + static int get_info(struct net *net, void __user *user, +- const int *len, int compat) ++ int len, int compat) + { + char name[XT_TABLE_MAXNAMELEN]; + struct xt_table *t; + int ret; + +- if (*len != sizeof(struct ipt_getinfo)) { +- duprintf("length %u != %zu\n", *len, ++ if (len != sizeof(struct ipt_getinfo)) { ++ duprintf("length %u != %zu\n", len, + sizeof(struct ipt_getinfo)); + return -EINVAL; + } +@@ -1117,7 +1117,7 @@ static int get_info(struct net *net, void __user *user, + info.size = private->size; + strcpy(info.name, name); + +- if (copy_to_user(user, &info, *len) != 0) ++ if (copy_to_user(user, &info, len) != 0) + ret = -EFAULT; + else + ret = 0; +@@ -1973,7 +1973,7 @@ compat_do_ipt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) + + switch (cmd) { + case IPT_SO_GET_INFO: +- ret = get_info(sock_net(sk), user, len, 1); ++ ret = get_info(sock_net(sk), user, *len, 1); + break; + case IPT_SO_GET_ENTRIES: + ret = compat_get_entries(sock_net(sk), user, len); +@@ -2020,7 +2020,7 @@ do_ipt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) + + switch (cmd) { + case IPT_SO_GET_INFO: +- ret = get_info(sock_net(sk), user, len, 0); ++ ret = get_info(sock_net(sk), user, *len, 0); + break; + + case IPT_SO_GET_ENTRIES: +diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c +index e90f83a..3e6acca 100644 +--- a/net/ipv4/netfilter/ipt_CLUSTERIP.c ++++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c +@@ -720,7 +720,7 @@ static int clusterip_net_init(struct net *net) + spin_lock_init(&cn->lock); + + #ifdef CONFIG_PROC_FS +- cn->procdir = proc_mkdir("ipt_CLUSTERIP", net->proc_net); ++ cn->procdir = proc_mkdir_restrict("ipt_CLUSTERIP", net->proc_net); + if (!cn->procdir) { + pr_err("Unable to proc dir entry\n"); + return -ENOMEM; +diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c +index a5c49d6..d39b267 100644 +--- a/net/ipv4/ping.c ++++ b/net/ipv4/ping.c +@@ -59,7 +59,7 @@ struct ping_table { + }; + + static struct ping_table ping_table; +-struct pingv6_ops pingv6_ops; ++struct pingv6_ops *pingv6_ops; + EXPORT_SYMBOL_GPL(pingv6_ops); + + static u16 ping_port_rover; +@@ -158,6 +158,7 @@ void ping_unhash(struct sock *sk) + if (sk_hashed(sk)) { + write_lock_bh(&ping_table.lock); + hlist_nulls_del(&sk->sk_nulls_node); ++ sk_nulls_node_init(&sk->sk_nulls_node); + sock_put(sk); + isk->inet_num = 0; + isk->inet_sport = 0; +@@ -358,7 +359,7 @@ static int ping_check_bind_addr(struct sock *sk, struct inet_sock *isk, + return -ENODEV; + } + } +- has_addr = pingv6_ops.ipv6_chk_addr(net, &addr->sin6_addr, dev, ++ has_addr = pingv6_ops->ipv6_chk_addr(net, &addr->sin6_addr, dev, + scoped); + rcu_read_unlock(); + +@@ -566,7 +567,7 @@ void ping_err(struct sk_buff *skb, int offset, u32 info) + } + #if IS_ENABLED(CONFIG_IPV6) + } else if (skb->protocol == htons(ETH_P_IPV6)) { +- harderr = pingv6_ops.icmpv6_err_convert(type, code, &err); ++ harderr = pingv6_ops->icmpv6_err_convert(type, code, &err); + #endif + } + +@@ -584,7 +585,7 @@ void ping_err(struct sk_buff *skb, int offset, u32 info) + info, (u8 *)icmph); + #if IS_ENABLED(CONFIG_IPV6) + } else if (family == AF_INET6) { +- pingv6_ops.ipv6_icmp_error(sk, skb, err, 0, ++ pingv6_ops->ipv6_icmp_error(sk, skb, err, 0, + info, (u8 *)icmph); + #endif + } +@@ -918,10 +919,10 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, + } + + if (inet6_sk(sk)->rxopt.all) +- pingv6_ops.ip6_datagram_recv_common_ctl(sk, msg, skb); ++ pingv6_ops->ip6_datagram_recv_common_ctl(sk, msg, skb); + if (skb->protocol == htons(ETH_P_IPV6) && + inet6_sk(sk)->rxopt.all) +- pingv6_ops.ip6_datagram_recv_specific_ctl(sk, msg, skb); ++ pingv6_ops->ip6_datagram_recv_specific_ctl(sk, msg, skb); + else if (skb->protocol == htons(ETH_P_IP) && isk->cmsg_flags) + ip_cmsg_recv(msg, skb); + #endif +@@ -1116,7 +1117,7 @@ static void ping_v4_format_sock(struct sock *sp, struct seq_file *f, + from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)), + 0, sock_i_ino(sp), + atomic_read(&sp->sk_refcnt), sp, +- atomic_read(&sp->sk_drops)); ++ atomic_read_unchecked(&sp->sk_drops)); + } + + static int ping_v4_seq_show(struct seq_file *seq, void *v) +diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c +index 739db31..74f0210 100644 +--- a/net/ipv4/raw.c ++++ b/net/ipv4/raw.c +@@ -314,7 +314,7 @@ static int raw_rcv_skb(struct sock *sk, struct sk_buff *skb) + int raw_rcv(struct sock *sk, struct sk_buff *skb) + { + if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + kfree_skb(skb); + return NET_RX_DROP; + } +@@ -755,16 +755,20 @@ static int raw_init(struct sock *sk) + + static int raw_seticmpfilter(struct sock *sk, char __user *optval, int optlen) + { ++ struct icmp_filter filter; ++ + if (optlen > sizeof(struct icmp_filter)) + optlen = sizeof(struct icmp_filter); +- if (copy_from_user(&raw_sk(sk)->filter, optval, optlen)) ++ if (copy_from_user(&filter, optval, optlen)) + return -EFAULT; ++ raw_sk(sk)->filter = filter; + return 0; + } + + static int raw_geticmpfilter(struct sock *sk, char __user *optval, int __user *optlen) + { + int len, ret = -EFAULT; ++ struct icmp_filter filter; + + if (get_user(len, optlen)) + goto out; +@@ -774,8 +778,8 @@ static int raw_geticmpfilter(struct sock *sk, char __user *optval, int __user *o + if (len > sizeof(struct icmp_filter)) + len = sizeof(struct icmp_filter); + ret = -EFAULT; +- if (put_user(len, optlen) || +- copy_to_user(optval, &raw_sk(sk)->filter, len)) ++ filter = raw_sk(sk)->filter; ++ if (put_user(len, optlen) || len > sizeof filter || copy_to_user(optval, &filter, len)) + goto out; + ret = 0; + out: return ret; +@@ -1004,7 +1008,7 @@ static void raw_sock_seq_show(struct seq_file *seq, struct sock *sp, int i) + 0, 0L, 0, + from_kuid_munged(seq_user_ns(seq), sock_i_uid(sp)), + 0, sock_i_ino(sp), +- atomic_read(&sp->sk_refcnt), sp, atomic_read(&sp->sk_drops)); ++ atomic_read(&sp->sk_refcnt), sp, atomic_read_unchecked(&sp->sk_drops)); + } + + static int raw_seq_show(struct seq_file *seq, void *v) +diff --git a/net/ipv4/route.c b/net/ipv4/route.c +index d58dd0e..47de388 100644 +--- a/net/ipv4/route.c ++++ b/net/ipv4/route.c +@@ -228,7 +228,7 @@ static const struct seq_operations rt_cache_seq_ops = { + + static int rt_cache_seq_open(struct inode *inode, struct file *file) + { +- return seq_open(file, &rt_cache_seq_ops); ++ return seq_open_restrict(file, &rt_cache_seq_ops); + } + + static const struct file_operations rt_cache_seq_fops = { +@@ -319,7 +319,7 @@ static const struct seq_operations rt_cpu_seq_ops = { + + static int rt_cpu_seq_open(struct inode *inode, struct file *file) + { +- return seq_open(file, &rt_cpu_seq_ops); ++ return seq_open_restrict(file, &rt_cpu_seq_ops); + } + + static const struct file_operations rt_cpu_seq_fops = { +@@ -357,7 +357,7 @@ static int rt_acct_proc_show(struct seq_file *m, void *v) + + static int rt_acct_proc_open(struct inode *inode, struct file *file) + { +- return single_open(file, rt_acct_proc_show, NULL); ++ return single_open_restrict(file, rt_acct_proc_show, NULL); + } + + static const struct file_operations rt_acct_proc_fops = { +@@ -459,11 +459,11 @@ static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst, + + #define IP_IDENTS_SZ 2048u + struct ip_ident_bucket { +- atomic_t id; ++ atomic_unchecked_t id; + u32 stamp32; + }; + +-static struct ip_ident_bucket *ip_idents __read_mostly; ++static struct ip_ident_bucket ip_idents[IP_IDENTS_SZ] __read_mostly; + + /* In order to protect privacy, we add a perturbation to identifiers + * if one generator is seldom used. This makes hard for an attacker +@@ -479,7 +479,7 @@ u32 ip_idents_reserve(u32 hash, int segs) + if (old != now && cmpxchg(&bucket->stamp32, old, now) == old) + delta = prandom_u32_max(now - old); + +- return atomic_add_return(segs + delta, &bucket->id) - segs; ++ return atomic_add_return_unchecked(segs + delta, &bucket->id) - segs; + } + EXPORT_SYMBOL(ip_idents_reserve); + +@@ -2625,34 +2625,34 @@ static struct ctl_table ipv4_route_flush_table[] = { + .maxlen = sizeof(int), + .mode = 0200, + .proc_handler = ipv4_sysctl_rtcache_flush, ++ .extra1 = &init_net, + }, + { }, + }; + + static __net_init int sysctl_route_net_init(struct net *net) + { +- struct ctl_table *tbl; ++ ctl_table_no_const *tbl = NULL; + +- tbl = ipv4_route_flush_table; + if (!net_eq(net, &init_net)) { +- tbl = kmemdup(tbl, sizeof(ipv4_route_flush_table), GFP_KERNEL); ++ tbl = kmemdup(ipv4_route_flush_table, sizeof(ipv4_route_flush_table), GFP_KERNEL); + if (tbl == NULL) + goto err_dup; + + /* Don't export sysctls to unprivileged users */ + if (net->user_ns != &init_user_ns) + tbl[0].procname = NULL; +- } +- tbl[0].extra1 = net; ++ tbl[0].extra1 = net; ++ net->ipv4.route_hdr = register_net_sysctl(net, "net/ipv4/route", tbl); ++ } else ++ net->ipv4.route_hdr = register_net_sysctl(net, "net/ipv4/route", ipv4_route_flush_table); + +- net->ipv4.route_hdr = register_net_sysctl(net, "net/ipv4/route", tbl); + if (net->ipv4.route_hdr == NULL) + goto err_reg; + return 0; + + err_reg: +- if (tbl != ipv4_route_flush_table) +- kfree(tbl); ++ kfree(tbl); + err_dup: + return -ENOMEM; + } +@@ -2675,8 +2675,8 @@ static __net_initdata struct pernet_operations sysctl_route_ops = { + + static __net_init int rt_genid_init(struct net *net) + { +- atomic_set(&net->ipv4.rt_genid, 0); +- atomic_set(&net->fnhe_genid, 0); ++ atomic_set_unchecked(&net->ipv4.rt_genid, 0); ++ atomic_set_unchecked(&net->fnhe_genid, 0); + get_random_bytes(&net->ipv4.dev_addr_genid, + sizeof(net->ipv4.dev_addr_genid)); + return 0; +@@ -2719,11 +2719,7 @@ int __init ip_rt_init(void) + { + int rc = 0; + +- ip_idents = kmalloc(IP_IDENTS_SZ * sizeof(*ip_idents), GFP_KERNEL); +- if (!ip_idents) +- panic("IP: failed to allocate ip_idents\n"); +- +- prandom_bytes(ip_idents, IP_IDENTS_SZ * sizeof(*ip_idents)); ++ prandom_bytes(ip_idents, sizeof(ip_idents)); + + #ifdef CONFIG_IP_ROUTE_CLASSID + ip_rt_acct = __alloc_percpu(256 * sizeof(struct ip_rt_acct), __alignof__(struct ip_rt_acct)); +diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c +index b3c53c8..35cc18d 100644 +--- a/net/ipv4/sysctl_net_ipv4.c ++++ b/net/ipv4/sysctl_net_ipv4.c +@@ -60,7 +60,7 @@ static int ipv4_local_port_range(struct ctl_table *table, int write, + container_of(table->data, struct net, ipv4.ip_local_ports.range); + int ret; + int range[2]; +- struct ctl_table tmp = { ++ ctl_table_no_const tmp = { + .data = &range, + .maxlen = sizeof(range), + .mode = table->mode, +@@ -118,7 +118,7 @@ static int ipv4_ping_group_range(struct ctl_table *table, int write, + int ret; + gid_t urange[2]; + kgid_t low, high; +- struct ctl_table tmp = { ++ ctl_table_no_const tmp = { + .data = &urange, + .maxlen = sizeof(urange), + .mode = table->mode, +@@ -149,7 +149,7 @@ static int proc_tcp_congestion_control(struct ctl_table *ctl, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { + char val[TCP_CA_NAME_MAX]; +- struct ctl_table tbl = { ++ ctl_table_no_const tbl = { + .data = val, + .maxlen = TCP_CA_NAME_MAX, + }; +@@ -168,7 +168,7 @@ static int proc_tcp_available_congestion_control(struct ctl_table *ctl, + void __user *buffer, size_t *lenp, + loff_t *ppos) + { +- struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, }; ++ ctl_table_no_const tbl = { .maxlen = TCP_CA_BUF_MAX, }; + int ret; + + tbl.data = kmalloc(tbl.maxlen, GFP_USER); +@@ -185,7 +185,7 @@ static int proc_allowed_congestion_control(struct ctl_table *ctl, + void __user *buffer, size_t *lenp, + loff_t *ppos) + { +- struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX }; ++ ctl_table_no_const tbl = { .maxlen = TCP_CA_BUF_MAX }; + int ret; + + tbl.data = kmalloc(tbl.maxlen, GFP_USER); +@@ -204,7 +204,7 @@ static int proc_tcp_fastopen_key(struct ctl_table *ctl, int write, + void __user *buffer, size_t *lenp, + loff_t *ppos) + { +- struct ctl_table tbl = { .maxlen = (TCP_FASTOPEN_KEY_LENGTH * 2 + 10) }; ++ ctl_table_no_const tbl = { .maxlen = (TCP_FASTOPEN_KEY_LENGTH * 2 + 10) }; + struct tcp_fastopen_context *ctxt; + int ret; + u32 user_key[4]; /* 16 bytes, matching TCP_FASTOPEN_KEY_LENGTH */ +@@ -874,13 +874,12 @@ static struct ctl_table ipv4_net_table[] = { + + static __net_init int ipv4_sysctl_init_net(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table = NULL; + +- table = ipv4_net_table; + if (!net_eq(net, &init_net)) { + int i; + +- table = kmemdup(table, sizeof(ipv4_net_table), GFP_KERNEL); ++ table = kmemdup(ipv4_net_table, sizeof(ipv4_net_table), GFP_KERNEL); + if (table == NULL) + goto err_alloc; + +@@ -889,7 +888,10 @@ static __net_init int ipv4_sysctl_init_net(struct net *net) + table[i].data += (void *)net - (void *)&init_net; + } + +- net->ipv4.ipv4_hdr = register_net_sysctl(net, "net/ipv4", table); ++ if (!net_eq(net, &init_net)) ++ net->ipv4.ipv4_hdr = register_net_sysctl(net, "net/ipv4", table); ++ else ++ net->ipv4.ipv4_hdr = register_net_sysctl(net, "net/ipv4", ipv4_net_table); + if (net->ipv4.ipv4_hdr == NULL) + goto err_reg; + +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index 38c2bcb..3d178a8 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -520,8 +520,10 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait) + + /* Race breaker. If space is freed after + * wspace test but before the flags are set, +- * IO signal will be lost. ++ * IO signal will be lost. Memory barrier ++ * pairs with the input side. + */ ++ smp_mb__after_atomic(); + if (sk_stream_is_writeable(sk)) + mask |= POLLOUT | POLLWRNORM; + } +diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c +index 6f46cde..a4a43d5 100644 +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -765,7 +765,7 @@ static void tcp_update_pacing_rate(struct sock *sk) + * without any lock. We want to make sure compiler wont store + * intermediate values in this location. + */ +- ACCESS_ONCE(sk->sk_pacing_rate) = min_t(u64, rate, ++ ACCESS_ONCE_RW(sk->sk_pacing_rate) = min_t(u64, rate, + sk->sk_max_pacing_rate); + } + +@@ -4528,7 +4528,7 @@ static struct sk_buff *tcp_collapse_one(struct sock *sk, struct sk_buff *skb, + * simplifies code) + */ + static void +-tcp_collapse(struct sock *sk, struct sk_buff_head *list, ++__intentional_overflow(5,6) tcp_collapse(struct sock *sk, struct sk_buff_head *list, + struct sk_buff *head, struct sk_buff *tail, + u32 start, u32 end) + { +@@ -4786,6 +4786,8 @@ static void tcp_check_space(struct sock *sk) + { + if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) { + sock_reset_flag(sk, SOCK_QUEUE_SHRUNK); ++ /* pairs with tcp_poll() */ ++ smp_mb__after_atomic(); + if (sk->sk_socket && + test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) + tcp_new_space(sk); +@@ -5507,6 +5509,7 @@ discard: + tcp_paws_reject(&tp->rx_opt, 0)) + goto discard_and_undo; + ++#ifndef CONFIG_GRKERNSEC_NO_SIMULT_CONNECT + if (th->syn) { + /* We see SYN without ACK. It is attempt of + * simultaneous connect with crossed SYNs. +@@ -5557,6 +5560,7 @@ discard: + goto discard; + #endif + } ++#endif + /* "fifth, if neither of the SYN or RST bits is set then + * drop the segment and return." + */ +@@ -5603,7 +5607,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, + goto discard; + + if (th->syn) { +- if (th->fin) ++ if (th->fin || th->urg || th->psh) + goto discard; + if (icsk->icsk_af_ops->conn_request(sk, skb) < 0) + return 1; +diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c +index a5fdfe9..c4b61d8 100644 +--- a/net/ipv4/tcp_ipv4.c ++++ b/net/ipv4/tcp_ipv4.c +@@ -89,6 +89,10 @@ int sysctl_tcp_tw_reuse __read_mostly; + int sysctl_tcp_low_latency __read_mostly; + EXPORT_SYMBOL(sysctl_tcp_low_latency); + ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++extern int grsec_enable_blackhole; ++#endif ++ + #ifdef CONFIG_TCP_MD5SIG + static int tcp_v4_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key, + __be32 daddr, __be32 saddr, const struct tcphdr *th); +@@ -1471,6 +1475,9 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) + return 0; + + reset: ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole) ++#endif + tcp_v4_send_reset(rsk, skb); + discard: + kfree_skb(skb); +@@ -1635,12 +1642,19 @@ int tcp_v4_rcv(struct sk_buff *skb) + TCP_SKB_CB(skb)->sacked = 0; + + sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest); +- if (!sk) ++ if (!sk) { ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ ret = 1; ++#endif + goto no_tcp_socket; +- ++ } + process: +- if (sk->sk_state == TCP_TIME_WAIT) ++ if (sk->sk_state == TCP_TIME_WAIT) { ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ ret = 2; ++#endif + goto do_time_wait; ++ } + + if (unlikely(iph->ttl < inet_sk(sk)->min_ttl)) { + NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP); +@@ -1696,6 +1710,10 @@ csum_error: + bad_packet: + TCP_INC_STATS_BH(net, TCP_MIB_INERRS); + } else { ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole || (ret == 1 && ++ (skb->dev->flags & IFF_LOOPBACK))) ++#endif + tcp_v4_send_reset(NULL, skb); + } + +diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c +index 63d2680..2db9d6b 100644 +--- a/net/ipv4/tcp_minisocks.c ++++ b/net/ipv4/tcp_minisocks.c +@@ -27,6 +27,10 @@ + #include <net/inet_common.h> + #include <net/xfrm.h> + ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++extern int grsec_enable_blackhole; ++#endif ++ + int sysctl_tcp_syncookies __read_mostly = 1; + EXPORT_SYMBOL(sysctl_tcp_syncookies); + +@@ -739,7 +743,10 @@ embryonic_reset: + * avoid becoming vulnerable to outside attack aiming at + * resetting legit local connections. + */ +- req->rsk_ops->send_reset(sk, skb); ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole) ++#endif ++ req->rsk_ops->send_reset(sk, skb); + } else if (fastopen) { /* received a valid RST pkt */ + reqsk_fastopen_remove(sk, req, true); + tcp_reset(sk); +diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c +index ebf5ff5..4d1ff32 100644 +--- a/net/ipv4/tcp_probe.c ++++ b/net/ipv4/tcp_probe.c +@@ -236,7 +236,7 @@ static ssize_t tcpprobe_read(struct file *file, char __user *buf, + if (cnt + width >= len) + break; + +- if (copy_to_user(buf + cnt, tbuf, width)) ++ if (width > sizeof tbuf || copy_to_user(buf + cnt, tbuf, width)) + return -EFAULT; + cnt += width; + } +diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c +index 9b21ae8..4eb67df 100644 +--- a/net/ipv4/tcp_timer.c ++++ b/net/ipv4/tcp_timer.c +@@ -22,6 +22,10 @@ + #include <linux/gfp.h> + #include <net/tcp.h> + ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++extern int grsec_lastack_retries; ++#endif ++ + int sysctl_tcp_syn_retries __read_mostly = TCP_SYN_RETRIES; + int sysctl_tcp_synack_retries __read_mostly = TCP_SYNACK_RETRIES; + int sysctl_tcp_keepalive_time __read_mostly = TCP_KEEPALIVE_TIME; +@@ -191,6 +195,13 @@ static int tcp_write_timeout(struct sock *sk) + } + } + ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if ((sk->sk_state == TCP_LAST_ACK) && ++ (grsec_lastack_retries > 0) && ++ (grsec_lastack_retries < retry_until)) ++ retry_until = grsec_lastack_retries; ++#endif ++ + if (retransmits_timed_out(sk, retry_until, + syn_set ? 0 : icsk->icsk_user_timeout, syn_set)) { + /* Has it gone just too far? */ +diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c +index cd0db54..93a6518 100644 +--- a/net/ipv4/udp.c ++++ b/net/ipv4/udp.c +@@ -87,6 +87,7 @@ + #include <linux/types.h> + #include <linux/fcntl.h> + #include <linux/module.h> ++#include <linux/security.h> + #include <linux/socket.h> + #include <linux/sockios.h> + #include <linux/igmp.h> +@@ -114,6 +115,10 @@ + #include <net/busy_poll.h> + #include "udp_impl.h" + ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++extern int grsec_enable_blackhole; ++#endif ++ + struct udp_table udp_table __read_mostly; + EXPORT_SYMBOL(udp_table); + +@@ -595,6 +600,9 @@ static inline bool __udp_is_mcast_sock(struct net *net, struct sock *sk, + return true; + } + ++extern int gr_search_udp_recvmsg(struct sock *sk, const struct sk_buff *skb); ++extern int gr_search_udp_sendmsg(struct sock *sk, struct sockaddr_in *addr); ++ + /* + * This routine is called by the ICMP module when it gets some + * sort of error condition. If err < 0 then the socket should +@@ -932,9 +940,18 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, + dport = usin->sin_port; + if (dport == 0) + return -EINVAL; ++ ++ err = gr_search_udp_sendmsg(sk, usin); ++ if (err) ++ return err; + } else { + if (sk->sk_state != TCP_ESTABLISHED) + return -EDESTADDRREQ; ++ ++ err = gr_search_udp_sendmsg(sk, NULL); ++ if (err) ++ return err; ++ + daddr = inet->inet_daddr; + dport = inet->inet_dport; + /* Open fast path for connected socket. +@@ -1182,7 +1199,7 @@ static unsigned int first_packet_length(struct sock *sk) + IS_UDPLITE(sk)); + UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, + IS_UDPLITE(sk)); +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + __skb_unlink(skb, rcvq); + __skb_queue_tail(&list_kill, skb); + } +@@ -1262,6 +1279,10 @@ try_again: + if (!skb) + goto out; + ++ err = gr_search_udp_recvmsg(sk, skb); ++ if (err) ++ goto out_free; ++ + ulen = skb->len - sizeof(struct udphdr); + copied = len; + if (copied > ulen) +@@ -1295,7 +1316,7 @@ try_again: + if (unlikely(err)) { + trace_kfree_skb(skb, udp_recvmsg); + if (!peeked) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + UDP_INC_STATS_USER(sock_net(sk), + UDP_MIB_INERRORS, is_udplite); + } +@@ -1592,7 +1613,7 @@ csum_error: + UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite); + drop: + UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite); +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + kfree_skb(skb); + return -1; + } +@@ -1611,7 +1632,7 @@ static void flush_stack(struct sock **stack, unsigned int count, + skb1 = (i == final) ? skb : skb_clone(skb, GFP_ATOMIC); + + if (!skb1) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS, + IS_UDPLITE(sk)); + UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, +@@ -1812,6 +1833,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, + goto csum_error; + + UDP_INC_STATS_BH(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE); ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole || (skb->dev->flags & IFF_LOOPBACK)) ++#endif + icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); + + /* +@@ -2398,7 +2422,7 @@ static void udp4_format_sock(struct sock *sp, struct seq_file *f, + from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)), + 0, sock_i_ino(sp), + atomic_read(&sp->sk_refcnt), sp, +- atomic_read(&sp->sk_drops)); ++ atomic_read_unchecked(&sp->sk_drops)); + } + + int udp4_seq_show(struct seq_file *seq, void *v) +diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c +index 6156f68..d6ab46d 100644 +--- a/net/ipv4/xfrm4_policy.c ++++ b/net/ipv4/xfrm4_policy.c +@@ -186,11 +186,11 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) + fl4->flowi4_tos = iph->tos; + } + +-static inline int xfrm4_garbage_collect(struct dst_ops *ops) ++static int xfrm4_garbage_collect(struct dst_ops *ops) + { + struct net *net = container_of(ops, struct net, xfrm.xfrm4_dst_ops); + +- xfrm4_policy_afinfo.garbage_collect(net); ++ xfrm_garbage_collect_deferred(net); + return (dst_entries_get_slow(ops) > ops->gc_thresh * 2); + } + +@@ -269,19 +269,18 @@ static struct ctl_table xfrm4_policy_table[] = { + + static int __net_init xfrm4_net_init(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table = NULL; + struct ctl_table_header *hdr; + +- table = xfrm4_policy_table; + if (!net_eq(net, &init_net)) { +- table = kmemdup(table, sizeof(xfrm4_policy_table), GFP_KERNEL); ++ table = kmemdup(xfrm4_policy_table, sizeof(xfrm4_policy_table), GFP_KERNEL); + if (!table) + goto err_alloc; + + table[0].data = &net->xfrm.xfrm4_dst_ops.gc_thresh; +- } +- +- hdr = register_net_sysctl(net, "net/ipv4", table); ++ hdr = register_net_sysctl(net, "net/ipv4", table); ++ } else ++ hdr = register_net_sysctl(net, "net/ipv4", xfrm4_policy_table); + if (!hdr) + goto err_reg; + +@@ -289,8 +288,7 @@ static int __net_init xfrm4_net_init(struct net *net) + return 0; + + err_reg: +- if (!net_eq(net, &init_net)) +- kfree(table); ++ kfree(table); + err_alloc: + return -ENOMEM; + } +diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c +index 17a0258..6f14338 100644 +--- a/net/ipv6/addrconf.c ++++ b/net/ipv6/addrconf.c +@@ -171,7 +171,7 @@ static struct ipv6_devconf ipv6_devconf __read_mostly = { + .hop_limit = IPV6_DEFAULT_HOPLIMIT, + .mtu6 = IPV6_MIN_MTU, + .accept_ra = 1, +- .accept_redirects = 1, ++ .accept_redirects = 0, + .autoconf = 1, + .force_mld_version = 0, + .mldv1_unsolicited_report_interval = 10 * HZ, +@@ -208,7 +208,7 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { + .hop_limit = IPV6_DEFAULT_HOPLIMIT, + .mtu6 = IPV6_MIN_MTU, + .accept_ra = 1, +- .accept_redirects = 1, ++ .accept_redirects = 0, + .autoconf = 1, + .force_mld_version = 0, + .mldv1_unsolicited_report_interval = 10 * HZ, +@@ -604,7 +604,7 @@ static int inet6_netconf_dump_devconf(struct sk_buff *skb, + idx = 0; + head = &net->dev_index_head[h]; + rcu_read_lock(); +- cb->seq = atomic_read(&net->ipv6.dev_addr_genid) ^ ++ cb->seq = atomic_read_unchecked(&net->ipv6.dev_addr_genid) ^ + net->dev_base_seq; + hlist_for_each_entry_rcu(dev, head, index_hlist) { + if (idx < s_idx) +@@ -2396,7 +2396,7 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg) + p.iph.ihl = 5; + p.iph.protocol = IPPROTO_IPV6; + p.iph.ttl = 64; +- ifr.ifr_ifru.ifru_data = (__force void __user *)&p; ++ ifr.ifr_ifru.ifru_data = (void __force_user *)&p; + + if (ops->ndo_do_ioctl) { + mm_segment_t oldfs = get_fs(); +@@ -3534,16 +3534,23 @@ static const struct file_operations if6_fops = { + .release = seq_release_net, + }; + ++extern void register_ipv6_seq_ops_addr(struct seq_operations *addr); ++extern void unregister_ipv6_seq_ops_addr(void); ++ + static int __net_init if6_proc_net_init(struct net *net) + { +- if (!proc_create("if_inet6", S_IRUGO, net->proc_net, &if6_fops)) ++ register_ipv6_seq_ops_addr(&if6_seq_ops); ++ if (!proc_create("if_inet6", S_IRUGO, net->proc_net, &if6_fops)) { ++ unregister_ipv6_seq_ops_addr(); + return -ENOMEM; ++ } + return 0; + } + + static void __net_exit if6_proc_net_exit(struct net *net) + { + remove_proc_entry("if_inet6", net->proc_net); ++ unregister_ipv6_seq_ops_addr(); + } + + static struct pernet_operations if6_proc_net_ops = { +@@ -4159,7 +4166,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, + s_ip_idx = ip_idx = cb->args[2]; + + rcu_read_lock(); +- cb->seq = atomic_read(&net->ipv6.dev_addr_genid) ^ net->dev_base_seq; ++ cb->seq = atomic_read_unchecked(&net->ipv6.dev_addr_genid) ^ net->dev_base_seq; + for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { + idx = 0; + head = &net->dev_index_head[h]; +@@ -4804,7 +4811,7 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) + rt_genid_bump_ipv6(net); + break; + } +- atomic_inc(&net->ipv6.dev_addr_genid); ++ atomic_inc_unchecked(&net->ipv6.dev_addr_genid); + } + + static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) +@@ -4824,7 +4831,7 @@ int addrconf_sysctl_forward(struct ctl_table *ctl, int write, + int *valp = ctl->data; + int val = *valp; + loff_t pos = *ppos; +- struct ctl_table lctl; ++ ctl_table_no_const lctl; + int ret; + + /* +@@ -4909,7 +4916,7 @@ int addrconf_sysctl_disable(struct ctl_table *ctl, int write, + int *valp = ctl->data; + int val = *valp; + loff_t pos = *ppos; +- struct ctl_table lctl; ++ ctl_table_no_const lctl; + int ret; + + /* +diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c +index e8c4400..a4cd5da 100644 +--- a/net/ipv6/af_inet6.c ++++ b/net/ipv6/af_inet6.c +@@ -766,7 +766,7 @@ static int __net_init inet6_net_init(struct net *net) + net->ipv6.sysctl.icmpv6_time = 1*HZ; + net->ipv6.sysctl.flowlabel_consistency = 1; + net->ipv6.sysctl.auto_flowlabels = 0; +- atomic_set(&net->ipv6.fib6_sernum, 1); ++ atomic_set_unchecked(&net->ipv6.fib6_sernum, 1); + + err = ipv6_init_mibs(net); + if (err) +diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c +index 11e3945..4f1b785 100644 +--- a/net/ipv6/datagram.c ++++ b/net/ipv6/datagram.c +@@ -924,5 +924,5 @@ void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, + 0, + sock_i_ino(sp), + atomic_read(&sp->sk_refcnt), sp, +- atomic_read(&sp->sk_drops)); ++ atomic_read_unchecked(&sp->sk_drops)); + } +diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c +index 97ae700..18dcae0 100644 +--- a/net/ipv6/icmp.c ++++ b/net/ipv6/icmp.c +@@ -997,7 +997,7 @@ static struct ctl_table ipv6_icmp_table_template[] = { + + struct ctl_table * __net_init ipv6_icmp_sysctl_init(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + + table = kmemdup(ipv6_icmp_table_template, + sizeof(ipv6_icmp_table_template), +diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c +index f1c6d5e..faabef6 100644 +--- a/net/ipv6/ip6_fib.c ++++ b/net/ipv6/ip6_fib.c +@@ -99,9 +99,9 @@ static int fib6_new_sernum(struct net *net) + int new, old; + + do { +- old = atomic_read(&net->ipv6.fib6_sernum); ++ old = atomic_read_unchecked(&net->ipv6.fib6_sernum); + new = old < INT_MAX ? old + 1 : 1; +- } while (atomic_cmpxchg(&net->ipv6.fib6_sernum, ++ } while (atomic_cmpxchg_unchecked(&net->ipv6.fib6_sernum, + old, new) != old); + return new; + } +diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c +index 0e32d2e..dd45cdc 100644 +--- a/net/ipv6/ip6_gre.c ++++ b/net/ipv6/ip6_gre.c +@@ -71,8 +71,8 @@ struct ip6gre_net { + struct net_device *fb_tunnel_dev; + }; + +-static struct rtnl_link_ops ip6gre_link_ops __read_mostly; +-static struct rtnl_link_ops ip6gre_tap_ops __read_mostly; ++static struct rtnl_link_ops ip6gre_link_ops; ++static struct rtnl_link_ops ip6gre_tap_ops; + static int ip6gre_tunnel_init(struct net_device *dev); + static void ip6gre_tunnel_setup(struct net_device *dev); + static void ip6gre_tunnel_link(struct ip6gre_net *ign, struct ip6_tnl *t); +@@ -417,7 +417,7 @@ static void ip6gre_err(struct sk_buff *skb, struct inet6_skb_parm *opt, + if (code == ICMPV6_HDR_FIELD) + teli = ip6_tnl_parse_tlv_enc_lim(skb, skb->data); + +- if (teli && teli == info - 2) { ++ if (teli && teli == be32_to_cpu(info) - 2) { + tel = (struct ipv6_tlv_tnl_enc_lim *) &skb->data[teli]; + if (tel->encap_limit == 0) { + net_warn_ratelimited("%s: Too small encapsulation limit or routing loop in tunnel!\n", +@@ -429,7 +429,7 @@ static void ip6gre_err(struct sk_buff *skb, struct inet6_skb_parm *opt, + } + break; + case ICMPV6_PKT_TOOBIG: +- mtu = info - offset; ++ mtu = be32_to_cpu(info) - offset; + if (mtu < IPV6_MIN_MTU) + mtu = IPV6_MIN_MTU; + t->dev->mtu = mtu; +@@ -1289,7 +1289,7 @@ static void ip6gre_fb_tunnel_init(struct net_device *dev) + } + + +-static struct inet6_protocol ip6gre_protocol __read_mostly = { ++static struct inet6_protocol ip6gre_protocol = { + .handler = ip6gre_rcv, + .err_handler = ip6gre_err, + .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, +@@ -1650,7 +1650,7 @@ static const struct nla_policy ip6gre_policy[IFLA_GRE_MAX + 1] = { + [IFLA_GRE_FLAGS] = { .type = NLA_U32 }, + }; + +-static struct rtnl_link_ops ip6gre_link_ops __read_mostly = { ++static struct rtnl_link_ops ip6gre_link_ops = { + .kind = "ip6gre", + .maxtype = IFLA_GRE_MAX, + .policy = ip6gre_policy, +@@ -1664,7 +1664,7 @@ static struct rtnl_link_ops ip6gre_link_ops __read_mostly = { + .fill_info = ip6gre_fill_info, + }; + +-static struct rtnl_link_ops ip6gre_tap_ops __read_mostly = { ++static struct rtnl_link_ops ip6gre_tap_ops = { + .kind = "ip6gretap", + .maxtype = IFLA_GRE_MAX, + .policy = ip6gre_policy, +diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c +index 9cb94cf..5678108 100644 +--- a/net/ipv6/ip6_tunnel.c ++++ b/net/ipv6/ip6_tunnel.c +@@ -86,7 +86,7 @@ static u32 HASH(const struct in6_addr *addr1, const struct in6_addr *addr2) + + static int ip6_tnl_dev_init(struct net_device *dev); + static void ip6_tnl_dev_setup(struct net_device *dev); +-static struct rtnl_link_ops ip6_link_ops __read_mostly; ++static struct rtnl_link_ops ip6_link_ops; + + static int ip6_tnl_net_id __read_mostly; + struct ip6_tnl_net { +@@ -1706,7 +1706,7 @@ static const struct nla_policy ip6_tnl_policy[IFLA_IPTUN_MAX + 1] = { + [IFLA_IPTUN_PROTO] = { .type = NLA_U8 }, + }; + +-static struct rtnl_link_ops ip6_link_ops __read_mostly = { ++static struct rtnl_link_ops ip6_link_ops = { + .kind = "ip6tnl", + .maxtype = IFLA_IPTUN_MAX, + .policy = ip6_tnl_policy, +diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c +index bcda14d..49378c9 100644 +--- a/net/ipv6/ip6_vti.c ++++ b/net/ipv6/ip6_vti.c +@@ -62,7 +62,7 @@ static u32 HASH(const struct in6_addr *addr1, const struct in6_addr *addr2) + + static int vti6_dev_init(struct net_device *dev); + static void vti6_dev_setup(struct net_device *dev); +-static struct rtnl_link_ops vti6_link_ops __read_mostly; ++static struct rtnl_link_ops vti6_link_ops; + + static int vti6_net_id __read_mostly; + struct vti6_net { +@@ -981,7 +981,7 @@ static const struct nla_policy vti6_policy[IFLA_VTI_MAX + 1] = { + [IFLA_VTI_OKEY] = { .type = NLA_U32 }, + }; + +-static struct rtnl_link_ops vti6_link_ops __read_mostly = { ++static struct rtnl_link_ops vti6_link_ops = { + .kind = "vti6", + .maxtype = IFLA_VTI_MAX, + .policy = vti6_policy, +diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c +index e1a9583..7dd8f4d 100644 +--- a/net/ipv6/ipv6_sockglue.c ++++ b/net/ipv6/ipv6_sockglue.c +@@ -993,7 +993,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, + if (sk->sk_type != SOCK_STREAM) + return -ENOPROTOOPT; + +- msg.msg_control = optval; ++ msg.msg_control = (void __force_kernel *)optval; + msg.msg_controllen = len; + msg.msg_flags = flags; + +diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c +index e080fbb..412b3cf 100644 +--- a/net/ipv6/netfilter/ip6_tables.c ++++ b/net/ipv6/netfilter/ip6_tables.c +@@ -1083,14 +1083,14 @@ static int compat_table_info(const struct xt_table_info *info, + #endif + + static int get_info(struct net *net, void __user *user, +- const int *len, int compat) ++ int len, int compat) + { + char name[XT_TABLE_MAXNAMELEN]; + struct xt_table *t; + int ret; + +- if (*len != sizeof(struct ip6t_getinfo)) { +- duprintf("length %u != %zu\n", *len, ++ if (len != sizeof(struct ip6t_getinfo)) { ++ duprintf("length %u != %zu\n", len, + sizeof(struct ip6t_getinfo)); + return -EINVAL; + } +@@ -1127,7 +1127,7 @@ static int get_info(struct net *net, void __user *user, + info.size = private->size; + strcpy(info.name, name); + +- if (copy_to_user(user, &info, *len) != 0) ++ if (copy_to_user(user, &info, len) != 0) + ret = -EFAULT; + else + ret = 0; +@@ -1983,7 +1983,7 @@ compat_do_ip6t_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) + + switch (cmd) { + case IP6T_SO_GET_INFO: +- ret = get_info(sock_net(sk), user, len, 1); ++ ret = get_info(sock_net(sk), user, *len, 1); + break; + case IP6T_SO_GET_ENTRIES: + ret = compat_get_entries(sock_net(sk), user, len); +@@ -2030,7 +2030,7 @@ do_ip6t_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) + + switch (cmd) { + case IP6T_SO_GET_INFO: +- ret = get_info(sock_net(sk), user, len, 0); ++ ret = get_info(sock_net(sk), user, *len, 0); + break; + + case IP6T_SO_GET_ENTRIES: +diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c +index 6f187c8..34b367f 100644 +--- a/net/ipv6/netfilter/nf_conntrack_reasm.c ++++ b/net/ipv6/netfilter/nf_conntrack_reasm.c +@@ -96,12 +96,11 @@ static struct ctl_table nf_ct_frag6_sysctl_table[] = { + + static int nf_ct_frag6_sysctl_register(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table = NULL; + struct ctl_table_header *hdr; + +- table = nf_ct_frag6_sysctl_table; + if (!net_eq(net, &init_net)) { +- table = kmemdup(table, sizeof(nf_ct_frag6_sysctl_table), ++ table = kmemdup(nf_ct_frag6_sysctl_table, sizeof(nf_ct_frag6_sysctl_table), + GFP_KERNEL); + if (table == NULL) + goto err_alloc; +@@ -112,9 +111,9 @@ static int nf_ct_frag6_sysctl_register(struct net *net) + table[2].data = &net->nf_frag.frags.high_thresh; + table[2].extra1 = &net->nf_frag.frags.low_thresh; + table[2].extra2 = &init_net.nf_frag.frags.high_thresh; +- } +- +- hdr = register_net_sysctl(net, "net/netfilter", table); ++ hdr = register_net_sysctl(net, "net/netfilter", table); ++ } else ++ hdr = register_net_sysctl(net, "net/netfilter", nf_ct_frag6_sysctl_table); + if (hdr == NULL) + goto err_reg; + +@@ -122,8 +121,7 @@ static int nf_ct_frag6_sysctl_register(struct net *net) + return 0; + + err_reg: +- if (!net_eq(net, &init_net)) +- kfree(table); ++ kfree(table); + err_alloc: + return -ENOMEM; + } +diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c +index 2d452a3..83e96de 100644 +--- a/net/ipv6/ping.c ++++ b/net/ipv6/ping.c +@@ -241,6 +241,24 @@ static struct pernet_operations ping_v6_net_ops = { + }; + #endif + ++static struct pingv6_ops real_pingv6_ops = { ++ .ipv6_recv_error = ipv6_recv_error, ++ .ip6_datagram_recv_common_ctl = ip6_datagram_recv_common_ctl, ++ .ip6_datagram_recv_specific_ctl = ip6_datagram_recv_specific_ctl, ++ .icmpv6_err_convert = icmpv6_err_convert, ++ .ipv6_icmp_error = ipv6_icmp_error, ++ .ipv6_chk_addr = ipv6_chk_addr, ++}; ++ ++static struct pingv6_ops dummy_pingv6_ops = { ++ .ipv6_recv_error = dummy_ipv6_recv_error, ++ .ip6_datagram_recv_common_ctl = dummy_ip6_datagram_recv_ctl, ++ .ip6_datagram_recv_specific_ctl = dummy_ip6_datagram_recv_ctl, ++ .icmpv6_err_convert = dummy_icmpv6_err_convert, ++ .ipv6_icmp_error = dummy_ipv6_icmp_error, ++ .ipv6_chk_addr = dummy_ipv6_chk_addr, ++}; ++ + int __init pingv6_init(void) + { + #ifdef CONFIG_PROC_FS +@@ -248,13 +266,7 @@ int __init pingv6_init(void) + if (ret) + return ret; + #endif +- pingv6_ops.ipv6_recv_error = ipv6_recv_error; +- pingv6_ops.ip6_datagram_recv_common_ctl = ip6_datagram_recv_common_ctl; +- pingv6_ops.ip6_datagram_recv_specific_ctl = +- ip6_datagram_recv_specific_ctl; +- pingv6_ops.icmpv6_err_convert = icmpv6_err_convert; +- pingv6_ops.ipv6_icmp_error = ipv6_icmp_error; +- pingv6_ops.ipv6_chk_addr = ipv6_chk_addr; ++ pingv6_ops = &real_pingv6_ops; + return inet6_register_protosw(&pingv6_protosw); + } + +@@ -263,14 +275,9 @@ int __init pingv6_init(void) + */ + void pingv6_exit(void) + { +- pingv6_ops.ipv6_recv_error = dummy_ipv6_recv_error; +- pingv6_ops.ip6_datagram_recv_common_ctl = dummy_ip6_datagram_recv_ctl; +- pingv6_ops.ip6_datagram_recv_specific_ctl = dummy_ip6_datagram_recv_ctl; +- pingv6_ops.icmpv6_err_convert = dummy_icmpv6_err_convert; +- pingv6_ops.ipv6_icmp_error = dummy_ipv6_icmp_error; +- pingv6_ops.ipv6_chk_addr = dummy_ipv6_chk_addr; + #ifdef CONFIG_PROC_FS + unregister_pernet_subsys(&ping_v6_net_ops); + #endif ++ pingv6_ops = &dummy_pingv6_ops; + inet6_unregister_protosw(&pingv6_protosw); + } +diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c +index 1752cd0..3c6af41 100644 +--- a/net/ipv6/proc.c ++++ b/net/ipv6/proc.c +@@ -309,7 +309,7 @@ static int __net_init ipv6_proc_init_net(struct net *net) + if (!proc_create("snmp6", S_IRUGO, net->proc_net, &snmp6_seq_fops)) + goto proc_snmp6_fail; + +- net->mib.proc_net_devsnmp6 = proc_mkdir("dev_snmp6", net->proc_net); ++ net->mib.proc_net_devsnmp6 = proc_mkdir_restrict("dev_snmp6", net->proc_net); + if (!net->mib.proc_net_devsnmp6) + goto proc_dev_snmp6_fail; + return 0; +diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c +index 896af88..6e2ba628 100644 +--- a/net/ipv6/raw.c ++++ b/net/ipv6/raw.c +@@ -388,7 +388,7 @@ static inline int rawv6_rcv_skb(struct sock *sk, struct sk_buff *skb) + { + if ((raw6_sk(sk)->checksum || rcu_access_pointer(sk->sk_filter)) && + skb_checksum_complete(skb)) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + kfree_skb(skb); + return NET_RX_DROP; + } +@@ -416,7 +416,7 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb) + struct raw6_sock *rp = raw6_sk(sk); + + if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + kfree_skb(skb); + return NET_RX_DROP; + } +@@ -440,7 +440,7 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb) + + if (inet->hdrincl) { + if (skb_checksum_complete(skb)) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + kfree_skb(skb); + return NET_RX_DROP; + } +@@ -608,7 +608,7 @@ out: + return err; + } + +-static int rawv6_send_hdrinc(struct sock *sk, void *from, int length, ++static int rawv6_send_hdrinc(struct sock *sk, void *from, unsigned int length, + struct flowi6 *fl6, struct dst_entry **dstp, + unsigned int flags) + { +@@ -914,12 +914,15 @@ do_confirm: + static int rawv6_seticmpfilter(struct sock *sk, int level, int optname, + char __user *optval, int optlen) + { ++ struct icmp6_filter filter; ++ + switch (optname) { + case ICMPV6_FILTER: + if (optlen > sizeof(struct icmp6_filter)) + optlen = sizeof(struct icmp6_filter); +- if (copy_from_user(&raw6_sk(sk)->filter, optval, optlen)) ++ if (copy_from_user(&filter, optval, optlen)) + return -EFAULT; ++ raw6_sk(sk)->filter = filter; + return 0; + default: + return -ENOPROTOOPT; +@@ -932,6 +935,7 @@ static int rawv6_geticmpfilter(struct sock *sk, int level, int optname, + char __user *optval, int __user *optlen) + { + int len; ++ struct icmp6_filter filter; + + switch (optname) { + case ICMPV6_FILTER: +@@ -943,7 +947,8 @@ static int rawv6_geticmpfilter(struct sock *sk, int level, int optname, + len = sizeof(struct icmp6_filter); + if (put_user(len, optlen)) + return -EFAULT; +- if (copy_to_user(optval, &raw6_sk(sk)->filter, len)) ++ filter = raw6_sk(sk)->filter; ++ if (len > sizeof filter || copy_to_user(optval, &filter, len)) + return -EFAULT; + return 0; + default: +diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c +index 1a157ca..9fc05f4 100644 +--- a/net/ipv6/reassembly.c ++++ b/net/ipv6/reassembly.c +@@ -625,12 +625,11 @@ static struct ctl_table ip6_frags_ctl_table[] = { + + static int __net_init ip6_frags_ns_sysctl_register(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table = NULL; + struct ctl_table_header *hdr; + +- table = ip6_frags_ns_ctl_table; + if (!net_eq(net, &init_net)) { +- table = kmemdup(table, sizeof(ip6_frags_ns_ctl_table), GFP_KERNEL); ++ table = kmemdup(ip6_frags_ns_ctl_table, sizeof(ip6_frags_ns_ctl_table), GFP_KERNEL); + if (table == NULL) + goto err_alloc; + +@@ -644,9 +643,10 @@ static int __net_init ip6_frags_ns_sysctl_register(struct net *net) + /* Don't export sysctls to unprivileged users */ + if (net->user_ns != &init_user_ns) + table[0].procname = NULL; +- } ++ hdr = register_net_sysctl(net, "net/ipv6", table); ++ } else ++ hdr = register_net_sysctl(net, "net/ipv6", ip6_frags_ns_ctl_table); + +- hdr = register_net_sysctl(net, "net/ipv6", table); + if (hdr == NULL) + goto err_reg; + +@@ -654,8 +654,7 @@ static int __net_init ip6_frags_ns_sysctl_register(struct net *net) + return 0; + + err_reg: +- if (!net_eq(net, &init_net)) +- kfree(table); ++ kfree(table); + err_alloc: + return -ENOMEM; + } +diff --git a/net/ipv6/route.c b/net/ipv6/route.c +index 2d9aca5..b2063536 100644 +--- a/net/ipv6/route.c ++++ b/net/ipv6/route.c +@@ -2962,7 +2962,7 @@ struct ctl_table ipv6_route_table_template[] = { + + struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + + table = kmemdup(ipv6_route_table_template, + sizeof(ipv6_route_table_template), +diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c +index a24557a..ade77d3 100644 +--- a/net/ipv6/sit.c ++++ b/net/ipv6/sit.c +@@ -74,7 +74,7 @@ static void ipip6_tunnel_setup(struct net_device *dev); + static void ipip6_dev_free(struct net_device *dev); + static bool check_6rd(struct ip_tunnel *tunnel, const struct in6_addr *v6dst, + __be32 *v4dst); +-static struct rtnl_link_ops sit_link_ops __read_mostly; ++static struct rtnl_link_ops sit_link_ops; + + static int sit_net_id __read_mostly; + struct sit_net { +@@ -1505,12 +1505,12 @@ static bool ipip6_netlink_encap_parms(struct nlattr *data[], + + if (data[IFLA_IPTUN_ENCAP_SPORT]) { + ret = true; +- ipencap->sport = nla_get_u16(data[IFLA_IPTUN_ENCAP_SPORT]); ++ ipencap->sport = nla_get_be16(data[IFLA_IPTUN_ENCAP_SPORT]); + } + + if (data[IFLA_IPTUN_ENCAP_DPORT]) { + ret = true; +- ipencap->dport = nla_get_u16(data[IFLA_IPTUN_ENCAP_DPORT]); ++ ipencap->dport = nla_get_be16(data[IFLA_IPTUN_ENCAP_DPORT]); + } + + return ret; +@@ -1706,9 +1706,9 @@ static int ipip6_fill_info(struct sk_buff *skb, const struct net_device *dev) + + if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, + tunnel->encap.type) || +- nla_put_u16(skb, IFLA_IPTUN_ENCAP_SPORT, ++ nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, + tunnel->encap.sport) || +- nla_put_u16(skb, IFLA_IPTUN_ENCAP_DPORT, ++ nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, + tunnel->encap.dport) || + nla_put_u16(skb, IFLA_IPTUN_ENCAP_FLAGS, + tunnel->encap.dport)) +@@ -1750,7 +1750,7 @@ static void ipip6_dellink(struct net_device *dev, struct list_head *head) + unregister_netdevice_queue(dev, head); + } + +-static struct rtnl_link_ops sit_link_ops __read_mostly = { ++static struct rtnl_link_ops sit_link_ops = { + .kind = "sit", + .maxtype = IFLA_IPTUN_MAX, + .policy = ipip6_policy, +diff --git a/net/ipv6/sysctl_net_ipv6.c b/net/ipv6/sysctl_net_ipv6.c +index c5c10fa..2577d51 100644 +--- a/net/ipv6/sysctl_net_ipv6.c ++++ b/net/ipv6/sysctl_net_ipv6.c +@@ -78,7 +78,7 @@ static struct ctl_table ipv6_rotable[] = { + + static int __net_init ipv6_sysctl_net_init(struct net *net) + { +- struct ctl_table *ipv6_table; ++ ctl_table_no_const *ipv6_table; + struct ctl_table *ipv6_route_table; + struct ctl_table *ipv6_icmp_table; + int err; +diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c +index 79fe5851..b8efcd1 100644 +--- a/net/ipv6/tcp_ipv6.c ++++ b/net/ipv6/tcp_ipv6.c +@@ -104,6 +104,10 @@ static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb) + } + } + ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++extern int grsec_enable_blackhole; ++#endif ++ + static void tcp_v6_hash(struct sock *sk) + { + if (sk->sk_state != TCP_CLOSE) { +@@ -1341,6 +1345,9 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) + return 0; + + reset: ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole) ++#endif + tcp_v6_send_reset(sk, skb); + discard: + if (opt_skb) +@@ -1450,12 +1457,20 @@ static int tcp_v6_rcv(struct sk_buff *skb) + + sk = __inet6_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest, + inet6_iif(skb)); +- if (!sk) ++ if (!sk) { ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ ret = 1; ++#endif + goto no_tcp_socket; ++ } + + process: +- if (sk->sk_state == TCP_TIME_WAIT) ++ if (sk->sk_state == TCP_TIME_WAIT) { ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ ret = 2; ++#endif + goto do_time_wait; ++ } + + if (hdr->hop_limit < inet6_sk(sk)->min_hopcount) { + NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP); +@@ -1506,6 +1521,10 @@ csum_error: + bad_packet: + TCP_INC_STATS_BH(net, TCP_MIB_INERRS); + } else { ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole || (ret == 1 && ++ (skb->dev->flags & IFF_LOOPBACK))) ++#endif + tcp_v6_send_reset(NULL, skb); + } + +diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c +index f6ba535..b41033f 100644 +--- a/net/ipv6/udp.c ++++ b/net/ipv6/udp.c +@@ -76,6 +76,10 @@ static unsigned int udp6_ehashfn(struct net *net, + udp_ipv6_hash_secret + net_hash_mix(net)); + } + ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++extern int grsec_enable_blackhole; ++#endif ++ + int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) + { + const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2); +@@ -434,7 +438,7 @@ try_again: + if (unlikely(err)) { + trace_kfree_skb(skb, udpv6_recvmsg); + if (!peeked) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + if (is_udp4) + UDP_INC_STATS_USER(sock_net(sk), + UDP_MIB_INERRORS, +@@ -701,7 +705,7 @@ csum_error: + UDP6_INC_STATS_BH(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite); + drop: + UDP6_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite); +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + kfree_skb(skb); + return -1; + } +@@ -740,7 +744,7 @@ static void flush_stack(struct sock **stack, unsigned int count, + if (likely(skb1 == NULL)) + skb1 = (i == final) ? skb : skb_clone(skb, GFP_ATOMIC); + if (!skb1) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + UDP6_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS, + IS_UDPLITE(sk)); + UDP6_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, +@@ -919,6 +923,9 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, + goto csum_error; + + UDP6_INC_STATS_BH(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE); ++#ifdef CONFIG_GRKERNSEC_BLACKHOLE ++ if (!grsec_enable_blackhole || (skb->dev->flags & IFF_LOOPBACK)) ++#endif + icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_PORT_UNREACH, 0); + + kfree_skb(skb); +diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c +index 5f98364..691985a 100644 +--- a/net/ipv6/xfrm6_policy.c ++++ b/net/ipv6/xfrm6_policy.c +@@ -130,12 +130,18 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse) + { + struct flowi6 *fl6 = &fl->u.ip6; + int onlyproto = 0; +- u16 offset = skb_network_header_len(skb); + const struct ipv6hdr *hdr = ipv6_hdr(skb); ++ u16 offset = sizeof(*hdr); + struct ipv6_opt_hdr *exthdr; + const unsigned char *nh = skb_network_header(skb); +- u8 nexthdr = nh[IP6CB(skb)->nhoff]; ++ u16 nhoff = IP6CB(skb)->nhoff; + int oif = 0; ++ u8 nexthdr; ++ ++ if (!nhoff) ++ nhoff = offsetof(struct ipv6hdr, nexthdr); ++ ++ nexthdr = nh[nhoff]; + + if (skb_dst(skb)) + oif = skb_dst(skb)->dev->ifindex; +@@ -217,11 +223,11 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse) + } + } + +-static inline int xfrm6_garbage_collect(struct dst_ops *ops) ++static int xfrm6_garbage_collect(struct dst_ops *ops) + { + struct net *net = container_of(ops, struct net, xfrm.xfrm6_dst_ops); + +- xfrm6_policy_afinfo.garbage_collect(net); ++ xfrm_garbage_collect_deferred(net); + return dst_entries_get_fast(ops) > ops->gc_thresh * 2; + } + +@@ -334,19 +340,19 @@ static struct ctl_table xfrm6_policy_table[] = { + + static int __net_init xfrm6_net_init(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table = NULL; + struct ctl_table_header *hdr; + +- table = xfrm6_policy_table; + if (!net_eq(net, &init_net)) { +- table = kmemdup(table, sizeof(xfrm6_policy_table), GFP_KERNEL); ++ table = kmemdup(xfrm6_policy_table, sizeof(xfrm6_policy_table), GFP_KERNEL); + if (!table) + goto err_alloc; + + table[0].data = &net->xfrm.xfrm6_dst_ops.gc_thresh; +- } ++ hdr = register_net_sysctl(net, "net/ipv6", table); ++ } else ++ hdr = register_net_sysctl(net, "net/ipv6", xfrm6_policy_table); + +- hdr = register_net_sysctl(net, "net/ipv6", table); + if (!hdr) + goto err_reg; + +@@ -354,8 +360,7 @@ static int __net_init xfrm6_net_init(struct net *net) + return 0; + + err_reg: +- if (!net_eq(net, &init_net)) +- kfree(table); ++ kfree(table); + err_alloc: + return -ENOMEM; + } +diff --git a/net/ipx/ipx_proc.c b/net/ipx/ipx_proc.c +index e15c16a..7cf07aa 100644 +--- a/net/ipx/ipx_proc.c ++++ b/net/ipx/ipx_proc.c +@@ -289,7 +289,7 @@ int __init ipx_proc_init(void) + struct proc_dir_entry *p; + int rc = -ENOMEM; + +- ipx_proc_dir = proc_mkdir("ipx", init_net.proc_net); ++ ipx_proc_dir = proc_mkdir_restrict("ipx", init_net.proc_net); + + if (!ipx_proc_dir) + goto out; +diff --git a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c +index 23ad419..4462e56 100644 +--- a/net/irda/ircomm/ircomm_tty.c ++++ b/net/irda/ircomm/ircomm_tty.c +@@ -317,10 +317,10 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, + add_wait_queue(&port->open_wait, &wait); + + IRDA_DEBUG(2, "%s(%d):block_til_ready before block on %s open_count=%d\n", +- __FILE__, __LINE__, tty->driver->name, port->count); ++ __FILE__, __LINE__, tty->driver->name, atomic_read(&port->count)); + + spin_lock_irqsave(&port->lock, flags); +- port->count--; ++ atomic_dec(&port->count); + port->blocked_open++; + spin_unlock_irqrestore(&port->lock, flags); + +@@ -355,7 +355,7 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, + } + + IRDA_DEBUG(1, "%s(%d):block_til_ready blocking on %s open_count=%d\n", +- __FILE__, __LINE__, tty->driver->name, port->count); ++ __FILE__, __LINE__, tty->driver->name, atomic_read(&port->count)); + + schedule(); + } +@@ -365,12 +365,12 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, + + spin_lock_irqsave(&port->lock, flags); + if (!tty_hung_up_p(filp)) +- port->count++; ++ atomic_inc(&port->count); + port->blocked_open--; + spin_unlock_irqrestore(&port->lock, flags); + + IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n", +- __FILE__, __LINE__, tty->driver->name, port->count); ++ __FILE__, __LINE__, tty->driver->name, atomic_read(&port->count)); + + if (!retval) + port->flags |= ASYNC_NORMAL_ACTIVE; +@@ -444,12 +444,12 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp) + + /* ++ is not atomic, so this should be protected - Jean II */ + spin_lock_irqsave(&self->port.lock, flags); +- self->port.count++; ++ atomic_inc(&self->port.count); + spin_unlock_irqrestore(&self->port.lock, flags); + tty_port_tty_set(&self->port, tty); + + IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __func__ , tty->driver->name, +- self->line, self->port.count); ++ self->line, atomic_read(&self->port.count)); + + /* Not really used by us, but lets do it anyway */ + self->port.low_latency = (self->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; +@@ -987,7 +987,7 @@ static void ircomm_tty_hangup(struct tty_struct *tty) + tty_kref_put(port->tty); + } + port->tty = NULL; +- port->count = 0; ++ atomic_set(&port->count, 0); + spin_unlock_irqrestore(&port->lock, flags); + + wake_up_interruptible(&port->open_wait); +@@ -1344,7 +1344,7 @@ static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m) + seq_putc(m, '\n'); + + seq_printf(m, "Role: %s\n", self->client ? "client" : "server"); +- seq_printf(m, "Open count: %d\n", self->port.count); ++ seq_printf(m, "Open count: %d\n", atomic_read(&self->port.count)); + seq_printf(m, "Max data size: %d\n", self->max_data_size); + seq_printf(m, "Max header size: %d\n", self->max_header_size); + +diff --git a/net/irda/irproc.c b/net/irda/irproc.c +index b9ac598..f88cc56 100644 +--- a/net/irda/irproc.c ++++ b/net/irda/irproc.c +@@ -66,7 +66,7 @@ void __init irda_proc_register(void) + { + int i; + +- proc_irda = proc_mkdir("irda", init_net.proc_net); ++ proc_irda = proc_mkdir_restrict("irda", init_net.proc_net); + if (proc_irda == NULL) + return; + +diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c +index a089b6b..3ca3b60 100644 +--- a/net/iucv/af_iucv.c ++++ b/net/iucv/af_iucv.c +@@ -686,10 +686,10 @@ static void __iucv_auto_name(struct iucv_sock *iucv) + { + char name[12]; + +- sprintf(name, "%08x", atomic_inc_return(&iucv_sk_list.autobind_name)); ++ sprintf(name, "%08x", atomic_inc_return_unchecked(&iucv_sk_list.autobind_name)); + while (__iucv_get_sock_by_name(name)) { + sprintf(name, "%08x", +- atomic_inc_return(&iucv_sk_list.autobind_name)); ++ atomic_inc_return_unchecked(&iucv_sk_list.autobind_name)); + } + memcpy(iucv->src_name, name, 8); + } +diff --git a/net/iucv/iucv.c b/net/iucv/iucv.c +index 2a6a1fd..6c112b0 100644 +--- a/net/iucv/iucv.c ++++ b/net/iucv/iucv.c +@@ -702,7 +702,7 @@ static int iucv_cpu_notify(struct notifier_block *self, + return NOTIFY_OK; + } + +-static struct notifier_block __refdata iucv_cpu_notifier = { ++static struct notifier_block iucv_cpu_notifier = { + .notifier_call = iucv_cpu_notify, + }; + +diff --git a/net/key/af_key.c b/net/key/af_key.c +index 1847ec4..26ef732 100644 +--- a/net/key/af_key.c ++++ b/net/key/af_key.c +@@ -3049,10 +3049,10 @@ static int pfkey_send_policy_notify(struct xfrm_policy *xp, int dir, const struc + static u32 get_acqseq(void) + { + u32 res; +- static atomic_t acqseq; ++ static atomic_unchecked_t acqseq; + + do { +- res = atomic_inc_return(&acqseq); ++ res = atomic_inc_return_unchecked(&acqseq); + } while (!res); + return res; + } +diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c +index edb78e6..8dc654a 100644 +--- a/net/l2tp/l2tp_eth.c ++++ b/net/l2tp/l2tp_eth.c +@@ -42,12 +42,12 @@ struct l2tp_eth { + struct sock *tunnel_sock; + struct l2tp_session *session; + struct list_head list; +- atomic_long_t tx_bytes; +- atomic_long_t tx_packets; +- atomic_long_t tx_dropped; +- atomic_long_t rx_bytes; +- atomic_long_t rx_packets; +- atomic_long_t rx_errors; ++ atomic_long_unchecked_t tx_bytes; ++ atomic_long_unchecked_t tx_packets; ++ atomic_long_unchecked_t tx_dropped; ++ atomic_long_unchecked_t rx_bytes; ++ atomic_long_unchecked_t rx_packets; ++ atomic_long_unchecked_t rx_errors; + }; + + /* via l2tp_session_priv() */ +@@ -98,10 +98,10 @@ static int l2tp_eth_dev_xmit(struct sk_buff *skb, struct net_device *dev) + int ret = l2tp_xmit_skb(session, skb, session->hdr_len); + + if (likely(ret == NET_XMIT_SUCCESS)) { +- atomic_long_add(len, &priv->tx_bytes); +- atomic_long_inc(&priv->tx_packets); ++ atomic_long_add_unchecked(len, &priv->tx_bytes); ++ atomic_long_inc_unchecked(&priv->tx_packets); + } else { +- atomic_long_inc(&priv->tx_dropped); ++ atomic_long_inc_unchecked(&priv->tx_dropped); + } + return NETDEV_TX_OK; + } +@@ -111,12 +111,12 @@ static struct rtnl_link_stats64 *l2tp_eth_get_stats64(struct net_device *dev, + { + struct l2tp_eth *priv = netdev_priv(dev); + +- stats->tx_bytes = atomic_long_read(&priv->tx_bytes); +- stats->tx_packets = atomic_long_read(&priv->tx_packets); +- stats->tx_dropped = atomic_long_read(&priv->tx_dropped); +- stats->rx_bytes = atomic_long_read(&priv->rx_bytes); +- stats->rx_packets = atomic_long_read(&priv->rx_packets); +- stats->rx_errors = atomic_long_read(&priv->rx_errors); ++ stats->tx_bytes = atomic_long_read_unchecked(&priv->tx_bytes); ++ stats->tx_packets = atomic_long_read_unchecked(&priv->tx_packets); ++ stats->tx_dropped = atomic_long_read_unchecked(&priv->tx_dropped); ++ stats->rx_bytes = atomic_long_read_unchecked(&priv->rx_bytes); ++ stats->rx_packets = atomic_long_read_unchecked(&priv->rx_packets); ++ stats->rx_errors = atomic_long_read_unchecked(&priv->rx_errors); + return stats; + } + +@@ -166,15 +166,15 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, + nf_reset(skb); + + if (dev_forward_skb(dev, skb) == NET_RX_SUCCESS) { +- atomic_long_inc(&priv->rx_packets); +- atomic_long_add(data_len, &priv->rx_bytes); ++ atomic_long_inc_unchecked(&priv->rx_packets); ++ atomic_long_add_unchecked(data_len, &priv->rx_bytes); + } else { +- atomic_long_inc(&priv->rx_errors); ++ atomic_long_inc_unchecked(&priv->rx_errors); + } + return; + + error: +- atomic_long_inc(&priv->rx_errors); ++ atomic_long_inc_unchecked(&priv->rx_errors); + kfree_skb(skb); + } + +diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c +index 369a982..2a0efc1 100644 +--- a/net/l2tp/l2tp_ip.c ++++ b/net/l2tp/l2tp_ip.c +@@ -608,7 +608,7 @@ static struct inet_protosw l2tp_ip_protosw = { + .ops = &l2tp_ip_ops, + }; + +-static struct net_protocol l2tp_ip_protocol __read_mostly = { ++static const struct net_protocol l2tp_ip_protocol = { + .handler = l2tp_ip_recv, + .netns_ok = 1, + }; +diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c +index 0edb263..f6dc471 100644 +--- a/net/l2tp/l2tp_ip6.c ++++ b/net/l2tp/l2tp_ip6.c +@@ -757,7 +757,7 @@ static struct inet_protosw l2tp_ip6_protosw = { + .ops = &l2tp_ip6_ops, + }; + +-static struct inet6_protocol l2tp_ip6_protocol __read_mostly = { ++static const struct inet6_protocol l2tp_ip6_protocol = { + .handler = l2tp_ip6_recv, + }; + +diff --git a/net/llc/llc_proc.c b/net/llc/llc_proc.c +index 1a3c7e0..80f8b0c 100644 +--- a/net/llc/llc_proc.c ++++ b/net/llc/llc_proc.c +@@ -247,7 +247,7 @@ int __init llc_proc_init(void) + int rc = -ENOMEM; + struct proc_dir_entry *p; + +- llc_proc_dir = proc_mkdir("llc", init_net.proc_net); ++ llc_proc_dir = proc_mkdir_restrict("llc", init_net.proc_net); + if (!llc_proc_dir) + goto out; + +diff --git a/net/llc/sysctl_net_llc.c b/net/llc/sysctl_net_llc.c +index 612a5dd..799bafc 100644 +--- a/net/llc/sysctl_net_llc.c ++++ b/net/llc/sysctl_net_llc.c +@@ -18,28 +18,28 @@ static struct ctl_table llc2_timeout_table[] = { + { + .procname = "ack", + .data = &sysctl_llc2_ack_timeout, +- .maxlen = sizeof(long), ++ .maxlen = sizeof(sysctl_llc2_ack_timeout), + .mode = 0644, + .proc_handler = proc_dointvec_jiffies, + }, + { + .procname = "busy", + .data = &sysctl_llc2_busy_timeout, +- .maxlen = sizeof(long), ++ .maxlen = sizeof(sysctl_llc2_busy_timeout), + .mode = 0644, + .proc_handler = proc_dointvec_jiffies, + }, + { + .procname = "p", + .data = &sysctl_llc2_p_timeout, +- .maxlen = sizeof(long), ++ .maxlen = sizeof(sysctl_llc2_p_timeout), + .mode = 0644, + .proc_handler = proc_dointvec_jiffies, + }, + { + .procname = "rej", + .data = &sysctl_llc2_rej_timeout, +- .maxlen = sizeof(long), ++ .maxlen = sizeof(sysctl_llc2_rej_timeout), + .mode = 0644, + .proc_handler = proc_dointvec_jiffies, + }, +diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c +index 343da1e..509873f 100644 +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -541,7 +541,7 @@ static int ieee80211_set_monitor_channel(struct wiphy *wiphy, + ret = ieee80211_vif_use_channel(sdata, chandef, + IEEE80211_CHANCTX_EXCLUSIVE); + } +- } else if (local->open_count == local->monitors) { ++ } else if (local_read(&local->open_count) == local->monitors) { + local->_oper_chandef = *chandef; + ieee80211_hw_config(local, 0); + } +@@ -3326,7 +3326,7 @@ static void ieee80211_mgmt_frame_register(struct wiphy *wiphy, + else + local->probe_req_reg--; + +- if (!local->open_count) ++ if (!local_read(&local->open_count)) + break; + + ieee80211_queue_work(&local->hw, &local->reconfig_filter); +@@ -3460,8 +3460,8 @@ static int ieee80211_cfg_get_channel(struct wiphy *wiphy, + if (chanctx_conf) { + *chandef = sdata->vif.bss_conf.chandef; + ret = 0; +- } else if (local->open_count > 0 && +- local->open_count == local->monitors && ++ } else if (local_read(&local->open_count) > 0 && ++ local_read(&local->open_count) == local->monitors && + sdata->vif.type == NL80211_IFTYPE_MONITOR) { + if (local->use_chanctx) + *chandef = local->monitor_chandef; +diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h +index 91c1aca..02a1ab1 100644 +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -29,6 +29,7 @@ + #include <net/ieee80211_radiotap.h> + #include <net/cfg80211.h> + #include <net/mac80211.h> ++#include <asm/local.h> + #include "key.h" + #include "sta_info.h" + #include "debug.h" +@@ -1068,7 +1069,7 @@ struct ieee80211_local { + /* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */ + spinlock_t queue_stop_reason_lock; + +- int open_count; ++ local_t open_count; + int monitors, cooked_mntrs; + /* number of interfaces with corresponding FIF_ flags */ + int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll, +diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c +index eeae0ab..0f24585 100644 +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -533,7 +533,7 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) + break; + } + +- if (local->open_count == 0) { ++ if (local_read(&local->open_count) == 0) { + res = drv_start(local); + if (res) + goto err_del_bss; +@@ -580,7 +580,7 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) + res = drv_add_interface(local, sdata); + if (res) + goto err_stop; +- } else if (local->monitors == 0 && local->open_count == 0) { ++ } else if (local->monitors == 0 && local_read(&local->open_count) == 0) { + res = ieee80211_add_virtual_monitor(local); + if (res) + goto err_stop; +@@ -689,7 +689,7 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) + atomic_inc(&local->iff_promiscs); + + if (coming_up) +- local->open_count++; ++ local_inc(&local->open_count); + + if (hw_reconf_flags) + ieee80211_hw_config(local, hw_reconf_flags); +@@ -727,7 +727,7 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) + err_del_interface: + drv_remove_interface(local, sdata); + err_stop: +- if (!local->open_count) ++ if (!local_read(&local->open_count)) + drv_stop(local); + err_del_bss: + sdata->bss = NULL; +@@ -893,7 +893,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, + } + + if (going_down) +- local->open_count--; ++ local_dec(&local->open_count); + + switch (sdata->vif.type) { + case NL80211_IFTYPE_AP_VLAN: +@@ -955,7 +955,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, + } + spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); + +- if (local->open_count == 0) ++ if (local_read(&local->open_count) == 0) + ieee80211_clear_tx_pending(local); + + /* +@@ -998,7 +998,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, + if (cancel_scan) + flush_delayed_work(&local->scan_work); + +- if (local->open_count == 0) { ++ if (local_read(&local->open_count) == 0) { + ieee80211_stop_device(local); + + /* no reconfiguring after stop! */ +@@ -1009,7 +1009,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, + ieee80211_configure_filter(local); + ieee80211_hw_config(local, hw_reconf_flags); + +- if (local->monitors == local->open_count) ++ if (local->monitors == local_read(&local->open_count)) + ieee80211_add_virtual_monitor(local); + } + +diff --git a/net/mac80211/main.c b/net/mac80211/main.c +index 0de7c93..884b2ca 100644 +--- a/net/mac80211/main.c ++++ b/net/mac80211/main.c +@@ -175,7 +175,7 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed) + changed &= ~(IEEE80211_CONF_CHANGE_CHANNEL | + IEEE80211_CONF_CHANGE_POWER); + +- if (changed && local->open_count) { ++ if (changed && local_read(&local->open_count)) { + ret = drv_config(local, changed); + /* + * Goal: +diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c +index 4a95fe3..0bfd713 100644 +--- a/net/mac80211/pm.c ++++ b/net/mac80211/pm.c +@@ -12,7 +12,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) + struct ieee80211_sub_if_data *sdata; + struct sta_info *sta; + +- if (!local->open_count) ++ if (!local_read(&local->open_count)) + goto suspend; + + ieee80211_scan_cancel(local); +@@ -59,7 +59,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) + cancel_work_sync(&local->dynamic_ps_enable_work); + del_timer_sync(&local->dynamic_ps_timer); + +- local->wowlan = wowlan && local->open_count; ++ local->wowlan = wowlan && local_read(&local->open_count); + if (local->wowlan) { + int err = drv_suspend(local, wowlan); + if (err < 0) { +@@ -126,7 +126,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) + WARN_ON(!list_empty(&local->chanctx_list)); + + /* stop hardware - this must stop RX */ +- if (local->open_count) ++ if (local_read(&local->open_count)) + ieee80211_stop_device(local); + + suspend: +diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c +index 6081329..ab23834 100644 +--- a/net/mac80211/rate.c ++++ b/net/mac80211/rate.c +@@ -720,7 +720,7 @@ int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local, + + ASSERT_RTNL(); + +- if (local->open_count) ++ if (local_read(&local->open_count)) + return -EBUSY; + + if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) { +diff --git a/net/mac80211/util.c b/net/mac80211/util.c +index 0043256..20a2b51 100644 +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -1669,7 +1669,7 @@ int ieee80211_reconfig(struct ieee80211_local *local) + } + #endif + /* everything else happens only if HW was up & running */ +- if (!local->open_count) ++ if (!local_read(&local->open_count)) + goto wake_up; + + /* +@@ -1895,7 +1895,7 @@ int ieee80211_reconfig(struct ieee80211_local *local) + local->in_reconfig = false; + barrier(); + +- if (local->monitors == local->open_count && local->monitors > 0) ++ if (local->monitors == local_read(&local->open_count) && local->monitors > 0) + ieee80211_add_virtual_monitor(local); + + /* +diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig +index ae5096a..e5aa70a 100644 +--- a/net/netfilter/Kconfig ++++ b/net/netfilter/Kconfig +@@ -1105,6 +1105,16 @@ config NETFILTER_XT_MATCH_ESP + + To compile it as a module, choose M here. If unsure, say N. + ++config NETFILTER_XT_MATCH_GRADM ++ tristate '"gradm" match support' ++ depends on NETFILTER_XTABLES && NETFILTER_ADVANCED ++ depends on GRKERNSEC && !GRKERNSEC_NO_RBAC ++ ---help--- ++ The gradm match allows to match on grsecurity RBAC being enabled. ++ It is useful when iptables rules are applied early on bootup to ++ prevent connections to the machine (except from a trusted host) ++ while the RBAC system is disabled. ++ + config NETFILTER_XT_MATCH_HASHLIMIT + tristate '"hashlimit" match support' + depends on (IP6_NF_IPTABLES || IP6_NF_IPTABLES=n) +diff --git a/net/netfilter/Makefile b/net/netfilter/Makefile +index a9571be..c59e173 100644 +--- a/net/netfilter/Makefile ++++ b/net/netfilter/Makefile +@@ -137,6 +137,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_DEVGROUP) += xt_devgroup.o + obj-$(CONFIG_NETFILTER_XT_MATCH_DSCP) += xt_dscp.o + obj-$(CONFIG_NETFILTER_XT_MATCH_ECN) += xt_ecn.o + obj-$(CONFIG_NETFILTER_XT_MATCH_ESP) += xt_esp.o ++obj-$(CONFIG_NETFILTER_XT_MATCH_GRADM) += xt_gradm.o + obj-$(CONFIG_NETFILTER_XT_MATCH_HASHLIMIT) += xt_hashlimit.o + obj-$(CONFIG_NETFILTER_XT_MATCH_HELPER) += xt_helper.o + obj-$(CONFIG_NETFILTER_XT_MATCH_HL) += xt_hl.o +diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c +index d259da3..6a32b2c 100644 +--- a/net/netfilter/ipset/ip_set_core.c ++++ b/net/netfilter/ipset/ip_set_core.c +@@ -1952,7 +1952,7 @@ done: + return ret; + } + +-static struct nf_sockopt_ops so_set __read_mostly = { ++static struct nf_sockopt_ops so_set = { + .pf = PF_INET, + .get_optmin = SO_IP_SET, + .get_optmax = SO_IP_SET + 1, +diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c +index b0f7b62..0541842 100644 +--- a/net/netfilter/ipvs/ip_vs_conn.c ++++ b/net/netfilter/ipvs/ip_vs_conn.c +@@ -572,7 +572,7 @@ ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest) + /* Increase the refcnt counter of the dest */ + ip_vs_dest_hold(dest); + +- conn_flags = atomic_read(&dest->conn_flags); ++ conn_flags = atomic_read_unchecked(&dest->conn_flags); + if (cp->protocol != IPPROTO_UDP) + conn_flags &= ~IP_VS_CONN_F_ONE_PACKET; + flags = cp->flags; +@@ -922,7 +922,7 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p, int dest_af, + + cp->control = NULL; + atomic_set(&cp->n_control, 0); +- atomic_set(&cp->in_pkts, 0); ++ atomic_set_unchecked(&cp->in_pkts, 0); + + cp->packet_xmit = NULL; + cp->app = NULL; +@@ -1229,7 +1229,7 @@ static inline int todrop_entry(struct ip_vs_conn *cp) + + /* Don't drop the entry if its number of incoming packets is not + located in [0, 8] */ +- i = atomic_read(&cp->in_pkts); ++ i = atomic_read_unchecked(&cp->in_pkts); + if (i > 8 || i < 0) return 0; + + if (!todrop_rate[i]) return 0; +diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c +index 990decb..5075248 100644 +--- a/net/netfilter/ipvs/ip_vs_core.c ++++ b/net/netfilter/ipvs/ip_vs_core.c +@@ -568,7 +568,7 @@ int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, + ret = cp->packet_xmit(skb, cp, pd->pp, iph); + /* do not touch skb anymore */ + +- atomic_inc(&cp->in_pkts); ++ atomic_inc_unchecked(&cp->in_pkts); + ip_vs_conn_put(cp); + return ret; + } +@@ -1712,7 +1712,7 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af) + if (cp->flags & IP_VS_CONN_F_ONE_PACKET) + pkts = sysctl_sync_threshold(ipvs); + else +- pkts = atomic_add_return(1, &cp->in_pkts); ++ pkts = atomic_add_return_unchecked(1, &cp->in_pkts); + + if (ipvs->sync_state & IP_VS_STATE_MASTER) + ip_vs_sync_conn(net, cp, pkts); +diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c +index ac7ba68..9735acb9 100644 +--- a/net/netfilter/ipvs/ip_vs_ctl.c ++++ b/net/netfilter/ipvs/ip_vs_ctl.c +@@ -800,7 +800,7 @@ __ip_vs_update_dest(struct ip_vs_service *svc, struct ip_vs_dest *dest, + */ + ip_vs_rs_hash(ipvs, dest); + } +- atomic_set(&dest->conn_flags, conn_flags); ++ atomic_set_unchecked(&dest->conn_flags, conn_flags); + + /* bind the service */ + old_svc = rcu_dereference_protected(dest->svc, 1); +@@ -1665,7 +1665,7 @@ proc_do_sync_ports(struct ctl_table *table, int write, + * align with netns init in ip_vs_control_net_init() + */ + +-static struct ctl_table vs_vars[] = { ++static ctl_table_no_const vs_vars[] __read_only = { + { + .procname = "amemthresh", + .maxlen = sizeof(int), +@@ -2000,7 +2000,7 @@ static int ip_vs_info_seq_show(struct seq_file *seq, void *v) + " %-7s %-6d %-10d %-10d\n", + &dest->addr.in6, + ntohs(dest->port), +- ip_vs_fwd_name(atomic_read(&dest->conn_flags)), ++ ip_vs_fwd_name(atomic_read_unchecked(&dest->conn_flags)), + atomic_read(&dest->weight), + atomic_read(&dest->activeconns), + atomic_read(&dest->inactconns)); +@@ -2011,7 +2011,7 @@ static int ip_vs_info_seq_show(struct seq_file *seq, void *v) + "%-7s %-6d %-10d %-10d\n", + ntohl(dest->addr.ip), + ntohs(dest->port), +- ip_vs_fwd_name(atomic_read(&dest->conn_flags)), ++ ip_vs_fwd_name(atomic_read_unchecked(&dest->conn_flags)), + atomic_read(&dest->weight), + atomic_read(&dest->activeconns), + atomic_read(&dest->inactconns)); +@@ -2500,7 +2500,7 @@ __ip_vs_get_dest_entries(struct net *net, const struct ip_vs_get_dests *get, + + entry.addr = dest->addr.ip; + entry.port = dest->port; +- entry.conn_flags = atomic_read(&dest->conn_flags); ++ entry.conn_flags = atomic_read_unchecked(&dest->conn_flags); + entry.weight = atomic_read(&dest->weight); + entry.u_threshold = dest->u_threshold; + entry.l_threshold = dest->l_threshold; +@@ -3040,7 +3040,7 @@ static int ip_vs_genl_fill_dest(struct sk_buff *skb, struct ip_vs_dest *dest) + if (nla_put(skb, IPVS_DEST_ATTR_ADDR, sizeof(dest->addr), &dest->addr) || + nla_put_be16(skb, IPVS_DEST_ATTR_PORT, dest->port) || + nla_put_u32(skb, IPVS_DEST_ATTR_FWD_METHOD, +- (atomic_read(&dest->conn_flags) & ++ (atomic_read_unchecked(&dest->conn_flags) & + IP_VS_CONN_F_FWD_MASK)) || + nla_put_u32(skb, IPVS_DEST_ATTR_WEIGHT, + atomic_read(&dest->weight)) || +@@ -3673,7 +3673,7 @@ static int __net_init ip_vs_control_net_init_sysctl(struct net *net) + { + int idx; + struct netns_ipvs *ipvs = net_ipvs(net); +- struct ctl_table *tbl; ++ ctl_table_no_const *tbl; + + atomic_set(&ipvs->dropentry, 0); + spin_lock_init(&ipvs->dropentry_lock); +diff --git a/net/netfilter/ipvs/ip_vs_lblc.c b/net/netfilter/ipvs/ip_vs_lblc.c +index 127f140..553d652 100644 +--- a/net/netfilter/ipvs/ip_vs_lblc.c ++++ b/net/netfilter/ipvs/ip_vs_lblc.c +@@ -118,7 +118,7 @@ struct ip_vs_lblc_table { + * IPVS LBLC sysctl table + */ + #ifdef CONFIG_SYSCTL +-static struct ctl_table vs_vars_table[] = { ++static ctl_table_no_const vs_vars_table[] __read_only = { + { + .procname = "lblc_expiration", + .data = NULL, +diff --git a/net/netfilter/ipvs/ip_vs_lblcr.c b/net/netfilter/ipvs/ip_vs_lblcr.c +index 2229d2d..b32b785 100644 +--- a/net/netfilter/ipvs/ip_vs_lblcr.c ++++ b/net/netfilter/ipvs/ip_vs_lblcr.c +@@ -289,7 +289,7 @@ struct ip_vs_lblcr_table { + * IPVS LBLCR sysctl table + */ + +-static struct ctl_table vs_vars_table[] = { ++static ctl_table_no_const vs_vars_table[] __read_only = { + { + .procname = "lblcr_expiration", + .data = NULL, +diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c +index 7162c86..9eeb60e 100644 +--- a/net/netfilter/ipvs/ip_vs_sync.c ++++ b/net/netfilter/ipvs/ip_vs_sync.c +@@ -609,7 +609,7 @@ static void ip_vs_sync_conn_v0(struct net *net, struct ip_vs_conn *cp, + cp = cp->control; + if (cp) { + if (cp->flags & IP_VS_CONN_F_TEMPLATE) +- pkts = atomic_add_return(1, &cp->in_pkts); ++ pkts = atomic_add_return_unchecked(1, &cp->in_pkts); + else + pkts = sysctl_sync_threshold(ipvs); + ip_vs_sync_conn(net, cp->control, pkts); +@@ -771,7 +771,7 @@ control: + if (!cp) + return; + if (cp->flags & IP_VS_CONN_F_TEMPLATE) +- pkts = atomic_add_return(1, &cp->in_pkts); ++ pkts = atomic_add_return_unchecked(1, &cp->in_pkts); + else + pkts = sysctl_sync_threshold(ipvs); + goto sloop; +@@ -901,7 +901,7 @@ static void ip_vs_proc_conn(struct net *net, struct ip_vs_conn_param *param, + + if (opt) + memcpy(&cp->in_seq, opt, sizeof(*opt)); +- atomic_set(&cp->in_pkts, sysctl_sync_threshold(ipvs)); ++ atomic_set_unchecked(&cp->in_pkts, sysctl_sync_threshold(ipvs)); + cp->state = state; + cp->old_state = cp->state; + /* +diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c +index bd90bf8..816a020 100644 +--- a/net/netfilter/ipvs/ip_vs_xmit.c ++++ b/net/netfilter/ipvs/ip_vs_xmit.c +@@ -1215,7 +1215,7 @@ ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, + else + rc = NF_ACCEPT; + /* do not touch skb anymore */ +- atomic_inc(&cp->in_pkts); ++ atomic_inc_unchecked(&cp->in_pkts); + goto out; + } + +@@ -1308,7 +1308,7 @@ ip_vs_icmp_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, + else + rc = NF_ACCEPT; + /* do not touch skb anymore */ +- atomic_inc(&cp->in_pkts); ++ atomic_inc_unchecked(&cp->in_pkts); + goto out; + } + +diff --git a/net/netfilter/nf_conntrack_acct.c b/net/netfilter/nf_conntrack_acct.c +index a4b5e2a..13b1de3 100644 +--- a/net/netfilter/nf_conntrack_acct.c ++++ b/net/netfilter/nf_conntrack_acct.c +@@ -62,7 +62,7 @@ static struct nf_ct_ext_type acct_extend __read_mostly = { + #ifdef CONFIG_SYSCTL + static int nf_conntrack_acct_init_sysctl(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + + table = kmemdup(acct_sysctl_table, sizeof(acct_sysctl_table), + GFP_KERNEL); +diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c +index c588012..b0d4ef8 100644 +--- a/net/netfilter/nf_conntrack_core.c ++++ b/net/netfilter/nf_conntrack_core.c +@@ -1737,6 +1737,10 @@ void nf_conntrack_init_end(void) + #define DYING_NULLS_VAL ((1<<30)+1) + #define TEMPLATE_NULLS_VAL ((1<<30)+2) + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++static atomic_unchecked_t conntrack_cache_id = ATOMIC_INIT(0); ++#endif ++ + int nf_conntrack_init_net(struct net *net) + { + int ret = -ENOMEM; +@@ -1762,7 +1766,11 @@ int nf_conntrack_init_net(struct net *net) + if (!net->ct.stat) + goto err_pcpu_lists; + ++#ifdef CONFIG_GRKERNSEC_HIDESYM ++ net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%08x", atomic_inc_return_unchecked(&conntrack_cache_id)); ++#else + net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%p", net); ++#endif + if (!net->ct.slabname) + goto err_slabname; + +diff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntrack_ecache.c +index 4e78c57..ec8fb74 100644 +--- a/net/netfilter/nf_conntrack_ecache.c ++++ b/net/netfilter/nf_conntrack_ecache.c +@@ -264,7 +264,7 @@ static struct nf_ct_ext_type event_extend __read_mostly = { + #ifdef CONFIG_SYSCTL + static int nf_conntrack_event_init_sysctl(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + + table = kmemdup(event_sysctl_table, sizeof(event_sysctl_table), + GFP_KERNEL); +diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c +index 5b3eae7..dd4b8fe 100644 +--- a/net/netfilter/nf_conntrack_helper.c ++++ b/net/netfilter/nf_conntrack_helper.c +@@ -57,7 +57,7 @@ static struct ctl_table helper_sysctl_table[] = { + + static int nf_conntrack_helper_init_sysctl(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + + table = kmemdup(helper_sysctl_table, sizeof(helper_sysctl_table), + GFP_KERNEL); +diff --git a/net/netfilter/nf_conntrack_proto.c b/net/netfilter/nf_conntrack_proto.c +index b65d586..beec902 100644 +--- a/net/netfilter/nf_conntrack_proto.c ++++ b/net/netfilter/nf_conntrack_proto.c +@@ -52,7 +52,7 @@ nf_ct_register_sysctl(struct net *net, + + static void + nf_ct_unregister_sysctl(struct ctl_table_header **header, +- struct ctl_table **table, ++ ctl_table_no_const **table, + unsigned int users) + { + if (users > 0) +diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c +index cf65a1e..2f291e9 100644 +--- a/net/netfilter/nf_conntrack_standalone.c ++++ b/net/netfilter/nf_conntrack_standalone.c +@@ -471,7 +471,7 @@ static struct ctl_table nf_ct_netfilter_table[] = { + + static int nf_conntrack_standalone_init_sysctl(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + + table = kmemdup(nf_ct_sysctl_table, sizeof(nf_ct_sysctl_table), + GFP_KERNEL); +diff --git a/net/netfilter/nf_conntrack_timestamp.c b/net/netfilter/nf_conntrack_timestamp.c +index 7a394df..bd91a8a 100644 +--- a/net/netfilter/nf_conntrack_timestamp.c ++++ b/net/netfilter/nf_conntrack_timestamp.c +@@ -42,7 +42,7 @@ static struct nf_ct_ext_type tstamp_extend __read_mostly = { + #ifdef CONFIG_SYSCTL + static int nf_conntrack_tstamp_init_sysctl(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + + table = kmemdup(tstamp_sysctl_table, sizeof(tstamp_sysctl_table), + GFP_KERNEL); +diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c +index d719764..311bc60 100644 +--- a/net/netfilter/nf_log.c ++++ b/net/netfilter/nf_log.c +@@ -353,7 +353,7 @@ static const struct file_operations nflog_file_ops = { + + #ifdef CONFIG_SYSCTL + static char nf_log_sysctl_fnames[NFPROTO_NUMPROTO-NFPROTO_UNSPEC][3]; +-static struct ctl_table nf_log_sysctl_table[NFPROTO_NUMPROTO+1]; ++static ctl_table_no_const nf_log_sysctl_table[NFPROTO_NUMPROTO+1] __read_only; + + static int nf_log_proc_dostring(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) +@@ -384,14 +384,16 @@ static int nf_log_proc_dostring(struct ctl_table *table, int write, + rcu_assign_pointer(net->nf.nf_loggers[tindex], logger); + mutex_unlock(&nf_log_mutex); + } else { ++ ctl_table_no_const nf_log_table = *table; ++ + mutex_lock(&nf_log_mutex); + logger = rcu_dereference_protected(net->nf.nf_loggers[tindex], + lockdep_is_held(&nf_log_mutex)); + if (!logger) +- table->data = "NONE"; ++ nf_log_table.data = "NONE"; + else +- table->data = logger->name; +- r = proc_dostring(table, write, buffer, lenp, ppos); ++ nf_log_table.data = logger->name; ++ r = proc_dostring(&nf_log_table, write, buffer, lenp, ppos); + mutex_unlock(&nf_log_mutex); + } + +diff --git a/net/netfilter/nf_sockopt.c b/net/netfilter/nf_sockopt.c +index c68c1e5..8b5d670 100644 +--- a/net/netfilter/nf_sockopt.c ++++ b/net/netfilter/nf_sockopt.c +@@ -43,7 +43,7 @@ int nf_register_sockopt(struct nf_sockopt_ops *reg) + } + } + +- list_add(®->list, &nf_sockopts); ++ pax_list_add((struct list_head *)®->list, &nf_sockopts); + out: + mutex_unlock(&nf_sockopt_mutex); + return ret; +@@ -53,7 +53,7 @@ EXPORT_SYMBOL(nf_register_sockopt); + void nf_unregister_sockopt(struct nf_sockopt_ops *reg) + { + mutex_lock(&nf_sockopt_mutex); +- list_del(®->list); ++ pax_list_del((struct list_head *)®->list); + mutex_unlock(&nf_sockopt_mutex); + } + EXPORT_SYMBOL(nf_unregister_sockopt); +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 71b574c..d319e8b 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -1134,9 +1134,11 @@ static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr) + /* Restore old counters on this cpu, no problem. Per-cpu statistics + * are not exposed to userspace. + */ ++ preempt_disable(); + stats = this_cpu_ptr(newstats); + stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES])); + stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS])); ++ preempt_enable(); + + return newstats; + } +diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c +index 5f1be5b..2cba8cd 100644 +--- a/net/netfilter/nfnetlink_log.c ++++ b/net/netfilter/nfnetlink_log.c +@@ -80,7 +80,7 @@ static int nfnl_log_net_id __read_mostly; + struct nfnl_log_net { + spinlock_t instances_lock; + struct hlist_head instance_table[INSTANCE_BUCKETS]; +- atomic_t global_seq; ++ atomic_unchecked_t global_seq; + }; + + static struct nfnl_log_net *nfnl_log_pernet(struct net *net) +@@ -563,7 +563,7 @@ __build_packet_message(struct nfnl_log_net *log, + /* global sequence number */ + if ((inst->flags & NFULNL_CFG_F_SEQ_GLOBAL) && + nla_put_be32(inst->skb, NFULA_SEQ_GLOBAL, +- htonl(atomic_inc_return(&log->global_seq)))) ++ htonl(atomic_inc_return_unchecked(&log->global_seq)))) + goto nla_put_failure; + + if (data_len) { +diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c +index 265e190..60ba228 100644 +--- a/net/netfilter/nft_compat.c ++++ b/net/netfilter/nft_compat.c +@@ -274,14 +274,7 @@ static void nft_match_eval(const struct nft_expr *expr, + return; + } + +- switch(ret) { +- case true: +- data[NFT_REG_VERDICT].verdict = NFT_CONTINUE; +- break; +- case false: +- data[NFT_REG_VERDICT].verdict = NFT_BREAK; +- break; +- } ++ data[NFT_REG_VERDICT].verdict = ret ? NFT_CONTINUE : NFT_BREAK; + } + + static const struct nla_policy nft_match_policy[NFTA_MATCH_MAX + 1] = { +diff --git a/net/netfilter/xt_gradm.c b/net/netfilter/xt_gradm.c +new file mode 100644 +index 0000000..c566332 +--- /dev/null ++++ b/net/netfilter/xt_gradm.c +@@ -0,0 +1,51 @@ ++/* ++ * gradm match for netfilter ++ * Copyright © Zbigniew Krzystolik, 2010 ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License; either version ++ * 2 or 3 as published by the Free Software Foundation. ++ */ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/skbuff.h> ++#include <linux/netfilter/x_tables.h> ++#include <linux/grsecurity.h> ++#include <linux/netfilter/xt_gradm.h> ++ ++static bool ++gradm_mt(const struct sk_buff *skb, struct xt_action_param *par) ++{ ++ const struct xt_gradm_mtinfo *info = par->matchinfo; ++ bool retval = false; ++ if (gr_acl_is_enabled()) ++ retval = true; ++ return retval ^ info->invflags; ++} ++ ++static struct xt_match gradm_mt_reg __read_mostly = { ++ .name = "gradm", ++ .revision = 0, ++ .family = NFPROTO_UNSPEC, ++ .match = gradm_mt, ++ .matchsize = XT_ALIGN(sizeof(struct xt_gradm_mtinfo)), ++ .me = THIS_MODULE, ++}; ++ ++static int __init gradm_mt_init(void) ++{ ++ return xt_register_match(&gradm_mt_reg); ++} ++ ++static void __exit gradm_mt_exit(void) ++{ ++ xt_unregister_match(&gradm_mt_reg); ++} ++ ++module_init(gradm_mt_init); ++module_exit(gradm_mt_exit); ++MODULE_AUTHOR("Zbigniew Krzystolik <zbyniu@destrukcja.pl>"); ++MODULE_DESCRIPTION("Xtables: Grsecurity RBAC match"); ++MODULE_LICENSE("GPL"); ++MODULE_ALIAS("ipt_gradm"); ++MODULE_ALIAS("ip6t_gradm"); +diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c +index 05fbc2a..4424b5c 100644 +--- a/net/netfilter/xt_hashlimit.c ++++ b/net/netfilter/xt_hashlimit.c +@@ -871,11 +871,11 @@ static int __net_init hashlimit_proc_net_init(struct net *net) + { + struct hashlimit_net *hashlimit_net = hashlimit_pernet(net); + +- hashlimit_net->ipt_hashlimit = proc_mkdir("ipt_hashlimit", net->proc_net); ++ hashlimit_net->ipt_hashlimit = proc_mkdir_restrict("ipt_hashlimit", net->proc_net); + if (!hashlimit_net->ipt_hashlimit) + return -ENOMEM; + #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) +- hashlimit_net->ip6t_hashlimit = proc_mkdir("ip6t_hashlimit", net->proc_net); ++ hashlimit_net->ip6t_hashlimit = proc_mkdir_restrict("ip6t_hashlimit", net->proc_net); + if (!hashlimit_net->ip6t_hashlimit) { + remove_proc_entry("ipt_hashlimit", net->proc_net); + return -ENOMEM; +diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c +index a9faae8..1ea30e0 100644 +--- a/net/netfilter/xt_recent.c ++++ b/net/netfilter/xt_recent.c +@@ -615,7 +615,7 @@ static int __net_init recent_proc_net_init(struct net *net) + { + struct recent_net *recent_net = recent_pernet(net); + +- recent_net->xt_recent = proc_mkdir("xt_recent", net->proc_net); ++ recent_net->xt_recent = proc_mkdir_restrict("xt_recent", net->proc_net); + if (!recent_net->xt_recent) + return -ENOMEM; + return 0; +diff --git a/net/netfilter/xt_statistic.c b/net/netfilter/xt_statistic.c +index 11de55e..f25e448 100644 +--- a/net/netfilter/xt_statistic.c ++++ b/net/netfilter/xt_statistic.c +@@ -19,7 +19,7 @@ + #include <linux/module.h> + + struct xt_statistic_priv { +- atomic_t count; ++ atomic_unchecked_t count; + } ____cacheline_aligned_in_smp; + + MODULE_LICENSE("GPL"); +@@ -42,9 +42,9 @@ statistic_mt(const struct sk_buff *skb, struct xt_action_param *par) + break; + case XT_STATISTIC_MODE_NTH: + do { +- oval = atomic_read(&info->master->count); ++ oval = atomic_read_unchecked(&info->master->count); + nval = (oval == info->u.nth.every) ? 0 : oval + 1; +- } while (atomic_cmpxchg(&info->master->count, oval, nval) != oval); ++ } while (atomic_cmpxchg_unchecked(&info->master->count, oval, nval) != oval); + if (nval == 0) + ret = !ret; + break; +@@ -64,7 +64,7 @@ static int statistic_mt_check(const struct xt_mtchk_param *par) + info->master = kzalloc(sizeof(*info->master), GFP_KERNEL); + if (info->master == NULL) + return -ENOMEM; +- atomic_set(&info->master->count, info->u.nth.count); ++ atomic_set_unchecked(&info->master->count, info->u.nth.count); + + return 0; + } +diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c +index 79c965a..ee2b76d 100644 +--- a/net/netlink/af_netlink.c ++++ b/net/netlink/af_netlink.c +@@ -273,7 +273,7 @@ static void netlink_overrun(struct sock *sk) + sk->sk_error_report(sk); + } + } +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + } + + static void netlink_rcv_wake(struct sock *sk) +@@ -2990,7 +2990,7 @@ static int netlink_seq_show(struct seq_file *seq, void *v) + sk_wmem_alloc_get(s), + nlk->cb_running, + atomic_read(&s->sk_refcnt), +- atomic_read(&s->sk_drops), ++ atomic_read_unchecked(&s->sk_drops), + sock_i_ino(s) + ); + +diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c +index 8451612..c8872bc 100644 +--- a/net/openvswitch/vport-internal_dev.c ++++ b/net/openvswitch/vport-internal_dev.c +@@ -122,7 +122,7 @@ static const struct net_device_ops internal_dev_netdev_ops = { + .ndo_get_stats64 = internal_dev_get_stats, + }; + +-static struct rtnl_link_ops internal_dev_link_ops __read_mostly = { ++static struct rtnl_link_ops internal_dev_link_ops = { + .kind = "openvswitch", + }; + +diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c +index 6015802..e81e8bf 100644 +--- a/net/openvswitch/vport.c ++++ b/net/openvswitch/vport.c +@@ -269,10 +269,10 @@ void ovs_vport_get_stats(struct vport *vport, struct ovs_vport_stats *stats) + * netdev-stats can be directly read over netlink-ioctl. + */ + +- stats->rx_errors = atomic_long_read(&vport->err_stats.rx_errors); +- stats->tx_errors = atomic_long_read(&vport->err_stats.tx_errors); +- stats->tx_dropped = atomic_long_read(&vport->err_stats.tx_dropped); +- stats->rx_dropped = atomic_long_read(&vport->err_stats.rx_dropped); ++ stats->rx_errors = atomic_long_read_unchecked(&vport->err_stats.rx_errors); ++ stats->tx_errors = atomic_long_read_unchecked(&vport->err_stats.tx_errors); ++ stats->tx_dropped = atomic_long_read_unchecked(&vport->err_stats.tx_dropped); ++ stats->rx_dropped = atomic_long_read_unchecked(&vport->err_stats.rx_dropped); + + for_each_possible_cpu(i) { + const struct pcpu_sw_netstats *percpu_stats; +@@ -503,19 +503,19 @@ static void ovs_vport_record_error(struct vport *vport, + { + switch (err_type) { + case VPORT_E_RX_DROPPED: +- atomic_long_inc(&vport->err_stats.rx_dropped); ++ atomic_long_inc_unchecked(&vport->err_stats.rx_dropped); + break; + + case VPORT_E_RX_ERROR: +- atomic_long_inc(&vport->err_stats.rx_errors); ++ atomic_long_inc_unchecked(&vport->err_stats.rx_errors); + break; + + case VPORT_E_TX_DROPPED: +- atomic_long_inc(&vport->err_stats.tx_dropped); ++ atomic_long_inc_unchecked(&vport->err_stats.tx_dropped); + break; + + case VPORT_E_TX_ERROR: +- atomic_long_inc(&vport->err_stats.tx_errors); ++ atomic_long_inc_unchecked(&vport->err_stats.tx_errors); + break; + } + +diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h +index ab01c65..07e43d9 100644 +--- a/net/openvswitch/vport.h ++++ b/net/openvswitch/vport.h +@@ -61,10 +61,10 @@ int ovs_vport_send(struct vport *, struct sk_buff *); + /* The following definitions are for implementers of vport devices: */ + + struct vport_err_stats { +- atomic_long_t rx_dropped; +- atomic_long_t rx_errors; +- atomic_long_t tx_dropped; +- atomic_long_t tx_errors; ++ atomic_long_unchecked_t rx_dropped; ++ atomic_long_unchecked_t rx_errors; ++ atomic_long_unchecked_t tx_dropped; ++ atomic_long_unchecked_t tx_errors; + }; + /** + * struct vport_portids - array of netlink portids of a vport. +diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c +index 07c04a8..3ca11eb 100644 +--- a/net/packet/af_packet.c ++++ b/net/packet/af_packet.c +@@ -269,7 +269,7 @@ static int packet_direct_xmit(struct sk_buff *skb) + + return ret; + drop: +- atomic_long_inc(&dev->tx_dropped); ++ atomic_long_inc_unchecked(&dev->tx_dropped); + kfree_skb(skb); + return NET_XMIT_DROP; + } +@@ -1836,7 +1836,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, + + spin_lock(&sk->sk_receive_queue.lock); + po->stats.stats1.tp_packets++; +- skb->dropcount = atomic_read(&sk->sk_drops); ++ skb->dropcount = atomic_read_unchecked(&sk->sk_drops); + __skb_queue_tail(&sk->sk_receive_queue, skb); + spin_unlock(&sk->sk_receive_queue.lock); + sk->sk_data_ready(sk); +@@ -1845,7 +1845,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, + drop_n_acct: + spin_lock(&sk->sk_receive_queue.lock); + po->stats.stats1.tp_drops++; +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + spin_unlock(&sk->sk_receive_queue.lock); + + drop_n_restore: +@@ -3460,7 +3460,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname, + case PACKET_HDRLEN: + if (len > sizeof(int)) + len = sizeof(int); +- if (copy_from_user(&val, optval, len)) ++ if (len > sizeof(val) || copy_from_user(&val, optval, len)) + return -EFAULT; + switch (val) { + case TPACKET_V1: +@@ -3506,7 +3506,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname, + len = lv; + if (put_user(len, optlen)) + return -EFAULT; +- if (copy_to_user(optval, data, len)) ++ if (len > sizeof(st) || copy_to_user(optval, data, len)) + return -EFAULT; + return 0; + } +diff --git a/net/phonet/pep.c b/net/phonet/pep.c +index 70a547e..23477fe 100644 +--- a/net/phonet/pep.c ++++ b/net/phonet/pep.c +@@ -388,7 +388,7 @@ static int pipe_do_rcv(struct sock *sk, struct sk_buff *skb) + + case PNS_PEP_CTRL_REQ: + if (skb_queue_len(&pn->ctrlreq_queue) >= PNPIPE_CTRLREQ_MAX) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + break; + } + __skb_pull(skb, 4); +@@ -409,7 +409,7 @@ static int pipe_do_rcv(struct sock *sk, struct sk_buff *skb) + } + + if (pn->rx_credits == 0) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + err = -ENOBUFS; + break; + } +@@ -579,7 +579,7 @@ static int pipe_handler_do_rcv(struct sock *sk, struct sk_buff *skb) + } + + if (pn->rx_credits == 0) { +- atomic_inc(&sk->sk_drops); ++ atomic_inc_unchecked(&sk->sk_drops); + err = NET_RX_DROP; + break; + } +diff --git a/net/phonet/socket.c b/net/phonet/socket.c +index 008214a..bb68240 100644 +--- a/net/phonet/socket.c ++++ b/net/phonet/socket.c +@@ -611,7 +611,7 @@ static int pn_sock_seq_show(struct seq_file *seq, void *v) + from_kuid_munged(seq_user_ns(seq), sock_i_uid(sk)), + sock_i_ino(sk), + atomic_read(&sk->sk_refcnt), sk, +- atomic_read(&sk->sk_drops)); ++ atomic_read_unchecked(&sk->sk_drops)); + } + seq_pad(seq, '\n'); + return 0; +diff --git a/net/phonet/sysctl.c b/net/phonet/sysctl.c +index c02a8c4..3c5b600 100644 +--- a/net/phonet/sysctl.c ++++ b/net/phonet/sysctl.c +@@ -67,7 +67,7 @@ static int proc_local_port_range(struct ctl_table *table, int write, + { + int ret; + int range[2] = {local_port_range[0], local_port_range[1]}; +- struct ctl_table tmp = { ++ ctl_table_no_const tmp = { + .data = &range, + .maxlen = sizeof(range), + .mode = table->mode, +diff --git a/net/rds/cong.c b/net/rds/cong.c +index e5b65ac..f3b6fb7 100644 +--- a/net/rds/cong.c ++++ b/net/rds/cong.c +@@ -78,7 +78,7 @@ + * finds that the saved generation number is smaller than the global generation + * number, it wakes up the process. + */ +-static atomic_t rds_cong_generation = ATOMIC_INIT(0); ++static atomic_unchecked_t rds_cong_generation = ATOMIC_INIT(0); + + /* + * Congestion monitoring +@@ -233,7 +233,7 @@ void rds_cong_map_updated(struct rds_cong_map *map, uint64_t portmask) + rdsdebug("waking map %p for %pI4\n", + map, &map->m_addr); + rds_stats_inc(s_cong_update_received); +- atomic_inc(&rds_cong_generation); ++ atomic_inc_unchecked(&rds_cong_generation); + if (waitqueue_active(&map->m_waitq)) + wake_up(&map->m_waitq); + if (waitqueue_active(&rds_poll_waitq)) +@@ -259,7 +259,7 @@ EXPORT_SYMBOL_GPL(rds_cong_map_updated); + + int rds_cong_updated_since(unsigned long *recent) + { +- unsigned long gen = atomic_read(&rds_cong_generation); ++ unsigned long gen = atomic_read_unchecked(&rds_cong_generation); + + if (likely(*recent == gen)) + return 0; +diff --git a/net/rds/connection.c b/net/rds/connection.c +index 378c3a6..ba4382c 100644 +--- a/net/rds/connection.c ++++ b/net/rds/connection.c +@@ -193,6 +193,7 @@ static struct rds_connection *__rds_conn_create(__be32 laddr, __be32 faddr, + } + + atomic_set(&conn->c_state, RDS_CONN_DOWN); ++ conn->c_send_gen = 0; + conn->c_reconnect_jiffies = 0; + INIT_DELAYED_WORK(&conn->c_send_w, rds_send_worker); + INIT_DELAYED_WORK(&conn->c_recv_w, rds_recv_worker); +diff --git a/net/rds/ib.h b/net/rds/ib.h +index 7280ab8..e04f4ea 100644 +--- a/net/rds/ib.h ++++ b/net/rds/ib.h +@@ -128,7 +128,7 @@ struct rds_ib_connection { + /* sending acks */ + unsigned long i_ack_flags; + #ifdef KERNEL_HAS_ATOMIC64 +- atomic64_t i_ack_next; /* next ACK to send */ ++ atomic64_unchecked_t i_ack_next; /* next ACK to send */ + #else + spinlock_t i_ack_lock; /* protect i_ack_next */ + u64 i_ack_next; /* next ACK to send */ +diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c +index 31b74f5..dc1fbfa 100644 +--- a/net/rds/ib_cm.c ++++ b/net/rds/ib_cm.c +@@ -717,7 +717,7 @@ void rds_ib_conn_shutdown(struct rds_connection *conn) + /* Clear the ACK state */ + clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags); + #ifdef KERNEL_HAS_ATOMIC64 +- atomic64_set(&ic->i_ack_next, 0); ++ atomic64_set_unchecked(&ic->i_ack_next, 0); + #else + ic->i_ack_next = 0; + #endif +diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c +index d67de45..73dbf51 100644 +--- a/net/rds/ib_recv.c ++++ b/net/rds/ib_recv.c +@@ -596,7 +596,7 @@ static u64 rds_ib_get_ack(struct rds_ib_connection *ic) + static void rds_ib_set_ack(struct rds_ib_connection *ic, u64 seq, + int ack_required) + { +- atomic64_set(&ic->i_ack_next, seq); ++ atomic64_set_unchecked(&ic->i_ack_next, seq); + if (ack_required) { + smp_mb__before_atomic(); + set_bit(IB_ACK_REQUESTED, &ic->i_ack_flags); +@@ -608,7 +608,7 @@ static u64 rds_ib_get_ack(struct rds_ib_connection *ic) + clear_bit(IB_ACK_REQUESTED, &ic->i_ack_flags); + smp_mb__after_atomic(); + +- return atomic64_read(&ic->i_ack_next); ++ return atomic64_read_unchecked(&ic->i_ack_next); + } + #endif + +diff --git a/net/rds/iw.h b/net/rds/iw.h +index 04ce3b1..48119a6 100644 +--- a/net/rds/iw.h ++++ b/net/rds/iw.h +@@ -134,7 +134,7 @@ struct rds_iw_connection { + /* sending acks */ + unsigned long i_ack_flags; + #ifdef KERNEL_HAS_ATOMIC64 +- atomic64_t i_ack_next; /* next ACK to send */ ++ atomic64_unchecked_t i_ack_next; /* next ACK to send */ + #else + spinlock_t i_ack_lock; /* protect i_ack_next */ + u64 i_ack_next; /* next ACK to send */ +diff --git a/net/rds/iw_cm.c b/net/rds/iw_cm.c +index a91e1db..cf3053f 100644 +--- a/net/rds/iw_cm.c ++++ b/net/rds/iw_cm.c +@@ -663,7 +663,7 @@ void rds_iw_conn_shutdown(struct rds_connection *conn) + /* Clear the ACK state */ + clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags); + #ifdef KERNEL_HAS_ATOMIC64 +- atomic64_set(&ic->i_ack_next, 0); ++ atomic64_set_unchecked(&ic->i_ack_next, 0); + #else + ic->i_ack_next = 0; + #endif +diff --git a/net/rds/iw_recv.c b/net/rds/iw_recv.c +index aa8bf67..b70133c 100644 +--- a/net/rds/iw_recv.c ++++ b/net/rds/iw_recv.c +@@ -427,7 +427,7 @@ static u64 rds_iw_get_ack(struct rds_iw_connection *ic) + static void rds_iw_set_ack(struct rds_iw_connection *ic, u64 seq, + int ack_required) + { +- atomic64_set(&ic->i_ack_next, seq); ++ atomic64_set_unchecked(&ic->i_ack_next, seq); + if (ack_required) { + smp_mb__before_atomic(); + set_bit(IB_ACK_REQUESTED, &ic->i_ack_flags); +@@ -439,7 +439,7 @@ static u64 rds_iw_get_ack(struct rds_iw_connection *ic) + clear_bit(IB_ACK_REQUESTED, &ic->i_ack_flags); + smp_mb__after_atomic(); + +- return atomic64_read(&ic->i_ack_next); ++ return atomic64_read_unchecked(&ic->i_ack_next); + } + #endif + +diff --git a/net/rds/rds.h b/net/rds/rds.h +index 48f8ffc..5c46cac 100644 +--- a/net/rds/rds.h ++++ b/net/rds/rds.h +@@ -110,6 +110,7 @@ struct rds_connection { + void *c_transport_data; + + atomic_t c_state; ++ unsigned long c_send_gen; + unsigned long c_flags; + unsigned long c_reconnect_jiffies; + struct delayed_work c_send_w; +@@ -449,7 +450,7 @@ struct rds_transport { + void (*sync_mr)(void *trans_private, int direction); + void (*free_mr)(void *trans_private, int invalidate); + void (*flush_mrs)(void); +-}; ++} __do_const; + + struct rds_sock { + struct sock rs_sk; +diff --git a/net/rds/send.c b/net/rds/send.c +index 0a64541..41c79b2 100644 +--- a/net/rds/send.c ++++ b/net/rds/send.c +@@ -140,8 +140,11 @@ int rds_send_xmit(struct rds_connection *conn) + struct scatterlist *sg; + int ret = 0; + LIST_HEAD(to_be_dropped); ++ int batch_count; ++ unsigned long send_gen = 0; + + restart: ++ batch_count = 0; + + /* + * sendmsg calls here after having queued its message on the send +@@ -157,6 +160,17 @@ restart: + } + + /* ++ * we record the send generation after doing the xmit acquire. ++ * if someone else manages to jump in and do some work, we'll use ++ * this to avoid a goto restart farther down. ++ * ++ * The acquire_in_xmit() check above ensures that only one ++ * caller can increment c_send_gen at any time. ++ */ ++ conn->c_send_gen++; ++ send_gen = conn->c_send_gen; ++ ++ /* + * rds_conn_shutdown() sets the conn state and then tests RDS_IN_XMIT, + * we do the opposite to avoid races. + */ +@@ -202,6 +216,16 @@ restart: + if (!rm) { + unsigned int len; + ++ batch_count++; ++ ++ /* we want to process as big a batch as we can, but ++ * we also want to avoid softlockups. If we've been ++ * through a lot of messages, lets back off and see ++ * if anyone else jumps in ++ */ ++ if (batch_count >= 1024) ++ goto over_batch; ++ + spin_lock_irqsave(&conn->c_lock, flags); + + if (!list_empty(&conn->c_send_queue)) { +@@ -357,9 +381,9 @@ restart: + } + } + ++over_batch: + if (conn->c_trans->xmit_complete) + conn->c_trans->xmit_complete(conn); +- + release_in_xmit(conn); + + /* Nuke any messages we decided not to retransmit. */ +@@ -380,10 +404,15 @@ restart: + * If the transport cannot continue (i.e ret != 0), then it must + * call us when more room is available, such as from the tx + * completion handler. ++ * ++ * We have an extra generation check here so that if someone manages ++ * to jump in after our release_in_xmit, we'll see that they have done ++ * some work and we will skip our goto + */ + if (ret == 0) { + smp_mb(); +- if (!list_empty(&conn->c_send_queue)) { ++ if (!list_empty(&conn->c_send_queue) && ++ send_gen == conn->c_send_gen) { + rds_stats_inc(s_send_lock_queue_raced); + goto restart; + } +diff --git a/net/rds/sysctl.c b/net/rds/sysctl.c +index c3b0cd4..c173f69 100644 +--- a/net/rds/sysctl.c ++++ b/net/rds/sysctl.c +@@ -71,14 +71,14 @@ static struct ctl_table rds_sysctl_rds_table[] = { + { + .procname = "max_unacked_packets", + .data = &rds_sysctl_max_unacked_packets, +- .maxlen = sizeof(unsigned long), ++ .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, + { + .procname = "max_unacked_bytes", + .data = &rds_sysctl_max_unacked_bytes, +- .maxlen = sizeof(unsigned long), ++ .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, +diff --git a/net/rds/tcp.c b/net/rds/tcp.c +index edac9ef..16bcb98 100644 +--- a/net/rds/tcp.c ++++ b/net/rds/tcp.c +@@ -59,7 +59,7 @@ void rds_tcp_nonagle(struct socket *sock) + int val = 1; + + set_fs(KERNEL_DS); +- sock->ops->setsockopt(sock, SOL_TCP, TCP_NODELAY, (char __user *)&val, ++ sock->ops->setsockopt(sock, SOL_TCP, TCP_NODELAY, (char __force_user *)&val, + sizeof(val)); + set_fs(oldfs); + } +diff --git a/net/rds/tcp_send.c b/net/rds/tcp_send.c +index 53b17ca..45463e7 100644 +--- a/net/rds/tcp_send.c ++++ b/net/rds/tcp_send.c +@@ -43,7 +43,7 @@ static void rds_tcp_cork(struct socket *sock, int val) + + oldfs = get_fs(); + set_fs(KERNEL_DS); +- sock->ops->setsockopt(sock, SOL_TCP, TCP_CORK, (char __user *)&val, ++ sock->ops->setsockopt(sock, SOL_TCP, TCP_CORK, (char __force_user *)&val, + sizeof(val)); + set_fs(oldfs); + } +diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c +index 7b16704..9628ec6 100644 +--- a/net/rxrpc/af_rxrpc.c ++++ b/net/rxrpc/af_rxrpc.c +@@ -40,7 +40,7 @@ static const struct proto_ops rxrpc_rpc_ops; + __be32 rxrpc_epoch; + + /* current debugging ID */ +-atomic_t rxrpc_debug_id; ++atomic_unchecked_t rxrpc_debug_id; + + /* count of skbs currently in use */ + atomic_t rxrpc_n_skbs; +diff --git a/net/rxrpc/ar-ack.c b/net/rxrpc/ar-ack.c +index c6be17a..2a6200a 100644 +--- a/net/rxrpc/ar-ack.c ++++ b/net/rxrpc/ar-ack.c +@@ -223,7 +223,7 @@ static void rxrpc_resend(struct rxrpc_call *call) + + _enter("{%d,%d,%d,%d},", + call->acks_hard, call->acks_unacked, +- atomic_read(&call->sequence), ++ atomic_read_unchecked(&call->sequence), + CIRC_CNT(call->acks_head, call->acks_tail, call->acks_winsz)); + + stop = 0; +@@ -247,7 +247,7 @@ static void rxrpc_resend(struct rxrpc_call *call) + + /* each Tx packet has a new serial number */ + sp->hdr.serial = +- htonl(atomic_inc_return(&call->conn->serial)); ++ htonl(atomic_inc_return_unchecked(&call->conn->serial)); + + hdr = (struct rxrpc_header *) txb->head; + hdr->serial = sp->hdr.serial; +@@ -451,7 +451,7 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, u32 hard) + */ + static void rxrpc_clear_tx_window(struct rxrpc_call *call) + { +- rxrpc_rotate_tx_window(call, atomic_read(&call->sequence)); ++ rxrpc_rotate_tx_window(call, atomic_read_unchecked(&call->sequence)); + } + + /* +@@ -677,7 +677,7 @@ process_further: + + latest = ntohl(sp->hdr.serial); + hard = ntohl(ack.firstPacket); +- tx = atomic_read(&call->sequence); ++ tx = atomic_read_unchecked(&call->sequence); + + _proto("Rx ACK %%%u { m=%hu f=#%u p=#%u s=%%%u r=%s n=%u }", + latest, +@@ -1209,7 +1209,7 @@ void rxrpc_process_call(struct work_struct *work) + goto maybe_reschedule; + + send_ACK_with_skew: +- ack.maxSkew = htons(atomic_read(&call->conn->hi_serial) - ++ ack.maxSkew = htons(atomic_read_unchecked(&call->conn->hi_serial) - + ntohl(ack.serial)); + send_ACK: + mtu = call->conn->trans->peer->if_mtu; +@@ -1221,7 +1221,7 @@ send_ACK: + ackinfo.rxMTU = htonl(rxrpc_rx_mtu); + ackinfo.jumbo_max = htonl(rxrpc_rx_jumbo_max); + +- hdr.serial = htonl(atomic_inc_return(&call->conn->serial)); ++ hdr.serial = htonl(atomic_inc_return_unchecked(&call->conn->serial)); + _proto("Tx ACK %%%u { m=%hu f=#%u p=#%u s=%%%u r=%s n=%u }", + ntohl(hdr.serial), + ntohs(ack.maxSkew), +@@ -1239,7 +1239,7 @@ send_ACK: + send_message: + _debug("send message"); + +- hdr.serial = htonl(atomic_inc_return(&call->conn->serial)); ++ hdr.serial = htonl(atomic_inc_return_unchecked(&call->conn->serial)); + _proto("Tx %s %%%u", rxrpc_pkts[hdr.type], ntohl(hdr.serial)); + send_message_2: + +diff --git a/net/rxrpc/ar-call.c b/net/rxrpc/ar-call.c +index a9e05db..194e793 100644 +--- a/net/rxrpc/ar-call.c ++++ b/net/rxrpc/ar-call.c +@@ -232,7 +232,7 @@ static struct rxrpc_call *rxrpc_alloc_call(gfp_t gfp) + spin_lock_init(&call->lock); + rwlock_init(&call->state_lock); + atomic_set(&call->usage, 1); +- call->debug_id = atomic_inc_return(&rxrpc_debug_id); ++ call->debug_id = atomic_inc_return_unchecked(&rxrpc_debug_id); + call->state = RXRPC_CALL_CLIENT_SEND_REQUEST; + + memset(&call->sock_node, 0xed, sizeof(call->sock_node)); +diff --git a/net/rxrpc/ar-connection.c b/net/rxrpc/ar-connection.c +index 6631f4f..bfdf056 100644 +--- a/net/rxrpc/ar-connection.c ++++ b/net/rxrpc/ar-connection.c +@@ -210,7 +210,7 @@ static struct rxrpc_connection *rxrpc_alloc_connection(gfp_t gfp) + rwlock_init(&conn->lock); + spin_lock_init(&conn->state_lock); + atomic_set(&conn->usage, 1); +- conn->debug_id = atomic_inc_return(&rxrpc_debug_id); ++ conn->debug_id = atomic_inc_return_unchecked(&rxrpc_debug_id); + conn->avail_calls = RXRPC_MAXCALLS; + conn->size_align = 4; + conn->header_size = sizeof(struct rxrpc_header); +diff --git a/net/rxrpc/ar-connevent.c b/net/rxrpc/ar-connevent.c +index e7ed43a..6afa140 100644 +--- a/net/rxrpc/ar-connevent.c ++++ b/net/rxrpc/ar-connevent.c +@@ -109,7 +109,7 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn, + + len = iov[0].iov_len + iov[1].iov_len; + +- hdr.serial = htonl(atomic_inc_return(&conn->serial)); ++ hdr.serial = htonl(atomic_inc_return_unchecked(&conn->serial)); + _proto("Tx CONN ABORT %%%u { %d }", ntohl(hdr.serial), abort_code); + + ret = kernel_sendmsg(conn->trans->local->socket, &msg, iov, 2, len); +diff --git a/net/rxrpc/ar-input.c b/net/rxrpc/ar-input.c +index 481f89f..ceeaf8d 100644 +--- a/net/rxrpc/ar-input.c ++++ b/net/rxrpc/ar-input.c +@@ -331,9 +331,9 @@ void rxrpc_fast_process_packet(struct rxrpc_call *call, struct sk_buff *skb) + /* track the latest serial number on this connection for ACK packet + * information */ + serial = ntohl(sp->hdr.serial); +- hi_serial = atomic_read(&call->conn->hi_serial); ++ hi_serial = atomic_read_unchecked(&call->conn->hi_serial); + while (serial > hi_serial) +- hi_serial = atomic_cmpxchg(&call->conn->hi_serial, hi_serial, ++ hi_serial = atomic_cmpxchg_unchecked(&call->conn->hi_serial, hi_serial, + serial); + + /* request ACK generation for any ACK or DATA packet that requests +diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h +index ba9fd36..9bbfe01 100644 +--- a/net/rxrpc/ar-internal.h ++++ b/net/rxrpc/ar-internal.h +@@ -272,8 +272,8 @@ struct rxrpc_connection { + int error; /* error code for local abort */ + int debug_id; /* debug ID for printks */ + unsigned int call_counter; /* call ID counter */ +- atomic_t serial; /* packet serial number counter */ +- atomic_t hi_serial; /* highest serial number received */ ++ atomic_unchecked_t serial; /* packet serial number counter */ ++ atomic_unchecked_t hi_serial; /* highest serial number received */ + u8 avail_calls; /* number of calls available */ + u8 size_align; /* data size alignment (for security) */ + u8 header_size; /* rxrpc + security header size */ +@@ -346,7 +346,7 @@ struct rxrpc_call { + spinlock_t lock; + rwlock_t state_lock; /* lock for state transition */ + atomic_t usage; +- atomic_t sequence; /* Tx data packet sequence counter */ ++ atomic_unchecked_t sequence; /* Tx data packet sequence counter */ + u32 abort_code; /* local/remote abort code */ + enum { /* current state of call */ + RXRPC_CALL_CLIENT_SEND_REQUEST, /* - client sending request phase */ +@@ -431,7 +431,7 @@ static inline void rxrpc_abort_call(struct rxrpc_call *call, u32 abort_code) + */ + extern atomic_t rxrpc_n_skbs; + extern __be32 rxrpc_epoch; +-extern atomic_t rxrpc_debug_id; ++extern atomic_unchecked_t rxrpc_debug_id; + extern struct workqueue_struct *rxrpc_workqueue; + + /* +diff --git a/net/rxrpc/ar-local.c b/net/rxrpc/ar-local.c +index 87f7135..74d3703 100644 +--- a/net/rxrpc/ar-local.c ++++ b/net/rxrpc/ar-local.c +@@ -45,7 +45,7 @@ struct rxrpc_local *rxrpc_alloc_local(struct sockaddr_rxrpc *srx) + spin_lock_init(&local->lock); + rwlock_init(&local->services_lock); + atomic_set(&local->usage, 1); +- local->debug_id = atomic_inc_return(&rxrpc_debug_id); ++ local->debug_id = atomic_inc_return_unchecked(&rxrpc_debug_id); + memcpy(&local->srx, srx, sizeof(*srx)); + } + +diff --git a/net/rxrpc/ar-output.c b/net/rxrpc/ar-output.c +index 0b4b9a7..966ffbb 100644 +--- a/net/rxrpc/ar-output.c ++++ b/net/rxrpc/ar-output.c +@@ -682,14 +682,14 @@ static int rxrpc_send_data(struct kiocb *iocb, + memset(skb_put(skb, pad), 0, pad); + } + +- seq = atomic_inc_return(&call->sequence); ++ seq = atomic_inc_return_unchecked(&call->sequence); + + sp->hdr.epoch = conn->epoch; + sp->hdr.cid = call->cid; + sp->hdr.callNumber = call->call_id; + sp->hdr.seq = htonl(seq); + sp->hdr.serial = +- htonl(atomic_inc_return(&conn->serial)); ++ htonl(atomic_inc_return_unchecked(&conn->serial)); + sp->hdr.type = RXRPC_PACKET_TYPE_DATA; + sp->hdr.userStatus = 0; + sp->hdr.securityIndex = conn->security_ix; +diff --git a/net/rxrpc/ar-peer.c b/net/rxrpc/ar-peer.c +index bebaa43..2644591 100644 +--- a/net/rxrpc/ar-peer.c ++++ b/net/rxrpc/ar-peer.c +@@ -72,7 +72,7 @@ static struct rxrpc_peer *rxrpc_alloc_peer(struct sockaddr_rxrpc *srx, + INIT_LIST_HEAD(&peer->error_targets); + spin_lock_init(&peer->lock); + atomic_set(&peer->usage, 1); +- peer->debug_id = atomic_inc_return(&rxrpc_debug_id); ++ peer->debug_id = atomic_inc_return_unchecked(&rxrpc_debug_id); + memcpy(&peer->srx, srx, sizeof(*srx)); + + rxrpc_assess_MTU_size(peer); +diff --git a/net/rxrpc/ar-proc.c b/net/rxrpc/ar-proc.c +index 38047f7..9f48511 100644 +--- a/net/rxrpc/ar-proc.c ++++ b/net/rxrpc/ar-proc.c +@@ -164,8 +164,8 @@ static int rxrpc_connection_seq_show(struct seq_file *seq, void *v) + atomic_read(&conn->usage), + rxrpc_conn_states[conn->state], + key_serial(conn->key), +- atomic_read(&conn->serial), +- atomic_read(&conn->hi_serial)); ++ atomic_read_unchecked(&conn->serial), ++ atomic_read_unchecked(&conn->hi_serial)); + + return 0; + } +diff --git a/net/rxrpc/ar-transport.c b/net/rxrpc/ar-transport.c +index 1976dec..aa70be5 100644 +--- a/net/rxrpc/ar-transport.c ++++ b/net/rxrpc/ar-transport.c +@@ -51,7 +51,7 @@ static struct rxrpc_transport *rxrpc_alloc_transport(struct rxrpc_local *local, + spin_lock_init(&trans->client_lock); + rwlock_init(&trans->conn_lock); + atomic_set(&trans->usage, 1); +- trans->debug_id = atomic_inc_return(&rxrpc_debug_id); ++ trans->debug_id = atomic_inc_return_unchecked(&rxrpc_debug_id); + + if (peer->srx.transport.family == AF_INET) { + switch (peer->srx.transport_type) { +diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c +index f226709..0e735a8 100644 +--- a/net/rxrpc/rxkad.c ++++ b/net/rxrpc/rxkad.c +@@ -610,7 +610,7 @@ static int rxkad_issue_challenge(struct rxrpc_connection *conn) + + len = iov[0].iov_len + iov[1].iov_len; + +- hdr.serial = htonl(atomic_inc_return(&conn->serial)); ++ hdr.serial = htonl(atomic_inc_return_unchecked(&conn->serial)); + _proto("Tx CHALLENGE %%%u", ntohl(hdr.serial)); + + ret = kernel_sendmsg(conn->trans->local->socket, &msg, iov, 2, len); +@@ -660,7 +660,7 @@ static int rxkad_send_response(struct rxrpc_connection *conn, + + len = iov[0].iov_len + iov[1].iov_len + iov[2].iov_len; + +- hdr->serial = htonl(atomic_inc_return(&conn->serial)); ++ hdr->serial = htonl(atomic_inc_return_unchecked(&conn->serial)); + _proto("Tx RESPONSE %%%u", ntohl(hdr->serial)); + + ret = kernel_sendmsg(conn->trans->local->socket, &msg, iov, 3, len); +diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c +index aad6a67..baef987 100644 +--- a/net/sched/cls_api.c ++++ b/net/sched/cls_api.c +@@ -556,8 +556,9 @@ void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst, + } + EXPORT_SYMBOL(tcf_exts_change); + +-#define tcf_exts_first_act(ext) \ +- list_first_entry(&(exts)->actions, struct tc_action, list) ++#define tcf_exts_first_act(ext) \ ++ list_first_entry_or_null(&(exts)->actions, \ ++ struct tc_action, list) + + int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts) + { +@@ -603,7 +604,7 @@ int tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts) + { + #ifdef CONFIG_NET_CLS_ACT + struct tc_action *a = tcf_exts_first_act(exts); +- if (tcf_action_copy_stats(skb, a, 1) < 0) ++ if (a != NULL && tcf_action_copy_stats(skb, a, 1) < 0) + return -1; + #endif + return 0; +diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c +index eed49d1..ce22514 100644 +--- a/net/sched/cls_bpf.c ++++ b/net/sched/cls_bpf.c +@@ -191,6 +191,11 @@ static int cls_bpf_modify_existing(struct net *net, struct tcf_proto *tp, + } + + bpf_size = bpf_len * sizeof(*bpf_ops); ++ if (bpf_size != nla_len(tb[TCA_BPF_OPS])) { ++ ret = -EINVAL; ++ goto errout; ++ } ++ + bpf_ops = kzalloc(bpf_size, GFP_KERNEL); + if (bpf_ops == NULL) { + ret = -ENOMEM; +@@ -226,15 +231,21 @@ static u32 cls_bpf_grab_new_handle(struct tcf_proto *tp, + struct cls_bpf_head *head) + { + unsigned int i = 0x80000000; ++ u32 handle; + + do { + if (++head->hgen == 0x7FFFFFFF) + head->hgen = 1; + } while (--i > 0 && cls_bpf_get(tp, head->hgen)); +- if (i == 0) ++ ++ if (unlikely(i == 0)) { + pr_err("Insufficient number of handles\n"); ++ handle = 0; ++ } else { ++ handle = head->hgen; ++ } + +- return i; ++ return handle; + } + + static int cls_bpf_change(struct net *net, struct sk_buff *in_skb, +diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c +index 6efca30..1259f82 100644 +--- a/net/sched/sch_generic.c ++++ b/net/sched/sch_generic.c +@@ -349,7 +349,7 @@ void netif_carrier_on(struct net_device *dev) + if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { + if (dev->reg_state == NETREG_UNINITIALIZED) + return; +- atomic_inc(&dev->carrier_changes); ++ atomic_inc_unchecked(&dev->carrier_changes); + linkwatch_fire_event(dev); + if (netif_running(dev)) + __netdev_watchdog_up(dev); +@@ -368,7 +368,7 @@ void netif_carrier_off(struct net_device *dev) + if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) { + if (dev->reg_state == NETREG_UNINITIALIZED) + return; +- atomic_inc(&dev->carrier_changes); ++ atomic_inc_unchecked(&dev->carrier_changes); + linkwatch_fire_event(dev); + } + } +diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c +index 0e4198e..f94193e 100644 +--- a/net/sctp/ipv6.c ++++ b/net/sctp/ipv6.c +@@ -972,7 +972,7 @@ static const struct inet6_protocol sctpv6_protocol = { + .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL, + }; + +-static struct sctp_af sctp_af_inet6 = { ++static struct sctp_af sctp_af_inet6 __read_only = { + .sa_family = AF_INET6, + .sctp_xmit = sctp_v6_xmit, + .setsockopt = ipv6_setsockopt, +@@ -1002,7 +1002,7 @@ static struct sctp_af sctp_af_inet6 = { + #endif + }; + +-static struct sctp_pf sctp_pf_inet6 = { ++static struct sctp_pf sctp_pf_inet6 __read_only = { + .event_msgname = sctp_inet6_event_msgname, + .skb_msgname = sctp_inet6_skb_msgname, + .af_supported = sctp_inet6_af_supported, +@@ -1029,7 +1029,7 @@ void sctp_v6_pf_init(void) + + void sctp_v6_pf_exit(void) + { +- list_del(&sctp_af_inet6.list); ++ pax_list_del(&sctp_af_inet6.list); + } + + /* Initialize IPv6 support and register with socket layer. */ +diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c +index 8f34b27..b105385 100644 +--- a/net/sctp/protocol.c ++++ b/net/sctp/protocol.c +@@ -836,8 +836,10 @@ int sctp_register_af(struct sctp_af *af) + return 0; + } + ++ pax_open_kernel(); + INIT_LIST_HEAD(&af->list); +- list_add_tail(&af->list, &sctp_address_families); ++ pax_close_kernel(); ++ pax_list_add_tail(&af->list, &sctp_address_families); + return 1; + } + +@@ -967,7 +969,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb, + + static struct sctp_af sctp_af_inet; + +-static struct sctp_pf sctp_pf_inet = { ++static struct sctp_pf sctp_pf_inet __read_only = { + .event_msgname = sctp_inet_event_msgname, + .skb_msgname = sctp_inet_skb_msgname, + .af_supported = sctp_inet_af_supported, +@@ -1039,7 +1041,7 @@ static const struct net_protocol sctp_protocol = { + }; + + /* IPv4 address related functions. */ +-static struct sctp_af sctp_af_inet = { ++static struct sctp_af sctp_af_inet __read_only = { + .sa_family = AF_INET, + .sctp_xmit = sctp_v4_xmit, + .setsockopt = ip_setsockopt, +@@ -1123,7 +1125,7 @@ static void sctp_v4_pf_init(void) + + static void sctp_v4_pf_exit(void) + { +- list_del(&sctp_af_inet.list); ++ pax_list_del(&sctp_af_inet.list); + } + + static int sctp_v4_protosw_init(void) +diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c +index fef2acd..c705c4f 100644 +--- a/net/sctp/sm_sideeffect.c ++++ b/net/sctp/sm_sideeffect.c +@@ -439,7 +439,7 @@ static void sctp_generate_sack_event(unsigned long data) + sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_SACK); + } + +-sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES] = { ++sctp_timer_event_t * const sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES] = { + NULL, + sctp_generate_t1_cookie_event, + sctp_generate_t1_init_event, +diff --git a/net/sctp/socket.c b/net/sctp/socket.c +index 634a2ab..dfdaf9b 100644 +--- a/net/sctp/socket.c ++++ b/net/sctp/socket.c +@@ -1603,7 +1603,7 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, + sctp_assoc_t associd = 0; + sctp_cmsgs_t cmsgs = { NULL }; + sctp_scope_t scope; +- bool fill_sinfo_ttl = false; ++ bool fill_sinfo_ttl = false, wait_connect = false; + struct sctp_datamsg *datamsg; + int msg_flags = msg->msg_flags; + __u16 sinfo_flags = 0; +@@ -1943,6 +1943,7 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, + if (err < 0) + goto out_free; + ++ wait_connect = true; + pr_debug("%s: we associated primitively\n", __func__); + } + +@@ -1980,6 +1981,11 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, + sctp_datamsg_put(datamsg); + err = msg_len; + ++ if (unlikely(wait_connect)) { ++ timeo = sock_sndtimeo(sk, msg_flags & MSG_DONTWAIT); ++ sctp_wait_for_connect(asoc, &timeo); ++ } ++ + /* If we are already past ASSOCIATE, the lower + * layers are responsible for association cleanup. + */ +@@ -2199,11 +2205,13 @@ static int sctp_setsockopt_events(struct sock *sk, char __user *optval, + { + struct sctp_association *asoc; + struct sctp_ulpevent *event; ++ struct sctp_event_subscribe subscribe; + + if (optlen > sizeof(struct sctp_event_subscribe)) + return -EINVAL; +- if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen)) ++ if (copy_from_user(&subscribe, optval, optlen)) + return -EFAULT; ++ sctp_sk(sk)->subscribe = subscribe; + + if (sctp_sk(sk)->subscribe.sctp_data_io_event) + pr_warn_ratelimited(DEPRECATED "%s (pid %d) " +@@ -4372,13 +4380,16 @@ static int sctp_getsockopt_disable_fragments(struct sock *sk, int len, + static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, + int __user *optlen) + { ++ struct sctp_event_subscribe subscribe; ++ + if (len <= 0) + return -EINVAL; + if (len > sizeof(struct sctp_event_subscribe)) + len = sizeof(struct sctp_event_subscribe); + if (put_user(len, optlen)) + return -EFAULT; +- if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) ++ subscribe = sctp_sk(sk)->subscribe; ++ if (copy_to_user(optval, &subscribe, len)) + return -EFAULT; + return 0; + } +@@ -4396,6 +4407,8 @@ static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, + */ + static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *optlen) + { ++ __u32 autoclose; ++ + /* Applicable to UDP-style socket only */ + if (sctp_style(sk, TCP)) + return -EOPNOTSUPP; +@@ -4404,7 +4417,8 @@ static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optv + len = sizeof(int); + if (put_user(len, optlen)) + return -EFAULT; +- if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int))) ++ autoclose = sctp_sk(sk)->autoclose; ++ if (copy_to_user(optval, &autoclose, sizeof(int))) + return -EFAULT; + return 0; + } +@@ -4778,12 +4792,15 @@ static int sctp_getsockopt_delayed_ack(struct sock *sk, int len, + */ + static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optlen) + { ++ struct sctp_initmsg initmsg; ++ + if (len < sizeof(struct sctp_initmsg)) + return -EINVAL; + len = sizeof(struct sctp_initmsg); + if (put_user(len, optlen)) + return -EFAULT; +- if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len)) ++ initmsg = sctp_sk(sk)->initmsg; ++ if (copy_to_user(optval, &initmsg, len)) + return -EFAULT; + return 0; + } +@@ -4824,6 +4841,8 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len, + ->addr_to_user(sp, &temp); + if (space_left < addrlen) + return -ENOMEM; ++ if (addrlen > sizeof(temp) || addrlen < 0) ++ return -EFAULT; + if (copy_to_user(to, &temp, addrlen)) + return -EFAULT; + to += addrlen; +diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c +index 2e9ada1..40f425d 100644 +--- a/net/sctp/sysctl.c ++++ b/net/sctp/sysctl.c +@@ -321,7 +321,7 @@ static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write, + loff_t *ppos) + { + struct net *net = current->nsproxy->net_ns; +- struct ctl_table tbl; ++ ctl_table_no_const tbl; + bool changed = false; + char *none = "none"; + char tmp[8]; +@@ -369,7 +369,7 @@ static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write, + struct net *net = current->nsproxy->net_ns; + unsigned int min = *(unsigned int *) ctl->extra1; + unsigned int max = *(unsigned int *) ctl->extra2; +- struct ctl_table tbl; ++ ctl_table_no_const tbl; + int ret, new_value; + + memset(&tbl, 0, sizeof(struct ctl_table)); +@@ -398,7 +398,7 @@ static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write, + struct net *net = current->nsproxy->net_ns; + unsigned int min = *(unsigned int *) ctl->extra1; + unsigned int max = *(unsigned int *) ctl->extra2; +- struct ctl_table tbl; ++ ctl_table_no_const tbl; + int ret, new_value; + + memset(&tbl, 0, sizeof(struct ctl_table)); +@@ -436,7 +436,7 @@ static int proc_sctp_do_auth(struct ctl_table *ctl, int write, + loff_t *ppos) + { + struct net *net = current->nsproxy->net_ns; +- struct ctl_table tbl; ++ ctl_table_no_const tbl; + int new_value, ret; + + memset(&tbl, 0, sizeof(struct ctl_table)); +@@ -463,7 +463,7 @@ static int proc_sctp_do_auth(struct ctl_table *ctl, int write, + + int sctp_sysctl_net_register(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + int i; + + table = kmemdup(sctp_net_table, sizeof(sctp_net_table), GFP_KERNEL); +diff --git a/net/socket.c b/net/socket.c +index cf9ebf1..9522714 100644 +--- a/net/socket.c ++++ b/net/socket.c +@@ -89,6 +89,7 @@ + #include <linux/magic.h> + #include <linux/slab.h> + #include <linux/xattr.h> ++#include <linux/in.h> + + #include <asm/uaccess.h> + #include <asm/unistd.h> +@@ -113,6 +114,8 @@ unsigned int sysctl_net_busy_read __read_mostly; + unsigned int sysctl_net_busy_poll __read_mostly; + #endif + ++#include <linux/grsock.h> ++ + static int sock_no_open(struct inode *irrelevant, struct file *dontcare); + static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov, + unsigned long nr_segs, loff_t pos); +@@ -164,7 +167,7 @@ static const struct file_operations socket_file_ops = { + */ + + static DEFINE_SPINLOCK(net_family_lock); +-static const struct net_proto_family __rcu *net_families[NPROTO] __read_mostly; ++const struct net_proto_family __rcu *net_families[NPROTO] __read_mostly; + + /* + * Statistics counters of the socket lists +@@ -330,7 +333,7 @@ static struct dentry *sockfs_mount(struct file_system_type *fs_type, + &sockfs_dentry_operations, SOCKFS_MAGIC); + } + +-static struct vfsmount *sock_mnt __read_mostly; ++struct vfsmount *sock_mnt __read_mostly; + + static struct file_system_type sock_fs_type = { + .name = "sockfs", +@@ -1260,6 +1263,8 @@ int __sock_create(struct net *net, int family, int type, int protocol, + return -EAFNOSUPPORT; + if (type < 0 || type >= SOCK_MAX) + return -EINVAL; ++ if (protocol < 0) ++ return -EINVAL; + + /* Compatibility. + +@@ -1280,6 +1285,20 @@ int __sock_create(struct net *net, int family, int type, int protocol, + if (err) + return err; + ++ if(!kern && !gr_search_socket(family, type, protocol)) { ++ if (rcu_access_pointer(net_families[family]) == NULL) ++ return -EAFNOSUPPORT; ++ else ++ return -EACCES; ++ } ++ ++ if (!kern && gr_handle_sock_all(family, type, protocol)) { ++ if (rcu_access_pointer(net_families[family]) == NULL) ++ return -EAFNOSUPPORT; ++ else ++ return -EACCES; ++ } ++ + /* + * Allocate the socket and allow the family to set things up. if + * the protocol is 0, the family is instructed to select an appropriate +@@ -1531,6 +1550,14 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) + if (sock) { + err = move_addr_to_kernel(umyaddr, addrlen, &address); + if (err >= 0) { ++ if (gr_handle_sock_server((struct sockaddr *)&address)) { ++ err = -EACCES; ++ goto error; ++ } ++ err = gr_search_bind(sock, (struct sockaddr_in *)&address); ++ if (err) ++ goto error; ++ + err = security_socket_bind(sock, + (struct sockaddr *)&address, + addrlen); +@@ -1539,6 +1566,7 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) + (struct sockaddr *) + &address, addrlen); + } ++error: + fput_light(sock->file, fput_needed); + } + return err; +@@ -1562,10 +1590,20 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog) + if ((unsigned int)backlog > somaxconn) + backlog = somaxconn; + ++ if (gr_handle_sock_server_other(sock->sk)) { ++ err = -EPERM; ++ goto error; ++ } ++ ++ err = gr_search_listen(sock); ++ if (err) ++ goto error; ++ + err = security_socket_listen(sock, backlog); + if (!err) + err = sock->ops->listen(sock, backlog); + ++error: + fput_light(sock->file, fput_needed); + } + return err; +@@ -1609,6 +1647,18 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, + newsock->type = sock->type; + newsock->ops = sock->ops; + ++ if (gr_handle_sock_server_other(sock->sk)) { ++ err = -EPERM; ++ sock_release(newsock); ++ goto out_put; ++ } ++ ++ err = gr_search_accept(sock); ++ if (err) { ++ sock_release(newsock); ++ goto out_put; ++ } ++ + /* + * We don't need try_module_get here, as the listening socket (sock) + * has the protocol module (sock->ops->owner) held. +@@ -1654,6 +1704,8 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, + fd_install(newfd, newfile); + err = newfd; + ++ gr_attach_curr_ip(newsock->sk); ++ + out_put: + fput_light(sock->file, fput_needed); + out: +@@ -1686,6 +1738,7 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr, + int, addrlen) + { + struct socket *sock; ++ struct sockaddr *sck; + struct sockaddr_storage address; + int err, fput_needed; + +@@ -1696,6 +1749,17 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr, + if (err < 0) + goto out_put; + ++ sck = (struct sockaddr *)&address; ++ ++ if (gr_handle_sock_client(sck)) { ++ err = -EACCES; ++ goto out_put; ++ } ++ ++ err = gr_search_connect(sock, (struct sockaddr_in *)sck); ++ if (err) ++ goto out_put; ++ + err = + security_socket_connect(sock, (struct sockaddr *)&address, addrlen); + if (err) +@@ -1777,6 +1841,8 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr, + * the protocol. + */ + ++asmlinkage long sys_sendto(int, void __user *, size_t, unsigned, struct sockaddr __user *, int); ++ + SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len, + unsigned int, flags, struct sockaddr __user *, addr, + int, addr_len) +@@ -1843,7 +1909,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size, + struct socket *sock; + struct iovec iov; + struct msghdr msg; +- struct sockaddr_storage address; ++ struct sockaddr_storage address = { }; + int err, err2; + int fput_needed; + +@@ -2072,7 +2138,7 @@ static int ___sys_sendmsg(struct socket *sock, struct msghdr __user *msg, + * checking falls down on this. + */ + if (copy_from_user(ctl_buf, +- (void __user __force *)msg_sys->msg_control, ++ (void __force_user *)msg_sys->msg_control, + ctl_len)) + goto out_freectl; + msg_sys->msg_control = ctl_buf; +@@ -2223,7 +2289,7 @@ static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg, + int err, total_len, len; + + /* kernel mode address */ +- struct sockaddr_storage addr; ++ struct sockaddr_storage addr = { }; + + /* user mode address pointers */ + struct sockaddr __user *uaddr; +@@ -2252,7 +2318,7 @@ static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg, + /* Save the user-mode address (verify_iovec will change the + * kernel msghdr to use the kernel address space) + */ +- uaddr = (__force void __user *)msg_sys->msg_name; ++ uaddr = (void __force_user *)msg_sys->msg_name; + uaddr_len = COMPAT_NAMELEN(msg); + if (MSG_CMSG_COMPAT & flags) + err = verify_compat_iovec(msg_sys, iov, &addr, VERIFY_WRITE); +@@ -2893,7 +2959,7 @@ static int ethtool_ioctl(struct net *net, struct compat_ifreq __user *ifr32) + ifr = compat_alloc_user_space(buf_size); + rxnfc = (void __user *)ifr + ALIGN(sizeof(struct ifreq), 8); + +- if (copy_in_user(&ifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ)) ++ if (copy_in_user(ifr->ifr_name, ifr32->ifr_name, IFNAMSIZ)) + return -EFAULT; + + if (put_user(convert_in ? rxnfc : compat_ptr(data), +@@ -3004,7 +3070,7 @@ static int bond_ioctl(struct net *net, unsigned int cmd, + old_fs = get_fs(); + set_fs(KERNEL_DS); + err = dev_ioctl(net, cmd, +- (struct ifreq __user __force *) &kifr); ++ (struct ifreq __force_user *) &kifr); + set_fs(old_fs); + + return err; +@@ -3097,7 +3163,7 @@ static int compat_sioc_ifmap(struct net *net, unsigned int cmd, + + old_fs = get_fs(); + set_fs(KERNEL_DS); +- err = dev_ioctl(net, cmd, (void __user __force *)&ifr); ++ err = dev_ioctl(net, cmd, (void __force_user *)&ifr); + set_fs(old_fs); + + if (cmd == SIOCGIFMAP && !err) { +@@ -3181,7 +3247,7 @@ static int routing_ioctl(struct net *net, struct socket *sock, + ret |= get_user(rtdev, &(ur4->rt_dev)); + if (rtdev) { + ret |= copy_from_user(devname, compat_ptr(rtdev), 15); +- r4.rt_dev = (char __user __force *)devname; ++ r4.rt_dev = (char __force_user *)devname; + devname[15] = 0; + } else + r4.rt_dev = NULL; +@@ -3408,8 +3474,8 @@ int kernel_getsockopt(struct socket *sock, int level, int optname, + int __user *uoptlen; + int err; + +- uoptval = (char __user __force *) optval; +- uoptlen = (int __user __force *) optlen; ++ uoptval = (char __force_user *) optval; ++ uoptlen = (int __force_user *) optlen; + + set_fs(KERNEL_DS); + if (level == SOL_SOCKET) +@@ -3429,7 +3495,7 @@ int kernel_setsockopt(struct socket *sock, int level, int optname, + char __user *uoptval; + int err; + +- uoptval = (char __user __force *) optval; ++ uoptval = (char __force_user *) optval; + + set_fs(KERNEL_DS); + if (level == SOL_SOCKET) +diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c +index c548ab2..4e1b68b 100644 +--- a/net/sunrpc/auth_gss/svcauth_gss.c ++++ b/net/sunrpc/auth_gss/svcauth_gss.c +@@ -1140,7 +1140,7 @@ static int gss_proxy_save_rsc(struct cache_detail *cd, + uint64_t *handle) + { + struct rsc rsci, *rscp = NULL; +- static atomic64_t ctxhctr; ++ static atomic64_unchecked_t ctxhctr = ATOMIC64_INIT(0); + long long ctxh; + struct gss_api_mech *gm = NULL; + time_t expiry; +@@ -1151,7 +1151,7 @@ static int gss_proxy_save_rsc(struct cache_detail *cd, + status = -ENOMEM; + /* the handle needs to be just a unique id, + * use a static counter */ +- ctxh = atomic64_inc_return(&ctxhctr); ++ ctxh = atomic64_inc_return_unchecked(&ctxhctr); + + /* make a copy for the caller */ + *handle = ctxh; +diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c +index 48f1400..e2cb21f 100644 +--- a/net/sunrpc/cache.c ++++ b/net/sunrpc/cache.c +@@ -1609,7 +1609,7 @@ static int create_cache_proc_entries(struct cache_detail *cd, struct net *net) + struct sunrpc_net *sn; + + sn = net_generic(net, sunrpc_net_id); +- cd->u.procfs.proc_ent = proc_mkdir(cd->name, sn->proc_net_rpc); ++ cd->u.procfs.proc_ent = proc_mkdir_restrict(cd->name, sn->proc_net_rpc); + if (cd->u.procfs.proc_ent == NULL) + goto out_nomem; + cd->u.procfs.channel_ent = NULL; +diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c +index ae46f01..d337da8 100644 +--- a/net/sunrpc/clnt.c ++++ b/net/sunrpc/clnt.c +@@ -1430,7 +1430,9 @@ call_start(struct rpc_task *task) + (RPC_IS_ASYNC(task) ? "async" : "sync")); + + /* Increment call count */ +- task->tk_msg.rpc_proc->p_count++; ++ pax_open_kernel(); ++ (*(unsigned int *)&task->tk_msg.rpc_proc->p_count)++; ++ pax_close_kernel(); + clnt->cl_stats->rpccnt++; + task->tk_action = call_reserve; + } +diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c +index fe3441a..922c29e 100644 +--- a/net/sunrpc/sched.c ++++ b/net/sunrpc/sched.c +@@ -261,9 +261,9 @@ static int rpc_wait_bit_killable(struct wait_bit_key *key) + #if defined(RPC_DEBUG) || defined(RPC_TRACEPOINTS) + static void rpc_task_set_debuginfo(struct rpc_task *task) + { +- static atomic_t rpc_pid; ++ static atomic_unchecked_t rpc_pid; + +- task->tk_pid = atomic_inc_return(&rpc_pid); ++ task->tk_pid = atomic_inc_return_unchecked(&rpc_pid); + } + #else + static inline void rpc_task_set_debuginfo(struct rpc_task *task) +diff --git a/net/sunrpc/stats.c b/net/sunrpc/stats.c +index 5453049..465669a 100644 +--- a/net/sunrpc/stats.c ++++ b/net/sunrpc/stats.c +@@ -267,7 +267,7 @@ int rpc_proc_init(struct net *net) + + dprintk("RPC: registering /proc/net/rpc\n"); + sn = net_generic(net, sunrpc_net_id); +- sn->proc_net_rpc = proc_mkdir("rpc", net->proc_net); ++ sn->proc_net_rpc = proc_mkdir_restrict("rpc", net->proc_net); + if (sn->proc_net_rpc == NULL) + return -ENOMEM; + +diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c +index ca8a795..ddfc41b 100644 +--- a/net/sunrpc/svc.c ++++ b/net/sunrpc/svc.c +@@ -1165,7 +1165,9 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv) + svc_putnl(resv, RPC_SUCCESS); + + /* Bump per-procedure stats counter */ +- procp->pc_count++; ++ pax_open_kernel(); ++ (*(unsigned int *)&procp->pc_count)++; ++ pax_close_kernel(); + + /* Initialize storage for argp and resp */ + memset(rqstp->rq_argp, 0, procp->pc_argsize); +diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c +index 621ca7b..59421dd 100644 +--- a/net/sunrpc/svcauth_unix.c ++++ b/net/sunrpc/svcauth_unix.c +@@ -414,7 +414,7 @@ struct unix_gid { + struct group_info *gi; + }; + +-static int unix_gid_hash(kuid_t uid) ++static int __intentional_overflow(-1) unix_gid_hash(kuid_t uid) + { + return hash_long(from_kuid(&init_user_ns, uid), GID_HASHBITS); + } +@@ -470,7 +470,7 @@ static void unix_gid_request(struct cache_detail *cd, + (*bpp)[-1] = '\n'; + } + +-static struct unix_gid *unix_gid_lookup(struct cache_detail *cd, kuid_t uid); ++static struct unix_gid * __intentional_overflow(-1) unix_gid_lookup(struct cache_detail *cd, kuid_t uid); + + static int unix_gid_parse(struct cache_detail *cd, + char *mesg, int mlen) +diff --git a/net/sunrpc/xprtrdma/svc_rdma.c b/net/sunrpc/xprtrdma/svc_rdma.c +index c1b6270..05089c1 100644 +--- a/net/sunrpc/xprtrdma/svc_rdma.c ++++ b/net/sunrpc/xprtrdma/svc_rdma.c +@@ -62,15 +62,15 @@ unsigned int svcrdma_max_req_size = RPCRDMA_MAX_REQ_SIZE; + static unsigned int min_max_inline = 4096; + static unsigned int max_max_inline = 65536; + +-atomic_t rdma_stat_recv; +-atomic_t rdma_stat_read; +-atomic_t rdma_stat_write; +-atomic_t rdma_stat_sq_starve; +-atomic_t rdma_stat_rq_starve; +-atomic_t rdma_stat_rq_poll; +-atomic_t rdma_stat_rq_prod; +-atomic_t rdma_stat_sq_poll; +-atomic_t rdma_stat_sq_prod; ++atomic_unchecked_t rdma_stat_recv; ++atomic_unchecked_t rdma_stat_read; ++atomic_unchecked_t rdma_stat_write; ++atomic_unchecked_t rdma_stat_sq_starve; ++atomic_unchecked_t rdma_stat_rq_starve; ++atomic_unchecked_t rdma_stat_rq_poll; ++atomic_unchecked_t rdma_stat_rq_prod; ++atomic_unchecked_t rdma_stat_sq_poll; ++atomic_unchecked_t rdma_stat_sq_prod; + + /* Temporary NFS request map and context caches */ + struct kmem_cache *svc_rdma_map_cachep; +@@ -110,7 +110,7 @@ static int read_reset_stat(struct ctl_table *table, int write, + len -= *ppos; + if (len > *lenp) + len = *lenp; +- if (len && copy_to_user(buffer, str_buf, len)) ++ if (len > sizeof str_buf || (len && copy_to_user(buffer, str_buf, len))) + return -EFAULT; + *lenp = len; + *ppos += len; +@@ -151,63 +151,63 @@ static struct ctl_table svcrdma_parm_table[] = { + { + .procname = "rdma_stat_read", + .data = &rdma_stat_read, +- .maxlen = sizeof(atomic_t), ++ .maxlen = sizeof(atomic_unchecked_t), + .mode = 0644, + .proc_handler = read_reset_stat, + }, + { + .procname = "rdma_stat_recv", + .data = &rdma_stat_recv, +- .maxlen = sizeof(atomic_t), ++ .maxlen = sizeof(atomic_unchecked_t), + .mode = 0644, + .proc_handler = read_reset_stat, + }, + { + .procname = "rdma_stat_write", + .data = &rdma_stat_write, +- .maxlen = sizeof(atomic_t), ++ .maxlen = sizeof(atomic_unchecked_t), + .mode = 0644, + .proc_handler = read_reset_stat, + }, + { + .procname = "rdma_stat_sq_starve", + .data = &rdma_stat_sq_starve, +- .maxlen = sizeof(atomic_t), ++ .maxlen = sizeof(atomic_unchecked_t), + .mode = 0644, + .proc_handler = read_reset_stat, + }, + { + .procname = "rdma_stat_rq_starve", + .data = &rdma_stat_rq_starve, +- .maxlen = sizeof(atomic_t), ++ .maxlen = sizeof(atomic_unchecked_t), + .mode = 0644, + .proc_handler = read_reset_stat, + }, + { + .procname = "rdma_stat_rq_poll", + .data = &rdma_stat_rq_poll, +- .maxlen = sizeof(atomic_t), ++ .maxlen = sizeof(atomic_unchecked_t), + .mode = 0644, + .proc_handler = read_reset_stat, + }, + { + .procname = "rdma_stat_rq_prod", + .data = &rdma_stat_rq_prod, +- .maxlen = sizeof(atomic_t), ++ .maxlen = sizeof(atomic_unchecked_t), + .mode = 0644, + .proc_handler = read_reset_stat, + }, + { + .procname = "rdma_stat_sq_poll", + .data = &rdma_stat_sq_poll, +- .maxlen = sizeof(atomic_t), ++ .maxlen = sizeof(atomic_unchecked_t), + .mode = 0644, + .proc_handler = read_reset_stat, + }, + { + .procname = "rdma_stat_sq_prod", + .data = &rdma_stat_sq_prod, +- .maxlen = sizeof(atomic_t), ++ .maxlen = sizeof(atomic_unchecked_t), + .mode = 0644, + .proc_handler = read_reset_stat, + }, +diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +index e011027..9d3c4e1 100644 +--- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c ++++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +@@ -220,7 +220,7 @@ static int rdma_read_chunk_lcl(struct svcxprt_rdma *xprt, + *page_no = pg_no; + *page_offset = pg_off; + ret = read; +- atomic_inc(&rdma_stat_read); ++ atomic_inc_unchecked(&rdma_stat_read); + return ret; + err: + svc_rdma_unmap_dma(ctxt); +@@ -356,7 +356,7 @@ static int rdma_read_chunk_frmr(struct svcxprt_rdma *xprt, + *page_no = pg_no; + *page_offset = pg_off; + ret = read; +- atomic_inc(&rdma_stat_read); ++ atomic_inc_unchecked(&rdma_stat_read); + return ret; + err: + svc_rdma_unmap_dma(ctxt); +@@ -540,7 +540,7 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) + dto_q); + list_del_init(&ctxt->dto_q); + } else { +- atomic_inc(&rdma_stat_rq_starve); ++ atomic_inc_unchecked(&rdma_stat_rq_starve); + clear_bit(XPT_DATA, &xprt->xpt_flags); + ctxt = NULL; + } +@@ -559,7 +559,7 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) + dprintk("svcrdma: processing ctxt=%p on xprt=%p, rqstp=%p, status=%d\n", + ctxt, rdma_xprt, rqstp, ctxt->wc_status); + BUG_ON(ctxt->wc_status != IB_WC_SUCCESS); +- atomic_inc(&rdma_stat_recv); ++ atomic_inc_unchecked(&rdma_stat_recv); + + /* Build up the XDR from the receive buffers. */ + rdma_build_arg_xdr(rqstp, ctxt, ctxt->byte_len); +diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c +index 9f1b506..2e0b321 100644 +--- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c ++++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c +@@ -208,7 +208,7 @@ static int send_write(struct svcxprt_rdma *xprt, struct svc_rqst *rqstp, + write_wr.wr.rdma.remote_addr = to; + + /* Post It */ +- atomic_inc(&rdma_stat_write); ++ atomic_inc_unchecked(&rdma_stat_write); + if (svc_rdma_send(xprt, &write_wr)) + goto err; + return write_len - bc; +diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c +index 4e61880..1f0d963 100644 +--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c ++++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c +@@ -295,7 +295,7 @@ static void rq_cq_reap(struct svcxprt_rdma *xprt) + return; + + ib_req_notify_cq(xprt->sc_rq_cq, IB_CQ_NEXT_COMP); +- atomic_inc(&rdma_stat_rq_poll); ++ atomic_inc_unchecked(&rdma_stat_rq_poll); + + while ((ret = ib_poll_cq(xprt->sc_rq_cq, 1, &wc)) > 0) { + ctxt = (struct svc_rdma_op_ctxt *)(unsigned long)wc.wr_id; +@@ -317,7 +317,7 @@ static void rq_cq_reap(struct svcxprt_rdma *xprt) + } + + if (ctxt) +- atomic_inc(&rdma_stat_rq_prod); ++ atomic_inc_unchecked(&rdma_stat_rq_prod); + + set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags); + /* +@@ -392,7 +392,7 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt) + return; + + ib_req_notify_cq(xprt->sc_sq_cq, IB_CQ_NEXT_COMP); +- atomic_inc(&rdma_stat_sq_poll); ++ atomic_inc_unchecked(&rdma_stat_sq_poll); + while ((ret = ib_poll_cq(cq, ARRAY_SIZE(wc_a), wc_a)) > 0) { + int i; + +@@ -420,7 +420,7 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt) + } + + if (ctxt) +- atomic_inc(&rdma_stat_sq_prod); ++ atomic_inc_unchecked(&rdma_stat_sq_prod); + } + + static void sq_comp_handler(struct ib_cq *cq, void *cq_context) +@@ -1264,7 +1264,7 @@ int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr) + spin_lock_bh(&xprt->sc_lock); + if (xprt->sc_sq_depth < atomic_read(&xprt->sc_sq_count) + wr_count) { + spin_unlock_bh(&xprt->sc_lock); +- atomic_inc(&rdma_stat_sq_starve); ++ atomic_inc_unchecked(&rdma_stat_sq_starve); + + /* See if we can opportunistically reap SQ WR to make room */ + sq_cq_reap(xprt); +diff --git a/net/sysctl_net.c b/net/sysctl_net.c +index e7000be..e3b0ba7 100644 +--- a/net/sysctl_net.c ++++ b/net/sysctl_net.c +@@ -46,7 +46,7 @@ static int net_ctl_permissions(struct ctl_table_header *head, + kgid_t root_gid = make_kgid(net->user_ns, 0); + + /* Allow network administrator to have same access as root. */ +- if (ns_capable(net->user_ns, CAP_NET_ADMIN) || ++ if (ns_capable_nolog(net->user_ns, CAP_NET_ADMIN) || + uid_eq(root_uid, current_euid())) { + int mode = (table->mode >> 6) & 7; + return (mode << 6) | (mode << 3) | mode; +diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c +index 31b5cb2..566ff01 100644 +--- a/net/tipc/subscr.c ++++ b/net/tipc/subscr.c +@@ -96,7 +96,7 @@ static void subscr_send_event(struct tipc_subscription *sub, u32 found_lower, + struct tipc_subscriber *subscriber = sub->subscriber; + struct kvec msg_sect; + +- msg_sect.iov_base = (void *)&sub->evt; ++ msg_sect.iov_base = &sub->evt; + msg_sect.iov_len = sizeof(struct tipc_event); + sub->evt.event = htohl(event, sub->swap); + sub->evt.found_lower = htohl(found_lower, sub->swap); +diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c +index e968843..47a7132 100644 +--- a/net/unix/af_unix.c ++++ b/net/unix/af_unix.c +@@ -791,6 +791,12 @@ static struct sock *unix_find_other(struct net *net, + err = -ECONNREFUSED; + if (!S_ISSOCK(inode->i_mode)) + goto put_fail; ++ ++ if (!gr_acl_handle_unix(path.dentry, path.mnt)) { ++ err = -EACCES; ++ goto put_fail; ++ } ++ + u = unix_find_socket_byinode(inode); + if (!u) + goto put_fail; +@@ -811,6 +817,13 @@ static struct sock *unix_find_other(struct net *net, + if (u) { + struct dentry *dentry; + dentry = unix_sk(u)->path.dentry; ++ ++ if (!gr_handle_chroot_unix(pid_vnr(u->sk_peer_pid))) { ++ err = -EPERM; ++ sock_put(u); ++ goto fail; ++ } ++ + if (dentry) + touch_atime(&unix_sk(u)->path); + } else +@@ -844,12 +857,18 @@ static int unix_mknod(const char *sun_path, umode_t mode, struct path *res) + */ + err = security_path_mknod(&path, dentry, mode, 0); + if (!err) { ++ if (!gr_acl_handle_mknod(dentry, path.dentry, path.mnt, mode)) { ++ err = -EACCES; ++ goto out; ++ } + err = vfs_mknod(path.dentry->d_inode, dentry, mode, 0); + if (!err) { + res->mnt = mntget(path.mnt); + res->dentry = dget(dentry); ++ gr_handle_create(dentry, path.mnt); + } + } ++out: + done_path_create(&path, dentry); + return err; + } +@@ -2249,11 +2268,14 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock, + writable = unix_writable(sk); + other = unix_peer_get(sk); + if (other) { +- if (unix_peer(other) != sk) { ++ unix_state_lock(other); ++ if (!sock_flag(other, SOCK_DEAD) && unix_peer(other) != sk) { ++ unix_state_unlock(other); + sock_poll_wait(file, &unix_sk(other)->peer_wait, wait); + if (unix_recvq_full(other)) + writable = 0; +- } ++ } else ++ unix_state_unlock(other); + sock_put(other); + } + +@@ -2350,9 +2372,13 @@ static int unix_seq_show(struct seq_file *seq, void *v) + seq_puts(seq, "Num RefCount Protocol Flags Type St " + "Inode Path\n"); + else { +- struct sock *s = v; ++ struct sock *s = v, *peer; + struct unix_sock *u = unix_sk(s); + unix_state_lock(s); ++ peer = unix_peer(s); ++ unix_state_unlock(s); ++ ++ unix_state_double_lock(s, peer); + + seq_printf(seq, "%pK: %08X %08X %08X %04X %02X %5lu", + s, +@@ -2377,10 +2403,29 @@ static int unix_seq_show(struct seq_file *seq, void *v) + seq_putc(seq, '@'); + i++; + } +- for ( ; i < len; i++) +- seq_putc(seq, u->addr->name->sun_path[i]); +- } +- unix_state_unlock(s); ++ for ( ; i < len; i++) { ++ char c = u->addr->name->sun_path[i]; ++ switch (c) { ++ case '\n': ++ seq_putc(seq, '\\'); ++ seq_putc(seq, 'n'); ++ break; ++ case '\t': ++ seq_putc(seq, '\\'); ++ seq_putc(seq, 't'); ++ break; ++ case '\\': ++ seq_putc(seq, '\\'); ++ seq_putc(seq, '\\'); ++ break; ++ default: ++ seq_putc(seq, c); ++ } ++ } ++ } else if (peer) ++ seq_printf(seq, " P%lu", sock_i_ino(peer)); ++ ++ unix_state_double_unlock(s, peer); + seq_putc(seq, '\n'); + } + +diff --git a/net/unix/sysctl_net_unix.c b/net/unix/sysctl_net_unix.c +index b3d5150..ff3a837 100644 +--- a/net/unix/sysctl_net_unix.c ++++ b/net/unix/sysctl_net_unix.c +@@ -28,7 +28,7 @@ static struct ctl_table unix_table[] = { + + int __net_init unix_sysctl_register(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + + table = kmemdup(unix_table, sizeof(unix_table), GFP_KERNEL); + if (table == NULL) +diff --git a/net/vmw_vsock/vmci_transport_notify.c b/net/vmw_vsock/vmci_transport_notify.c +index 9b7f207..2596621 100644 +--- a/net/vmw_vsock/vmci_transport_notify.c ++++ b/net/vmw_vsock/vmci_transport_notify.c +@@ -662,19 +662,19 @@ static void vmci_transport_notify_pkt_process_negotiate(struct sock *sk) + + /* Socket control packet based operations. */ + struct vmci_transport_notify_ops vmci_transport_notify_pkt_ops = { +- vmci_transport_notify_pkt_socket_init, +- vmci_transport_notify_pkt_socket_destruct, +- vmci_transport_notify_pkt_poll_in, +- vmci_transport_notify_pkt_poll_out, +- vmci_transport_notify_pkt_handle_pkt, +- vmci_transport_notify_pkt_recv_init, +- vmci_transport_notify_pkt_recv_pre_block, +- vmci_transport_notify_pkt_recv_pre_dequeue, +- vmci_transport_notify_pkt_recv_post_dequeue, +- vmci_transport_notify_pkt_send_init, +- vmci_transport_notify_pkt_send_pre_block, +- vmci_transport_notify_pkt_send_pre_enqueue, +- vmci_transport_notify_pkt_send_post_enqueue, +- vmci_transport_notify_pkt_process_request, +- vmci_transport_notify_pkt_process_negotiate, ++ .socket_init = vmci_transport_notify_pkt_socket_init, ++ .socket_destruct = vmci_transport_notify_pkt_socket_destruct, ++ .poll_in = vmci_transport_notify_pkt_poll_in, ++ .poll_out = vmci_transport_notify_pkt_poll_out, ++ .handle_notify_pkt = vmci_transport_notify_pkt_handle_pkt, ++ .recv_init = vmci_transport_notify_pkt_recv_init, ++ .recv_pre_block = vmci_transport_notify_pkt_recv_pre_block, ++ .recv_pre_dequeue = vmci_transport_notify_pkt_recv_pre_dequeue, ++ .recv_post_dequeue = vmci_transport_notify_pkt_recv_post_dequeue, ++ .send_init = vmci_transport_notify_pkt_send_init, ++ .send_pre_block = vmci_transport_notify_pkt_send_pre_block, ++ .send_pre_enqueue = vmci_transport_notify_pkt_send_pre_enqueue, ++ .send_post_enqueue = vmci_transport_notify_pkt_send_post_enqueue, ++ .process_request = vmci_transport_notify_pkt_process_request, ++ .process_negotiate = vmci_transport_notify_pkt_process_negotiate, + }; +diff --git a/net/vmw_vsock/vmci_transport_notify_qstate.c b/net/vmw_vsock/vmci_transport_notify_qstate.c +index dc9c792..3089de0 100644 +--- a/net/vmw_vsock/vmci_transport_notify_qstate.c ++++ b/net/vmw_vsock/vmci_transport_notify_qstate.c +@@ -420,19 +420,19 @@ vmci_transport_notify_pkt_send_pre_enqueue( + + /* Socket always on control packet based operations. */ + struct vmci_transport_notify_ops vmci_transport_notify_pkt_q_state_ops = { +- vmci_transport_notify_pkt_socket_init, +- vmci_transport_notify_pkt_socket_destruct, +- vmci_transport_notify_pkt_poll_in, +- vmci_transport_notify_pkt_poll_out, +- vmci_transport_notify_pkt_handle_pkt, +- vmci_transport_notify_pkt_recv_init, +- vmci_transport_notify_pkt_recv_pre_block, +- vmci_transport_notify_pkt_recv_pre_dequeue, +- vmci_transport_notify_pkt_recv_post_dequeue, +- vmci_transport_notify_pkt_send_init, +- vmci_transport_notify_pkt_send_pre_block, +- vmci_transport_notify_pkt_send_pre_enqueue, +- vmci_transport_notify_pkt_send_post_enqueue, +- vmci_transport_notify_pkt_process_request, +- vmci_transport_notify_pkt_process_negotiate, ++ .socket_init = vmci_transport_notify_pkt_socket_init, ++ .socket_destruct = vmci_transport_notify_pkt_socket_destruct, ++ .poll_in = vmci_transport_notify_pkt_poll_in, ++ .poll_out = vmci_transport_notify_pkt_poll_out, ++ .handle_notify_pkt = vmci_transport_notify_pkt_handle_pkt, ++ .recv_init = vmci_transport_notify_pkt_recv_init, ++ .recv_pre_block = vmci_transport_notify_pkt_recv_pre_block, ++ .recv_pre_dequeue = vmci_transport_notify_pkt_recv_pre_dequeue, ++ .recv_post_dequeue = vmci_transport_notify_pkt_recv_post_dequeue, ++ .send_init = vmci_transport_notify_pkt_send_init, ++ .send_pre_block = vmci_transport_notify_pkt_send_pre_block, ++ .send_pre_enqueue = vmci_transport_notify_pkt_send_pre_enqueue, ++ .send_post_enqueue = vmci_transport_notify_pkt_send_post_enqueue, ++ .process_request = vmci_transport_notify_pkt_process_request, ++ .process_negotiate = vmci_transport_notify_pkt_process_negotiate, + }; +diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c +index c8717c1..08539f5 100644 +--- a/net/wireless/wext-core.c ++++ b/net/wireless/wext-core.c +@@ -748,8 +748,7 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd, + */ + + /* Support for very large requests */ +- if ((descr->flags & IW_DESCR_FLAG_NOMAX) && +- (user_length > descr->max_tokens)) { ++ if (user_length > descr->max_tokens) { + /* Allow userspace to GET more than max so + * we can support any size GET requests. + * There is still a limit : -ENOMEM. +@@ -788,22 +787,6 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd, + } + } + +- if (IW_IS_GET(cmd) && !(descr->flags & IW_DESCR_FLAG_NOMAX)) { +- /* +- * If this is a GET, but not NOMAX, it means that the extra +- * data is not bounded by userspace, but by max_tokens. Thus +- * set the length to max_tokens. This matches the extra data +- * allocation. +- * The driver should fill it with the number of tokens it +- * provided, and it may check iwp->length rather than having +- * knowledge of max_tokens. If the driver doesn't change the +- * iwp->length, this ioctl just copies back max_token tokens +- * filled with zeroes. Hopefully the driver isn't claiming +- * them to be valid data. +- */ +- iwp->length = descr->max_tokens; +- } +- + err = handler(dev, info, (union iwreq_data *) iwp, extra); + + iwp->length += essid_compat; +diff --git a/net/x25/sysctl_net_x25.c b/net/x25/sysctl_net_x25.c +index 4323952..a06dfe1 100644 +--- a/net/x25/sysctl_net_x25.c ++++ b/net/x25/sysctl_net_x25.c +@@ -70,7 +70,7 @@ static struct ctl_table x25_table[] = { + .mode = 0644, + .proc_handler = proc_dointvec, + }, +- { 0, }, ++ { }, + }; + + void __init x25_register_sysctl(void) +diff --git a/net/x25/x25_proc.c b/net/x25/x25_proc.c +index 0917f04..f4e3d8c 100644 +--- a/net/x25/x25_proc.c ++++ b/net/x25/x25_proc.c +@@ -209,7 +209,7 @@ static const struct file_operations x25_seq_forward_fops = { + + int __init x25_proc_init(void) + { +- if (!proc_mkdir("x25", init_net.proc_net)) ++ if (!proc_mkdir_restrict("x25", init_net.proc_net)) + return -ENOMEM; + + if (!proc_create("x25/route", S_IRUGO, init_net.proc_net, +diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c +index 88bf289..7b0741b 100644 +--- a/net/xfrm/xfrm_policy.c ++++ b/net/xfrm/xfrm_policy.c +@@ -330,7 +330,7 @@ static void xfrm_policy_kill(struct xfrm_policy *policy) + { + policy->walk.dead = 1; + +- atomic_inc(&policy->genid); ++ atomic_inc_unchecked(&policy->genid); + + if (del_timer(&policy->polq.hold_timer)) + xfrm_pol_put(policy); +@@ -781,7 +781,7 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl) + hlist_add_head(&policy->bydst, chain); + xfrm_pol_hold(policy); + net->xfrm.policy_count[dir]++; +- atomic_inc(&net->xfrm.flow_cache_genid); ++ atomic_inc_unchecked(&net->xfrm.flow_cache_genid); + + /* After previous checking, family can either be AF_INET or AF_INET6 */ + if (policy->family == AF_INET) +@@ -1871,7 +1871,7 @@ xfrm_resolve_and_create_bundle(struct xfrm_policy **pols, int num_pols, + + xdst->num_pols = num_pols; + memcpy(xdst->pols, pols, sizeof(struct xfrm_policy *) * num_pols); +- xdst->policy_genid = atomic_read(&pols[0]->genid); ++ xdst->policy_genid = atomic_read_unchecked(&pols[0]->genid); + + return xdst; + } +@@ -2685,10 +2685,11 @@ void xfrm_garbage_collect(struct net *net) + } + EXPORT_SYMBOL(xfrm_garbage_collect); + +-static void xfrm_garbage_collect_deferred(struct net *net) ++void xfrm_garbage_collect_deferred(struct net *net) + { + flow_cache_flush_deferred(net); + } ++EXPORT_SYMBOL(xfrm_garbage_collect_deferred); + + static void xfrm_init_pmtu(struct dst_entry *dst) + { +@@ -2738,7 +2739,7 @@ static int xfrm_bundle_ok(struct xfrm_dst *first) + if (xdst->xfrm_genid != dst->xfrm->genid) + return 0; + if (xdst->num_pols > 0 && +- xdst->policy_genid != atomic_read(&xdst->pols[0]->genid)) ++ xdst->policy_genid != atomic_read_unchecked(&xdst->pols[0]->genid)) + return 0; + + mtu = dst_mtu(dst->child); +@@ -2826,8 +2827,6 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo) + dst_ops->link_failure = xfrm_link_failure; + if (likely(dst_ops->neigh_lookup == NULL)) + dst_ops->neigh_lookup = xfrm_neigh_lookup; +- if (likely(afinfo->garbage_collect == NULL)) +- afinfo->garbage_collect = xfrm_garbage_collect_deferred; + rcu_assign_pointer(xfrm_policy_afinfo[afinfo->family], afinfo); + } + spin_unlock(&xfrm_policy_afinfo_lock); +@@ -2881,7 +2880,6 @@ int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo) + dst_ops->check = NULL; + dst_ops->negative_advice = NULL; + dst_ops->link_failure = NULL; +- afinfo->garbage_collect = NULL; + } + return err; + } +@@ -3277,7 +3275,7 @@ static int xfrm_policy_migrate(struct xfrm_policy *pol, + sizeof(pol->xfrm_vec[i].saddr)); + pol->xfrm_vec[i].encap_family = mp->new_family; + /* flush bundles */ +- atomic_inc(&pol->genid); ++ atomic_inc_unchecked(&pol->genid); + } + } + +diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c +index de971b6..b843409 100644 +--- a/net/xfrm/xfrm_state.c ++++ b/net/xfrm/xfrm_state.c +@@ -166,12 +166,14 @@ int xfrm_register_type(const struct xfrm_type *type, unsigned short family) + + if (unlikely(afinfo == NULL)) + return -EAFNOSUPPORT; +- typemap = afinfo->type_map; ++ typemap = (const struct xfrm_type **)afinfo->type_map; + spin_lock_bh(&xfrm_type_lock); + +- if (likely(typemap[type->proto] == NULL)) ++ if (likely(typemap[type->proto] == NULL)) { ++ pax_open_kernel(); + typemap[type->proto] = type; +- else ++ pax_close_kernel(); ++ } else + err = -EEXIST; + spin_unlock_bh(&xfrm_type_lock); + xfrm_state_put_afinfo(afinfo); +@@ -187,13 +189,16 @@ int xfrm_unregister_type(const struct xfrm_type *type, unsigned short family) + + if (unlikely(afinfo == NULL)) + return -EAFNOSUPPORT; +- typemap = afinfo->type_map; ++ typemap = (const struct xfrm_type **)afinfo->type_map; + spin_lock_bh(&xfrm_type_lock); + + if (unlikely(typemap[type->proto] != type)) + err = -ENOENT; +- else ++ else { ++ pax_open_kernel(); + typemap[type->proto] = NULL; ++ pax_close_kernel(); ++ } + spin_unlock_bh(&xfrm_type_lock); + xfrm_state_put_afinfo(afinfo); + return err; +@@ -203,7 +208,6 @@ EXPORT_SYMBOL(xfrm_unregister_type); + static const struct xfrm_type *xfrm_get_type(u8 proto, unsigned short family) + { + struct xfrm_state_afinfo *afinfo; +- const struct xfrm_type **typemap; + const struct xfrm_type *type; + int modload_attempted = 0; + +@@ -211,9 +215,8 @@ retry: + afinfo = xfrm_state_get_afinfo(family); + if (unlikely(afinfo == NULL)) + return NULL; +- typemap = afinfo->type_map; + +- type = typemap[proto]; ++ type = afinfo->type_map[proto]; + if (unlikely(type && !try_module_get(type->owner))) + type = NULL; + if (!type && !modload_attempted) { +@@ -247,7 +250,7 @@ int xfrm_register_mode(struct xfrm_mode *mode, int family) + return -EAFNOSUPPORT; + + err = -EEXIST; +- modemap = afinfo->mode_map; ++ modemap = (struct xfrm_mode **)afinfo->mode_map; + spin_lock_bh(&xfrm_mode_lock); + if (modemap[mode->encap]) + goto out; +@@ -256,8 +259,10 @@ int xfrm_register_mode(struct xfrm_mode *mode, int family) + if (!try_module_get(afinfo->owner)) + goto out; + +- mode->afinfo = afinfo; ++ pax_open_kernel(); ++ *(const void **)&mode->afinfo = afinfo; + modemap[mode->encap] = mode; ++ pax_close_kernel(); + err = 0; + + out: +@@ -281,10 +286,12 @@ int xfrm_unregister_mode(struct xfrm_mode *mode, int family) + return -EAFNOSUPPORT; + + err = -ENOENT; +- modemap = afinfo->mode_map; ++ modemap = (struct xfrm_mode **)afinfo->mode_map; + spin_lock_bh(&xfrm_mode_lock); + if (likely(modemap[mode->encap] == mode)) { ++ pax_open_kernel(); + modemap[mode->encap] = NULL; ++ pax_close_kernel(); + module_put(mode->afinfo->owner); + err = 0; + } +@@ -1505,10 +1512,10 @@ EXPORT_SYMBOL(xfrm_find_acq_byseq); + u32 xfrm_get_acqseq(void) + { + u32 res; +- static atomic_t acqseq; ++ static atomic_unchecked_t acqseq; + + do { +- res = atomic_inc_return(&acqseq); ++ res = atomic_inc_return_unchecked(&acqseq); + } while (!res); + + return res; +diff --git a/net/xfrm/xfrm_sysctl.c b/net/xfrm/xfrm_sysctl.c +index 05a6e3d..6716ec9 100644 +--- a/net/xfrm/xfrm_sysctl.c ++++ b/net/xfrm/xfrm_sysctl.c +@@ -42,7 +42,7 @@ static struct ctl_table xfrm_table[] = { + + int __net_init xfrm_sysctl_init(struct net *net) + { +- struct ctl_table *table; ++ ctl_table_no_const *table; + + __xfrm_sysctl_init(net); + +diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include +index 65e7b08..1b868d5 100644 +--- a/scripts/Kbuild.include ++++ b/scripts/Kbuild.include +@@ -144,7 +144,7 @@ cc-ifversion = $(shell [ $(call cc-version, $(CC)) $(1) $(2) ] && echo $(3)) + # cc-ldoption + # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both) + cc-ldoption = $(call try-run,\ +- $(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) ++ $(CC) $(1) -Wl,-r -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) + + # ld-option + # Usage: LDFLAGS += $(call ld-option, -X) +diff --git a/scripts/Makefile.build b/scripts/Makefile.build +index 649ce68..f6bc05c 100644 +--- a/scripts/Makefile.build ++++ b/scripts/Makefile.build +@@ -60,7 +60,7 @@ endif + endif + + # Do not include host rules unless needed +-ifneq ($(hostprogs-y)$(hostprogs-m),) ++ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),) + include scripts/Makefile.host + endif + +diff --git a/scripts/Makefile.clean b/scripts/Makefile.clean +index a609552..fde19cd 100644 +--- a/scripts/Makefile.clean ++++ b/scripts/Makefile.clean +@@ -41,7 +41,8 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn)) + __clean-files := $(extra-y) $(extra-m) $(extra-) \ + $(always) $(targets) $(clean-files) \ + $(host-progs) \ +- $(hostprogs-y) $(hostprogs-m) $(hostprogs-) ++ $(hostprogs-y) $(hostprogs-m) $(hostprogs-) \ ++ $(hostlibs-y) $(hostlibs-m) $(hostlibs-) + + __clean-files := $(filter-out $(no-clean-files), $(__clean-files)) + +diff --git a/scripts/Makefile.host b/scripts/Makefile.host +index 133edfa..c9aa07f 100644 +--- a/scripts/Makefile.host ++++ b/scripts/Makefile.host +@@ -20,7 +20,19 @@ + # Will compile qconf as a C++ program, and menu as a C program. + # They are linked as C++ code to the executable qconf + ++# hostprogs-y := conf ++# conf-objs := conf.o libkconfig.so ++# libkconfig-objs := expr.o type.o ++# Will create a shared library named libkconfig.so that consists of ++# expr.o and type.o (they are both compiled as C code and the object files ++# are made as position independent code). ++# conf.c is compiled as a C program, and conf.o is linked together with ++# libkconfig.so as the executable conf. ++# Note: Shared libraries consisting of C++ files are not supported ++ + __hostprogs := $(sort $(hostprogs-y) $(hostprogs-m)) ++__hostlibs := $(sort $(hostlibs-y) $(hostlibs-m)) ++__hostcxxlibs := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m)) + + # C code + # Executables compiled from a single .c file +@@ -42,6 +54,19 @@ host-cxxmulti := $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),$(m))) + # C++ Object (.o) files compiled from .cc files + host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs))) + ++# Shared libaries (only .c supported) ++# Shared libraries (.so) - all .so files referenced in "xxx-objs" ++host-cshlib := $(sort $(filter %.so, $(host-cobjs))) ++host-cshlib += $(sort $(filter %.so, $(__hostlibs))) ++host-cxxshlib := $(sort $(filter %.so, $(__hostcxxlibs))) ++# Remove .so files from "xxx-objs" ++host-cobjs := $(filter-out %.so,$(host-cobjs)) ++host-cxxobjs := $(filter-out %.so,$(host-cxxobjs)) ++ ++# Object (.o) files used by the shared libaries ++host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs)))) ++host-cxxshobjs := $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs)))) ++ + # output directory for programs/.o files + # hostprogs-y := tools/build may have been specified. + # Retrieve also directory of .o files from prog-objs or prog-cxxobjs notation +@@ -56,6 +81,10 @@ host-cmulti := $(addprefix $(obj)/,$(host-cmulti)) + host-cobjs := $(addprefix $(obj)/,$(host-cobjs)) + host-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti)) + host-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs)) ++host-cshlib := $(addprefix $(obj)/,$(host-cshlib)) ++host-cxxshlib := $(addprefix $(obj)/,$(host-cxxshlib)) ++host-cshobjs := $(addprefix $(obj)/,$(host-cshobjs)) ++host-cxxshobjs := $(addprefix $(obj)/,$(host-cxxshobjs)) + host-objdirs := $(addprefix $(obj)/,$(host-objdirs)) + + obj-dirs += $(host-objdirs) +@@ -124,5 +153,37 @@ quiet_cmd_host-cxxobjs = HOSTCXX $@ + $(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE + $(call if_changed_dep,host-cxxobjs) + ++# Compile .c file, create position independent .o file ++# host-cshobjs -> .o ++quiet_cmd_host-cshobjs = HOSTCC -fPIC $@ ++ cmd_host-cshobjs = $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $< ++$(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE ++ $(call if_changed_dep,host-cshobjs) ++ ++# Compile .c file, create position independent .o file ++# host-cxxshobjs -> .o ++quiet_cmd_host-cxxshobjs = HOSTCXX -fPIC $@ ++ cmd_host-cxxshobjs = $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $< ++$(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE ++ $(call if_changed_dep,host-cxxshobjs) ++ ++# Link a shared library, based on position independent .o files ++# *.o -> .so shared library (host-cshlib) ++quiet_cmd_host-cshlib = HOSTLLD -shared $@ ++ cmd_host-cshlib = $(HOSTCC) $(HOSTLDFLAGS) -shared -o $@ \ ++ $(addprefix $(obj)/,$($(@F:.so=-objs))) \ ++ $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F)) ++$(host-cshlib): $(obj)/%: $(host-cshobjs) FORCE ++ $(call if_changed,host-cshlib) ++ ++# Link a shared library, based on position independent .o files ++# *.o -> .so shared library (host-cxxshlib) ++quiet_cmd_host-cxxshlib = HOSTLLD -shared $@ ++ cmd_host-cxxshlib = $(HOSTCXX) $(HOSTLDFLAGS) -shared -o $@ \ ++ $(addprefix $(obj)/,$($(@F:.so=-objs))) \ ++ $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F)) ++$(host-cxxshlib): $(obj)/%: $(host-cxxshobjs) FORCE ++ $(call if_changed,host-cxxshlib) ++ + targets += $(host-csingle) $(host-cmulti) $(host-cobjs)\ +- $(host-cxxmulti) $(host-cxxobjs) ++ $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs) +diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c +index b304068..462d24e 100644 +--- a/scripts/basic/fixdep.c ++++ b/scripts/basic/fixdep.c +@@ -161,7 +161,7 @@ static unsigned int strhash(const char *str, unsigned int sz) + /* + * Lookup a value in the configuration string. + */ +-static int is_defined_config(const char *name, int len, unsigned int hash) ++static int is_defined_config(const char *name, unsigned int len, unsigned int hash) + { + struct item *aux; + +@@ -211,10 +211,10 @@ static void clear_config(void) + /* + * Record the use of a CONFIG_* word. + */ +-static void use_config(const char *m, int slen) ++static void use_config(const char *m, unsigned int slen) + { + unsigned int hash = strhash(m, slen); +- int c, i; ++ unsigned int c, i; + + if (is_defined_config(m, slen, hash)) + return; +@@ -235,9 +235,9 @@ static void use_config(const char *m, int slen) + + static void parse_config_file(const char *map, size_t len) + { +- const int *end = (const int *) (map + len); ++ const unsigned int *end = (const unsigned int *) (map + len); + /* start at +1, so that p can never be < map */ +- const int *m = (const int *) map + 1; ++ const unsigned int *m = (const unsigned int *) map + 1; + const char *p, *q; + + for (; m < end; m++) { +@@ -435,7 +435,7 @@ static void print_deps(void) + static void traps(void) + { + static char test[] __attribute__((aligned(sizeof(int)))) = "CONF"; +- int *p = (int *)test; ++ unsigned int *p = (unsigned int *)test; + + if (*p != INT_CONF) { + fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianness? %#x\n", +diff --git a/scripts/gcc-plugin.sh b/scripts/gcc-plugin.sh +new file mode 100644 +index 0000000..eaa4fce +--- /dev/null ++++ b/scripts/gcc-plugin.sh +@@ -0,0 +1,51 @@ ++#!/bin/sh ++srctree=$(dirname "$0") ++gccplugins_dir=$($3 -print-file-name=plugin) ++plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/../tools/gcc -I"${gccplugins_dir}"/include 2>&1 <<EOF ++#include "gcc-common.h" ++#if BUILDING_GCC_VERSION >= 4008 || defined(ENABLE_BUILD_WITH_CXX) ++#warning $2 CXX ++#else ++#warning $1 CC ++#endif ++EOF ++) ++ ++if [ $? -ne 0 ] ++then ++ exit 1 ++fi ++ ++case "$plugincc" in ++ *"$1 CC"*) ++ echo "$1" ++ exit 0 ++ ;; ++ ++ *"$2 CXX"*) ++ # the c++ compiler needs another test, see below ++ ;; ++ ++ *) ++ exit 1 ++ ;; ++esac ++ ++# we need a c++ compiler that supports the designated initializer GNU extension ++plugincc=$($2 -c -x c++ -std=gnu++98 - -fsyntax-only -I"${srctree}"/../tools/gcc -I"${gccplugins_dir}"/include 2>&1 <<EOF ++#include "gcc-common.h" ++class test { ++public: ++ int test; ++} test = { ++ .test = 1 ++}; ++EOF ++) ++ ++if [ $? -eq 0 ] ++then ++ echo "$2" ++ exit 0 ++fi ++exit 1 +diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh +index fdebd66..a349e33 100755 +--- a/scripts/headers_install.sh ++++ b/scripts/headers_install.sh +@@ -32,6 +32,7 @@ do + FILE="$(basename "$i")" + sed -r \ + -e 's/([ \t(])(__user|__force|__iomem)[ \t]/\1/g' \ ++ -e 's/__intentional_overflow\([- \t,0-9]*\)//g' \ + -e 's/__attribute_const__([ \t]|$)/\1/g' \ + -e 's@^#include <linux/compiler.h>@@' \ + -e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \ +diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh +index 86a4fe7..99e91f9 100755 +--- a/scripts/link-vmlinux.sh ++++ b/scripts/link-vmlinux.sh +@@ -166,7 +166,7 @@ else + fi; + + # final build of init/ +-${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init ++${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init GCC_PLUGINS_CFLAGS="${GCC_PLUGINS_CFLAGS}" GCC_PLUGINS_AFLAGS="${GCC_PLUGINS_AFLAGS}" + + kallsymso="" + kallsyms_vmlinux="" +diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c +index e614ef6..d9d2b01 100644 +--- a/scripts/mod/file2alias.c ++++ b/scripts/mod/file2alias.c +@@ -142,7 +142,7 @@ static void device_id_check(const char *modname, const char *device_id, + unsigned long size, unsigned long id_size, + void *symval) + { +- int i; ++ unsigned int i; + + if (size % id_size || size < id_size) { + fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo " +@@ -171,7 +171,7 @@ static void device_id_check(const char *modname, const char *device_id, + /* USB is special because the bcdDevice can be matched against a numeric range */ + /* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipNinN" */ + static void do_usb_entry(void *symval, +- unsigned int bcdDevice_initial, int bcdDevice_initial_digits, ++ unsigned int bcdDevice_initial, unsigned int bcdDevice_initial_digits, + unsigned char range_lo, unsigned char range_hi, + unsigned char max, struct module *mod) + { +@@ -281,7 +281,7 @@ static void do_usb_entry_multi(void *symval, struct module *mod) + { + unsigned int devlo, devhi; + unsigned char chi, clo, max; +- int ndigits; ++ unsigned int ndigits; + + DEF_FIELD(symval, usb_device_id, match_flags); + DEF_FIELD(symval, usb_device_id, idVendor); +@@ -534,7 +534,7 @@ static void do_pnp_device_entry(void *symval, unsigned long size, + for (i = 0; i < count; i++) { + DEF_FIELD_ADDR(symval + i*id_size, pnp_device_id, id); + char acpi_id[sizeof(*id)]; +- int j; ++ unsigned int j; + + buf_printf(&mod->dev_table_buf, + "MODULE_ALIAS(\"pnp:d%s*\");\n", *id); +@@ -563,7 +563,7 @@ static void do_pnp_card_entries(void *symval, unsigned long size, + + for (j = 0; j < PNP_MAX_DEVICES; j++) { + const char *id = (char *)(*devs)[j].id; +- int i2, j2; ++ unsigned int i2, j2; + int dup = 0; + + if (!id[0]) +@@ -589,7 +589,7 @@ static void do_pnp_card_entries(void *symval, unsigned long size, + /* add an individual alias for every device entry */ + if (!dup) { + char acpi_id[PNP_ID_LEN]; +- int k; ++ unsigned int k; + + buf_printf(&mod->dev_table_buf, + "MODULE_ALIAS(\"pnp:d%s*\");\n", id); +@@ -939,7 +939,7 @@ static void dmi_ascii_filter(char *d, const char *s) + static int do_dmi_entry(const char *filename, void *symval, + char *alias) + { +- int i, j; ++ unsigned int i, j; + DEF_FIELD_ADDR(symval, dmi_system_id, matches); + sprintf(alias, "dmi*"); + +diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c +index d439856..10c1eac 100644 +--- a/scripts/mod/modpost.c ++++ b/scripts/mod/modpost.c +@@ -921,6 +921,7 @@ enum mismatch { + ANY_INIT_TO_ANY_EXIT, + ANY_EXIT_TO_ANY_INIT, + EXPORT_TO_INIT_EXIT, ++ DATA_TO_TEXT + }; + + struct sectioncheck { +@@ -1007,6 +1008,12 @@ static const struct sectioncheck sectioncheck[] = { + .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, + .mismatch = EXPORT_TO_INIT_EXIT, + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, ++}, ++/* Do not reference code from writable data */ ++{ ++ .fromsec = { DATA_SECTIONS, NULL }, ++ .tosec = { TEXT_SECTIONS, NULL }, ++ .mismatch = DATA_TO_TEXT + } + }; + +@@ -1127,10 +1134,10 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr, + continue; + if (ELF_ST_TYPE(sym->st_info) == STT_SECTION) + continue; +- if (sym->st_value == addr) +- return sym; + /* Find a symbol nearby - addr are maybe negative */ + d = sym->st_value - addr; ++ if (d == 0) ++ return sym; + if (d < 0) + d = addr - sym->st_value; + if (d < distance) { +@@ -1408,6 +1415,14 @@ static void report_sec_mismatch(const char *modname, + tosym, prl_to, prl_to, tosym); + free(prl_to); + break; ++ case DATA_TO_TEXT: ++#if 0 ++ fprintf(stderr, ++ "The %s %s:%s references\n" ++ "the %s %s:%s%s\n", ++ from, fromsec, fromsym, to, tosec, tosym, to_p); ++#endif ++ break; + } + fprintf(stderr, "\n"); + } +@@ -1659,7 +1674,7 @@ static void section_rel(const char *modname, struct elf_info *elf, + static void check_sec_ref(struct module *mod, const char *modname, + struct elf_info *elf) + { +- int i; ++ unsigned int i; + Elf_Shdr *sechdrs = elf->sechdrs; + + /* Walk through all sections */ +@@ -1790,7 +1805,7 @@ void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf, + va_end(ap); + } + +-void buf_write(struct buffer *buf, const char *s, int len) ++void buf_write(struct buffer *buf, const char *s, unsigned int len) + { + if (buf->size - buf->pos < len) { + buf->size += len + SZ; +@@ -2009,7 +2024,7 @@ static void write_if_changed(struct buffer *b, const char *fname) + if (fstat(fileno(file), &st) < 0) + goto close_write; + +- if (st.st_size != b->pos) ++ if (st.st_size != (off_t)b->pos) + goto close_write; + + tmp = NOFAIL(malloc(b->pos)); +diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h +index 168b43d..77914bf 100644 +--- a/scripts/mod/modpost.h ++++ b/scripts/mod/modpost.h +@@ -92,15 +92,15 @@ void *do_nofail(void *ptr, const char *expr); + + struct buffer { + char *p; +- int pos; +- int size; ++ unsigned int pos; ++ unsigned int size; + }; + + void __attribute__((format(printf, 2, 3))) + buf_printf(struct buffer *buf, const char *fmt, ...); + + void +-buf_write(struct buffer *buf, const char *s, int len); ++buf_write(struct buffer *buf, const char *s, unsigned int len); + + struct module { + struct module *next; +diff --git a/scripts/mod/sumversion.c b/scripts/mod/sumversion.c +index 944418d..15291e4 100644 +--- a/scripts/mod/sumversion.c ++++ b/scripts/mod/sumversion.c +@@ -470,7 +470,7 @@ static void write_version(const char *filename, const char *sum, + goto out; + } + +- if (write(fd, sum, strlen(sum)+1) != strlen(sum)+1) { ++ if (write(fd, sum, strlen(sum)+1) != (ssize_t)strlen(sum)+1) { + warn("writing sum in %s failed: %s\n", + filename, strerror(errno)); + goto out; +diff --git a/scripts/module-common.lds b/scripts/module-common.lds +index 0865b3e..7235dd4 100644 +--- a/scripts/module-common.lds ++++ b/scripts/module-common.lds +@@ -6,6 +6,10 @@ + SECTIONS { + /DISCARD/ : { *(.discard) } + ++ .rodata : { ++ *(.rodata) *(.rodata.*) ++ *(.data..read_only) ++ } + __ksymtab : { *(SORT(___ksymtab+*)) } + __ksymtab_gpl : { *(SORT(___ksymtab_gpl+*)) } + __ksymtab_unused : { *(SORT(___ksymtab_unused+*)) } +diff --git a/scripts/package/Makefile b/scripts/package/Makefile +index 99ca6e7..3a1a1a1 100644 +--- a/scripts/package/Makefile ++++ b/scripts/package/Makefile +@@ -46,7 +46,7 @@ rpm-pkg rpm: FORCE + ln -sf $(srctree) $(KERNELPATH) + $(CONFIG_SHELL) $(MKSPEC) >$(objtree)/kernel.spec + $(CONFIG_SHELL) $(srctree)/scripts/setlocalversion --save-scmversion +- tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(TAR_CONTENT) ++ tar --owner=root --group=root -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(TAR_CONTENT) + rm $(KERNELPATH) + rm -f $(objtree)/.scmversion + $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version +diff --git a/scripts/package/builddeb b/scripts/package/builddeb +index 5972624..4028795 100755 +--- a/scripts/package/builddeb ++++ b/scripts/package/builddeb +@@ -293,6 +293,7 @@ fi + (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" + (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" + (cd $objtree; find arch/$SRCARCH/include Module.symvers include scripts -type f) >> "$objtree/debian/hdrobjfiles" ++(cd $objtree; find tools/gcc -name \*.so >> "$objtree/debian/hdrobjfiles") + destdir=$kernel_headers_dir/usr/src/linux-headers-$version + mkdir -p "$destdir" + (cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -) +diff --git a/scripts/package/mkspec b/scripts/package/mkspec +index 1395760..bca2734 100755 +--- a/scripts/package/mkspec ++++ b/scripts/package/mkspec +@@ -121,29 +121,40 @@ echo 'rm -f $RPM_BUILD_ROOT'"/lib/modules/$KERNELRELEASE/{build,source}" + echo "mkdir -p "'$RPM_BUILD_ROOT'"/usr/src/kernels/$KERNELRELEASE" + echo "EXCLUDES=\"$RCS_TAR_IGNORE --exclude .tmp_versions --exclude=*vmlinux* --exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation --exclude=firmware --exclude .config.old --exclude .missing-syscalls.d\"" + echo "tar "'$EXCLUDES'" -cf- . | (cd "'$RPM_BUILD_ROOT'"/usr/src/kernels/$KERNELRELEASE;tar xvf -)" +-echo 'cd $RPM_BUILD_ROOT'"/lib/modules/$KERNELRELEASE" +-echo "ln -sf /usr/src/kernels/$KERNELRELEASE build" +-echo "ln -sf /usr/src/kernels/$KERNELRELEASE source" + + echo "" + echo "%clean" + echo 'rm -rf $RPM_BUILD_ROOT' + echo "" ++echo "%pre" ++echo 'chmod -f 0500 /boot' ++echo 'if [ -d /lib/modules ]; then' ++echo 'chmod -f 0500 /lib/modules' ++echo 'fi' ++echo 'if [ -d /lib32/modules ]; then' ++echo 'chmod -f 0500 /lib32/modules' ++echo 'fi' ++echo 'if [ -d /lib64/modules ]; then' ++echo 'chmod -f 0500 /lib64/modules' ++echo 'fi' ++echo "" ++echo "%post devel" ++echo "ln -sf /usr/src/kernels/$KERNELRELEASE /lib/modules/$KERNELRELEASE/build" ++echo "ln -sf /usr/src/kernels/$KERNELRELEASE /lib/modules/$KERNELRELEASE/source" ++echo "" + echo "%post" +-echo "if [ -x /sbin/installkernel -a -r /boot/vmlinuz-$KERNELRELEASE -a -r /boot/System.map-$KERNELRELEASE ]; then" +-echo "cp /boot/vmlinuz-$KERNELRELEASE /boot/vmlinuz-$KERNELRELEASE-rpm" +-echo "cp /boot/System.map-$KERNELRELEASE /boot/System.map-$KERNELRELEASE-rpm" +-echo "rm -f /boot/vmlinuz-$KERNELRELEASE /boot/System.map-$KERNELRELEASE" +-echo "/sbin/installkernel $KERNELRELEASE /boot/vmlinuz-$KERNELRELEASE-rpm /boot/System.map-$KERNELRELEASE-rpm" +-echo "rm -f /boot/vmlinuz-$KERNELRELEASE-rpm /boot/System.map-$KERNELRELEASE-rpm" ++echo "if [ -x /sbin/dracut ]; then" ++echo '/sbin/new-kernel-pkg --dracut --mkinitrd --depmod --install --make-default '"$KERNELRELEASE"' || exit $?' ++echo "else" ++echo '/sbin/new-kernel-pkg --mkinitrd --depmod --install --make-default '"$KERNELRELEASE"' || exit $?' + echo "fi" + echo "" + echo "%files" +-echo '%defattr (-, root, root)' ++echo '%defattr (400, root, root, 500)' + echo "%dir /lib/modules" +-echo "/lib/modules/$KERNELRELEASE" + echo "%exclude /lib/modules/$KERNELRELEASE/build" + echo "%exclude /lib/modules/$KERNELRELEASE/source" ++echo "/lib/modules/$KERNELRELEASE" + echo "/lib/firmware/$KERNELRELEASE" + echo "/boot/*" + echo "" +@@ -152,8 +163,7 @@ echo '%defattr (-, root, root)' + echo "/usr/include" + echo "" + echo "%files devel" +-echo '%defattr (-, root, root)' ++echo '%defattr (400, root, root, 500)' ++echo "%dir /lib/modules/$KERNELRELEASE" + echo "/usr/src/kernels/$KERNELRELEASE" +-echo "/lib/modules/$KERNELRELEASE/build" +-echo "/lib/modules/$KERNELRELEASE/source" + echo "" +diff --git a/scripts/pnmtologo.c b/scripts/pnmtologo.c +index 4718d78..9220d58 100644 +--- a/scripts/pnmtologo.c ++++ b/scripts/pnmtologo.c +@@ -244,14 +244,14 @@ static void write_header(void) + fprintf(out, " * Linux logo %s\n", logoname); + fputs(" */\n\n", out); + fputs("#include <linux/linux_logo.h>\n\n", out); +- fprintf(out, "static unsigned char %s_data[] __initdata = {\n", ++ fprintf(out, "static unsigned char %s_data[] = {\n", + logoname); + } + + static void write_footer(void) + { + fputs("\n};\n\n", out); +- fprintf(out, "const struct linux_logo %s __initconst = {\n", logoname); ++ fprintf(out, "const struct linux_logo %s = {\n", logoname); + fprintf(out, "\t.type\t\t= %s,\n", logo_types[logo_type]); + fprintf(out, "\t.width\t\t= %d,\n", logo_width); + fprintf(out, "\t.height\t\t= %d,\n", logo_height); +@@ -381,7 +381,7 @@ static void write_logo_clut224(void) + fputs("\n};\n\n", out); + + /* write logo clut */ +- fprintf(out, "static unsigned char %s_clut[] __initdata = {\n", ++ fprintf(out, "static unsigned char %s_clut[] = {\n", + logoname); + write_hex_cnt = 0; + for (i = 0; i < logo_clutsize; i++) { +diff --git a/scripts/sortextable.h b/scripts/sortextable.h +index ba87004..3f4852c 100644 +--- a/scripts/sortextable.h ++++ b/scripts/sortextable.h +@@ -108,9 +108,9 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort) + const char *secstrtab; + const char *strtab; + char *extab_image; +- int extab_index = 0; +- int i; +- int idx; ++ unsigned int extab_index = 0; ++ unsigned int i; ++ unsigned int idx; + unsigned int num_sections; + unsigned int secindex_strings; + +diff --git a/scripts/tags.sh b/scripts/tags.sh +index cdb491d..8d32bfc 100755 +--- a/scripts/tags.sh ++++ b/scripts/tags.sh +@@ -26,7 +26,7 @@ else + fi + + # ignore userspace tools +-ignore="$ignore ( -path ${tree}tools ) -prune -o" ++ignore="$ignore ( -path \"${tree}tools/[^g]*\" ) -prune -o" + + # Find all available archs + find_all_archs() +diff --git a/security/Kconfig b/security/Kconfig +index beb86b5..797527de 100644 +--- a/security/Kconfig ++++ b/security/Kconfig +@@ -4,6 +4,974 @@ + + menu "Security options" + ++menu "Grsecurity" ++ ++ config ARCH_TRACK_EXEC_LIMIT ++ bool ++ ++ config PAX_KERNEXEC_PLUGIN ++ bool ++ ++ config PAX_PER_CPU_PGD ++ bool ++ ++ config TASK_SIZE_MAX_SHIFT ++ int ++ depends on X86_64 ++ default 47 if !PAX_PER_CPU_PGD ++ default 42 if PAX_PER_CPU_PGD ++ ++ config PAX_ENABLE_PAE ++ bool ++ default y if (X86_32 && (MPENTIUM4 || MK8 || MPSC || MCORE2 || MATOM)) ++ ++ config PAX_USERCOPY_SLABS ++ bool ++ ++config GRKERNSEC ++ bool "Grsecurity" ++ select CRYPTO ++ select CRYPTO_SHA256 ++ select PROC_FS ++ select STOP_MACHINE ++ select TTY ++ select DEBUG_KERNEL ++ select DEBUG_LIST ++ help ++ If you say Y here, you will be able to configure many features ++ that will enhance the security of your system. It is highly ++ recommended that you say Y here and read through the help ++ for each option so that you fully understand the features and ++ can evaluate their usefulness for your machine. ++ ++choice ++ prompt "Configuration Method" ++ depends on GRKERNSEC ++ default GRKERNSEC_CONFIG_CUSTOM ++ help ++ ++config GRKERNSEC_CONFIG_AUTO ++ bool "Automatic" ++ help ++ If you choose this configuration method, you'll be able to answer a small ++ number of simple questions about how you plan to use this kernel. ++ The settings of grsecurity and PaX will be automatically configured for ++ the highest commonly-used settings within the provided constraints. ++ ++ If you require additional configuration, custom changes can still be made ++ from the "custom configuration" menu. ++ ++config GRKERNSEC_CONFIG_CUSTOM ++ bool "Custom" ++ help ++ If you choose this configuration method, you'll be able to configure all ++ grsecurity and PaX settings manually. Via this method, no options are ++ automatically enabled. ++ ++endchoice ++ ++choice ++ prompt "Usage Type" ++ depends on (GRKERNSEC && GRKERNSEC_CONFIG_AUTO) ++ default GRKERNSEC_CONFIG_SERVER ++ help ++ ++config GRKERNSEC_CONFIG_SERVER ++ bool "Server" ++ help ++ Choose this option if you plan to use this kernel on a server. ++ ++config GRKERNSEC_CONFIG_DESKTOP ++ bool "Desktop" ++ help ++ Choose this option if you plan to use this kernel on a desktop. ++ ++endchoice ++ ++choice ++ prompt "Virtualization Type" ++ depends on (GRKERNSEC && X86 && GRKERNSEC_CONFIG_AUTO) ++ default GRKERNSEC_CONFIG_VIRT_NONE ++ help ++ ++config GRKERNSEC_CONFIG_VIRT_NONE ++ bool "None" ++ help ++ Choose this option if this kernel will be run on bare metal. ++ ++config GRKERNSEC_CONFIG_VIRT_GUEST ++ bool "Guest" ++ help ++ Choose this option if this kernel will be run as a VM guest. ++ ++config GRKERNSEC_CONFIG_VIRT_HOST ++ bool "Host" ++ help ++ Choose this option if this kernel will be run as a VM host. ++ ++endchoice ++ ++choice ++ prompt "Virtualization Hardware" ++ depends on (GRKERNSEC && X86 && GRKERNSEC_CONFIG_AUTO && (GRKERNSEC_CONFIG_VIRT_GUEST || GRKERNSEC_CONFIG_VIRT_HOST)) ++ help ++ ++config GRKERNSEC_CONFIG_VIRT_EPT ++ bool "EPT/RVI Processor Support" ++ depends on X86 ++ help ++ Choose this option if your CPU supports the EPT or RVI features of 2nd-gen ++ hardware virtualization. This allows for additional kernel hardening protections ++ to operate without additional performance impact. ++ ++ To see if your Intel processor supports EPT, see: ++ http://ark.intel.com/Products/VirtualizationTechnology ++ (Most Core i3/5/7 support EPT) ++ ++ To see if your AMD processor supports RVI, see: ++ http://support.amd.com/us/kbarticles/Pages/GPU120AMDRVICPUsHyperVWin8.aspx ++ ++config GRKERNSEC_CONFIG_VIRT_SOFT ++ bool "First-gen/No Hardware Virtualization" ++ help ++ Choose this option if you use an Atom/Pentium/Core 2 processor that either doesn't ++ support hardware virtualization or doesn't support the EPT/RVI extensions. ++ ++endchoice ++ ++choice ++ prompt "Virtualization Software" ++ depends on (GRKERNSEC && GRKERNSEC_CONFIG_AUTO && (GRKERNSEC_CONFIG_VIRT_GUEST || GRKERNSEC_CONFIG_VIRT_HOST)) ++ help ++ ++config GRKERNSEC_CONFIG_VIRT_XEN ++ bool "Xen" ++ help ++ Choose this option if this kernel is running as a Xen guest or host. ++ ++config GRKERNSEC_CONFIG_VIRT_VMWARE ++ bool "VMWare" ++ help ++ Choose this option if this kernel is running as a VMWare guest or host. ++ ++config GRKERNSEC_CONFIG_VIRT_KVM ++ bool "KVM" ++ help ++ Choose this option if this kernel is running as a KVM guest or host. ++ ++config GRKERNSEC_CONFIG_VIRT_VIRTUALBOX ++ bool "VirtualBox" ++ help ++ Choose this option if this kernel is running as a VirtualBox guest or host. ++ ++config GRKERNSEC_CONFIG_VIRT_HYPERV ++ bool "Hyper-V" ++ help ++ Choose this option if this kernel is running as a Hyper-V guest. ++ ++endchoice ++ ++choice ++ prompt "Required Priorities" ++ depends on (GRKERNSEC && GRKERNSEC_CONFIG_AUTO) ++ default GRKERNSEC_CONFIG_PRIORITY_PERF ++ help ++ ++config GRKERNSEC_CONFIG_PRIORITY_PERF ++ bool "Performance" ++ help ++ Choose this option if performance is of highest priority for this deployment ++ of grsecurity. Features like UDEREF on a 64bit kernel, kernel stack clearing, ++ clearing of structures intended for userland, and freed memory sanitizing will ++ be disabled. ++ ++config GRKERNSEC_CONFIG_PRIORITY_SECURITY ++ bool "Security" ++ help ++ Choose this option if security is of highest priority for this deployment of ++ grsecurity. UDEREF, kernel stack clearing, clearing of structures intended ++ for userland, and freed memory sanitizing will be enabled for this kernel. ++ In a worst-case scenario, these features can introduce a 20% performance hit ++ (UDEREF on x64 contributing half of this hit). ++ ++endchoice ++ ++menu "Default Special Groups" ++depends on (GRKERNSEC && GRKERNSEC_CONFIG_AUTO) ++ ++config GRKERNSEC_PROC_GID ++ int "GID exempted from /proc restrictions" ++ default 1001 ++ help ++ Setting this GID determines which group will be exempted from ++ grsecurity's /proc restrictions, allowing users of the specified ++ group to view network statistics and the existence of other users' ++ processes on the system. This GID may also be chosen at boot time ++ via "grsec_proc_gid=" on the kernel commandline. ++ ++config GRKERNSEC_TPE_UNTRUSTED_GID ++ int "GID for TPE-untrusted users" ++ depends on GRKERNSEC_CONFIG_SERVER && GRKERNSEC_TPE && !GRKERNSEC_TPE_INVERT ++ default 1005 ++ help ++ Setting this GID determines which group untrusted users should ++ be added to. These users will be placed under grsecurity's Trusted Path ++ Execution mechanism, preventing them from executing their own binaries. ++ The users will only be able to execute binaries in directories owned and ++ writable only by the root user. If the sysctl option is enabled, a sysctl ++ option with name "tpe_gid" is created. ++ ++config GRKERNSEC_TPE_TRUSTED_GID ++ int "GID for TPE-trusted users" ++ depends on GRKERNSEC_CONFIG_SERVER && GRKERNSEC_TPE && GRKERNSEC_TPE_INVERT ++ default 1005 ++ help ++ Setting this GID determines what group TPE restrictions will be ++ *disabled* for. If the sysctl option is enabled, a sysctl option ++ with name "tpe_gid" is created. ++ ++config GRKERNSEC_SYMLINKOWN_GID ++ int "GID for users with kernel-enforced SymlinksIfOwnerMatch" ++ depends on GRKERNSEC_CONFIG_SERVER ++ default 1006 ++ help ++ Setting this GID determines what group kernel-enforced ++ SymlinksIfOwnerMatch will be enabled for. If the sysctl option ++ is enabled, a sysctl option with name "symlinkown_gid" is created. ++ ++ ++endmenu ++ ++menu "Customize Configuration" ++depends on GRKERNSEC ++ ++menu "PaX" ++ ++config PAX ++ bool "Enable various PaX features" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC && (ALPHA || ARM || AVR32 || IA64 || MIPS || PARISC || PPC || SPARC || X86) ++ help ++ This allows you to enable various PaX features. PaX adds ++ intrusion prevention mechanisms to the kernel that reduce ++ the risks posed by exploitable memory corruption bugs. ++ ++menu "PaX Control" ++ depends on PAX ++ ++config PAX_SOFTMODE ++ bool 'Support soft mode' ++ help ++ Enabling this option will allow you to run PaX in soft mode, that ++ is, PaX features will not be enforced by default, only on executables ++ marked explicitly. You must also enable PT_PAX_FLAGS or XATTR_PAX_FLAGS ++ support as they are the only way to mark executables for soft mode use. ++ ++ Soft mode can be activated by using the "pax_softmode=1" kernel command ++ line option on boot. Furthermore you can control various PaX features ++ at runtime via the entries in /proc/sys/kernel/pax. ++ ++config PAX_EI_PAX ++ bool 'Use legacy ELF header marking' ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ Enabling this option will allow you to control PaX features on ++ a per executable basis via the 'chpax' utility available at ++ http://pax.grsecurity.net/. The control flags will be read from ++ an otherwise reserved part of the ELF header. This marking has ++ numerous drawbacks (no support for soft-mode, toolchain does not ++ know about the non-standard use of the ELF header) therefore it ++ has been deprecated in favour of PT_PAX_FLAGS and XATTR_PAX_FLAGS ++ support. ++ ++ Note that if you enable PT_PAX_FLAGS or XATTR_PAX_FLAGS marking ++ support as well, they will override the legacy EI_PAX marks. ++ ++ If you enable none of the marking options then all applications ++ will run with PaX enabled on them by default. ++ ++config PAX_PT_PAX_FLAGS ++ bool 'Use ELF program header marking' ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ Enabling this option will allow you to control PaX features on ++ a per executable basis via the 'paxctl' utility available at ++ http://pax.grsecurity.net/. The control flags will be read from ++ a PaX specific ELF program header (PT_PAX_FLAGS). This marking ++ has the benefits of supporting both soft mode and being fully ++ integrated into the toolchain (the binutils patch is available ++ from http://pax.grsecurity.net). ++ ++ Note that if you enable the legacy EI_PAX marking support as well, ++ the EI_PAX marks will be overridden by the PT_PAX_FLAGS marks. ++ ++ If you enable both PT_PAX_FLAGS and XATTR_PAX_FLAGS support then you ++ must make sure that the marks are the same if a binary has both marks. ++ ++ If you enable none of the marking options then all applications ++ will run with PaX enabled on them by default. ++ ++config PAX_XATTR_PAX_FLAGS ++ bool 'Use filesystem extended attributes marking' ++ default y if GRKERNSEC_CONFIG_AUTO ++ select CIFS_XATTR if CIFS ++ select EXT2_FS_XATTR if EXT2_FS ++ select EXT3_FS_XATTR if EXT3_FS ++ select F2FS_FS_XATTR if F2FS_FS ++ select JFFS2_FS_XATTR if JFFS2_FS ++ select REISERFS_FS_XATTR if REISERFS_FS ++ select SQUASHFS_XATTR if SQUASHFS ++ select TMPFS_XATTR if TMPFS ++ help ++ Enabling this option will allow you to control PaX features on ++ a per executable basis via the 'setfattr' utility. The control ++ flags will be read from the user.pax.flags extended attribute of ++ the file. This marking has the benefit of supporting binary-only ++ applications that self-check themselves (e.g., skype) and would ++ not tolerate chpax/paxctl changes. The main drawback is that ++ extended attributes are not supported by some filesystems (e.g., ++ isofs, udf, vfat) so copying files through such filesystems will ++ lose the extended attributes and these PaX markings. ++ ++ Note that if you enable the legacy EI_PAX marking support as well, ++ the EI_PAX marks will be overridden by the XATTR_PAX_FLAGS marks. ++ ++ If you enable both PT_PAX_FLAGS and XATTR_PAX_FLAGS support then you ++ must make sure that the marks are the same if a binary has both marks. ++ ++ If you enable none of the marking options then all applications ++ will run with PaX enabled on them by default. ++ ++choice ++ prompt 'MAC system integration' ++ default PAX_HAVE_ACL_FLAGS ++ help ++ Mandatory Access Control systems have the option of controlling ++ PaX flags on a per executable basis, choose the method supported ++ by your particular system. ++ ++ - "none": if your MAC system does not interact with PaX, ++ - "direct": if your MAC system defines pax_set_initial_flags() itself, ++ - "hook": if your MAC system uses the pax_set_initial_flags_func callback. ++ ++ NOTE: this option is for developers/integrators only. ++ ++ config PAX_NO_ACL_FLAGS ++ bool 'none' ++ ++ config PAX_HAVE_ACL_FLAGS ++ bool 'direct' ++ ++ config PAX_HOOK_ACL_FLAGS ++ bool 'hook' ++endchoice ++ ++endmenu ++ ++menu "Non-executable pages" ++ depends on PAX ++ ++config PAX_NOEXEC ++ bool "Enforce non-executable pages" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on ALPHA || (ARM && (CPU_V6 || CPU_V6K || CPU_V7)) || IA64 || MIPS || PARISC || PPC || S390 || SPARC || X86 ++ help ++ By design some architectures do not allow for protecting memory ++ pages against execution or even if they do, Linux does not make ++ use of this feature. In practice this means that if a page is ++ readable (such as the stack or heap) it is also executable. ++ ++ There is a well known exploit technique that makes use of this ++ fact and a common programming mistake where an attacker can ++ introduce code of his choice somewhere in the attacked program's ++ memory (typically the stack or the heap) and then execute it. ++ ++ If the attacked program was running with different (typically ++ higher) privileges than that of the attacker, then he can elevate ++ his own privilege level (e.g. get a root shell, write to files for ++ which he does not have write access to, etc). ++ ++ Enabling this option will let you choose from various features ++ that prevent the injection and execution of 'foreign' code in ++ a program. ++ ++ This will also break programs that rely on the old behaviour and ++ expect that dynamically allocated memory via the malloc() family ++ of functions is executable (which it is not). Notable examples ++ are the XFree86 4.x server, the java runtime and wine. ++ ++config PAX_PAGEEXEC ++ bool "Paging based non-executable pages" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on PAX_NOEXEC && (!X86_32 || M586 || M586TSC || M586MMX || M686 || MPENTIUMII || MPENTIUMIII || MPENTIUMM || MCORE2 || MATOM || MPENTIUM4 || MPSC || MK7 || MK8 || MWINCHIPC6 || MWINCHIP2 || MWINCHIP3D || MVIAC3_2 || MVIAC7) ++ select ARCH_TRACK_EXEC_LIMIT if X86_32 ++ help ++ This implementation is based on the paging feature of the CPU. ++ On i386 without hardware non-executable bit support there is a ++ variable but usually low performance impact, however on Intel's ++ P4 core based CPUs it is very high so you should not enable this ++ for kernels meant to be used on such CPUs. ++ ++ On alpha, avr32, ia64, parisc, sparc, sparc64, x86_64 and i386 ++ with hardware non-executable bit support there is no performance ++ impact, on ppc the impact is negligible. ++ ++ Note that several architectures require various emulations due to ++ badly designed userland ABIs, this will cause a performance impact ++ but will disappear as soon as userland is fixed. For example, ppc ++ userland MUST have been built with secure-plt by a recent toolchain. ++ ++config PAX_SEGMEXEC ++ bool "Segmentation based non-executable pages" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on PAX_NOEXEC && X86_32 ++ help ++ This implementation is based on the segmentation feature of the ++ CPU and has a very small performance impact, however applications ++ will be limited to a 1.5 GB address space instead of the normal ++ 3 GB. ++ ++config PAX_EMUTRAMP ++ bool "Emulate trampolines" ++ default y if PARISC || GRKERNSEC_CONFIG_AUTO ++ depends on (PAX_PAGEEXEC || PAX_SEGMEXEC) && (PARISC || X86) ++ help ++ There are some programs and libraries that for one reason or ++ another attempt to execute special small code snippets from ++ non-executable memory pages. Most notable examples are the ++ signal handler return code generated by the kernel itself and ++ the GCC trampolines. ++ ++ If you enabled CONFIG_PAX_PAGEEXEC or CONFIG_PAX_SEGMEXEC then ++ such programs will no longer work under your kernel. ++ ++ As a remedy you can say Y here and use the 'chpax' or 'paxctl' ++ utilities to enable trampoline emulation for the affected programs ++ yet still have the protection provided by the non-executable pages. ++ ++ On parisc you MUST enable this option and EMUSIGRT as well, otherwise ++ your system will not even boot. ++ ++ Alternatively you can say N here and use the 'chpax' or 'paxctl' ++ utilities to disable CONFIG_PAX_PAGEEXEC and CONFIG_PAX_SEGMEXEC ++ for the affected files. ++ ++ NOTE: enabling this feature *may* open up a loophole in the ++ protection provided by non-executable pages that an attacker ++ could abuse. Therefore the best solution is to not have any ++ files on your system that would require this option. This can ++ be achieved by not using libc5 (which relies on the kernel ++ signal handler return code) and not using or rewriting programs ++ that make use of the nested function implementation of GCC. ++ Skilled users can just fix GCC itself so that it implements ++ nested function calls in a way that does not interfere with PaX. ++ ++config PAX_EMUSIGRT ++ bool "Automatically emulate sigreturn trampolines" ++ depends on PAX_EMUTRAMP && PARISC ++ default y ++ help ++ Enabling this option will have the kernel automatically detect ++ and emulate signal return trampolines executing on the stack ++ that would otherwise lead to task termination. ++ ++ This solution is intended as a temporary one for users with ++ legacy versions of libc (libc5, glibc 2.0, uClibc before 0.9.17, ++ Modula-3 runtime, etc) or executables linked to such, basically ++ everything that does not specify its own SA_RESTORER function in ++ normal executable memory like glibc 2.1+ does. ++ ++ On parisc you MUST enable this option, otherwise your system will ++ not even boot. ++ ++ NOTE: this feature cannot be disabled on a per executable basis ++ and since it *does* open up a loophole in the protection provided ++ by non-executable pages, the best solution is to not have any ++ files on your system that would require this option. ++ ++config PAX_MPROTECT ++ bool "Restrict mprotect()" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on (PAX_PAGEEXEC || PAX_SEGMEXEC) ++ help ++ Enabling this option will prevent programs from ++ - changing the executable status of memory pages that were ++ not originally created as executable, ++ - making read-only executable pages writable again, ++ - creating executable pages from anonymous memory, ++ - making read-only-after-relocations (RELRO) data pages writable again. ++ ++ You should say Y here to complete the protection provided by ++ the enforcement of non-executable pages. ++ ++ NOTE: you can use the 'chpax' or 'paxctl' utilities to control ++ this feature on a per file basis. ++ ++config PAX_MPROTECT_COMPAT ++ bool "Use legacy/compat protection demoting (read help)" ++ default y if (GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_DESKTOP) ++ depends on PAX_MPROTECT ++ help ++ The current implementation of PAX_MPROTECT denies RWX allocations/mprotects ++ by sending the proper error code to the application. For some broken ++ userland, this can cause problems with Python or other applications. The ++ current implementation however allows for applications like clamav to ++ detect if JIT compilation/execution is allowed and to fall back gracefully ++ to an interpreter-based mode if it does not. While we encourage everyone ++ to use the current implementation as-is and push upstream to fix broken ++ userland (note that the RWX logging option can assist with this), in some ++ environments this may not be possible. Having to disable MPROTECT ++ completely on certain binaries reduces the security benefit of PaX, ++ so this option is provided for those environments to revert to the old ++ behavior. ++ ++config PAX_ELFRELOCS ++ bool "Allow ELF text relocations (read help)" ++ depends on PAX_MPROTECT ++ default n ++ help ++ Non-executable pages and mprotect() restrictions are effective ++ in preventing the introduction of new executable code into an ++ attacked task's address space. There remain only two venues ++ for this kind of attack: if the attacker can execute already ++ existing code in the attacked task then he can either have it ++ create and mmap() a file containing his code or have it mmap() ++ an already existing ELF library that does not have position ++ independent code in it and use mprotect() on it to make it ++ writable and copy his code there. While protecting against ++ the former approach is beyond PaX, the latter can be prevented ++ by having only PIC ELF libraries on one's system (which do not ++ need to relocate their code). If you are sure this is your case, ++ as is the case with all modern Linux distributions, then leave ++ this option disabled. You should say 'n' here. ++ ++config PAX_ETEXECRELOCS ++ bool "Allow ELF ET_EXEC text relocations" ++ depends on PAX_MPROTECT && (ALPHA || IA64 || PARISC) ++ select PAX_ELFRELOCS ++ default y ++ help ++ On some architectures there are incorrectly created applications ++ that require text relocations and would not work without enabling ++ this option. If you are an alpha, ia64 or parisc user, you should ++ enable this option and disable it once you have made sure that ++ none of your applications need it. ++ ++config PAX_EMUPLT ++ bool "Automatically emulate ELF PLT" ++ depends on PAX_MPROTECT && (ALPHA || PARISC || SPARC) ++ default y ++ help ++ Enabling this option will have the kernel automatically detect ++ and emulate the Procedure Linkage Table entries in ELF files. ++ On some architectures such entries are in writable memory, and ++ become non-executable leading to task termination. Therefore ++ it is mandatory that you enable this option on alpha, parisc, ++ sparc and sparc64, otherwise your system would not even boot. ++ ++ NOTE: this feature *does* open up a loophole in the protection ++ provided by the non-executable pages, therefore the proper ++ solution is to modify the toolchain to produce a PLT that does ++ not need to be writable. ++ ++config PAX_DLRESOLVE ++ bool 'Emulate old glibc resolver stub' ++ depends on PAX_EMUPLT && SPARC ++ default n ++ help ++ This option is needed if userland has an old glibc (before 2.4) ++ that puts a 'save' instruction into the runtime generated resolver ++ stub that needs special emulation. ++ ++config PAX_KERNEXEC ++ bool "Enforce non-executable kernel pages" ++ default y if GRKERNSEC_CONFIG_AUTO && (!X86 || GRKERNSEC_CONFIG_VIRT_NONE || (GRKERNSEC_CONFIG_VIRT_EPT && GRKERNSEC_CONFIG_VIRT_GUEST) || (GRKERNSEC_CONFIG_VIRT_EPT && GRKERNSEC_CONFIG_VIRT_KVM)) ++ depends on (X86 || (ARM && (CPU_V6 || CPU_V6K || CPU_V7) && !(ARM_LPAE && MODULES))) && !XEN ++ select PAX_PER_CPU_PGD if X86_64 || (X86_32 && X86_PAE) ++ select PAX_KERNEXEC_PLUGIN if X86_64 ++ help ++ This is the kernel land equivalent of PAGEEXEC and MPROTECT, ++ that is, enabling this option will make it harder to inject ++ and execute 'foreign' code in kernel memory itself. ++ ++ Note that on amd64, CONFIG_EFI enabled with "efi=old_map" on ++ the kernel command-line will result in an RWX physical map. ++ ++ Likewise, the EFI runtime services are necessarily mapped as ++ RWX. If CONFIG_EFI is enabled on an EFI-capable system, it ++ is recommended that you boot with "noefi" on the kernel ++ command-line if possible to eliminate the mapping. ++ ++choice ++ prompt "Return Address Instrumentation Method" ++ default PAX_KERNEXEC_PLUGIN_METHOD_BTS ++ depends on PAX_KERNEXEC_PLUGIN ++ help ++ Select the method used to instrument function pointer dereferences. ++ Note that binary modules cannot be instrumented by this approach. ++ ++ Note that the implementation requires a gcc with plugin support, ++ i.e., gcc 4.5 or newer. You may need to install the supporting ++ headers explicitly in addition to the normal gcc package. ++ ++ config PAX_KERNEXEC_PLUGIN_METHOD_BTS ++ bool "bts" ++ help ++ This method is compatible with binary only modules but has ++ a higher runtime overhead. ++ ++ config PAX_KERNEXEC_PLUGIN_METHOD_OR ++ bool "or" ++ depends on !PARAVIRT ++ help ++ This method is incompatible with binary only modules but has ++ a lower runtime overhead. ++endchoice ++ ++config PAX_KERNEXEC_PLUGIN_METHOD ++ string ++ default "bts" if PAX_KERNEXEC_PLUGIN_METHOD_BTS ++ default "or" if PAX_KERNEXEC_PLUGIN_METHOD_OR ++ default "" ++ ++config PAX_KERNEXEC_MODULE_TEXT ++ int "Minimum amount of memory reserved for module code" ++ default "8" if (!GRKERNSEC_CONFIG_AUTO || GRKERNSEC_CONFIG_SERVER) ++ default "12" if (GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_DESKTOP) ++ depends on PAX_KERNEXEC && X86_32 ++ help ++ Due to implementation details the kernel must reserve a fixed ++ amount of memory for runtime allocated code (such as modules) ++ at compile time that cannot be changed at runtime. Here you ++ can specify the minimum amount in MB that will be reserved. ++ Due to the same implementation details this size will always ++ be rounded up to the next 2/4 MB boundary (depends on PAE) so ++ the actually available memory for runtime allocated code will ++ usually be more than this minimum. ++ ++ The default 4 MB should be enough for most users but if you have ++ an excessive number of modules (e.g., most distribution configs ++ compile many drivers as modules) or use huge modules such as ++ nvidia's kernel driver, you will need to adjust this amount. ++ A good rule of thumb is to look at your currently loaded kernel ++ modules and add up their sizes. ++ ++endmenu ++ ++menu "Address Space Layout Randomization" ++ depends on PAX ++ ++config PAX_ASLR ++ bool "Address Space Layout Randomization" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ Many if not most exploit techniques rely on the knowledge of ++ certain addresses in the attacked program. The following options ++ will allow the kernel to apply a certain amount of randomization ++ to specific parts of the program thereby forcing an attacker to ++ guess them in most cases. Any failed guess will most likely crash ++ the attacked program which allows the kernel to detect such attempts ++ and react on them. PaX itself provides no reaction mechanisms, ++ instead it is strongly encouraged that you make use of grsecurity's ++ (http://www.grsecurity.net/) built-in crash detection features or ++ develop one yourself. ++ ++ By saying Y here you can choose to randomize the following areas: ++ - top of the task's kernel stack ++ - top of the task's userland stack ++ - base address for mmap() requests that do not specify one ++ (this includes all libraries) ++ - base address of the main executable ++ ++ It is strongly recommended to say Y here as address space layout ++ randomization has negligible impact on performance yet it provides ++ a very effective protection. ++ ++ NOTE: you can use the 'chpax' or 'paxctl' utilities to control ++ this feature on a per file basis. ++ ++config PAX_RANDKSTACK ++ bool "Randomize kernel stack base" ++ default y if GRKERNSEC_CONFIG_AUTO && !(GRKERNSEC_CONFIG_VIRT_HOST && GRKERNSEC_CONFIG_VIRT_VIRTUALBOX) ++ depends on X86_TSC && X86 ++ help ++ By saying Y here the kernel will randomize every task's kernel ++ stack on every system call. This will not only force an attacker ++ to guess it but also prevent him from making use of possible ++ leaked information about it. ++ ++ Since the kernel stack is a rather scarce resource, randomization ++ may cause unexpected stack overflows, therefore you should very ++ carefully test your system. Note that once enabled in the kernel ++ configuration, this feature cannot be disabled on a per file basis. ++ ++config PAX_RANDUSTACK ++ bool ++ ++config PAX_RANDMMAP ++ bool "Randomize user stack and mmap() bases" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on PAX_ASLR ++ select PAX_RANDUSTACK ++ help ++ By saying Y here the kernel will randomize every task's userland ++ stack and use a randomized base address for mmap() requests that ++ do not specify one themselves. ++ ++ The stack randomization is done in two steps where the second ++ one may apply a big amount of shift to the top of the stack and ++ cause problems for programs that want to use lots of memory (more ++ than 2.5 GB if SEGMEXEC is not active, or 1.25 GB when it is). ++ ++ As a result of mmap randomization all dynamically loaded libraries ++ will appear at random addresses and therefore be harder to exploit ++ by a technique where an attacker attempts to execute library code ++ for his purposes (e.g. spawn a shell from an exploited program that ++ is running at an elevated privilege level). ++ ++ Furthermore, if a program is relinked as a dynamic ELF file, its ++ base address will be randomized as well, completing the full ++ randomization of the address space layout. Attacking such programs ++ becomes a guess game. You can find an example of doing this at ++ http://pax.grsecurity.net/et_dyn.tar.gz and practical samples at ++ http://www.grsecurity.net/grsec-gcc-specs.tar.gz . ++ ++ NOTE: you can use the 'chpax' or 'paxctl' utilities to control this ++ feature on a per file basis. ++ ++endmenu ++ ++menu "Miscellaneous hardening features" ++ ++config PAX_MEMORY_SANITIZE ++ bool "Sanitize all freed memory" ++ default y if (GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_PRIORITY_SECURITY) ++ help ++ By saying Y here the kernel will erase memory pages and slab objects ++ as soon as they are freed. This in turn reduces the lifetime of data ++ stored in them, making it less likely that sensitive information such ++ as passwords, cryptographic secrets, etc stay in memory for too long. ++ ++ This is especially useful for programs whose runtime is short, long ++ lived processes and the kernel itself benefit from this as long as ++ they ensure timely freeing of memory that may hold sensitive ++ information. ++ ++ A nice side effect of the sanitization of slab objects is the ++ reduction of possible info leaks caused by padding bytes within the ++ leaky structures. Use-after-free bugs for structures containing ++ pointers can also be detected as dereferencing the sanitized pointer ++ will generate an access violation. ++ ++ The tradeoff is performance impact, on a single CPU system kernel ++ compilation sees a 3% slowdown, other systems and workloads may vary ++ and you are advised to test this feature on your expected workload ++ before deploying it. ++ ++ The slab sanitization feature excludes a few slab caches per default ++ for performance reasons. To extend the feature to cover those as ++ well, pass "pax_sanitize_slab=full" as kernel command line parameter. ++ ++ To reduce the performance penalty by sanitizing pages only, albeit ++ limiting the effectiveness of this feature at the same time, slab ++ sanitization can be disabled with the kernel command line parameter ++ "pax_sanitize_slab=off". ++ ++ Note that this feature does not protect data stored in live pages, ++ e.g., process memory swapped to disk may stay there for a long time. ++ ++config PAX_MEMORY_STACKLEAK ++ bool "Sanitize kernel stack" ++ default y if (GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_PRIORITY_SECURITY) ++ depends on X86 ++ help ++ By saying Y here the kernel will erase the kernel stack before it ++ returns from a system call. This in turn reduces the information ++ that a kernel stack leak bug can reveal. ++ ++ Note that such a bug can still leak information that was put on ++ the stack by the current system call (the one eventually triggering ++ the bug) but traces of earlier system calls on the kernel stack ++ cannot leak anymore. ++ ++ The tradeoff is performance impact: on a single CPU system kernel ++ compilation sees a 1% slowdown, other systems and workloads may vary ++ and you are advised to test this feature on your expected workload ++ before deploying it. ++ ++ Note that the full feature requires a gcc with plugin support, ++ i.e., gcc 4.5 or newer. You may need to install the supporting ++ headers explicitly in addition to the normal gcc package. Using ++ older gcc versions means that functions with large enough stack ++ frames may leave uninitialized memory behind that may be exposed ++ to a later syscall leaking the stack. ++ ++config PAX_MEMORY_STRUCTLEAK ++ bool "Forcibly initialize local variables copied to userland" ++ default y if (GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_PRIORITY_SECURITY) ++ help ++ By saying Y here the kernel will zero initialize some local ++ variables that are going to be copied to userland. This in ++ turn prevents unintended information leakage from the kernel ++ stack should later code forget to explicitly set all parts of ++ the copied variable. ++ ++ The tradeoff is less performance impact than PAX_MEMORY_STACKLEAK ++ at a much smaller coverage. ++ ++ Note that the implementation requires a gcc with plugin support, ++ i.e., gcc 4.5 or newer. You may need to install the supporting ++ headers explicitly in addition to the normal gcc package. ++ ++config PAX_MEMORY_UDEREF ++ bool "Prevent invalid userland pointer dereference" ++ default y if GRKERNSEC_CONFIG_AUTO && !(X86_64 && GRKERNSEC_CONFIG_PRIORITY_PERF) && (!X86 || GRKERNSEC_CONFIG_VIRT_NONE || GRKERNSEC_CONFIG_VIRT_EPT) ++ depends on (X86 || (ARM && (CPU_V6 || CPU_V6K || CPU_V7) && !ARM_LPAE)) && !UML_X86 && !XEN ++ select PAX_PER_CPU_PGD if X86_64 ++ help ++ By saying Y here the kernel will be prevented from dereferencing ++ userland pointers in contexts where the kernel expects only kernel ++ pointers. This is both a useful runtime debugging feature and a ++ security measure that prevents exploiting a class of kernel bugs. ++ ++ The tradeoff is that some virtualization solutions may experience ++ a huge slowdown and therefore you should not enable this feature ++ for kernels meant to run in such environments. Whether a given VM ++ solution is affected or not is best determined by simply trying it ++ out, the performance impact will be obvious right on boot as this ++ mechanism engages from very early on. A good rule of thumb is that ++ VMs running on CPUs without hardware virtualization support (i.e., ++ the majority of IA-32 CPUs) will likely experience the slowdown. ++ ++ On X86_64 the kernel will make use of PCID support when available ++ (Intel's Westmere, Sandy Bridge, etc) for better security (default) ++ or performance impact. Pass pax_weakuderef on the kernel command ++ line to choose the latter. ++ ++config PAX_REFCOUNT ++ bool "Prevent various kernel object reference counter overflows" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on GRKERNSEC && ((ARM && (CPU_V6 || CPU_V6K || CPU_V7)) || MIPS || PPC || SPARC64 || X86) ++ help ++ By saying Y here the kernel will detect and prevent overflowing ++ various (but not all) kinds of object reference counters. Such ++ overflows can normally occur due to bugs only and are often, if ++ not always, exploitable. ++ ++ The tradeoff is that data structures protected by an overflowed ++ refcount will never be freed and therefore will leak memory. Note ++ that this leak also happens even without this protection but in ++ that case the overflow can eventually trigger the freeing of the ++ data structure while it is still being used elsewhere, resulting ++ in the exploitable situation that this feature prevents. ++ ++ Since this has a negligible performance impact, you should enable ++ this feature. ++ ++config PAX_CONSTIFY_PLUGIN ++ bool "Automatically constify eligible structures" ++ default y ++ depends on !UML && PAX_KERNEXEC ++ help ++ By saying Y here the compiler will automatically constify a class ++ of types that contain only function pointers. This reduces the ++ kernel's attack surface and also produces a better memory layout. ++ ++ Note that the implementation requires a gcc with plugin support, ++ i.e., gcc 4.5 or newer. You may need to install the supporting ++ headers explicitly in addition to the normal gcc package. ++ ++ Note that if some code really has to modify constified variables ++ then the source code will have to be patched to allow it. Examples ++ can be found in PaX itself (the no_const attribute) and for some ++ out-of-tree modules at http://www.grsecurity.net/~paxguy1/ . ++ ++config PAX_USERCOPY ++ bool "Harden heap object copies between kernel and userland" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on ARM || IA64 || PPC || SPARC || X86 ++ depends on GRKERNSEC && (SLAB || SLUB || SLOB) ++ select PAX_USERCOPY_SLABS ++ help ++ By saying Y here the kernel will enforce the size of heap objects ++ when they are copied in either direction between the kernel and ++ userland, even if only a part of the heap object is copied. ++ ++ Specifically, this checking prevents information leaking from the ++ kernel heap during kernel to userland copies (if the kernel heap ++ object is otherwise fully initialized) and prevents kernel heap ++ overflows during userland to kernel copies. ++ ++ Note that the current implementation provides the strictest bounds ++ checks for the SLUB allocator. ++ ++ Enabling this option also enables per-slab cache protection against ++ data in a given cache being copied into/out of via userland ++ accessors. Though the whitelist of regions will be reduced over ++ time, it notably protects important data structures like task structs. ++ ++ If frame pointers are enabled on x86, this option will also restrict ++ copies into and out of the kernel stack to local variables within a ++ single frame. ++ ++ Since this has a negligible performance impact, you should enable ++ this feature. ++ ++config PAX_USERCOPY_DEBUG ++ bool ++ depends on X86 && PAX_USERCOPY ++ default n ++ ++config PAX_SIZE_OVERFLOW ++ bool "Prevent various integer overflows in function size parameters" ++ default y if GRKERNSEC_CONFIG_AUTO ++ depends on X86 ++ help ++ By saying Y here the kernel recomputes expressions of function ++ arguments marked by a size_overflow attribute with double integer ++ precision (DImode/TImode for 32/64 bit integer types). ++ ++ The recomputed argument is checked against TYPE_MAX and an event ++ is logged on overflow and the triggering process is killed. ++ ++ Homepage: http://www.grsecurity.net/~ephox/overflow_plugin/ ++ ++ Note that the implementation requires a gcc with plugin support, ++ i.e., gcc 4.5 or newer. You may need to install the supporting ++ headers explicitly in addition to the normal gcc package. ++ ++config PAX_LATENT_ENTROPY ++ bool "Generate some entropy during boot and runtime" ++ default y if GRKERNSEC_CONFIG_AUTO ++ help ++ By saying Y here the kernel will instrument some kernel code to ++ extract some entropy from both original and artificially created ++ program state. This will help especially embedded systems where ++ there is little 'natural' source of entropy normally. The cost ++ is some slowdown of the boot process and fork and irq processing. ++ ++ When pax_extra_latent_entropy is passed on the kernel command line, ++ entropy will be extracted from up to the first 4GB of RAM while the ++ runtime memory allocator is being initialized. This costs even more ++ slowdown of the boot process. ++ ++ Note that the implementation requires a gcc with plugin support, ++ i.e., gcc 4.5 or newer. You may need to install the supporting ++ headers explicitly in addition to the normal gcc package. ++ ++ Note that entropy extracted this way is not cryptographically ++ secure! ++ ++endmenu ++ ++endmenu ++ ++source grsecurity/Kconfig ++ ++endmenu ++ ++endmenu ++ + source security/keys/Kconfig + + config SECURITY_DMESG_RESTRICT +@@ -103,7 +1071,7 @@ config INTEL_TXT + config LSM_MMAP_MIN_ADDR + int "Low address space for LSM to protect from user allocation" + depends on SECURITY && SECURITY_SELINUX +- default 32768 if ARM || (ARM64 && COMPAT) ++ default 32768 if ALPHA || ARM || (ARM64 && COMPAT) || PARISC || SPARC32 + default 65536 + help + This is the portion of low virtual memory which should be protected +diff --git a/security/apparmor/file.c b/security/apparmor/file.c +index fdaa50c..2761dcb 100644 +--- a/security/apparmor/file.c ++++ b/security/apparmor/file.c +@@ -348,8 +348,8 @@ static inline bool xindex_is_subset(u32 link, u32 target) + int aa_path_link(struct aa_profile *profile, struct dentry *old_dentry, + struct path *new_dir, struct dentry *new_dentry) + { +- struct path link = { new_dir->mnt, new_dentry }; +- struct path target = { new_dir->mnt, old_dentry }; ++ struct path link = { .mnt = new_dir->mnt, .dentry = new_dentry }; ++ struct path target = { .mnt = new_dir->mnt, .dentry = old_dentry }; + struct path_cond cond = { + old_dentry->d_inode->i_uid, + old_dentry->d_inode->i_mode +diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c +index 65ca451..ad6f22d 100644 +--- a/security/apparmor/lsm.c ++++ b/security/apparmor/lsm.c +@@ -186,7 +186,7 @@ static int common_perm_dir_dentry(int op, struct path *dir, + struct dentry *dentry, u32 mask, + struct path_cond *cond) + { +- struct path path = { dir->mnt, dentry }; ++ struct path path = { .mnt = dir->mnt, .dentry = dentry }; + + return common_perm(op, &path, mask, cond); + } +@@ -203,7 +203,7 @@ static int common_perm_dir_dentry(int op, struct path *dir, + static int common_perm_mnt_dentry(int op, struct vfsmount *mnt, + struct dentry *dentry, u32 mask) + { +- struct path path = { mnt, dentry }; ++ struct path path = { .mnt = mnt, .dentry = dentry }; + struct path_cond cond = { dentry->d_inode->i_uid, + dentry->d_inode->i_mode + }; +@@ -325,8 +325,8 @@ static int apparmor_path_rename(struct path *old_dir, struct dentry *old_dentry, + + profile = aa_current_profile(); + if (!unconfined(profile)) { +- struct path old_path = { old_dir->mnt, old_dentry }; +- struct path new_path = { new_dir->mnt, new_dentry }; ++ struct path old_path = { .mnt = old_dir->mnt, .dentry = old_dentry }; ++ struct path new_path = { .mnt = new_dir->mnt, .dentry = new_dentry }; + struct path_cond cond = { old_dentry->d_inode->i_uid, + old_dentry->d_inode->i_mode + }; +@@ -615,7 +615,7 @@ static int apparmor_task_setrlimit(struct task_struct *task, + return error; + } + +-static struct security_operations apparmor_ops = { ++static struct security_operations apparmor_ops __read_only = { + .name = "apparmor", + + .ptrace_access_check = apparmor_ptrace_access_check, +diff --git a/security/commoncap.c b/security/commoncap.c +index bab0611..f9a0ff5 100644 +--- a/security/commoncap.c ++++ b/security/commoncap.c +@@ -427,6 +427,32 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data + return 0; + } + ++/* returns: ++ 1 for suid privilege ++ 2 for sgid privilege ++ 3 for fscap privilege ++*/ ++int is_privileged_binary(const struct dentry *dentry) ++{ ++ struct cpu_vfs_cap_data capdata; ++ struct inode *inode = dentry->d_inode; ++ ++ if (!inode || S_ISDIR(inode->i_mode)) ++ return 0; ++ ++ if (inode->i_mode & S_ISUID) ++ return 1; ++ if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) ++ return 2; ++ ++ if (!get_vfs_caps_from_disk(dentry, &capdata)) { ++ if (!cap_isclear(capdata.inheritable) || !cap_isclear(capdata.permitted)) ++ return 3; ++ } ++ ++ return 0; ++} ++ + /* + * Attempt to get the on-exec apply capability sets for an executable file from + * its xattrs and, if present, apply them to the proposed credentials being +@@ -595,6 +621,9 @@ int cap_bprm_secureexec(struct linux_binprm *bprm) + const struct cred *cred = current_cred(); + kuid_t root_uid = make_kuid(cred->user_ns, 0); + ++ if (gr_acl_enable_at_secure()) ++ return 1; ++ + if (!uid_eq(cred->uid, root_uid)) { + if (bprm->cap_effective) + return 1; +diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h +index 8ee997d..24c174b 100644 +--- a/security/integrity/ima/ima.h ++++ b/security/integrity/ima/ima.h +@@ -116,8 +116,8 @@ int ima_init_template(void); + extern spinlock_t ima_queue_lock; + + struct ima_h_table { +- atomic_long_t len; /* number of stored measurements in the list */ +- atomic_long_t violations; ++ atomic_long_unchecked_t len; /* number of stored measurements in the list */ ++ atomic_long_unchecked_t violations; + struct hlist_head queue[IMA_MEASURE_HTABLE_SIZE]; + }; + extern struct ima_h_table ima_htable; +diff --git a/security/integrity/ima/ima_api.c b/security/integrity/ima/ima_api.c +index 8688597..9fa80d2 100644 +--- a/security/integrity/ima/ima_api.c ++++ b/security/integrity/ima/ima_api.c +@@ -137,7 +137,7 @@ void ima_add_violation(struct file *file, const unsigned char *filename, + int result; + + /* can overflow, only indicator */ +- atomic_long_inc(&ima_htable.violations); ++ atomic_long_inc_unchecked(&ima_htable.violations); + + result = ima_alloc_init_template(NULL, file, filename, + NULL, 0, &entry); +diff --git a/security/integrity/ima/ima_fs.c b/security/integrity/ima/ima_fs.c +index da92fcc..8a5d390 100644 +--- a/security/integrity/ima/ima_fs.c ++++ b/security/integrity/ima/ima_fs.c +@@ -28,12 +28,12 @@ + static int valid_policy = 1; + #define TMPBUFLEN 12 + static ssize_t ima_show_htable_value(char __user *buf, size_t count, +- loff_t *ppos, atomic_long_t *val) ++ loff_t *ppos, atomic_long_unchecked_t *val) + { + char tmpbuf[TMPBUFLEN]; + ssize_t len; + +- len = scnprintf(tmpbuf, TMPBUFLEN, "%li\n", atomic_long_read(val)); ++ len = scnprintf(tmpbuf, TMPBUFLEN, "%li\n", atomic_long_read_unchecked(val)); + return simple_read_from_buffer(buf, count, ppos, tmpbuf, len); + } + +diff --git a/security/integrity/ima/ima_queue.c b/security/integrity/ima/ima_queue.c +index 552705d..9920f4fb 100644 +--- a/security/integrity/ima/ima_queue.c ++++ b/security/integrity/ima/ima_queue.c +@@ -83,7 +83,7 @@ static int ima_add_digest_entry(struct ima_template_entry *entry) + INIT_LIST_HEAD(&qe->later); + list_add_tail_rcu(&qe->later, &ima_measurements); + +- atomic_long_inc(&ima_htable.len); ++ atomic_long_inc_unchecked(&ima_htable.len); + key = ima_hash_key(entry->digest); + hlist_add_head_rcu(&qe->hnext, &ima_htable.queue[key]); + return 0; +diff --git a/security/keys/compat.c b/security/keys/compat.c +index 3478965..ec7bb9e 100644 +--- a/security/keys/compat.c ++++ b/security/keys/compat.c +@@ -44,7 +44,7 @@ static long compat_keyctl_instantiate_key_iov( + if (ret == 0) + goto no_payload_free; + +- ret = keyctl_instantiate_key_common(id, iov, ioc, ret, ringid); ++ ret = keyctl_instantiate_key_common(id, (const struct iovec __force_user *)iov, ioc, ret, ringid); + err: + if (iov != iovstack) + kfree(iov); +diff --git a/security/keys/internal.h b/security/keys/internal.h +index 200e378..cdc74b5 100644 +--- a/security/keys/internal.h ++++ b/security/keys/internal.h +@@ -244,7 +244,7 @@ extern long keyctl_instantiate_key_iov(key_serial_t, + extern long keyctl_invalidate_key(key_serial_t); + + extern long keyctl_instantiate_key_common(key_serial_t, +- const struct iovec *, ++ const struct iovec __user *, + unsigned, size_t, key_serial_t); + #ifdef CONFIG_PERSISTENT_KEYRINGS + extern long keyctl_get_persistent(uid_t, key_serial_t); +diff --git a/security/keys/key.c b/security/keys/key.c +index e17ba6a..2cc04a6 100644 +--- a/security/keys/key.c ++++ b/security/keys/key.c +@@ -285,7 +285,7 @@ struct key *key_alloc(struct key_type *type, const char *desc, + + atomic_set(&key->usage, 1); + init_rwsem(&key->sem); +- lockdep_set_class(&key->sem, &type->lock_class); ++ lockdep_set_class(&key->sem, (struct lock_class_key *)&type->lock_class); + key->index_key.type = type; + key->user = user; + key->quotalen = quotalen; +@@ -1075,7 +1075,9 @@ int register_key_type(struct key_type *ktype) + struct key_type *p; + int ret; + +- memset(&ktype->lock_class, 0, sizeof(ktype->lock_class)); ++ pax_open_kernel(); ++ memset((void *)&ktype->lock_class, 0, sizeof(ktype->lock_class)); ++ pax_close_kernel(); + + ret = -EEXIST; + down_write(&key_types_sem); +@@ -1087,7 +1089,7 @@ int register_key_type(struct key_type *ktype) + } + + /* store the type */ +- list_add(&ktype->link, &key_types_list); ++ pax_list_add((struct list_head *)&ktype->link, &key_types_list); + + pr_notice("Key type %s registered\n", ktype->name); + ret = 0; +@@ -1109,7 +1111,7 @@ EXPORT_SYMBOL(register_key_type); + void unregister_key_type(struct key_type *ktype) + { + down_write(&key_types_sem); +- list_del_init(&ktype->link); ++ pax_list_del_init((struct list_head *)&ktype->link); + downgrade_write(&key_types_sem); + key_gc_keytype(ktype); + pr_notice("Key type %s unregistered\n", ktype->name); +@@ -1127,10 +1129,10 @@ void __init key_init(void) + 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL); + + /* add the special key types */ +- list_add_tail(&key_type_keyring.link, &key_types_list); +- list_add_tail(&key_type_dead.link, &key_types_list); +- list_add_tail(&key_type_user.link, &key_types_list); +- list_add_tail(&key_type_logon.link, &key_types_list); ++ pax_list_add_tail((struct list_head *)&key_type_keyring.link, &key_types_list); ++ pax_list_add_tail((struct list_head *)&key_type_dead.link, &key_types_list); ++ pax_list_add_tail((struct list_head *)&key_type_user.link, &key_types_list); ++ pax_list_add_tail((struct list_head *)&key_type_logon.link, &key_types_list); + + /* record the root user tracking */ + rb_link_node(&root_key_user.node, +diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c +index 4743d71..170a185 100644 +--- a/security/keys/keyctl.c ++++ b/security/keys/keyctl.c +@@ -1000,7 +1000,7 @@ static int keyctl_change_reqkey_auth(struct key *key) + /* + * Copy the iovec data from userspace + */ +-static long copy_from_user_iovec(void *buffer, const struct iovec *iov, ++static long copy_from_user_iovec(void *buffer, const struct iovec __user *iov, + unsigned ioc) + { + for (; ioc > 0; ioc--) { +@@ -1022,7 +1022,7 @@ static long copy_from_user_iovec(void *buffer, const struct iovec *iov, + * If successful, 0 will be returned. + */ + long keyctl_instantiate_key_common(key_serial_t id, +- const struct iovec *payload_iov, ++ const struct iovec __user *payload_iov, + unsigned ioc, + size_t plen, + key_serial_t ringid) +@@ -1117,7 +1117,7 @@ long keyctl_instantiate_key(key_serial_t id, + [0].iov_len = plen + }; + +- return keyctl_instantiate_key_common(id, iov, 1, plen, ringid); ++ return keyctl_instantiate_key_common(id, (const struct iovec __force_user *)iov, 1, plen, ringid); + } + + return keyctl_instantiate_key_common(id, NULL, 0, 0, ringid); +@@ -1150,7 +1150,7 @@ long keyctl_instantiate_key_iov(key_serial_t id, + if (ret == 0) + goto no_payload_free; + +- ret = keyctl_instantiate_key_common(id, iov, ioc, ret, ringid); ++ ret = keyctl_instantiate_key_common(id, (const struct iovec __force_user *)iov, ioc, ret, ringid); + err: + if (iov != iovstack) + kfree(iov); +diff --git a/security/keys/request_key.c b/security/keys/request_key.c +index 0c7aea4..486ef6f 100644 +--- a/security/keys/request_key.c ++++ b/security/keys/request_key.c +@@ -414,6 +414,7 @@ link_check_failed: + + link_prealloc_failed: + mutex_unlock(&user->cons_lock); ++ key_put(key); + kleave(" = %d [prelink]", ret); + return ret; + +diff --git a/security/min_addr.c b/security/min_addr.c +index f728728..6457a0c 100644 +--- a/security/min_addr.c ++++ b/security/min_addr.c +@@ -14,6 +14,7 @@ unsigned long dac_mmap_min_addr = CONFIG_DEFAULT_MMAP_MIN_ADDR; + */ + static void update_mmap_min_addr(void) + { ++#ifndef SPARC + #ifdef CONFIG_LSM_MMAP_MIN_ADDR + if (dac_mmap_min_addr > CONFIG_LSM_MMAP_MIN_ADDR) + mmap_min_addr = dac_mmap_min_addr; +@@ -22,6 +23,7 @@ static void update_mmap_min_addr(void) + #else + mmap_min_addr = dac_mmap_min_addr; + #endif ++#endif + } + + /* +diff --git a/security/security.c b/security/security.c +index 18b35c6..c9fbc92 100644 +--- a/security/security.c ++++ b/security/security.c +@@ -33,8 +33,8 @@ + static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] = + CONFIG_DEFAULT_SECURITY; + +-static struct security_operations *security_ops; +-static struct security_operations default_security_ops = { ++struct security_operations *security_ops __read_only; ++struct security_operations default_security_ops __read_only = { + .name = "default", + }; + +@@ -73,11 +73,6 @@ int __init security_init(void) + return 0; + } + +-void reset_security_ops(void) +-{ +- security_ops = &default_security_ops; +-} +- + /* Save user chosen LSM */ + static int __init choose_lsm(char *str) + { +diff --git a/security/selinux/avc.c b/security/selinux/avc.c +index a18f1fa..c9b9fc4 100644 +--- a/security/selinux/avc.c ++++ b/security/selinux/avc.c +@@ -59,7 +59,7 @@ struct avc_node { + struct avc_cache { + struct hlist_head slots[AVC_CACHE_SLOTS]; /* head for avc_node->list */ + spinlock_t slots_lock[AVC_CACHE_SLOTS]; /* lock for writes */ +- atomic_t lru_hint; /* LRU hint for reclaim scan */ ++ atomic_unchecked_t lru_hint; /* LRU hint for reclaim scan */ + atomic_t active_nodes; + u32 latest_notif; /* latest revocation notification */ + }; +@@ -167,7 +167,7 @@ void __init avc_init(void) + spin_lock_init(&avc_cache.slots_lock[i]); + } + atomic_set(&avc_cache.active_nodes, 0); +- atomic_set(&avc_cache.lru_hint, 0); ++ atomic_set_unchecked(&avc_cache.lru_hint, 0); + + avc_node_cachep = kmem_cache_create("avc_node", sizeof(struct avc_node), + 0, SLAB_PANIC, NULL); +@@ -242,7 +242,7 @@ static inline int avc_reclaim_node(void) + spinlock_t *lock; + + for (try = 0, ecx = 0; try < AVC_CACHE_SLOTS; try++) { +- hvalue = atomic_inc_return(&avc_cache.lru_hint) & (AVC_CACHE_SLOTS - 1); ++ hvalue = atomic_inc_return_unchecked(&avc_cache.lru_hint) & (AVC_CACHE_SLOTS - 1); + head = &avc_cache.slots[hvalue]; + lock = &avc_cache.slots_lock[hvalue]; + +diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c +index c603b20..8716ec9 100644 +--- a/security/selinux/hooks.c ++++ b/security/selinux/hooks.c +@@ -95,8 +95,6 @@ + #include "audit.h" + #include "avc_ss.h" + +-extern struct security_operations *security_ops; +- + /* SECMARK reference count */ + static atomic_t selinux_secmark_refcount = ATOMIC_INIT(0); + +@@ -5809,7 +5807,7 @@ static int selinux_key_getsecurity(struct key *key, char **_buffer) + + #endif + +-static struct security_operations selinux_ops = { ++static struct security_operations selinux_ops __read_only = { + .name = "selinux", + + .ptrace_access_check = selinux_ptrace_access_check, +@@ -6150,6 +6148,9 @@ static void selinux_nf_ip_exit(void) + #ifdef CONFIG_SECURITY_SELINUX_DISABLE + static int selinux_disabled; + ++extern struct security_operations *security_ops; ++extern struct security_operations default_security_ops; ++ + int selinux_disable(void) + { + if (ss_initialized) { +@@ -6167,7 +6168,9 @@ int selinux_disable(void) + selinux_disabled = 1; + selinux_enabled = 0; + +- reset_security_ops(); ++ pax_open_kernel(); ++ security_ops = &default_security_ops; ++ pax_close_kernel(); + + /* Try to destroy the avc node cache */ + avc_disable(); +diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h +index 1450f85..a91e0bc 100644 +--- a/security/selinux/include/xfrm.h ++++ b/security/selinux/include/xfrm.h +@@ -48,7 +48,7 @@ static inline void selinux_xfrm_notify_policyload(void) + + rtnl_lock(); + for_each_net(net) { +- atomic_inc(&net->xfrm.flow_cache_genid); ++ atomic_inc_unchecked(&net->xfrm.flow_cache_genid); + rt_genid_bump_all(net); + } + rtnl_unlock(); +diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c +index 9d3c64a..76e336e 100644 +--- a/security/smack/smack_lsm.c ++++ b/security/smack/smack_lsm.c +@@ -4081,7 +4081,7 @@ static int smack_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen) + return 0; + } + +-struct security_operations smack_ops = { ++struct security_operations smack_ops __read_only = { + .name = "smack", + + .ptrace_access_check = smack_ptrace_access_check, +diff --git a/security/tomoyo/file.c b/security/tomoyo/file.c +index 4003907..13a2b55 100644 +--- a/security/tomoyo/file.c ++++ b/security/tomoyo/file.c +@@ -692,7 +692,7 @@ int tomoyo_path_number_perm(const u8 type, struct path *path, + { + struct tomoyo_request_info r; + struct tomoyo_obj_info obj = { +- .path1 = *path, ++ .path1 = { .mnt = path->mnt, .dentry = path->dentry }, + }; + int error = -ENOMEM; + struct tomoyo_path_info buf; +@@ -740,7 +740,7 @@ int tomoyo_check_open_permission(struct tomoyo_domain_info *domain, + struct tomoyo_path_info buf; + struct tomoyo_request_info r; + struct tomoyo_obj_info obj = { +- .path1 = *path, ++ .path1 = { .mnt = path->mnt, .dentry = path->dentry }, + }; + int idx; + +@@ -786,7 +786,7 @@ int tomoyo_path_perm(const u8 operation, struct path *path, const char *target) + { + struct tomoyo_request_info r; + struct tomoyo_obj_info obj = { +- .path1 = *path, ++ .path1 = { .mnt = path->mnt, .dentry = path->dentry }, + }; + int error; + struct tomoyo_path_info buf; +@@ -843,7 +843,7 @@ int tomoyo_mkdev_perm(const u8 operation, struct path *path, + { + struct tomoyo_request_info r; + struct tomoyo_obj_info obj = { +- .path1 = *path, ++ .path1 = { .mnt = path->mnt, .dentry = path->dentry }, + }; + int error = -ENOMEM; + struct tomoyo_path_info buf; +@@ -890,8 +890,8 @@ int tomoyo_path2_perm(const u8 operation, struct path *path1, + struct tomoyo_path_info buf2; + struct tomoyo_request_info r; + struct tomoyo_obj_info obj = { +- .path1 = *path1, +- .path2 = *path2, ++ .path1 = { .mnt = path1->mnt, .dentry = path1->dentry }, ++ .path2 = { .mnt = path2->mnt, .dentry = path2->dentry } + }; + int idx; + +diff --git a/security/tomoyo/mount.c b/security/tomoyo/mount.c +index 390c646..f2f8db3 100644 +--- a/security/tomoyo/mount.c ++++ b/security/tomoyo/mount.c +@@ -118,6 +118,10 @@ static int tomoyo_mount_acl(struct tomoyo_request_info *r, + type == tomoyo_mounts[TOMOYO_MOUNT_MOVE]) { + need_dev = -1; /* dev_name is a directory */ + } else { ++ if (!capable(CAP_SYS_ADMIN)) { ++ error = -EPERM; ++ goto out; ++ } + fstype = get_fs_type(type); + if (!fstype) { + error = -ENODEV; +diff --git a/security/tomoyo/tomoyo.c b/security/tomoyo/tomoyo.c +index f0b756e..8aa497b 100644 +--- a/security/tomoyo/tomoyo.c ++++ b/security/tomoyo/tomoyo.c +@@ -146,7 +146,7 @@ static int tomoyo_bprm_check_security(struct linux_binprm *bprm) + */ + static int tomoyo_inode_getattr(struct vfsmount *mnt, struct dentry *dentry) + { +- struct path path = { mnt, dentry }; ++ struct path path = { .mnt = mnt, .dentry = dentry }; + return tomoyo_path_perm(TOMOYO_TYPE_GETATTR, &path, NULL); + } + +@@ -172,7 +172,7 @@ static int tomoyo_path_truncate(struct path *path) + */ + static int tomoyo_path_unlink(struct path *parent, struct dentry *dentry) + { +- struct path path = { parent->mnt, dentry }; ++ struct path path = { .mnt = parent->mnt, .dentry = dentry }; + return tomoyo_path_perm(TOMOYO_TYPE_UNLINK, &path, NULL); + } + +@@ -188,7 +188,7 @@ static int tomoyo_path_unlink(struct path *parent, struct dentry *dentry) + static int tomoyo_path_mkdir(struct path *parent, struct dentry *dentry, + umode_t mode) + { +- struct path path = { parent->mnt, dentry }; ++ struct path path = { .mnt = parent->mnt, .dentry = dentry }; + return tomoyo_path_number_perm(TOMOYO_TYPE_MKDIR, &path, + mode & S_IALLUGO); + } +@@ -203,7 +203,7 @@ static int tomoyo_path_mkdir(struct path *parent, struct dentry *dentry, + */ + static int tomoyo_path_rmdir(struct path *parent, struct dentry *dentry) + { +- struct path path = { parent->mnt, dentry }; ++ struct path path = { .mnt = parent->mnt, .dentry = dentry }; + return tomoyo_path_perm(TOMOYO_TYPE_RMDIR, &path, NULL); + } + +@@ -219,7 +219,7 @@ static int tomoyo_path_rmdir(struct path *parent, struct dentry *dentry) + static int tomoyo_path_symlink(struct path *parent, struct dentry *dentry, + const char *old_name) + { +- struct path path = { parent->mnt, dentry }; ++ struct path path = { .mnt = parent->mnt, .dentry = dentry }; + return tomoyo_path_perm(TOMOYO_TYPE_SYMLINK, &path, old_name); + } + +@@ -236,7 +236,7 @@ static int tomoyo_path_symlink(struct path *parent, struct dentry *dentry, + static int tomoyo_path_mknod(struct path *parent, struct dentry *dentry, + umode_t mode, unsigned int dev) + { +- struct path path = { parent->mnt, dentry }; ++ struct path path = { .mnt = parent->mnt, .dentry = dentry }; + int type = TOMOYO_TYPE_CREATE; + const unsigned int perm = mode & S_IALLUGO; + +@@ -275,8 +275,8 @@ static int tomoyo_path_mknod(struct path *parent, struct dentry *dentry, + static int tomoyo_path_link(struct dentry *old_dentry, struct path *new_dir, + struct dentry *new_dentry) + { +- struct path path1 = { new_dir->mnt, old_dentry }; +- struct path path2 = { new_dir->mnt, new_dentry }; ++ struct path path1 = { .mnt = new_dir->mnt, .dentry = old_dentry }; ++ struct path path2 = { .mnt = new_dir->mnt, .dentry = new_dentry }; + return tomoyo_path2_perm(TOMOYO_TYPE_LINK, &path1, &path2); + } + +@@ -295,8 +295,8 @@ static int tomoyo_path_rename(struct path *old_parent, + struct path *new_parent, + struct dentry *new_dentry) + { +- struct path path1 = { old_parent->mnt, old_dentry }; +- struct path path2 = { new_parent->mnt, new_dentry }; ++ struct path path1 = { .mnt = old_parent->mnt, .dentry = old_dentry }; ++ struct path path2 = { .mnt = new_parent->mnt, .dentry = new_dentry }; + return tomoyo_path2_perm(TOMOYO_TYPE_RENAME, &path1, &path2); + } + +@@ -424,7 +424,7 @@ static int tomoyo_sb_mount(const char *dev_name, struct path *path, + */ + static int tomoyo_sb_umount(struct vfsmount *mnt, int flags) + { +- struct path path = { mnt, mnt->mnt_root }; ++ struct path path = { .mnt = mnt, .dentry = mnt->mnt_root }; + return tomoyo_path_perm(TOMOYO_TYPE_UMOUNT, &path, NULL); + } + +@@ -503,7 +503,7 @@ static int tomoyo_socket_sendmsg(struct socket *sock, struct msghdr *msg, + * tomoyo_security_ops is a "struct security_operations" which is used for + * registering TOMOYO. + */ +-static struct security_operations tomoyo_security_ops = { ++static struct security_operations tomoyo_security_ops __read_only = { + .name = "tomoyo", + .cred_alloc_blank = tomoyo_cred_alloc_blank, + .cred_prepare = tomoyo_cred_prepare, +diff --git a/security/yama/Kconfig b/security/yama/Kconfig +index 20ef514..4182bed 100644 +--- a/security/yama/Kconfig ++++ b/security/yama/Kconfig +@@ -1,6 +1,6 @@ + config SECURITY_YAMA + bool "Yama support" +- depends on SECURITY ++ depends on SECURITY && !GRKERNSEC + select SECURITYFS + select SECURITY_PATH + default n +diff --git a/security/yama/yama_lsm.c b/security/yama/yama_lsm.c +index 13c88fbc..f8c115e 100644 +--- a/security/yama/yama_lsm.c ++++ b/security/yama/yama_lsm.c +@@ -365,7 +365,7 @@ int yama_ptrace_traceme(struct task_struct *parent) + } + + #ifndef CONFIG_SECURITY_YAMA_STACKED +-static struct security_operations yama_ops = { ++static struct security_operations yama_ops __read_only = { + .name = "yama", + + .ptrace_access_check = yama_ptrace_access_check, +@@ -376,28 +376,24 @@ static struct security_operations yama_ops = { + #endif + + #ifdef CONFIG_SYSCTL ++static int zero __read_only; ++static int max_scope __read_only = YAMA_SCOPE_NO_ATTACH; ++ + static int yama_dointvec_minmax(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- int rc; ++ ctl_table_no_const yama_table; + + if (write && !capable(CAP_SYS_PTRACE)) + return -EPERM; + +- rc = proc_dointvec_minmax(table, write, buffer, lenp, ppos); +- if (rc) +- return rc; +- ++ yama_table = *table; + /* Lock the max value if it ever gets set. */ +- if (write && *(int *)table->data == *(int *)table->extra2) +- table->extra1 = table->extra2; +- +- return rc; ++ if (ptrace_scope == max_scope) ++ yama_table.extra1 = &max_scope; ++ return proc_dointvec_minmax(&yama_table, write, buffer, lenp, ppos); + } + +-static int zero; +-static int max_scope = YAMA_SCOPE_NO_ATTACH; +- + struct ctl_path yama_sysctl_path[] = { + { .procname = "kernel", }, + { .procname = "yama", }, +diff --git a/sound/aoa/codecs/onyx.c b/sound/aoa/codecs/onyx.c +index 401107b..b9c47c6 100644 +--- a/sound/aoa/codecs/onyx.c ++++ b/sound/aoa/codecs/onyx.c +@@ -54,7 +54,7 @@ struct onyx { + spdif_locked:1, + analog_locked:1, + original_mute:2; +- int open_count; ++ local_t open_count; + struct codec_info *codec_info; + + /* mutex serializes concurrent access to the device +@@ -753,7 +753,7 @@ static int onyx_open(struct codec_info_item *cii, + struct onyx *onyx = cii->codec_data; + + mutex_lock(&onyx->mutex); +- onyx->open_count++; ++ local_inc(&onyx->open_count); + mutex_unlock(&onyx->mutex); + + return 0; +@@ -765,8 +765,7 @@ static int onyx_close(struct codec_info_item *cii, + struct onyx *onyx = cii->codec_data; + + mutex_lock(&onyx->mutex); +- onyx->open_count--; +- if (!onyx->open_count) ++ if (local_dec_and_test(&onyx->open_count)) + onyx->spdif_locked = onyx->analog_locked = 0; + mutex_unlock(&onyx->mutex); + +diff --git a/sound/aoa/codecs/onyx.h b/sound/aoa/codecs/onyx.h +index ffd2025..df062c9 100644 +--- a/sound/aoa/codecs/onyx.h ++++ b/sound/aoa/codecs/onyx.h +@@ -11,6 +11,7 @@ + #include <linux/i2c.h> + #include <asm/pmac_low_i2c.h> + #include <asm/prom.h> ++#include <asm/local.h> + + /* PCM3052 register definitions */ + +diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c +index ada69d7..5f65386 100644 +--- a/sound/core/oss/pcm_oss.c ++++ b/sound/core/oss/pcm_oss.c +@@ -1190,10 +1190,10 @@ snd_pcm_sframes_t snd_pcm_oss_write3(struct snd_pcm_substream *substream, const + if (in_kernel) { + mm_segment_t fs; + fs = snd_enter_user(); +- ret = snd_pcm_lib_write(substream, (void __force __user *)ptr, frames); ++ ret = snd_pcm_lib_write(substream, (void __force_user *)ptr, frames); + snd_leave_user(fs); + } else { +- ret = snd_pcm_lib_write(substream, (void __force __user *)ptr, frames); ++ ret = snd_pcm_lib_write(substream, (void __force_user *)ptr, frames); + } + if (ret != -EPIPE && ret != -ESTRPIPE) + break; +@@ -1233,10 +1233,10 @@ snd_pcm_sframes_t snd_pcm_oss_read3(struct snd_pcm_substream *substream, char *p + if (in_kernel) { + mm_segment_t fs; + fs = snd_enter_user(); +- ret = snd_pcm_lib_read(substream, (void __force __user *)ptr, frames); ++ ret = snd_pcm_lib_read(substream, (void __force_user *)ptr, frames); + snd_leave_user(fs); + } else { +- ret = snd_pcm_lib_read(substream, (void __force __user *)ptr, frames); ++ ret = snd_pcm_lib_read(substream, (void __force_user *)ptr, frames); + } + if (ret == -EPIPE) { + if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) { +@@ -1332,7 +1332,7 @@ static ssize_t snd_pcm_oss_write2(struct snd_pcm_substream *substream, const cha + struct snd_pcm_plugin_channel *channels; + size_t oss_frame_bytes = (runtime->oss.plugin_first->src_width * runtime->oss.plugin_first->src_format.channels) / 8; + if (!in_kernel) { +- if (copy_from_user(runtime->oss.buffer, (const char __force __user *)buf, bytes)) ++ if (copy_from_user(runtime->oss.buffer, (const char __force_user *)buf, bytes)) + return -EFAULT; + buf = runtime->oss.buffer; + } +@@ -1402,7 +1402,7 @@ static ssize_t snd_pcm_oss_write1(struct snd_pcm_substream *substream, const cha + } + } else { + tmp = snd_pcm_oss_write2(substream, +- (const char __force *)buf, ++ (const char __force_kernel *)buf, + runtime->oss.period_bytes, 0); + if (tmp <= 0) + goto err; +@@ -1428,7 +1428,7 @@ static ssize_t snd_pcm_oss_read2(struct snd_pcm_substream *substream, char *buf, + struct snd_pcm_runtime *runtime = substream->runtime; + snd_pcm_sframes_t frames, frames1; + #ifdef CONFIG_SND_PCM_OSS_PLUGINS +- char __user *final_dst = (char __force __user *)buf; ++ char __user *final_dst = (char __force_user *)buf; + if (runtime->oss.plugin_first) { + struct snd_pcm_plugin_channel *channels; + size_t oss_frame_bytes = (runtime->oss.plugin_last->dst_width * runtime->oss.plugin_last->dst_format.channels) / 8; +@@ -1490,7 +1490,7 @@ static ssize_t snd_pcm_oss_read1(struct snd_pcm_substream *substream, char __use + xfer += tmp; + runtime->oss.buffer_used -= tmp; + } else { +- tmp = snd_pcm_oss_read2(substream, (char __force *)buf, ++ tmp = snd_pcm_oss_read2(substream, (char __force_kernel *)buf, + runtime->oss.period_bytes, 0); + if (tmp <= 0) + goto err; +@@ -1659,7 +1659,7 @@ static int snd_pcm_oss_sync(struct snd_pcm_oss_file *pcm_oss_file) + size1); + size1 /= runtime->channels; /* frames */ + fs = snd_enter_user(); +- snd_pcm_lib_write(substream, (void __force __user *)runtime->oss.buffer, size1); ++ snd_pcm_lib_write(substream, (void __force_user *)runtime->oss.buffer, size1); + snd_leave_user(fs); + } + } else if (runtime->access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) { +diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c +index 2d957ba..fda022c 100644 +--- a/sound/core/pcm_compat.c ++++ b/sound/core/pcm_compat.c +@@ -31,7 +31,7 @@ static int snd_pcm_ioctl_delay_compat(struct snd_pcm_substream *substream, + int err; + + fs = snd_enter_user(); +- err = snd_pcm_delay(substream, &delay); ++ err = snd_pcm_delay(substream, (snd_pcm_sframes_t __force_user *)&delay); + snd_leave_user(fs); + if (err < 0) + return err; +diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c +index 9c823cf..2629aa7 100644 +--- a/sound/core/pcm_native.c ++++ b/sound/core/pcm_native.c +@@ -2933,11 +2933,11 @@ int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream, + switch (substream->stream) { + case SNDRV_PCM_STREAM_PLAYBACK: + result = snd_pcm_playback_ioctl1(NULL, substream, cmd, +- (void __user *)arg); ++ (void __force_user *)arg); + break; + case SNDRV_PCM_STREAM_CAPTURE: + result = snd_pcm_capture_ioctl1(NULL, substream, cmd, +- (void __user *)arg); ++ (void __force_user *)arg); + break; + default: + result = -EINVAL; +diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c +index 16d4267..fe8b49b 100644 +--- a/sound/core/seq/oss/seq_oss.c ++++ b/sound/core/seq/oss/seq_oss.c +@@ -69,8 +69,8 @@ static int __init alsa_seq_oss_init(void) + { + int rc; + static struct snd_seq_dev_ops ops = { +- snd_seq_oss_synth_register, +- snd_seq_oss_synth_unregister, ++ .init_device = snd_seq_oss_synth_register, ++ .free_device = snd_seq_oss_synth_unregister, + }; + + snd_seq_autoload_lock(); +diff --git a/sound/core/seq/seq_device.c b/sound/core/seq/seq_device.c +index 91a786a..4c07ed4 100644 +--- a/sound/core/seq/seq_device.c ++++ b/sound/core/seq/seq_device.c +@@ -64,7 +64,7 @@ struct ops_list { + int argsize; /* argument size */ + + /* operators */ +- struct snd_seq_dev_ops ops; ++ struct snd_seq_dev_ops *ops; + + /* registered devices */ + struct list_head dev_list; /* list of devices */ +@@ -333,7 +333,7 @@ int snd_seq_device_register_driver(char *id, struct snd_seq_dev_ops *entry, + + mutex_lock(&ops->reg_mutex); + /* copy driver operators */ +- ops->ops = *entry; ++ ops->ops = entry; + ops->driver |= DRIVER_LOADED; + ops->argsize = argsize; + +@@ -463,7 +463,7 @@ static int init_device(struct snd_seq_device *dev, struct ops_list *ops) + dev->name, ops->id, ops->argsize, dev->argsize); + return -EINVAL; + } +- if (ops->ops.init_device(dev) >= 0) { ++ if (ops->ops->init_device(dev) >= 0) { + dev->status = SNDRV_SEQ_DEVICE_REGISTERED; + ops->num_init_devices++; + } else { +@@ -490,7 +490,7 @@ static int free_device(struct snd_seq_device *dev, struct ops_list *ops) + dev->name, ops->id, ops->argsize, dev->argsize); + return -EINVAL; + } +- if ((result = ops->ops.free_device(dev)) >= 0 || result == -ENXIO) { ++ if ((result = ops->ops->free_device(dev)) >= 0 || result == -ENXIO) { + dev->status = SNDRV_SEQ_DEVICE_FREE; + dev->driver_data = NULL; + ops->num_init_devices--; +diff --git a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c +index a1fd77a..69cd659 100644 +--- a/sound/core/seq/seq_midi.c ++++ b/sound/core/seq/seq_midi.c +@@ -462,8 +462,8 @@ snd_seq_midisynth_unregister_port(struct snd_seq_device *dev) + static int __init alsa_seq_midi_init(void) + { + static struct snd_seq_dev_ops ops = { +- snd_seq_midisynth_register_port, +- snd_seq_midisynth_unregister_port, ++ .init_device = snd_seq_midisynth_register_port, ++ .free_device = snd_seq_midisynth_unregister_port, + }; + memset(&synths, 0, sizeof(synths)); + snd_seq_autoload_lock(); +diff --git a/sound/core/sound.c b/sound/core/sound.c +index 38ad1a0..5010a40 100644 +--- a/sound/core/sound.c ++++ b/sound/core/sound.c +@@ -86,7 +86,7 @@ static void snd_request_other(int minor) + case SNDRV_MINOR_TIMER: str = "snd-timer"; break; + default: return; + } +- request_module(str); ++ request_module("%s", str); + } + + #endif /* modular kernel */ +diff --git a/sound/drivers/mts64.c b/sound/drivers/mts64.c +index f5fd448..6ae276da 100644 +--- a/sound/drivers/mts64.c ++++ b/sound/drivers/mts64.c +@@ -29,6 +29,7 @@ + #include <sound/initval.h> + #include <sound/rawmidi.h> + #include <sound/control.h> ++#include <asm/local.h> + + #define CARD_NAME "Miditerminal 4140" + #define DRIVER_NAME "MTS64" +@@ -67,7 +68,7 @@ struct mts64 { + struct pardevice *pardev; + int pardev_claimed; + +- int open_count; ++ local_t open_count; + int current_midi_output_port; + int current_midi_input_port; + u8 mode[MTS64_NUM_INPUT_PORTS]; +@@ -697,7 +698,7 @@ static int snd_mts64_rawmidi_open(struct snd_rawmidi_substream *substream) + { + struct mts64 *mts = substream->rmidi->private_data; + +- if (mts->open_count == 0) { ++ if (local_read(&mts->open_count) == 0) { + /* We don't need a spinlock here, because this is just called + if the device has not been opened before. + So there aren't any IRQs from the device */ +@@ -705,7 +706,7 @@ static int snd_mts64_rawmidi_open(struct snd_rawmidi_substream *substream) + + msleep(50); + } +- ++(mts->open_count); ++ local_inc(&mts->open_count); + + return 0; + } +@@ -715,8 +716,7 @@ static int snd_mts64_rawmidi_close(struct snd_rawmidi_substream *substream) + struct mts64 *mts = substream->rmidi->private_data; + unsigned long flags; + +- --(mts->open_count); +- if (mts->open_count == 0) { ++ if (local_dec_return(&mts->open_count) == 0) { + /* We need the spinlock_irqsave here because we can still + have IRQs at this point */ + spin_lock_irqsave(&mts->lock, flags); +@@ -725,8 +725,8 @@ static int snd_mts64_rawmidi_close(struct snd_rawmidi_substream *substream) + + msleep(500); + +- } else if (mts->open_count < 0) +- mts->open_count = 0; ++ } else if (local_read(&mts->open_count) < 0) ++ local_set(&mts->open_count, 0); + + return 0; + } +diff --git a/sound/drivers/opl3/opl3_seq.c b/sound/drivers/opl3/opl3_seq.c +index 6839953..7a0f4b9 100644 +--- a/sound/drivers/opl3/opl3_seq.c ++++ b/sound/drivers/opl3/opl3_seq.c +@@ -281,8 +281,8 @@ static int __init alsa_opl3_seq_init(void) + { + static struct snd_seq_dev_ops ops = + { +- snd_opl3_seq_new_device, +- snd_opl3_seq_delete_device ++ .init_device = snd_opl3_seq_new_device, ++ .free_device = snd_opl3_seq_delete_device + }; + + return snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_OPL3, &ops, +diff --git a/sound/drivers/opl4/opl4_lib.c b/sound/drivers/opl4/opl4_lib.c +index b953fb4..1999c01 100644 +--- a/sound/drivers/opl4/opl4_lib.c ++++ b/sound/drivers/opl4/opl4_lib.c +@@ -29,7 +29,7 @@ MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); + MODULE_DESCRIPTION("OPL4 driver"); + MODULE_LICENSE("GPL"); + +-static void inline snd_opl4_wait(struct snd_opl4 *opl4) ++static inline void snd_opl4_wait(struct snd_opl4 *opl4) + { + int timeout = 10; + while ((inb(opl4->fm_port) & OPL4_STATUS_BUSY) && --timeout > 0) +diff --git a/sound/drivers/opl4/opl4_seq.c b/sound/drivers/opl4/opl4_seq.c +index 9919769..d7de36c 100644 +--- a/sound/drivers/opl4/opl4_seq.c ++++ b/sound/drivers/opl4/opl4_seq.c +@@ -198,8 +198,8 @@ static int snd_opl4_seq_delete_device(struct snd_seq_device *dev) + static int __init alsa_opl4_synth_init(void) + { + static struct snd_seq_dev_ops ops = { +- snd_opl4_seq_new_device, +- snd_opl4_seq_delete_device ++ .init_device = snd_opl4_seq_new_device, ++ .free_device = snd_opl4_seq_delete_device + }; + + return snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_OPL4, &ops, +diff --git a/sound/drivers/portman2x4.c b/sound/drivers/portman2x4.c +index 78ccfa4..7a0857b 100644 +--- a/sound/drivers/portman2x4.c ++++ b/sound/drivers/portman2x4.c +@@ -48,6 +48,7 @@ + #include <sound/initval.h> + #include <sound/rawmidi.h> + #include <sound/control.h> ++#include <asm/local.h> + + #define CARD_NAME "Portman 2x4" + #define DRIVER_NAME "portman" +@@ -85,7 +86,7 @@ struct portman { + struct pardevice *pardev; + int pardev_claimed; + +- int open_count; ++ local_t open_count; + int mode[PORTMAN_NUM_INPUT_PORTS]; + struct snd_rawmidi_substream *midi_input[PORTMAN_NUM_INPUT_PORTS]; + }; +diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c +index 95fc2eaf..ea5d6a7 100644 +--- a/sound/firewire/amdtp.c ++++ b/sound/firewire/amdtp.c +@@ -521,7 +521,7 @@ static void update_pcm_pointers(struct amdtp_stream *s, + ptr = s->pcm_buffer_pointer + frames; + if (ptr >= pcm->runtime->buffer_size) + ptr -= pcm->runtime->buffer_size; +- ACCESS_ONCE(s->pcm_buffer_pointer) = ptr; ++ ACCESS_ONCE_RW(s->pcm_buffer_pointer) = ptr; + + s->pcm_period_pointer += frames; + if (s->pcm_period_pointer >= pcm->runtime->period_size) { +@@ -961,7 +961,7 @@ EXPORT_SYMBOL(amdtp_stream_pcm_pointer); + */ + void amdtp_stream_update(struct amdtp_stream *s) + { +- ACCESS_ONCE(s->source_node_id_field) = ++ ACCESS_ONCE_RW(s->source_node_id_field) = + (fw_parent_device(s->unit)->card->node_id & 0x3f) << 24; + } + EXPORT_SYMBOL(amdtp_stream_update); +diff --git a/sound/firewire/amdtp.h b/sound/firewire/amdtp.h +index 4823c08..47a5f7c 100644 +--- a/sound/firewire/amdtp.h ++++ b/sound/firewire/amdtp.h +@@ -212,7 +212,7 @@ static inline bool amdtp_stream_pcm_running(struct amdtp_stream *s) + static inline void amdtp_stream_pcm_trigger(struct amdtp_stream *s, + struct snd_pcm_substream *pcm) + { +- ACCESS_ONCE(s->pcm) = pcm; ++ ACCESS_ONCE_RW(s->pcm) = pcm; + } + + /** +@@ -230,7 +230,7 @@ static inline void amdtp_stream_midi_trigger(struct amdtp_stream *s, + struct snd_rawmidi_substream *midi) + { + if (port < s->midi_ports) +- ACCESS_ONCE(s->midi[port]) = midi; ++ ACCESS_ONCE_RW(s->midi[port]) = midi; + } + + static inline bool cip_sfc_is_base_44100(enum cip_sfc sfc) +diff --git a/sound/firewire/isight.c b/sound/firewire/isight.c +index 7ac9443..0ec6274 100644 +--- a/sound/firewire/isight.c ++++ b/sound/firewire/isight.c +@@ -96,7 +96,7 @@ static void isight_update_pointers(struct isight *isight, unsigned int count) + ptr += count; + if (ptr >= runtime->buffer_size) + ptr -= runtime->buffer_size; +- ACCESS_ONCE(isight->buffer_pointer) = ptr; ++ ACCESS_ONCE_RW(isight->buffer_pointer) = ptr; + + isight->period_counter += count; + if (isight->period_counter >= runtime->period_size) { +@@ -299,7 +299,7 @@ static int isight_hw_params(struct snd_pcm_substream *substream, + if (err < 0) + return err; + +- ACCESS_ONCE(isight->pcm_active) = true; ++ ACCESS_ONCE_RW(isight->pcm_active) = true; + + return 0; + } +@@ -337,7 +337,7 @@ static int isight_hw_free(struct snd_pcm_substream *substream) + { + struct isight *isight = substream->private_data; + +- ACCESS_ONCE(isight->pcm_active) = false; ++ ACCESS_ONCE_RW(isight->pcm_active) = false; + + mutex_lock(&isight->mutex); + isight_stop_streaming(isight); +@@ -430,10 +430,10 @@ static int isight_trigger(struct snd_pcm_substream *substream, int cmd) + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: +- ACCESS_ONCE(isight->pcm_running) = true; ++ ACCESS_ONCE_RW(isight->pcm_running) = true; + break; + case SNDRV_PCM_TRIGGER_STOP: +- ACCESS_ONCE(isight->pcm_running) = false; ++ ACCESS_ONCE_RW(isight->pcm_running) = false; + break; + default: + return -EINVAL; +diff --git a/sound/firewire/scs1x.c b/sound/firewire/scs1x.c +index 2dba848..c682aef 100644 +--- a/sound/firewire/scs1x.c ++++ b/sound/firewire/scs1x.c +@@ -74,7 +74,7 @@ static void scs_output_trigger(struct snd_rawmidi_substream *stream, int up) + { + struct scs *scs = stream->rmidi->private_data; + +- ACCESS_ONCE(scs->output) = up ? stream : NULL; ++ ACCESS_ONCE_RW(scs->output) = up ? stream : NULL; + if (up) { + scs->output_idle = false; + tasklet_schedule(&scs->tasklet); +@@ -257,7 +257,7 @@ static void scs_input_trigger(struct snd_rawmidi_substream *stream, int up) + { + struct scs *scs = stream->rmidi->private_data; + +- ACCESS_ONCE(scs->input) = up ? stream : NULL; ++ ACCESS_ONCE_RW(scs->input) = up ? stream : NULL; + } + + static void scs_input_escaped_byte(struct snd_rawmidi_substream *stream, +@@ -473,8 +473,8 @@ static void scs_remove(struct fw_unit *unit) + + snd_card_disconnect(scs->card); + +- ACCESS_ONCE(scs->output) = NULL; +- ACCESS_ONCE(scs->input) = NULL; ++ ACCESS_ONCE_RW(scs->output) = NULL; ++ ACCESS_ONCE_RW(scs->input) = NULL; + + wait_event(scs->idle_wait, scs->output_idle); + +diff --git a/sound/isa/sb/emu8000_synth.c b/sound/isa/sb/emu8000_synth.c +index 4e3fcfb..ab45a9d 100644 +--- a/sound/isa/sb/emu8000_synth.c ++++ b/sound/isa/sb/emu8000_synth.c +@@ -120,8 +120,8 @@ static int __init alsa_emu8000_init(void) + { + + static struct snd_seq_dev_ops ops = { +- snd_emu8000_new_device, +- snd_emu8000_delete_device, ++ .init_device = snd_emu8000_new_device, ++ .free_device = snd_emu8000_delete_device, + }; + return snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_EMU8000, &ops, + sizeof(struct snd_emu8000*)); +diff --git a/sound/oss/sb_audio.c b/sound/oss/sb_audio.c +index 048439a..3be9f6f 100644 +--- a/sound/oss/sb_audio.c ++++ b/sound/oss/sb_audio.c +@@ -904,7 +904,7 @@ sb16_copy_from_user(int dev, + buf16 = (signed short *)(localbuf + localoffs); + while (c) + { +- locallen = (c >= LBUFCOPYSIZE ? LBUFCOPYSIZE : c); ++ locallen = ((unsigned)c >= LBUFCOPYSIZE ? LBUFCOPYSIZE : c); + if (copy_from_user(lbuf8, + userbuf+useroffs + p, + locallen)) +diff --git a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c +index a33e8ce..2262303 100644 +--- a/sound/oss/swarm_cs4297a.c ++++ b/sound/oss/swarm_cs4297a.c +@@ -2623,7 +2623,6 @@ static int __init cs4297a_init(void) + { + struct cs4297a_state *s; + u32 pwr, id; +- mm_segment_t fs; + int rval; + u64 cfg; + int mdio_val; +@@ -2709,22 +2708,23 @@ static int __init cs4297a_init(void) + if (!rval) { + char *sb1250_duart_present; + ++#if 0 ++ mm_segment_t fs; + fs = get_fs(); + set_fs(KERNEL_DS); +-#if 0 + val = SOUND_MASK_LINE; + mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long) &val); + for (i = 0; i < ARRAY_SIZE(initvol); i++) { + val = initvol[i].vol; + mixer_ioctl(s, initvol[i].mixch, (unsigned long) &val); + } ++ set_fs(fs); + // cs4297a_write_ac97(s, 0x18, 0x0808); + #else + // cs4297a_write_ac97(s, 0x5e, 0x180); + cs4297a_write_ac97(s, 0x02, 0x0808); + cs4297a_write_ac97(s, 0x18, 0x0808); + #endif +- set_fs(fs); + + list_add(&s->list, &cs4297a_devs); + +diff --git a/sound/pci/emu10k1/emu10k1_synth.c b/sound/pci/emu10k1/emu10k1_synth.c +index 4c41c90..37f3631 100644 +--- a/sound/pci/emu10k1/emu10k1_synth.c ++++ b/sound/pci/emu10k1/emu10k1_synth.c +@@ -108,8 +108,8 @@ static int __init alsa_emu10k1_synth_init(void) + { + + static struct snd_seq_dev_ops ops = { +- snd_emu10k1_synth_new_device, +- snd_emu10k1_synth_delete_device, ++ .init_device = snd_emu10k1_synth_new_device, ++ .free_device = snd_emu10k1_synth_delete_device, + }; + return snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH, &ops, + sizeof(struct snd_emu10k1_synth_arg)); +diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c +index e708368..764dffe 100644 +--- a/sound/pci/hda/hda_codec.c ++++ b/sound/pci/hda/hda_codec.c +@@ -968,14 +968,10 @@ find_codec_preset(struct hda_codec *codec) + mutex_unlock(&preset_mutex); + + if (mod_requested < HDA_MODREQ_MAX_COUNT) { +- char name[32]; + if (!mod_requested) +- snprintf(name, sizeof(name), "snd-hda-codec-id:%08x", +- codec->vendor_id); ++ request_module("snd-hda-codec-id:%08x", codec->vendor_id); + else +- snprintf(name, sizeof(name), "snd-hda-codec-id:%04x*", +- (codec->vendor_id >> 16) & 0xffff); +- request_module(name); ++ request_module("snd-hda-codec-id:%04x*", (codec->vendor_id >> 16) & 0xffff); + mod_requested++; + goto again; + } +@@ -2802,7 +2798,7 @@ static int get_kctl_0dB_offset(struct hda_codec *codec, + /* FIXME: set_fs() hack for obtaining user-space TLV data */ + mm_segment_t fs = get_fs(); + set_fs(get_ds()); +- if (!kctl->tlv.c(kctl, 0, sizeof(_tlv), _tlv)) ++ if (!kctl->tlv.c(kctl, 0, sizeof(_tlv), (unsigned int __force_user *)_tlv)) + tlv = _tlv; + set_fs(fs); + } else if (kctl->vd[0].access & SNDRV_CTL_ELEM_ACCESS_TLV_READ) +diff --git a/sound/pci/ymfpci/ymfpci.h b/sound/pci/ymfpci/ymfpci.h +index 4631a23..001ae57 100644 +--- a/sound/pci/ymfpci/ymfpci.h ++++ b/sound/pci/ymfpci/ymfpci.h +@@ -358,7 +358,7 @@ struct snd_ymfpci { + spinlock_t reg_lock; + spinlock_t voice_lock; + wait_queue_head_t interrupt_sleep; +- atomic_t interrupt_sleep_count; ++ atomic_unchecked_t interrupt_sleep_count; + struct snd_info_entry *proc_entry; + const struct firmware *dsp_microcode; + const struct firmware *controller_microcode; +diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c +index 81c916a..516f0bf 100644 +--- a/sound/pci/ymfpci/ymfpci_main.c ++++ b/sound/pci/ymfpci/ymfpci_main.c +@@ -204,8 +204,8 @@ static void snd_ymfpci_hw_stop(struct snd_ymfpci *chip) + if ((snd_ymfpci_readl(chip, YDSXGR_STATUS) & 2) == 0) + break; + } +- if (atomic_read(&chip->interrupt_sleep_count)) { +- atomic_set(&chip->interrupt_sleep_count, 0); ++ if (atomic_read_unchecked(&chip->interrupt_sleep_count)) { ++ atomic_set_unchecked(&chip->interrupt_sleep_count, 0); + wake_up(&chip->interrupt_sleep); + } + __end: +@@ -789,7 +789,7 @@ static void snd_ymfpci_irq_wait(struct snd_ymfpci *chip) + continue; + init_waitqueue_entry(&wait, current); + add_wait_queue(&chip->interrupt_sleep, &wait); +- atomic_inc(&chip->interrupt_sleep_count); ++ atomic_inc_unchecked(&chip->interrupt_sleep_count); + schedule_timeout_uninterruptible(msecs_to_jiffies(50)); + remove_wait_queue(&chip->interrupt_sleep, &wait); + } +@@ -827,8 +827,8 @@ static irqreturn_t snd_ymfpci_interrupt(int irq, void *dev_id) + snd_ymfpci_writel(chip, YDSXGR_MODE, mode); + spin_unlock(&chip->reg_lock); + +- if (atomic_read(&chip->interrupt_sleep_count)) { +- atomic_set(&chip->interrupt_sleep_count, 0); ++ if (atomic_read_unchecked(&chip->interrupt_sleep_count)) { ++ atomic_set_unchecked(&chip->interrupt_sleep_count, 0); + wake_up(&chip->interrupt_sleep); + } + } +@@ -2423,7 +2423,7 @@ int snd_ymfpci_create(struct snd_card *card, + spin_lock_init(&chip->reg_lock); + spin_lock_init(&chip->voice_lock); + init_waitqueue_head(&chip->interrupt_sleep); +- atomic_set(&chip->interrupt_sleep_count, 0); ++ atomic_set_unchecked(&chip->interrupt_sleep_count, 0); + chip->card = card; + chip->pci = pci; + chip->irq = -1; +diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c +index b60ff56..7307f0f 100644 +--- a/sound/soc/soc-core.c ++++ b/sound/soc/soc-core.c +@@ -2132,8 +2132,10 @@ int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops, + if (ret) + return ret; + +- ops->warm_reset = snd_soc_ac97_warm_reset; +- ops->reset = snd_soc_ac97_reset; ++ pax_open_kernel(); ++ *(void **)&ops->warm_reset = snd_soc_ac97_warm_reset; ++ *(void **)&ops->reset = snd_soc_ac97_reset; ++ pax_close_kernel(); + + snd_ac97_rst_cfg = cfg; + return 0; +diff --git a/sound/synth/emux/emux_seq.c b/sound/synth/emux/emux_seq.c +index 7778b8e..3d619fc 100644 +--- a/sound/synth/emux/emux_seq.c ++++ b/sound/synth/emux/emux_seq.c +@@ -33,13 +33,13 @@ static int snd_emux_unuse(void *private_data, struct snd_seq_port_subscribe *inf + * MIDI emulation operators + */ + static struct snd_midi_op emux_ops = { +- snd_emux_note_on, +- snd_emux_note_off, +- snd_emux_key_press, +- snd_emux_terminate_note, +- snd_emux_control, +- snd_emux_nrpn, +- snd_emux_sysex, ++ .note_on = snd_emux_note_on, ++ .note_off = snd_emux_note_off, ++ .key_press = snd_emux_key_press, ++ .note_terminate = snd_emux_terminate_note, ++ .control = snd_emux_control, ++ .nrpn = snd_emux_nrpn, ++ .sysex = snd_emux_sysex, + }; + + +diff --git a/tools/gcc/.gitignore b/tools/gcc/.gitignore +new file mode 100644 +index 0000000..de92ed9 +--- /dev/null ++++ b/tools/gcc/.gitignore +@@ -0,0 +1 @@ ++randomize_layout_seed.h +diff --git a/tools/gcc/Makefile b/tools/gcc/Makefile +new file mode 100644 +index 0000000..a51677e +--- /dev/null ++++ b/tools/gcc/Makefile +@@ -0,0 +1,52 @@ ++#CC := gcc ++#PLUGIN_SOURCE_FILES := pax_plugin.c ++#PLUGIN_OBJECT_FILES := $(patsubst %.c,%.o,$(PLUGIN_SOURCE_FILES)) ++GCCPLUGINS_DIR := $(shell $(CC) -print-file-name=plugin) ++#CFLAGS += -I$(GCCPLUGINS_DIR)/include -fPIC -O2 -Wall -W -std=gnu99 ++ ++ifeq ($(PLUGINCC),$(HOSTCC)) ++HOSTLIBS := hostlibs ++HOST_EXTRACFLAGS += -I$(GCCPLUGINS_DIR)/include -I$(src) -std=gnu99 -ggdb ++export HOST_EXTRACFLAGS ++else ++HOSTLIBS := hostcxxlibs ++HOST_EXTRACXXFLAGS += -I$(GCCPLUGINS_DIR)/include -I$(src) -std=gnu++98 -fno-rtti -fno-exceptions -fasynchronous-unwind-tables -ggdb -Wno-unused-parameter -Wno-narrowing -Wno-unused-variable ++export HOST_EXTRACXXFLAGS ++endif ++ ++export GCCPLUGINS_DIR HOSTLIBS ++ ++$(HOSTLIBS)-$(CONFIG_PAX_CONSTIFY_PLUGIN) := constify_plugin.so ++$(HOSTLIBS)-$(CONFIG_PAX_MEMORY_STACKLEAK) += stackleak_plugin.so ++$(HOSTLIBS)-$(CONFIG_KALLOCSTAT_PLUGIN) += kallocstat_plugin.so ++$(HOSTLIBS)-$(CONFIG_PAX_KERNEXEC_PLUGIN) += kernexec_plugin.so ++$(HOSTLIBS)-$(CONFIG_CHECKER_PLUGIN) += checker_plugin.so ++$(HOSTLIBS)-y += colorize_plugin.so ++$(HOSTLIBS)-$(CONFIG_PAX_LATENT_ENTROPY) += latent_entropy_plugin.so ++$(HOSTLIBS)-$(CONFIG_PAX_MEMORY_STRUCTLEAK) += structleak_plugin.so ++$(HOSTLIBS)-$(CONFIG_GRKERNSEC_RANDSTRUCT) += randomize_layout_plugin.so ++ ++subdir-$(CONFIG_PAX_SIZE_OVERFLOW) := size_overflow_plugin ++subdir- += size_overflow_plugin ++ ++always := $($(HOSTLIBS)-y) ++ ++constify_plugin-objs := constify_plugin.o ++stackleak_plugin-objs := stackleak_plugin.o ++kallocstat_plugin-objs := kallocstat_plugin.o ++kernexec_plugin-objs := kernexec_plugin.o ++checker_plugin-objs := checker_plugin.o ++colorize_plugin-objs := colorize_plugin.o ++latent_entropy_plugin-objs := latent_entropy_plugin.o ++structleak_plugin-objs := structleak_plugin.o ++randomize_layout_plugin-objs := randomize_layout_plugin.o ++ ++$(obj)/randomize_layout_plugin.o: $(objtree)/$(obj)/randomize_layout_seed.h ++ ++quiet_cmd_create_randomize_layout_seed = GENSEED $@ ++ cmd_create_randomize_layout_seed = \ ++ $(CONFIG_SHELL) $(srctree)/$(src)/gen-random-seed.sh $@ $(objtree)/include/generated/randomize_layout_hash.h ++$(objtree)/$(obj)/randomize_layout_seed.h: FORCE ++ $(call if_changed,create_randomize_layout_seed) ++ ++targets += randomize_layout_seed.h randomize_layout_hash.h +diff --git a/tools/gcc/checker_plugin.c b/tools/gcc/checker_plugin.c +new file mode 100644 +index 0000000..5452feea +--- /dev/null ++++ b/tools/gcc/checker_plugin.c +@@ -0,0 +1,150 @@ ++/* ++ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Licensed under the GPL v2 ++ * ++ * Note: the choice of the license means that the compilation process is ++ * NOT 'eligible' as defined by gcc's library exception to the GPL v3, ++ * but for the kernel it doesn't matter since it doesn't link against ++ * any of the gcc libraries ++ * ++ * gcc plugin to implement various sparse (source code checker) features ++ * ++ * TODO: ++ * - define separate __iomem, __percpu and __rcu address spaces (lots of code to patch) ++ * ++ * BUGS: ++ * - none known ++ */ ++ ++#include "gcc-common.h" ++ ++extern void c_register_addr_space (const char *str, addr_space_t as); ++extern enum machine_mode default_addr_space_pointer_mode (addr_space_t); ++extern enum machine_mode default_addr_space_address_mode (addr_space_t); ++extern bool default_addr_space_valid_pointer_mode(enum machine_mode mode, addr_space_t as); ++extern bool default_addr_space_legitimate_address_p(enum machine_mode mode, rtx mem, bool strict, addr_space_t as); ++extern rtx default_addr_space_legitimize_address(rtx x, rtx oldx, enum machine_mode mode, addr_space_t as); ++ ++int plugin_is_GPL_compatible; ++ ++static struct plugin_info checker_plugin_info = { ++ .version = "201304082245", ++ .help = NULL, ++}; ++ ++#define ADDR_SPACE_KERNEL 0 ++#define ADDR_SPACE_FORCE_KERNEL 1 ++#define ADDR_SPACE_USER 2 ++#define ADDR_SPACE_FORCE_USER 3 ++#define ADDR_SPACE_IOMEM 0 ++#define ADDR_SPACE_FORCE_IOMEM 0 ++#define ADDR_SPACE_PERCPU 0 ++#define ADDR_SPACE_FORCE_PERCPU 0 ++#define ADDR_SPACE_RCU 0 ++#define ADDR_SPACE_FORCE_RCU 0 ++ ++static enum machine_mode checker_addr_space_pointer_mode(addr_space_t addrspace) ++{ ++ return default_addr_space_pointer_mode(ADDR_SPACE_GENERIC); ++} ++ ++static enum machine_mode checker_addr_space_address_mode(addr_space_t addrspace) ++{ ++ return default_addr_space_address_mode(ADDR_SPACE_GENERIC); ++} ++ ++static bool checker_addr_space_valid_pointer_mode(enum machine_mode mode, addr_space_t as) ++{ ++ return default_addr_space_valid_pointer_mode(mode, as); ++} ++ ++static bool checker_addr_space_legitimate_address_p(enum machine_mode mode, rtx mem, bool strict, addr_space_t as) ++{ ++ return default_addr_space_legitimate_address_p(mode, mem, strict, ADDR_SPACE_GENERIC); ++} ++ ++static rtx checker_addr_space_legitimize_address(rtx x, rtx oldx, enum machine_mode mode, addr_space_t as) ++{ ++ return default_addr_space_legitimize_address(x, oldx, mode, as); ++} ++ ++static bool checker_addr_space_subset_p(addr_space_t subset, addr_space_t superset) ++{ ++ if (subset == ADDR_SPACE_FORCE_KERNEL && superset == ADDR_SPACE_KERNEL) ++ return true; ++ ++ if (subset == ADDR_SPACE_FORCE_USER && superset == ADDR_SPACE_USER) ++ return true; ++ ++ if (subset == ADDR_SPACE_FORCE_IOMEM && superset == ADDR_SPACE_IOMEM) ++ return true; ++ ++ if (subset == ADDR_SPACE_KERNEL && superset == ADDR_SPACE_FORCE_USER) ++ return true; ++ ++ if (subset == ADDR_SPACE_KERNEL && superset == ADDR_SPACE_FORCE_IOMEM) ++ return true; ++ ++ if (subset == ADDR_SPACE_USER && superset == ADDR_SPACE_FORCE_KERNEL) ++ return true; ++ ++ if (subset == ADDR_SPACE_IOMEM && superset == ADDR_SPACE_FORCE_KERNEL) ++ return true; ++ ++ return subset == superset; ++} ++ ++static rtx checker_addr_space_convert(rtx op, tree from_type, tree to_type) ++{ ++// addr_space_t from_as = TYPE_ADDR_SPACE(TREE_TYPE(from_type)); ++// addr_space_t to_as = TYPE_ADDR_SPACE(TREE_TYPE(to_type)); ++ ++ return op; ++} ++ ++static void register_checker_address_spaces(void *event_data, void *data) ++{ ++ c_register_addr_space("__kernel", ADDR_SPACE_KERNEL); ++ c_register_addr_space("__force_kernel", ADDR_SPACE_FORCE_KERNEL); ++ c_register_addr_space("__user", ADDR_SPACE_USER); ++ c_register_addr_space("__force_user", ADDR_SPACE_FORCE_USER); ++// c_register_addr_space("__iomem", ADDR_SPACE_IOMEM); ++// c_register_addr_space("__force_iomem", ADDR_SPACE_FORCE_IOMEM); ++// c_register_addr_space("__percpu", ADDR_SPACE_PERCPU); ++// c_register_addr_space("__force_percpu", ADDR_SPACE_FORCE_PERCPU); ++// c_register_addr_space("__rcu", ADDR_SPACE_RCU); ++// c_register_addr_space("__force_rcu", ADDR_SPACE_FORCE_RCU); ++ ++ targetm.addr_space.pointer_mode = checker_addr_space_pointer_mode; ++ targetm.addr_space.address_mode = checker_addr_space_address_mode; ++ targetm.addr_space.valid_pointer_mode = checker_addr_space_valid_pointer_mode; ++ targetm.addr_space.legitimate_address_p = checker_addr_space_legitimate_address_p; ++// targetm.addr_space.legitimize_address = checker_addr_space_legitimize_address; ++ targetm.addr_space.subset_p = checker_addr_space_subset_p; ++ targetm.addr_space.convert = checker_addr_space_convert; ++} ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ const char * const plugin_name = plugin_info->base_name; ++ const int argc = plugin_info->argc; ++ const struct plugin_argument * const argv = plugin_info->argv; ++ int i; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &checker_plugin_info); ++ ++ for (i = 0; i < argc; ++i) ++ error(G_("unkown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ ++ if (TARGET_64BIT == 0) ++ return 0; ++ ++ register_callback(plugin_name, PLUGIN_PRAGMAS, register_checker_address_spaces, NULL); ++ ++ return 0; ++} +diff --git a/tools/gcc/colorize_plugin.c b/tools/gcc/colorize_plugin.c +new file mode 100644 +index 0000000..0c96d8a +--- /dev/null ++++ b/tools/gcc/colorize_plugin.c +@@ -0,0 +1,215 @@ ++/* ++ * Copyright 2012-2015 by PaX Team <pageexec@freemail.hu> ++ * Licensed under the GPL v2 ++ * ++ * Note: the choice of the license means that the compilation process is ++ * NOT 'eligible' as defined by gcc's library exception to the GPL v3, ++ * but for the kernel it doesn't matter since it doesn't link against ++ * any of the gcc libraries ++ * ++ * gcc plugin to colorize diagnostic output ++ * ++ */ ++ ++#include "gcc-common.h" ++ ++int plugin_is_GPL_compatible; ++ ++static struct plugin_info colorize_plugin_info = { ++ .version = "201404202350", ++ .help = "color=[never|always|auto]\tdetermine when to colorize\n", ++}; ++ ++#define GREEN "\033[32m\033[K" ++#define LIGHTGREEN "\033[1;32m\033[K" ++#define YELLOW "\033[33m\033[K" ++#define LIGHTYELLOW "\033[1;33m\033[K" ++#define RED "\033[31m\033[K" ++#define LIGHTRED "\033[1;31m\033[K" ++#define BLUE "\033[34m\033[K" ++#define LIGHTBLUE "\033[1;34m\033[K" ++#define BRIGHT "\033[1;m\033[K" ++#define NORMAL "\033[m\033[K" ++ ++static diagnostic_starter_fn old_starter; ++static diagnostic_finalizer_fn old_finalizer; ++ ++static void start_colorize(diagnostic_context *context, diagnostic_info *diagnostic) ++{ ++ const char *color; ++ char *newprefix; ++ ++ switch (diagnostic->kind) { ++ case DK_NOTE: ++ color = LIGHTBLUE; ++ break; ++ ++ case DK_PEDWARN: ++ case DK_WARNING: ++ color = LIGHTYELLOW; ++ break; ++ ++ case DK_ERROR: ++ case DK_FATAL: ++ case DK_ICE: ++ case DK_PERMERROR: ++ case DK_SORRY: ++ color = LIGHTRED; ++ break; ++ ++ default: ++ color = NORMAL; ++ } ++ ++ old_starter(context, diagnostic); ++ if (-1 == asprintf(&newprefix, "%s%s" NORMAL, color, context->printer->prefix)) ++ return; ++ pp_destroy_prefix(context->printer); ++ pp_set_prefix(context->printer, newprefix); ++} ++ ++static void finalize_colorize(diagnostic_context *context, diagnostic_info *diagnostic) ++{ ++ old_finalizer(context, diagnostic); ++} ++ ++static void colorize_arm(void) ++{ ++ old_starter = diagnostic_starter(global_dc); ++ old_finalizer = diagnostic_finalizer(global_dc); ++ ++ diagnostic_starter(global_dc) = start_colorize; ++ diagnostic_finalizer(global_dc) = finalize_colorize; ++} ++ ++static unsigned int execute_colorize_rearm(void) ++{ ++ if (diagnostic_starter(global_dc) == start_colorize) ++ return 0; ++ ++ colorize_arm(); ++ return 0; ++} ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++static const struct pass_data colorize_rearm_pass_data = { ++#else ++struct simple_ipa_opt_pass colorize_rearm_pass = { ++ .pass = { ++#endif ++ .type = SIMPLE_IPA_PASS, ++ .name = "colorize_rearm", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 ++ .has_gate = false, ++ .has_execute = true, ++#else ++ .gate = NULL, ++ .execute = execute_colorize_rearm, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = 0, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = 0 ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++class colorize_rearm_pass : public simple_ipa_opt_pass { ++public: ++ colorize_rearm_pass() : simple_ipa_opt_pass(colorize_rearm_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return execute_colorize_rearm(); } ++#else ++ unsigned int execute() { return execute_colorize_rearm(); } ++#endif ++}; ++} ++ ++static opt_pass *make_colorize_rearm_pass(void) ++{ ++ return new colorize_rearm_pass(); ++} ++#else ++static struct opt_pass *make_colorize_rearm_pass(void) ++{ ++ return &colorize_rearm_pass.pass; ++} ++#endif ++ ++static void colorize_start_unit(void *gcc_data, void *user_data) ++{ ++ colorize_arm(); ++} ++ ++static bool should_colorize(void) ++{ ++#if BUILDING_GCC_VERSION >= 4009 ++ return false; ++#else ++ char const *t = getenv("TERM"); ++ ++ return t && strcmp(t, "dumb") && isatty(STDERR_FILENO); ++#endif ++} ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ const char * const plugin_name = plugin_info->base_name; ++ const int argc = plugin_info->argc; ++ const struct plugin_argument * const argv = plugin_info->argv; ++ int i; ++ struct register_pass_info colorize_rearm_pass_info; ++ bool colorize; ++ ++ colorize_rearm_pass_info.pass = make_colorize_rearm_pass(); ++ colorize_rearm_pass_info.reference_pass_name = "*free_lang_data"; ++ colorize_rearm_pass_info.ref_pass_instance_number = 1; ++ colorize_rearm_pass_info.pos_op = PASS_POS_INSERT_AFTER; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &colorize_plugin_info); ++ ++ colorize = getenv("GCC_COLORS") ? should_colorize() : false; ++ ++ for (i = 0; i < argc; ++i) { ++ if (!strcmp(argv[i].key, "color")) { ++ if (!argv[i].value) { ++ error(G_("no value supplied for option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ continue; ++ } ++ if (!strcmp(argv[i].value, "always")) ++ colorize = true; ++ else if (!strcmp(argv[i].value, "never")) ++ colorize = false; ++ else if (!strcmp(argv[i].value, "auto")) ++ colorize = should_colorize(); ++ else ++ error(G_("invalid option argument '-fplugin-arg-%s-%s=%s'"), plugin_name, argv[i].key, argv[i].value); ++ continue; ++ } ++ error(G_("unkown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ } ++ ++ if (colorize) { ++ // TODO: parse GCC_COLORS as used by gcc 4.9+ ++ register_callback(plugin_name, PLUGIN_START_UNIT, &colorize_start_unit, NULL); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &colorize_rearm_pass_info); ++ } ++ return 0; ++} +diff --git a/tools/gcc/constify_plugin.c b/tools/gcc/constify_plugin.c +new file mode 100644 +index 0000000..93b181d +--- /dev/null ++++ b/tools/gcc/constify_plugin.c +@@ -0,0 +1,563 @@ ++/* ++ * Copyright 2011 by Emese Revfy <re.emese@gmail.com> ++ * Copyright 2011-2015 by PaX Team <pageexec@freemail.hu> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * This gcc plugin constifies all structures which contain only function pointers or are explicitly marked for constification. ++ * ++ * Homepage: ++ * http://www.grsecurity.net/~ephox/const_plugin/ ++ * ++ * Usage: ++ * $ gcc -I`gcc -print-file-name=plugin`/include -fPIC -shared -O2 -o constify_plugin.so constify_plugin.c ++ * $ gcc -fplugin=constify_plugin.so test.c -O2 ++ */ ++ ++#include "gcc-common.h" ++ ++// unused C type flag in all versions 4.5-5.0 ++#define TYPE_CONSTIFY_VISITED(TYPE) TYPE_LANG_FLAG_4(TYPE) ++ ++int plugin_is_GPL_compatible; ++ ++static struct plugin_info const_plugin_info = { ++ .version = "201401270210", ++ .help = "no-constify\tturn off constification\n", ++}; ++ ++typedef struct { ++ bool has_fptr_field; ++ bool has_writable_field; ++ bool has_do_const_field; ++ bool has_no_const_field; ++} constify_info; ++ ++static const_tree get_field_type(const_tree field) ++{ ++ return strip_array_types(TREE_TYPE(field)); ++} ++ ++static bool is_fptr(const_tree field) ++{ ++ const_tree ptr = get_field_type(field); ++ ++ if (TREE_CODE(ptr) != POINTER_TYPE) ++ return false; ++ ++ return TREE_CODE(TREE_TYPE(ptr)) == FUNCTION_TYPE; ++} ++ ++/* ++ * determine whether the given structure type meets the requirements for automatic constification, ++ * including the constification attributes on nested structure types ++ */ ++static void constifiable(const_tree node, constify_info *cinfo) ++{ ++ const_tree field; ++ ++ gcc_assert(TREE_CODE(node) == RECORD_TYPE || TREE_CODE(node) == UNION_TYPE); ++ ++ // e.g., pointer to structure fields while still constructing the structure type ++ if (TYPE_FIELDS(node) == NULL_TREE) ++ return; ++ ++ for (field = TYPE_FIELDS(node); field; field = TREE_CHAIN(field)) { ++ const_tree type = get_field_type(field); ++ enum tree_code code = TREE_CODE(type); ++ ++ if (node == type) ++ continue; ++ ++ if (is_fptr(field)) ++ cinfo->has_fptr_field = true; ++ else if (!TREE_READONLY(field)) ++ cinfo->has_writable_field = true; ++ ++ if (code == RECORD_TYPE || code == UNION_TYPE) { ++ if (lookup_attribute("do_const", TYPE_ATTRIBUTES(type))) ++ cinfo->has_do_const_field = true; ++ else if (lookup_attribute("no_const", TYPE_ATTRIBUTES(type))) ++ cinfo->has_no_const_field = true; ++ else ++ constifiable(type, cinfo); ++ } ++ } ++} ++ ++static bool constified(const_tree node) ++{ ++ constify_info cinfo = { ++ .has_fptr_field = false, ++ .has_writable_field = false, ++ .has_do_const_field = false, ++ .has_no_const_field = false ++ }; ++ ++ gcc_assert(TREE_CODE(node) == RECORD_TYPE || TREE_CODE(node) == UNION_TYPE); ++ ++ if (lookup_attribute("no_const", TYPE_ATTRIBUTES(node))) { ++// gcc_assert(!TYPE_READONLY(node)); ++ return false; ++ } ++ ++ if (lookup_attribute("do_const", TYPE_ATTRIBUTES(node))) { ++ gcc_assert(TYPE_READONLY(node)); ++ return true; ++ } ++ ++ constifiable(node, &cinfo); ++ if ((!cinfo.has_fptr_field || cinfo.has_writable_field) && !cinfo.has_do_const_field) ++ return false; ++ ++ return TYPE_READONLY(node); ++} ++ ++static void deconstify_tree(tree node); ++ ++static void deconstify_type(tree type) ++{ ++ tree field; ++ ++ gcc_assert(TREE_CODE(type) == RECORD_TYPE || TREE_CODE(type) == UNION_TYPE); ++ ++ for (field = TYPE_FIELDS(type); field; field = TREE_CHAIN(field)) { ++ const_tree fieldtype = get_field_type(field); ++ ++ // special case handling of simple ptr-to-same-array-type members ++ if (TREE_CODE(TREE_TYPE(field)) == POINTER_TYPE) { ++ tree ptrtype = TREE_TYPE(TREE_TYPE(field)); ++ ++ if (TREE_TYPE(TREE_TYPE(field)) == type) ++ continue; ++ if (TREE_CODE(ptrtype) != RECORD_TYPE && TREE_CODE(ptrtype) != UNION_TYPE) ++ continue; ++ if (!constified(ptrtype)) ++ continue; ++ if (TYPE_MAIN_VARIANT(ptrtype) == TYPE_MAIN_VARIANT(type)) { ++ TREE_TYPE(field) = copy_node(TREE_TYPE(field)); ++ TREE_TYPE(TREE_TYPE(field)) = build_qualified_type(type, TYPE_QUALS(ptrtype) & ~TYPE_QUAL_CONST); ++ } ++ continue; ++ } ++ if (TREE_CODE(fieldtype) != RECORD_TYPE && TREE_CODE(fieldtype) != UNION_TYPE) ++ continue; ++ if (!constified(fieldtype)) ++ continue; ++ ++ deconstify_tree(field); ++ TREE_READONLY(field) = 0; ++ } ++ TYPE_READONLY(type) = 0; ++ C_TYPE_FIELDS_READONLY(type) = 0; ++ if (lookup_attribute("do_const", TYPE_ATTRIBUTES(type))) { ++ TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type)); ++ TYPE_ATTRIBUTES(type) = remove_attribute("do_const", TYPE_ATTRIBUTES(type)); ++ } ++} ++ ++static void deconstify_tree(tree node) ++{ ++ tree old_type, new_type, field; ++ ++ old_type = TREE_TYPE(node); ++ while (TREE_CODE(old_type) == ARRAY_TYPE && TREE_CODE(TREE_TYPE(old_type)) != ARRAY_TYPE) { ++ node = TREE_TYPE(node) = copy_node(old_type); ++ old_type = TREE_TYPE(old_type); ++ } ++ ++ gcc_assert(TREE_CODE(old_type) == RECORD_TYPE || TREE_CODE(old_type) == UNION_TYPE); ++ gcc_assert(TYPE_READONLY(old_type) && (TYPE_QUALS(old_type) & TYPE_QUAL_CONST)); ++ ++ new_type = build_qualified_type(old_type, TYPE_QUALS(old_type) & ~TYPE_QUAL_CONST); ++ TYPE_FIELDS(new_type) = copy_list(TYPE_FIELDS(new_type)); ++ for (field = TYPE_FIELDS(new_type); field; field = TREE_CHAIN(field)) ++ DECL_FIELD_CONTEXT(field) = new_type; ++ ++ deconstify_type(new_type); ++ ++ TREE_TYPE(node) = new_type; ++} ++ ++static tree handle_no_const_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs) ++{ ++ tree type; ++ constify_info cinfo = { ++ .has_fptr_field = false, ++ .has_writable_field = false, ++ .has_do_const_field = false, ++ .has_no_const_field = false ++ }; ++ ++ *no_add_attrs = true; ++ if (TREE_CODE(*node) == FUNCTION_DECL) { ++ error("%qE attribute does not apply to functions (%qF)", name, *node); ++ return NULL_TREE; ++ } ++ ++ if (TREE_CODE(*node) == PARM_DECL) { ++ error("%qE attribute does not apply to function parameters (%qD)", name, *node); ++ return NULL_TREE; ++ } ++ ++ if (TREE_CODE(*node) == VAR_DECL) { ++ error("%qE attribute does not apply to variables (%qD)", name, *node); ++ return NULL_TREE; ++ } ++ ++ if (TYPE_P(*node)) { ++ type = *node; ++ } else { ++ gcc_assert(TREE_CODE(*node) == TYPE_DECL); ++ type = TREE_TYPE(*node); ++ } ++ ++ if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE) { ++ error("%qE attribute used on %qT applies to struct and union types only", name, type); ++ return NULL_TREE; ++ } ++ ++ if (lookup_attribute(IDENTIFIER_POINTER(name), TYPE_ATTRIBUTES(type))) { ++ error("%qE attribute is already applied to the type %qT", name, type); ++ return NULL_TREE; ++ } ++ ++ if (TYPE_P(*node)) { ++ if (lookup_attribute("do_const", TYPE_ATTRIBUTES(type))) ++ error("%qE attribute used on type %qT is incompatible with 'do_const'", name, type); ++ else ++ *no_add_attrs = false; ++ return NULL_TREE; ++ } ++ ++ constifiable(type, &cinfo); ++ if ((cinfo.has_fptr_field && !cinfo.has_writable_field) || lookup_attribute("do_const", TYPE_ATTRIBUTES(type))) { ++ deconstify_tree(*node); ++ TYPE_CONSTIFY_VISITED(TREE_TYPE(*node)) = 1; ++ return NULL_TREE; ++ } ++ ++ error("%qE attribute used on type %qT that is not constified", name, type); ++ return NULL_TREE; ++} ++ ++static void constify_type(tree type) ++{ ++ TYPE_READONLY(type) = 1; ++ C_TYPE_FIELDS_READONLY(type) = 1; ++ TYPE_CONSTIFY_VISITED(type) = 1; ++// TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type)); ++// TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("do_const"), NULL_TREE, TYPE_ATTRIBUTES(type)); ++} ++ ++static tree handle_do_const_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs) ++{ ++ *no_add_attrs = true; ++ if (!TYPE_P(*node)) { ++ error("%qE attribute applies to types only (%qD)", name, *node); ++ return NULL_TREE; ++ } ++ ++ if (TREE_CODE(*node) != RECORD_TYPE && TREE_CODE(*node) != UNION_TYPE) { ++ error("%qE attribute used on %qT applies to struct and union types only", name, *node); ++ return NULL_TREE; ++ } ++ ++ if (lookup_attribute(IDENTIFIER_POINTER(name), TYPE_ATTRIBUTES(*node))) { ++ error("%qE attribute used on %qT is already applied to the type", name, *node); ++ return NULL_TREE; ++ } ++ ++ if (lookup_attribute("no_const", TYPE_ATTRIBUTES(*node))) { ++ error("%qE attribute used on %qT is incompatible with 'no_const'", name, *node); ++ return NULL_TREE; ++ } ++ ++ *no_add_attrs = false; ++ return NULL_TREE; ++} ++ ++static struct attribute_spec no_const_attr = { ++ .name = "no_const", ++ .min_length = 0, ++ .max_length = 0, ++ .decl_required = false, ++ .type_required = false, ++ .function_type_required = false, ++ .handler = handle_no_const_attribute, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = true ++#endif ++}; ++ ++static struct attribute_spec do_const_attr = { ++ .name = "do_const", ++ .min_length = 0, ++ .max_length = 0, ++ .decl_required = false, ++ .type_required = false, ++ .function_type_required = false, ++ .handler = handle_do_const_attribute, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = true ++#endif ++}; ++ ++static void register_attributes(void *event_data, void *data) ++{ ++ register_attribute(&no_const_attr); ++ register_attribute(&do_const_attr); ++} ++ ++static void finish_type(void *event_data, void *data) ++{ ++ tree type = (tree)event_data; ++ constify_info cinfo = { ++ .has_fptr_field = false, ++ .has_writable_field = false, ++ .has_do_const_field = false, ++ .has_no_const_field = false ++ }; ++ ++ if (type == NULL_TREE || type == error_mark_node) ++ return; ++ ++#if BUILDING_GCC_VERSION >= 5000 ++ if (TREE_CODE(type) == ENUMERAL_TYPE) ++ return; ++#endif ++ ++ if (TYPE_FIELDS(type) == NULL_TREE || TYPE_CONSTIFY_VISITED(type)) ++ return; ++ ++ constifiable(type, &cinfo); ++ ++ if (lookup_attribute("no_const", TYPE_ATTRIBUTES(type))) { ++ if ((cinfo.has_fptr_field && !cinfo.has_writable_field) || cinfo.has_do_const_field) { ++ deconstify_type(type); ++ TYPE_CONSTIFY_VISITED(type) = 1; ++ } else ++ error("'no_const' attribute used on type %qT that is not constified", type); ++ return; ++ } ++ ++ if (lookup_attribute("do_const", TYPE_ATTRIBUTES(type))) { ++ if (!cinfo.has_writable_field) { ++ error("'do_const' attribute used on type %qT that is%sconstified", type, cinfo.has_fptr_field ? " " : " not "); ++ return; ++ } ++ constify_type(type); ++ return; ++ } ++ ++ if (cinfo.has_fptr_field && !cinfo.has_writable_field) { ++ if (lookup_attribute("do_const", TYPE_ATTRIBUTES(type))) { ++ error("'do_const' attribute used on type %qT that is constified", type); ++ return; ++ } ++ constify_type(type); ++ return; ++ } ++ ++ deconstify_type(type); ++ TYPE_CONSTIFY_VISITED(type) = 1; ++} ++ ++static void check_global_variables(void *event_data, void *data) ++{ ++#if BUILDING_GCC_VERSION >= 4009 ++ varpool_node *node; ++#else ++ struct varpool_node *node; ++#endif ++ ++ FOR_EACH_VARIABLE(node) { ++ tree var = NODE_DECL(node); ++ tree type = TREE_TYPE(var); ++ ++ if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE) ++ continue; ++ ++ if (!TYPE_READONLY(type) || !C_TYPE_FIELDS_READONLY(type)) ++ continue; ++ ++ if (!TYPE_CONSTIFY_VISITED(type)) ++ continue; ++ ++ if (DECL_EXTERNAL(var)) ++ continue; ++ ++ if (DECL_INITIAL(var)) ++ continue; ++ ++ // this works around a gcc bug/feature where uninitialized globals ++ // are moved into the .bss section regardless of any constification ++ DECL_INITIAL(var) = build_constructor(type, NULL); ++// inform(DECL_SOURCE_LOCATION(var), "constified variable %qE moved into .rodata", var); ++ } ++} ++ ++static unsigned int check_local_variables(void) ++{ ++ unsigned int ret = 0; ++ tree var; ++ ++ unsigned int i; ++ ++ FOR_EACH_LOCAL_DECL(cfun, i, var) { ++ tree type = TREE_TYPE(var); ++ ++ gcc_assert(DECL_P(var)); ++ if (is_global_var(var)) ++ continue; ++ ++ if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE) ++ continue; ++ ++ if (!TYPE_READONLY(type) || !C_TYPE_FIELDS_READONLY(type)) ++ continue; ++ ++ if (!TYPE_CONSTIFY_VISITED(type)) ++ continue; ++ ++ error_at(DECL_SOURCE_LOCATION(var), "constified variable %qE cannot be local", var); ++ ret = 1; ++ } ++ return ret; ++} ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++static const struct pass_data check_local_variables_pass_data = { ++#else ++static struct gimple_opt_pass check_local_variables_pass = { ++ .pass = { ++#endif ++ .type = GIMPLE_PASS, ++ .name = "check_local_variables", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION >= 4009 ++ .has_gate = false, ++ .has_execute = true, ++#else ++ .gate = NULL, ++ .execute = check_local_variables, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = 0, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = 0 ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++class check_local_variables_pass : public gimple_opt_pass { ++public: ++ check_local_variables_pass() : gimple_opt_pass(check_local_variables_pass_data, g) {} ++ unsigned int execute() { return check_local_variables(); } ++}; ++} ++ ++static opt_pass *make_check_local_variables_pass(void) ++{ ++ return new check_local_variables_pass(); ++} ++#else ++static struct opt_pass *make_check_local_variables_pass(void) ++{ ++ return &check_local_variables_pass.pass; ++} ++#endif ++ ++static struct { ++ const char *name; ++ const char *asm_op; ++} sections[] = { ++ {".init.rodata", "\t.section\t.init.rodata,\"a\""}, ++ {".ref.rodata", "\t.section\t.ref.rodata,\"a\""}, ++ {".devinit.rodata", "\t.section\t.devinit.rodata,\"a\""}, ++ {".devexit.rodata", "\t.section\t.devexit.rodata,\"a\""}, ++ {".cpuinit.rodata", "\t.section\t.cpuinit.rodata,\"a\""}, ++ {".cpuexit.rodata", "\t.section\t.cpuexit.rodata,\"a\""}, ++ {".meminit.rodata", "\t.section\t.meminit.rodata,\"a\""}, ++ {".memexit.rodata", "\t.section\t.memexit.rodata,\"a\""}, ++ {".data..read_only", "\t.section\t.data..read_only,\"a\""}, ++}; ++ ++static unsigned int (*old_section_type_flags)(tree decl, const char *name, int reloc); ++ ++static unsigned int constify_section_type_flags(tree decl, const char *name, int reloc) ++{ ++ size_t i; ++ ++ for (i = 0; i < ARRAY_SIZE(sections); i++) ++ if (!strcmp(sections[i].name, name)) ++ return 0; ++ return old_section_type_flags(decl, name, reloc); ++} ++ ++static void constify_start_unit(void *gcc_data, void *user_data) ++{ ++// size_t i; ++ ++// for (i = 0; i < ARRAY_SIZE(sections); i++) ++// sections[i].section = get_unnamed_section(0, output_section_asm_op, sections[i].asm_op); ++// sections[i].section = get_section(sections[i].name, 0, NULL); ++ ++ old_section_type_flags = targetm.section_type_flags; ++ targetm.section_type_flags = constify_section_type_flags; ++} ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ const char * const plugin_name = plugin_info->base_name; ++ const int argc = plugin_info->argc; ++ const struct plugin_argument * const argv = plugin_info->argv; ++ int i; ++ bool constify = true; ++ ++ struct register_pass_info check_local_variables_pass_info; ++ ++ check_local_variables_pass_info.pass = make_check_local_variables_pass(); ++ check_local_variables_pass_info.reference_pass_name = "ssa"; ++ check_local_variables_pass_info.ref_pass_instance_number = 1; ++ check_local_variables_pass_info.pos_op = PASS_POS_INSERT_BEFORE; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ for (i = 0; i < argc; ++i) { ++ if (!(strcmp(argv[i].key, "no-constify"))) { ++ constify = false; ++ continue; ++ } ++ error(G_("unkown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ } ++ ++ if (strncmp(lang_hooks.name, "GNU C", 5) && !strncmp(lang_hooks.name, "GNU C+", 6)) { ++ inform(UNKNOWN_LOCATION, G_("%s supports C only, not %s"), plugin_name, lang_hooks.name); ++ constify = false; ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &const_plugin_info); ++ if (constify) { ++ register_callback(plugin_name, PLUGIN_ALL_IPA_PASSES_START, check_global_variables, NULL); ++ register_callback(plugin_name, PLUGIN_FINISH_TYPE, finish_type, NULL); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &check_local_variables_pass_info); ++ register_callback(plugin_name, PLUGIN_START_UNIT, constify_start_unit, NULL); ++ } ++ register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL); ++ ++ return 0; ++} +diff --git a/tools/gcc/gcc-common.h b/tools/gcc/gcc-common.h +new file mode 100644 +index 0000000..d8ec362 +--- /dev/null ++++ b/tools/gcc/gcc-common.h +@@ -0,0 +1,666 @@ ++#ifndef GCC_COMMON_H_INCLUDED ++#define GCC_COMMON_H_INCLUDED ++ ++#include "plugin.h" ++#include "bversion.h" ++#include "plugin-version.h" ++#include "config.h" ++#include "system.h" ++#include "coretypes.h" ++#include "tm.h" ++#include "line-map.h" ++#include "input.h" ++#include "tree.h" ++ ++#include "tree-inline.h" ++#include "version.h" ++#include "rtl.h" ++#include "tm_p.h" ++#include "flags.h" ++//#include "insn-attr.h" ++//#include "insn-config.h" ++//#include "insn-flags.h" ++#include "hard-reg-set.h" ++//#include "recog.h" ++#include "output.h" ++#include "except.h" ++#include "function.h" ++#include "toplev.h" ++//#include "expr.h" ++#include "basic-block.h" ++#include "intl.h" ++#include "ggc.h" ++//#include "regs.h" ++#include "timevar.h" ++ ++#include "params.h" ++ ++#if BUILDING_GCC_VERSION <= 4009 ++#include "pointer-set.h" ++#else ++#include "hash-map.h" ++#endif ++ ++#include "emit-rtl.h" ++//#include "reload.h" ++//#include "ira.h" ++//#include "dwarf2asm.h" ++#include "debug.h" ++#include "target.h" ++#include "langhooks.h" ++#include "cfgloop.h" ++//#include "hosthooks.h" ++#include "cgraph.h" ++#include "opts.h" ++//#include "coverage.h" ++//#include "value-prof.h" ++ ++#if BUILDING_GCC_VERSION == 4005 ++#include <sys/mman.h> ++#endif ++ ++#if BUILDING_GCC_VERSION >= 4007 ++#include "tree-pretty-print.h" ++#include "gimple-pretty-print.h" ++#endif ++ ++#if BUILDING_GCC_VERSION >= 4006 ++//#include "c-tree.h" ++//#include "cp/cp-tree.h" ++#include "c-family/c-common.h" ++#else ++#include "c-common.h" ++#endif ++ ++#if BUILDING_GCC_VERSION <= 4008 ++#include "tree-flow.h" ++#else ++#include "tree-cfgcleanup.h" ++#endif ++ ++#if BUILDING_GCC_VERSION >= 4008 ++#include "is-a.h" ++#endif ++ ++#include "diagnostic.h" ++//#include "tree-diagnostic.h" ++#include "tree-dump.h" ++#include "tree-pass.h" ++//#include "df.h" ++#include "predict.h" ++#include "ipa-utils.h" ++ ++#if BUILDING_GCC_VERSION >= 4009 ++#include "varasm.h" ++#include "stor-layout.h" ++#include "internal-fn.h" ++#include "gimple-expr.h" ++#include "gimple-fold.h" ++//#include "diagnostic-color.h" ++#include "context.h" ++#include "tree-ssa-alias.h" ++#include "tree-ssa.h" ++#include "stringpool.h" ++#include "tree-ssanames.h" ++#include "print-tree.h" ++#include "tree-eh.h" ++#include "stmt.h" ++#include "gimplify.h" ++#endif ++ ++#include "gimple.h" ++ ++#if BUILDING_GCC_VERSION >= 4009 ++#include "tree-ssa-operands.h" ++#include "tree-phinodes.h" ++#include "tree-cfg.h" ++#include "gimple-iterator.h" ++#include "gimple-ssa.h" ++#include "ssa-iterators.h" ++#endif ++ ++//#include "lto/lto.h" ++#if BUILDING_GCC_VERSION >= 4007 ++//#include "data-streamer.h" ++#else ++//#include "lto-streamer.h" ++#endif ++//#include "lto-compress.h" ++#if BUILDING_GCC_VERSION >= 5000 ++//#include "lto-section-names.h" ++#include "builtins.h" ++#endif ++ ++//#include "expr.h" where are you... ++extern rtx emit_move_insn(rtx x, rtx y); ++ ++// missing from basic_block.h... ++extern void debug_dominance_info(enum cdi_direction dir); ++extern void debug_dominance_tree(enum cdi_direction dir, basic_block root); ++ ++#ifdef __cplusplus ++static inline void debug_tree(const_tree t) ++{ ++ debug_tree(CONST_CAST_TREE(t)); ++} ++#else ++#define debug_tree(t) debug_tree(CONST_CAST_TREE(t)) ++#endif ++ ++#define __unused __attribute__((__unused__)) ++ ++#define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node)) ++#define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node)) ++#define TYPE_NAME_POINTER(node) IDENTIFIER_POINTER(TYPE_NAME(node)) ++#define TYPE_NAME_LENGTH(node) IDENTIFIER_LENGTH(TYPE_NAME(node)) ++ ++// should come from c-tree.h if only it were installed for gcc 4.5... ++#define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1(TYPE) ++ ++#if BUILDING_GCC_VERSION == 4005 ++#define FOR_EACH_LOCAL_DECL(FUN, I, D) for (tree vars = (FUN)->local_decls; vars && (D = TREE_VALUE(vars)); vars = TREE_CHAIN(vars), I) ++#define DECL_CHAIN(NODE) (TREE_CHAIN(DECL_MINIMAL_CHECK(NODE))) ++#define FOR_EACH_VEC_ELT(T, V, I, P) for (I = 0; VEC_iterate(T, (V), (I), (P)); ++(I)) ++#define TODO_rebuild_cgraph_edges 0 ++#define SCOPE_FILE_SCOPE_P(EXP) (!(EXP)) ++ ++#ifndef O_BINARY ++#define O_BINARY 0 ++#endif ++ ++static inline bool gimple_call_builtin_p(gimple stmt, enum built_in_function code) ++{ ++ tree fndecl; ++ ++ if (!is_gimple_call(stmt)) ++ return false; ++ fndecl = gimple_call_fndecl(stmt); ++ if (!fndecl || DECL_BUILT_IN_CLASS(fndecl) != BUILT_IN_NORMAL) ++ return false; ++// print_node(stderr, "pax", fndecl, 4); ++ return DECL_FUNCTION_CODE(fndecl) == code; ++} ++ ++static inline bool is_simple_builtin(tree decl) ++{ ++ if (decl && DECL_BUILT_IN_CLASS(decl) != BUILT_IN_NORMAL) ++ return false; ++ ++ switch (DECL_FUNCTION_CODE(decl)) { ++ /* Builtins that expand to constants. */ ++ case BUILT_IN_CONSTANT_P: ++ case BUILT_IN_EXPECT: ++ case BUILT_IN_OBJECT_SIZE: ++ case BUILT_IN_UNREACHABLE: ++ /* Simple register moves or loads from stack. */ ++ case BUILT_IN_RETURN_ADDRESS: ++ case BUILT_IN_EXTRACT_RETURN_ADDR: ++ case BUILT_IN_FROB_RETURN_ADDR: ++ case BUILT_IN_RETURN: ++ case BUILT_IN_AGGREGATE_INCOMING_ADDRESS: ++ case BUILT_IN_FRAME_ADDRESS: ++ case BUILT_IN_VA_END: ++ case BUILT_IN_STACK_SAVE: ++ case BUILT_IN_STACK_RESTORE: ++ /* Exception state returns or moves registers around. */ ++ case BUILT_IN_EH_FILTER: ++ case BUILT_IN_EH_POINTER: ++ case BUILT_IN_EH_COPY_VALUES: ++ return true; ++ ++ default: ++ return false; ++ } ++} ++#endif ++ ++#if BUILDING_GCC_VERSION <= 4006 ++#define ANY_RETURN_P(rtx) (GET_CODE(rtx) == RETURN) ++#define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4(EXP) ++#define EDGE_PRESERVE 0ULL ++#define HOST_WIDE_INT_PRINT_HEX_PURE "%" HOST_WIDE_INT_PRINT "x" ++#define flag_fat_lto_objects true ++ ++#define get_random_seed(noinit) ({ \ ++ unsigned HOST_WIDE_INT seed; \ ++ sscanf(get_random_seed(noinit), "%" HOST_WIDE_INT_PRINT "x", &seed); \ ++ seed * seed; }) ++ ++#define int_const_binop(code, arg1, arg2) int_const_binop((code), (arg1), (arg2), 0) ++ ++static inline bool gimple_clobber_p(gimple s __unused) ++{ ++ return false; ++} ++ ++static inline bool gimple_asm_clobbers_memory_p(const_gimple stmt) ++{ ++ unsigned i; ++ ++ for (i = 0; i < gimple_asm_nclobbers(stmt); i++) { ++ tree op = gimple_asm_clobber_op(stmt, i); ++ if (!strcmp(TREE_STRING_POINTER(TREE_VALUE(op)), "memory")) ++ return true; ++ } ++ ++ return false; ++} ++ ++static inline tree builtin_decl_implicit(enum built_in_function fncode) ++{ ++ return implicit_built_in_decls[fncode]; ++} ++ ++static inline int ipa_reverse_postorder(struct cgraph_node **order) ++{ ++ return cgraph_postorder(order); ++} ++ ++static inline struct cgraph_node *cgraph_get_create_node(tree decl) ++{ ++ struct cgraph_node *node = cgraph_get_node(decl); ++ ++ return node ? node : cgraph_node(decl); ++} ++ ++static inline bool cgraph_function_with_gimple_body_p(struct cgraph_node *node) ++{ ++ return node->analyzed && !node->thunk.thunk_p && !node->alias; ++} ++ ++static inline struct cgraph_node *cgraph_first_function_with_gimple_body(void) ++{ ++ struct cgraph_node *node; ++ ++ for (node = cgraph_nodes; node; node = node->next) ++ if (cgraph_function_with_gimple_body_p(node)) ++ return node; ++ return NULL; ++} ++ ++static inline struct cgraph_node *cgraph_next_function_with_gimple_body(struct cgraph_node *node) ++{ ++ for (node = node->next; node; node = node->next) ++ if (cgraph_function_with_gimple_body_p(node)) ++ return node; ++ return NULL; ++} ++ ++#define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \ ++ for ((node) = cgraph_first_function_with_gimple_body(); (node); \ ++ (node) = cgraph_next_function_with_gimple_body(node)) ++#endif ++ ++#if BUILDING_GCC_VERSION == 4006 ++extern void debug_gimple_stmt(gimple); ++extern void debug_gimple_seq(gimple_seq); ++extern void print_gimple_seq(FILE *, gimple_seq, int, int); ++extern void print_gimple_stmt(FILE *, gimple, int, int); ++extern void print_gimple_expr(FILE *, gimple, int, int); ++extern void dump_gimple_stmt(pretty_printer *, gimple, int, int); ++#endif ++ ++#if BUILDING_GCC_VERSION <= 4007 ++#define FOR_EACH_FUNCTION(node) for (node = cgraph_nodes; node; node = node->next) ++#define FOR_EACH_VARIABLE(node) for (node = varpool_nodes; node; node = node->next) ++#define PROP_loops 0 ++#define NODE_SYMBOL(node) (node) ++#define NODE_DECL(node) (node)->decl ++#define INSN_LOCATION(INSN) RTL_LOCATION(INSN) ++ ++static inline int bb_loop_depth(const_basic_block bb) ++{ ++ return bb->loop_father ? loop_depth(bb->loop_father) : 0; ++} ++ ++static inline bool gimple_store_p(gimple gs) ++{ ++ tree lhs = gimple_get_lhs(gs); ++ return lhs && !is_gimple_reg(lhs); ++} ++#endif ++ ++#if BUILDING_GCC_VERSION == 4007 || BUILDING_GCC_VERSION == 4008 ++static inline struct cgraph_node *cgraph_alias_target(struct cgraph_node *n) ++{ ++ return cgraph_alias_aliased_node(n); ++} ++#endif ++ ++#if BUILDING_GCC_VERSION >= 4007 && BUILDING_GCC_VERSION <= 4009 ++#define cgraph_create_edge(caller, callee, call_stmt, count, freq, nest) \ ++ cgraph_create_edge((caller), (callee), (call_stmt), (count), (freq)) ++#define cgraph_create_edge_including_clones(caller, callee, old_call_stmt, call_stmt, count, freq, nest, reason) \ ++ cgraph_create_edge_including_clones((caller), (callee), (old_call_stmt), (call_stmt), (count), (freq), (reason)) ++#endif ++ ++#if BUILDING_GCC_VERSION <= 4008 ++#define ENTRY_BLOCK_PTR_FOR_FN(FN) ENTRY_BLOCK_PTR_FOR_FUNCTION(FN) ++#define EXIT_BLOCK_PTR_FOR_FN(FN) EXIT_BLOCK_PTR_FOR_FUNCTION(FN) ++#define basic_block_info_for_fn(FN) ((FN)->cfg->x_basic_block_info) ++#define n_basic_blocks_for_fn(FN) ((FN)->cfg->x_n_basic_blocks) ++#define n_edges_for_fn(FN) ((FN)->cfg->x_n_edges) ++#define last_basic_block_for_fn(FN) ((FN)->cfg->x_last_basic_block) ++#define label_to_block_map_for_fn(FN) ((FN)->cfg->x_label_to_block_map) ++#define profile_status_for_fn(FN) ((FN)->cfg->x_profile_status) ++#define BASIC_BLOCK_FOR_FN(FN, N) BASIC_BLOCK_FOR_FUNCTION((FN), (N)) ++#define NODE_IMPLICIT_ALIAS(node) (node)->same_body_alias ++ ++static inline bool tree_fits_shwi_p(const_tree t) ++{ ++ if (t == NULL_TREE || TREE_CODE(t) != INTEGER_CST) ++ return false; ++ ++ if (TREE_INT_CST_HIGH(t) == 0 && (HOST_WIDE_INT)TREE_INT_CST_LOW(t) >= 0) ++ return true; ++ ++ if (TREE_INT_CST_HIGH(t) == -1 && (HOST_WIDE_INT)TREE_INT_CST_LOW(t) < 0 && !TYPE_UNSIGNED(TREE_TYPE(t))) ++ return true; ++ ++ return false; ++} ++ ++static inline bool tree_fits_uhwi_p(const_tree t) ++{ ++ if (t == NULL_TREE || TREE_CODE(t) != INTEGER_CST) ++ return false; ++ ++ return TREE_INT_CST_HIGH(t) == 0; ++} ++ ++static inline HOST_WIDE_INT tree_to_shwi(const_tree t) ++{ ++ gcc_assert(tree_fits_shwi_p(t)); ++ return TREE_INT_CST_LOW(t); ++} ++ ++static inline unsigned HOST_WIDE_INT tree_to_uhwi(const_tree t) ++{ ++ gcc_assert(tree_fits_uhwi_p(t)); ++ return TREE_INT_CST_LOW(t); ++} ++ ++static inline const char *get_tree_code_name(enum tree_code code) ++{ ++ gcc_assert(code < MAX_TREE_CODES); ++ return tree_code_name[code]; ++} ++ ++#define ipa_remove_stmt_references(cnode, stmt) ++typedef union gimple_statement_d gasm; ++typedef union gimple_statement_d gassign; ++typedef union gimple_statement_d gcall; ++typedef union gimple_statement_d gcond; ++typedef union gimple_statement_d gdebug; ++typedef union gimple_statement_d gphi; ++typedef union gimple_statement_d greturn; ++#endif ++ ++#if BUILDING_GCC_VERSION == 4008 ++#define NODE_SYMBOL(node) (&(node)->symbol) ++#define NODE_DECL(node) (node)->symbol.decl ++#endif ++ ++#if BUILDING_GCC_VERSION >= 4008 ++#define add_referenced_var(var) ++#define mark_sym_for_renaming(var) ++#define varpool_mark_needed_node(node) ++#define TODO_dump_func 0 ++#define TODO_dump_cgraph 0 ++#endif ++ ++#if BUILDING_GCC_VERSION <= 4009 ++#define TODO_verify_il 0 ++#define AVAIL_INTERPOSABLE AVAIL_OVERWRITABLE ++#endif ++ ++#if BUILDING_GCC_VERSION == 4009 ++typedef struct gimple_statement_base gasm; ++typedef struct gimple_statement_base gassign; ++typedef struct gimple_statement_base gcall; ++typedef struct gimple_statement_base gcond; ++typedef struct gimple_statement_base gdebug; ++typedef struct gimple_statement_base gphi; ++typedef struct gimple_statement_base greturn; ++#endif ++ ++#if BUILDING_GCC_VERSION <= 4009 ++typedef struct rtx_def rtx_insn; ++ ++static inline gasm *as_a_gasm(gimple stmt) ++{ ++ return stmt; ++} ++ ++static inline const gasm *as_a_const_gasm(const_gimple stmt) ++{ ++ return stmt; ++} ++ ++static inline gassign *as_a_gassign(gimple stmt) ++{ ++ return stmt; ++} ++ ++static inline const gassign *as_a_const_gassign(const_gimple stmt) ++{ ++ return stmt; ++} ++ ++static inline gcall *as_a_gcall(gimple stmt) ++{ ++ return stmt; ++} ++ ++static inline const gcall *as_a_const_gcall(const_gimple stmt) ++{ ++ return stmt; ++} ++ ++static inline gphi *as_a_gphi(gimple stmt) ++{ ++ return stmt; ++} ++ ++static inline const gphi *as_a_const_gphi(const_gimple stmt) ++{ ++ return stmt; ++} ++ ++static inline greturn *as_a_greturn(gimple stmt) ++{ ++ return stmt; ++} ++ ++static inline const greturn *as_a_const_greturn(const_gimple stmt) ++{ ++ return stmt; ++} ++#endif ++ ++#if BUILDING_GCC_VERSION >= 4009 ++#define TODO_ggc_collect 0 ++#define NODE_SYMBOL(node) (node) ++#define NODE_DECL(node) (node)->decl ++#define cgraph_node_name(node) (node)->name() ++#define NODE_IMPLICIT_ALIAS(node) (node)->cpp_implicit_alias ++#endif ++ ++#if BUILDING_GCC_VERSION >= 5000 ++#define TODO_verify_ssa TODO_verify_il ++#define TODO_verify_flow TODO_verify_il ++#define TODO_verify_stmts TODO_verify_il ++#define TODO_verify_rtl_sharing TODO_verify_il ++ ++//#define TREE_INT_CST_HIGH(NODE) ({ TREE_INT_CST_EXT_NUNITS(NODE) > 1 ? (unsigned HOST_WIDE_INT)TREE_INT_CST_ELT(NODE, 1) : 0; }) ++ ++#define INSN_DELETED_P(insn) (insn)->deleted() ++ ++// symtab/cgraph related ++#define debug_cgraph_node(node) (node)->debug() ++#define cgraph_get_node(decl) cgraph_node::get(decl) ++#define cgraph_get_create_node(decl) cgraph_node::get_create(decl) ++#define cgraph_n_nodes symtab->cgraph_count ++#define cgraph_max_uid symtab->cgraph_max_uid ++#define varpool_get_node(decl) varpool_node::get(decl) ++ ++#define cgraph_create_edge(caller, callee, call_stmt, count, freq, nest) \ ++ (caller)->create_edge((callee), (call_stmt), (count), (freq)) ++#define cgraph_create_edge_including_clones(caller, callee, old_call_stmt, call_stmt, count, freq, nest, reason) \ ++ (caller)->create_edge_including_clones((callee), (old_call_stmt), (call_stmt), (count), (freq), (reason)) ++ ++typedef struct cgraph_node *cgraph_node_ptr; ++typedef struct cgraph_edge *cgraph_edge_p; ++typedef struct varpool_node *varpool_node_ptr; ++ ++static inline void change_decl_assembler_name(tree decl, tree name) ++{ ++ symtab->change_decl_assembler_name(decl, name); ++} ++ ++static inline void varpool_finalize_decl(tree decl) ++{ ++ varpool_node::finalize_decl(decl); ++} ++ ++static inline cgraph_node_ptr cgraph_function_node(cgraph_node_ptr node, enum availability *availability) ++{ ++ return node->function_symbol(availability); ++} ++ ++static inline cgraph_node_ptr cgraph_function_or_thunk_node(cgraph_node_ptr node, enum availability *availability = NULL) ++{ ++ return node->ultimate_alias_target(availability); ++} ++ ++static inline bool cgraph_only_called_directly_p(cgraph_node_ptr node) ++{ ++ return node->only_called_directly_p(); ++} ++ ++static inline enum availability cgraph_function_body_availability(cgraph_node_ptr node) ++{ ++ return node->get_availability(); ++} ++ ++static inline cgraph_node_ptr cgraph_alias_target(cgraph_node_ptr node) ++{ ++ return node->get_alias_target(); ++} ++ ++static inline struct cgraph_node_hook_list *cgraph_add_function_insertion_hook(cgraph_node_hook hook, void *data) ++{ ++ return symtab->add_cgraph_insertion_hook(hook, data); ++} ++ ++static inline void cgraph_remove_function_insertion_hook(struct cgraph_node_hook_list *entry) ++{ ++ symtab->remove_cgraph_insertion_hook(entry); ++} ++ ++static inline struct cgraph_node_hook_list *cgraph_add_node_removal_hook(cgraph_node_hook hook, void *data) ++{ ++ return symtab->add_cgraph_removal_hook(hook, data); ++} ++ ++static inline void cgraph_remove_node_removal_hook(struct cgraph_node_hook_list *entry) ++{ ++ symtab->remove_cgraph_removal_hook(entry); ++} ++ ++static inline struct cgraph_2node_hook_list *cgraph_add_node_duplication_hook(cgraph_2node_hook hook, void *data) ++{ ++ return symtab->add_cgraph_duplication_hook(hook, data); ++} ++ ++static inline void cgraph_remove_node_duplication_hook(struct cgraph_2node_hook_list *entry) ++{ ++ symtab->remove_cgraph_duplication_hook(entry); ++} ++ ++// gimple related ++static inline gimple gimple_build_assign_with_ops(enum tree_code subcode, tree lhs, tree op1, tree op2 MEM_STAT_DECL) ++{ ++ return gimple_build_assign(lhs, subcode, op1, op2 PASS_MEM_STAT); ++} ++ ++template <> ++template <> ++inline bool is_a_helper<const gassign *>::test(const_gimple gs) ++{ ++ return gs->code == GIMPLE_ASSIGN; ++} ++ ++template <> ++template <> ++inline bool is_a_helper<const greturn *>::test(const_gimple gs) ++{ ++ return gs->code == GIMPLE_RETURN; ++} ++ ++static inline gasm *as_a_gasm(gimple stmt) ++{ ++ return as_a<gasm *>(stmt); ++} ++ ++static inline const gasm *as_a_const_gasm(const_gimple stmt) ++{ ++ return as_a<const gasm *>(stmt); ++} ++ ++static inline gassign *as_a_gassign(gimple stmt) ++{ ++ return as_a<gassign *>(stmt); ++} ++ ++static inline const gassign *as_a_const_gassign(const_gimple stmt) ++{ ++ return as_a<const gassign *>(stmt); ++} ++ ++static inline gcall *as_a_gcall(gimple stmt) ++{ ++ return as_a<gcall *>(stmt); ++} ++ ++static inline const gcall *as_a_const_gcall(const_gimple stmt) ++{ ++ return as_a<const gcall *>(stmt); ++} ++ ++static inline gphi *as_a_gphi(gimple stmt) ++{ ++ return as_a<gphi *>(stmt); ++} ++ ++static inline const gphi *as_a_const_gphi(const_gimple stmt) ++{ ++ return as_a<const gphi *>(stmt); ++} ++ ++static inline greturn *as_a_greturn(gimple stmt) ++{ ++ return as_a<greturn *>(stmt); ++} ++ ++static inline const greturn *as_a_const_greturn(const_gimple stmt) ++{ ++ return as_a<const greturn *>(stmt); ++} ++ ++// IPA/LTO related ++#define ipa_ref_list_referring_iterate(L,I,P) (L)->referring.iterate((I), &(P)) ++#define ipa_ref_list_reference_iterate(L,I,P) (L)->reference.iterate((I), &(P)) ++ ++static inline cgraph_node_ptr ipa_ref_referring_node(struct ipa_ref *ref) ++{ ++ return dyn_cast<cgraph_node_ptr>(ref->referring); ++} ++ ++static inline void ipa_remove_stmt_references(symtab_node *referring_node, gimple stmt) ++{ ++ referring_node->remove_stmt_references(stmt); ++} ++#endif ++ ++#endif +diff --git a/tools/gcc/gen-random-seed.sh b/tools/gcc/gen-random-seed.sh +new file mode 100644 +index 0000000..7514850 +--- /dev/null ++++ b/tools/gcc/gen-random-seed.sh +@@ -0,0 +1,8 @@ ++#!/bin/sh ++ ++if [ ! -f "$1" ]; then ++ SEED=`od -A n -t x8 -N 32 /dev/urandom | tr -d ' \n'` ++ echo "const char *randstruct_seed = \"$SEED\";" > "$1" ++ HASH=`echo -n "$SEED" | sha256sum | cut -d" " -f1 | tr -d ' \n'` ++ echo "#define RANDSTRUCT_HASHED_SEED \"$HASH\"" > "$2" ++fi +diff --git a/tools/gcc/kallocstat_plugin.c b/tools/gcc/kallocstat_plugin.c +new file mode 100644 +index 0000000..457d54e +--- /dev/null ++++ b/tools/gcc/kallocstat_plugin.c +@@ -0,0 +1,188 @@ ++/* ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> ++ * Licensed under the GPL v2 ++ * ++ * Note: the choice of the license means that the compilation process is ++ * NOT 'eligible' as defined by gcc's library exception to the GPL v3, ++ * but for the kernel it doesn't matter since it doesn't link against ++ * any of the gcc libraries ++ * ++ * gcc plugin to find the distribution of k*alloc sizes ++ * ++ * TODO: ++ * ++ * BUGS: ++ * - none known ++ */ ++ ++#include "gcc-common.h" ++ ++int plugin_is_GPL_compatible; ++ ++static struct plugin_info kallocstat_plugin_info = { ++ .version = "201401260140", ++ .help = NULL ++}; ++ ++static const char * const kalloc_functions[] = { ++ "__kmalloc", ++ "kmalloc", ++ "kmalloc_large", ++ "kmalloc_node", ++ "kmalloc_order", ++ "kmalloc_order_trace", ++ "kmalloc_slab", ++ "kzalloc", ++ "kzalloc_node", ++}; ++ ++static bool is_kalloc(const char *fnname) ++{ ++ size_t i; ++ ++ for (i = 0; i < ARRAY_SIZE(kalloc_functions); i++) ++ if (!strcmp(fnname, kalloc_functions[i])) ++ return true; ++ return false; ++} ++ ++static unsigned int execute_kallocstat(void) ++{ ++ basic_block bb; ++ ++ // 1. loop through BBs and GIMPLE statements ++ FOR_EACH_BB_FN(bb, cfun) { ++ gimple_stmt_iterator gsi; ++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { ++ // gimple match: ++ tree fndecl, size; ++ gimple stmt; ++ const char *fnname; ++ ++ // is it a call ++ stmt = gsi_stmt(gsi); ++ if (!is_gimple_call(stmt)) ++ continue; ++ fndecl = gimple_call_fndecl(stmt); ++ if (fndecl == NULL_TREE) ++ continue; ++ if (TREE_CODE(fndecl) != FUNCTION_DECL) ++ continue; ++ ++ // is it a call to k*alloc ++ fnname = DECL_NAME_POINTER(fndecl); ++ if (!is_kalloc(fnname)) ++ continue; ++ ++ // is the size arg const or the result of a simple const assignment ++ size = gimple_call_arg(stmt, 0); ++ while (true) { ++ expanded_location xloc; ++ size_t size_val; ++ ++ if (TREE_CONSTANT(size)) { ++ xloc = expand_location(gimple_location(stmt)); ++ if (!xloc.file) ++ xloc = expand_location(DECL_SOURCE_LOCATION(current_function_decl)); ++ size_val = TREE_INT_CST_LOW(size); ++ fprintf(stderr, "kallocsize: %8zu %8zx %s %s:%u\n", size_val, size_val, fnname, xloc.file, xloc.line); ++ break; ++ } ++ ++ if (TREE_CODE(size) != SSA_NAME) ++ break; ++ stmt = SSA_NAME_DEF_STMT(size); ++//debug_gimple_stmt(stmt); ++//debug_tree(size); ++ if (!stmt || !is_gimple_assign(stmt)) ++ break; ++ if (gimple_num_ops(stmt) != 2) ++ break; ++ size = gimple_assign_rhs1(stmt); ++ } ++//print_gimple_stmt(stderr, call_stmt, 0, TDF_LINENO); ++//debug_tree(gimple_call_fn(call_stmt)); ++//print_node(stderr, "pax", fndecl, 4); ++ } ++ } ++ ++ return 0; ++} ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++static const struct pass_data kallocstat_pass_data = { ++#else ++static struct gimple_opt_pass kallocstat_pass = { ++ .pass = { ++#endif ++ .type = GIMPLE_PASS, ++ .name = "kallocstat", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 ++ .has_gate = false, ++ .has_execute = true, ++#else ++ .gate = NULL, ++ .execute = execute_kallocstat, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = 0, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = 0 ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++class kallocstat_pass : public gimple_opt_pass { ++public: ++ kallocstat_pass() : gimple_opt_pass(kallocstat_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return execute_kallocstat(); } ++#else ++ unsigned int execute() { return execute_kallocstat(); } ++#endif ++}; ++} ++ ++static opt_pass *make_kallocstat_pass(void) ++{ ++ return new kallocstat_pass(); ++} ++#else ++static struct opt_pass *make_kallocstat_pass(void) ++{ ++ return &kallocstat_pass.pass; ++} ++#endif ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ const char * const plugin_name = plugin_info->base_name; ++ struct register_pass_info kallocstat_pass_info; ++ ++ kallocstat_pass_info.pass = make_kallocstat_pass(); ++ kallocstat_pass_info.reference_pass_name = "ssa"; ++ kallocstat_pass_info.ref_pass_instance_number = 1; ++ kallocstat_pass_info.pos_op = PASS_POS_INSERT_AFTER; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &kallocstat_plugin_info); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &kallocstat_pass_info); ++ ++ return 0; ++} +diff --git a/tools/gcc/kernexec_plugin.c b/tools/gcc/kernexec_plugin.c +new file mode 100644 +index 0000000..b0d8255 +--- /dev/null ++++ b/tools/gcc/kernexec_plugin.c +@@ -0,0 +1,547 @@ ++/* ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> ++ * Licensed under the GPL v2 ++ * ++ * Note: the choice of the license means that the compilation process is ++ * NOT 'eligible' as defined by gcc's library exception to the GPL v3, ++ * but for the kernel it doesn't matter since it doesn't link against ++ * any of the gcc libraries ++ * ++ * gcc plugin to make KERNEXEC/amd64 almost as good as it is on i386 ++ * ++ * TODO: ++ * ++ * BUGS: ++ * - none known ++ */ ++ ++#include "gcc-common.h" ++ ++int plugin_is_GPL_compatible; ++ ++static struct plugin_info kernexec_plugin_info = { ++ .version = "201401260140", ++ .help = "method=[bts|or]\tinstrumentation method\n" ++}; ++ ++static void (*kernexec_instrument_fptr)(gimple_stmt_iterator *); ++static void (*kernexec_instrument_retaddr)(rtx); ++ ++/* ++ * add special KERNEXEC instrumentation: reload %r12 after it has been clobbered ++ */ ++static void kernexec_reload_fptr_mask(gimple_stmt_iterator *gsi) ++{ ++ gasm *asm_movabs_stmt; ++ ++ // build asm volatile("movabs $0x8000000000000000, %%r12\n\t" : : : ); ++ asm_movabs_stmt = gimple_build_asm_vec("movabs $0x8000000000000000, %%r12\n\t", NULL, NULL, NULL, NULL); ++ gimple_asm_set_volatile(asm_movabs_stmt, true); ++ gsi_insert_after(gsi, asm_movabs_stmt, GSI_CONTINUE_LINKING); ++ update_stmt(asm_movabs_stmt); ++} ++ ++/* ++ * find all asm() stmts that clobber r12 and add a reload of r12 ++ */ ++static unsigned int execute_kernexec_reload(void) ++{ ++ basic_block bb; ++ ++ // 1. loop through BBs and GIMPLE statements ++ FOR_EACH_BB_FN(bb, cfun) { ++ gimple_stmt_iterator gsi; ++ ++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { ++ // gimple match: __asm__ ("" : : : "r12"); ++ gimple stmt; ++ gasm *asm_stmt; ++ size_t nclobbers; ++ ++ // is it an asm ... ++ stmt = gsi_stmt(gsi); ++ if (gimple_code(stmt) != GIMPLE_ASM) ++ continue; ++ ++ asm_stmt = as_a_gasm(stmt); ++ ++ // ... clobbering r12 ++ nclobbers = gimple_asm_nclobbers(asm_stmt); ++ while (nclobbers--) { ++ tree op = gimple_asm_clobber_op(asm_stmt, nclobbers); ++ if (strcmp(TREE_STRING_POINTER(TREE_VALUE(op)), "r12")) ++ continue; ++ kernexec_reload_fptr_mask(&gsi); ++//print_gimple_stmt(stderr, asm_stmt, 0, TDF_LINENO); ++ break; ++ } ++ } ++ } ++ ++ return 0; ++} ++ ++/* ++ * add special KERNEXEC instrumentation: force MSB of fptr to 1, which will produce ++ * a non-canonical address from a userland ptr and will just trigger a GPF on dereference ++ */ ++static void kernexec_instrument_fptr_bts(gimple_stmt_iterator *gsi) ++{ ++ gimple assign_intptr, assign_new_fptr; ++ gcall *call_stmt; ++ tree intptr, orptr, old_fptr, new_fptr, kernexec_mask; ++ ++ call_stmt = as_a_gcall(gsi_stmt(*gsi)); ++ old_fptr = gimple_call_fn(call_stmt); ++ ++ // create temporary unsigned long variable used for bitops and cast fptr to it ++ intptr = create_tmp_var(long_unsigned_type_node, "kernexec_bts"); ++ add_referenced_var(intptr); ++ intptr = make_ssa_name(intptr, NULL); ++ assign_intptr = gimple_build_assign(intptr, fold_convert(long_unsigned_type_node, old_fptr)); ++ SSA_NAME_DEF_STMT(intptr) = assign_intptr; ++ gsi_insert_before(gsi, assign_intptr, GSI_SAME_STMT); ++ update_stmt(assign_intptr); ++ ++ // apply logical or to temporary unsigned long and bitmask ++ kernexec_mask = build_int_cstu(long_long_unsigned_type_node, 0x8000000000000000LL); ++// kernexec_mask = build_int_cstu(long_long_unsigned_type_node, 0xffffffff80000000LL); ++ orptr = fold_build2(BIT_IOR_EXPR, long_long_unsigned_type_node, intptr, kernexec_mask); ++ intptr = make_ssa_name(SSA_NAME_VAR(intptr), NULL); ++ assign_intptr = gimple_build_assign(intptr, orptr); ++ SSA_NAME_DEF_STMT(intptr) = assign_intptr; ++ gsi_insert_before(gsi, assign_intptr, GSI_SAME_STMT); ++ update_stmt(assign_intptr); ++ ++ // cast temporary unsigned long back to a temporary fptr variable ++ new_fptr = create_tmp_var(TREE_TYPE(old_fptr), "kernexec_fptr"); ++ add_referenced_var(new_fptr); ++ new_fptr = make_ssa_name(new_fptr, NULL); ++ assign_new_fptr = gimple_build_assign(new_fptr, fold_convert(TREE_TYPE(old_fptr), intptr)); ++ SSA_NAME_DEF_STMT(new_fptr) = assign_new_fptr; ++ gsi_insert_before(gsi, assign_new_fptr, GSI_SAME_STMT); ++ update_stmt(assign_new_fptr); ++ ++ // replace call stmt fn with the new fptr ++ gimple_call_set_fn(call_stmt, new_fptr); ++ update_stmt(call_stmt); ++} ++ ++static void kernexec_instrument_fptr_or(gimple_stmt_iterator *gsi) ++{ ++ gasm *asm_or_stmt; ++ gcall *call_stmt; ++ tree old_fptr, new_fptr, input, output; ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC(tree, gc) *inputs = NULL; ++ VEC(tree, gc) *outputs = NULL; ++#else ++ vec<tree, va_gc> *inputs = NULL; ++ vec<tree, va_gc> *outputs = NULL; ++#endif ++ ++ call_stmt = as_a_gcall(gsi_stmt(*gsi)); ++ old_fptr = gimple_call_fn(call_stmt); ++ ++ // create temporary fptr variable ++ new_fptr = create_tmp_var(TREE_TYPE(old_fptr), "kernexec_or"); ++ add_referenced_var(new_fptr); ++ new_fptr = make_ssa_name(new_fptr, NULL); ++ ++ // build asm volatile("orq %%r12, %0\n\t" : "=r"(new_fptr) : "0"(old_fptr)); ++ input = build_tree_list(NULL_TREE, build_string(2, "0")); ++ input = chainon(NULL_TREE, build_tree_list(input, old_fptr)); ++ output = build_tree_list(NULL_TREE, build_string(3, "=r")); ++ output = chainon(NULL_TREE, build_tree_list(output, new_fptr)); ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC_safe_push(tree, gc, inputs, input); ++ VEC_safe_push(tree, gc, outputs, output); ++#else ++ vec_safe_push(inputs, input); ++ vec_safe_push(outputs, output); ++#endif ++ asm_or_stmt = gimple_build_asm_vec("orq %%r12, %0\n\t", inputs, outputs, NULL, NULL); ++ SSA_NAME_DEF_STMT(new_fptr) = asm_or_stmt; ++ gimple_asm_set_volatile(asm_or_stmt, true); ++ gsi_insert_before(gsi, asm_or_stmt, GSI_SAME_STMT); ++ update_stmt(asm_or_stmt); ++ ++ // replace call stmt fn with the new fptr ++ gimple_call_set_fn(call_stmt, new_fptr); ++ update_stmt(call_stmt); ++} ++ ++/* ++ * find all C level function pointer dereferences and forcibly set the highest bit of the pointer ++ */ ++static unsigned int execute_kernexec_fptr(void) ++{ ++ basic_block bb; ++ ++ // 1. loop through BBs and GIMPLE statements ++ FOR_EACH_BB_FN(bb, cfun) { ++ gimple_stmt_iterator gsi; ++ ++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { ++ // gimple match: h_1 = get_fptr (); D.2709_3 = h_1 (x_2(D)); ++ tree fn; ++ gimple stmt; ++ gcall *call_stmt; ++ ++ // is it a call ... ++ stmt = gsi_stmt(gsi); ++ if (!is_gimple_call(stmt)) ++ continue; ++ call_stmt = as_a_gcall(stmt); ++ fn = gimple_call_fn(call_stmt); ++ if (TREE_CODE(fn) == ADDR_EXPR) ++ continue; ++ if (TREE_CODE(fn) != SSA_NAME) ++ gcc_unreachable(); ++ ++ // ... through a function pointer ++ if (SSA_NAME_VAR(fn) != NULL_TREE) { ++ fn = SSA_NAME_VAR(fn); ++ if (TREE_CODE(fn) != VAR_DECL && TREE_CODE(fn) != PARM_DECL) { ++ debug_tree(fn); ++ gcc_unreachable(); ++ } ++ } ++ fn = TREE_TYPE(fn); ++ if (TREE_CODE(fn) != POINTER_TYPE) ++ continue; ++ fn = TREE_TYPE(fn); ++ if (TREE_CODE(fn) != FUNCTION_TYPE) ++ continue; ++ ++ kernexec_instrument_fptr(&gsi); ++ ++//debug_tree(gimple_call_fn(call_stmt)); ++//print_gimple_stmt(stderr, call_stmt, 0, TDF_LINENO); ++ } ++ } ++ ++ return 0; ++} ++ ++// add special KERNEXEC instrumentation: btsq $63,(%rsp) just before retn ++static void kernexec_instrument_retaddr_bts(rtx insn) ++{ ++ rtx btsq; ++ rtvec argvec, constraintvec, labelvec; ++ int line; ++ ++ // create asm volatile("btsq $63,(%%rsp)":::) ++ argvec = rtvec_alloc(0); ++ constraintvec = rtvec_alloc(0); ++ labelvec = rtvec_alloc(0); ++ line = expand_location(RTL_LOCATION(insn)).line; ++ btsq = gen_rtx_ASM_OPERANDS(VOIDmode, "btsq $63,(%%rsp)", empty_string, 0, argvec, constraintvec, labelvec, line); ++ MEM_VOLATILE_P(btsq) = 1; ++// RTX_FRAME_RELATED_P(btsq) = 1; // not for ASM_OPERANDS ++ emit_insn_before(btsq, insn); ++} ++ ++// add special KERNEXEC instrumentation: orq %r12,(%rsp) just before retn ++static void kernexec_instrument_retaddr_or(rtx insn) ++{ ++ rtx orq; ++ rtvec argvec, constraintvec, labelvec; ++ int line; ++ ++ // create asm volatile("orq %%r12,(%%rsp)":::) ++ argvec = rtvec_alloc(0); ++ constraintvec = rtvec_alloc(0); ++ labelvec = rtvec_alloc(0); ++ line = expand_location(RTL_LOCATION(insn)).line; ++ orq = gen_rtx_ASM_OPERANDS(VOIDmode, "orq %%r12,(%%rsp)", empty_string, 0, argvec, constraintvec, labelvec, line); ++ MEM_VOLATILE_P(orq) = 1; ++// RTX_FRAME_RELATED_P(orq) = 1; // not for ASM_OPERANDS ++ emit_insn_before(orq, insn); ++} ++ ++/* ++ * find all asm level function returns and forcibly set the highest bit of the return address ++ */ ++static unsigned int execute_kernexec_retaddr(void) ++{ ++ rtx_insn *insn; ++ ++// if (stack_realign_drap) ++// inform(DECL_SOURCE_LOCATION(current_function_decl), "drap detected in %s\n", IDENTIFIER_POINTER(DECL_NAME(current_function_decl))); ++ ++ // 1. find function returns ++ for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) { ++ // rtl match: (jump_insn 41 40 42 2 (return) fptr.c:42 634 {return_internal} (nil)) ++ // (jump_insn 12 9 11 2 (parallel [ (return) (unspec [ (0) ] UNSPEC_REP) ]) fptr.c:46 635 {return_internal_long} (nil)) ++ // (jump_insn 97 96 98 6 (simple_return) fptr.c:50 -1 (nil) -> simple_return) ++ rtx body; ++ ++ // is it a retn ++ if (!JUMP_P(insn)) ++ continue; ++ body = PATTERN(insn); ++ if (GET_CODE(body) == PARALLEL) ++ body = XVECEXP(body, 0, 0); ++ if (!ANY_RETURN_P(body)) ++ continue; ++ kernexec_instrument_retaddr(insn); ++ } ++ ++// print_simple_rtl(stderr, get_insns()); ++// print_rtl(stderr, get_insns()); ++ ++ return 0; ++} ++ ++static bool kernexec_cmodel_check(void) ++{ ++ tree section; ++ ++ if (ix86_cmodel != CM_KERNEL) ++ return false; ++ ++ section = lookup_attribute("section", DECL_ATTRIBUTES(current_function_decl)); ++ if (!section || !TREE_VALUE(section)) ++ return true; ++ ++ section = TREE_VALUE(TREE_VALUE(section)); ++ if (strncmp(TREE_STRING_POINTER(section), ".vsyscall_", 10)) ++ return true; ++ ++ return false; ++} ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++static const struct pass_data kernexec_reload_pass_data = { ++#else ++static struct gimple_opt_pass kernexec_reload_pass = { ++ .pass = { ++#endif ++ .type = GIMPLE_PASS, ++ .name = "kernexec_reload", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 ++ .has_gate = true, ++ .has_execute = true, ++#else ++ .gate = kernexec_cmodel_check, ++ .execute = execute_kernexec_reload, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = 0, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = TODO_verify_ssa | TODO_verify_stmts | TODO_dump_func | TODO_remove_unused_locals | TODO_update_ssa_no_phi ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++static const struct pass_data kernexec_fptr_pass_data = { ++#else ++static struct gimple_opt_pass kernexec_fptr_pass = { ++ .pass = { ++#endif ++ .type = GIMPLE_PASS, ++ .name = "kernexec_fptr", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 ++ .has_gate = true, ++ .has_execute = true, ++#else ++ .gate = kernexec_cmodel_check, ++ .execute = execute_kernexec_fptr, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = 0, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = TODO_verify_ssa | TODO_verify_stmts | TODO_dump_func | TODO_remove_unused_locals | TODO_update_ssa_no_phi ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++static const struct pass_data kernexec_retaddr_pass_data = { ++#else ++static struct rtl_opt_pass kernexec_retaddr_pass = { ++ .pass = { ++#endif ++ .type = RTL_PASS, ++ .name = "kernexec_retaddr", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 ++ .has_gate = true, ++ .has_execute = true, ++#else ++ .gate = kernexec_cmodel_check, ++ .execute = execute_kernexec_retaddr, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = 0, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = TODO_dump_func | TODO_ggc_collect ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++class kernexec_reload_pass : public gimple_opt_pass { ++public: ++ kernexec_reload_pass() : gimple_opt_pass(kernexec_reload_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_reload(); } ++#else ++ bool gate() { return kernexec_cmodel_check(); } ++ unsigned int execute() { return execute_kernexec_reload(); } ++#endif ++}; ++ ++class kernexec_fptr_pass : public gimple_opt_pass { ++public: ++ kernexec_fptr_pass() : gimple_opt_pass(kernexec_fptr_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_fptr(); } ++#else ++ bool gate() { return kernexec_cmodel_check(); } ++ unsigned int execute() { return execute_kernexec_fptr(); } ++#endif ++}; ++ ++class kernexec_retaddr_pass : public rtl_opt_pass { ++public: ++ kernexec_retaddr_pass() : rtl_opt_pass(kernexec_retaddr_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_retaddr(); } ++#else ++ bool gate() { return kernexec_cmodel_check(); } ++ unsigned int execute() { return execute_kernexec_retaddr(); } ++#endif ++}; ++} ++ ++static opt_pass *make_kernexec_reload_pass(void) ++{ ++ return new kernexec_reload_pass(); ++} ++ ++static opt_pass *make_kernexec_fptr_pass(void) ++{ ++ return new kernexec_fptr_pass(); ++} ++ ++static opt_pass *make_kernexec_retaddr_pass(void) ++{ ++ return new kernexec_retaddr_pass(); ++} ++#else ++static struct opt_pass *make_kernexec_reload_pass(void) ++{ ++ return &kernexec_reload_pass.pass; ++} ++ ++static struct opt_pass *make_kernexec_fptr_pass(void) ++{ ++ return &kernexec_fptr_pass.pass; ++} ++ ++static struct opt_pass *make_kernexec_retaddr_pass(void) ++{ ++ return &kernexec_retaddr_pass.pass; ++} ++#endif ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ const char * const plugin_name = plugin_info->base_name; ++ const int argc = plugin_info->argc; ++ const struct plugin_argument * const argv = plugin_info->argv; ++ int i; ++ struct register_pass_info kernexec_reload_pass_info; ++ struct register_pass_info kernexec_fptr_pass_info; ++ struct register_pass_info kernexec_retaddr_pass_info; ++ ++ kernexec_reload_pass_info.pass = make_kernexec_reload_pass(); ++ kernexec_reload_pass_info.reference_pass_name = "ssa"; ++ kernexec_reload_pass_info.ref_pass_instance_number = 1; ++ kernexec_reload_pass_info.pos_op = PASS_POS_INSERT_AFTER; ++ ++ kernexec_fptr_pass_info.pass = make_kernexec_fptr_pass(); ++ kernexec_fptr_pass_info.reference_pass_name = "ssa"; ++ kernexec_fptr_pass_info.ref_pass_instance_number = 1; ++ kernexec_fptr_pass_info.pos_op = PASS_POS_INSERT_AFTER; ++ ++ kernexec_retaddr_pass_info.pass = make_kernexec_retaddr_pass(); ++ kernexec_retaddr_pass_info.reference_pass_name = "pro_and_epilogue"; ++ kernexec_retaddr_pass_info.ref_pass_instance_number = 1; ++ kernexec_retaddr_pass_info.pos_op = PASS_POS_INSERT_AFTER; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &kernexec_plugin_info); ++ ++ if (TARGET_64BIT == 0) ++ return 0; ++ ++ for (i = 0; i < argc; ++i) { ++ if (!strcmp(argv[i].key, "method")) { ++ if (!argv[i].value) { ++ error(G_("no value supplied for option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ continue; ++ } ++ if (!strcmp(argv[i].value, "bts")) { ++ kernexec_instrument_fptr = kernexec_instrument_fptr_bts; ++ kernexec_instrument_retaddr = kernexec_instrument_retaddr_bts; ++ } else if (!strcmp(argv[i].value, "or")) { ++ kernexec_instrument_fptr = kernexec_instrument_fptr_or; ++ kernexec_instrument_retaddr = kernexec_instrument_retaddr_or; ++ fix_register("r12", 1, 1); ++ } else ++ error(G_("invalid option argument '-fplugin-arg-%s-%s=%s'"), plugin_name, argv[i].key, argv[i].value); ++ continue; ++ } ++ error(G_("unkown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ } ++ if (!kernexec_instrument_fptr || !kernexec_instrument_retaddr) ++ error(G_("no instrumentation method was selected via '-fplugin-arg-%s-method'"), plugin_name); ++ ++ if (kernexec_instrument_fptr == kernexec_instrument_fptr_or) ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &kernexec_reload_pass_info); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &kernexec_fptr_pass_info); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &kernexec_retaddr_pass_info); ++ ++ return 0; ++} +diff --git a/tools/gcc/latent_entropy_plugin.c b/tools/gcc/latent_entropy_plugin.c +new file mode 100644 +index 0000000..ac6f9b4 +--- /dev/null ++++ b/tools/gcc/latent_entropy_plugin.c +@@ -0,0 +1,474 @@ ++/* ++ * Copyright 2012-2015 by the PaX Team <pageexec@freemail.hu> ++ * Licensed under the GPL v2 ++ * ++ * Note: the choice of the license means that the compilation process is ++ * NOT 'eligible' as defined by gcc's library exception to the GPL v3, ++ * but for the kernel it doesn't matter since it doesn't link against ++ * any of the gcc libraries ++ * ++ * gcc plugin to help generate a little bit of entropy from program state, ++ * used throughout the uptime of the kernel ++ * ++ * TODO: ++ * - add ipa pass to identify not explicitly marked candidate functions ++ * - mix in more program state (function arguments/return values, loop variables, etc) ++ * - more instrumentation control via attribute parameters ++ * ++ * BUGS: ++ * - none known ++ */ ++ ++#include "gcc-common.h" ++ ++int plugin_is_GPL_compatible; ++ ++static GTY(()) tree latent_entropy_decl; ++ ++static struct plugin_info latent_entropy_plugin_info = { ++ .version = "201504282240", ++ .help = NULL ++}; ++ ++static unsigned HOST_WIDE_INT seed; ++static unsigned HOST_WIDE_INT get_random_const(void) ++{ ++ unsigned int i; ++ unsigned HOST_WIDE_INT ret = 0; ++ ++ for (i = 0; i < 8 * sizeof ret; i++) { ++ ret = (ret << 1) | (seed & 1); ++ seed >>= 1; ++ if (ret & 1) ++ seed ^= 0xD800000000000000ULL; ++ } ++ ++ return ret; ++} ++ ++static tree handle_latent_entropy_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs) ++{ ++ tree type; ++ unsigned long long mask; ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC(constructor_elt, gc) *vals; ++#else ++ vec<constructor_elt, va_gc> *vals; ++#endif ++ ++ switch (TREE_CODE(*node)) { ++ default: ++ *no_add_attrs = true; ++ error("%qE attribute only applies to functions and variables", name); ++ break; ++ ++ case VAR_DECL: ++ if (DECL_INITIAL(*node)) { ++ *no_add_attrs = true; ++ error("variable %qD with %qE attribute must not be initialized", *node, name); ++ break; ++ } ++ ++ if (!TREE_STATIC(*node)) { ++ *no_add_attrs = true; ++ error("variable %qD with %qE attribute must not be local", *node, name); ++ break; ++ } ++ ++ type = TREE_TYPE(*node); ++ switch (TREE_CODE(type)) { ++ default: ++ *no_add_attrs = true; ++ error("variable %qD with %qE attribute must be an integer or a fixed length integer array type or a fixed sized structure with integer fields", *node, name); ++ break; ++ ++ case RECORD_TYPE: { ++ tree field; ++ unsigned int nelt = 0; ++ ++ for (field = TYPE_FIELDS(type); field; nelt++, field = TREE_CHAIN(field)) { ++ tree fieldtype; ++ ++ fieldtype = TREE_TYPE(field); ++ if (TREE_CODE(fieldtype) != INTEGER_TYPE) { ++ *no_add_attrs = true; ++ error("structure variable %qD with %qE attribute has a non-integer field %qE", *node, name, field); ++ break; ++ } ++ } ++ ++ if (field) ++ break; ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ vals = VEC_alloc(constructor_elt, gc, nelt); ++#else ++ vec_alloc(vals, nelt); ++#endif ++ ++ for (field = TYPE_FIELDS(type); field; field = TREE_CHAIN(field)) { ++ tree fieldtype; ++ ++ fieldtype = TREE_TYPE(field); ++ mask = 1ULL << (TREE_INT_CST_LOW(TYPE_SIZE(fieldtype)) - 1); ++ mask = 2 * (mask - 1) + 1; ++ ++ if (TYPE_UNSIGNED(fieldtype)) ++ CONSTRUCTOR_APPEND_ELT(vals, field, build_int_cstu(fieldtype, mask & get_random_const())); ++ else ++ CONSTRUCTOR_APPEND_ELT(vals, field, build_int_cst(fieldtype, mask & get_random_const())); ++ } ++ ++ DECL_INITIAL(*node) = build_constructor(type, vals); ++//debug_tree(DECL_INITIAL(*node)); ++ break; ++ } ++ ++ case INTEGER_TYPE: ++ mask = 1ULL << (TREE_INT_CST_LOW(TYPE_SIZE(type)) - 1); ++ mask = 2 * (mask - 1) + 1; ++ ++ if (TYPE_UNSIGNED(type)) ++ DECL_INITIAL(*node) = build_int_cstu(type, mask & get_random_const()); ++ else ++ DECL_INITIAL(*node) = build_int_cst(type, mask & get_random_const()); ++ break; ++ ++ case ARRAY_TYPE: { ++ tree elt_type, array_size, elt_size; ++ unsigned int i, nelt; ++ ++ elt_type = TREE_TYPE(type); ++ elt_size = TYPE_SIZE_UNIT(TREE_TYPE(type)); ++ array_size = TYPE_SIZE_UNIT(type); ++ ++ if (TREE_CODE(elt_type) != INTEGER_TYPE || !array_size || TREE_CODE(array_size) != INTEGER_CST) { ++ *no_add_attrs = true; ++ error("array variable %qD with %qE attribute must be a fixed length integer array type", *node, name); ++ break; ++ } ++ ++ nelt = TREE_INT_CST_LOW(array_size) / TREE_INT_CST_LOW(elt_size); ++#if BUILDING_GCC_VERSION <= 4007 ++ vals = VEC_alloc(constructor_elt, gc, nelt); ++#else ++ vec_alloc(vals, nelt); ++#endif ++ ++ mask = 1ULL << (TREE_INT_CST_LOW(TYPE_SIZE(elt_type)) - 1); ++ mask = 2 * (mask - 1) + 1; ++ ++ for (i = 0; i < nelt; i++) ++ if (TYPE_UNSIGNED(elt_type)) ++ CONSTRUCTOR_APPEND_ELT(vals, size_int(i), build_int_cstu(elt_type, mask & get_random_const())); ++ else ++ CONSTRUCTOR_APPEND_ELT(vals, size_int(i), build_int_cst(elt_type, mask & get_random_const())); ++ ++ DECL_INITIAL(*node) = build_constructor(type, vals); ++//debug_tree(DECL_INITIAL(*node)); ++ break; ++ } ++ } ++ break; ++ ++ case FUNCTION_DECL: ++ break; ++ } ++ ++ return NULL_TREE; ++} ++ ++static struct attribute_spec latent_entropy_attr = { ++ .name = "latent_entropy", ++ .min_length = 0, ++ .max_length = 0, ++ .decl_required = true, ++ .type_required = false, ++ .function_type_required = false, ++ .handler = handle_latent_entropy_attribute, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = false ++#endif ++}; ++ ++static void register_attributes(void *event_data, void *data) ++{ ++ register_attribute(&latent_entropy_attr); ++} ++ ++static bool gate_latent_entropy(void) ++{ ++ // don't bother with noreturn functions for now ++ if (TREE_THIS_VOLATILE(current_function_decl)) ++ return false; ++ ++ // gcc-4.5 doesn't discover some trivial noreturn functions ++ if (EDGE_COUNT(EXIT_BLOCK_PTR_FOR_FN(cfun)->preds) == 0) ++ return false; ++ ++ return lookup_attribute("latent_entropy", DECL_ATTRIBUTES(current_function_decl)) != NULL_TREE; ++} ++ ++static enum tree_code get_op(tree *rhs) ++{ ++ static enum tree_code op; ++ unsigned HOST_WIDE_INT random_const; ++ ++ random_const = get_random_const(); ++ ++ switch (op) { ++ case BIT_XOR_EXPR: ++ op = PLUS_EXPR; ++ break; ++ ++ case PLUS_EXPR: ++ if (rhs) { ++ op = LROTATE_EXPR; ++ random_const &= HOST_BITS_PER_WIDE_INT - 1; ++ break; ++ } ++ ++ case LROTATE_EXPR: ++ default: ++ op = BIT_XOR_EXPR; ++ break; ++ } ++ if (rhs) ++ *rhs = build_int_cstu(unsigned_intDI_type_node, random_const); ++ return op; ++} ++ ++static void perturb_local_entropy(basic_block bb, tree local_entropy) ++{ ++ gimple_stmt_iterator gsi; ++ gimple assign; ++ tree addxorrol, rhs; ++ enum tree_code op; ++ ++ op = get_op(&rhs); ++ addxorrol = fold_build2_loc(UNKNOWN_LOCATION, op, unsigned_intDI_type_node, local_entropy, rhs); ++ assign = gimple_build_assign(local_entropy, addxorrol); ++ gsi = gsi_after_labels(bb); ++ gsi_insert_before(&gsi, assign, GSI_NEW_STMT); ++ update_stmt(assign); ++//debug_bb(bb); ++} ++ ++static void perturb_latent_entropy(basic_block bb, tree rhs) ++{ ++ gimple_stmt_iterator gsi; ++ gimple assign; ++ tree addxorrol, temp; ++ ++ // 1. create temporary copy of latent_entropy ++ temp = create_tmp_var(unsigned_intDI_type_node, "temp_latent_entropy"); ++ add_referenced_var(temp); ++ ++ // 2. read... ++ temp = make_ssa_name(temp, NULL); ++ assign = gimple_build_assign(temp, latent_entropy_decl); ++ SSA_NAME_DEF_STMT(temp) = assign; ++ add_referenced_var(latent_entropy_decl); ++ gsi = gsi_after_labels(bb); ++ gsi_insert_after(&gsi, assign, GSI_NEW_STMT); ++ update_stmt(assign); ++ ++ // 3. ...modify... ++ addxorrol = fold_build2_loc(UNKNOWN_LOCATION, get_op(NULL), unsigned_intDI_type_node, temp, rhs); ++ temp = make_ssa_name(SSA_NAME_VAR(temp), NULL); ++ assign = gimple_build_assign(temp, addxorrol); ++ SSA_NAME_DEF_STMT(temp) = assign; ++ gsi_insert_after(&gsi, assign, GSI_NEW_STMT); ++ update_stmt(assign); ++ ++ // 4. ...write latent_entropy ++ assign = gimple_build_assign(latent_entropy_decl, temp); ++ gsi_insert_after(&gsi, assign, GSI_NEW_STMT); ++ update_stmt(assign); ++} ++ ++static unsigned int execute_latent_entropy(void) ++{ ++ basic_block bb; ++ gimple assign; ++ gimple_stmt_iterator gsi; ++ tree local_entropy; ++ ++ if (!latent_entropy_decl) { ++#if BUILDING_GCC_VERSION >= 4009 ++ varpool_node *node; ++#else ++ struct varpool_node *node; ++#endif ++ ++ FOR_EACH_VARIABLE(node) { ++ tree var = NODE_DECL(node); ++ ++ if (DECL_NAME_LENGTH(var) < sizeof("latent_entropy") - 1) ++ continue; ++ if (strcmp(IDENTIFIER_POINTER(DECL_NAME(var)), "latent_entropy")) ++ continue; ++ latent_entropy_decl = var; ++// debug_tree(var); ++ break; ++ } ++ if (!latent_entropy_decl) { ++// debug_tree(current_function_decl); ++ return 0; ++ } ++ } ++ ++//fprintf(stderr, "latent_entropy: %s\n", IDENTIFIER_POINTER(DECL_NAME(current_function_decl))); ++ ++ // 1. create local entropy variable ++ local_entropy = create_tmp_var(unsigned_intDI_type_node, "local_entropy"); ++ add_referenced_var(local_entropy); ++ mark_sym_for_renaming(local_entropy); ++ ++ // 2. initialize local entropy variable ++ bb = split_block_after_labels(ENTRY_BLOCK_PTR_FOR_FN(cfun))->dest; ++ if (dom_info_available_p(CDI_DOMINATORS)) ++ set_immediate_dominator(CDI_DOMINATORS, bb, ENTRY_BLOCK_PTR_FOR_FN(cfun)); ++ gsi = gsi_start_bb(bb); ++ ++ assign = gimple_build_assign(local_entropy, build_int_cstu(unsigned_intDI_type_node, get_random_const())); ++// gimple_set_location(assign, loc); ++ gsi_insert_after(&gsi, assign, GSI_NEW_STMT); ++ update_stmt(assign); ++//debug_bb(bb); ++ gcc_assert(single_succ_p(bb)); ++ bb = single_succ(bb); ++ ++ // 3. instrument each BB with an operation on the local entropy variable ++ while (bb != EXIT_BLOCK_PTR_FOR_FN(cfun)) { ++ perturb_local_entropy(bb, local_entropy); ++//debug_bb(bb); ++ bb = bb->next_bb; ++ }; ++ ++ // 4. mix local entropy into the global entropy variable ++ gcc_assert(single_pred_p(EXIT_BLOCK_PTR_FOR_FN(cfun))); ++ perturb_latent_entropy(single_pred(EXIT_BLOCK_PTR_FOR_FN(cfun)), local_entropy); ++//debug_bb(single_pred(EXIT_BLOCK_PTR_FOR_FN(cfun))); ++ return 0; ++} ++ ++static void latent_entropy_start_unit(void *gcc_data, void *user_data) ++{ ++ tree latent_entropy_type; ++ ++ seed = get_random_seed(false); ++ ++ if (in_lto_p) ++ return; ++ ++ // extern volatile u64 latent_entropy ++ gcc_assert(TYPE_PRECISION(long_long_unsigned_type_node) == 64); ++ latent_entropy_type = build_qualified_type(long_long_unsigned_type_node, TYPE_QUALS(long_long_unsigned_type_node) | TYPE_QUAL_VOLATILE); ++ latent_entropy_decl = build_decl(UNKNOWN_LOCATION, VAR_DECL, get_identifier("latent_entropy"), latent_entropy_type); ++ ++ TREE_STATIC(latent_entropy_decl) = 1; ++ TREE_PUBLIC(latent_entropy_decl) = 1; ++ TREE_USED(latent_entropy_decl) = 1; ++ DECL_PRESERVE_P(latent_entropy_decl) = 1; ++ TREE_THIS_VOLATILE(latent_entropy_decl) = 1; ++ DECL_EXTERNAL(latent_entropy_decl) = 1; ++ DECL_ARTIFICIAL(latent_entropy_decl) = 1; ++ lang_hooks.decls.pushdecl(latent_entropy_decl); ++// DECL_ASSEMBLER_NAME(latent_entropy_decl); ++// varpool_finalize_decl(latent_entropy_decl); ++// varpool_mark_needed_node(latent_entropy_decl); ++} ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++static const struct pass_data latent_entropy_pass_data = { ++#else ++static struct gimple_opt_pass latent_entropy_pass = { ++ .pass = { ++#endif ++ .type = GIMPLE_PASS, ++ .name = "latent_entropy", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 ++ .has_gate = true, ++ .has_execute = true, ++#else ++ .gate = gate_latent_entropy, ++ .execute = execute_latent_entropy, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = PROP_gimple_leh | PROP_cfg, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, //TODO_verify_ssa | TODO_verify_flow | TODO_verify_stmts, ++ .todo_flags_finish = TODO_verify_ssa | TODO_verify_stmts | TODO_dump_func | TODO_update_ssa ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++class latent_entropy_pass : public gimple_opt_pass { ++public: ++ latent_entropy_pass() : gimple_opt_pass(latent_entropy_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_latent_entropy(); } ++ virtual unsigned int execute(function *) { return execute_latent_entropy(); } ++#else ++ bool gate() { return gate_latent_entropy(); } ++ unsigned int execute() { return execute_latent_entropy(); } ++#endif ++}; ++} ++ ++static opt_pass *make_latent_entropy_pass(void) ++{ ++ return new latent_entropy_pass(); ++} ++#else ++static struct opt_pass *make_latent_entropy_pass(void) ++{ ++ return &latent_entropy_pass.pass; ++} ++#endif ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ const char * const plugin_name = plugin_info->base_name; ++ struct register_pass_info latent_entropy_pass_info; ++ ++ latent_entropy_pass_info.pass = make_latent_entropy_pass(); ++ latent_entropy_pass_info.reference_pass_name = "optimized"; ++ latent_entropy_pass_info.ref_pass_instance_number = 1; ++ latent_entropy_pass_info.pos_op = PASS_POS_INSERT_BEFORE; ++ static const struct ggc_root_tab gt_ggc_r_gt_latent_entropy[] = { ++ { ++ .base = &latent_entropy_decl, ++ .nelt = 1, ++ .stride = sizeof(latent_entropy_decl), ++ .cb = >_ggc_mx_tree_node, ++ .pchw = >_pch_nx_tree_node ++ }, ++ LAST_GGC_ROOT_TAB ++ }; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &latent_entropy_plugin_info); ++ register_callback(plugin_name, PLUGIN_START_UNIT, &latent_entropy_start_unit, NULL); ++ register_callback(plugin_name, PLUGIN_REGISTER_GGC_ROOTS, NULL, (void *)>_ggc_r_gt_latent_entropy); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &latent_entropy_pass_info); ++ register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL); ++ ++ return 0; ++} +diff --git a/tools/gcc/randomize_layout_plugin.c b/tools/gcc/randomize_layout_plugin.c +new file mode 100644 +index 0000000..e1983c0 +--- /dev/null ++++ b/tools/gcc/randomize_layout_plugin.c +@@ -0,0 +1,917 @@ ++/* ++ * Copyright 2014,2015 by Open Source Security, Inc., Brad Spengler <spender@grsecurity.net> ++ * and PaX Team <pageexec@freemail.hu> ++ * Licensed under the GPL v2 ++ * ++ * Usage: ++ * $ # for 4.5/4.6/C based 4.7 ++ * $ gcc -I`gcc -print-file-name=plugin`/include -I`gcc -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o randomize_layout_plugin.so randomize_layout_plugin.c ++ * $ # for C++ based 4.7/4.8+ ++ * $ g++ -I`g++ -print-file-name=plugin`/include -I`g++ -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o randomize_layout_plugin.so randomize_layout_plugin.c ++ * $ gcc -fplugin=./randomize_layout_plugin.so test.c -O2 ++ */ ++ ++#include "gcc-common.h" ++#include "randomize_layout_seed.h" ++ ++#if BUILDING_GCC_MAJOR < 4 || (BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR < 6) || \ ++ (BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR == 6 && BUILDING_GCC_PATCHLEVEL < 4) ++#error "The RANDSTRUCT plugin requires GCC 4.6.4 or newer." ++#endif ++ ++#define ORIG_TYPE_NAME(node) \ ++ (TYPE_NAME(TYPE_MAIN_VARIANT(node)) != NULL_TREE ? ((const unsigned char *)IDENTIFIER_POINTER(TYPE_NAME(TYPE_MAIN_VARIANT(node)))) : (const unsigned char *)"anonymous") ++ ++int plugin_is_GPL_compatible; ++ ++static int performance_mode; ++ ++static struct plugin_info randomize_layout_plugin_info = { ++ .version = "201402201816", ++ .help = "disable\t\t\tdo not activate plugin\n" ++ "performance-mode\tenable cacheline-aware layout randomization\n" ++}; ++ ++/* from old Linux dcache.h */ ++static inline unsigned long ++partial_name_hash(unsigned long c, unsigned long prevhash) ++{ ++ return (prevhash + (c << 4) + (c >> 4)) * 11; ++} ++static inline unsigned int ++name_hash(const unsigned char *name) ++{ ++ unsigned long hash = 0; ++ unsigned int len = strlen((const char *)name); ++ while (len--) ++ hash = partial_name_hash(*name++, hash); ++ return (unsigned int)hash; ++} ++ ++static tree handle_randomize_layout_attr(tree *node, tree name, tree args, int flags, bool *no_add_attrs) ++{ ++ tree type; ++ ++ *no_add_attrs = true; ++ if (TREE_CODE(*node) == FUNCTION_DECL) { ++ error("%qE attribute does not apply to functions (%qF)", name, *node); ++ return NULL_TREE; ++ } ++ ++ if (TREE_CODE(*node) == PARM_DECL) { ++ error("%qE attribute does not apply to function parameters (%qD)", name, *node); ++ return NULL_TREE; ++ } ++ ++ if (TREE_CODE(*node) == VAR_DECL) { ++ error("%qE attribute does not apply to variables (%qD)", name, *node); ++ return NULL_TREE; ++ } ++ ++ if (TYPE_P(*node)) { ++ type = *node; ++ } else { ++ gcc_assert(TREE_CODE(*node) == TYPE_DECL); ++ type = TREE_TYPE(*node); ++ } ++ ++ if (TREE_CODE(type) != RECORD_TYPE) { ++ error("%qE attribute used on %qT applies to struct types only", name, type); ++ return NULL_TREE; ++ } ++ ++ if (lookup_attribute(IDENTIFIER_POINTER(name), TYPE_ATTRIBUTES(type))) { ++ error("%qE attribute is already applied to the type %qT", name, type); ++ return NULL_TREE; ++ } ++ ++ *no_add_attrs = false; ++ ++ return NULL_TREE; ++} ++ ++/* set on complete types that we don't need to inspect further at all */ ++static tree handle_randomize_considered_attr(tree *node, tree name, tree args, int flags, bool *no_add_attrs) ++{ ++ *no_add_attrs = false; ++ return NULL_TREE; ++} ++ ++/* ++ * set on types that we've performed a shuffle on, to prevent re-shuffling ++ * this does not preclude us from inspecting its fields for potential shuffles ++ */ ++static tree handle_randomize_performed_attr(tree *node, tree name, tree args, int flags, bool *no_add_attrs) ++{ ++ *no_add_attrs = false; ++ return NULL_TREE; ++} ++ ++/* ++ * 64bit variant of Bob Jenkins' public domain PRNG ++ * 256 bits of internal state ++ */ ++ ++typedef unsigned long long u64; ++ ++typedef struct ranctx { u64 a; u64 b; u64 c; u64 d; } ranctx; ++ ++#define rot(x,k) (((x)<<(k))|((x)>>(64-(k)))) ++static u64 ranval(ranctx *x) { ++ u64 e = x->a - rot(x->b, 7); ++ x->a = x->b ^ rot(x->c, 13); ++ x->b = x->c + rot(x->d, 37); ++ x->c = x->d + e; ++ x->d = e + x->a; ++ return x->d; ++} ++ ++static void raninit(ranctx *x, u64 *seed) { ++ int i; ++ ++ x->a = seed[0]; ++ x->b = seed[1]; ++ x->c = seed[2]; ++ x->d = seed[3]; ++ ++ for (i=0; i < 30; ++i) ++ (void)ranval(x); ++} ++ ++static u64 shuffle_seed[4]; ++ ++struct partition_group { ++ tree tree_start; ++ unsigned long start; ++ unsigned long length; ++}; ++ ++static void partition_struct(tree *fields, unsigned long length, struct partition_group *size_groups, unsigned long *num_groups) ++{ ++ unsigned long i; ++ unsigned long accum_size = 0; ++ unsigned long accum_length = 0; ++ unsigned long group_idx = 0; ++ ++ gcc_assert(length < INT_MAX); ++ ++ memset(size_groups, 0, sizeof(struct partition_group) * length); ++ ++ for (i = 0; i < length; i++) { ++ if (size_groups[group_idx].tree_start == NULL_TREE) { ++ size_groups[group_idx].tree_start = fields[i]; ++ size_groups[group_idx].start = i; ++ accum_length = 0; ++ accum_size = 0; ++ } ++ accum_size += (unsigned long)int_size_in_bytes(TREE_TYPE(fields[i])); ++ accum_length++; ++ if (accum_size >= 64) { ++ size_groups[group_idx].length = accum_length; ++ accum_length = 0; ++ group_idx++; ++ } ++ } ++ ++ if (size_groups[group_idx].tree_start != NULL_TREE && ++ !size_groups[group_idx].length) { ++ size_groups[group_idx].length = accum_length; ++ group_idx++; ++ } ++ ++ *num_groups = group_idx; ++} ++ ++static void performance_shuffle(tree *newtree, unsigned long length, ranctx *prng_state) ++{ ++ unsigned long i, x; ++ struct partition_group size_group[length]; ++ unsigned long num_groups = 0; ++ unsigned long randnum; ++ ++ partition_struct(newtree, length, (struct partition_group *)&size_group, &num_groups); ++ for (i = num_groups - 1; i > 0; i--) { ++ struct partition_group tmp; ++ randnum = ranval(prng_state) % (i + 1); ++ tmp = size_group[i]; ++ size_group[i] = size_group[randnum]; ++ size_group[randnum] = tmp; ++ } ++ ++ for (x = 0; x < num_groups; x++) { ++ for (i = size_group[x].start + size_group[x].length - 1; i > size_group[x].start; i--) { ++ tree tmp; ++ if (DECL_BIT_FIELD_TYPE(newtree[i])) ++ continue; ++ randnum = ranval(prng_state) % (i + 1); ++ // we could handle this case differently if desired ++ if (DECL_BIT_FIELD_TYPE(newtree[randnum])) ++ continue; ++ tmp = newtree[i]; ++ newtree[i] = newtree[randnum]; ++ newtree[randnum] = tmp; ++ } ++ } ++} ++ ++static void full_shuffle(tree *newtree, unsigned long length, ranctx *prng_state) ++{ ++ unsigned long i, randnum; ++ ++ for (i = length - 1; i > 0; i--) { ++ tree tmp; ++ randnum = ranval(prng_state) % (i + 1); ++ tmp = newtree[i]; ++ newtree[i] = newtree[randnum]; ++ newtree[randnum] = tmp; ++ } ++} ++ ++/* modern in-place Fisher-Yates shuffle */ ++static void shuffle(const_tree type, tree *newtree, unsigned long length) ++{ ++ unsigned long i; ++ u64 seed[4]; ++ ranctx prng_state; ++ const unsigned char *structname; ++ ++ if (length == 0) ++ return; ++ ++ gcc_assert(TREE_CODE(type) == RECORD_TYPE); ++ ++ structname = ORIG_TYPE_NAME(type); ++ ++#ifdef __DEBUG_PLUGIN ++ fprintf(stderr, "Shuffling struct %s %p\n", (const char *)structname, type); ++#ifdef __DEBUG_VERBOSE ++ debug_tree((tree)type); ++#endif ++#endif ++ ++ for (i = 0; i < 4; i++) { ++ seed[i] = shuffle_seed[i]; ++ seed[i] ^= name_hash(structname); ++ } ++ ++ raninit(&prng_state, (u64 *)&seed); ++ ++ if (performance_mode) ++ performance_shuffle(newtree, length, &prng_state); ++ else ++ full_shuffle(newtree, length, &prng_state); ++} ++ ++static bool is_flexible_array(const_tree field) ++{ ++ const_tree fieldtype; ++ const_tree typesize; ++ const_tree elemtype; ++ const_tree elemsize; ++ ++ fieldtype = TREE_TYPE(field); ++ typesize = TYPE_SIZE(fieldtype); ++ ++ if (TREE_CODE(fieldtype) != ARRAY_TYPE) ++ return false; ++ ++ elemtype = TREE_TYPE(fieldtype); ++ elemsize = TYPE_SIZE(elemtype); ++ ++ /* size of type is represented in bits */ ++ ++ if (typesize == NULL_TREE && TYPE_DOMAIN(fieldtype) != NULL_TREE && ++ TYPE_MAX_VALUE(TYPE_DOMAIN(fieldtype)) == NULL_TREE) ++ return true; ++ ++ if (typesize != NULL_TREE && ++ (TREE_CONSTANT(typesize) && (!TREE_INT_CST_LOW(typesize) || ++ TREE_INT_CST_LOW(typesize) == TREE_INT_CST_LOW(elemsize)))) ++ return true; ++ ++ return false; ++} ++ ++static int relayout_struct(tree type) ++{ ++ unsigned long num_fields = (unsigned long)list_length(TYPE_FIELDS(type)); ++ unsigned long shuffle_length = num_fields; ++ tree field; ++ tree newtree[num_fields]; ++ unsigned long i; ++ tree list; ++ tree variant; ++ expanded_location xloc; ++ ++ if (TYPE_FIELDS(type) == NULL_TREE) ++ return 0; ++ ++ if (num_fields < 2) ++ return 0; ++ ++ gcc_assert(TREE_CODE(type) == RECORD_TYPE); ++ ++ gcc_assert(num_fields < INT_MAX); ++ ++ if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(type)) || ++ lookup_attribute("no_randomize_layout", TYPE_ATTRIBUTES(TYPE_MAIN_VARIANT(type)))) ++ return 0; ++ ++ /* Workaround for 3rd-party VirtualBox source that we can't modify ourselves */ ++ if (!strcmp((const char *)ORIG_TYPE_NAME(type), "INTNETTRUNKFACTORY") || ++ !strcmp((const char *)ORIG_TYPE_NAME(type), "RAWPCIFACTORY")) ++ return 0; ++ ++ /* throw out any structs in uapi */ ++ xloc = expand_location(DECL_SOURCE_LOCATION(TYPE_FIELDS(type))); ++ ++ if (strstr(xloc.file, "/uapi/")) ++ error(G_("attempted to randomize userland API struct %s"), ORIG_TYPE_NAME(type)); ++ ++ for (field = TYPE_FIELDS(type), i = 0; field; field = TREE_CHAIN(field), i++) { ++ gcc_assert(TREE_CODE(field) == FIELD_DECL); ++ newtree[i] = field; ++ } ++ ++ /* ++ * enforce that we don't randomize the layout of the last ++ * element of a struct if it's a 0 or 1-length array ++ * or a proper flexible array ++ */ ++ if (is_flexible_array(newtree[num_fields - 1])) ++ shuffle_length--; ++ ++ shuffle(type, (tree *)newtree, shuffle_length); ++ ++ /* ++ * set up a bogus anonymous struct field designed to error out on unnamed struct initializers ++ * as gcc provides no other way to detect such code ++ */ ++ list = make_node(FIELD_DECL); ++ TREE_CHAIN(list) = newtree[0]; ++ TREE_TYPE(list) = void_type_node; ++ DECL_SIZE(list) = bitsize_zero_node; ++ DECL_NONADDRESSABLE_P(list) = 1; ++ DECL_FIELD_BIT_OFFSET(list) = bitsize_zero_node; ++ DECL_SIZE_UNIT(list) = size_zero_node; ++ DECL_FIELD_OFFSET(list) = size_zero_node; ++ // to satisfy the constify plugin ++ TREE_READONLY(list) = 1; ++ ++ for (i = 0; i < num_fields - 1; i++) ++ TREE_CHAIN(newtree[i]) = newtree[i+1]; ++ TREE_CHAIN(newtree[num_fields - 1]) = NULL_TREE; ++ ++ for (variant = TYPE_MAIN_VARIANT(type); variant; variant = TYPE_NEXT_VARIANT(variant)) { ++ TYPE_FIELDS(variant) = list; ++ TYPE_ATTRIBUTES(variant) = copy_list(TYPE_ATTRIBUTES(variant)); ++ TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("randomize_performed"), NULL_TREE, TYPE_ATTRIBUTES(variant)); ++ // force a re-layout ++ TYPE_SIZE(variant) = NULL_TREE; ++ layout_type(variant); ++ } ++ ++ return 1; ++} ++ ++/* from constify plugin */ ++static const_tree get_field_type(const_tree field) ++{ ++ return strip_array_types(TREE_TYPE(field)); ++} ++ ++/* from constify plugin */ ++static bool is_fptr(const_tree fieldtype) ++{ ++ if (TREE_CODE(fieldtype) != POINTER_TYPE) ++ return false; ++ ++ return TREE_CODE(TREE_TYPE(fieldtype)) == FUNCTION_TYPE; ++} ++ ++/* derived from constify plugin */ ++static int is_pure_ops_struct(const_tree node) ++{ ++ const_tree field; ++ ++ gcc_assert(TREE_CODE(node) == RECORD_TYPE || TREE_CODE(node) == UNION_TYPE); ++ ++ for (field = TYPE_FIELDS(node); field; field = TREE_CHAIN(field)) { ++ const_tree fieldtype = get_field_type(field); ++ enum tree_code code = TREE_CODE(fieldtype); ++ ++ if (node == fieldtype) ++ continue; ++ ++ if (!is_fptr(fieldtype)) ++ return 0; ++ ++ if (code != RECORD_TYPE && code != UNION_TYPE) ++ continue; ++ ++ if (!is_pure_ops_struct(fieldtype)) ++ return 0; ++ } ++ ++ return 1; ++} ++ ++static void randomize_type(tree type) ++{ ++ tree variant; ++ ++ gcc_assert(TREE_CODE(type) == RECORD_TYPE); ++ ++ if (lookup_attribute("randomize_considered", TYPE_ATTRIBUTES(type))) ++ return; ++ ++ if (lookup_attribute("randomize_layout", TYPE_ATTRIBUTES(TYPE_MAIN_VARIANT(type))) || is_pure_ops_struct(type)) ++ relayout_struct(type); ++ ++ for (variant = TYPE_MAIN_VARIANT(type); variant; variant = TYPE_NEXT_VARIANT(variant)) { ++ TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type)); ++ TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("randomize_considered"), NULL_TREE, TYPE_ATTRIBUTES(type)); ++ } ++#ifdef __DEBUG_PLUGIN ++ fprintf(stderr, "Marking randomize_considered on struct %s\n", ORIG_TYPE_NAME(type)); ++#ifdef __DEBUG_VERBOSE ++ debug_tree(type); ++#endif ++#endif ++} ++ ++static void randomize_layout_finish_decl(void *event_data, void *data) ++{ ++ tree decl = (tree)event_data; ++ tree type; ++ ++ if (decl == NULL_TREE || decl == error_mark_node) ++ return; ++ ++ type = TREE_TYPE(decl); ++ ++ if (TREE_CODE(decl) != VAR_DECL) ++ return; ++ ++ if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE) ++ return; ++ ++ if (!lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(type))) ++ return; ++ ++ relayout_decl(decl); ++} ++ ++static void finish_type(void *event_data, void *data) ++{ ++ tree type = (tree)event_data; ++ ++ if (type == NULL_TREE || type == error_mark_node) ++ return; ++ ++ if (TREE_CODE(type) != RECORD_TYPE) ++ return; ++ ++ if (TYPE_FIELDS(type) == NULL_TREE) ++ return; ++ ++ if (lookup_attribute("randomize_considered", TYPE_ATTRIBUTES(type))) ++ return; ++ ++#ifdef __DEBUG_PLUGIN ++ fprintf(stderr, "Calling randomize_type on %s\n", ORIG_TYPE_NAME(type)); ++#endif ++#ifdef __DEBUG_VERBOSE ++ debug_tree(type); ++#endif ++ randomize_type(type); ++ ++ return; ++} ++ ++static struct attribute_spec randomize_layout_attr = { ++ .name = "randomize_layout", ++ // related to args ++ .min_length = 0, ++ .max_length = 0, ++ .decl_required = false, ++ // need type declaration ++ .type_required = true, ++ .function_type_required = false, ++ .handler = handle_randomize_layout_attr, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = true ++#endif ++}; ++ ++static struct attribute_spec no_randomize_layout_attr = { ++ .name = "no_randomize_layout", ++ // related to args ++ .min_length = 0, ++ .max_length = 0, ++ .decl_required = false, ++ // need type declaration ++ .type_required = true, ++ .function_type_required = false, ++ .handler = handle_randomize_layout_attr, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = true ++#endif ++}; ++ ++static struct attribute_spec randomize_considered_attr = { ++ .name = "randomize_considered", ++ // related to args ++ .min_length = 0, ++ .max_length = 0, ++ .decl_required = false, ++ // need type declaration ++ .type_required = true, ++ .function_type_required = false, ++ .handler = handle_randomize_considered_attr, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = false ++#endif ++}; ++ ++static struct attribute_spec randomize_performed_attr = { ++ .name = "randomize_performed", ++ // related to args ++ .min_length = 0, ++ .max_length = 0, ++ .decl_required = false, ++ // need type declaration ++ .type_required = true, ++ .function_type_required = false, ++ .handler = handle_randomize_performed_attr, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = false ++#endif ++}; ++ ++static void register_attributes(void *event_data, void *data) ++{ ++ register_attribute(&randomize_layout_attr); ++ register_attribute(&no_randomize_layout_attr); ++ register_attribute(&randomize_considered_attr); ++ register_attribute(&randomize_performed_attr); ++} ++ ++static void check_bad_casts_in_constructor(tree var, tree init) ++{ ++ unsigned HOST_WIDE_INT idx; ++ tree field, val; ++ tree field_type, val_type; ++ ++ FOR_EACH_CONSTRUCTOR_ELT(CONSTRUCTOR_ELTS(init), idx, field, val) { ++ if (TREE_CODE(val) == CONSTRUCTOR) { ++ check_bad_casts_in_constructor(var, val); ++ continue; ++ } ++ ++ /* pipacs' plugin creates franken-arrays that differ from those produced by ++ normal code which all have valid 'field' trees. work around this */ ++ if (field == NULL_TREE) ++ continue; ++ field_type = TREE_TYPE(field); ++ val_type = TREE_TYPE(val); ++ ++ if (TREE_CODE(field_type) != POINTER_TYPE || TREE_CODE(val_type) != POINTER_TYPE) ++ continue; ++ ++ if (field_type == val_type) ++ continue; ++ ++ field_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(field_type)))); ++ val_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(val_type)))); ++ ++ if (field_type == void_type_node) ++ continue; ++ if (field_type == val_type) ++ continue; ++ if (TREE_CODE(val_type) != RECORD_TYPE) ++ continue; ++ ++ if (!lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(val_type))) ++ continue; ++ inform(DECL_SOURCE_LOCATION(var), "found mismatched struct pointer types: %qT and %qT\n", TYPE_MAIN_VARIANT(field_type), TYPE_MAIN_VARIANT(val_type)); ++ } ++} ++ ++/* derived from the constify plugin */ ++static void check_global_variables(void *event_data, void *data) ++{ ++ struct varpool_node *node; ++ tree init; ++ ++ FOR_EACH_VARIABLE(node) { ++ tree var = NODE_DECL(node); ++ init = DECL_INITIAL(var); ++ if (init == NULL_TREE) ++ continue; ++ ++ if (TREE_CODE(init) != CONSTRUCTOR) ++ continue; ++ ++ check_bad_casts_in_constructor(var, init); ++ } ++} ++ ++static bool dominated_by_is_err(const_tree rhs, basic_block bb) ++{ ++ basic_block dom; ++ gimple dom_stmt; ++ gimple call_stmt; ++ const_tree dom_lhs; ++ const_tree poss_is_err_cond; ++ const_tree poss_is_err_func; ++ const_tree is_err_arg; ++ ++ dom = get_immediate_dominator(CDI_DOMINATORS, bb); ++ if (!dom) ++ return false; ++ ++ dom_stmt = last_stmt(dom); ++ if (!dom_stmt) ++ return false; ++ ++ if (gimple_code(dom_stmt) != GIMPLE_COND) ++ return false; ++ ++ if (gimple_cond_code(dom_stmt) != NE_EXPR) ++ return false; ++ ++ if (!integer_zerop(gimple_cond_rhs(dom_stmt))) ++ return false; ++ ++ poss_is_err_cond = gimple_cond_lhs(dom_stmt); ++ ++ if (TREE_CODE(poss_is_err_cond) != SSA_NAME) ++ return false; ++ ++ call_stmt = SSA_NAME_DEF_STMT(poss_is_err_cond); ++ ++ if (gimple_code(call_stmt) != GIMPLE_CALL) ++ return false; ++ ++ dom_lhs = gimple_get_lhs(call_stmt); ++ poss_is_err_func = gimple_call_fndecl(call_stmt); ++ if (!poss_is_err_func) ++ return false; ++ if (dom_lhs != poss_is_err_cond) ++ return false; ++ if (strcmp(DECL_NAME_POINTER(poss_is_err_func), "IS_ERR")) ++ return false; ++ ++ is_err_arg = gimple_call_arg(call_stmt, 0); ++ if (!is_err_arg) ++ return false; ++ ++ if (is_err_arg != rhs) ++ return false; ++ ++ return true; ++} ++ ++static void handle_local_var_initializers(void) ++{ ++ tree var; ++ unsigned int i; ++ ++ FOR_EACH_LOCAL_DECL(cfun, i, var) { ++ tree init = DECL_INITIAL(var); ++ if (!init) ++ continue; ++ if (TREE_CODE(init) != CONSTRUCTOR) ++ continue; ++ check_bad_casts_in_constructor(var, init); ++ } ++} ++ ++/* ++ * iterate over all statements to find "bad" casts: ++ * those where the address of the start of a structure is cast ++ * to a pointer of a structure of a different type, or a ++ * structure pointer type is cast to a different structure pointer type ++ */ ++static unsigned int find_bad_casts(void) ++{ ++ basic_block bb; ++ ++ handle_local_var_initializers(); ++ ++ FOR_ALL_BB_FN(bb, cfun) { ++ gimple_stmt_iterator gsi; ++ ++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { ++ gimple stmt; ++ const_tree lhs; ++ const_tree lhs_type; ++ const_tree rhs1; ++ const_tree rhs_type; ++ const_tree ptr_lhs_type; ++ const_tree ptr_rhs_type; ++ const_tree op0; ++ const_tree op0_type; ++ enum tree_code rhs_code; ++ ++ stmt = gsi_stmt(gsi); ++ ++#ifdef __DEBUG_PLUGIN ++#ifdef __DEBUG_VERBOSE ++ debug_gimple_stmt(stmt); ++ debug_tree(gimple_get_lhs(stmt)); ++#endif ++#endif ++ ++ if (gimple_code(stmt) != GIMPLE_ASSIGN) ++ continue; ++ ++#ifdef __DEBUG_PLUGIN ++#ifdef __DEBUG_VERBOSE ++ debug_tree(gimple_assign_rhs1(stmt)); ++#endif ++#endif ++ ++ rhs_code = gimple_assign_rhs_code(stmt); ++ ++ if (rhs_code != ADDR_EXPR && rhs_code != SSA_NAME) ++ continue; ++ ++ lhs = gimple_get_lhs(stmt); ++ lhs_type = TREE_TYPE(lhs); ++ rhs1 = gimple_assign_rhs1(stmt); ++ rhs_type = TREE_TYPE(rhs1); ++ ++ if (TREE_CODE(rhs_type) != POINTER_TYPE || ++ TREE_CODE(lhs_type) != POINTER_TYPE) ++ continue; ++ ++ ptr_lhs_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(lhs_type)))); ++ ptr_rhs_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(rhs_type)))); ++ ++ if (ptr_rhs_type == void_type_node) ++ continue; ++ ++ if (ptr_lhs_type == void_type_node) ++ continue; ++ ++ if (dominated_by_is_err(rhs1, bb)) ++ continue; ++ ++ if (TREE_CODE(ptr_rhs_type) != RECORD_TYPE) { ++#ifndef __DEBUG_PLUGIN ++ if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_lhs_type))) ++#endif ++ inform(gimple_location(stmt), "found mismatched struct pointer types: %qT and %qT\n", ptr_lhs_type, ptr_rhs_type); ++ continue; ++ } ++ ++ if (rhs_code == SSA_NAME && ptr_lhs_type == ptr_rhs_type) ++ continue; ++ ++ if (rhs_code == ADDR_EXPR) { ++ op0 = TREE_OPERAND(rhs1, 0); ++ ++ if (op0 == NULL_TREE) ++ continue; ++ ++ if (TREE_CODE(op0) != VAR_DECL) ++ continue; ++ ++ op0_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(op0)))); ++ if (op0_type == ptr_lhs_type) ++ continue; ++ ++#ifndef __DEBUG_PLUGIN ++ if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(op0_type))) ++#endif ++ inform(gimple_location(stmt), "found mismatched struct pointer types: %qT and %qT\n", ptr_lhs_type, op0_type); ++ } else { ++ const_tree ssa_name_var = SSA_NAME_VAR(rhs1); ++ /* skip bogus type casts introduced by container_of */ ++ if (ssa_name_var != NULL_TREE && DECL_NAME(ssa_name_var) && ++ !strcmp((const char *)DECL_NAME_POINTER(ssa_name_var), "__mptr")) ++ continue; ++#ifndef __DEBUG_PLUGIN ++ if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_rhs_type))) ++#endif ++ inform(gimple_location(stmt), "found mismatched struct pointer types: %qT and %qT\n", ptr_lhs_type, ptr_rhs_type); ++ } ++ ++ } ++ } ++ return 0; ++} ++ ++#if BUILDING_GCC_VERSION >= 4009 ++static const struct pass_data randomize_layout_bad_cast_data = { ++#else ++static struct gimple_opt_pass randomize_layout_bad_cast = { ++ .pass = { ++#endif ++ .type = GIMPLE_PASS, ++ .name = "randomize_layout_bad_cast", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION >= 4009 ++ .has_gate = false, ++ .has_execute = true, ++#else ++ .gate = NULL, ++ .execute = find_bad_casts, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = PROP_cfg, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = TODO_dump_func ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++class randomize_layout_bad_cast : public gimple_opt_pass { ++public: ++ randomize_layout_bad_cast() : gimple_opt_pass(randomize_layout_bad_cast_data, g) {} ++ unsigned int execute() { return find_bad_casts(); } ++}; ++} ++#endif ++ ++static struct opt_pass *make_randomize_layout_bad_cast(void) ++{ ++#if BUILDING_GCC_VERSION >= 4009 ++ return new randomize_layout_bad_cast(); ++#else ++ return &randomize_layout_bad_cast.pass; ++#endif ++} ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ int i; ++ const char * const plugin_name = plugin_info->base_name; ++ const int argc = plugin_info->argc; ++ const struct plugin_argument * const argv = plugin_info->argv; ++ bool enable = true; ++ int obtained_seed = 0; ++ struct register_pass_info randomize_layout_bad_cast_info; ++ ++ randomize_layout_bad_cast_info.pass = make_randomize_layout_bad_cast(); ++ randomize_layout_bad_cast_info.reference_pass_name = "ssa"; ++ randomize_layout_bad_cast_info.ref_pass_instance_number = 1; ++ randomize_layout_bad_cast_info.pos_op = PASS_POS_INSERT_AFTER; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ if (strncmp(lang_hooks.name, "GNU C", 5) && !strncmp(lang_hooks.name, "GNU C+", 6)) { ++ inform(UNKNOWN_LOCATION, G_("%s supports C only, not %s"), plugin_name, lang_hooks.name); ++ enable = false; ++ } ++ ++ for (i = 0; i < argc; ++i) { ++ if (!strcmp(argv[i].key, "disable")) { ++ enable = false; ++ continue; ++ } ++ if (!strcmp(argv[i].key, "performance-mode")) { ++ performance_mode = 1; ++ continue; ++ } ++ error(G_("unkown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ } ++ ++ if (strlen(randstruct_seed) != 64) { ++ error(G_("invalid seed value supplied for %s plugin"), plugin_name); ++ return 1; ++ } ++ obtained_seed = sscanf(randstruct_seed, "%016llx%016llx%016llx%016llx", ++ &shuffle_seed[0], &shuffle_seed[1], &shuffle_seed[2], &shuffle_seed[3]); ++ if (obtained_seed != 4) { ++ error(G_("Invalid seed supplied for %s plugin"), plugin_name); ++ return 1; ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &randomize_layout_plugin_info); ++ if (enable) { ++ register_callback(plugin_name, PLUGIN_ALL_IPA_PASSES_START, check_global_variables, NULL); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &randomize_layout_bad_cast_info); ++ register_callback(plugin_name, PLUGIN_FINISH_TYPE, finish_type, NULL); ++ register_callback(plugin_name, PLUGIN_FINISH_DECL, randomize_layout_finish_decl, NULL); ++ } ++ register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL); ++ ++ return 0; ++} +diff --git a/tools/gcc/size_overflow_plugin/.gitignore b/tools/gcc/size_overflow_plugin/.gitignore +new file mode 100644 +index 0000000..1f0214f +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/.gitignore +@@ -0,0 +1,3 @@ ++randomize_layout_seed.h ++size_overflow_hash.h ++size_overflow_hash_aux.h +diff --git a/tools/gcc/size_overflow_plugin/Makefile b/tools/gcc/size_overflow_plugin/Makefile +new file mode 100644 +index 0000000..1ae2ed5 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/Makefile +@@ -0,0 +1,20 @@ ++$(HOSTLIBS)-$(CONFIG_PAX_SIZE_OVERFLOW) += size_overflow_plugin.so ++always := $($(HOSTLIBS)-y) ++ ++size_overflow_plugin-objs := $(patsubst $(srctree)/$(src)/%.c,%.o,$(wildcard $(srctree)/$(src)/*.c)) ++ ++$(patsubst $(srctree)/$(src)/%.c,$(obj)/%.o,$(wildcard $(srctree)/$(src)/*.c)): $(objtree)/$(obj)/size_overflow_hash.h $(objtree)/$(obj)/size_overflow_hash_aux.h ++ ++quiet_cmd_build_size_overflow_hash = GENHASH $@ ++ cmd_build_size_overflow_hash = \ ++ $(CONFIG_SHELL) $(srctree)/$(src)/generate_size_overflow_hash.sh -s size_overflow_hash -d $< -o $@ ++$(objtree)/$(obj)/size_overflow_hash.h: $(src)/size_overflow_hash.data FORCE ++ $(call if_changed,build_size_overflow_hash) ++ ++quiet_cmd_build_size_overflow_hash_aux = GENHASH $@ ++ cmd_build_size_overflow_hash_aux = \ ++ $(CONFIG_SHELL) $(srctree)/$(src)/generate_size_overflow_hash.sh -s size_overflow_hash_aux -d $< -o $@ ++$(objtree)/$(obj)/size_overflow_hash_aux.h: $(src)/size_overflow_hash_aux.data FORCE ++ $(call if_changed,build_size_overflow_hash_aux) ++ ++targets += size_overflow_hash.h size_overflow_hash_aux.h +diff --git a/tools/gcc/size_overflow_plugin/generate_size_overflow_hash.sh b/tools/gcc/size_overflow_plugin/generate_size_overflow_hash.sh +new file mode 100644 +index 0000000..12b1e3b +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/generate_size_overflow_hash.sh +@@ -0,0 +1,102 @@ ++#!/bin/bash ++ ++# This script generates the hash table (size_overflow_hash.h) for the size_overflow gcc plugin (size_overflow_plugin.c). ++ ++header1="size_overflow_hash.h" ++database="size_overflow_hash.data" ++n=65536 ++hashtable_name="size_overflow_hash" ++ ++usage() { ++cat <<EOF ++usage: $0 options ++OPTIONS: ++ -h|--help help ++ -o header file ++ -d database file ++ -n hash array size ++ -s name of the hash table ++EOF ++ return 0 ++} ++ ++while true ++do ++ case "$1" in ++ -h|--help) usage && exit 0;; ++ -n) n=$2; shift 2;; ++ -o) header1="$2"; shift 2;; ++ -d) database="$2"; shift 2;; ++ -s) hashtable_name="$2"; shift 2;; ++ --) shift 1; break ;; ++ *) break ;; ++ esac ++done ++ ++create_defines() { ++ for i in `seq 0 31` ++ do ++ echo -e "#define PARAM"$i" (1U << "$i")" >> "$header1" ++ done ++ echo >> "$header1" ++} ++ ++create_structs() { ++ rm -f "$header1" ++ ++ create_defines ++ ++ cat "$database" | while read data ++ do ++ data_array=($data) ++ struct_hash_name="${data_array[0]}" ++ funcn="${data_array[1]}" ++ params="${data_array[2]}" ++ next="${data_array[4]}" ++ ++ echo "const struct size_overflow_hash $struct_hash_name = {" >> "$header1" ++ ++ echo -e "\t.next\t= $next,\n\t.name\t= \"$funcn\"," >> "$header1" ++ echo -en "\t.param\t= " >> "$header1" ++ line= ++ for param_num in ${params//-/ }; ++ do ++ line="${line}PARAM"$param_num"|" ++ done ++ ++ echo -e "${line%?},\n};\n" >> "$header1" ++ done ++} ++ ++create_headers() { ++ echo "const struct size_overflow_hash * const $hashtable_name[$n] = {" >> "$header1" ++} ++ ++create_array_elements() { ++ index=0 ++ grep -v "nohasharray" $database | sort -n -k 4 | while read data ++ do ++ data_array=($data) ++ i="${data_array[3]}" ++ hash="${data_array[0]}" ++ while [[ $index -lt $i ]] ++ do ++ echo -e "\t["$index"]\t= NULL," >> "$header1" ++ index=$(($index + 1)) ++ done ++ index=$(($index + 1)) ++ echo -e "\t["$i"]\t= &"$hash"," >> "$header1" ++ done ++ echo '};' >> $header1 ++} ++ ++size_overflow_plugin_dir=`dirname $header1` ++if [ "$size_overflow_plugin_dir" != '.' ]; then ++ mkdir -p "$size_overflow_plugin_dir" 2> /dev/null ++fi ++ ++create_structs ++create_headers ++create_array_elements ++ ++exit 0 +diff --git a/tools/gcc/size_overflow_plugin/insert_size_overflow_asm.c b/tools/gcc/size_overflow_plugin/insert_size_overflow_asm.c +new file mode 100644 +index 0000000..0b508b1 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/insert_size_overflow_asm.c +@@ -0,0 +1,409 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++// Data for the size_overflow asm stmt ++struct asm_data { ++ // call or return stmt with our attributes ++ gimple target_stmt; ++ // def_stmt of the marked arg ++ gimple def_stmt; ++ // size_overflow asm rhs ++ tree input; ++ // the output (lhs) of the size_overflow asm is the marked arg ++ tree output; ++ // marked arg number (0 for return values) ++ unsigned int argnum; ++ // intentional mark type ++ enum intentional_mark intentional_mark; ++}; ++ ++static void __unused print_asm_data(struct asm_data *asm_data) ++{ ++ fprintf(stderr, "-----------------------\nprint_asm_data:\n"); ++ ++ fprintf(stderr, "def_stmt\n"); ++ debug_gimple_stmt(asm_data->def_stmt); ++ fprintf(stderr, "target_stmt\n"); ++ debug_gimple_stmt(asm_data->target_stmt); ++ fprintf(stderr, "output\n"); ++ debug_tree(asm_data->output); ++ fprintf(stderr, "input\n"); ++ debug_tree(asm_data->input); ++} ++ ++static const char *convert_mark_to_str(enum intentional_mark mark) ++{ ++ switch (mark) { ++ case MARK_NO: ++ return OK_ASM_STR; ++ case MARK_YES: ++ return YES_ASM_STR; ++ case MARK_END_INTENTIONAL: ++ return END_INTENTIONAL_ASM_STR; ++ case MARK_TURN_OFF: ++ return TURN_OFF_ASM_STR; ++ } ++ gcc_unreachable(); ++} ++ ++static char *create_asm_comment(struct asm_data *asm_data, const char *mark_str) ++{ ++ const char *fn_name; ++ char *asm_comment; ++ unsigned int len; ++ ++ if (gimple_code(asm_data->target_stmt) == GIMPLE_RETURN) ++ fn_name = DECL_NAME_POINTER(current_function_decl); ++ else ++ fn_name = DECL_NAME_POINTER(gimple_call_fndecl(asm_data->target_stmt)); ++ ++ len = asprintf(&asm_comment, "%s %s %u", mark_str, fn_name, asm_data->argnum); ++ gcc_assert(len > 0); ++ ++ return asm_comment; ++} ++ ++#if BUILDING_GCC_VERSION <= 4007 ++static VEC(tree, gc) *create_asm_io_list(tree string, tree io) ++#else ++static vec<tree, va_gc> *create_asm_io_list(tree string, tree io) ++#endif ++{ ++ tree list; ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC(tree, gc) *vec_list = NULL; ++#else ++ vec<tree, va_gc> *vec_list = NULL; ++#endif ++ ++ list = build_tree_list(NULL_TREE, string); ++ list = chainon(NULL_TREE, build_tree_list(list, io)); ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC_safe_push(tree, gc, vec_list, list); ++#else ++ vec_safe_push(vec_list, list); ++#endif ++ return vec_list; ++} ++ ++static void create_so_asm_stmt(struct asm_data *asm_data) ++{ ++ char *asm_comment; ++ const char *mark_str; ++ gasm *asm_stmt; ++ gimple_stmt_iterator gsi; ++ tree str_input, str_output; ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC(tree, gc) *input = NULL, *output = NULL; ++#else ++ vec<tree, va_gc> *input = NULL, *output = NULL; ++#endif ++ ++ mark_str = convert_mark_to_str(asm_data->intentional_mark); ++ asm_comment = create_asm_comment(asm_data, mark_str); ++ ++ str_input = build_string(2, "0"); ++ input = create_asm_io_list(str_input, asm_data->input); ++ str_output = build_string(4, "=rm"); ++ output = create_asm_io_list(str_output, asm_data->output); ++ ++ asm_stmt = gimple_build_asm_vec(asm_comment, input, output, NULL, NULL); ++ gimple_asm_set_volatile(asm_stmt, true); ++ ++ gsi = gsi_for_stmt(asm_data->def_stmt); ++ gsi_insert_after(&gsi, asm_stmt, GSI_NEW_STMT); ++ ++ SSA_NAME_DEF_STMT(asm_data->output) = asm_stmt; ++ ++ free(asm_comment); ++} ++ ++static void check_size_overflow_asm(struct asm_data *asm_data) ++{ ++ enum intentional_mark old_intentional_mark = get_so_asm_type(asm_data->def_stmt); ++ ++ if (old_intentional_mark == asm_data->intentional_mark) ++ return; ++ if (asm_data->intentional_mark == MARK_NO) ++ return; ++ ++ print_intentional_mark(old_intentional_mark); ++ print_intentional_mark(asm_data->intentional_mark); ++ gcc_unreachable(); ++} ++ ++static tree get_so_asm_output(struct asm_data *asm_data) ++{ ++ gimple stmt = asm_data->target_stmt; ++ unsigned int argnum = asm_data->argnum; ++ ++ switch (gimple_code(stmt)) { ++ case GIMPLE_RETURN: ++ gcc_assert(argnum == 0); ++ return gimple_return_retval(as_a_greturn(stmt)); ++ case GIMPLE_CALL: ++ gcc_assert(argnum != 0); ++ gcc_assert(gimple_call_num_args(stmt) >= argnum); ++ return gimple_call_arg(stmt, argnum - 1); ++ default: ++ debug_gimple_stmt(stmt); ++ gcc_unreachable(); ++ } ++} ++ ++static tree get_so_asm_input(struct asm_data *asm_data) ++{ ++ gassign *assign; ++ tree output_type, new_var; ++ gimple_stmt_iterator gsi; ++ ++ output_type = TREE_TYPE(asm_data->output); ++ new_var = create_new_var(output_type); ++ ++ assign = gimple_build_assign(new_var, asm_data->output); ++ gimple_assign_set_lhs(assign, make_ssa_name(new_var, assign)); ++ ++ gsi = gsi_for_stmt(asm_data->target_stmt); ++ gsi_insert_before(&gsi, assign, GSI_NEW_STMT); ++ ++ asm_data->def_stmt = assign; ++ ++ new_var = create_new_var(output_type); ++ asm_data->output = make_ssa_name(new_var, asm_data->target_stmt); ++ ++ return gimple_assign_lhs(assign); ++} ++ ++static void set_so_asm_input_target_stmt(struct asm_data *asm_data) ++{ ++ switch (gimple_code(asm_data->target_stmt)) { ++ case GIMPLE_CALL: ++ gimple_call_set_arg(asm_data->target_stmt, asm_data->argnum - 1, asm_data->output); ++ break; ++ case GIMPLE_RETURN: ++ gimple_return_set_retval(as_a_greturn(asm_data->target_stmt), asm_data->output); ++ break; ++ default: ++ debug_gimple_stmt(asm_data->target_stmt); ++ gcc_unreachable(); ++ } ++ ++ update_stmt(asm_data->def_stmt); ++} ++ ++/* This is the gimple part of searching for a missing size_overflow attribute. If the intentional_overflow attribute type ++ * is of the right kind create the appropriate size_overflow asm stmts: ++ * __asm__("# size_overflow MARK_END_INTENTIONAL" : =rm" D.3344_8 : "0" cicus.4_16); ++ * __asm__("# size_overflow MARK_NO" : =rm" cicus.4_16 : "0" size_1(D)); ++ */ ++static void insert_size_overflow_asm(gimple stmt, unsigned int argnum, enum intentional_mark intentional_mark) ++{ ++ struct asm_data asm_data; ++ ++ asm_data.target_stmt = stmt; ++ asm_data.argnum = argnum; ++ asm_data.intentional_mark = intentional_mark; ++ ++ asm_data.output = get_so_asm_output(&asm_data); ++ if (asm_data.output == NULL_TREE) ++ return; ++ if (is_gimple_constant(asm_data.output)) ++ return; ++ if (skip_types(asm_data.output)) ++ return; ++ ++ asm_data.def_stmt = get_def_stmt(asm_data.output); ++ if (is_size_overflow_asm(asm_data.def_stmt)) { ++ check_size_overflow_asm(&asm_data); ++ return; ++ } ++ ++ asm_data.input = get_so_asm_input(&asm_data); ++ ++ create_so_asm_stmt(&asm_data); ++ set_so_asm_input_target_stmt(&asm_data); ++ ++ update_stmt(asm_data.def_stmt); ++ update_stmt(asm_data.target_stmt); ++} ++ ++// Determine the correct arg index and arg and insert the asm stmt to mark the stmt. ++static void insert_so_asm_by_so_attr(gimple stmt, unsigned int orig_argnum) ++{ ++ if (orig_argnum == 0 && gimple_code(stmt) == GIMPLE_RETURN) { ++ insert_size_overflow_asm(stmt, 0, MARK_NO); ++ return; ++ } ++ ++ if (orig_argnum != 0 && gimple_code(stmt) == GIMPLE_CALL) ++ insert_size_overflow_asm(stmt, orig_argnum, MARK_NO); ++} ++ ++// If a function arg or the return value is marked by the size_overflow attribute then set its index in the array. ++static void set_argnum_attribute(const_tree attr, bool *argnums) ++{ ++ unsigned int argnum; ++ tree attr_value; ++ ++ gcc_assert(attr); ++ for (attr_value = TREE_VALUE(attr); attr_value; attr_value = TREE_CHAIN(attr_value)) { ++ argnum = (unsigned int)tree_to_uhwi(TREE_VALUE(attr_value)); ++ argnums[argnum] = true; ++ } ++} ++ ++// Check whether the arguments are marked by the size_overflow attribute. ++static void search_interesting_so_args(tree fndecl, bool *argnums) ++{ ++ const_tree attr; ++ ++ attr = get_attribute("size_overflow", fndecl); ++ if (attr) ++ set_argnum_attribute(attr, argnums); ++} ++ ++static enum intentional_mark handle_intentional_attr(gimple stmt, unsigned int argnum) ++{ ++ enum intentional_mark mark; ++ ++ mark = check_intentional_attribute(stmt, argnum); ++ if (mark == MARK_NO) ++ return MARK_NO; ++ insert_size_overflow_asm(stmt, argnum, mark); ++ return mark; ++} ++ ++static void handle_size_overflow_attr_ret(greturn *stmt) ++{ ++ enum intentional_mark mark; ++ bool orig_argnums[MAX_PARAM + 1] = {false}; ++ ++ search_interesting_so_args(get_orig_fndecl(current_function_decl), (bool *) &orig_argnums); ++ ++ mark = handle_intentional_attr(stmt, 0); ++ if (mark == MARK_NO && orig_argnums[0]) ++ insert_so_asm_by_so_attr(stmt, 0); ++} ++ ++// If the argument(s) of the callee function are marked by an attribute then mark the call stmt with an asm stmt ++static void handle_size_overflow_attr_call(gcall *stmt) ++{ ++ tree fndecl; ++ unsigned int argnum; ++ bool orig_argnums[MAX_PARAM + 1] = {false}; ++ ++ fndecl = get_interesting_orig_fndecl_from_stmt(stmt); ++ if (fndecl == NULL_TREE) ++ return; ++ if (DECL_BUILT_IN(fndecl)) ++ return; ++ ++ search_interesting_so_args(fndecl, (bool *) &orig_argnums); ++ ++ for (argnum = 1; argnum <= gimple_call_num_args(stmt); argnum++) { ++ enum intentional_mark mark = handle_intentional_attr(stmt, argnum); ++ ++ if (mark == MARK_NO && orig_argnums[argnum]) ++ insert_so_asm_by_so_attr(stmt, argnum); ++ } ++} ++ ++// Iterate over all the stmts and search for call stmts and mark them if they have size_overflow attribute ++static unsigned int search_interesting_functions(void) ++{ ++ basic_block bb; ++ ++ FOR_ALL_BB_FN(bb, cfun) { ++ gimple_stmt_iterator gsi; ++ ++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { ++ gimple stmt = gsi_stmt(gsi); ++ ++ if (is_gimple_call(stmt)) ++ handle_size_overflow_attr_call(as_a_gcall(stmt)); ++ else if (gimple_code(stmt) == GIMPLE_RETURN) ++ handle_size_overflow_attr_ret(as_a_greturn(stmt)); ++ } ++ } ++ return 0; ++} ++ ++/* ++ * A lot of functions get inlined before the ipa passes so after the build_ssa gimple pass ++ * this pass inserts asm stmts to mark the interesting args ++ * that the ipa pass will detect and insert the size overflow checks for. ++ */ ++#if BUILDING_GCC_VERSION >= 4009 ++static const struct pass_data insert_size_overflow_asm_pass_data = { ++#else ++static struct gimple_opt_pass insert_size_overflow_asm_pass = { ++ .pass = { ++#endif ++ .type = GIMPLE_PASS, ++ .name = "insert_size_overflow_asm", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION >= 4009 ++ .has_gate = false, ++ .has_execute = true, ++#else ++ .gate = NULL, ++ .execute = search_interesting_functions, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = PROP_cfg, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = TODO_dump_func | TODO_verify_ssa | TODO_verify_stmts | TODO_remove_unused_locals | TODO_update_ssa_no_phi | TODO_cleanup_cfg | TODO_ggc_collect | TODO_verify_flow ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++class insert_size_overflow_asm_pass : public gimple_opt_pass { ++public: ++ insert_size_overflow_asm_pass() : gimple_opt_pass(insert_size_overflow_asm_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return search_interesting_functions(); } ++#else ++ unsigned int execute() { return search_interesting_functions(); } ++#endif ++}; ++} ++ ++opt_pass *make_insert_size_overflow_asm_pass(void) ++{ ++ return new insert_size_overflow_asm_pass(); ++} ++#else ++struct opt_pass *make_insert_size_overflow_asm_pass(void) ++{ ++ return &insert_size_overflow_asm_pass.pass; ++} ++#endif +diff --git a/tools/gcc/size_overflow_plugin/intentional_overflow.c b/tools/gcc/size_overflow_plugin/intentional_overflow.c +new file mode 100644 +index 0000000..d96cef2 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/intentional_overflow.c +@@ -0,0 +1,955 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++static enum intentional_mark walk_use_def(gimple_set *visited, const_tree lhs); ++ ++static const char *get_asm_string(const gasm *stmt) ++{ ++ if (stmt) ++ return gimple_asm_string(stmt); ++ return NULL; ++} ++ ++tree get_size_overflow_asm_input(const gasm *stmt) ++{ ++ gcc_assert(gimple_asm_ninputs(stmt) != 0); ++ return TREE_VALUE(gimple_asm_input_op(stmt, 0)); ++} ++ ++bool is_size_overflow_insert_check_asm(const gasm *stmt) ++{ ++ const char *str; ++ ++ if (!is_size_overflow_asm(stmt)) ++ return false; ++ ++ str = get_asm_string(stmt); ++ if (!str) ++ return false; ++ return !strncmp(str, OK_ASM_STR, sizeof(OK_ASM_STR) - 1); ++} ++ ++bool is_size_overflow_asm(const_gimple stmt) ++{ ++ const char *str; ++ ++ if (!stmt) ++ return false; ++ if (gimple_code(stmt) != GIMPLE_ASM) ++ return false; ++ ++ str = get_asm_string(as_a_const_gasm(stmt)); ++ if (!str) ++ return false; ++ return !strncmp(str, SO_ASM_STR, sizeof(SO_ASM_STR) - 1); ++} ++ ++static bool is_size_overflow_intentional_asm_turn_off(const gasm *stmt) ++{ ++ const char *str; ++ ++ if (!is_size_overflow_asm(stmt)) ++ return false; ++ ++ str = get_asm_string(stmt); ++ if (!str) ++ return false; ++ return !strncmp(str, TURN_OFF_ASM_STR, sizeof(TURN_OFF_ASM_STR) - 1); ++} ++ ++static bool is_size_overflow_intentional_asm_end(const gasm *stmt) ++{ ++ const char *str; ++ ++ if (!is_size_overflow_asm(stmt)) ++ return false; ++ ++ str = get_asm_string(stmt); ++ if (!str) ++ return false; ++ return !strncmp(str, END_INTENTIONAL_ASM_STR, sizeof(END_INTENTIONAL_ASM_STR) - 1); ++} ++ ++/* Get the param of the intentional_overflow attribute. ++ * * 0: MARK_END_INTENTIONAL ++ * * 1..MAX_PARAM: MARK_YES ++ * * -1: MARK_TURN_OFF ++ */ ++static tree get_attribute_param(const_tree decl) ++{ ++ const_tree attr; ++ ++ if (decl == NULL_TREE) ++ return NULL_TREE; ++ ++ attr = get_attribute("intentional_overflow", decl); ++ if (attr) ++ return TREE_VALUE(attr); ++ return NULL_TREE; ++} ++ ++// MARK_TURN_OFF ++static bool is_turn_off_intentional_attr(const_tree decl) ++{ ++ const_tree param_head; ++ ++ param_head = get_attribute_param(decl); ++ if (param_head == NULL_TREE) ++ return false; ++ ++ if (tree_to_shwi(TREE_VALUE(param_head)) == -1) ++ return true; ++ return false; ++} ++ ++// MARK_END_INTENTIONAL ++static bool is_end_intentional_intentional_attr(const_tree decl) ++{ ++ const_tree param_head; ++ ++ param_head = get_attribute_param(decl); ++ if (param_head == NULL_TREE) ++ return false; ++ ++ if (tree_to_shwi(TREE_VALUE(param_head)) == 0) ++ return true; ++ return false; ++} ++ ++// MARK_YES ++static bool is_yes_intentional_attr(const_tree decl, unsigned int argnum) ++{ ++ tree param, param_head; ++ ++ if (argnum == 0) ++ return false; ++ ++ param_head = get_attribute_param(decl); ++ for (param = param_head; param; param = TREE_CHAIN(param)) { ++ int argval = tree_to_shwi(TREE_VALUE(param)); ++ ++ if (argval <= 0) ++ continue; ++ if (argnum == (unsigned int)argval) ++ return true; ++ } ++ return false; ++} ++ ++static void print_missing_intentional(enum intentional_mark callee_attr, enum intentional_mark caller_attr, const_tree decl, unsigned int argnum) ++{ ++ const struct size_overflow_hash *hash; ++ location_t loc; ++ ++ if (caller_attr == MARK_NO || caller_attr == MARK_END_INTENTIONAL || caller_attr == MARK_TURN_OFF) ++ return; ++ ++ if (callee_attr == MARK_END_INTENTIONAL || callee_attr == MARK_YES) ++ return; ++ ++ hash = get_size_overflow_hash_entry_tree(decl, argnum); ++ if (!hash) ++ return; ++ ++ loc = DECL_SOURCE_LOCATION(decl); ++ inform(loc, "The intentional_overflow attribute is missing from +%s+%u+", DECL_NAME_POINTER(decl), argnum); ++} ++ ++// Get the field decl of a component ref for intentional_overflow checking ++static const_tree search_field_decl(const_tree comp_ref) ++{ ++ const_tree field = NULL_TREE; ++ unsigned int i, len = TREE_OPERAND_LENGTH(comp_ref); ++ ++ for (i = 0; i < len; i++) { ++ field = TREE_OPERAND(comp_ref, i); ++ if (TREE_CODE(field) == FIELD_DECL) ++ break; ++ } ++ gcc_assert(TREE_CODE(field) == FIELD_DECL); ++ return field; ++} ++ ++/* Get the type of the intentional_overflow attribute of a node ++ * * MARK_TURN_OFF ++ * * MARK_YES ++ * * MARK_NO ++ * * MARK_END_INTENTIONAL ++ */ ++static enum intentional_mark get_intentional_attr_type(const_tree node) ++{ ++ const_tree cur_decl; ++ ++ if (node == NULL_TREE) ++ return MARK_NO; ++ ++ switch (TREE_CODE(node)) { ++ case COMPONENT_REF: ++ cur_decl = search_field_decl(node); ++ if (is_turn_off_intentional_attr(cur_decl)) ++ return MARK_TURN_OFF; ++ if (is_end_intentional_intentional_attr(cur_decl)) ++ return MARK_YES; ++ break; ++ case PARM_DECL: { ++ unsigned int argnum; ++ ++ cur_decl = get_orig_fndecl(current_function_decl); ++ argnum = find_arg_number_tree(node, cur_decl); ++ if (argnum == CANNOT_FIND_ARG) ++ return MARK_NO; ++ if (is_yes_intentional_attr(cur_decl, argnum)) ++ return MARK_YES; ++ if (is_end_intentional_intentional_attr(cur_decl)) ++ return MARK_END_INTENTIONAL; ++ break; ++ } ++ case FUNCTION_DECL: { ++ const_tree fndecl = get_orig_fndecl(node); ++ ++ if (is_turn_off_intentional_attr(fndecl)) ++ return MARK_TURN_OFF; ++ if (is_end_intentional_intentional_attr(fndecl)) ++ return MARK_END_INTENTIONAL; ++ } ++ default: ++ break; ++ } ++ return MARK_NO; ++} ++ ++static enum intentional_mark walk_use_def_phi(gimple_set *visited, const_tree result) ++{ ++ enum intentional_mark mark = MARK_NO; ++ gphi *phi = as_a_gphi(get_def_stmt(result)); ++ unsigned int i, n = gimple_phi_num_args(phi); ++ ++ pointer_set_insert(visited, phi); ++ for (i = 0; i < n; i++) { ++ tree arg = gimple_phi_arg_def(phi, i); ++ ++ mark = walk_use_def(visited, arg); ++ if (mark != MARK_NO) ++ return mark; ++ } ++ ++ return mark; ++} ++ ++static enum intentional_mark walk_use_def_binary(gimple_set *visited, const_tree lhs) ++{ ++ enum intentional_mark mark; ++ tree rhs1, rhs2; ++ gassign *def_stmt = as_a_gassign(get_def_stmt(lhs)); ++ ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ rhs2 = gimple_assign_rhs2(def_stmt); ++ ++ mark = walk_use_def(visited, rhs1); ++ if (mark == MARK_NO) ++ return walk_use_def(visited, rhs2); ++ return mark; ++} ++ ++enum intentional_mark get_so_asm_type(const_gimple stmt) ++{ ++ const gasm *asm_stmt; ++ ++ if (!stmt) ++ return MARK_NO; ++ if (!is_size_overflow_asm(stmt)) ++ return MARK_NO; ++ ++ asm_stmt = as_a_const_gasm(stmt); ++ if (is_size_overflow_insert_check_asm(asm_stmt)) ++ return MARK_NO; ++ if (is_size_overflow_intentional_asm_turn_off(asm_stmt)) ++ return MARK_TURN_OFF; ++ if (is_size_overflow_intentional_asm_end(asm_stmt)) ++ return MARK_END_INTENTIONAL; ++ return MARK_YES; ++} ++ ++static enum intentional_mark walk_use_def(gimple_set *visited, const_tree lhs) ++{ ++ const_gimple def_stmt; ++ ++ if (TREE_CODE(lhs) != SSA_NAME) ++ return get_intentional_attr_type(lhs); ++ ++ def_stmt = get_def_stmt(lhs); ++ gcc_assert(def_stmt); ++ ++ if (pointer_set_insert(visited, def_stmt)) ++ return MARK_NO; ++ ++ switch (gimple_code(def_stmt)) { ++ case GIMPLE_CALL: ++ case GIMPLE_RETURN: ++ return MARK_NO; ++ case GIMPLE_NOP: ++ return walk_use_def(visited, SSA_NAME_VAR(lhs)); ++ case GIMPLE_ASM: ++ return get_so_asm_type(as_a_const_gasm(def_stmt)); ++ case GIMPLE_PHI: ++ return walk_use_def_phi(visited, lhs); ++ case GIMPLE_ASSIGN: ++ switch (gimple_num_ops(def_stmt)) { ++ case 2: ++ return walk_use_def(visited, gimple_assign_rhs1(def_stmt)); ++ case 3: ++ return walk_use_def_binary(visited, lhs); ++ } ++ default: ++ debug_gimple_stmt((gimple)def_stmt); ++ error("%s: unknown gimple code", __func__); ++ gcc_unreachable(); ++ } ++} ++ ++static enum intentional_mark check_intentional_size_overflow_asm_and_attribute(const_tree var) ++{ ++ enum intentional_mark mark; ++ gimple_set *visited; ++ ++ visited = pointer_set_create(); ++ mark = walk_use_def(visited, var); ++ pointer_set_destroy(visited); ++ ++ return mark; ++} ++ ++/* Search intentional_overflow attribute on caller and on callee too. ++ * -1 / MARK_TURN_OFF: means that overflow checking is turned off inside the function and ++ * parameters aren't tracked backwards. ++ * 1..31 / MARK_YES: e.g., 4 means that overflow checking is turned off on the fourth parameter inside ++ * the function. ++ * 0 / MARK_END_INTENTIONAL: means that overflow checking is turned off on all the parameters of the function ++ * in all callers (on a structure field means that overflow checking is turned off ++ * in all expressions involving the given field). ++ */ ++enum intentional_mark check_intentional_attribute(const_gimple stmt, unsigned int argnum) ++{ ++ enum intentional_mark caller_mark, callee_mark; ++ const_tree fndecl, orig_cur_fndecl, arg; ++ ++ orig_cur_fndecl = get_orig_fndecl(current_function_decl); ++ ++ // handle MARK_TURN_OFF early on the caller ++ if (is_turn_off_intentional_attr(orig_cur_fndecl)) ++ return MARK_TURN_OFF; ++ ++ switch (gimple_code(stmt)) { ++ case GIMPLE_RETURN: ++ gcc_assert(argnum == 0); ++ // for now ignore other intentional attribute types on returns ++ return MARK_NO; ++ case GIMPLE_CALL: ++ gcc_assert(argnum != 0); ++ gcc_assert(argnum <= gimple_call_num_args(stmt)); ++ arg = gimple_call_arg(stmt, argnum - 1); ++ break; ++ default: ++ debug_gimple_stmt((gimple)stmt); ++ gcc_unreachable(); ++ } ++ ++ // XXX ideiglenesen 0-nal a fuggvenyen belul is ki van kapcsolva a dupolas, eddig igy mukodott a doksi ellenere ++ if (is_end_intentional_intentional_attr(orig_cur_fndecl)) ++ return MARK_END_INTENTIONAL; ++ ++ fndecl = get_interesting_orig_fndecl_from_stmt(as_a_const_gcall(stmt)); ++ // handle MARK_TURN_OFF on the callee ++ if (is_turn_off_intentional_attr(fndecl)) ++ return MARK_TURN_OFF; ++ // find a defining marked caller argument or struct field for arg ++ caller_mark = check_intentional_size_overflow_asm_and_attribute(arg); ++ ++ // did we find a marked struct field? ++ if (caller_mark == MARK_TURN_OFF) ++ return MARK_TURN_OFF; ++ ++ // handle MARK_END_INTENTIONAL on the callee ++ if (is_end_intentional_intentional_attr(fndecl)) ++ callee_mark = MARK_END_INTENTIONAL; ++ // is it a marked callee parameter? ++ else if (is_yes_intentional_attr(fndecl, argnum)) ++ callee_mark = MARK_YES; ++ else ++ callee_mark = MARK_NO; ++ ++ // no intentional attribute found ++ if (callee_mark == MARK_NO && caller_mark == MARK_NO) ++ return MARK_NO; ++ ++ // MARK_YES is meaningful only on the caller ++ if (caller_mark == MARK_NO && callee_mark == MARK_YES) ++ return MARK_NO; ++ ++ // we found a code region where we don't want to duplicate ++ if (caller_mark == MARK_YES && callee_mark == MARK_END_INTENTIONAL) ++ return MARK_END_INTENTIONAL; ++ ++ // ignore the intentional attribute on the callee if we didn't find a marked defining argument or struct field ++ if (caller_mark == MARK_NO && callee_mark == MARK_END_INTENTIONAL) ++ return MARK_NO; ++ ++ // the callee is missing the intentional attribute (MARK_YES or MARK_END_INTENTIONAL) ++ if (caller_mark == MARK_YES) { ++ print_missing_intentional(callee_mark, caller_mark, fndecl, argnum); ++ return MARK_YES; ++ } ++ ++ fprintf(stderr, "caller: %s callee: %s\n", DECL_NAME_POINTER(orig_cur_fndecl), DECL_NAME_POINTER(fndecl)); ++ debug_gimple_stmt((gimple)stmt); ++ print_intentional_mark(caller_mark); ++ print_intentional_mark(callee_mark); ++ gcc_unreachable(); ++} ++ ++enum intentional_mark check_intentional_asm(const_gimple stmt, unsigned int argnum) ++{ ++ const_tree arg; ++ ++ switch (gimple_code(stmt)) { ++ case GIMPLE_RETURN: ++ gcc_assert(argnum == 0); ++ arg = gimple_return_retval(as_a_const_greturn(stmt)); ++ break; ++ case GIMPLE_CALL: ++ gcc_assert(argnum != 0); ++ gcc_assert(argnum <= gimple_call_num_args(stmt)); ++ arg = gimple_call_arg(stmt, argnum - 1); ++ break; ++ case GIMPLE_ASM: ++ gcc_assert(is_size_overflow_insert_check_asm(as_a_const_gasm(stmt))); ++ arg = get_size_overflow_asm_input(as_a_const_gasm(stmt)); ++ break; ++ default: ++ debug_gimple_stmt((gimple)stmt); ++ gcc_unreachable(); ++ } ++ ++ // find a defining marked caller argument or struct field for arg ++ return check_intentional_size_overflow_asm_and_attribute(arg); ++} ++ ++bool is_a_cast_and_const_overflow(const_tree no_const_rhs) ++{ ++ const_tree rhs1, lhs, rhs1_type, lhs_type; ++ enum machine_mode lhs_mode, rhs_mode; ++ gimple def_stmt = get_def_stmt(no_const_rhs); ++ ++ if (!def_stmt || !gimple_assign_cast_p(def_stmt)) ++ return false; ++ ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ lhs = gimple_assign_lhs(def_stmt); ++ rhs1_type = TREE_TYPE(rhs1); ++ lhs_type = TREE_TYPE(lhs); ++ rhs_mode = TYPE_MODE(rhs1_type); ++ lhs_mode = TYPE_MODE(lhs_type); ++ if (TYPE_UNSIGNED(lhs_type) == TYPE_UNSIGNED(rhs1_type) || lhs_mode != rhs_mode) ++ return false; ++ ++ return true; ++} ++ ++static unsigned int uses_num(tree node) ++{ ++ imm_use_iterator imm_iter; ++ use_operand_p use_p; ++ unsigned int num = 0; ++ ++ FOR_EACH_IMM_USE_FAST(use_p, imm_iter, node) { ++ gimple use_stmt = USE_STMT(use_p); ++ ++ if (use_stmt == NULL) ++ return num; ++ if (is_gimple_debug(use_stmt)) ++ continue; ++ if (gimple_assign_cast_p(use_stmt) && is_size_overflow_type(gimple_assign_lhs(use_stmt))) ++ continue; ++ num++; ++ } ++ return num; ++} ++ ++static bool no_uses(tree node) ++{ ++ return !uses_num(node); ++} ++ ++// 3.8.5 mm/page-writeback.c __ilog2_u64(): ret, uint + uintmax; uint -> int; int max ++bool is_const_plus_unsigned_signed_truncation(const_tree lhs) ++{ ++ tree rhs1, lhs_type, rhs_type, rhs2, not_const_rhs; ++ gimple def_stmt = get_def_stmt(lhs); ++ ++ if (!def_stmt || !gimple_assign_cast_p(def_stmt)) ++ return false; ++ ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ rhs_type = TREE_TYPE(rhs1); ++ lhs_type = TREE_TYPE(lhs); ++ if (TYPE_UNSIGNED(lhs_type) || !TYPE_UNSIGNED(rhs_type)) ++ return false; ++ if (TYPE_MODE(lhs_type) != TYPE_MODE(rhs_type)) ++ return false; ++ ++ def_stmt = get_def_stmt(rhs1); ++ if (!def_stmt || !is_gimple_assign(def_stmt) || gimple_num_ops(def_stmt) != 3) ++ return false; ++ ++ if (gimple_assign_rhs_code(def_stmt) != PLUS_EXPR) ++ return false; ++ ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ rhs2 = gimple_assign_rhs2(def_stmt); ++ if (!is_gimple_constant(rhs1) && !is_gimple_constant(rhs2)) ++ return false; ++ ++ if (is_gimple_constant(rhs2)) ++ not_const_rhs = rhs1; ++ else ++ not_const_rhs = rhs2; ++ ++ return no_uses(not_const_rhs); ++} ++ ++static bool is_lt_signed_type_max(const_tree rhs) ++{ ++ const_tree new_type, type_max, type = TREE_TYPE(rhs); ++ ++ if (!TYPE_UNSIGNED(type)) ++ return true; ++ ++ switch (TYPE_MODE(type)) { ++ case QImode: ++ new_type = intQI_type_node; ++ break; ++ case HImode: ++ new_type = intHI_type_node; ++ break; ++ case SImode: ++ new_type = intSI_type_node; ++ break; ++ case DImode: ++ new_type = intDI_type_node; ++ break; ++ default: ++ debug_tree((tree)type); ++ gcc_unreachable(); ++ } ++ ++ type_max = TYPE_MAX_VALUE(new_type); ++ if (!tree_int_cst_lt(type_max, rhs)) ++ return true; ++ ++ return false; ++} ++ ++static bool is_gt_zero(const_tree rhs) ++{ ++ const_tree type = TREE_TYPE(rhs); ++ ++ if (TYPE_UNSIGNED(type)) ++ return true; ++ ++ if (!tree_int_cst_lt(rhs, integer_zero_node)) ++ return true; ++ ++ return false; ++} ++ ++bool is_a_constant_overflow(const gassign *stmt, const_tree rhs) ++{ ++ if (gimple_assign_rhs_code(stmt) == MIN_EXPR) ++ return false; ++ if (!is_gimple_constant(rhs)) ++ return false; ++ ++ // if the const is between 0 and the max value of the signed type of the same bitsize then there is no intentional overflow ++ if (is_lt_signed_type_max(rhs) && is_gt_zero(rhs)) ++ return false; ++ ++ return true; ++} ++ ++static tree change_assign_rhs(struct visited *visited, gassign *stmt, const_tree orig_rhs, tree new_rhs) ++{ ++ const_gimple assign; ++ gimple_stmt_iterator gsi = gsi_for_stmt(stmt); ++ tree origtype = TREE_TYPE(orig_rhs); ++ ++ assign = build_cast_stmt(visited, origtype, new_rhs, CREATE_NEW_VAR, &gsi, BEFORE_STMT, false); ++ pointer_set_insert(visited->my_stmts, assign); ++ return get_lhs(assign); ++} ++ ++tree handle_intentional_overflow(struct visited *visited, bool check_overflow, gassign *stmt, tree change_rhs, tree new_rhs2) ++{ ++ tree new_rhs, orig_rhs; ++ void (*gimple_assign_set_rhs)(gimple, tree); ++ tree rhs1 = gimple_assign_rhs1(stmt); ++ tree rhs2 = gimple_assign_rhs2(stmt); ++ tree lhs = gimple_assign_lhs(stmt); ++ ++ if (!check_overflow) ++ return create_assign(visited, stmt, lhs, AFTER_STMT); ++ ++ if (change_rhs == NULL_TREE) ++ return create_assign(visited, stmt, lhs, AFTER_STMT); ++ ++ if (new_rhs2 == NULL_TREE) { ++ orig_rhs = rhs1; ++ gimple_assign_set_rhs = &gimple_assign_set_rhs1; ++ } else { ++ orig_rhs = rhs2; ++ gimple_assign_set_rhs = &gimple_assign_set_rhs2; ++ } ++ ++ check_size_overflow(stmt, TREE_TYPE(change_rhs), change_rhs, orig_rhs, BEFORE_STMT); ++ ++ new_rhs = change_assign_rhs(visited, stmt, orig_rhs, change_rhs); ++ gimple_assign_set_rhs(stmt, new_rhs); ++ update_stmt(stmt); ++ ++ return create_assign(visited, stmt, lhs, AFTER_STMT); ++} ++ ++static bool is_subtraction_special(struct visited *visited, const gassign *stmt) ++{ ++ gimple rhs1_def_stmt, rhs2_def_stmt; ++ const_tree rhs1_def_stmt_rhs1, rhs2_def_stmt_rhs1, rhs1_def_stmt_lhs, rhs2_def_stmt_lhs; ++ enum machine_mode rhs1_def_stmt_rhs1_mode, rhs2_def_stmt_rhs1_mode, rhs1_def_stmt_lhs_mode, rhs2_def_stmt_lhs_mode; ++ const_tree rhs1 = gimple_assign_rhs1(stmt); ++ const_tree rhs2 = gimple_assign_rhs2(stmt); ++ ++ if (is_gimple_constant(rhs1) || is_gimple_constant(rhs2)) ++ return false; ++ ++ gcc_assert(TREE_CODE(rhs1) == SSA_NAME && TREE_CODE(rhs2) == SSA_NAME); ++ ++ if (gimple_assign_rhs_code(stmt) != MINUS_EXPR) ++ return false; ++ ++ rhs1_def_stmt = get_def_stmt(rhs1); ++ rhs2_def_stmt = get_def_stmt(rhs2); ++ if (!gimple_assign_cast_p(rhs1_def_stmt) || !gimple_assign_cast_p(rhs2_def_stmt)) ++ return false; ++ ++ rhs1_def_stmt_rhs1 = gimple_assign_rhs1(rhs1_def_stmt); ++ rhs2_def_stmt_rhs1 = gimple_assign_rhs1(rhs2_def_stmt); ++ rhs1_def_stmt_lhs = gimple_assign_lhs(rhs1_def_stmt); ++ rhs2_def_stmt_lhs = gimple_assign_lhs(rhs2_def_stmt); ++ rhs1_def_stmt_rhs1_mode = TYPE_MODE(TREE_TYPE(rhs1_def_stmt_rhs1)); ++ rhs2_def_stmt_rhs1_mode = TYPE_MODE(TREE_TYPE(rhs2_def_stmt_rhs1)); ++ rhs1_def_stmt_lhs_mode = TYPE_MODE(TREE_TYPE(rhs1_def_stmt_lhs)); ++ rhs2_def_stmt_lhs_mode = TYPE_MODE(TREE_TYPE(rhs2_def_stmt_lhs)); ++ if (GET_MODE_BITSIZE(rhs1_def_stmt_rhs1_mode) <= GET_MODE_BITSIZE(rhs1_def_stmt_lhs_mode)) ++ return false; ++ if (GET_MODE_BITSIZE(rhs2_def_stmt_rhs1_mode) <= GET_MODE_BITSIZE(rhs2_def_stmt_lhs_mode)) ++ return false; ++ ++ pointer_set_insert(visited->no_cast_check, rhs1_def_stmt); ++ pointer_set_insert(visited->no_cast_check, rhs2_def_stmt); ++ return true; ++} ++ ++static gassign *create_binary_assign(struct visited *visited, enum tree_code code, gassign *stmt, tree rhs1, tree rhs2) ++{ ++ gassign *assign; ++ gimple_stmt_iterator gsi = gsi_for_stmt(stmt); ++ tree type = TREE_TYPE(rhs1); ++ tree lhs = create_new_var(type); ++ ++ gcc_assert(types_compatible_p(type, TREE_TYPE(rhs2))); ++ assign = as_a_gassign(gimple_build_assign_with_ops(code, lhs, rhs1, rhs2)); ++ gimple_assign_set_lhs(assign, make_ssa_name(lhs, assign)); ++ ++ gsi_insert_before(&gsi, assign, GSI_NEW_STMT); ++ update_stmt(assign); ++ pointer_set_insert(visited->my_stmts, assign); ++ return assign; ++} ++ ++static tree cast_to_TI_type(struct visited *visited, gassign *stmt, tree node) ++{ ++ gimple_stmt_iterator gsi; ++ const_gimple cast_stmt; ++ tree type = TREE_TYPE(node); ++ ++ if (types_compatible_p(type, intTI_type_node)) ++ return node; ++ ++ gsi = gsi_for_stmt(stmt); ++ cast_stmt = build_cast_stmt(visited, intTI_type_node, node, CREATE_NEW_VAR, &gsi, BEFORE_STMT, false); ++ pointer_set_insert(visited->my_stmts, cast_stmt); ++ return get_lhs(cast_stmt); ++} ++ ++static tree get_def_stmt_rhs(struct visited *visited, const_tree var) ++{ ++ tree rhs1, def_stmt_rhs1; ++ gimple rhs1_def_stmt, def_stmt_rhs1_def_stmt, def_stmt; ++ ++ def_stmt = get_def_stmt(var); ++ if (!gimple_assign_cast_p(def_stmt)) ++ return NULL_TREE; ++ gcc_assert(gimple_code(def_stmt) != GIMPLE_NOP && pointer_set_contains(visited->my_stmts, def_stmt) && gimple_assign_cast_p(def_stmt)); ++ ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ rhs1_def_stmt = get_def_stmt(rhs1); ++ if (!gimple_assign_cast_p(rhs1_def_stmt)) ++ return rhs1; ++ ++ def_stmt_rhs1 = gimple_assign_rhs1(rhs1_def_stmt); ++ def_stmt_rhs1_def_stmt = get_def_stmt(def_stmt_rhs1); ++ ++ switch (gimple_code(def_stmt_rhs1_def_stmt)) { ++ case GIMPLE_CALL: ++ case GIMPLE_NOP: ++ case GIMPLE_ASM: ++ case GIMPLE_PHI: ++ return def_stmt_rhs1; ++ case GIMPLE_ASSIGN: ++ return rhs1; ++ default: ++ debug_gimple_stmt(def_stmt_rhs1_def_stmt); ++ gcc_unreachable(); ++ } ++} ++ ++tree handle_integer_truncation(struct visited *visited, const_tree lhs) ++{ ++ tree new_rhs1, new_rhs2; ++ tree new_rhs1_def_stmt_rhs1, new_rhs2_def_stmt_rhs1, new_lhs; ++ gassign *assign, *stmt = as_a_gassign(get_def_stmt(lhs)); ++ tree rhs1 = gimple_assign_rhs1(stmt); ++ tree rhs2 = gimple_assign_rhs2(stmt); ++ ++ if (!is_subtraction_special(visited, stmt)) ++ return NULL_TREE; ++ ++ new_rhs1 = expand(visited, rhs1); ++ new_rhs2 = expand(visited, rhs2); ++ ++ new_rhs1_def_stmt_rhs1 = get_def_stmt_rhs(visited, new_rhs1); ++ new_rhs2_def_stmt_rhs1 = get_def_stmt_rhs(visited, new_rhs2); ++ ++ if (new_rhs1_def_stmt_rhs1 == NULL_TREE || new_rhs2_def_stmt_rhs1 == NULL_TREE) ++ return NULL_TREE; ++ ++ if (!types_compatible_p(TREE_TYPE(new_rhs1_def_stmt_rhs1), TREE_TYPE(new_rhs2_def_stmt_rhs1))) { ++ new_rhs1_def_stmt_rhs1 = cast_to_TI_type(visited, stmt, new_rhs1_def_stmt_rhs1); ++ new_rhs2_def_stmt_rhs1 = cast_to_TI_type(visited, stmt, new_rhs2_def_stmt_rhs1); ++ } ++ ++ assign = create_binary_assign(visited, MINUS_EXPR, stmt, new_rhs1_def_stmt_rhs1, new_rhs2_def_stmt_rhs1); ++ new_lhs = gimple_assign_lhs(assign); ++ check_size_overflow(assign, TREE_TYPE(new_lhs), new_lhs, rhs1, AFTER_STMT); ++ ++ return dup_assign(visited, stmt, lhs, new_rhs1, new_rhs2, NULL_TREE); ++} ++ ++bool is_a_neg_overflow(const gassign *stmt, const_tree rhs) ++{ ++ const_gimple def_stmt; ++ ++ if (TREE_CODE(rhs) != SSA_NAME) ++ return false; ++ ++ if (gimple_assign_rhs_code(stmt) != PLUS_EXPR) ++ return false; ++ ++ def_stmt = get_def_stmt(rhs); ++ if (!is_gimple_assign(def_stmt) || gimple_assign_rhs_code(def_stmt) != BIT_NOT_EXPR) ++ return false; ++ ++ return true; ++} ++ ++/* e.g., drivers/acpi/acpica/utids.c acpi_ut_execute_CID() ++ * ((count - 1) * sizeof(struct acpi_pnp_dee_id_list) -> (count + fffffff) * 16 ++ * fffffff * 16 > signed max -> truncate ++ */ ++static bool look_for_mult_and_add(const_gimple stmt) ++{ ++ const_tree res; ++ tree rhs1, rhs2, def_rhs1, def_rhs2, const_rhs, def_const_rhs; ++ const_gimple def_stmt; ++ ++ if (!stmt || gimple_code(stmt) == GIMPLE_NOP) ++ return false; ++ if (!is_gimple_assign(stmt)) ++ return false; ++ if (gimple_assign_rhs_code(stmt) != MULT_EXPR) ++ return false; ++ ++ rhs1 = gimple_assign_rhs1(stmt); ++ rhs2 = gimple_assign_rhs2(stmt); ++ if (is_gimple_constant(rhs1)) { ++ const_rhs = rhs1; ++ def_stmt = get_def_stmt(rhs2); ++ } else if (is_gimple_constant(rhs2)) { ++ const_rhs = rhs2; ++ def_stmt = get_def_stmt(rhs1); ++ } else ++ return false; ++ ++ if (!is_gimple_assign(def_stmt)) ++ return false; ++ ++ if (gimple_assign_rhs_code(def_stmt) != PLUS_EXPR && gimple_assign_rhs_code(def_stmt) != MINUS_EXPR) ++ return false; ++ ++ def_rhs1 = gimple_assign_rhs1(def_stmt); ++ def_rhs2 = gimple_assign_rhs2(def_stmt); ++ if (is_gimple_constant(def_rhs1)) ++ def_const_rhs = def_rhs1; ++ else if (is_gimple_constant(def_rhs2)) ++ def_const_rhs = def_rhs2; ++ else ++ return false; ++ ++ res = fold_binary_loc(gimple_location(def_stmt), MULT_EXPR, TREE_TYPE(const_rhs), const_rhs, def_const_rhs); ++ if (is_lt_signed_type_max(res) && is_gt_zero(res)) ++ return false; ++ return true; ++} ++ ++enum intentional_overflow_type add_mul_intentional_overflow(const gassign *stmt) ++{ ++ const_gimple def_stmt_1, def_stmt_2; ++ const_tree rhs1, rhs2; ++ bool add_mul_rhs1, add_mul_rhs2; ++ ++ rhs1 = gimple_assign_rhs1(stmt); ++ def_stmt_1 = get_def_stmt(rhs1); ++ add_mul_rhs1 = look_for_mult_and_add(def_stmt_1); ++ ++ rhs2 = gimple_assign_rhs2(stmt); ++ def_stmt_2 = get_def_stmt(rhs2); ++ add_mul_rhs2 = look_for_mult_and_add(def_stmt_2); ++ ++ if (add_mul_rhs1) ++ return RHS1_INTENTIONAL_OVERFLOW; ++ if (add_mul_rhs2) ++ return RHS2_INTENTIONAL_OVERFLOW; ++ return NO_INTENTIONAL_OVERFLOW; ++} ++ ++static gassign *get_dup_stmt(struct visited *visited, gassign *stmt) ++{ ++ gassign *my_stmt; ++ gimple_stmt_iterator gsi = gsi_for_stmt(stmt); ++ ++ gsi_next(&gsi); ++ my_stmt = as_a_gassign(gsi_stmt(gsi)); ++ ++ gcc_assert(pointer_set_contains(visited->my_stmts, my_stmt)); ++ if (gimple_assign_rhs_code(stmt) != gimple_assign_rhs_code(my_stmt)) { ++ fprintf(stderr, "%s != %s\n", get_tree_code_name(gimple_assign_rhs_code(stmt)), get_tree_code_name(gimple_assign_rhs_code(my_stmt))); ++ debug_gimple_stmt(stmt); ++ debug_gimple_stmt(my_stmt); ++ gcc_unreachable(); ++ } ++ ++ return my_stmt; ++} ++ ++/* unsigned type -> unary or binary assign (rhs1 or rhs2 is constant) ++ * unsigned type cast to signed type, unsigned type: no more uses ++ * e.g., lib/vsprintf.c:simple_strtol() ++ * _10 = (unsigned long int) _9 ++ * _11 = -_10; ++ * _12 = (long int) _11; (_11_ no more uses) ++ */ ++static bool is_call_or_cast(gimple stmt) ++{ ++ return gimple_assign_cast_p(stmt) || is_gimple_call(stmt); ++} ++ ++static bool is_unsigned_cast_or_call_def_stmt(const_tree node) ++{ ++ const_tree rhs; ++ gimple def_stmt; ++ ++ if (node == NULL_TREE) ++ return true; ++ if (is_gimple_constant(node)) ++ return true; ++ ++ def_stmt = get_def_stmt(node); ++ if (!def_stmt) ++ return false; ++ ++ if (is_call_or_cast(def_stmt)) ++ return true; ++ ++ if (!is_gimple_assign(def_stmt) || gimple_num_ops(def_stmt) != 2) ++ return false; ++ rhs = gimple_assign_rhs1(def_stmt); ++ def_stmt = get_def_stmt(rhs); ++ if (!def_stmt) ++ return false; ++ return is_call_or_cast(def_stmt); ++} ++ ++void unsigned_signed_cast_intentional_overflow(struct visited *visited, gassign *stmt) ++{ ++ unsigned int use_num; ++ gassign *so_stmt; ++ const_gimple def_stmt; ++ const_tree rhs1, rhs2; ++ tree rhs = gimple_assign_rhs1(stmt); ++ tree lhs_type = TREE_TYPE(gimple_assign_lhs(stmt)); ++ const_tree rhs_type = TREE_TYPE(rhs); ++ ++ if (!(TYPE_UNSIGNED(rhs_type) && !TYPE_UNSIGNED(lhs_type))) ++ return; ++ if (GET_MODE_BITSIZE(TYPE_MODE(rhs_type)) != GET_MODE_BITSIZE(TYPE_MODE(lhs_type))) ++ return; ++ use_num = uses_num(rhs); ++ if (use_num != 1) ++ return; ++ ++ def_stmt = get_def_stmt(rhs); ++ if (!def_stmt) ++ return; ++ if (!is_gimple_assign(def_stmt)) ++ return; ++ ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ if (!is_unsigned_cast_or_call_def_stmt(rhs1)) ++ return; ++ ++ rhs2 = gimple_assign_rhs2(def_stmt); ++ if (!is_unsigned_cast_or_call_def_stmt(rhs2)) ++ return; ++ if (gimple_num_ops(def_stmt) == 3 && !is_gimple_constant(rhs1) && !is_gimple_constant(rhs2)) ++ return; ++ ++ so_stmt = get_dup_stmt(visited, stmt); ++ create_up_and_down_cast(visited, so_stmt, lhs_type, gimple_assign_rhs1(so_stmt)); ++} ++ +diff --git a/tools/gcc/size_overflow_plugin/misc.c b/tools/gcc/size_overflow_plugin/misc.c +new file mode 100644 +index 0000000..c1b4773 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/misc.c +@@ -0,0 +1,441 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++const char *get_type_name_from_field(const_tree field_decl) ++{ ++ const_tree context, type_name; ++ ++ if (TREE_CODE(field_decl) != FIELD_DECL) ++ return NULL; ++ ++ context = DECL_CONTEXT(field_decl); ++ gcc_assert(TREE_CODE(context) == RECORD_TYPE); ++ type_name = TYPE_NAME(TYPE_MAIN_VARIANT(context)); ++ if (type_name == NULL_TREE) ++ return NULL; ++ ++ if (TREE_CODE(type_name) == IDENTIFIER_NODE) ++ return IDENTIFIER_POINTER(type_name); ++ else if (TREE_CODE(type_name) == TYPE_DECL) ++ return DECL_NAME_POINTER(type_name); ++ ++ debug_tree((tree)field_decl); ++ debug_tree((tree)type_name); ++ gcc_unreachable(); ++} ++ ++// Was the function created by the compiler itself? ++bool made_by_compiler(const_tree decl) ++{ ++ struct cgraph_node *node; ++ ++ if (FUNCTION_PTR_P(decl)) ++ return false; ++ if (TREE_CODE(decl) == VAR_DECL) ++ return false; ++ ++ gcc_assert(TREE_CODE(decl) == FUNCTION_DECL); ++ if (DECL_ABSTRACT_ORIGIN(decl) != NULL_TREE) ++ return true; ++ if (DECL_ARTIFICIAL(decl)) ++ return true; ++ ++ node = get_cnode(decl); ++ if (!node) ++ return false; ++ return node->clone_of != NULL; ++} ++ ++bool skip_types(const_tree var) ++{ ++ const_tree type; ++ ++ type = TREE_TYPE(var); ++ if (type == NULL_TREE) ++ return true; ++ ++ switch (TREE_CODE(type)) { ++ case INTEGER_TYPE: ++ case ENUMERAL_TYPE: ++ return false; ++ default: ++ return true; ++ } ++} ++ ++gimple get_fnptr_def_stmt(const_tree fn_ptr) ++{ ++ gimple def_stmt; ++ ++ gcc_assert(fn_ptr != NULL_TREE); ++ gcc_assert(FUNCTION_PTR_P(fn_ptr)); ++ ++ if (is_gimple_constant(fn_ptr)) ++ return NULL; ++ ++ def_stmt = get_def_stmt(fn_ptr); ++ gcc_assert(def_stmt); ++ return def_stmt; ++} ++ ++gimple get_def_stmt(const_tree node) ++{ ++ gcc_assert(node != NULL_TREE); ++ ++ if (TREE_CODE(node) != SSA_NAME) ++ return NULL; ++ return SSA_NAME_DEF_STMT(node); ++} ++ ++tree create_new_var(tree type) ++{ ++ tree new_var = create_tmp_var(type, "cicus"); ++ ++ add_referenced_var(new_var); ++ return new_var; ++} ++ ++static bool skip_cast(tree dst_type, const_tree rhs, bool force) ++{ ++ const_gimple def_stmt = get_def_stmt(rhs); ++ ++ if (force) ++ return false; ++ ++ if (is_gimple_constant(rhs)) ++ return false; ++ ++ if (!def_stmt || gimple_code(def_stmt) == GIMPLE_NOP) ++ return false; ++ ++ if (!types_compatible_p(dst_type, TREE_TYPE(rhs))) ++ return false; ++ ++ // DI type can be on 32 bit (from create_assign) but overflow type stays DI ++ if (LONG_TYPE_SIZE == GET_MODE_BITSIZE(SImode)) ++ return false; ++ ++ return true; ++} ++ ++tree cast_a_tree(tree type, tree var) ++{ ++ gcc_assert(type != NULL_TREE); ++ gcc_assert(var != NULL_TREE); ++ gcc_assert(fold_convertible_p(type, var)); ++ ++ return fold_convert(type, var); ++} ++ ++gimple build_cast_stmt(struct visited *visited, tree dst_type, tree rhs, tree lhs, gimple_stmt_iterator *gsi, bool before, bool force) ++{ ++ gassign *assign; ++ gimple def_stmt; ++ ++ gcc_assert(dst_type != NULL_TREE && rhs != NULL_TREE); ++ gcc_assert(!is_gimple_constant(rhs)); ++ if (gsi_end_p(*gsi) && before == AFTER_STMT) ++ gcc_unreachable(); ++ ++ def_stmt = get_def_stmt(rhs); ++ if (def_stmt && gimple_code(def_stmt) != GIMPLE_NOP && skip_cast(dst_type, rhs, force) && pointer_set_contains(visited->my_stmts, def_stmt)) ++ return def_stmt; ++ ++ if (lhs == CREATE_NEW_VAR) ++ lhs = create_new_var(dst_type); ++ ++ assign = gimple_build_assign(lhs, cast_a_tree(dst_type, rhs)); ++ ++ if (!gsi_end_p(*gsi)) { ++ location_t loc = gimple_location(gsi_stmt(*gsi)); ++ gimple_set_location(assign, loc); ++ } ++ ++ gimple_assign_set_lhs(assign, make_ssa_name(lhs, assign)); ++ ++ if (before) ++ gsi_insert_before(gsi, assign, GSI_NEW_STMT); ++ else ++ gsi_insert_after(gsi, assign, GSI_NEW_STMT); ++ update_stmt(assign); ++ return assign; ++} ++ ++bool is_size_overflow_type(const_tree var) ++{ ++ const char *name; ++ const_tree type_name, type; ++ ++ if (var == NULL_TREE) ++ return false; ++ ++ type = TREE_TYPE(var); ++ type_name = TYPE_NAME(type); ++ if (type_name == NULL_TREE) ++ return false; ++ ++ if (DECL_P(type_name)) ++ name = DECL_NAME_POINTER(type_name); ++ else ++ name = IDENTIFIER_POINTER(type_name); ++ ++ if (!strncmp(name, "size_overflow_type", 18)) ++ return true; ++ return false; ++} ++ ++// Determine if a cloned function has all the original arguments ++static bool unchanged_arglist(struct cgraph_node *new_node, struct cgraph_node *old_node) ++{ ++ const_tree new_decl_list, old_decl_list; ++ ++ if (new_node->clone_of && new_node->clone.tree_map) ++ return !new_node->clone.args_to_skip; ++ ++ new_decl_list = DECL_ARGUMENTS(NODE_DECL(new_node)); ++ old_decl_list = DECL_ARGUMENTS(NODE_DECL(old_node)); ++ if (new_decl_list != NULL_TREE && old_decl_list != NULL_TREE) ++ gcc_assert(list_length(new_decl_list) == list_length(old_decl_list)); ++ ++ return true; ++} ++ ++unsigned int get_correct_argnum_fndecl(const_tree fndecl, const_tree correct_argnum_of_fndecl, unsigned int num) ++{ ++ unsigned int new_num; ++ const_tree fndecl_arg; ++ tree fndecl_arglist = DECL_ARGUMENTS(fndecl); ++ const_tree arg, target_fndecl_arglist; ++ ++ if (num == 0) ++ return num; ++ ++ if (fndecl == correct_argnum_of_fndecl && !DECL_ARTIFICIAL(fndecl)) ++ return num; ++ else if (fndecl == correct_argnum_of_fndecl && DECL_ARTIFICIAL(fndecl)) ++ return CANNOT_FIND_ARG; ++ ++ target_fndecl_arglist = DECL_ARGUMENTS(correct_argnum_of_fndecl); ++ if (fndecl_arglist == NULL_TREE || target_fndecl_arglist == NULL_TREE) ++ return CANNOT_FIND_ARG; ++ ++ fndecl_arg = chain_index(num - 1, fndecl_arglist); ++ gcc_assert(fndecl_arg != NULL_TREE); ++ ++ for (arg = target_fndecl_arglist, new_num = 1; arg; arg = TREE_CHAIN(arg), new_num++) { ++ if (arg == fndecl_arg || !strcmp(DECL_NAME_POINTER(arg), DECL_NAME_POINTER(fndecl_arg))) ++ return new_num; ++ } ++ ++ return CANNOT_FIND_ARG; ++} ++ ++// Find the specified argument in the originally cloned function ++static unsigned int clone_argnum_on_orig(struct cgraph_node *new_node, struct cgraph_node *old_node, unsigned int clone_argnum) ++{ ++ bitmap args_to_skip; ++ unsigned int i, new_argnum = clone_argnum; ++ ++ if (unchanged_arglist(new_node, old_node)) ++ return clone_argnum; ++ ++ gcc_assert(new_node->clone_of && new_node->clone.tree_map); ++ args_to_skip = new_node->clone.args_to_skip; ++ for (i = 0; i < clone_argnum; i++) { ++ if (bitmap_bit_p(args_to_skip, i)) ++ new_argnum++; ++ } ++ return new_argnum; ++} ++ ++// Find the specified argument in the clone ++static unsigned int orig_argnum_on_clone(struct cgraph_node *new_node, struct cgraph_node *old_node, unsigned int orig_argnum) ++{ ++ bitmap args_to_skip; ++ unsigned int i, new_argnum = orig_argnum; ++ ++ if (unchanged_arglist(new_node, old_node)) ++ return orig_argnum; ++ ++ gcc_assert(new_node->clone_of && new_node->clone.tree_map); ++ args_to_skip = new_node->clone.args_to_skip; ++ if (bitmap_bit_p(args_to_skip, orig_argnum - 1)) ++ // XXX torolni kellene a nodeot ++ return CANNOT_FIND_ARG; ++ ++ for (i = 0; i < orig_argnum; i++) { ++ if (bitmap_bit_p(args_to_skip, i)) ++ new_argnum--; ++ } ++ return new_argnum; ++} ++ ++// Associate the argument between a clone and a cloned function ++static unsigned int get_correct_argnum_cnode(struct cgraph_node *node, struct cgraph_node *correct_argnum_of_node, unsigned int argnum) ++{ ++ bool node_clone, correct_argnum_of_node_clone; ++ const_tree correct_argnum_of_node_decl, node_decl; ++ ++ if (node == correct_argnum_of_node) ++ return argnum; ++ if (argnum == 0) ++ return argnum; ++ ++ correct_argnum_of_node_decl = NODE_DECL(correct_argnum_of_node); ++ gcc_assert(correct_argnum_of_node_decl != NULL_TREE); ++ gcc_assert(correct_argnum_of_node && !DECL_ARTIFICIAL(correct_argnum_of_node_decl)); ++ ++ if (node) { ++ node_decl = NODE_DECL(node); ++ gcc_assert(!DECL_ARTIFICIAL(node_decl)); ++ node_clone = made_by_compiler(node_decl); ++ } else { ++ node_decl = NULL_TREE; ++ node_clone = false; ++ } ++ ++ if (correct_argnum_of_node_decl == node_decl) ++ return argnum; ++ ++ correct_argnum_of_node_clone = made_by_compiler(correct_argnum_of_node_decl); ++ // the original decl is lost if both nodes are clones ++ if (node_clone && correct_argnum_of_node_clone) { ++ gcc_assert(unchanged_arglist(node, correct_argnum_of_node)); ++ return argnum; ++ } ++ ++ if (node_clone && !correct_argnum_of_node_clone) ++ return clone_argnum_on_orig(correct_argnum_of_node, node, argnum); ++ else if (!node_clone && correct_argnum_of_node_clone) ++ return orig_argnum_on_clone(correct_argnum_of_node, node, argnum); ++ ++ if (node) ++ debug_tree((tree)NODE_DECL(node)); ++ debug_tree((tree)correct_argnum_of_node_decl); ++ gcc_unreachable(); ++} ++ ++unsigned int get_correct_argnum(const_tree decl, const_tree correct_argnum_of_decl, unsigned int argnum) ++{ ++ struct cgraph_node *node, *correct_argnum_of_node; ++ ++ gcc_assert(decl != NULL_TREE); ++ gcc_assert(correct_argnum_of_decl != NULL_TREE); ++ ++ correct_argnum_of_node = get_cnode(correct_argnum_of_decl); ++ if (!correct_argnum_of_node || DECL_ARTIFICIAL(decl) || DECL_ARTIFICIAL(correct_argnum_of_decl)) ++ return get_correct_argnum_fndecl(decl, correct_argnum_of_decl, argnum); ++ ++ node = get_cnode(decl); ++ return get_correct_argnum_cnode(node, correct_argnum_of_node, argnum); ++} ++ ++// Find the original cloned function ++tree get_orig_fndecl(const_tree clone_fndecl) ++{ ++ struct cgraph_node *node; ++ ++ if (DECL_ABSTRACT_ORIGIN(clone_fndecl)) ++ return (tree)DECL_ORIGIN(clone_fndecl); ++ node = get_cnode(clone_fndecl); ++ if (!node) ++ return (tree)clone_fndecl; ++ ++ while (node->clone_of) ++ node = node->clone_of; ++ if (!made_by_compiler(NODE_DECL(node))) ++ return NODE_DECL(node); ++ // Return the cloned decl because it is needed for the transform callback ++ return (tree)clone_fndecl; ++} ++ ++static tree get_interesting_fndecl_from_stmt(const gcall *stmt) ++{ ++ if (gimple_call_num_args(stmt) == 0) ++ return NULL_TREE; ++ return gimple_call_fndecl(stmt); ++} ++ ++tree get_interesting_orig_fndecl_from_stmt(const gcall *stmt) ++{ ++ tree fndecl; ++ ++ fndecl = get_interesting_fndecl_from_stmt(stmt); ++ if (fndecl == NULL_TREE) ++ return NULL_TREE; ++ return get_orig_fndecl(fndecl); ++} ++ ++void set_dominance_info(void) ++{ ++ calculate_dominance_info(CDI_DOMINATORS); ++ calculate_dominance_info(CDI_POST_DOMINATORS); ++} ++ ++void unset_dominance_info(void) ++{ ++ free_dominance_info(CDI_DOMINATORS); ++ free_dominance_info(CDI_POST_DOMINATORS); ++} ++ ++void set_current_function_decl(tree fndecl) ++{ ++ gcc_assert(fndecl != NULL_TREE); ++ ++ push_cfun(DECL_STRUCT_FUNCTION(fndecl)); ++#if BUILDING_GCC_VERSION <= 4007 ++ current_function_decl = fndecl; ++#endif ++ set_dominance_info(); ++} ++ ++void unset_current_function_decl(void) ++{ ++ unset_dominance_info(); ++#if BUILDING_GCC_VERSION <= 4007 ++ current_function_decl = NULL_TREE; ++#endif ++ pop_cfun(); ++} ++ ++bool is_valid_cgraph_node(struct cgraph_node *node) ++{ ++ if (cgraph_function_body_availability(node) == AVAIL_NOT_AVAILABLE) ++ return false; ++ if (node->thunk.thunk_p || node->alias) ++ return false; ++ return true; ++} ++ ++tree get_lhs(const_gimple stmt) ++{ ++ switch (gimple_code(stmt)) { ++ case GIMPLE_ASSIGN: ++ case GIMPLE_CALL: ++ return gimple_get_lhs(stmt); ++ case GIMPLE_PHI: ++ return gimple_phi_result(stmt); ++ default: ++ debug_gimple_stmt((gimple)stmt); ++ gcc_unreachable(); ++ } ++} ++ +diff --git a/tools/gcc/size_overflow_plugin/remove_unnecessary_dup.c b/tools/gcc/size_overflow_plugin/remove_unnecessary_dup.c +new file mode 100644 +index 0000000..5622b51 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/remove_unnecessary_dup.c +@@ -0,0 +1,137 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++bool skip_expr_on_double_type(const gassign *stmt) ++{ ++ enum tree_code code = gimple_assign_rhs_code(stmt); ++ ++ switch (code) { ++ case RSHIFT_EXPR: ++ case TRUNC_DIV_EXPR: ++ case CEIL_DIV_EXPR: ++ case FLOOR_DIV_EXPR: ++ case ROUND_DIV_EXPR: ++ case EXACT_DIV_EXPR: ++ case RDIV_EXPR: ++ case TRUNC_MOD_EXPR: ++ case CEIL_MOD_EXPR: ++ case FLOOR_MOD_EXPR: ++ case ROUND_MOD_EXPR: ++ return true; ++ default: ++ return false; ++ } ++} ++ ++void create_up_and_down_cast(struct visited *visited, gassign *use_stmt, tree orig_type, tree rhs) ++{ ++ const_tree orig_rhs1; ++ tree down_lhs, new_lhs, dup_type = TREE_TYPE(rhs); ++ const_gimple down_cast, up_cast; ++ gimple_stmt_iterator gsi = gsi_for_stmt(use_stmt); ++ ++ down_cast = build_cast_stmt(visited, orig_type, rhs, CREATE_NEW_VAR, &gsi, BEFORE_STMT, false); ++ down_lhs = get_lhs(down_cast); ++ ++ gsi = gsi_for_stmt(use_stmt); ++ up_cast = build_cast_stmt(visited, dup_type, down_lhs, CREATE_NEW_VAR, &gsi, BEFORE_STMT, false); ++ new_lhs = get_lhs(up_cast); ++ ++ orig_rhs1 = gimple_assign_rhs1(use_stmt); ++ if (operand_equal_p(orig_rhs1, rhs, 0)) ++ gimple_assign_set_rhs1(use_stmt, new_lhs); ++ else ++ gimple_assign_set_rhs2(use_stmt, new_lhs); ++ update_stmt(use_stmt); ++ ++ pointer_set_insert(visited->my_stmts, up_cast); ++ pointer_set_insert(visited->my_stmts, down_cast); ++ pointer_set_insert(visited->skip_expr_casts, up_cast); ++ pointer_set_insert(visited->skip_expr_casts, down_cast); ++} ++ ++static tree get_proper_unsigned_half_type(const_tree node) ++{ ++ tree new_type, type; ++ ++ gcc_assert(is_size_overflow_type(node)); ++ ++ type = TREE_TYPE(node); ++ switch (TYPE_MODE(type)) { ++ case HImode: ++ new_type = unsigned_intQI_type_node; ++ break; ++ case SImode: ++ new_type = unsigned_intHI_type_node; ++ break; ++ case DImode: ++ new_type = unsigned_intSI_type_node; ++ break; ++ case TImode: ++ new_type = unsigned_intDI_type_node; ++ break; ++ default: ++ gcc_unreachable(); ++ } ++ ++ if (TYPE_QUALS(type) != 0) ++ return build_qualified_type(new_type, TYPE_QUALS(type)); ++ return new_type; ++} ++ ++static void insert_cast_rhs(struct visited *visited, gassign *stmt, tree rhs) ++{ ++ tree type; ++ ++ if (rhs == NULL_TREE) ++ return; ++ if (!is_size_overflow_type(rhs)) ++ return; ++ ++ type = get_proper_unsigned_half_type(rhs); ++ if (is_gimple_constant(rhs)) ++ return; ++ create_up_and_down_cast(visited, stmt, type, rhs); ++} ++ ++static void insert_cast(struct visited *visited, gassign *stmt, tree rhs) ++{ ++ if (LONG_TYPE_SIZE == GET_MODE_BITSIZE(SImode) && !is_size_overflow_type(rhs)) ++ return; ++ gcc_assert(is_size_overflow_type(rhs)); ++ insert_cast_rhs(visited, stmt, rhs); ++} ++ ++void insert_cast_expr(struct visited *visited, gassign *stmt, enum intentional_overflow_type type) ++{ ++ tree rhs1, rhs2; ++ ++ if (type == NO_INTENTIONAL_OVERFLOW || type == RHS1_INTENTIONAL_OVERFLOW) { ++ rhs1 = gimple_assign_rhs1(stmt); ++ insert_cast(visited, stmt, rhs1); ++ } ++ ++ if (type == NO_INTENTIONAL_OVERFLOW || type == RHS2_INTENTIONAL_OVERFLOW) { ++ rhs2 = gimple_assign_rhs2(stmt); ++ insert_cast(visited, stmt, rhs2); ++ } ++} ++ +diff --git a/tools/gcc/size_overflow_plugin/size_overflow.h b/tools/gcc/size_overflow_plugin/size_overflow.h +new file mode 100644 +index 0000000..07e2ba7 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/size_overflow.h +@@ -0,0 +1,281 @@ ++#ifndef SIZE_OVERFLOW_H ++#define SIZE_OVERFLOW_H ++ ++#define CREATE_NEW_VAR NULL_TREE ++#define MAX_PARAM 31 ++#define CANNOT_FIND_ARG 32 ++#define NONE_ARGNUM 32 ++ ++#define BEFORE_STMT true ++#define AFTER_STMT false ++ ++#define TURN_OFF_ASM_STR "# size_overflow MARK_TURN_OFF " ++#define YES_ASM_STR "# size_overflow MARK_YES " ++#define END_INTENTIONAL_ASM_STR "# size_overflow MARK_END_INTENTIONAL " ++#define SO_ASM_STR "# size_overflow " ++#define OK_ASM_STR "# size_overflow MARK_NO" ++ ++#define FUNCTION_PTR_P(node) \ ++ (TREE_CODE(TREE_TYPE(node)) == POINTER_TYPE && (TREE_CODE(TREE_TYPE(TREE_TYPE(node))) == FUNCTION_TYPE || TREE_CODE(TREE_TYPE(TREE_TYPE(node))) == METHOD_TYPE)) ++ ++#define CODES_LIMIT 32 ++ ++#define GLOBAL_NIFN_LEN 65536 ++#define NO_HASH 65537 ++ ++#include "gcc-common.h" ++ ++#include <string.h> ++#include <limits.h> ++ ++enum intentional_mark { ++ MARK_NO, MARK_YES, MARK_END_INTENTIONAL, MARK_TURN_OFF ++}; ++ ++enum intentional_overflow_type { ++ NO_INTENTIONAL_OVERFLOW, RHS1_INTENTIONAL_OVERFLOW, RHS2_INTENTIONAL_OVERFLOW ++}; ++ ++enum size_overflow_mark { ++ NO_SO_MARK, YES_SO_MARK, ASM_STMT_SO_MARK ++}; ++ ++struct decl_hash { ++ size_t tree_codes_len; ++ unsigned char tree_codes[CODES_LIMIT]; ++ const_tree decl; ++ unsigned int hash; ++ const char *fn_name; ++}; ++ ++struct next_interesting_function; ++typedef struct next_interesting_function * next_interesting_function_t; ++ ++#if BUILDING_GCC_VERSION <= 4007 ++DEF_VEC_P(next_interesting_function_t); ++DEF_VEC_ALLOC_P(next_interesting_function_t, heap); ++#endif ++ ++#if BUILDING_GCC_VERSION >= 5000 ++typedef struct hash_set<const_gimple> gimple_set; ++ ++static inline bool pointer_set_insert(gimple_set *visited, const_gimple stmt) ++{ ++ return visited->add(stmt); ++} ++ ++static inline bool pointer_set_contains(gimple_set *visited, const_gimple stmt) ++{ ++ return visited->contains(stmt); ++} ++ ++static inline gimple_set* pointer_set_create(void) ++{ ++ return new hash_set<const_gimple>; ++} ++ ++static inline void pointer_set_destroy(gimple_set *visited) ++{ ++ delete visited; ++} ++ ++typedef struct hash_set<next_interesting_function_t> next_interesting_function_set; ++ ++static inline bool pointer_set_insert(next_interesting_function_set *visited, next_interesting_function_t node) ++{ ++ return visited->add(node); ++} ++ ++static inline bool pointer_set_contains(next_interesting_function_set *visited, next_interesting_function_t node) ++{ ++ return visited->contains(node); ++} ++ ++static inline next_interesting_function_set *next_interesting_function_pointer_set_create(void) ++{ ++ return new hash_set<next_interesting_function_t>; ++} ++ ++static inline void pointer_set_destroy(next_interesting_function_set *visited) ++{ ++ delete visited; ++} ++#else ++typedef struct pointer_set_t gimple_set; ++typedef struct pointer_set_t next_interesting_function_set; ++ ++static inline next_interesting_function_set *next_interesting_function_pointer_set_create(void) ++{ ++ return pointer_set_create(); ++} ++#endif ++ ++struct visited { ++ gimple_set *stmts; ++ gimple_set *my_stmts; ++ gimple_set *skip_expr_casts; ++ gimple_set *no_cast_check; ++}; ++ ++/* ++ * * children: callers with data flow into the integer parameter of decl ++ * * decl_name: name of the function or the field ++ * * context: the containing type name for a function pointer (or "fielddecl" if the type has no name), otherwise either "vardecl" or "fndecl" ++ * * hash: hash num of the function ++ * * num: parameter number (1-31) or return value (0) ++ * * marked: determines whether to duplicate stmts and/or look for missing hashtable entries ++ * * orig_next_node: pointer to the originally cloned function ++ */ ++struct next_interesting_function { ++ next_interesting_function_t next; ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC(next_interesting_function_t, heap) *children; ++#else ++ vec<next_interesting_function_t, va_heap, vl_embed> *children; ++#endif ++ const char *decl_name; ++ const char *context; ++ unsigned int hash; ++ unsigned int num; ++ enum size_overflow_mark marked; ++ next_interesting_function_t orig_next_node; ++}; ++ ++// size_overflow_plugin.c ++extern tree report_size_overflow_decl; ++extern tree size_overflow_type_HI; ++extern tree size_overflow_type_SI; ++extern tree size_overflow_type_DI; ++extern tree size_overflow_type_TI; ++ ++ ++// size_overflow_plugin_hash.c ++struct size_overflow_hash { ++ const struct size_overflow_hash * const next; ++ const char * const name; ++ const unsigned int param; ++}; ++ ++extern const char *get_orig_decl_name(const_tree decl); ++extern bool is_size_overflow_asm(const_gimple stmt); ++extern void print_missing_function(next_interesting_function_t node); ++extern const struct size_overflow_hash *get_size_overflow_hash_entry_tree(const_tree fndecl, unsigned int argnum); ++extern unsigned int find_arg_number_tree(const_tree arg, const_tree func); ++extern unsigned int get_decl_hash(const_tree decl, const char *decl_name); ++extern const struct size_overflow_hash *get_size_overflow_hash_entry(unsigned int hash, const char *decl_name, unsigned int argnum); ++ ++ ++// intentional_overflow.c ++extern tree get_size_overflow_asm_input(const gasm *stmt); ++extern enum intentional_mark check_intentional_asm(const_gimple stmt, unsigned int argnum); ++extern bool is_size_overflow_insert_check_asm(const gasm *stmt); ++extern enum intentional_mark check_intentional_attribute(const_gimple stmt, unsigned int argnum); ++extern enum intentional_mark get_so_asm_type(const_gimple stmt); ++extern const_tree get_attribute(const char* attr_name, const_tree decl); ++extern bool is_a_cast_and_const_overflow(const_tree no_const_rhs); ++extern bool is_const_plus_unsigned_signed_truncation(const_tree lhs); ++extern bool is_a_constant_overflow(const gassign *stmt, const_tree rhs); ++extern tree handle_intentional_overflow(struct visited *visited, bool check_overflow, gassign *stmt, tree change_rhs, tree new_rhs2); ++extern tree handle_integer_truncation(struct visited *visited, const_tree lhs); ++extern bool is_a_neg_overflow(const gassign *stmt, const_tree rhs); ++extern enum intentional_overflow_type add_mul_intentional_overflow(const gassign *stmt); ++extern void unsigned_signed_cast_intentional_overflow(struct visited *visited, gassign *stmt); ++ ++ ++// insert_size_overflow_asm.c ++#if BUILDING_GCC_VERSION >= 4009 ++extern opt_pass *make_insert_size_overflow_asm_pass(void); ++#else ++extern struct opt_pass *make_insert_size_overflow_asm_pass(void); ++#endif ++extern bool search_interesting_args(tree fndecl, bool *argnums); ++ ++ ++// misc.c ++extern unsigned int get_correct_argnum_fndecl(const_tree fndecl, const_tree correct_argnum_of_fndecl, unsigned int num); ++extern const char *get_type_name_from_field(const_tree field_decl); ++extern void set_dominance_info(void); ++extern void unset_dominance_info(void); ++extern tree get_interesting_orig_fndecl_from_stmt(const gcall *stmt); ++extern tree get_orig_fndecl(const_tree clone_fndecl); ++extern unsigned int get_correct_argnum(const_tree decl, const_tree correct_argnum_of_decl, unsigned int argnum); ++extern bool is_valid_cgraph_node(struct cgraph_node *node); ++extern void set_current_function_decl(tree fndecl); ++extern void unset_current_function_decl(void); ++extern gimple get_def_stmt(const_tree node); ++extern tree create_new_var(tree type); ++extern gimple build_cast_stmt(struct visited *visited, tree dst_type, tree rhs, tree lhs, gimple_stmt_iterator *gsi, bool before, bool force); ++extern bool skip_types(const_tree var); ++extern tree cast_a_tree(tree type, tree var); ++extern bool is_size_overflow_type(const_tree var); ++extern bool made_by_compiler(const_tree decl); ++extern gimple get_fnptr_def_stmt(const_tree fn_ptr); ++extern tree get_lhs(const_gimple stmt); ++ ++ ++// size_overflow_transform.c ++extern unsigned int size_overflow_transform(struct cgraph_node *node); ++extern tree handle_fnptr_assign(const_gimple stmt); ++ ++ ++// size_overflow_transform_core.c ++extern tree expand(struct visited *visited, tree lhs); ++extern void check_size_overflow(gimple stmt, tree size_overflow_type, tree cast_rhs, tree rhs, bool before); ++extern tree dup_assign(struct visited *visited, gassign *oldstmt, const_tree node, tree rhs1, tree rhs2, tree __unused rhs3); ++extern tree create_assign(struct visited *visited, gimple oldstmt, tree rhs1, bool before); ++ ++ ++// remove_unnecessary_dup.c ++extern struct opt_pass *make_remove_unnecessary_dup_pass(void); ++extern void insert_cast_expr(struct visited *visited, gassign *stmt, enum intentional_overflow_type type); ++extern bool skip_expr_on_double_type(const gassign *stmt); ++extern void create_up_and_down_cast(struct visited *visited, gassign *use_stmt, tree orig_type, tree rhs); ++ ++ ++// size_overflow_ipa.c ++extern void add_to_global_next_interesting_function(next_interesting_function_t new_entry); ++extern bool has_next_interesting_function_vec(next_interesting_function_t parent, next_interesting_function_t child); ++extern void push_child(next_interesting_function_t parent, next_interesting_function_t child); ++extern struct cgraph_node *get_cnode(const_tree fndecl); ++extern next_interesting_function_t global_next_interesting_function[GLOBAL_NIFN_LEN]; ++extern next_interesting_function_t get_global_next_interesting_function_entry(const char *decl_name, const char *context, unsigned int hash, unsigned int num, enum size_overflow_mark marked); ++extern next_interesting_function_t get_global_next_interesting_function_entry_with_hash(const_tree decl, const char *decl_name, unsigned int num, enum size_overflow_mark marked); ++extern void size_overflow_register_hooks(void); ++#if BUILDING_GCC_VERSION >= 4009 ++extern opt_pass *make_size_overflow_functions_pass(void); ++#else ++extern struct opt_pass *make_size_overflow_functions_pass(void); ++#endif ++extern void size_overflow_node_removal_hook(struct cgraph_node *node, void *data); ++extern next_interesting_function_t get_and_create_next_node_from_global_next_nodes(tree decl, unsigned int num, enum size_overflow_mark marked, next_interesting_function_t orig_next_node); ++extern next_interesting_function_t create_new_next_interesting_decl(tree decl, const char *decl_name, unsigned int num, enum size_overflow_mark marked, next_interesting_function_t orig_next_node); ++extern next_interesting_function_t create_new_next_interesting_entry(const char *decl_name, const char *context, unsigned int hash, unsigned int num, enum size_overflow_mark marked, next_interesting_function_t orig_next_node); ++ ++ ++// size_overflow_lto.c ++extern void size_overflow_read_summary_lto(void); ++#if BUILDING_GCC_VERSION >= 4008 ++extern void size_overflow_write_summary_lto(void); ++#elif BUILDING_GCC_VERSION >= 4006 ++extern void size_overflow_write_summary_lto(cgraph_node_set set, varpool_node_set vset); ++#else ++extern void size_overflow_write_summary_lto(cgraph_node_set set); ++#endif ++ ++// size_overflow_fnptrs.c ++extern next_interesting_function_t handle_function_ptr_ret(gimple_set *visited, next_interesting_function_t next_cnodes_head, const_tree fn_ptr); ++extern void check_local_variables(next_interesting_function_t next_node); ++extern void check_global_variables(next_interesting_function_t cur_global); ++extern next_interesting_function_t get_and_create_next_node_from_global_next_nodes_fnptr(const_tree fn_ptr, unsigned int num, enum size_overflow_mark marked); ++ ++ ++// size_overflow_debug.c ++extern void __unused print_intentional_mark(enum intentional_mark mark); ++extern unsigned int __unused size_overflow_dump_function(FILE *file, struct cgraph_node *node); ++extern void __unused print_next_interesting_functions_chain(next_interesting_function_t head, bool only_this); ++extern void __unused print_global_next_interesting_functions(void); ++extern void __unused print_children_chain_list(next_interesting_function_t next_node); ++extern void __unused print_all_next_node_children_chain_list(next_interesting_function_t next_node); ++extern const char * __unused print_so_mark_name(enum size_overflow_mark mark); ++ ++#endif +diff --git a/tools/gcc/size_overflow_plugin/size_overflow_debug.c b/tools/gcc/size_overflow_plugin/size_overflow_debug.c +new file mode 100644 +index 0000000..b8e7188 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/size_overflow_debug.c +@@ -0,0 +1,164 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++void __unused print_intentional_mark(enum intentional_mark mark) ++{ ++ fprintf(stderr, "intentional mark: "); ++ switch (mark) { ++ case MARK_NO: ++ fprintf(stderr, "mark_no\n"); ++ break; ++ case MARK_YES: ++ fprintf(stderr, "mark_yes\n"); ++ break; ++ case MARK_TURN_OFF: ++ fprintf(stderr, "mark_turn_off\n"); ++ break; ++ case MARK_END_INTENTIONAL: ++ fprintf(stderr, "mark_end_intentional\n"); ++ break; ++ } ++} ++ ++unsigned int __unused size_overflow_dump_function(FILE *file, struct cgraph_node *node) ++{ ++ basic_block bb; ++ ++ fprintf(file, "dump_function function_name: %s\n", cgraph_node_name(node)); ++ ++ fprintf(file, "\nstmts:\n"); ++ FOR_ALL_BB_FN(bb, DECL_STRUCT_FUNCTION(NODE_DECL(node))) { ++ gimple_stmt_iterator si; ++ ++ fprintf(file, "<bb %u>:\n", bb->index); ++ for (si = gsi_start_phis(bb); !gsi_end_p(si); gsi_next(&si)) ++ print_gimple_stmt(file, gsi_stmt(si), 0, TDF_VOPS|TDF_MEMSYMS); ++ for (si = gsi_start_bb(bb); !gsi_end_p(si); gsi_next(&si)) ++ print_gimple_stmt(file, gsi_stmt(si), 0, TDF_VOPS|TDF_MEMSYMS); ++ fprintf(file, "\n"); ++ } ++ ++ fprintf(file, "---------------------------------\n"); ++ ++ return 0; ++} ++ ++static void __unused print_next_interesting_function(next_interesting_function_t node) ++{ ++ unsigned int i; ++ next_interesting_function_t cur; ++ ++ if (!node) ++ return; ++ ++ fprintf(stderr, "print_next_interesting_function: ptr: %p, ", node); ++ fprintf(stderr, "decl_name: %s, ", node->decl_name); ++ ++ fprintf(stderr, "num: %u marked: %s context: %s\n", node->num, print_so_mark_name(node->marked), node->context); ++#if BUILDING_GCC_VERSION <= 4007 ++ if (VEC_empty(next_interesting_function_t, node->children)) ++ return; ++ FOR_EACH_VEC_ELT(next_interesting_function_t, node->children, i, cur) { ++#else ++ FOR_EACH_VEC_SAFE_ELT(node->children, i, cur) { ++#endif ++ fprintf(stderr, "\t%u. child: %s %u %p\n", i + 1, cur->decl_name, cur->num, cur); ++ } ++} ++ ++// Dump the full next_interesting_function_t list for parsing by print_dependecy.py ++void __unused print_next_interesting_functions_chain(next_interesting_function_t head, bool only_this) ++{ ++ next_interesting_function_t cur; ++ unsigned int len; ++ ++ fprintf(stderr, "----------------------\nnext_interesting_function_t head: %p\n", head); ++ for (cur = head, len = 0; cur; cur = cur->next, len++) { ++ fprintf(stderr, "%u. ", len + 1); ++ print_next_interesting_function(cur); ++ ++ fprintf(stderr, "+++++ has orig node: %p +++++\n", cur->orig_next_node); ++ print_next_interesting_function(cur->orig_next_node); ++ ++ if (only_this) ++ break; ++ } ++ ++ fprintf(stderr, "len: %u\n----------------------\n\n\n", len + 1); ++} ++ ++void __unused print_global_next_interesting_functions(void) ++{ ++ unsigned int i; ++ ++ fprintf(stderr, "----------------------\nprint_global_next_interesting_functions:\n----------------------\n"); ++ for (i = 0; i < GLOBAL_NIFN_LEN; i++) { ++ if (!global_next_interesting_function[i]) ++ continue; ++ fprintf(stderr, "hash: %u\n", i); ++ print_next_interesting_functions_chain(global_next_interesting_function[i], false); ++ } ++ fprintf(stderr, "----------------------\n\n"); ++} ++ ++// Dump the information related to the specified next_interesting_function_t for parsing by print_dependecy.py ++void __unused print_children_chain_list(next_interesting_function_t next_node) ++{ ++ next_interesting_function_t cur; ++ unsigned int i; ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ if (VEC_empty(next_interesting_function_t, next_node->children)) ++ return; ++ FOR_EACH_VEC_ELT(next_interesting_function_t, next_node->children, i, cur) { ++#else ++ FOR_EACH_VEC_SAFE_ELT(next_node->children, i, cur) { ++#endif ++ fprintf(stderr, "parent: %s %u (marked: %s) child: %s %u\n", next_node->decl_name, next_node->num, print_so_mark_name(next_node->marked), cur->decl_name, cur->num); ++ print_children_chain_list(cur); ++ } ++} ++ ++void __unused print_all_next_node_children_chain_list(next_interesting_function_t head) ++{ ++ next_interesting_function_t cur; ++ ++ for (cur = head; cur; cur = cur->next) { ++#if BUILDING_GCC_VERSION <= 4007 ++ if (VEC_empty(next_interesting_function_t, cur->children)) ++#else ++ if (vec_safe_length(cur->children) == 0) ++#endif ++ continue; ++ fprintf(stderr, "############ START ############\n"); ++ print_children_chain_list(cur); ++ fprintf(stderr, "############ END ############\n"); ++ } ++} ++ ++const char * __unused print_so_mark_name(enum size_overflow_mark mark) ++{ ++ if (mark == ASM_STMT_SO_MARK) ++ return "asm_stmt_so_mark"; ++ if (mark == YES_SO_MARK) ++ return "yes_so_mark"; ++ return "no_so_mark"; ++} +diff --git a/tools/gcc/size_overflow_plugin/size_overflow_hash.data b/tools/gcc/size_overflow_plugin/size_overflow_hash.data +new file mode 100644 +index 0000000..e3e2614 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/size_overflow_hash.data +@@ -0,0 +1,27716 @@ ++intel_fake_agp_alloc_by_type_1 intel_fake_agp_alloc_by_type 1 1 NULL nohasharray ++iwl_set_tx_power_1 iwl_set_tx_power 0 1 &intel_fake_agp_alloc_by_type_1 ++ocfs2_get_refcount_tree_3 ocfs2_get_refcount_tree 0 3 NULL ++smsc95xx_mdio_read_10 smsc95xx_mdio_read 0 10 NULL ++ext3_writeback_write_end_11 ext3_writeback_write_end 5-0 11 NULL ++show_ioc_guid_17 show_ioc_guid 0 17 NULL ++lpfc_topology_show_18 lpfc_topology_show 0 18 NULL nohasharray ++chassis_clear_18 chassis_clear 0-4 18 &lpfc_topology_show_18 ++mmc_sdio_init_card_20 mmc_sdio_init_card 0 20 NULL ++storvsc_connect_to_vsp_22 storvsc_connect_to_vsp 2 22 NULL ++compat_sock_setsockopt_23 compat_sock_setsockopt 5 23 NULL ++rio_disc_mport_26 rio_disc_mport 0 26 NULL ++carl9170_alloc_27 carl9170_alloc 1 27 NULL ++target_core_dev_wwn_show_attr_vpd_unit_serial_33 target_core_dev_wwn_show_attr_vpd_unit_serial 0 33 NULL ++show_ipv4_iface_dhcp_dns_address_en_34 show_ipv4_iface_dhcp_dns_address_en 0 34 NULL ++eeprom_93xx46_ew_42 eeprom_93xx46_ew 0 42 NULL ++atl1e_phy_commit_44 atl1e_phy_commit 0 44 NULL ++iwlagn_rxon_connect_53 iwlagn_rxon_connect 0 53 NULL ++sel_read_policyvers_55 sel_read_policyvers 3-0 55 NULL nohasharray ++padzero_55 padzero 1 55 &sel_read_policyvers_55 nohasharray ++ext3_xattr_security_list_55 ext3_xattr_security_list 0-5 55 &padzero_55 ++cfg80211_disconnected_57 cfg80211_disconnected 4 57 NULL ++tps65910_rtc_alarm_irq_enable_59 tps65910_rtc_alarm_irq_enable 0 59 NULL ++lp3971_ldo_enable_63 lp3971_ldo_enable 0 63 NULL nohasharray ++lxfb_check_var_63 lxfb_check_var 0 63 &lp3971_ldo_enable_63 ++__skb_to_sgvec_72 __skb_to_sgvec 0 72 NULL ++_nfs41_test_stateid_76 _nfs41_test_stateid 0 76 NULL ++gadget_strings_product_store_78 gadget_strings_product_store 0-3 78 NULL ++uwb_dev_LQE_show_86 uwb_dev_LQE_show 0 86 NULL ++snd_korg1212_copy_to_92 snd_korg1212_copy_to 6 92 NULL ++load_msg_95 load_msg 2 95 NULL ++bnx2_reset_chip_101 bnx2_reset_chip 0 101 NULL ++fat_statfs_102 fat_statfs 0 102 NULL ++ov9650_set_hvflip_105 ov9650_set_hvflip 0 105 NULL ++nilfs_direct_insert_106 nilfs_direct_insert 0 106 NULL ++af9015_ctrl_msg_107 af9015_ctrl_msg 0 107 NULL ++device_flush_iotlb_115 device_flush_iotlb 3-2 115 NULL ++ipath_verbs_send_117 ipath_verbs_send 5-3 117 NULL ++nilfs_transaction_commit_119 nilfs_transaction_commit 0 119 NULL ++_rtl_prep_rx_urb_122 _rtl_prep_rx_urb 0 122 NULL ++wl1273_fm_stop_125 wl1273_fm_stop 0 125 NULL ++smack_syslog_126 smack_syslog 0 126 NULL ++init_q_132 init_q 4 132 NULL ++btrfs_setxattr_135 btrfs_setxattr 0 135 NULL ++xfs_inobt_free_block_139 xfs_inobt_free_block 0 139 NULL ++memstick_alloc_host_142 memstick_alloc_host 1 142 NULL ++gfs2_glock_get_147 gfs2_glock_get 0 147 NULL nohasharray ++st_magn_buffer_predisable_147 st_magn_buffer_predisable 0 147 &gfs2_glock_get_147 ++wusb_dev_4way_handshake_150 wusb_dev_4way_handshake 0 150 NULL ++ping_v6_sendmsg_152 ping_v6_sendmsg 0-4 152 NULL ++scsi_dh_handler_attach_153 scsi_dh_handler_attach 0 153 NULL nohasharray ++tracing_trace_options_write_153 tracing_trace_options_write 3 153 &scsi_dh_handler_attach_153 ++set_max_uV_156 set_max_uV 0-4 156 NULL ++cm_suspend_prepare_161 cm_suspend_prepare 0 161 NULL ++pci_request_selected_regions_169 pci_request_selected_regions 0 169 NULL ++mv88e6352_wait_178 mv88e6352_wait 0 178 NULL ++pvr2_buffer_queue_181 pvr2_buffer_queue 0 181 NULL nohasharray ++rtl_op_add_interface_181 rtl_op_add_interface 0 181 &pvr2_buffer_queue_181 ++iscsi_nacl_auth_show_authenticate_target_183 iscsi_nacl_auth_show_authenticate_target 0 183 NULL ++tda18212_get_if_frequency_185 tda18212_get_if_frequency 0 185 NULL ++ds2780_store_eeprom_188 ds2780_store_eeprom 0 188 NULL ++xfs_buf_item_get_format_189 xfs_buf_item_get_format 2 189 NULL ++xfs_bmap_btalloc_192 xfs_bmap_btalloc 0 192 NULL nohasharray ++max8998_rtc_stop_alarm_192 max8998_rtc_stop_alarm 0 192 &xfs_bmap_btalloc_192 ++iscsi_session_setup_196 iscsi_session_setup 5-4 196 NULL ++palmas_write_197 palmas_write 0 197 NULL ++nes_inetaddr_event_198 nes_inetaddr_event 0 198 NULL ++obd_proc_jobid_var_seq_write_199 obd_proc_jobid_var_seq_write 3 199 NULL ++dbg_leb_map_204 dbg_leb_map 0 204 NULL ++owned_show_208 owned_show 0 208 NULL ++create_bind_cap_vol_ctl_209 create_bind_cap_vol_ctl 0 209 NULL ++store_cpufv_215 store_cpufv 0-4 215 NULL ++snd_cx18_pcm_prepare_219 snd_cx18_pcm_prepare 0 219 NULL nohasharray ++target_stat_scsi_auth_intr_show_attr_write_mbytes_219 target_stat_scsi_auth_intr_show_attr_write_mbytes 0 219 &snd_cx18_pcm_prepare_219 ++path_init_220 path_init 0 220 NULL ++mt9m111_set_autowhitebalance_221 mt9m111_set_autowhitebalance 0 221 NULL ++__gfs2_setattr_simple_228 __gfs2_setattr_simple 0 228 NULL ++shdma_init_232 shdma_init 3 232 NULL ++aux1_show_233 aux1_show 0 233 NULL ++class_pktcdvd_store_remove_235 class_pktcdvd_store_remove 0-4 235 NULL ++netlbl_unlhsh_remove_237 netlbl_unlhsh_remove 0 237 NULL ++usb_pcwd_notify_sys_241 usb_pcwd_notify_sys 0 241 NULL ++ore_write_243 ore_write 0 243 NULL ++ac_read_244 ac_read 0-3 244 NULL ++vlan_proc_add_dev_245 vlan_proc_add_dev 0 245 NULL ++ll_xattr_cache_seq_write_250 ll_xattr_cache_seq_write 3 250 NULL ++vpdma_create_desc_list_255 vpdma_create_desc_list 2 255 NULL ++rt73usb_enable_radio_258 rt73usb_enable_radio 0 258 NULL ++sctp_assoc_set_bind_addr_from_ep_263 sctp_assoc_set_bind_addr_from_ep 0 263 NULL ++setup_stream_272 setup_stream 0 272 NULL nohasharray ++mxl111sf_ctrl_msg_272 mxl111sf_ctrl_msg 0 272 &setup_stream_272 ++xfs_dabuf_map_277 xfs_dabuf_map 0 277 NULL ++lp855x_get_chip_id_278 lp855x_get_chip_id 0 278 NULL nohasharray ++iscsi_tpg_attrib_show_demo_mode_write_protect_278 iscsi_tpg_attrib_show_demo_mode_write_protect 0 278 &lp855x_get_chip_id_278 ++print_cpu_modalias_279 print_cpu_modalias 0 279 NULL ++bdx_change_mtu_282 bdx_change_mtu 0 282 NULL ++read_file_war_stats_292 read_file_war_stats 3-0 292 NULL nohasharray ++fm10k_find_next_vlan_292 fm10k_find_next_vlan 2-0 292 &read_file_war_stats_292 ++xfs_zero_last_block_298 xfs_zero_last_block 0-2-3 298 NULL nohasharray ++ipvlan_open_298 ipvlan_open 0 298 &xfs_zero_last_block_298 ++grgpio_to_irq_300 grgpio_to_irq 2 300 NULL nohasharray ++sctp_make_control_300 sctp_make_control 4 300 &grgpio_to_irq_300 ++pin_configs_show_303 pin_configs_show 0 303 NULL ++SYSC_connect_304 SYSC_connect 3 304 NULL ++syslog_print_307 syslog_print 2-0 307 NULL ++iscsi_stat_instance_show_attr_nodes_309 iscsi_stat_instance_show_attr_nodes 0 309 NULL ++platform_device_add_data_310 platform_device_add_data 0-3 310 NULL ++wl1251_cmd_interrogate_311 wl1251_cmd_interrogate 0 311 NULL ++dn_setsockopt_314 dn_setsockopt 5-0 314 NULL ++next_bitstream_show_315 next_bitstream_show 0 315 NULL nohasharray ++cpumask_parselist_user_315 cpumask_parselist_user 0 315 &next_bitstream_show_315 ++nilfs_btree_last_key_316 nilfs_btree_last_key 0 316 NULL ++next_node_allowed_318 next_node_allowed 1-0 318 NULL ++batadv_interface_open_321 batadv_interface_open 0 321 NULL ++snd_seq_delete_port_322 snd_seq_delete_port 0 322 NULL ++show_tabletMouseLeft_325 show_tabletMouseLeft 0 325 NULL ++ath9k_wmi_cmd_327 ath9k_wmi_cmd 0-4 327 NULL ++show_ipv6_iface_nd_stale_tmo_328 show_ipv6_iface_nd_stale_tmo 0 328 NULL nohasharray ++ceph_sync_read_328 ceph_sync_read 0 328 &show_ipv6_iface_nd_stale_tmo_328 ++btrfs_calc_avail_data_space_329 btrfs_calc_avail_data_space 0 329 NULL ++map_urb_for_dma_332 map_urb_for_dma 0 332 NULL ++rv3029c2_rtc_read_time_335 rv3029c2_rtc_read_time 0 335 NULL ++gadget_strings_manufacturer_store_337 gadget_strings_manufacturer_store 0-3 337 NULL ++scsiback_tpg_param_store_alias_338 scsiback_tpg_param_store_alias 0-3 338 NULL ++tg3_get_eeprom_len_352 tg3_get_eeprom_len 0 352 NULL ++ghash_setkey_353 ghash_setkey 0 353 NULL ++DMAbuf_getrdbuffer_354 DMAbuf_getrdbuffer 0 354 NULL nohasharray ++add_automute_mode_enum_354 add_automute_mode_enum 0 354 &DMAbuf_getrdbuffer_354 ++show_conn_param_ISCSI_PARAM_IP_FRAGMENT_DISABLE_359 show_conn_param_ISCSI_PARAM_IP_FRAGMENT_DISABLE 0 359 NULL ++mlx5_core_access_reg_361 mlx5_core_access_reg 3-5 361 NULL ++si4713_tx_rds_buff_364 si4713_tx_rds_buff 0 364 NULL nohasharray ++boottime_get_364 boottime_get 0 364 &si4713_tx_rds_buff_364 nohasharray ++genphy_config_init_364 genphy_config_init 0 364 &boottime_get_364 ++batadv_originator_init_367 batadv_originator_init 0 367 NULL ++igb_get_rxfh_indir_size_372 igb_get_rxfh_indir_size 0 372 NULL nohasharray ++rf_set_freq_372 rf_set_freq 0 372 &igb_get_rxfh_indir_size_372 ++cxgb4vf_get_regs_len_373 cxgb4vf_get_regs_len 0 373 NULL nohasharray ++fanotify_get_response_373 fanotify_get_response 0 373 &cxgb4vf_get_regs_len_373 ++cxacru_sysfs_store_adsl_config_375 cxacru_sysfs_store_adsl_config 0-4 375 NULL ++cmtp_send_interopmsg_376 cmtp_send_interopmsg 7 376 NULL ++gameport_description_show_382 gameport_description_show 0 382 NULL ++dump_fh_385 dump_fh 0 385 NULL nohasharray ++set_low_power_385 set_low_power 0-4 385 &dump_fh_385 ++xfs_dir_fsync_390 xfs_dir_fsync 0 390 NULL ++lpfc_fcp_io_sched_show_392 lpfc_fcp_io_sched_show 0 392 NULL ++gp2ap020a00f_exec_cmd_399 gp2ap020a00f_exec_cmd 0 399 NULL ++pn_sock_get_port_400 pn_sock_get_port 0 400 NULL ++ath5k_reset_404 ath5k_reset 0 404 NULL ++hw_device_state_409 hw_device_state 0 409 NULL ++aio_read_events_ring_410 aio_read_events_ring 3 410 NULL nohasharray ++__bitmap_parselist_410 __bitmap_parselist 0 410 &aio_read_events_ring_410 ++show_fcstat_fcp_output_megabytes_411 show_fcstat_fcp_output_megabytes 0 411 NULL nohasharray ++ebitmap_cpy_411 ebitmap_cpy 0 411 &show_fcstat_fcp_output_megabytes_411 ++async_copy_data_414 async_copy_data 4 414 NULL ++max6902_get_reg_417 max6902_get_reg 0 417 NULL ++lbs_rdmac_read_418 lbs_rdmac_read 3-0 418 NULL ++__uac_clock_find_source_419 __uac_clock_find_source 0 419 NULL ++ems_usb_open_422 ems_usb_open 0 422 NULL ++patch_alc861_423 patch_alc861 0 423 NULL ++oprofile_set_timeout_432 oprofile_set_timeout 0 432 NULL ++lua_sysfs_read_control_433 lua_sysfs_read_control 0-5-6 433 NULL ++null_init_434 null_init 0 434 NULL nohasharray ++swsusp_swap_check_434 swsusp_swap_check 0 434 &null_init_434 ++usbtv_configure_for_norm_437 usbtv_configure_for_norm 0 437 NULL nohasharray ++buffer_cpu_notify_437 buffer_cpu_notify 0 437 &usbtv_configure_for_norm_437 ++tw9910_mask_set_438 tw9910_mask_set 0 438 NULL ++ds1286_set_alarm_440 ds1286_set_alarm 0 440 NULL ++acpi_ev_create_gpe_block_441 acpi_ev_create_gpe_block 6 441 NULL ++msr_write_444 msr_write 0-3 444 NULL ++ath5k_add_interface_447 ath5k_add_interface 0 447 NULL ++wl1271_power_on_450 wl1271_power_on 0 450 NULL ++fat_ent_bread_451 fat_ent_bread 0 451 NULL ++ath5k_hw_channel_452 ath5k_hw_channel 0 452 NULL ++hid_sensor_power_state_453 hid_sensor_power_state 0 453 NULL ++show_console_458 show_console 0 458 NULL ++regcache_lzo_compress_464 regcache_lzo_compress 0 464 NULL nohasharray ++core_alua_show_nonop_delay_msecs_464 core_alua_show_nonop_delay_msecs 0 464 ®cache_lzo_compress_464 ++bnx2x_compare_fw_ver_466 bnx2x_compare_fw_ver 0 466 NULL ++smack_inode_getxattr_469 smack_inode_getxattr 0 469 NULL ++_alloc_get_attr_desc_470 _alloc_get_attr_desc 2 470 NULL nohasharray ++dib0700_i2c_xfer_legacy_470 dib0700_i2c_xfer_legacy 0 470 &_alloc_get_attr_desc_470 ++reg_show_state_474 reg_show_state 0 474 NULL ++dccp_manip_pkt_476 dccp_manip_pkt 4 476 NULL ++sparse_index_init_482 sparse_index_init 0 482 NULL ++videobuf_streamon_485 videobuf_streamon 0 485 NULL ++cfs_trace_set_debug_mb_usrstr_486 cfs_trace_set_debug_mb_usrstr 2 486 NULL ++nvme_trans_modesel_data_488 nvme_trans_modesel_data 4 488 NULL ++saa7146_s_ctrl_492 saa7146_s_ctrl 0 492 NULL ++rmd256_init_494 rmd256_init 0 494 NULL ++solo_queue_setup_497 solo_queue_setup 0 497 NULL ++eventfd_ctx_read_499 eventfd_ctx_read 0 499 NULL ++iwl_dbgfs_protection_mode_write_502 iwl_dbgfs_protection_mode_write 3-0 502 NULL ++read_vbt_r0_503 read_vbt_r0 1 503 NULL ++rx_rx_defrag_end_read_505 rx_rx_defrag_end_read 3-0 505 NULL ++hotkey_source_mask_show_508 hotkey_source_mask_show 0 508 NULL ++smp_send_cmd_512 smp_send_cmd 3 512 NULL ++ezx_pcap_set_bits_514 ezx_pcap_set_bits 0 514 NULL ++_snd_pcm_hw_param_first_516 _snd_pcm_hw_param_first 0 516 NULL ++tomoyo_socket_sendmsg_permission_521 tomoyo_socket_sendmsg_permission 0 521 NULL ++airo_change_mtu_522 airo_change_mtu 0 522 NULL ++nilfs_direct_last_key_525 nilfs_direct_last_key 0 525 NULL ++ocfs2_validate_meta_ecc_bhs_527 ocfs2_validate_meta_ecc_bhs 0 527 NULL nohasharray ++vmci_transport_stream_dequeue_527 vmci_transport_stream_dequeue 0-3 527 &ocfs2_validate_meta_ecc_bhs_527 nohasharray ++sdio_claim_irq_527 sdio_claim_irq 0 527 &vmci_transport_stream_dequeue_527 ++roccat_common2_sysfs_write_light_control_528 roccat_common2_sysfs_write_light_control 0-6-5 528 NULL ++store_temp_type_531 store_temp_type 0-4 531 NULL ++show_temp_pwm_532 show_temp_pwm 0 532 NULL nohasharray ++csio_t5_mc_read_532 csio_t5_mc_read 0 532 &show_temp_pwm_532 ++radeonfb_set_par_533 radeonfb_set_par 0 533 NULL ++zlib_deflate_workspacesize_537 zlib_deflate_workspacesize 0-2-1 537 NULL ++s5p_mfc_alloc_dec_temp_buffers_v6_539 s5p_mfc_alloc_dec_temp_buffers_v6 0 539 NULL ++iwl_dbgfs_wowlan_sram_read_540 iwl_dbgfs_wowlan_sram_read 3-0 540 NULL ++dle_count_543 dle_count 0 543 NULL ++broadsheet_spiflash_read_range_547 broadsheet_spiflash_read_range 0 547 NULL ++devres_alloc_551 devres_alloc 2 551 NULL ++sco_sock_setsockopt_552 sco_sock_setsockopt 5-0 552 NULL ++init_560 init 0 560 NULL nohasharray ++store_lid_resume_560 store_lid_resume 0-4 560 &init_560 ++dev_hard_header_565 dev_hard_header 0 565 NULL nohasharray ++start_isoc_chain_565 start_isoc_chain 2 565 &dev_hard_header_565 ++sha256_ssse3_export_568 sha256_ssse3_export 0 568 NULL ++musb_g_ep0_queue_573 musb_g_ep0_queue 0 573 NULL ++myri10ge_open_577 myri10ge_open 0 577 NULL ++show_fnode_auto_snd_tgt_disable_582 show_fnode_auto_snd_tgt_disable 0 582 NULL nohasharray ++layout_store_582 layout_store 0-3 582 &show_fnode_auto_snd_tgt_disable_582 ++compat_sys_preadv_583 compat_sys_preadv 3 583 NULL ++wdt_notify_sys_584 wdt_notify_sys 0 584 NULL ++fb_check_caps_585 fb_check_caps 0 585 NULL ++dln2_i2c_xfer_589 dln2_i2c_xfer 0-3 589 NULL nohasharray ++_nfs4_lookup_root_589 _nfs4_lookup_root 0 589 &dln2_i2c_xfer_589 ++smk_write_load_self2_591 smk_write_load_self2 3-0 591 NULL ++card_id_show_592 card_id_show 0 592 NULL nohasharray ++adp8870_bl_ambient_light_level_show_592 adp8870_bl_ambient_light_level_show 0 592 &card_id_show_592 ++show_rdac4_594 show_rdac4 0 594 NULL nohasharray ++sctp_v6_addr_to_user_594 sctp_v6_addr_to_user 0 594 &show_rdac4_594 ++sdr_cap_buf_prepare_600 sdr_cap_buf_prepare 0 600 NULL ++fan_set_level_safe_602 fan_set_level_safe 0 602 NULL ++iscsi_stat_sess_err_attr_show_603 iscsi_stat_sess_err_attr_show 0 603 NULL ++ni_gpct_device_construct_610 ni_gpct_device_construct 5 610 NULL ++show_speed_scan_613 show_speed_scan 0 613 NULL ++pmcraid_show_drv_version_614 pmcraid_show_drv_version 0 614 NULL ++fuse_request_alloc_nofs_617 fuse_request_alloc_nofs 1 617 NULL ++ptlrpc_lprocfs_nrs_seq_write_621 ptlrpc_lprocfs_nrs_seq_write 3 621 NULL ++sysfs_acpi_set_625 sysfs_acpi_set 3-0 625 NULL ++viafb_dfpl_proc_write_627 viafb_dfpl_proc_write 3-0 627 NULL ++isp1760_register_628 isp1760_register 1-2 628 NULL ++store_temp_auto_offset_632 store_temp_auto_offset 0-4 632 NULL ++bus_for_each_drv_634 bus_for_each_drv 0 634 NULL ++drbd_bm_find_next_643 drbd_bm_find_next 2 643 NULL nohasharray ++qla2x00_fabric_param_show_643 qla2x00_fabric_param_show 0 643 &drbd_bm_find_next_643 nohasharray ++cfs_hash_bkt_size_643 cfs_hash_bkt_size 0 643 &qla2x00_fabric_param_show_643 ++unlink_queued_645 unlink_queued 3-4 645 NULL nohasharray ++i40e_vsi_open_645 i40e_vsi_open 0 645 &unlink_queued_645 ++iscsi_nacl_auth_show_password_mutual_648 iscsi_nacl_auth_show_password_mutual 0 648 NULL ++read_650 read 0-5-6 650 NULL ++device_bind_driver_651 device_bind_driver 0 651 NULL nohasharray ++kovaplus_sysfs_set_actual_profile_651 kovaplus_sysfs_set_actual_profile 0-4 651 &device_bind_driver_651 ++max2165_set_params_652 max2165_set_params 0 652 NULL ++dtim_interval_read_654 dtim_interval_read 3-0 654 NULL ++cifs_strict_readv_656 cifs_strict_readv 0 656 NULL ++mpage_readpage_658 mpage_readpage 0 658 NULL ++si476x_core_cmd_fm_rds_status_663 si476x_core_cmd_fm_rds_status 0 663 NULL ++show_ds_req_665 show_ds_req 0 665 NULL ++gr_add_dma_desc_668 gr_add_dma_desc 0 668 NULL ++nvif_notify_new_671 nvif_notify_new 6 671 NULL ++div_u64_rem_672 div_u64_rem 0 672 NULL ++xfrm_aevent_msgsize_674 xfrm_aevent_msgsize 0 674 NULL ++mem_rx_free_mem_blks_read_675 mem_rx_free_mem_blks_read 3-0 675 NULL ++qla4xxx_soft_reset_676 qla4xxx_soft_reset 0 676 NULL ++idt77252_init_tx_682 idt77252_init_tx 0 682 NULL ++sys_sendfile64_687 sys_sendfile64 4 687 NULL ++cxacru_sysfs_showattr_bool_692 cxacru_sysfs_showattr_bool 0 692 NULL ++loop_attr_do_show_offset_696 loop_attr_do_show_offset 0 696 NULL nohasharray ++snd_seq_cell_alloc_696 snd_seq_cell_alloc 0 696 &loop_attr_do_show_offset_696 ++vfio_cap_init_698 vfio_cap_init 0 698 NULL ++max8925_reg_read_700 max8925_reg_read 0 700 NULL ++padata_sysfs_show_701 padata_sysfs_show 0 701 NULL ++suspend_703 suspend 0 703 NULL ++rtl8169_try_rx_copy_705 rtl8169_try_rx_copy 3 705 NULL ++ocfs2_fast_symlink_readpage_711 ocfs2_fast_symlink_readpage 0 711 NULL ++ipath_resize_cq_712 ipath_resize_cq 2 712 NULL nohasharray ++caif_connect_req_to_link_param_712 caif_connect_req_to_link_param 0 712 &ipath_resize_cq_712 ++i8k_hwmon_set_pwm_713 i8k_hwmon_set_pwm 0-4 713 NULL ++ovl_removexattr_714 ovl_removexattr 0 714 NULL ++disk_max_parts_719 disk_max_parts 0 719 NULL ++ecryptfs_get_lower_file_724 ecryptfs_get_lower_file 0 724 NULL ++common_perm_726 common_perm 0 726 NULL ++sctp_setsockopt_peer_addr_params_734 sctp_setsockopt_peer_addr_params 3-0 734 NULL nohasharray ++mlx4_enable_sriov_734 mlx4_enable_sriov 4-3 734 &sctp_setsockopt_peer_addr_params_734 ++tpm_inf_recv_735 tpm_inf_recv 0-3 735 NULL ++wm8962_gpio_direction_out_738 wm8962_gpio_direction_out 0 738 NULL nohasharray ++provisioning_mode_show_738 provisioning_mode_show 0 738 &wm8962_gpio_direction_out_738 ++store_selfballooning_741 store_selfballooning 0-4 741 NULL ++c2port_read_dr_742 c2port_read_dr 0 742 NULL nohasharray ++ubifs_budget_space_742 ubifs_budget_space 0 742 &c2port_read_dr_742 ++srp_send_req_748 srp_send_req 0 748 NULL ++ddp_set_map_751 ddp_set_map 4 751 NULL ++xfs_xattr_set_752 xfs_xattr_set 0 752 NULL ++dvb_video_write_754 dvb_video_write 3-0 754 NULL ++show_node_type_755 show_node_type 0 755 NULL ++mc13783_gpo_regulator_disable_757 mc13783_gpo_regulator_disable 0 757 NULL ++nilfs_snapshot_attr_show_760 nilfs_snapshot_attr_show 0 760 NULL ++add_stereo_sw_763 add_stereo_sw 0 763 NULL ++vx_start_stream_766 vx_start_stream 0 766 NULL nohasharray ++mpage_writepage_766 mpage_writepage 0 766 &vx_start_stream_766 nohasharray ++reconfigure_port_766 reconfigure_port 0 766 &mpage_writepage_766 ++netxen_show_diag_mode_767 netxen_show_diag_mode 0 767 NULL ++show_counter_rx_p1_hdr_egr_ovfls_775 show_counter_rx_p1_hdr_egr_ovfls 0 775 NULL ++s3c_hsotg_ep_queue_778 s3c_hsotg_ep_queue 0 778 NULL ++dbg_check_tnc_779 dbg_check_tnc 0 779 NULL ++ceph_monc_do_statfs_781 ceph_monc_do_statfs 0 781 NULL nohasharray ++cfs_trace_allocate_string_buffer_781 cfs_trace_allocate_string_buffer 2 781 &ceph_monc_do_statfs_781 ++av7110_ir_proc_write_784 av7110_ir_proc_write 0-3 784 NULL nohasharray ++jbd2_journal_dirty_metadata_784 jbd2_journal_dirty_metadata 0 784 &av7110_ir_proc_write_784 ++int3402_thermal_get_zone_temp_790 int3402_thermal_get_zone_temp 0 790 NULL ++ath6kl_disconnect_timeout_write_794 ath6kl_disconnect_timeout_write 3-0 794 NULL ++mwifiex_cmd_802_11_scan_ext_803 mwifiex_cmd_802_11_scan_ext 0 803 NULL ++i2c_hid_power_806 i2c_hid_power 0 806 NULL ++ath5k_rxbuf_setup_807 ath5k_rxbuf_setup 0 807 NULL ++sb16_audio_prepare_for_input_808 sb16_audio_prepare_for_input 0 808 NULL nohasharray ++ping_check_bind_addr_808 ping_check_bind_addr 0 808 &sb16_audio_prepare_for_input_808 ++driver_sysfs_add_809 driver_sysfs_add 0 809 NULL ++__vmalloc_node_range_811 __vmalloc_node_range 1 811 NULL nohasharray ++sdo_g_mbus_fmt_811 sdo_g_mbus_fmt 0 811 &__vmalloc_node_range_811 ++csio_vport_create_812 csio_vport_create 0 812 NULL ++dlm_attr_store_813 dlm_attr_store 0-4 813 NULL ++if_writecmd_815 if_writecmd 2 815 NULL ++wl1251_boot_upload_nvs_817 wl1251_boot_upload_nvs 0 817 NULL ++igb_request_irq_821 igb_request_irq 0 821 NULL ++si4713_read_property_825 si4713_read_property 0 825 NULL ++read_mmd_indirect_826 read_mmd_indirect 0 826 NULL nohasharray ++read_fifo_826 read_fifo 3 826 &read_mmd_indirect_826 ++brightness_get_837 brightness_get 0 837 NULL nohasharray ++wl1251_op_start_837 wl1251_op_start 0 837 &brightness_get_837 ++sht15_update_measurements_838 sht15_update_measurements 0 838 NULL nohasharray ++netprio_device_event_838 netprio_device_event 0 838 &sht15_update_measurements_838 ++show_capability_841 show_capability 0 841 NULL ++SyS_write_846 SyS_write 3 846 NULL ++tnc_next_848 tnc_next 0 848 NULL ++um_idi_read_850 um_idi_read 3-0 850 NULL ++tid_show_853 tid_show 0 853 NULL ++watchdog_write_856 watchdog_write 0-3 856 NULL ++phy_ethtool_gset_857 phy_ethtool_gset 0 857 NULL ++error_state_read_859 error_state_read 6-0-5 859 NULL ++reqbufs_output_860 reqbufs_output 0 860 NULL ++iio_triggered_buffer_predisable_861 iio_triggered_buffer_predisable 0 861 NULL nohasharray ++port100_alloc_skb_861 port100_alloc_skb 2 861 &iio_triggered_buffer_predisable_861 ++tuner_i2c_xfer_send_recv_864 tuner_i2c_xfer_send_recv 0-5 864 NULL ++btrfs_dirty_inode_868 btrfs_dirty_inode 0 868 NULL ++ipr_read_trace_869 ipr_read_trace 6-0-5 869 NULL nohasharray ++ace_set_mac_addr_869 ace_set_mac_addr 0 869 &ipr_read_trace_869 ++epx_c3_notify_sys_871 epx_c3_notify_sys 0 871 NULL ++i2c_wait_done_873 i2c_wait_done 0 873 NULL ++link_mem_sections_878 link_mem_sections 0 878 NULL ++iwl_dbgfs_fh_reg_read_879 iwl_dbgfs_fh_reg_read 3-0 879 NULL nohasharray ++o2net_send_message_vec_879 o2net_send_message_vec 4 879 &iwl_dbgfs_fh_reg_read_879 ++show_conn_param_ISCSI_PARAM_PING_TMO_881 show_conn_param_ISCSI_PARAM_PING_TMO 0 881 NULL ++fc2580_wr_reg_ff_883 fc2580_wr_reg_ff 0 883 NULL nohasharray ++qla4_8xxx_sysfs_write_fw_dump_883 qla4_8xxx_sysfs_write_fw_dump 0-6-5 883 &fc2580_wr_reg_ff_883 ++set_node_desc_885 set_node_desc 0-4 885 NULL ++show_fnode_max_burst_len_889 show_fnode_max_burst_len 0 889 NULL ++vsock_stream_sendmsg_898 vsock_stream_sendmsg 0-4 898 NULL ++drv_attr_show_903 drv_attr_show 0 903 NULL nohasharray ++regulator_bulk_enable_903 regulator_bulk_enable 0 903 &drv_attr_show_903 ++tcpprobe_read_904 tcpprobe_read 0-3 904 NULL ++snd_pcm_action_single_905 snd_pcm_action_single 0 905 NULL ++set_file_info_909 set_file_info 0 909 NULL ++mci_seconds_show_913 mci_seconds_show 0 913 NULL ++prod_id1_show_921 prod_id1_show 0 921 NULL nohasharray ++__reqbufs_921 __reqbufs 0 921 &prod_id1_show_921 ++play_video_cb_923 play_video_cb 2 923 NULL nohasharray ++kernel_sendpage_923 kernel_sendpage 4 923 &play_video_cb_923 ++pm_runtime_get_sync_925 pm_runtime_get_sync 0 925 NULL nohasharray ++nfs4_do_fsinfo_925 nfs4_do_fsinfo 0 925 &pm_runtime_get_sync_925 ++wm8350_rtc_start_alarm_927 wm8350_rtc_start_alarm 0 927 NULL ++snd_ensoniq_trigger_933 snd_ensoniq_trigger 0 933 NULL ++regulator_enable_regmap_934 regulator_enable_regmap 0 934 NULL ++ath10k_htt_h2t_stats_req_936 ath10k_htt_h2t_stats_req 0 936 NULL nohasharray ++ad5360_write_unlocked_936 ad5360_write_unlocked 0 936 &ath10k_htt_h2t_stats_req_936 ++navman_write_938 navman_write 0-4 938 NULL ++em25xx_bus_B_check_for_device_946 em25xx_bus_B_check_for_device 0 946 NULL ++carl9170_cmd_buf_950 carl9170_cmd_buf 3 950 NULL nohasharray ++xudc_start_950 xudc_start 0 950 &carl9170_cmd_buf_950 ++__nodes_weight_956 __nodes_weight 0 956 NULL ++lpfc_fdmi_on_show_958 lpfc_fdmi_on_show 0 958 NULL nohasharray ++nilfs_btree_prepare_delete_958 nilfs_btree_prepare_delete 0 958 &lpfc_fdmi_on_show_958 ++sys_msgrcv_959 sys_msgrcv 3 959 NULL ++mem_limit_store_964 mem_limit_store 0-4 964 NULL ++chksum_setkey_972 chksum_setkey 0 972 NULL ++stop_975 stop 0 975 NULL nohasharray ++mnt_want_write_975 mnt_want_write 0 975 &stop_975 ++gprs_open_978 gprs_open 0 978 NULL nohasharray ++mlx4_cq_alloc_978 mlx4_cq_alloc 0 978 &gprs_open_978 ++mmio16read__read_file_981 mmio16read__read_file 0 981 NULL nohasharray ++rocker_port_fdb_flush_981 rocker_port_fdb_flush 0 981 &mmio16read__read_file_981 ++cx24113_set_params_982 cx24113_set_params 0 982 NULL nohasharray ++_ctl_ioc_reply_queue_count_show_982 _ctl_ioc_reply_queue_count_show 0 982 &cx24113_set_params_982 ++set_usb2_hw_lpm_983 set_usb2_hw_lpm 0 983 NULL ++show_node_guid_985 show_node_guid 0 985 NULL ++usnic_ib_qp_grp_dump_hdr_989 usnic_ib_qp_grp_dump_hdr 2 989 NULL ++skge_rx_fill_991 skge_rx_fill 0 991 NULL ++tts_notify_reboot_993 tts_notify_reboot 0 993 NULL nohasharray ++memory_probe_store_993 memory_probe_store 0-4 993 &tts_notify_reboot_993 ++hdlcdev_rx_997 hdlcdev_rx 3 997 NULL ++pch_udc_create_dma_chain_1001 pch_udc_create_dma_chain 0 1001 NULL ++cdc_ncm_show_wNdpInDivisor_1003 cdc_ncm_show_wNdpInDivisor 0 1003 NULL nohasharray ++show_sas_port_num_phys_1003 show_sas_port_num_phys 0 1003 &cdc_ncm_show_wNdpInDivisor_1003 ++remove_monitor_info_1004 remove_monitor_info 3 1004 NULL ++wl1271_allocate_sta_1006 wl1271_allocate_sta 0 1006 NULL ++platform_begin_1008 platform_begin 0 1008 NULL nohasharray ++ds1337_set_alarm_1008 ds1337_set_alarm 0 1008 &platform_begin_1008 ++bt856_init_1009 bt856_init 0 1009 NULL ++readreg_1017 readreg 0-1 1017 NULL ++cxusb_i2c_xfer_1019 cxusb_i2c_xfer 0-3 1019 NULL nohasharray ++_do_truncate_1019 _do_truncate 0 1019 &cxusb_i2c_xfer_1019 ++smk_write_cipso2_1021 smk_write_cipso2 3-0 1021 NULL ++si476x_core_cmd_am_rsq_status_1023 si476x_core_cmd_am_rsq_status 0 1023 NULL ++show_fc_host_serial_number_1024 show_fc_host_serial_number 0 1024 NULL ++niu_enable_rx_channel_1025 niu_enable_rx_channel 0 1025 NULL ++exofs_writepages_1027 exofs_writepages 0 1027 NULL ++il3945_show_antenna_1032 il3945_show_antenna 0 1032 NULL nohasharray ++minor_show_1032 minor_show 0 1032 &il3945_show_antenna_1032 ++mpu401_open_1036 mpu401_open 0 1036 NULL nohasharray ++mlx4_en_create_drop_qp_1036 mlx4_en_create_drop_qp 0 1036 &mpu401_open_1036 ++ltc4245_show_alarm_1037 ltc4245_show_alarm 0 1037 NULL ++adis_update_scan_mode_1039 adis_update_scan_mode 0 1039 NULL ++ath5k_start_1041 ath5k_start 0 1041 NULL ++gigaset_initdriver_1060 gigaset_initdriver 2 1060 NULL nohasharray ++lpfc_aer_support_store_1060 lpfc_aer_support_store 0-4 1060 &gigaset_initdriver_1060 ++qlcnic_fw_create_ctx_1065 qlcnic_fw_create_ctx 0 1065 NULL ++mce_request_packet_1073 mce_request_packet 3 1073 NULL nohasharray ++writeout_1073 writeout 0 1073 &mce_request_packet_1073 ++data_calc_1074 data_calc 0 1074 NULL ++agp_create_memory_1075 agp_create_memory 1 1075 NULL ++hwrng_init_1077 hwrng_init 0 1077 NULL ++tps65912_gpio_input_1084 tps65912_gpio_input 0 1084 NULL ++nfs_pgarray_set_1085 nfs_pgarray_set 2 1085 NULL ++zl10039_writereg_1086 zl10039_writereg 0 1086 NULL ++xs_sendpages_1091 xs_sendpages 5 1091 NULL ++llcp_sock_sendmsg_1092 llcp_sock_sendmsg 4-0 1092 NULL ++n_tracerouter_read_1094 n_tracerouter_read 0 1094 NULL ++nfs4_init_nonuniform_client_string_1097 nfs4_init_nonuniform_client_string 3 1097 NULL nohasharray ++iscsi_nacl_param_show_ErrorRecoveryLevel_1097 iscsi_nacl_param_show_ErrorRecoveryLevel 0 1097 &nfs4_init_nonuniform_client_string_1097 ++fmc_transfer_rds_from_internal_buff_1098 fmc_transfer_rds_from_internal_buff 0 1098 NULL nohasharray ++ath10k_hif_start_1098 ath10k_hif_start 0 1098 &fmc_transfer_rds_from_internal_buff_1098 ++in1_input_show_1099 in1_input_show 0 1099 NULL ++bitmap_parse_1103 bitmap_parse 0 1103 NULL ++show_1104 show 0 1104 NULL ++__arch_hweight8_1105 __arch_hweight8 0 1105 NULL ++store_risefalltime_1109 store_risefalltime 0-4 1109 NULL ++omninet_open_1110 omninet_open 0 1110 NULL ++utf8s_to_utf16s_1115 utf8s_to_utf16s 0 1115 NULL ++indirect_bytes_number_1116 indirect_bytes_number 0-2 1116 NULL ++b43legacy_phy_versioning_1117 b43legacy_phy_versioning 0 1117 NULL ++bql_show_limit_min_1118 bql_show_limit_min 0 1118 NULL ++show_temp_crit_enable_1119 show_temp_crit_enable 0 1119 NULL ++edac_fake_inject_write_1120 edac_fake_inject_write 0-3 1120 NULL ++splice_read_1122 splice_read 0 1122 NULL ++drvctl_store_1123 drvctl_store 0-4 1123 NULL ++__btrfs_cow_block_1125 __btrfs_cow_block 0 1125 NULL nohasharray ++__ext4_journal_stop_1125 __ext4_journal_stop 0 1125 &__btrfs_cow_block_1125 ++cfg80211_report_obss_beacon_1133 cfg80211_report_obss_beacon 3 1133 NULL ++vmalloc_32_1135 vmalloc_32 1 1135 NULL ++ad1848_prepare_for_input_1140 ad1848_prepare_for_input 0 1140 NULL ++loop_attr_sizelimit_show_1142 loop_attr_sizelimit_show 0 1142 NULL ++gadget_dev_desc_bMaxPacketSize0_store_1145 gadget_dev_desc_bMaxPacketSize0_store 0-3 1145 NULL ++queue_max_integrity_segments_show_1146 queue_max_integrity_segments_show 0 1146 NULL nohasharray ++map_page_1146 map_page 0-3 1146 &queue_max_integrity_segments_show_1146 ++gadget_config_desc_bmAttributes_show_1150 gadget_config_desc_bmAttributes_show 0 1150 NULL nohasharray ++rt2800usb_enable_radio_1150 rt2800usb_enable_radio 0 1150 &gadget_config_desc_bmAttributes_show_1150 nohasharray ++patch_vt3476_1150 patch_vt3476 0 1150 &rt2800usb_enable_radio_1150 ++queue_max_hw_sectors_show_1155 queue_max_hw_sectors_show 0 1155 NULL ++i2400m_rx_ctl_1157 i2400m_rx_ctl 4 1157 NULL ++lbs_set_host_sleep_1159 lbs_set_host_sleep 0 1159 NULL ++hso_sysfs_show_porttype_1161 hso_sysfs_show_porttype 0 1161 NULL ++invalid_io_show_1165 invalid_io_show 0 1165 NULL ++wl18xx_acx_clear_statistics_1174 wl18xx_acx_clear_statistics 0 1174 NULL ++dw2104_i2c_transfer_1176 dw2104_i2c_transfer 0-3 1176 NULL nohasharray ++pfkey_xfrm_policy2msg_size_1176 pfkey_xfrm_policy2msg_size 0 1176 &dw2104_i2c_transfer_1176 ++shm32write__write_file_1183 shm32write__write_file 0 1183 NULL ++show_1186 show 0 1186 NULL ++ipc_alloc_1192 ipc_alloc 1 1192 NULL nohasharray ++store_sf_ctrl_1192 store_sf_ctrl 0-4 1192 &ipc_alloc_1192 ++ib_create_send_mad_1196 ib_create_send_mad 5 1196 NULL nohasharray ++mc13892_gpo_regulator_disable_1196 mc13892_gpo_regulator_disable 0 1196 &ib_create_send_mad_1196 ++tcm_loop_tpg_show_transport_status_1197 tcm_loop_tpg_show_transport_status 0 1197 NULL nohasharray ++bdx_vlan_rx_add_vid_1197 bdx_vlan_rx_add_vid 0 1197 &tcm_loop_tpg_show_transport_status_1197 ++ivtvfb_set_par_1198 ivtvfb_set_par 0 1198 NULL nohasharray ++pstore_ftrace_knob_write_1198 pstore_ftrace_knob_write 3 1198 &ivtvfb_set_par_1198 ++i2400m_rx_ctl_ack_1199 i2400m_rx_ctl_ack 3 1199 NULL ++i2cdev_read_1206 i2cdev_read 3-0 1206 NULL ++profile_capable_1207 profile_capable 0 1207 NULL ++kernfs_iop_setattr_1212 kernfs_iop_setattr 0 1212 NULL ++lov_ost_pool_init_1215 lov_ost_pool_init 2 1215 NULL ++cifs_writev_1218 cifs_writev 0 1218 NULL nohasharray ++mlx4_table_get_1218 mlx4_table_get 0 1218 &cifs_writev_1218 ++fsync_buffers_list_1219 fsync_buffers_list 0 1219 NULL ++generic_file_splice_read_1220 generic_file_splice_read 0 1220 NULL ++power_1221 power 0 1221 NULL ++xhci_check_maxpacket_1225 xhci_check_maxpacket 0 1225 NULL nohasharray ++show_fcstat_fc_xid_not_found_1225 show_fcstat_fc_xid_not_found 0 1225 &xhci_check_maxpacket_1225 ++pci_ni8430_init_1228 pci_ni8430_init 0 1228 NULL ++show_out0_ouput_1230 show_out0_ouput 0 1230 NULL nohasharray ++ipw_packet_received_skb_1230 ipw_packet_received_skb 2 1230 &show_out0_ouput_1230 ++mtd_type_show_1233 mtd_type_show 0 1233 NULL nohasharray ++lbs_set_iface_type_1233 lbs_set_iface_type 0 1233 &mtd_type_show_1233 ++ipw2100_set_address_1236 ipw2100_set_address 0 1236 NULL ++kernfs_file_direct_read_1238 kernfs_file_direct_read 0-3 1238 NULL ++acpi_battery_write_alarm_1240 acpi_battery_write_alarm 3-0 1240 NULL ++v9fs_write_inode_dotl_1241 v9fs_write_inode_dotl 0 1241 NULL ++ehci_urb_enqueue_1242 ehci_urb_enqueue 0 1242 NULL ++usnic_ib_show_cq_per_vf_1244 usnic_ib_show_cq_per_vf 0 1244 NULL ++qla2x00_total_isp_aborts_show_1247 qla2x00_total_isp_aborts_show 0 1247 NULL ++class_osdblk_remove_1250 class_osdblk_remove 0-4 1250 NULL ++ipath_read_umem64_1254 ipath_read_umem64 0 1254 NULL ++drm_primary_helper_create_plane_1262 drm_primary_helper_create_plane 3 1262 NULL ++rocker_group_l2_fan_out_1265 rocker_group_l2_fan_out 3-0 1265 NULL ++tw9910_s_fmt_1268 tw9910_s_fmt 0 1268 NULL nohasharray ++roccat_common2_sysfs_write_keys_macro_1268 roccat_common2_sysfs_write_keys_macro 0-6-5 1268 &tw9910_s_fmt_1268 ++patch_ca0132_1272 patch_ca0132 0 1272 NULL ++ioctl_private_iw_point_1273 ioctl_private_iw_point 7 1273 NULL nohasharray ++show_aout_1273 show_aout 0 1273 &ioctl_private_iw_point_1273 ++bmc150_accel_validate_trigger_1275 bmc150_accel_validate_trigger 0 1275 NULL ++n_ext_ts_show_1281 n_ext_ts_show 0 1281 NULL ++snd_pcm_do_stop_1282 snd_pcm_do_stop 0 1282 NULL nohasharray ++lpfc_bg_info_show_1282 lpfc_bg_info_show 0 1282 &snd_pcm_do_stop_1282 ++gdth_set_info_1287 gdth_set_info 0-3 1287 NULL nohasharray ++SyS_flistxattr_1287 SyS_flistxattr 3 1287 &gdth_set_info_1287 ++tx_frag_in_process_called_read_1290 tx_frag_in_process_called_read 3-0 1290 NULL ++add_std_chmaps_1291 add_std_chmaps 0 1291 NULL ++posix_acl_xattr_set_1301 posix_acl_xattr_set 4-0 1301 NULL ++falcon_reconfigure_port_1309 falcon_reconfigure_port 0 1309 NULL ++nc_vendor_read_1315 nc_vendor_read 0 1315 NULL ++ndo_switch_parent_id_get_1316 ndo_switch_parent_id_get 0 1316 NULL ++wm_adsp_buf_alloc_1317 wm_adsp_buf_alloc 2 1317 NULL ++runtime_show_1318 runtime_show 0 1318 NULL ++show_eeprom_delay_1320 show_eeprom_delay 0 1320 NULL nohasharray ++vbi_out_start_streaming_1320 vbi_out_start_streaming 0 1320 &show_eeprom_delay_1320 ++intel_iommu_show_ecap_1321 intel_iommu_show_ecap 0 1321 NULL ++rio_mport_scan_1322 rio_mport_scan 0 1322 NULL ++mt9m111_set_red_balance_1327 mt9m111_set_red_balance 0 1327 NULL nohasharray ++push_node_left_1327 push_node_left 0 1327 &mt9m111_set_red_balance_1327 nohasharray ++geos_gpio_store_1327 geos_gpio_store 0-4 1327 &push_node_left_1327 nohasharray ++qlcnic_pci_sriov_configure_1327 qlcnic_pci_sriov_configure 0-2 1327 &geos_gpio_store_1327 ++udf_statfs_1329 udf_statfs 0 1329 NULL ++SMB2_get_srv_num_1333 SMB2_get_srv_num 0 1333 NULL ++md5_final_1334 md5_final 0 1334 NULL nohasharray ++carl9170_rx_stream_1334 carl9170_rx_stream 3 1334 &md5_final_1334 ++tcp_port_read_1340 tcp_port_read 0 1340 NULL ++btrfs_submit_compressed_write_1347 btrfs_submit_compressed_write 5 1347 NULL ++gen_pool_best_fit_1348 gen_pool_best_fit 4-3-2 1348 NULL ++dccp_packet_1350 dccp_packet 0 1350 NULL nohasharray ++nilfs_flush_device_1350 nilfs_flush_device 0 1350 &dccp_packet_1350 nohasharray ++o2nm_cluster_attr_reconnect_delay_ms_write_1350 o2nm_cluster_attr_reconnect_delay_ms_write 0-3 1350 &nilfs_flush_device_1350 ++bond_verify_device_path_1352 bond_verify_device_path 3 1352 NULL nohasharray ++tg_set_conf_u64_1352 tg_set_conf_u64 0-3 1352 &bond_verify_device_path_1352 ++em28xx_set_audio_source_1356 em28xx_set_audio_source 0 1356 NULL nohasharray ++wait_obj_created_1356 wait_obj_created 0 1356 &em28xx_set_audio_source_1356 ++snd_pcm_lib_write1_1358 snd_pcm_lib_write1 0-3 1358 NULL ++ipx_sendmsg_1362 ipx_sendmsg 4-0 1362 NULL nohasharray ++show_fan_step_output_1362 show_fan_step_output 0 1362 &ipx_sendmsg_1362 ++skein512_export_1364 skein512_export 0 1364 NULL ++__fscache_read_or_alloc_page_1365 __fscache_read_or_alloc_page 0 1365 NULL ++bfad_im_fw_version_show_1366 bfad_im_fw_version_show 0 1366 NULL ++pirq_enable_irq_1368 pirq_enable_irq 0 1368 NULL ++fw_stats_raw_read_1369 fw_stats_raw_read 3-0 1369 NULL ++snd_seq_ioctl_set_client_pool_1370 snd_seq_ioctl_set_client_pool 0 1370 NULL ++ocfs2_prepare_inode_for_write_1372 ocfs2_prepare_inode_for_write 0 1372 NULL ++qla2x00_thermal_temp_show_1374 qla2x00_thermal_temp_show 0 1374 NULL ++rtl8180_init_rx_ring_1381 rtl8180_init_rx_ring 0 1381 NULL nohasharray ++xpcs_reg_addr_read_1381 xpcs_reg_addr_read 3 1381 &rtl8180_init_rx_ring_1381 ++sht15_store_heater_1382 sht15_store_heater 0-4 1382 NULL ++sctp_setsockopt_initmsg_1383 sctp_setsockopt_initmsg 3-0 1383 NULL ++do_msgsnd_1387 do_msgsnd 4 1387 NULL nohasharray ++show_global_beep_1387 show_global_beep 0 1387 &do_msgsnd_1387 ++snd_at73c213_pcm_prepare_1388 snd_at73c213_pcm_prepare 0 1388 NULL nohasharray ++ds2781_set_rsgain_register_1388 ds2781_set_rsgain_register 0 1388 &snd_at73c213_pcm_prepare_1388 ++common_perm_mnt_dentry_1390 common_perm_mnt_dentry 0 1390 NULL ++SYSC_io_getevents_1392 SYSC_io_getevents 3 1392 NULL ++zone_page_state_1393 zone_page_state 0 1393 NULL ++rtl2830_rd_regs_1396 rtl2830_rd_regs 0 1396 NULL ++error_1397 error 0 1397 NULL ++hugetlbfs_write_end_1398 hugetlbfs_write_end 0-5 1398 NULL ++rbd_size_show_1401 rbd_size_show 0 1401 NULL nohasharray ++snd_hda_codec_build_pcms_1401 snd_hda_codec_build_pcms 0 1401 &rbd_size_show_1401 ++matroxfb_dh_decode_var_1404 matroxfb_dh_decode_var 0 1404 NULL nohasharray ++hci_si_event_1404 hci_si_event 3 1404 &matroxfb_dh_decode_var_1404 ++ivtv_start_v4l2_decode_stream_1406 ivtv_start_v4l2_decode_stream 0 1406 NULL ++show_in_min_alarm_1408 show_in_min_alarm 0 1408 NULL ++wait_comp_1409 wait_comp 0 1409 NULL ++b43_gphy_op_switch_channel_1410 b43_gphy_op_switch_channel 0 1410 NULL ++snd_cmipci_capture_trigger_1411 snd_cmipci_capture_trigger 0 1411 NULL ++cfs_trace_copyout_string_1416 cfs_trace_copyout_string 2 1416 NULL ++hfsplus_security_getxattr_1419 hfsplus_security_getxattr 0 1419 NULL ++sctp_sf_abort_violation_1420 sctp_sf_abort_violation 7 1420 NULL ++find_temp_source_1425 find_temp_source 0 1425 NULL ++store_tempsense_1428 store_tempsense 0-4 1428 NULL ++cpia2_read_1434 cpia2_read 0 1434 NULL ++init_rs_internal_1436 init_rs_internal 1 1436 NULL ++stack_max_size_read_1445 stack_max_size_read 3 1445 NULL ++brcmf_sdio_read_control_1451 brcmf_sdio_read_control 3 1451 NULL ++t4_sge_alloc_eth_txq_1454 t4_sge_alloc_eth_txq 0 1454 NULL nohasharray ++__cfg80211_alloc_reply_skb_1454 __cfg80211_alloc_reply_skb 4 1454 &t4_sge_alloc_eth_txq_1454 ++snd_es1938_playback1_prepare_1455 snd_es1938_playback1_prepare 0 1455 NULL ++smk_parse_long_rule_1461 smk_parse_long_rule 0 1461 NULL ++tx_queue_len_read_1463 tx_queue_len_read 3-0 1463 NULL ++sub_interval_1466 sub_interval 0 1466 NULL ++xprt_alloc_1475 xprt_alloc 2 1475 NULL nohasharray ++inode_removexattr_1475 inode_removexattr 0 1475 &xprt_alloc_1475 ++SYSC_syslog_1477 SYSC_syslog 3 1477 NULL nohasharray ++nes_show_adapter_1477 nes_show_adapter 0 1477 &SYSC_syslog_1477 ++selinux_getprocattr_1481 selinux_getprocattr 0 1481 NULL ++set_otp0en_1484 set_otp0en 4-0 1484 NULL ++sta_num_ps_buf_frames_read_1488 sta_num_ps_buf_frames_read 3-0 1488 NULL ++efivar_store_raw_1489 efivar_store_raw 0-3 1489 NULL ++osd_req_decode_sense_1492 osd_req_decode_sense 0 1492 NULL ++usbvision_i2c_read_1493 usbvision_i2c_read 0-4 1493 NULL nohasharray ++iwl_dbgfs_bt_tx_prio_write_1493 iwl_dbgfs_bt_tx_prio_write 0-3 1493 &usbvision_i2c_read_1493 ++snd_seq_ioctl_remove_events_1494 snd_seq_ioctl_remove_events 0 1494 NULL ++scsiback_tpg_param_show_alias_1495 scsiback_tpg_param_show_alias 0 1495 NULL ++fpregs_set_1497 fpregs_set 4 1497 NULL ++em_show_1501 em_show 0 1501 NULL nohasharray ++__blk_bios_map_sg_1501 __blk_bios_map_sg 0 1501 &em_show_1501 ++packet_buffer_get_1505 packet_buffer_get 0 1505 NULL ++show_constraint_power_limit_uw_1509 show_constraint_power_limit_uw 0 1509 NULL ++khugepaged_max_ptes_none_show_1514 khugepaged_max_ptes_none_show 0 1514 NULL ++smack_netlabel_1516 smack_netlabel 0 1516 NULL ++tomoyo_round2_1518 tomoyo_round2 0 1518 NULL ++wm831x_alive_ldo_get_status_1525 wm831x_alive_ldo_get_status 0 1525 NULL ++ieee80211_get_regs_len_1527 ieee80211_get_regs_len 0 1527 NULL ++alloc_perm_bits_1532 alloc_perm_bits 2 1532 NULL ++tx_packets_show_1535 tx_packets_show 0 1535 NULL ++v9fs_file_write_1539 v9fs_file_write 0-3 1539 NULL ++new_rsb_count_write_1543 new_rsb_count_write 3-0 1543 NULL ++iscsit_na_nopin_response_timeout_1544 iscsit_na_nopin_response_timeout 0 1544 NULL ++target_stat_scsi_att_intr_port_show_attr_port_auth_indx_1547 target_stat_scsi_att_intr_port_show_attr_port_auth_indx 0 1547 NULL ++mei_txe_fw_status_1549 mei_txe_fw_status 0 1549 NULL ++set_max_min_1551 set_max_min 0-4 1551 NULL ++queue_show_iostats_1552 queue_show_iostats 0 1552 NULL ++vxge_del_mac_addr_1554 vxge_del_mac_addr 0 1554 NULL ++ath6kl_init_get_fwcaps_1557 ath6kl_init_get_fwcaps 3 1557 NULL ++lpfc_txq_hw_show_1558 lpfc_txq_hw_show 0 1558 NULL nohasharray ++acerhdf_set_mode_1558 acerhdf_set_mode 0 1558 &lpfc_txq_hw_show_1558 ++TermChar_store_1561 TermChar_store 0-4 1561 NULL ++w1_f12_read_state_1565 w1_f12_read_state 0-5-6 1565 NULL ++max_freq_store_1570 max_freq_store 0-4 1570 NULL ++compat_sys_vmsplice_1571 compat_sys_vmsplice 3 1571 NULL ++pages_to_scan_store_1572 pages_to_scan_store 0-4 1572 NULL ++ssu100_open_1573 ssu100_open 0 1573 NULL nohasharray ++raid_disks_show_1573 raid_disks_show 0 1573 &ssu100_open_1573 ++gadget_config_name_configuration_store_1575 gadget_config_name_configuration_store 0-3 1575 NULL ++de4x5_init_1580 de4x5_init 0 1580 NULL nohasharray ++__rtc_set_alarm_1580 __rtc_set_alarm 0 1580 &de4x5_init_1580 ++usblp_show_ieee1284_id_1581 usblp_show_ieee1284_id 0 1581 NULL ++vv6410_start_1582 vv6410_start 0 1582 NULL ++ieee80211_if_read_dot11MeshHWMPnetDiameterTraversalTime_1589 ieee80211_if_read_dot11MeshHWMPnetDiameterTraversalTime 3-0 1589 NULL ++dccp_v6_connect_1590 dccp_v6_connect 0 1590 NULL ++fc_frame_alloc_1596 fc_frame_alloc 2 1596 NULL ++b44_init_one_1603 b44_init_one 0 1603 NULL ++snd_seq_kernel_client_enqueue_blocking_1604 snd_seq_kernel_client_enqueue_blocking 0 1604 NULL ++__uncore_match_show_1606 __uncore_match_show 0 1606 NULL nohasharray ++disabled_store_1606 disabled_store 0-4 1606 &__uncore_match_show_1606 ++packet_buffer_init_1607 packet_buffer_init 2 1607 NULL ++btmrvl_hscmd_read_1614 btmrvl_hscmd_read 3-0 1614 NULL ++wl1271_ap_init_deauth_template_1617 wl1271_ap_init_deauth_template 0 1617 NULL ++v9fs_fid_xattr_get_1618 v9fs_fid_xattr_get 0 1618 NULL ++jfs_write_inode_1620 jfs_write_inode 0 1620 NULL ++zd_read_regdomain_1622 zd_read_regdomain 0 1622 NULL ++beiscsi_get_initname_1629 beiscsi_get_initname 0 1629 NULL ++ip_tunnel_init_1633 ip_tunnel_init 0 1633 NULL ++rsb_insert_1636 rsb_insert 0 1636 NULL nohasharray ++inv_fifo_rate_show_1636 inv_fifo_rate_show 0 1636 &rsb_insert_1636 ++cifs_write_end_1643 cifs_write_end 0-5 1643 NULL ++qla24xx_84xx_fw_version_show_1644 qla24xx_84xx_fw_version_show 0 1644 NULL ++iwl_pcie_set_hw_ready_1649 iwl_pcie_set_hw_ready 0 1649 NULL ++set_sample_rate_v1_1651 set_sample_rate_v1 0 1651 NULL ++tpm_send_1655 tpm_send 0-3 1655 NULL ++ikconfig_read_current_1658 ikconfig_read_current 3-0 1658 NULL ++map_block_for_writepage_1662 map_block_for_writepage 0 1662 NULL nohasharray ++bh1770_lux_update_thresholds_1662 bh1770_lux_update_thresholds 0 1662 &map_block_for_writepage_1662 ++mei_cl_recv_1665 mei_cl_recv 3 1665 NULL ++nct6775_create_attr_group_1677 nct6775_create_attr_group 3 1677 NULL ++o2hb_region_blocks_read_1679 o2hb_region_blocks_read 0 1679 NULL ++hso_net_open_1680 hso_net_open 0 1680 NULL nohasharray ++amd_iommu_suspend_1680 amd_iommu_suspend 0 1680 &hso_net_open_1680 ++__qib_get_user_pages_1681 __qib_get_user_pages 0 1681 NULL nohasharray ++ath10k_station_disassoc_1681 ath10k_station_disassoc 0 1681 &__qib_get_user_pages_1681 ++ath10k_bmi_lz_data_1682 ath10k_bmi_lz_data 0 1682 NULL nohasharray ++niu_compute_rbr_cfig_b_1682 niu_compute_rbr_cfig_b 0 1682 &ath10k_bmi_lz_data_1682 ++configfs_read_file_1683 configfs_read_file 3-0 1683 NULL ++irst_store_wakeup_events_1684 irst_store_wakeup_events 0-4 1684 NULL ++rio_enum_mport_1685 rio_enum_mport 0 1685 NULL ++nilfs_palloc_count_max_entries_1687 nilfs_palloc_count_max_entries 0 1687 NULL ++tps65217_pmic_enable_1688 tps65217_pmic_enable 0 1688 NULL ++em25xx_bus_B_recv_bytes_1689 em25xx_bus_B_recv_bytes 0-4 1689 NULL ++lpfc_max_rpi_show_1691 lpfc_max_rpi_show 0 1691 NULL ++ipr_store_iopoll_weight_1694 ipr_store_iopoll_weight 0-4 1694 NULL ++iscsit_na_nopin_timeout_1695 iscsit_na_nopin_timeout 0 1695 NULL ++enable_irq_1698 enable_irq 0 1698 NULL nohasharray ++dlm_control_store_1698 dlm_control_store 0-3 1698 &enable_irq_1698 ++iwl_dbgfs_d0i3_refs_read_1705 iwl_dbgfs_d0i3_refs_read 3-0 1705 NULL ++pdu_write_u_1710 pdu_write_u 3 1710 NULL ++coda_psdev_write_1711 coda_psdev_write 3-0 1711 NULL ++btrfs_dir_data_len_1714 btrfs_dir_data_len 0 1714 NULL ++udf_setattr_1716 udf_setattr 0 1716 NULL ++ufx_blank_1723 ufx_blank 0 1723 NULL ++mp_pin_to_gsi_1726 mp_pin_to_gsi 0-2 1726 NULL ++internal_create_group_1733 internal_create_group 0 1733 NULL ++dev_irnet_read_1741 dev_irnet_read 3-0 1741 NULL ++usb_ep_align_maybe_1743 usb_ep_align_maybe 0-3 1743 NULL ++tx_frag_called_read_1748 tx_frag_called_read 3-0 1748 NULL ++br_vlan_init_1752 br_vlan_init 0 1752 NULL nohasharray ++fm10k_setup_rx_resources_1752 fm10k_setup_rx_resources 0 1752 &br_vlan_init_1752 ++bfs_write_inode_1755 bfs_write_inode 0 1755 NULL ++nobh_writepage_1757 nobh_writepage 0 1757 NULL ++ieee80211_new_mesh_header_1761 ieee80211_new_mesh_header 0 1761 NULL ++start_transport_1762 start_transport 0 1762 NULL ++ebt_size_mwt_1768 ebt_size_mwt 0 1768 NULL ++__mlx4_qp_reserve_range_1773 __mlx4_qp_reserve_range 0-3 1773 NULL ++cosa_write_1774 cosa_write 3 1774 NULL ++set_temp_emergency_1776 set_temp_emergency 0-4 1776 NULL ++event_show_1780 event_show 0 1780 NULL ++tpacpi_driver_wlsw_emulstate_store_1783 tpacpi_driver_wlsw_emulstate_store 0-3 1783 NULL ++fcoe_ctlr_device_add_1793 fcoe_ctlr_device_add 3 1793 NULL ++ueth_change_mtu_1794 ueth_change_mtu 0 1794 NULL ++show_auto_fan_1801 show_auto_fan 0 1801 NULL ++qlcnic_sriov_alloc_bc_mbx_args_1809 qlcnic_sriov_alloc_bc_mbx_args 0 1809 NULL ++vt596_access_1815 vt596_access 0 1815 NULL nohasharray ++__nodelist_scnprintf_1815 __nodelist_scnprintf 2-4-0 1815 &vt596_access_1815 ++sta_aid_read_1819 sta_aid_read 3-0 1819 NULL ++genfs_read_1821 genfs_read 0 1821 NULL ++vicam_set_camera_power_1824 vicam_set_camera_power 0 1824 NULL ++set_lcd_brightness_1831 set_lcd_brightness 0 1831 NULL ++disk_events_poll_msecs_store_1832 disk_events_poll_msecs_store 0-4 1832 NULL ++qla27xx_fwdt_template_default_size_1836 qla27xx_fwdt_template_default_size 0 1836 NULL ++qlcnic_get_phys_port_id_1839 qlcnic_get_phys_port_id 0 1839 NULL ++subsystem_device_show_1840 subsystem_device_show 0 1840 NULL ++show_1841 show 0 1841 NULL ++usbduxsigma_firmware_upload_1843 usbduxsigma_firmware_upload 3 1843 NULL ++fm10k_iov_configure_1845 fm10k_iov_configure 0-2 1845 NULL ++ov9650_set_auto_white_balance_1847 ov9650_set_auto_white_balance 0 1847 NULL ++xfs_vm_write_end_1854 xfs_vm_write_end 5-0 1854 NULL ++bq32k_rtc_read_time_1863 bq32k_rtc_read_time 0 1863 NULL ++device_prepare_1870 device_prepare 0 1870 NULL ++qlcnic_config_port_mirroring_1872 qlcnic_config_port_mirroring 0 1872 NULL ++rds_cong_monitor_1879 rds_cong_monitor 0 1879 NULL ++sb_issue_zeroout_1884 sb_issue_zeroout 3 1884 NULL ++show_fcoe_fcf_device_fabric_name_1885 show_fcoe_fcf_device_fabric_name 0 1885 NULL ++output_read_1886 output_read 0-5-6 1886 NULL ++acpi_device_update_power_1887 acpi_device_update_power 0 1887 NULL ++polling_interval_store_1888 polling_interval_store 0-4 1888 NULL ++write_1891 write 0 1891 NULL ++show_pwm_auto_point1_pwm_1896 show_pwm_auto_point1_pwm 0 1896 NULL ++rx_defrag_called_read_1897 rx_defrag_called_read 3-0 1897 NULL ++nfs_parse_server_name_1899 nfs_parse_server_name 2 1899 NULL ++smsc9420_ethtool_get_eeprom_len_1900 smsc9420_ethtool_get_eeprom_len 0 1900 NULL nohasharray ++SyS_add_key_1900 SyS_add_key 4 1900 &smsc9420_ethtool_get_eeprom_len_1900 ++gfs2_getxattr_1904 gfs2_getxattr 0 1904 NULL ++rs_sta_dbgfs_drv_tx_stats_write_1908 rs_sta_dbgfs_drv_tx_stats_write 0-3 1908 NULL ++isku_sysfs_write_keys_media_1910 isku_sysfs_write_keys_media 6-0-5 1910 NULL ++fst_open_1911 fst_open 0 1911 NULL ++cdc_ncm_show_wNdpOutPayloadRemainder_1917 cdc_ncm_show_wNdpOutPayloadRemainder 0 1917 NULL ++uhid_char_read_1920 uhid_char_read 3-0 1920 NULL ++pwc_s_ctrl_1924 pwc_s_ctrl 0 1924 NULL ++cxacru_sysfs_show_transmitter_power_1925 cxacru_sysfs_show_transmitter_power 0 1925 NULL nohasharray ++tcp_cgroup_reset_1925 tcp_cgroup_reset 0-3 1925 &cxacru_sysfs_show_transmitter_power_1925 ++tx_tx_retry_data_read_1926 tx_tx_retry_data_read 3-0 1926 NULL ++vlan_dev_set_mac_address_1927 vlan_dev_set_mac_address 0 1927 NULL ++kfd_cache_show_1929 kfd_cache_show 0 1929 NULL ++rio_read_config_1932 rio_read_config 0-6-5 1932 NULL nohasharray ++ecryptfs_fsync_1932 ecryptfs_fsync 0 1932 &rio_read_config_1932 nohasharray ++niu_enable_ldn_in_ldg_1932 niu_enable_ldn_in_ldg 0 1932 &ecryptfs_fsync_1932 ++bdev_erase_1933 bdev_erase 3 1933 NULL ++bnx2x_set_eth_mac_1936 bnx2x_set_eth_mac 0 1936 NULL ++gsp_receive_1939 gsp_receive 0-3 1939 NULL ++nvif_object_sclass_1940 nvif_object_sclass 3 1940 NULL nohasharray ++cyttsp_probe_1940 cyttsp_probe 4 1940 &nvif_object_sclass_1940 ++bcm7xxx_apd_enable_1942 bcm7xxx_apd_enable 0 1942 NULL nohasharray ++check_dyn_adc_switch_1942 check_dyn_adc_switch 0 1942 &bcm7xxx_apd_enable_1942 ++ieee80211_if_fmt_dot11MeshConfirmTimeout_1945 ieee80211_if_fmt_dot11MeshConfirmTimeout 3 1945 NULL ++igb_open_1946 igb_open 0 1946 NULL ++i40e_vsi_setup_rx_resources_1947 i40e_vsi_setup_rx_resources 0 1947 NULL ++fcoe_vport_create_1948 fcoe_vport_create 0 1948 NULL ++max_readahead_show_1952 max_readahead_show 0 1952 NULL ++w1_ds2780_do_io_1954 w1_ds2780_do_io 4-3-0 1954 NULL ++update_qd_1955 update_qd 0 1955 NULL ++read_swap_header_1957 read_swap_header 0 1957 NULL ++b43legacy_wireless_core_start_1958 b43legacy_wireless_core_start 0 1958 NULL ++__assign_irq_vector_1961 __assign_irq_vector 0 1961 NULL ++show_session_param_ISCSI_PARAM_TGT_RESET_TMO_1963 show_session_param_ISCSI_PARAM_TGT_RESET_TMO 0 1963 NULL nohasharray ++ql_get_adapter_resources_1963 ql_get_adapter_resources 0 1963 &show_session_param_ISCSI_PARAM_TGT_RESET_TMO_1963 ++ivtv_v4l2_read_1964 ivtv_v4l2_read 3-0 1964 NULL nohasharray ++dvb_net_open_1964 dvb_net_open 0 1964 &ivtv_v4l2_read_1964 ++qla2xxx_get_vpd_field_1965 qla2xxx_get_vpd_field 4 1965 NULL ++nvkm_client_map_1967 nvkm_client_map 2-3 1967 NULL ++bq2415x_get_current_limit_1969 bq2415x_get_current_limit 0 1969 NULL ++libcfs_sock_write_1978 libcfs_sock_write 3 1978 NULL ++selinux_inode_setotherxattr_1980 selinux_inode_setotherxattr 0 1980 NULL ++config_table_show_1982 config_table_show 0 1982 NULL ++__uncore_filter_nc_show_1983 __uncore_filter_nc_show 0 1983 NULL ++sel_read_avc_hash_stats_1984 sel_read_avc_hash_stats 3-0 1984 NULL ++proc_sys_setattr_1985 proc_sys_setattr 0 1985 NULL ++gpio_power_write_1991 gpio_power_write 3-0 1991 NULL ++__alloc_bootmem_node_1992 __alloc_bootmem_node 2 1992 NULL ++show_session_param_ISCSI_PARAM_ISID_2003 show_session_param_ISCSI_PARAM_ISID 0 2003 NULL ++adt7411_show_input_2009 adt7411_show_input 0 2009 NULL ++rx_rx_defrag_read_2010 rx_rx_defrag_read 3-0 2010 NULL ++snd_bt87x_start_2014 snd_bt87x_start 0 2014 NULL ++acpi_ex_create_power_resource_2015 acpi_ex_create_power_resource 0 2015 NULL ++msgdma_initialize_2017 msgdma_initialize 0 2017 NULL nohasharray ++dps0_insert_key_2017 dps0_insert_key 0-4 2017 &msgdma_initialize_2017 ++write_flush_pipefs_2021 write_flush_pipefs 3-0 2021 NULL ++show_otp5en_2024 show_otp5en 0 2024 NULL nohasharray ++__uncore_mask_rds_show_2024 __uncore_mask_rds_show 0 2024 &show_otp5en_2024 ++devm_ioremap_nocache_2036 devm_ioremap_nocache 2-3 2036 NULL ++ebitmap_read_2039 ebitmap_read 0 2039 NULL ++cifs_read_2041 cifs_read 0 2041 NULL ++ims_pcu_send_command_2046 ims_pcu_send_command 0 2046 NULL ++ath6kl_fwlog_mask_read_2050 ath6kl_fwlog_mask_read 3-0 2050 NULL ++bq2415x_sysfs_show_registers_2055 bq2415x_sysfs_show_registers 0 2055 NULL ++show_speed_2057 show_speed 0 2057 NULL ++tpg_alloc_2062 tpg_alloc 2 2062 NULL ++ipath_manage_rcvq_2063 ipath_manage_rcvq 0 2063 NULL ++ledtrig_cpu_notify_2064 ledtrig_cpu_notify 0 2064 NULL ++nfs_proc_setattr_2065 nfs_proc_setattr 0 2065 NULL ++__generic_copy_from_user_intel_2073 __generic_copy_from_user_intel 0 2073 NULL ++tpacpi_driver_bluetooth_emulstate_store_2079 tpacpi_driver_bluetooth_emulstate_store 0-3 2079 NULL ++recover_callbacks_read_2080 recover_callbacks_read 0 2080 NULL ++iwl_dbgfs_current_sleep_command_read_2081 iwl_dbgfs_current_sleep_command_read 3-0 2081 NULL ++pwm_period_store_2082 pwm_period_store 0-4 2082 NULL ++nfs_statfs_2086 nfs_statfs 0 2086 NULL ++mptscsih_device_delay_show_2089 mptscsih_device_delay_show 0 2089 NULL ++max_luns_store_2090 max_luns_store 0-3 2090 NULL ++isl12057_rtc_read_time_2092 isl12057_rtc_read_time 0 2092 NULL ++smbioslabel_show_2094 smbioslabel_show 0 2094 NULL nohasharray ++store_2094 store 0-3 2094 &smbioslabel_show_2094 ++xgmac_reg_value_read_2095 xgmac_reg_value_read 3 2095 NULL ++set_unlock_args_2096 set_unlock_args 0 2096 NULL nohasharray ++cdc_ncm_store_rx_max_2096 cdc_ncm_store_rx_max 0-4 2096 &set_unlock_args_2096 ++idetape_chrdev_read_2097 idetape_chrdev_read 3-0 2097 NULL nohasharray ++f2fs_attr_show_2097 f2fs_attr_show 0 2097 &idetape_chrdev_read_2097 ++audit_expand_2098 audit_expand 2-0 2098 NULL ++__set_print_fmt_2106 __set_print_fmt 0 2106 NULL ++iwl_dbgfs_log_event_read_2107 iwl_dbgfs_log_event_read 3-0 2107 NULL ++ecryptfs_encrypt_and_encode_filename_2109 ecryptfs_encrypt_and_encode_filename 6 2109 NULL ++isl1208_i2c_set_alarm_2113 isl1208_i2c_set_alarm 0 2113 NULL ++i8k_hwmon_show_pwm_2115 i8k_hwmon_show_pwm 0 2115 NULL nohasharray ++xfs_dir2_leafn_add_2115 xfs_dir2_leafn_add 0 2115 &i8k_hwmon_show_pwm_2115 ++btrfs_file_extent_inline_len_2116 btrfs_file_extent_inline_len 0 2116 NULL nohasharray ++store_temp_auto_base_2116 store_temp_auto_base 0-4 2116 &btrfs_file_extent_inline_len_2116 ++enable_read_2117 enable_read 3-0 2117 NULL nohasharray ++__find_xattr_2117 __find_xattr 6 2117 &enable_read_2117 ++nfs_file_fsync_commit_2119 nfs_file_fsync_commit 0 2119 NULL ++pcf50633_write_block_2124 pcf50633_write_block 2-3-0 2124 NULL ++snd_interval_refine_last_2127 snd_interval_refine_last 0 2127 NULL ++ad5398_disable_2128 ad5398_disable 0 2128 NULL ++ixgbe_get_eeprom_len_2130 ixgbe_get_eeprom_len 0 2130 NULL ++fill_input_pin_labels_2135 fill_input_pin_labels 0 2135 NULL ++show_therm_min_2140 show_therm_min 0 2140 NULL nohasharray ++target_stat_scsi_lu_attr_store_2140 target_stat_scsi_lu_attr_store 0 2140 &show_therm_min_2140 ++check_load_and_stores_2143 check_load_and_stores 2 2143 NULL ++mlx4_init_icm_table_2151 mlx4_init_icm_table 4-5 2151 NULL nohasharray ++multicast_query_response_interval_show_2151 multicast_query_response_interval_show 0 2151 &mlx4_init_icm_table_2151 ++iscsi_tpg_auth_store_userid_mutual_2152 iscsi_tpg_auth_store_userid_mutual 0-3 2152 NULL ++usb_udc_softconn_store_2153 usb_udc_softconn_store 0-4 2153 NULL ++__copy_to_user_ll_2157 __copy_to_user_ll 0 2157 NULL nohasharray ++_drbd_send_page_2157 _drbd_send_page 4 2157 &__copy_to_user_ll_2157 ++cluster_cluster_name_read_2160 cluster_cluster_name_read 0 2160 NULL ++dbg_check_inode_size_2165 dbg_check_inode_size 0 2165 NULL ++_ore_get_io_state_2166 _ore_get_io_state 5-4-3-0 2166 NULL ++rxrpc_preparse_s_2167 rxrpc_preparse_s 0 2167 NULL nohasharray ++rtsx_pci_transfer_data_2167 rtsx_pci_transfer_data 3 2167 &rxrpc_preparse_s_2167 ++show_fc_starget_node_name_2171 show_fc_starget_node_name 0 2171 NULL ++__pin_pagetable_pfn_2172 __pin_pagetable_pfn 2 2172 NULL ++ore_read_2175 ore_read 0 2175 NULL ++intel_i2c_quirk_xfer_2183 intel_i2c_quirk_xfer 0-4 2183 NULL ++direction_output_2184 direction_output 0 2184 NULL ++ebt_nat_out_2185 ebt_nat_out 0 2185 NULL ++show_companion_2189 show_companion 0 2189 NULL ++target_core_alua_tg_pt_gp_store_attr_alua_support_active_nonoptimized_2190 target_core_alua_tg_pt_gp_store_attr_alua_support_active_nonoptimized 0-3 2190 NULL ++w1_f1C_fix_count_2191 w1_f1C_fix_count 0-2-1-3 2191 NULL ++bio_integrity_alloc_2194 bio_integrity_alloc 3 2194 NULL ++picolcd_debug_reset_write_2195 picolcd_debug_reset_write 3-0 2195 NULL ++wl1271_acx_init_mem_config_2199 wl1271_acx_init_mem_config 0 2199 NULL ++out_write_bytes_avail_show_2201 out_write_bytes_avail_show 0 2201 NULL ++ath10k_mac_txpower_recalc_2204 ath10k_mac_txpower_recalc 0 2204 NULL ++mcs_receive_start_2206 mcs_receive_start 0 2206 NULL ++ghash_final_2210 ghash_final 0 2210 NULL ++il_send_cmd_pdu_2216 il_send_cmd_pdu 0 2216 NULL ++ssb_bus_ssbbus_register_2217 ssb_bus_ssbbus_register 2 2217 NULL ++u32_array_read_2219 u32_array_read 3-0 2219 NULL nohasharray ++mei_dbgfs_read_meclients_2219 mei_dbgfs_read_meclients 3-0 2219 &u32_array_read_2219 nohasharray ++canon_copy_from_read_buf_2219 canon_copy_from_read_buf 0 2219 &mei_dbgfs_read_meclients_2219 ++fore200e_change_qos_2222 fore200e_change_qos 0 2222 NULL ++ceph_osdc_new_request_2226 ceph_osdc_new_request 7 2226 NULL ++iwl_wait_notification_2227 iwl_wait_notification 0 2227 NULL ++s5k4aa_set_brightness_2228 s5k4aa_set_brightness 0 2228 NULL ++rx8025_get_time_2231 rx8025_get_time 0 2231 NULL ++usb_set_usb2_hardware_lpm_2234 usb_set_usb2_hardware_lpm 0 2234 NULL ++protocol_read_2240 protocol_read 0 2240 NULL ++mlx4_buddy_init_2244 mlx4_buddy_init 2 2244 NULL ++ieee80211_if_read_dot11MeshHWMPRannInterval_2249 ieee80211_if_read_dot11MeshHWMPRannInterval 3-0 2249 NULL nohasharray ++rev_show_2249 rev_show 0 2249 &ieee80211_if_read_dot11MeshHWMPRannInterval_2249 ++sdev_store_timeout_2254 sdev_store_timeout 0-4 2254 NULL ++sel_write_avc_cache_threshold_2256 sel_write_avc_cache_threshold 3-0 2256 NULL ++do_update_counters_2259 do_update_counters 4 2259 NULL nohasharray ++mic_unmap_single_2259 mic_unmap_single 2 2259 &do_update_counters_2259 ++failslab_store_2260 failslab_store 0-3 2260 NULL ++cap_inode_setxattr_2265 cap_inode_setxattr 0 2265 NULL nohasharray ++ath9k_sta_remove_2265 ath9k_sta_remove 0 2265 &cap_inode_setxattr_2265 ++reg_page_map_set_2268 reg_page_map_set 0 2268 NULL ++snd_m3_pcm_prepare_2270 snd_m3_pcm_prepare 0 2270 NULL ++show_direct_dword_2271 show_direct_dword 0 2271 NULL ++mwifiex_cmd_11n_addba_req_2272 mwifiex_cmd_11n_addba_req 0 2272 NULL ++b43legacy_gpio_init_2273 b43legacy_gpio_init 0 2273 NULL ++ath6kl_wmi_bssinfo_event_rx_2275 ath6kl_wmi_bssinfo_event_rx 3 2275 NULL ++sbni_open_2276 sbni_open 0 2276 NULL ++vpdma_alloc_desc_buf_2278 vpdma_alloc_desc_buf 2 2278 NULL ++_iwl_mvm_enable_beacon_filter_2279 _iwl_mvm_enable_beacon_filter 0 2279 NULL ++write_live_nvram_2280 write_live_nvram 0-6-5 2280 NULL ++journal_flush_2281 journal_flush 0 2281 NULL ++nilfs_snapshot_inodes_count_show_2288 nilfs_snapshot_inodes_count_show 0 2288 NULL nohasharray ++store_constraint_power_limit_uw_2288 store_constraint_power_limit_uw 0-4 2288 &nilfs_snapshot_inodes_count_show_2288 ++debug_debug5_read_2291 debug_debug5_read 3-0 2291 NULL ++transient_state_show_2292 transient_state_show 0 2292 NULL ++__vxge_hw_device_register_poll_2293 __vxge_hw_device_register_poll 0 2293 NULL ++server_monitor_conn_id_show_2294 server_monitor_conn_id_show 0 2294 NULL nohasharray ++relay_file_splice_read_2294 relay_file_splice_read 0 2294 &server_monitor_conn_id_show_2294 ++sr_read_cmd_2299 sr_read_cmd 5 2299 NULL ++jfs_unfreeze_2305 jfs_unfreeze 0 2305 NULL ++pci_conf1_write_2310 pci_conf1_write 0 2310 NULL ++intel_sdvo_set_value_2311 intel_sdvo_set_value 4 2311 NULL ++adfs_dir_update_2313 adfs_dir_update 0 2313 NULL nohasharray ++fsp_attr_set_pagereg_2313 fsp_attr_set_pagereg 0-4 2313 &adfs_dir_update_2313 ++page_alloc_cpu_notify_2317 page_alloc_cpu_notify 0 2317 NULL ++hfsplus_find_init_2318 hfsplus_find_init 0 2318 NULL nohasharray ++picolcd_fb_write_2318 picolcd_fb_write 3 2318 &hfsplus_find_init_2318 ++store_temp_st_2321 store_temp_st 0-4 2321 NULL ++gart_map_page_2325 gart_map_page 4-3-0 2325 NULL ++fuse_write_begin_2326 fuse_write_begin 0 2326 NULL ++serial_write_2330 serial_write 3-0 2330 NULL ++snd_mixart_trigger_2331 snd_mixart_trigger 0 2331 NULL ++__erst_read_to_erange_2341 __erst_read_to_erange 0 2341 NULL ++show_ipv6_iface_nd_reachable_tmo_2343 show_ipv6_iface_nd_reachable_tmo 0 2343 NULL nohasharray ++dev_attr_store_2343 dev_attr_store 0-4 2343 &show_ipv6_iface_nd_reachable_tmo_2343 ++adapter_up_2348 adapter_up 0 2348 NULL ++tps80031_vbus_enable_2349 tps80031_vbus_enable 0 2349 NULL ++nfqnl_rcv_dev_event_2350 nfqnl_rcv_dev_event 0 2350 NULL nohasharray ++srpt_tpg_attrib_store_srp_max_rsp_size_2350 srpt_tpg_attrib_store_srp_max_rsp_size 0-3 2350 &nfqnl_rcv_dev_event_2350 ++snd_seq_ioctl_get_queue_client_2351 snd_seq_ioctl_get_queue_client 0 2351 NULL ++_add_parity_units_2352 _add_parity_units 0 2352 NULL ++out_of_line_wait_on_bit_lock_2353 out_of_line_wait_on_bit_lock 0 2353 NULL ++zr364xx_read_2354 zr364xx_read 3-0 2354 NULL ++ntfs_file_aio_write_nolock_2360 ntfs_file_aio_write_nolock 0 2360 NULL ++store_2362 store 0 2362 NULL ++viafb_iga2_odev_proc_write_2363 viafb_iga2_odev_proc_write 3-0 2363 NULL nohasharray ++__mlx4_register_mac_2363 __mlx4_register_mac 0 2363 &viafb_iga2_odev_proc_write_2363 ++mgmt_get_nic_conf_2364 mgmt_get_nic_conf 0 2364 NULL ++xfs_buf_map_from_irec_2368 xfs_buf_map_from_irec 5-0 2368 NULL nohasharray ++rose_recvmsg_2368 rose_recvmsg 0-4 2368 &xfs_buf_map_from_irec_2368 ++il_dbgfs_sensitivity_read_2370 il_dbgfs_sensitivity_read 3-0 2370 NULL nohasharray ++usb2_lpm_l1_timeout_store_2370 usb2_lpm_l1_timeout_store 0-4 2370 &il_dbgfs_sensitivity_read_2370 nohasharray ++pcie_flr_2370 pcie_flr 0 2370 &usb2_lpm_l1_timeout_store_2370 ++rtl_port_map_2385 rtl_port_map 1-2 2385 NULL ++show_iface_initial_r2t_2390 show_iface_initial_r2t 0 2390 NULL ++_transport_get_bay_identifier_2396 _transport_get_bay_identifier 0 2396 NULL ++uda1380_hw_write_2398 uda1380_hw_write 3 2398 NULL nohasharray ++show_ledd_2398 show_ledd 0 2398 &uda1380_hw_write_2398 nohasharray ++_ctl_board_name_show_2398 _ctl_board_name_show 0 2398 &show_ledd_2398 nohasharray ++am79c_config_init_2398 am79c_config_init 0 2398 &_ctl_board_name_show_2398 ++rxpipe_rx_prep_beacon_drop_read_2403 rxpipe_rx_prep_beacon_drop_read 3-0 2403 NULL nohasharray ++gsmi_clear_config_store_2403 gsmi_clear_config_store 0-4 2403 &rxpipe_rx_prep_beacon_drop_read_2403 ++energy_uj_show_2404 energy_uj_show 0 2404 NULL nohasharray ++PTR_ERR_OR_ZERO_2404 PTR_ERR_OR_ZERO 0 2404 &energy_uj_show_2404 ++sk_attach_filter_2410 sk_attach_filter 0 2410 NULL ++isdn_v110_open_2418 isdn_v110_open 3 2418 NULL ++store_console_2419 store_console 0-4 2419 NULL ++roccat_common2_send_2422 roccat_common2_send 0-4 2422 NULL nohasharray ++ks_set_mac_address_2422 ks_set_mac_address 0 2422 &roccat_common2_send_2422 ++elan_smbus_set_mode_2425 elan_smbus_set_mode 0 2425 NULL ++hfcpci_empty_fifo_2427 hfcpci_empty_fifo 4 2427 NULL ++perf_cpu_notify_2431 perf_cpu_notify 0 2431 NULL ++show_iface_ipaddress_state_2432 show_iface_ipaddress_state 0 2432 NULL nohasharray ++set_otp3_2432 set_otp3 4-0 2432 &show_iface_ipaddress_state_2432 nohasharray ++aty_var_to_pll_514_2432 aty_var_to_pll_514 0 2432 &set_otp3_2432 ++ioremap_nocache_2439 ioremap_nocache 2-1 2439 NULL nohasharray ++__uncore_filter_tid_show_2439 __uncore_filter_tid_show 0 2439 &ioremap_nocache_2439 ++eir_get_length_2441 eir_get_length 0-2 2441 NULL ++max1027_set_trigger_state_2443 max1027_set_trigger_state 0 2443 NULL ++niu_tx_channel_lpage_init_2444 niu_tx_channel_lpage_init 0 2444 NULL ++qib_reset_device_2446 qib_reset_device 0 2446 NULL ++show_session_param_ISCSI_PARAM_DATASEQ_INORDER_EN_2449 show_session_param_ISCSI_PARAM_DATASEQ_INORDER_EN 0 2449 NULL ++efi_pstore_read_2453 efi_pstore_read 0 2453 NULL ++ath6kl_usb_bmi_write_2454 ath6kl_usb_bmi_write 3 2454 NULL ++name_size_2461 name_size 0 2461 NULL nohasharray ++ibm_rtl_write_2461 ibm_rtl_write 0 2461 &name_size_2461 ++vbi_out_queue_setup_2464 vbi_out_queue_setup 0 2464 NULL ++__sock_recvmsg_2467 __sock_recvmsg 0-4 2467 NULL ++signalfd_copyinfo_2472 signalfd_copyinfo 0 2472 NULL ++b43legacy_debugfs_read_2473 b43legacy_debugfs_read 3-0 2473 NULL ++fc_fcp_send_data_2479 fc_fcp_send_data 4-3 2479 NULL ++update_pmkid_2481 update_pmkid 4 2481 NULL ++wiphy_new_2482 wiphy_new 2 2482 NULL nohasharray ++matroxfb_decode_var_2482 matroxfb_decode_var 0 2482 &wiphy_new_2482 ++bio_alloc_bioset_2484 bio_alloc_bioset 2 2484 NULL nohasharray ++hfs_write_begin_2484 hfs_write_begin 0-3 2484 &bio_alloc_bioset_2484 ++hfsplus_user_setxattr_2485 hfsplus_user_setxattr 0 2485 NULL nohasharray ++of_property_read_string_index_2485 of_property_read_string_index 3 2485 &hfsplus_user_setxattr_2485 ++affs_file_fsync_2486 affs_file_fsync 0 2486 NULL nohasharray ++sk_attach_bpf_2486 sk_attach_bpf 0 2486 &affs_file_fsync_2486 ++pcistub_quirk_show_2487 pcistub_quirk_show 0 2487 NULL nohasharray ++ax88179_set_mac_addr_2487 ax88179_set_mac_addr 0 2487 &pcistub_quirk_show_2487 ++xen_wdt_write_2491 xen_wdt_write 0-3 2491 NULL nohasharray ++cifs_wp_retry_size_2491 cifs_wp_retry_size 0 2491 &xen_wdt_write_2491 ++xenvif_alloc_skb_2492 xenvif_alloc_skb 1 2492 NULL ++show_tabletExecute_2495 show_tabletExecute 0 2495 NULL ++_read_fact_prot_reg_2497 _read_fact_prot_reg 0 2497 NULL nohasharray ++blk_rq_unmap_user_2497 blk_rq_unmap_user 0 2497 &_read_fact_prot_reg_2497 nohasharray ++usb_8dev_send_cmd_msg_2497 usb_8dev_send_cmd_msg 0 2497 &blk_rq_unmap_user_2497 ++mxt_probe_bootloader_2498 mxt_probe_bootloader 0 2498 NULL ++read_u8_from_i2c_2501 read_u8_from_i2c 0 2501 NULL ++parport_pc_read_data_2503 parport_pc_read_data 0 2503 NULL ++chip_ngpio_show_2504 chip_ngpio_show 0 2504 NULL ++wiimote_ext_store_2505 wiimote_ext_store 0-4 2505 NULL ++squashfs_read_fragment_index_table_2506 squashfs_read_fragment_index_table 4 2506 NULL ++set_blocksize_2507 set_blocksize 0 2507 NULL ++store_pch_mac_2512 store_pch_mac 0-4 2512 NULL ++dm_write_2513 dm_write 3 2513 NULL ++v9fs_cached_file_read_2514 v9fs_cached_file_read 3-0 2514 NULL ++pm_freeze_timeout_show_2515 pm_freeze_timeout_show 0 2515 NULL nohasharray ++nilfs_palloc_get_desc_block_2515 nilfs_palloc_get_desc_block 0 2515 &pm_freeze_timeout_show_2515 ++ext4_get_inode_loc_2516 ext4_get_inode_loc 0 2516 NULL ++bond_master_upper_dev_link_2518 bond_master_upper_dev_link 0 2518 NULL ++pb0100_set_autogain_target_2519 pb0100_set_autogain_target 0 2519 NULL ++batadv_tvlv_container_list_size_2524 batadv_tvlv_container_list_size 0 2524 NULL ++qlcnic_82xx_config_led_2528 qlcnic_82xx_config_led 0 2528 NULL ++smk_write_syslog_2529 smk_write_syslog 3-0 2529 NULL nohasharray ++efs_statfs_2529 efs_statfs 0 2529 &smk_write_syslog_2529 ++chksum_finup_2530 chksum_finup 0 2530 NULL ++__ceph_setxattr_2532 __ceph_setxattr 4-0 2532 NULL nohasharray ++inet_csk_get_port_2532 inet_csk_get_port 0 2532 &__ceph_setxattr_2532 ++kobj_to_setup_data_nr_2534 kobj_to_setup_data_nr 0 2534 NULL ++w1_master_attribute_show_add_2536 w1_master_attribute_show_add 0 2536 NULL nohasharray ++nilfs_mounted_snapshots_attr_store_2536 nilfs_mounted_snapshots_attr_store 0-4 2536 &w1_master_attribute_show_add_2536 ++reset_chip_2547 reset_chip 0 2547 NULL ++sn9c2028_read4_2561 sn9c2028_read4 0 2561 NULL ++cc2520_filter_2562 cc2520_filter 0 2562 NULL ++ath10k_write_pktlog_filter_2569 ath10k_write_pktlog_filter 3-0 2569 NULL nohasharray ++gfs2_listxattr_2569 gfs2_listxattr 0-3 2569 &ath10k_write_pktlog_filter_2569 nohasharray ++func_2569 func 0 2569 &gfs2_listxattr_2569 ++gspca_dev_probe_2570 gspca_dev_probe 4 2570 NULL ++acpi_ds_evaluate_name_path_2573 acpi_ds_evaluate_name_path 0 2573 NULL ++pcm_sanity_check_2574 pcm_sanity_check 0 2574 NULL ++dlm_attr_show_2577 dlm_attr_show 0 2577 NULL nohasharray ++ttm_mem_zone_store_2577 ttm_mem_zone_store 0-4 2577 &dlm_attr_show_2577 ++saa711x_s_mbus_fmt_2579 saa711x_s_mbus_fmt 0 2579 NULL ++mxt_hw_version_show_2580 mxt_hw_version_show 0 2580 NULL ++amd_iommu_show_cap_2585 amd_iommu_show_cap 0 2585 NULL ++show_orig_dgid_2586 show_orig_dgid 0 2586 NULL ++show_tabletJitterDelay_2590 show_tabletJitterDelay 0 2590 NULL nohasharray ++wake_up_key_store_2590 wake_up_key_store 0-4 2590 &show_tabletJitterDelay_2590 ++mdc_max_rpcs_in_flight_seq_write_2594 mdc_max_rpcs_in_flight_seq_write 3 2594 NULL ++vxlan_init_2599 vxlan_init 0 2599 NULL ++atmel_change_mtu_2603 atmel_change_mtu 0 2603 NULL ++__snd_hda_add_vmaster_2604 __snd_hda_add_vmaster 0 2604 NULL ++__nf_conntrack_confirm_2605 __nf_conntrack_confirm 0 2605 NULL ++cfq_target_latency_store_2606 cfq_target_latency_store 3-0 2606 NULL ++xen_upload_processor_pm_data_2607 xen_upload_processor_pm_data 0 2607 NULL ++rose_getname_2608 rose_getname 0 2608 NULL ++slot_bytes_2609 slot_bytes 0 2609 NULL ++read_2610 read 0 2610 NULL ++__mt9t112_reg_read_2615 __mt9t112_reg_read 0 2615 NULL ++bytes_to_fcr_rxtrig_2616 bytes_to_fcr_rxtrig 0 2616 NULL ++smk_write_logging_2618 smk_write_logging 3-0 2618 NULL ++smack_socket_sendmsg_2622 smack_socket_sendmsg 0 2622 NULL ++switch_status_2629 switch_status 5 2629 NULL ++tcm_loop_make_nexus_2630 tcm_loop_make_nexus 0 2630 NULL ++_proc_do_string_2632 _proc_do_string 2 2632 NULL ++show_fnode_def_time2wait_2633 show_fnode_def_time2wait 0 2633 NULL ++f2fs_getxattr_2642 f2fs_getxattr 0 2642 NULL ++cfq_low_latency_show_2644 cfq_low_latency_show 0 2644 NULL ++offset_show_2645 offset_show 0 2645 NULL ++get_sas_protocol_names_2649 get_sas_protocol_names 0 2649 NULL ++svc_recvfrom_2650 svc_recvfrom 4 2650 NULL ++lola_setup_controller_2653 lola_setup_controller 0 2653 NULL ++ascending_callback_2658 ascending_callback 0 2658 NULL nohasharray ++nfs4_xattr_set_nfs4_acl_2658 nfs4_xattr_set_nfs4_acl 0 2658 &ascending_callback_2658 ++request_msix_queue_irqs_2661 request_msix_queue_irqs 0 2661 NULL ++snd_es1938_playback_trigger_2663 snd_es1938_playback_trigger 0 2663 NULL nohasharray ++aac_show_serial_number_2663 aac_show_serial_number 0 2663 &snd_es1938_playback_trigger_2663 ++show_fnode_bidi_chap_2665 show_fnode_bidi_chap 0 2665 NULL ++w1_master_attribute_show_search_2672 w1_master_attribute_show_search 0 2672 NULL nohasharray ++ath10k_add_interface_2672 ath10k_add_interface 0 2672 &w1_master_attribute_show_search_2672 nohasharray ++ffs_ep0_read_2672 ffs_ep0_read 3 2672 &ath10k_add_interface_2672 ++digi_write_2679 digi_write 0-4 2679 NULL ++bonding_show_arp_interval_2682 bonding_show_arp_interval 0 2682 NULL ++alx_set_mac_address_2683 alx_set_mac_address 0 2683 NULL ++ath5k_hw_rf2425_channel_2685 ath5k_hw_rf2425_channel 0 2685 NULL ++__disk_events_show_2691 __disk_events_show 0 2691 NULL nohasharray ++ia_change_qos_2691 ia_change_qos 0 2691 &__disk_events_show_2691 ++oti6858_write_2692 oti6858_write 4-0 2692 NULL nohasharray ++tun_show_flags_2692 tun_show_flags 0 2692 &oti6858_write_2692 ++blkdev_write_begin_2696 blkdev_write_begin 0 2696 NULL nohasharray ++gdth_set_asc_info_2696 gdth_set_asc_info 0-3 2696 &blkdev_write_begin_2696 ++show_session_param_ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL_2699 show_session_param_ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL 0 2699 NULL ++cbaf_wusb_cdid_show_2700 cbaf_wusb_cdid_show 0 2700 NULL ++nfc_llcp_send_ui_frame_2702 nfc_llcp_send_ui_frame 5-0 2702 NULL ++lx_pipe_allocate_2703 lx_pipe_allocate 0 2703 NULL ++udf_setsize_2705 udf_setsize 0 2705 NULL ++memcpy_fromiovecend_2707 memcpy_fromiovecend 4-3 2707 NULL ++SyS_pwrite64_2708 SyS_pwrite64 3 2708 NULL nohasharray ++lprocfs_stats_counter_size_2708 lprocfs_stats_counter_size 0 2708 &SyS_pwrite64_2708 ++sock_error_2715 sock_error 0 2715 NULL nohasharray ++tg3_request_firmware_2715 tg3_request_firmware 0 2715 &sock_error_2715 ++migration_call_2716 migration_call 0 2716 NULL ++gpiod_direction_input_2718 gpiod_direction_input 0 2718 NULL ++snd_hdspm_trigger_2720 snd_hdspm_trigger 0 2720 NULL ++__xip_file_write_2733 __xip_file_write 0-3-4 2733 NULL ++o2hb_region_dev_read_2735 o2hb_region_dev_read 0 2735 NULL ++ad5398_enable_2738 ad5398_enable 0 2738 NULL nohasharray ++ltm_capable_show_2738 ltm_capable_show 0 2738 &ad5398_enable_2738 ++sdo_streamoff_2740 sdo_streamoff 0 2740 NULL ++selinux_inode_getsecurity_2741 selinux_inode_getsecurity 0 2741 NULL ++attr_sensitivity_store_tpkbd_2753 attr_sensitivity_store_tpkbd 0-4 2753 NULL ++show_2757 show 0 2757 NULL ++rds_free_mr_2761 rds_free_mr 0 2761 NULL ++hid_report_raw_event_2762 hid_report_raw_event 4 2762 NULL ++store_prochot_max_2763 store_prochot_max 0-4 2763 NULL nohasharray ++bh1770_set_lux_thresh_above_2763 bh1770_set_lux_thresh_above 0-4 2763 &store_prochot_max_2763 ++happy_meal_init_2765 happy_meal_init 0 2765 NULL ++xfs_readdir_2767 xfs_readdir 3 2767 NULL ++fsl_edma_alloc_desc_2769 fsl_edma_alloc_desc 2 2769 NULL ++mon_bin_ioctl_2771 mon_bin_ioctl 3 2771 NULL ++vmbus_sendpacket_2774 vmbus_sendpacket 0 2774 NULL nohasharray ++_sctp_make_chunk_2774 _sctp_make_chunk 4 2774 &vmbus_sendpacket_2774 ++s35390a_set_reg_2775 s35390a_set_reg 0 2775 NULL ++validate_lock_args_2780 validate_lock_args 0 2780 NULL nohasharray ++__qlge_vlan_rx_add_vid_2780 __qlge_vlan_rx_add_vid 0 2780 &validate_lock_args_2780 ++__next_cpu_2782 __next_cpu 1-0 2782 NULL ++nfs4_do_create_2787 nfs4_do_create 0 2787 NULL ++device_add_attrs_2789 device_add_attrs 0 2789 NULL ++write_2792 write 0 2792 NULL ++rocker_dma_ring_bufs_alloc_2795 rocker_dma_ring_bufs_alloc 4-0 2795 NULL ++_ctl_BRM_status_show_2797 _ctl_BRM_status_show 0 2797 NULL ++sound_read_2798 sound_read 0-3 2798 NULL nohasharray ++discover_2798 discover 0 2798 &sound_read_2798 ++fc0012_set_params_2799 fc0012_set_params 0 2799 NULL ++stop_transport_2802 stop_transport 0 2802 NULL ++iwl_dbgfs_clear_ucode_statistics_write_2804 iwl_dbgfs_clear_ucode_statistics_write 3-0 2804 NULL nohasharray ++rtl_set_state_2804 rtl_set_state 0-4 2804 &iwl_dbgfs_clear_ucode_statistics_write_2804 ++show_2808 show 0 2808 NULL ++show_min_2810 show_min 0 2810 NULL ++show_min_height_2812 show_min_height 0 2812 NULL nohasharray ++rmd160_final_2812 rmd160_final 0 2812 &show_min_height_2812 ++qib_user_sdma_push_pkts_2814 qib_user_sdma_push_pkts 0 2814 NULL ++store_engine3_leds_2815 store_engine3_leds 0-4 2815 NULL ++ocfs2_inode_lock_atime_2819 ocfs2_inode_lock_atime 0 2819 NULL ++aux_xfer_2820 aux_xfer 0-3 2820 NULL ++ltc4215_show_current_2825 ltc4215_show_current 0 2825 NULL nohasharray ++store_proxyarp_2825 store_proxyarp 0 2825 <c4215_show_current_2825 ++pvc_getname_2826 pvc_getname 0 2826 NULL ++sel_read_enforce_2828 sel_read_enforce 3-0 2828 NULL nohasharray ++s35390a_set_alarm_2828 s35390a_set_alarm 0 2828 &sel_read_enforce_2828 ++acm_submit_read_urb_2830 acm_submit_read_urb 0 2830 NULL ++sock_create_2838 sock_create 0 2838 NULL ++sctp_packet_2839 sctp_packet 0 2839 NULL ++show_temp_max_2846 show_temp_max 0 2846 NULL ++wait_for_avail_2847 wait_for_avail 0 2847 NULL ++pcxhr_check_reg_bit_2848 pcxhr_check_reg_bit 0 2848 NULL nohasharray ++ext4_xattr_user_list_2848 ext4_xattr_user_list 0-5 2848 &pcxhr_check_reg_bit_2848 ++wl12xx_op_sta_state_2849 wl12xx_op_sta_state 0 2849 NULL ++ufs_free_fragments_2857 ufs_free_fragments 2 2857 NULL ++max_corrected_read_errors_show_2858 max_corrected_read_errors_show 0 2858 NULL nohasharray ++__uncore_match1_show_2858 __uncore_match1_show 0 2858 &max_corrected_read_errors_show_2858 ++hello_time_store_2859 hello_time_store 4-0 2859 NULL nohasharray ++store_prochot_interval_2859 store_prochot_interval 0-4 2859 &hello_time_store_2859 nohasharray ++pwm_unexport_child_2859 pwm_unexport_child 0 2859 &store_prochot_interval_2859 ++iuu_uart_write_2860 iuu_uart_write 0-4 2860 NULL nohasharray ++btrfs_feature_attr_store_2860 btrfs_feature_attr_store 0-4 2860 &iuu_uart_write_2860 ++sfq_alloc_2861 sfq_alloc 1 2861 NULL ++irnet_ctrl_read_2863 irnet_ctrl_read 4-0 2863 NULL ++cifs_get_inode_info_unix_2864 cifs_get_inode_info_unix 0 2864 NULL ++iwl_mvm_mac_ctxt_allocate_resources_2867 iwl_mvm_mac_ctxt_allocate_resources 0 2867 NULL ++move_addr_to_user_2868 move_addr_to_user 2 2868 NULL ++coda_setattr_2871 coda_setattr 0 2871 NULL ++ath6kl_open_2872 ath6kl_open 0 2872 NULL ++il4965_alloc_bcast_station_2876 il4965_alloc_bcast_station 0 2876 NULL ++show_2877 show 0 2877 NULL ++ksdazzle_net_open_2882 ksdazzle_net_open 0 2882 NULL ++wait_for_commit_2887 wait_for_commit 0 2887 NULL ++abx500_get_register_page_interruptible_2888 abx500_get_register_page_interruptible 0 2888 NULL nohasharray ++tcm_loop_tpg_show_nexus_2888 tcm_loop_tpg_show_nexus 0 2888 &abx500_get_register_page_interruptible_2888 ++sata_req_2894 sata_req 0 2894 NULL ++bch_cache_show_2895 bch_cache_show 0 2895 NULL ++cmm_write_2896 cmm_write 3-0 2896 NULL ++sd_isoc_nego_2899 sd_isoc_nego 0 2899 NULL ++wacom_btnimg6_store_2901 wacom_btnimg6_store 4-0 2901 NULL ++next_online_node_2904 next_online_node 1 2904 NULL ++max8998_update_reg_2907 max8998_update_reg 0 2907 NULL ++iommu_group_attr_show_2908 iommu_group_attr_show 0 2908 NULL ++ore_check_io_2912 ore_check_io 0 2912 NULL ++target_fabric_nacl_param_attr_show_2915 target_fabric_nacl_param_attr_show 0 2915 NULL ++osc_import_seq_write_2923 osc_import_seq_write 3 2923 NULL ++sysv_getattr_2924 sysv_getattr 0 2924 NULL ++count_esp_combs_2926 count_esp_combs 0 2926 NULL ++xfs_trans_get_buf_map_2927 xfs_trans_get_buf_map 4 2927 NULL ++mos7840_set_uart_reg_2929 mos7840_set_uart_reg 0 2929 NULL ++mls_from_string_2930 mls_from_string 0 2930 NULL ++smi_data_buf_size_show_2931 smi_data_buf_size_show 0 2931 NULL ++tsl2550_show_operating_mode_2934 tsl2550_show_operating_mode 0 2934 NULL ++show_convrate_2936 show_convrate 0 2936 NULL ++xfs_da_get_buf_2939 xfs_da_get_buf 0 2939 NULL ++nes_read_indexed_2946 nes_read_indexed 0 2946 NULL ++cpu_subsys_online_2947 cpu_subsys_online 0 2947 NULL ++tm6000_i2c_recv_regs16_2949 tm6000_i2c_recv_regs16 5-0 2949 NULL ++i40e_dbg_prep_dump_buf_2951 i40e_dbg_prep_dump_buf 2 2951 NULL nohasharray ++store_ideapad_fan_2951 store_ideapad_fan 0-4 2951 &i40e_dbg_prep_dump_buf_2951 ++set_fast_connectable_2952 set_fast_connectable 4 2952 NULL ++out_intr_mask_show_2953 out_intr_mask_show 0 2953 NULL ++show_2958 show 0 2958 NULL ++mc13xxx_spi_read_2961 mc13xxx_spi_read 0 2961 NULL ++free_area_init_core_2962 free_area_init_core 2-3 2962 NULL ++ppp_cp_event_2965 ppp_cp_event 6 2965 NULL ++snd_ice1712_pro_trigger_2968 snd_ice1712_pro_trigger 0 2968 NULL ++fcoe_device_notification_2970 fcoe_device_notification 0 2970 NULL ++loopback_trigger_2975 loopback_trigger 0 2975 NULL nohasharray ++pb0100_set_exposure_2975 pb0100_set_exposure 0 2975 &loopback_trigger_2975 ++do_strnlen_user_2976 do_strnlen_user 0-2 2976 NULL ++snd_trident_ioctl_2977 snd_trident_ioctl 0 2977 NULL ++bnx2i_ep_get_param_2979 bnx2i_ep_get_param 0 2979 NULL ++ps_get_max_charge_cntl_limit_2983 ps_get_max_charge_cntl_limit 0 2983 NULL ++p9_nr_pages_2992 p9_nr_pages 0-2 2992 NULL ++_ctl_diag_trigger_event_show_2995 _ctl_diag_trigger_event_show 0 2995 NULL nohasharray ++nfs_write_inode_2995 nfs_write_inode 0 2995 &_ctl_diag_trigger_event_show_2995 ++packet_bind_2996 packet_bind 0 2996 NULL ++store_cardr_2997 store_cardr 4-0 2997 NULL ++tcm_qla2xxx_tpg_attrib_show_demo_mode_write_protect_3000 tcm_qla2xxx_tpg_attrib_show_demo_mode_write_protect 0 3000 NULL nohasharray ++ieee80211_parse_bitrates_3000 ieee80211_parse_bitrates 0 3000 &tcm_qla2xxx_tpg_attrib_show_demo_mode_write_protect_3000 ++smsc75xx_mdio_read_3001 smsc75xx_mdio_read 0 3001 NULL ++vb2_queue_or_prepare_buf_3006 vb2_queue_or_prepare_buf 0 3006 NULL nohasharray ++store_regs_in_max0_3006 store_regs_in_max0 0-4 3006 &vb2_queue_or_prepare_buf_3006 ++lov_stripetype_seq_write_3013 lov_stripetype_seq_write 3 3013 NULL ++udf_symlink_filler_3015 udf_symlink_filler 0 3015 NULL ++do_dmabuf_dirty_sou_3017 do_dmabuf_dirty_sou 7 3017 NULL ++iscsi_stat_instance_show_attr_portals_3019 iscsi_stat_instance_show_attr_portals 0 3019 NULL ++depth_write_3021 depth_write 3-0 3021 NULL ++show_in_min0_3025 show_in_min0 0 3025 NULL nohasharray ++xudc_ep_queue_3025 xudc_ep_queue 0 3025 &show_in_min0_3025 ++__blocking_notifier_call_chain_3028 __blocking_notifier_call_chain 0 3028 NULL ++unix_listen_3031 unix_listen 0 3031 NULL ++mem_cgroup_hierarchy_write_3032 mem_cgroup_hierarchy_write 0 3032 NULL ++xfrm_dst_alloc_copy_3034 xfrm_dst_alloc_copy 3 3034 NULL ++show_otp0en_3036 show_otp0en 0 3036 NULL ++lpfc_idiag_mbxacc_write_3038 lpfc_idiag_mbxacc_write 3-0 3038 NULL nohasharray ++iwl_dbgfs_sleep_level_override_read_3038 iwl_dbgfs_sleep_level_override_read 3-0 3038 &lpfc_idiag_mbxacc_write_3038 ++get_max_acpi_id_3039 get_max_acpi_id 0 3039 NULL ++snd_hwdep_read_3040 snd_hwdep_read 0-3 3040 NULL ++nr_free_buffer_pages_3044 nr_free_buffer_pages 0 3044 NULL ++instance_pe_count_show_3046 instance_pe_count_show 0 3046 NULL nohasharray ++mptsas_get_linkerrors_3046 mptsas_get_linkerrors 0 3046 &instance_pe_count_show_3046 ++il3945_ucode_rx_stats_read_3048 il3945_ucode_rx_stats_read 3-0 3048 NULL ++mwl8k_post_pervif_cmd_3050 mwl8k_post_pervif_cmd 0 3050 NULL nohasharray ++target_core_alua_tg_pt_gp_store_attr_alua_support_lba_dependent_3050 target_core_alua_tg_pt_gp_store_attr_alua_support_lba_dependent 0-3 3050 &mwl8k_post_pervif_cmd_3050 ++smsc75xx_reset_3053 smsc75xx_reset 0 3053 NULL ++ath10k_wmi_main_cmd_init_3054 ath10k_wmi_main_cmd_init 0 3054 NULL ++mwl8k_post_cmd_3056 mwl8k_post_cmd 0 3056 NULL ++st_flush_write_buffer_3057 st_flush_write_buffer 0 3057 NULL nohasharray ++mv_ep_enable_3057 mv_ep_enable 0 3057 &st_flush_write_buffer_3057 ++dmi_sysfs_entry_instance_3065 dmi_sysfs_entry_instance 0 3065 NULL nohasharray ++set_otp4en_3065 set_otp4en 4-0 3065 &dmi_sysfs_entry_instance_3065 ++qp_alloc_ppn_set_3068 qp_alloc_ppn_set 2-4 3068 NULL ++__blk_end_bidi_request_3070 __blk_end_bidi_request 3-4 3070 NULL ++dac960_user_command_proc_write_3071 dac960_user_command_proc_write 3-0 3071 NULL nohasharray ++hfsplus_asc2uni_3071 hfsplus_asc2uni 0 3071 &dac960_user_command_proc_write_3071 ++bDeviceClass_show_3073 bDeviceClass_show 0 3073 NULL ++show_local_port_3076 show_local_port 0 3076 NULL ++read_file_antenna_diversity_3077 read_file_antenna_diversity 3-0 3077 NULL ++nilfs_btree_propagate_p_3078 nilfs_btree_propagate_p 0 3078 NULL ++poweroff_nb_3079 poweroff_nb 0 3079 NULL ++free_coherent_3082 free_coherent 2-4 3082 NULL ++pm2fb_set_par_3084 pm2fb_set_par 0 3084 NULL ++init_tx_ring_3085 init_tx_ring 4 3085 NULL ++store_pwm_mode_3090 store_pwm_mode 0-4 3090 NULL ++usbhsh_queue_push_3092 usbhsh_queue_push 0 3092 NULL ++bio_integrity_intervals_3094 bio_integrity_intervals 0-2 3094 NULL ++ttusb2_msg_3100 ttusb2_msg 4 3100 NULL nohasharray ++acpi_battery_set_alarm_3100 acpi_battery_set_alarm 0 3100 &ttusb2_msg_3100 ++rb_alloc_3102 rb_alloc 1 3102 NULL nohasharray ++ab_active_port_init_3102 ab_active_port_init 0 3102 &rb_alloc_3102 ++store_fan_stop_time_3106 store_fan_stop_time 0-4 3106 NULL ++mxl111sf_i2c_xfer_3109 mxl111sf_i2c_xfer 0-3 3109 NULL nohasharray ++show_protocols_3109 show_protocols 0 3109 &mxl111sf_i2c_xfer_3109 ++acpi_ec_transaction_unlocked_3112 acpi_ec_transaction_unlocked 0 3112 NULL nohasharray ++show_firmware_version_3112 show_firmware_version 0 3112 &acpi_ec_transaction_unlocked_3112 ++qib_user_sdma_init_payload_3115 qib_user_sdma_init_payload 0 3115 NULL ++m66592_enable_3117 m66592_enable 0 3117 NULL ++lpfc_aer_support_show_3121 lpfc_aer_support_show 0 3121 NULL ++simple_write_to_buffer_3122 simple_write_to_buffer 2-5-0 3122 NULL nohasharray ++iwlagn_send_beacon_cmd_3122 iwlagn_send_beacon_cmd 0 3122 &simple_write_to_buffer_3122 ++iscsi_nacl_param_show_MaxBurstLength_3124 iscsi_nacl_param_show_MaxBurstLength 0 3124 NULL ++open_inb_mbox_3128 open_inb_mbox 0 3128 NULL ++registers_show_3130 registers_show 0 3130 NULL ++print_time_3132 print_time 0 3132 NULL ++crypto_rng_ctxsize_3133 crypto_rng_ctxsize 0 3133 NULL ++fill_write_buffer_3142 fill_write_buffer 3-0 3142 NULL ++filldir_3143 filldir 3 3143 NULL ++b1_get_slice_3145 b1_get_slice 0 3145 NULL ++show_spi_host_hba_id_3150 show_spi_host_hba_id 0 3150 NULL ++CIFSSMBSetPosixACL_3154 CIFSSMBSetPosixACL 5 3154 NULL nohasharray ++adv7175_write_3154 adv7175_write 0 3154 &CIFSSMBSetPosixACL_3154 nohasharray ++cfcnfg_get_id_from_ifi_3154 cfcnfg_get_id_from_ifi 0 3154 &adv7175_write_3154 ++sched_cpu_inactive_3155 sched_cpu_inactive 0 3155 NULL ++compat_sys_migrate_pages_3157 compat_sys_migrate_pages 2 3157 NULL ++ubifs_orphan_end_commit_3161 ubifs_orphan_end_commit 0 3161 NULL ++i915_gem_obj_ggtt_offset_3162 i915_gem_obj_ggtt_offset 0 3162 NULL ++map_smb_to_linux_error_3163 map_smb_to_linux_error 0 3163 NULL ++gfs2_rindex_update_3165 gfs2_rindex_update 0 3165 NULL ++nf_conntrack_broadcast_help_3166 nf_conntrack_broadcast_help 0 3166 NULL nohasharray ++islpci_reset_3166 islpci_reset 0 3166 &nf_conntrack_broadcast_help_3166 ++nfc_alloc_send_skb_3167 nfc_alloc_send_skb 4 3167 NULL ++filelayout_scan_commit_lists_3168 filelayout_scan_commit_lists 0 3168 NULL ++rxrpc_create_3175 rxrpc_create 0 3175 NULL nohasharray ++rebind_store_3175 rebind_store 0-3 3175 &rxrpc_create_3175 ++red_zone_show_3177 red_zone_show 0 3177 NULL ++pkcs7_sig_note_signature_3178 pkcs7_sig_note_signature 5 3178 NULL ++uinput_ioctl_handler_3181 uinput_ioctl_handler 2 3181 NULL nohasharray ++uvc_video_stats_dump_3181 uvc_video_stats_dump 3 3181 &uinput_ioctl_handler_3181 ++tx_stats_read_3182 tx_stats_read 0 3182 NULL ++patch_via_hdmi_3183 patch_via_hdmi 0 3183 NULL ++compat_do_ip6t_set_ctl_3184 compat_do_ip6t_set_ctl 4 3184 NULL ++mempool_create_node_3191 mempool_create_node 1 3191 NULL ++alloc_context_3194 alloc_context 1 3194 NULL nohasharray ++ep_aio_read_3194 ep_aio_read 3 3194 &alloc_context_3194 ++dma_init_coherent_memory_3197 dma_init_coherent_memory 1-3 3197 NULL ++shmem_pread_slow_3198 shmem_pread_slow 2-3 3198 NULL nohasharray ++udp_sendpage_3198 udp_sendpage 4 3198 &shmem_pread_slow_3198 ++queue_write_same_max_show_3199 queue_write_same_max_show 0 3199 NULL ++rtc_valid_tm_3200 rtc_valid_tm 0 3200 NULL ++acpi_smbus_write_3201 acpi_smbus_write 0 3201 NULL ++gpio_keys_show_keys_3202 gpio_keys_show_keys 0 3202 NULL ++usb_clear_halt_3203 usb_clear_halt 0 3203 NULL ++codec_reg_write_file_3204 codec_reg_write_file 3-0 3204 NULL ++cx24113_get_status_3205 cx24113_get_status 0 3205 NULL ++default_cpu_mask_to_apicid_and_3207 default_cpu_mask_to_apicid_and 0 3207 NULL ++sha256_init_3213 sha256_init 0 3213 NULL nohasharray ++__readpages_done_3213 __readpages_done 0 3213 &sha256_init_3213 ++get_target_freq_3217 get_target_freq 0 3217 NULL ++ipath_user_sdma_writev_3218 ipath_user_sdma_writev 0 3218 NULL ++SyS_sendto_3219 SyS_sendto 6-3 3219 NULL ++patch_stac9205_3222 patch_stac9205 0 3222 NULL ++fm3130_get_time_3224 fm3130_get_time 0 3224 NULL nohasharray ++__uncore_dsp_show_3224 __uncore_dsp_show 0 3224 &fm3130_get_time_3224 nohasharray ++store_enabled_3224 store_enabled 0-4 3224 &__uncore_dsp_show_3224 ++acpi_ds_method_data_init_args_3229 acpi_ds_method_data_init_args 0 3229 NULL ++mem_limit_show_3231 mem_limit_show 0 3231 NULL ++btrfs_next_leaf_3232 btrfs_next_leaf 0 3232 NULL ++dvb_ringbuffer_pkt_write_3233 dvb_ringbuffer_pkt_write 3 3233 NULL ++write_adapter_mem_3234 write_adapter_mem 3 3234 NULL ++qla4xxx_phy_port_num_show_3236 qla4xxx_phy_port_num_show 0 3236 NULL nohasharray ++e1000e_setup_rx_resources_3236 e1000e_setup_rx_resources 0 3236 &qla4xxx_phy_port_num_show_3236 nohasharray ++do_read_log_to_user_3236 do_read_log_to_user 4 3236 &e1000e_setup_rx_resources_3236 ++ext3_xattr_find_entry_3237 ext3_xattr_find_entry 0 3237 NULL ++macb_open_3240 macb_open 0 3240 NULL ++key_key_read_3241 key_key_read 3-0 3241 NULL ++base_sock_bind_3245 base_sock_bind 0 3245 NULL ++check_vendor_extension_3254 check_vendor_extension 1 3254 NULL nohasharray ++peak_usb_ndo_open_3254 peak_usb_ndo_open 0 3254 &check_vendor_extension_3254 ++mei_amthif_write_3256 mei_amthif_write 0 3256 NULL ++show_fc_host_firmware_version_3257 show_fc_host_firmware_version 0 3257 NULL ++ipaq_open_3260 ipaq_open 0 3260 NULL ++quota_scale_show_3263 quota_scale_show 0 3263 NULL ++wan_get_status_3268 wan_get_status 0 3268 NULL nohasharray ++phys_to_dma_3268 phys_to_dma 0-2 3268 &wan_get_status_3268 ++mma8452_show_samp_freq_avail_3269 mma8452_show_samp_freq_avail 0 3269 NULL nohasharray ++wq_cpumask_store_3269 wq_cpumask_store 0-4 3269 &mma8452_show_samp_freq_avail_3269 ++technisat_usb2_i2c_xfer_3273 technisat_usb2_i2c_xfer 0-3 3273 NULL nohasharray ++pccard_show_resource_3273 pccard_show_resource 0 3273 &technisat_usb2_i2c_xfer_3273 ++cifs_enable_signing_3276 cifs_enable_signing 0 3276 NULL ++ath6kl_wmi_get_roam_tbl_cmd_3282 ath6kl_wmi_get_roam_tbl_cmd 0 3282 NULL ++__ilog2_u64_3284 __ilog2_u64 0 3284 NULL ++dgram_setsockopt_3285 dgram_setsockopt 0 3285 NULL ++show_ipv4_iface_subnet_3295 show_ipv4_iface_subnet 0 3295 NULL ++ieee80211_if_write_beacon_loss_3296 ieee80211_if_write_beacon_loss 3-0 3296 NULL nohasharray ++patch_stac92hd73xx_3296 patch_stac92hd73xx 0 3296 &ieee80211_if_write_beacon_loss_3296 ++memory_get_cur_bandwidth_3298 memory_get_cur_bandwidth 0 3298 NULL ++x1205_get_atrim_3299 x1205_get_atrim 0 3299 NULL ++__set_extent_bit_3305 __set_extent_bit 0 3305 NULL ++sriov_configure_3307 sriov_configure 0-2 3307 NULL ++minix_write_begin_3311 minix_write_begin 0 3311 NULL nohasharray ++arvo_sysfs_write_3311 arvo_sysfs_write 0-6 3311 &minix_write_begin_3311 ++ceph_vxattrs_name_size_3312 ceph_vxattrs_name_size 0 3312 NULL ++_iwl_dbgfs_d3_sram_write_3315 _iwl_dbgfs_d3_sram_write 3-0 3315 NULL ++dbDiscardAG_3322 dbDiscardAG 3 3322 NULL ++ip6_route_dev_notify_3325 ip6_route_dev_notify 0 3325 NULL ++compat_sys_setsockopt_3326 compat_sys_setsockopt 5 3326 NULL nohasharray ++genphy_read_status_3326 genphy_read_status 0 3326 &compat_sys_setsockopt_3326 ++arch_phys_wc_del_3332 arch_phys_wc_del 1 3332 NULL ++aac_rkt_ioremap_3333 aac_rkt_ioremap 2 3333 NULL ++lis3lv02d_rate_show_3334 lis3lv02d_rate_show 0 3334 NULL ++read_from_oldmem_3337 read_from_oldmem 2-0 3337 NULL ++max_power_range_uw_show_3339 max_power_range_uw_show 0 3339 NULL nohasharray ++sysfs_create_group_3339 sysfs_create_group 0 3339 &max_power_range_uw_show_3339 ++tty_port_register_device_attr_3341 tty_port_register_device_attr 3 3341 NULL ++ip_local_out_3345 ip_local_out 0 3345 NULL ++ubifs_sync_wbufs_by_inode_3346 ubifs_sync_wbufs_by_inode 0 3346 NULL ++bt819_s_stream_3349 bt819_s_stream 0 3349 NULL ++atm_init_aal34_3350 atm_init_aal34 0 3350 NULL ++il_dbgfs_interrupt_read_3351 il_dbgfs_interrupt_read 3-0 3351 NULL ++gsm_control_rls_3353 gsm_control_rls 3 3353 NULL nohasharray ++o2nm_cluster_attr_idle_timeout_ms_write_3353 o2nm_cluster_attr_idle_timeout_ms_write 3-0 3353 &gsm_control_rls_3353 ++anx9805_aux_3358 anx9805_aux 0 3358 NULL ++jbd2_journal_force_commit_3359 jbd2_journal_force_commit 0 3359 NULL ++scnprintf_3360 scnprintf 0-2 3360 NULL ++map_name_show_3361 map_name_show 0 3361 NULL ++iwl_trans_update_sf_3363 iwl_trans_update_sf 0 3363 NULL ++sr_read_3366 sr_read 3 3366 NULL ++nilfs_segctor_fill_in_checkpoint_3369 nilfs_segctor_fill_in_checkpoint 0 3369 NULL ++mv88e6xxx_phy_write_3375 mv88e6xxx_phy_write 0 3375 NULL nohasharray ++hotkey_bios_enabled_show_3375 hotkey_bios_enabled_show 0 3375 &mv88e6xxx_phy_write_3375 ++cifs_write_3376 cifs_write 0 3376 NULL nohasharray ++register_xenbus_watch_3376 register_xenbus_watch 0 3376 &cifs_write_3376 ++vsock_getname_3379 vsock_getname 0 3379 NULL nohasharray ++s5p_mfc_open_mfc_inst_3379 s5p_mfc_open_mfc_inst 0 3379 &vsock_getname_3379 ++slot_show_3380 slot_show 0 3380 NULL nohasharray ++read_rbu_data_3380 read_rbu_data 6-0-5 3380 &slot_show_3380 ++wake_unlock_show_3383 wake_unlock_show 0 3383 NULL nohasharray ++ath9k_htc_sta_add_3383 ath9k_htc_sta_add 0 3383 &wake_unlock_show_3383 ++link_state_store_3384 link_state_store 0-4 3384 NULL ++lanai_setup_rx_vci_aal5_3385 lanai_setup_rx_vci_aal5 0 3385 NULL ++show_temp_value_3387 show_temp_value 0 3387 NULL nohasharray ++drv_set_promiscuous_mode_3387 drv_set_promiscuous_mode 0 3387 &show_temp_value_3387 ++lp3971_reg_read_3389 lp3971_reg_read 0 3389 NULL ++sg_write_3392 sg_write 0-3 3392 NULL ++mtdchar_writeoob_3393 mtdchar_writeoob 4 3393 NULL nohasharray ++nfs_revalidate_mapping_3393 nfs_revalidate_mapping 0 3393 &mtdchar_writeoob_3393 ++iscsit_na_random_datain_pdu_offsets_3398 iscsit_na_random_datain_pdu_offsets 0 3398 NULL ++isdn_readbchan_3401 isdn_readbchan 0-5 3401 NULL ++bdc_ep_enable_3404 bdc_ep_enable 0 3404 NULL ++wl12xx_sdio_set_power_3405 wl12xx_sdio_set_power 0 3405 NULL ++set_pwm_auto_channels_3410 set_pwm_auto_channels 0-4 3410 NULL ++tvp5150_g_crop_3412 tvp5150_g_crop 0 3412 NULL ++__write_reg_3413 __write_reg 0 3413 NULL ++mei_io_cb_alloc_resp_buf_3414 mei_io_cb_alloc_resp_buf 2-0 3414 NULL nohasharray ++broadsheet_spiflash_write_byte_3414 broadsheet_spiflash_write_byte 0 3414 &mei_io_cb_alloc_resp_buf_3414 ++set_location_3415 set_location 0 3415 NULL nohasharray ++be_open_3415 be_open 0 3415 &set_location_3415 ++xfs_attr3_leaf_toosmall_3416 xfs_attr3_leaf_toosmall 0 3416 NULL nohasharray ++dlm_lowcomms_start_3416 dlm_lowcomms_start 0 3416 &xfs_attr3_leaf_toosmall_3416 ++nfs_commit_unstable_pages_3419 nfs_commit_unstable_pages 0 3419 NULL ++get_setup_data_paddr_3421 get_setup_data_paddr 0 3421 NULL ++generic_hdmi_playback_pcm_prepare_3423 generic_hdmi_playback_pcm_prepare 0 3423 NULL ++pci_add_cap_save_buffer_3426 pci_add_cap_save_buffer 3 3426 NULL ++led_set_status_3432 led_set_status 0 3432 NULL ++rj54n1_g_fmt_3433 rj54n1_g_fmt 0 3433 NULL ++SyS_msgsnd_3436 SyS_msgsnd 3 3436 NULL ++wm831x_fll_prepare_3438 wm831x_fll_prepare 0 3438 NULL ++dev_register_3440 dev_register 0 3440 NULL ++pci_write_aer_3441 pci_write_aer 0 3441 NULL ++show_conn_param_ISCSI_PARAM_MAX_SEGMENT_SIZE_3442 show_conn_param_ISCSI_PARAM_MAX_SEGMENT_SIZE 0 3442 NULL ++ncp_symlink_readpage_3448 ncp_symlink_readpage 0 3448 NULL ++map_single_3449 map_single 0 3449 NULL ++store_3451 store 0-3 3451 NULL ++show_in_input1_3453 show_in_input1 0 3453 NULL nohasharray ++mvs_tag_alloc_3453 mvs_tag_alloc 0 3453 &show_in_input1_3453 ++softsynth_write_3455 softsynth_write 3 3455 NULL ++snd_pcm_lib_readv_transfer_3464 snd_pcm_lib_readv_transfer 5 3464 NULL ++iscsi_tpg_param_store_MaxConnections_3467 iscsi_tpg_param_store_MaxConnections 0-3 3467 NULL nohasharray ++alloc_skb_fclone_3467 alloc_skb_fclone 1 3467 &iscsi_tpg_param_store_MaxConnections_3467 ++usb_authorize_device_3468 usb_authorize_device 0 3468 NULL ++gx1_frame_buffer_size_3469 gx1_frame_buffer_size 0 3469 NULL ++i740fb_set_par_3470 i740fb_set_par 0 3470 NULL ++store_pwm_auto_channels_3471 store_pwm_auto_channels 0-4 3471 NULL ++dummy_udc_start_3479 dummy_udc_start 0 3479 NULL nohasharray ++store_hrtbt_enb_3479 store_hrtbt_enb 0-4 3479 &dummy_udc_start_3479 ++wakeup_max_time_show_3485 wakeup_max_time_show 0 3485 NULL ++friq_read_regr_3489 friq_read_regr 0 3489 NULL ++security_context_to_sid_default_3492 security_context_to_sid_default 2 3492 NULL ++comp_tx_3493 comp_tx 0 3493 NULL ++prepare_3495 prepare 0 3495 NULL ++xfrm_migrate_msgsize_3496 xfrm_migrate_msgsize 0-1 3496 NULL ++iscsi_stat_instance_attr_store_3501 iscsi_stat_instance_attr_store 0 3501 NULL ++sys_size_show_3507 sys_size_show 0 3507 NULL ++ad_sd_buffer_postdisable_3510 ad_sd_buffer_postdisable 0 3510 NULL ++snd_rme9652_ioctl_3514 snd_rme9652_ioctl 0 3514 NULL ++snd_usb_clock_find_source_3516 snd_usb_clock_find_source 0 3516 NULL nohasharray ++iscsi_nacl_auth_store_userid_3516 iscsi_nacl_auth_store_userid 0-3 3516 &snd_usb_clock_find_source_3516 ++target_stat_scsi_tgt_port_show_attr_write_mbytes_3519 target_stat_scsi_tgt_port_show_attr_write_mbytes 0 3519 NULL ++mem_tx_free_mem_blks_read_3521 mem_tx_free_mem_blks_read 3-0 3521 NULL nohasharray ++pcf8523_rtc_read_time_3521 pcf8523_rtc_read_time 0 3521 &mem_tx_free_mem_blks_read_3521 nohasharray ++ieee80211_wx_set_gen_ie_rsl_3521 ieee80211_wx_set_gen_ie_rsl 3 3521 &pcf8523_rtc_read_time_3521 ++m88ts2022_cmd_3523 m88ts2022_cmd 0 3523 NULL ++ati_remote2_setup_3526 ati_remote2_setup 0 3526 NULL ++adp8870_show_3527 adp8870_show 0 3527 NULL ++SyS_semtimedop_3532 SyS_semtimedop 3 3532 NULL ++ath10k_reg_addr_read_3536 ath10k_reg_addr_read 3-0 3536 NULL ++SyS_readv_3539 SyS_readv 3 3539 NULL ++topology_change_detected_show_3540 topology_change_detected_show 0 3540 NULL ++iwl_mvm_rm_sta_3541 iwl_mvm_rm_sta 0 3541 NULL ++latency_timer_show_3543 latency_timer_show 0 3543 NULL nohasharray ++mls_context_cpy_3543 mls_context_cpy 0 3543 &latency_timer_show_3543 nohasharray ++xfs_allocbt_get_maxrecs_3543 xfs_allocbt_get_maxrecs 0 3543 &mls_context_cpy_3543 ++sht15_send_status_3544 sht15_send_status 0 3544 NULL nohasharray ++snd_seq_timer_set_tempo_3544 snd_seq_timer_set_tempo 0 3544 &sht15_send_status_3544 ++nouveau_fuse_create__3546 nouveau_fuse_create_ 4 3546 NULL ++btrfs_dir_name_len_3549 btrfs_dir_name_len 0 3549 NULL nohasharray ++raid_show_level_3549 raid_show_level 0 3549 &btrfs_dir_name_len_3549 ++target_stat_scsi_lu_attr_show_3561 target_stat_scsi_lu_attr_show 0 3561 NULL nohasharray ++b43legacy_read16_3561 b43legacy_read16 0 3561 &target_stat_scsi_lu_attr_show_3561 ++nilfs_dat_translate_3562 nilfs_dat_translate 0 3562 NULL ++ip_queue_xmit_3564 ip_queue_xmit 0 3564 NULL nohasharray ++stv0680_set_video_mode_3564 stv0680_set_video_mode 0 3564 &ip_queue_xmit_3564 nohasharray ++generic_exec_single_3564 generic_exec_single 0 3564 &stv0680_set_video_mode_3564 ++bnx2x_alloc_fp_mem_3565 bnx2x_alloc_fp_mem 0 3565 NULL ++alloc_smp_resp_3566 alloc_smp_resp 1 3566 NULL nohasharray ++cache_type_show_3566 cache_type_show 0 3566 &alloc_smp_resp_3566 ++evtchn_read_3569 evtchn_read 3-0 3569 NULL ++cifs_async_writev_3576 cifs_async_writev 0 3576 NULL ++f2fs_listxattr_3577 f2fs_listxattr 0-3 3577 NULL nohasharray ++mwifiex_cmd_802_11_mac_address_3577 mwifiex_cmd_802_11_mac_address 0 3577 &f2fs_listxattr_3577 ++dormant_show_3581 dormant_show 0 3581 NULL nohasharray ++amd_rng_init_3581 amd_rng_init 0 3581 &dormant_show_3581 ++ll_track_ppid_seq_write_3582 ll_track_ppid_seq_write 3 3582 NULL ++vc_resize_3585 vc_resize 2-3 3585 NULL ++ifalias_show_3586 ifalias_show 0 3586 NULL ++acpi_ut_allocate_owner_id_3588 acpi_ut_allocate_owner_id 0 3588 NULL ++show_temp_auto_temp_max_3593 show_temp_auto_temp_max 0 3593 NULL ++iscsi_tpg_attrib_store_login_timeout_3597 iscsi_tpg_attrib_store_login_timeout 0-3 3597 NULL ++compat_sys_semtimedop_3606 compat_sys_semtimedop 3 3606 NULL nohasharray ++show_down_tail_align_3606 show_down_tail_align 0 3606 &compat_sys_semtimedop_3606 ++sctp_getsockopt_events_3607 sctp_getsockopt_events 2 3607 NULL ++ray_open_3608 ray_open 0 3608 NULL ++edac_mc_alloc_3611 edac_mc_alloc 4 3611 NULL ++po1030_set_red_balance_3614 po1030_set_red_balance 0 3614 NULL ++node_nodeid_write_3616 node_nodeid_write 0-3 3616 NULL ++tx_tx_starts_read_3617 tx_tx_starts_read 3-0 3617 NULL ++show_fcstat_link_failure_count_3618 show_fcstat_link_failure_count 0 3618 NULL ++nilfs_dat_prepare_update_3619 nilfs_dat_prepare_update 0 3619 NULL ++rv3029c2_i2c_read_regs_3621 rv3029c2_i2c_read_regs 0 3621 NULL ++atl1e_setup_ring_resources_3623 atl1e_setup_ring_resources 0 3623 NULL ++bnad_set_mac_address_3625 bnad_set_mac_address 0 3625 NULL ++wpf_s_stream_3626 wpf_s_stream 0 3626 NULL ++aligned_kmalloc_3628 aligned_kmalloc 1 3628 NULL ++udp_v6_get_port_3632 udp_v6_get_port 0 3632 NULL ++fan_get_speed_3635 fan_get_speed 0 3635 NULL ++fm10k_alloc_q_vector_3638 fm10k_alloc_q_vector 6-4 3638 NULL ++store_3640 store 0 3640 NULL ++eem_opts_host_addr_store_3646 eem_opts_host_addr_store 0-3 3646 NULL ++cacheinfo_cpu_callback_3647 cacheinfo_cpu_callback 0 3647 NULL nohasharray ++rocker_port_dma_rings_init_3647 rocker_port_dma_rings_init 0 3647 &cacheinfo_cpu_callback_3647 ++x86_swiotlb_alloc_coherent_3649 x86_swiotlb_alloc_coherent 2 3649 NULL nohasharray ++cm_copy_private_data_3649 cm_copy_private_data 2 3649 &x86_swiotlb_alloc_coherent_3649 ++ath6kl_disconnect_timeout_read_3650 ath6kl_disconnect_timeout_read 3-0 3650 NULL ++ixgb_vlan_rx_add_vid_3651 ixgb_vlan_rx_add_vid 0 3651 NULL ++i915_compat_ioctl_3656 i915_compat_ioctl 2 3656 NULL nohasharray ++videobuf_dma_contig_user_get_3656 videobuf_dma_contig_user_get 0 3656 &i915_compat_ioctl_3656 nohasharray ++alc680_parse_auto_config_3656 alc680_parse_auto_config 0 3656 &videobuf_dma_contig_user_get_3656 ++qib_user_sdma_page_to_frags_3660 qib_user_sdma_page_to_frags 0-6 3660 NULL ++tomoyo_supervisor_3661 tomoyo_supervisor 0 3661 NULL nohasharray ++smsc911x_set_mac_address_3661 smsc911x_set_mac_address 0 3661 &tomoyo_supervisor_3661 ++arcmsr_attr_host_fw_request_len_3662 arcmsr_attr_host_fw_request_len 0 3662 NULL ++cma_alloc_3663 cma_alloc 2-3 3663 NULL ++tcp_fragment_3669 tcp_fragment 3 3669 NULL ++fuse_copy_page_3671 fuse_copy_page 0 3671 NULL ++mcs_setup_transceiver_agilent_3673 mcs_setup_transceiver_agilent 0 3673 NULL ++netxen_alloc_hw_resources_3674 netxen_alloc_hw_resources 0 3674 NULL ++_iwl_dbgfs_tx_flush_write_3675 _iwl_dbgfs_tx_flush_write 3-0 3675 NULL ++rawv6_bind_3679 rawv6_bind 0 3679 NULL ++show_selfballoon_uphys_3680 show_selfballoon_uphys 0 3680 NULL ++pvr2_ioread_start_3682 pvr2_ioread_start 0 3682 NULL nohasharray ++igbvf_change_mtu_3682 igbvf_change_mtu 0 3682 &pvr2_ioread_start_3682 ++spmi_register_write_3684 spmi_register_write 0 3684 NULL ++vmci_qpair_enquev_3688 vmci_qpair_enquev 0-3 3688 NULL ++ax25_listen_register_3689 ax25_listen_register 0 3689 NULL ++ntfs_attr_make_non_resident_3694 ntfs_attr_make_non_resident 0 3694 NULL ++brcmf_fil_cmd_int_set_3696 brcmf_fil_cmd_int_set 0 3696 NULL ++__netdev_adjacent_dev_link_lists_3697 __netdev_adjacent_dev_link_lists 0 3697 NULL ++target_core_show_dev_alias_3699 target_core_show_dev_alias 0 3699 NULL ++videobuf_pages_to_sg_3708 videobuf_pages_to_sg 2 3708 NULL ++sys_getrandom_3710 sys_getrandom 2 3710 NULL ++mlx4_en_config_rss_steer_3713 mlx4_en_config_rss_steer 0 3713 NULL ++i2c_sendbytes_3714 i2c_sendbytes 0 3714 NULL ++msi001_s_ctrl_3716 msi001_s_ctrl 0 3716 NULL ++__cifs_readpage_from_fscache_3718 __cifs_readpage_from_fscache 0 3718 NULL ++do_cancel_3724 do_cancel 0 3724 NULL nohasharray ++ext4_inode_blocks_set_3724 ext4_inode_blocks_set 0 3724 &do_cancel_3724 ++lm3533_als_get_threshold_3725 lm3533_als_get_threshold 0 3725 NULL nohasharray ++v4l2_fh_open_3725 v4l2_fh_open 0 3725 &lm3533_als_get_threshold_3725 nohasharray ++create_single_cap_vol_ctl_3725 create_single_cap_vol_ctl 0 3725 &v4l2_fh_open_3725 ++sm501fb_crtsrc_show_3731 sm501fb_crtsrc_show 0 3731 NULL ++ci_ll_write_3740 ci_ll_write 4-0 3740 NULL ++vlan_filtering_show_3745 vlan_filtering_show 0 3745 NULL ++cp2112_i2c_write_req_3746 cp2112_i2c_write_req 0-4 3746 NULL nohasharray ++show_prot_guard_type_3746 show_prot_guard_type 0 3746 &cp2112_i2c_write_req_3746 ++pegasus_open_3748 pegasus_open 0 3748 NULL ++sysfs_kf_bin_write_3751 sysfs_kf_bin_write 0-4-3 3751 NULL ++show_lwid_3752 show_lwid 0 3752 NULL nohasharray ++si476x_core_cmd_fm_rds_blockcount_3752 si476x_core_cmd_fm_rds_blockcount 0 3752 &show_lwid_3752 ++btrfs_reserve_extent_3754 btrfs_reserve_extent 0 3754 NULL ++show_log_height_3759 show_log_height 0 3759 NULL ++get_port0_handler_3760 get_port0_handler 0 3760 NULL nohasharray ++postenable_3760 postenable 0 3760 &get_port0_handler_3760 ++fuse_do_setattr_3762 fuse_do_setattr 0 3762 NULL ++synaptics_show_disable_gesture_3767 synaptics_show_disable_gesture 0 3767 NULL nohasharray ++start_isolate_page_range_3767 start_isolate_page_range 0 3767 &synaptics_show_disable_gesture_3767 ++temp1_show_3771 temp1_show 0 3771 NULL nohasharray ++sctp_copy_one_addr_3771 sctp_copy_one_addr 0 3771 &temp1_show_3771 ++mvs_show_driver_version_3772 mvs_show_driver_version 0 3772 NULL nohasharray ++koneplus_sysfs_read_profilex_settings_3772 koneplus_sysfs_read_profilex_settings 0-5-6 3772 &mvs_show_driver_version_3772 ++store_enable_clkb0_output_3776 store_enable_clkb0_output 0-4 3776 NULL ++nouveau_sysfs_pstate_set_3777 nouveau_sysfs_pstate_set 0-4 3777 NULL ++apds990x_prox_enable_show_3778 apds990x_prox_enable_show 0 3778 NULL ++udf_adinicb_write_begin_3781 udf_adinicb_write_begin 0 3781 NULL nohasharray ++xip_file_write_3781 xip_file_write 0-3 3781 &udf_adinicb_write_begin_3781 ++set_min_height_3783 set_min_height 0-4 3783 NULL ++msm_otg_mode_write_3788 msm_otg_mode_write 3-0 3788 NULL ++set_voltage_3789 set_voltage 0-4 3789 NULL ++sctp_setsockopt_auth_key_3793 sctp_setsockopt_auth_key 3-0 3793 NULL ++wq_nice_show_3795 wq_nice_show 0 3795 NULL ++__netlink_create_3800 __netlink_create 0 3800 NULL ++show_line3_3802 show_line3 0 3802 NULL ++t1_set_mac_addr_3808 t1_set_mac_addr 0 3808 NULL ++mci_max_location_show_3812 mci_max_location_show 0 3812 NULL ++ncp_file_write_3813 ncp_file_write 3-0 3813 NULL nohasharray ++iscsi_stat_instance_show_attr_min_ver_3813 iscsi_stat_instance_show_attr_min_ver 0 3813 &ncp_file_write_3813 ++nfs4_client_recover_expired_lease_3814 nfs4_client_recover_expired_lease 0 3814 NULL ++manage_start_stop_show_3816 manage_start_stop_show 0 3816 NULL nohasharray ++vpx3220_init_3816 vpx3220_init 0 3816 &manage_start_stop_show_3816 ++wm8350_gpio_direction_in_3818 wm8350_gpio_direction_in 0 3818 NULL nohasharray ++security_inode_removexattr_3818 security_inode_removexattr 0 3818 &wm8350_gpio_direction_in_3818 ++security_vm_enough_memory_mm_3821 security_vm_enough_memory_mm 0 3821 NULL ++show_fnode_tcp_xmit_wsf_3823 show_fnode_tcp_xmit_wsf 0 3823 NULL ++wl1251_hw_init_3825 wl1251_hw_init 0 3825 NULL ++llc_ui_recvmsg_3826 llc_ui_recvmsg 0-4 3826 NULL ++trunc_dealloc_3836 trunc_dealloc 0 3836 NULL ++ceph_do_getattr_3838 ceph_do_getattr 0 3838 NULL nohasharray ++ezusb_access_ltv_3838 ezusb_access_ltv 0 3838 &ceph_do_getattr_3838 ++mtip_hw_show_status_3839 mtip_hw_show_status 0 3839 NULL ++release_version_store_3841 release_version_store 0-4 3841 NULL ++fuse_try_move_page_3842 fuse_try_move_page 0 3842 NULL nohasharray ++stringify_nodemap_3842 stringify_nodemap 2 3842 &fuse_try_move_page_3842 ++max8925_disable_3844 max8925_disable 0 3844 NULL ++vprbrd_i2c_read_3845 vprbrd_i2c_read 0 3845 NULL ++__buf_prepare_3846 __buf_prepare 0 3846 NULL ++ubi_eba_read_leb_3847 ubi_eba_read_leb 0 3847 NULL ++wlcore_boot_parse_fw_ver_3850 wlcore_boot_parse_fw_ver 0 3850 NULL ++create_one_cdev_3852 create_one_cdev 2 3852 NULL ++smk_read_onlycap_3855 smk_read_onlycap 3-0 3855 NULL ++show_session_param_ISCSI_PARAM_TARGET_ALIAS_3856 show_session_param_ISCSI_PARAM_TARGET_ALIAS 0 3856 NULL ++fuse_retrieve_3857 fuse_retrieve 0 3857 NULL ++c67x00_urb_enqueue_3862 c67x00_urb_enqueue 0 3862 NULL ++hfsplus_create_attr_3864 hfsplus_create_attr 0 3864 NULL nohasharray ++video_write_3864 video_write 0 3864 &hfsplus_create_attr_3864 ++get_fd_set_3866 get_fd_set 1 3866 NULL ++show_pci_3867 show_pci 0 3867 NULL ++br_fdb_insert_3869 br_fdb_insert 0 3869 NULL ++i7core_inject_show_channel_3874 i7core_inject_show_channel 0 3874 NULL ++show_ctlr_enabled_state_3877 show_ctlr_enabled_state 0 3877 NULL ++store_thresh_either_en_3880 store_thresh_either_en 0-4 3880 NULL ++validate_store_3881 validate_store 0-3 3881 NULL ++fuse_conn_abort_write_3882 fuse_conn_abort_write 0-3 3882 NULL ++garp_attr_create_3883 garp_attr_create 3 3883 NULL ++uea_send_modem_cmd_3888 uea_send_modem_cmd 3 3888 NULL ++serial8250_set_attr_rx_trig_bytes_3892 serial8250_set_attr_rx_trig_bytes 0-4 3892 NULL ++efivarfs_file_read_3893 efivarfs_file_read 3-0 3893 NULL ++nvram_write_3894 nvram_write 3-0 3894 NULL ++ixgb_setup_rx_resources_3896 ixgb_setup_rx_resources 0 3896 NULL ++pcibios_enable_irq_3897 pcibios_enable_irq 0 3897 NULL ++pipeline_pre_proc_swi_read_3898 pipeline_pre_proc_swi_read 3-0 3898 NULL ++comedi_buf_read_n_available_3899 comedi_buf_read_n_available 0 3899 NULL ++tps65912_clear_bits_3906 tps65912_clear_bits 0 3906 NULL nohasharray ++fcoe_ctlr_destroy_store_3906 fcoe_ctlr_destroy_store 0-3 3906 &tps65912_clear_bits_3906 ++retu_regmap_read_3909 retu_regmap_read 0 3909 NULL ++vcs_write_3910 vcs_write 3-0 3910 NULL nohasharray ++dbg_check_old_index_3910 dbg_check_old_index 0 3910 &vcs_write_3910 ++usbip_recv_3911 usbip_recv 3 3911 NULL ++work_on_cpu_3912 work_on_cpu 0 3912 NULL ++drm_fb_helper_set_par_3913 drm_fb_helper_set_par 0 3913 NULL ++SyS_move_pages_3920 SyS_move_pages 2 3920 NULL ++ds2780_set_sense_register_3927 ds2780_set_sense_register 0 3927 NULL ++iwl_load_ucode_wait_alive_3936 iwl_load_ucode_wait_alive 0 3936 NULL ++show_allow_ext_sg_3938 show_allow_ext_sg 0 3938 NULL ++__vfs_read_3942 __vfs_read 0-3 3942 NULL ++hdlc_irq_one_3944 hdlc_irq_one 2 3944 NULL ++cp_refill_rx_3947 cp_refill_rx 0 3947 NULL ++t4_memory_rw_3948 t4_memory_rw 0 3948 NULL nohasharray ++apei_clear_mce_3948 apei_clear_mce 0 3948 &t4_memory_rw_3948 nohasharray ++ath10k_hif_exchange_bmi_msg_3948 ath10k_hif_exchange_bmi_msg 0 3948 &apei_clear_mce_3948 ++navman_open_3951 navman_open 0 3951 NULL ++memory_block_change_state_3955 memory_block_change_state 0 3955 NULL ++devtype_show_3956 devtype_show 0 3956 NULL nohasharray ++aa_audit_file_3956 aa_audit_file 0-10 3956 &devtype_show_3956 ++nfs_write_begin_3957 nfs_write_begin 0 3957 NULL ++write_port_3962 write_port 0-4 3962 NULL ++bql_show_inflight_3970 bql_show_inflight 0 3970 NULL ++be_vid_config_3976 be_vid_config 0 3976 NULL ++dequeue_hwpoisoned_huge_page_3980 dequeue_hwpoisoned_huge_page 0 3980 NULL ++lp5562_store_engine_mux_3982 lp5562_store_engine_mux 0-4 3982 NULL ++qlcnic_show_beacon_3986 qlcnic_show_beacon 0 3986 NULL nohasharray ++make_free_space_3986 make_free_space 0 3986 &qlcnic_show_beacon_3986 ++mt9t112_reset_3987 mt9t112_reset 0 3987 NULL ++virtfn_add_3988 virtfn_add 0 3988 NULL ++ubifs_run_commit_3989 ubifs_run_commit 0 3989 NULL ++wake_unlock_store_3991 wake_unlock_store 0-4 3991 NULL ++do_add_counters_3992 do_add_counters 3 3992 NULL ++ocfs2_cluster_stack_show_3996 ocfs2_cluster_stack_show 0 3996 NULL ++iwl_mvm_mac_ctxt_cmd_sta_3997 iwl_mvm_mac_ctxt_cmd_sta 0 3997 NULL ++via_rng_init_3998 via_rng_init 0 3998 NULL ++set_inc_all_6db_3999 set_inc_all_6db 4-0 3999 NULL ++gsc_s_ctrl_4002 gsc_s_ctrl 0 4002 NULL ++userspace_status_4004 userspace_status 4-0 4004 NULL nohasharray ++urbs_show_4004 urbs_show 0 4004 &userspace_status_4004 ++mei_write_4005 mei_write 3-0 4005 NULL nohasharray ++xfs_check_block_4005 xfs_check_block 4 4005 &mei_write_4005 nohasharray ++niu_zcp_write_4005 niu_zcp_write 0 4005 &xfs_check_block_4005 ++show_xps_map_4009 show_xps_map 0 4009 NULL ++snd_hdsp_capture_copy_4011 snd_hdsp_capture_copy 5 4011 NULL ++bcm_rx_setup_4014 bcm_rx_setup 0 4014 NULL ++wakeup_active_count_show_4016 wakeup_active_count_show 0 4016 NULL ++_request_firmware_4021 _request_firmware 0 4021 NULL ++blk_end_request_4024 blk_end_request 3 4024 NULL nohasharray ++ipoib_open_4024 ipoib_open 0 4024 &blk_end_request_4024 ++ext4_xattr_find_entry_4025 ext4_xattr_find_entry 0 4025 NULL nohasharray ++ndelay_store_4025 ndelay_store 0-3 4025 &ext4_xattr_find_entry_4025 ++amd_ec_write_4027 amd_ec_write 0 4027 NULL ++ql3xxx_set_mac_address_4033 ql3xxx_set_mac_address 0 4033 NULL ++usbnet_write_cmd_async_4035 usbnet_write_cmd_async 7 4035 NULL nohasharray ++b1_get_word_4035 b1_get_word 0 4035 &usbnet_write_cmd_async_4035 ++xfs_free_ag_extent_4036 xfs_free_ag_extent 0 4036 NULL ++mtip_hw_read_registers_4037 mtip_hw_read_registers 3-0 4037 NULL ++store_tabletCoordinateMode_4043 store_tabletCoordinateMode 0-4 4043 NULL ++oprofile_set_ulong_4046 oprofile_set_ulong 0 4046 NULL ++iscsi_nacl_param_show_MaxOutstandingR2T_4050 iscsi_nacl_param_show_MaxOutstandingR2T 0 4050 NULL ++i915_gpu_idle_4062 i915_gpu_idle 0 4062 NULL ++show_fc_host_dev_loss_tmo_4065 show_fc_host_dev_loss_tmo 0 4065 NULL nohasharray ++get_dmabuf_4065 get_dmabuf 2 4065 &show_fc_host_dev_loss_tmo_4065 ++coreid_show_4066 coreid_show 0 4066 NULL ++fbcon_fb_unbind_4068 fbcon_fb_unbind 0 4068 NULL ++cardr_show_4070 cardr_show 0 4070 NULL ++video_get_max_state_4073 video_get_max_state 0 4073 NULL nohasharray ++nr_hugepages_mempolicy_show_4073 nr_hugepages_mempolicy_show 0 4073 &video_get_max_state_4073 ++__cfg80211_alloc_event_skb_4075 __cfg80211_alloc_event_skb 5 4075 NULL ++show_engine1_leds_4078 show_engine1_leds 0 4078 NULL nohasharray ++sctp_make_asconf_4078 sctp_make_asconf 3 4078 &show_engine1_leds_4078 ++fbcon_do_set_font_4079 fbcon_do_set_font 2-3 4079 NULL ++__logfs_segment_write_4080 __logfs_segment_write 0 4080 NULL ++_ctl_diag_trigger_mpi_show_4082 _ctl_diag_trigger_mpi_show 0 4082 NULL ++vxlan_open_4083 vxlan_open 0 4083 NULL nohasharray ++try_online_node_4083 try_online_node 0 4083 &vxlan_open_4083 ++snd_korg1212_prepare_4088 snd_korg1212_prepare 0 4088 NULL ++da9052_free_irq_4090 da9052_free_irq 2 4090 NULL ++tcmu_set_configfs_dev_params_4091 tcmu_set_configfs_dev_params 0-3 4091 NULL ++dccp_v4_init_sock_4096 dccp_v4_init_sock 0 4096 NULL nohasharray ++__dwc3_gadget_ep0_queue_4096 __dwc3_gadget_ep0_queue 0 4096 &dccp_v4_init_sock_4096 ++show_4097 show 0 4097 NULL ++flash_show_4102 flash_show 0 4102 NULL ++ath10k_bmi_lz_stream_start_4103 ath10k_bmi_lz_stream_start 0 4103 NULL ++eeprom_read_4104 eeprom_read 6-5-0 4104 NULL ++irq_gc_suspend_4106 irq_gc_suspend 0 4106 NULL nohasharray ++serial_suspend_4106 serial_suspend 0 4106 &irq_gc_suspend_4106 ++write_reg_4108 write_reg 0 4108 NULL ++phy_has_fixups_show_4110 phy_has_fixups_show 0 4110 NULL nohasharray ++eventfd_read_4110 eventfd_read 0-3 4110 &phy_has_fixups_show_4110 ++configfs_setattr_4111 configfs_setattr 0 4111 NULL nohasharray ++bonding_store_num_peer_notif_4111 bonding_store_num_peer_notif 0-4 4111 &configfs_setattr_4111 ++mt9t112_init_pll_4112 mt9t112_init_pll 0 4112 NULL ++ocfs2_xattr_tree_list_index_block_4119 ocfs2_xattr_tree_list_index_block 0 4119 NULL ++__xen_write_cr3_4124 __xen_write_cr3 2 4124 NULL ++proc_task_getattr_4125 proc_task_getattr 0 4125 NULL ++set_device_state_4127 set_device_state 0-2 4127 NULL ++v9fs_vfs_readpage_4131 v9fs_vfs_readpage 0 4131 NULL ++show_fnode_fragment_disable_4133 show_fnode_fragment_disable 0 4133 NULL ++nf_call_iptables_show_4143 nf_call_iptables_show 0 4143 NULL nohasharray ++ath10k_htt_send_rx_ring_cfg_ll_4143 ath10k_htt_send_rx_ring_cfg_ll 0 4143 &nf_call_iptables_show_4143 ++mon_text_read_u_4147 mon_text_read_u 0-3 4147 NULL nohasharray ++ntb_netdev_change_mtu_4147 ntb_netdev_change_mtu 0-2 4147 &mon_text_read_u_4147 ++tm6000_read_4151 tm6000_read 3-0 4151 NULL nohasharray ++show_temp_auto_boost_hyst_4151 show_temp_auto_boost_hyst 0 4151 &tm6000_read_4151 ++acpi_bus_get_device_4153 acpi_bus_get_device 0 4153 NULL nohasharray ++rndis_filter_open_4153 rndis_filter_open 0 4153 &acpi_bus_get_device_4153 ++mpt_raid_phys_disk_get_num_paths_4155 mpt_raid_phys_disk_get_num_paths 0 4155 NULL ++show_sf2_pwm_4161 show_sf2_pwm 0 4161 NULL ++echo_show_4163 echo_show 0 4163 NULL nohasharray ++t1_init_hw_modules_4163 t1_init_hw_modules 0 4163 &echo_show_4163 nohasharray ++store_4163 store 0 4163 &t1_init_hw_modules_4163 ++radeon_show_one_edid_4164 radeon_show_one_edid 3-0 4164 NULL nohasharray ++bus_powerup_4164 bus_powerup 0 4164 &radeon_show_one_edid_4164 ++get_alua_req_4166 get_alua_req 3 4166 NULL ++blk_dropped_read_4168 blk_dropped_read 3 4168 NULL ++mci_size_mb_show_4171 mci_size_mb_show 0 4171 NULL ++manufacturer_show_4172 manufacturer_show 0 4172 NULL ++show_4173 show 0 4173 NULL ++read_file_bool_4180 read_file_bool 3-0 4180 NULL nohasharray ++elants_i2c_calibrate_4180 elants_i2c_calibrate 0 4180 &read_file_bool_4180 ++ov6650_reg_write_4182 ov6650_reg_write 0 4182 NULL ++bond_option_active_slave_set_4183 bond_option_active_slave_set 0 4183 NULL ++cpumap_print_to_pagebuf_4190 cpumap_print_to_pagebuf 0 4190 NULL ++blk_mq_hw_sysfs_store_4193 blk_mq_hw_sysfs_store 0-4 4193 NULL ++jme_set_macaddr_4196 jme_set_macaddr 0 4196 NULL ++__nfs4_get_acl_uncached_4197 __nfs4_get_acl_uncached 0 4197 NULL ++vring_new_virtqueue_4199 vring_new_virtqueue 2 4199 NULL ++target_core_store_dev_udev_path_4200 target_core_store_dev_udev_path 0-3 4200 NULL ++f1x_determine_channel_4202 f1x_determine_channel 2 4202 NULL ++_osd_req_list_objects_4204 _osd_req_list_objects 6 4204 NULL ++v9fs_write_end_4207 v9fs_write_end 0-5 4207 NULL ++follow_managed_4219 follow_managed 0 4219 NULL ++persist_store_4220 persist_store 0-4 4220 NULL ++rtnetlink_event_4221 rtnetlink_event 0 4221 NULL ++show_session_param_ISCSI_PARAM_DISCOVERY_PARENT_IDX_4222 show_session_param_ISCSI_PARAM_DISCOVERY_PARENT_IDX 0 4222 NULL ++ip_send_unicast_reply_4223 ip_send_unicast_reply 7 4223 NULL ++l2tp_eth_dev_init_4225 l2tp_eth_dev_init 0 4225 NULL ++vsock_auto_bind_4229 vsock_auto_bind 0 4229 NULL nohasharray ++bdc_udc_start_4229 bdc_udc_start 0 4229 &vsock_auto_bind_4229 ++bch_hprint_4233 bch_hprint 0 4233 NULL nohasharray ++gpio_trig_gpio_store_4233 gpio_trig_gpio_store 0-4 4233 &bch_hprint_4233 ++show_fnode_max_segment_size_4234 show_fnode_max_segment_size 0 4234 NULL ++snd_seq_ioctl_query_next_port_4238 snd_seq_ioctl_query_next_port 0 4238 NULL ++input_dev_show_cap_abs_4239 input_dev_show_cap_abs 0 4239 NULL ++team_port_enable_netpoll_4243 team_port_enable_netpoll 0 4243 NULL ++gp2ap020a00f_buffer_predisable_4246 gp2ap020a00f_buffer_predisable 0 4246 NULL ++pm_qos_remote_wakeup_store_4248 pm_qos_remote_wakeup_store 0-4 4248 NULL ++timewarn_cs_read_4250 timewarn_cs_read 0 4250 NULL ++iwlagn_send_rxon_assoc_4252 iwlagn_send_rxon_assoc 0 4252 NULL ++mwifiex_sta_prepare_cmd_4253 mwifiex_sta_prepare_cmd 0 4253 NULL ++alg_create_4257 alg_create 0 4257 NULL ++show_iface_strict_login_comp_en_4260 show_iface_strict_login_comp_en 0 4260 NULL nohasharray ++__dev_pm_qos_add_request_4260 __dev_pm_qos_add_request 0 4260 &show_iface_strict_login_comp_en_4260 ++tda7432_s_ctrl_4261 tda7432_s_ctrl 0 4261 NULL nohasharray ++base_clock_show_4261 base_clock_show 0 4261 &tda7432_s_ctrl_4261 ++__block_write_full_page_4267 __block_write_full_page 0 4267 NULL ++ip_vs_in_icmp_v6_4268 ip_vs_in_icmp_v6 0 4268 NULL ++crc32c_intel_finup_4272 crc32c_intel_finup 0 4272 NULL nohasharray ++tg3_init_5401phy_dsp_4272 tg3_init_5401phy_dsp 0 4272 &crc32c_intel_finup_4272 ++nilfs_segctor_apply_buffers_4273 nilfs_segctor_apply_buffers 0 4273 NULL nohasharray ++snd_pcm_oss_change_params_4273 snd_pcm_oss_change_params 0 4273 &nilfs_segctor_apply_buffers_4273 ++show_sg_tablesize_4278 show_sg_tablesize 0 4278 NULL ++pwm_lpss_config_4281 pwm_lpss_config 0 4281 NULL ++ath6kl_force_roam_write_4282 ath6kl_force_roam_write 3-0 4282 NULL ++show_sas_device_type_4283 show_sas_device_type 0 4283 NULL ++goldfish_audio_write_4284 goldfish_audio_write 3 4284 NULL ++msb_do_write_request_4286 msb_do_write_request 2 4286 NULL ++xt_compat_add_offset_4289 xt_compat_add_offset 0 4289 NULL nohasharray ++cp_change_mtu_4289 cp_change_mtu 0 4289 &xt_compat_add_offset_4289 ++get_connectors_for_crtc_4291 get_connectors_for_crtc 0 4291 NULL nohasharray ++lpfc_stat_data_ctrl_store_4291 lpfc_stat_data_ctrl_store 0-4 4291 &get_connectors_for_crtc_4291 ++vmci_event_dispatch_4294 vmci_event_dispatch 0 4294 NULL ++v4l2_subdev_s_ctrl_4295 v4l2_subdev_s_ctrl 0 4295 NULL ++ali15x3_access_4296 ali15x3_access 0 4296 NULL ++iwl_trans_pcie_start_fw_4297 iwl_trans_pcie_start_fw 0 4297 NULL ++__usbnet_read_cmd_4299 __usbnet_read_cmd 0-7 4299 NULL ++fw_read_file_contents_4301 fw_read_file_contents 0 4301 NULL ++dvb_ringbuffer_pkt_read_user_4303 dvb_ringbuffer_pkt_read_user 3-2-5-0 4303 NULL nohasharray ++camera_store_4303 camera_store 4-0 4303 &dvb_ringbuffer_pkt_read_user_4303 ++atl2_open_4307 atl2_open 0 4307 NULL nohasharray ++i915_gem_object_pin_4307 i915_gem_object_pin 0 4307 &atl2_open_4307 ++snd_aw2_pcm_trigger_capture_4314 snd_aw2_pcm_trigger_capture 0 4314 NULL ++cfg80211_inform_bss_4315 cfg80211_inform_bss 9 4315 NULL nohasharray ++count_strings_4315 count_strings 0 4315 &cfg80211_inform_bss_4315 ++pscsi_create_type_disk_4317 pscsi_create_type_disk 0 4317 NULL nohasharray ++cpufv_disabled_store_4317 cpufv_disabled_store 0-4 4317 &pscsi_create_type_disk_4317 ++ali1563_transaction_4319 ali1563_transaction 0 4319 NULL nohasharray ++amd8111e_restart_4319 amd8111e_restart 0 4319 &ali1563_transaction_4319 ++nouveau_fifo_create__4327 nouveau_fifo_create_ 5-6 4327 NULL nohasharray ++qlcnic_get_nic_info_4327 qlcnic_get_nic_info 0 4327 &nouveau_fifo_create__4327 ++snd_rawmidi_kernel_read_4328 snd_rawmidi_kernel_read 3 4328 NULL ++mlx4_qp_modify_4333 mlx4_qp_modify 0 4333 NULL ++iscsi_disc_store_userid_4337 iscsi_disc_store_userid 0-3 4337 NULL ++ima_eventdigest_init_common_4338 ima_eventdigest_init_common 2 4338 NULL ++show_tcrit1_4350 show_tcrit1 0 4350 NULL ++netdev_vlan_rx_add_vid_4353 netdev_vlan_rx_add_vid 0 4353 NULL ++store_4354 store 0-3 4354 NULL ++snd_seq_ioctl_create_queue_4355 snd_seq_ioctl_create_queue 0 4355 NULL ++ext3_write_inode_4359 ext3_write_inode 0 4359 NULL ++__gfs2_readpage_4363 __gfs2_readpage 0 4363 NULL ++ieee80211_change_mtu_4365 ieee80211_change_mtu 0 4365 NULL ++mc13783_powermisc_rmw_4368 mc13783_powermisc_rmw 0 4368 NULL ++xfs_attr3_leaf_clearflag_4371 xfs_attr3_leaf_clearflag 0 4371 NULL ++store_sas_hard_reset_4372 store_sas_hard_reset 0-4 4372 NULL ++sys_setdomainname_4373 sys_setdomainname 2 4373 NULL ++write_4374 write 0 4374 NULL ++esb_write_4376 esb_write 0-3 4376 NULL ++sd_start_12a_4378 sd_start_12a 0 4378 NULL nohasharray ++iscsi_stat_logout_attr_store_4378 iscsi_stat_logout_attr_store 0 4378 &sd_start_12a_4378 ++vcc_connect_4382 vcc_connect 0 4382 NULL ++uevent_seqnum_show_4383 uevent_seqnum_show 0 4383 NULL ++pci_eg20t_init_4385 pci_eg20t_init 0 4385 NULL ++irda_sendmsg_4388 irda_sendmsg 4-0 4388 NULL ++lp3943_gpio_set_mode_4393 lp3943_gpio_set_mode 0 4393 NULL ++ovl_listxattr_4399 ovl_listxattr 0-3 4399 NULL ++get_pwm1_enable_4401 get_pwm1_enable 0 4401 NULL nohasharray ++ipath_init_chip_4401 ipath_init_chip 0 4401 &get_pwm1_enable_4401 ++reg_read_4409 reg_read 0 4409 NULL ++access_process_vm_4412 access_process_vm 0 4412 NULL nohasharray ++cxacru_cm_get_array_4412 cxacru_cm_get_array 4 4412 &access_process_vm_4412 ++can_send_4414 can_send 0 4414 NULL ++libfc_vport_create_4415 libfc_vport_create 2 4415 NULL ++wusbhc_chid_set_4420 wusbhc_chid_set 0 4420 NULL ++rtw_android_get_rssi_4421 rtw_android_get_rssi 0 4421 NULL ++show_fan_stop_output_4422 show_fan_stop_output 0 4422 NULL ++read_pwr_cal_values_4423 read_pwr_cal_values 0 4423 NULL ++mptscsih_io_delay_show_4424 mptscsih_io_delay_show 0 4424 NULL ++xfs_log_show_4426 xfs_log_show 0 4426 NULL ++read_code_4429 read_code 4 4429 NULL ++ath10k_htc_start_4430 ath10k_htc_start 0 4430 NULL ++b43_nphy_op_init_4431 b43_nphy_op_init 0 4431 NULL ++max8998_rtc_start_alarm_4434 max8998_rtc_start_alarm 0 4434 NULL ++snd_hdsp_ioctl_4435 snd_hdsp_ioctl 0 4435 NULL ++pcan_usb_set_silent_4436 pcan_usb_set_silent 0 4436 NULL ++do_pages_stat_4437 do_pages_stat 2 4437 NULL ++srpt_tpg_attrib_show_srp_max_rdma_size_4438 srpt_tpg_attrib_show_srp_max_rdma_size 0 4438 NULL ++vxp_resume_4442 vxp_resume 0 4442 NULL ++memparse_4444 memparse 0 4444 NULL nohasharray ++netdev_register_kobject_4444 netdev_register_kobject 0 4444 &memparse_4444 ++vxge_hw_vpath_fw_api_4452 vxge_hw_vpath_fw_api 0 4452 NULL ++disksize_show_4454 disksize_show 0 4454 NULL ++set_eeprom4_4457 set_eeprom4 4-0 4457 NULL ++dn_alloc_send_pskb_4465 dn_alloc_send_pskb 2 4465 NULL ++ext3_journalled_writepage_4470 ext3_journalled_writepage 0 4470 NULL ++at76_set_card_command_4471 at76_set_card_command 4 4471 NULL ++zd_rf_init_rf2959_4476 zd_rf_init_rf2959 0 4476 NULL ++sock_create_kern_4480 sock_create_kern 0 4480 NULL ++snd_seq_expand_var_event_4481 snd_seq_expand_var_event 0-5 4481 NULL nohasharray ++signalfd_dequeue_4481 signalfd_dequeue 0 4481 &snd_seq_expand_var_event_4481 ++beep_write_4485 beep_write 0 4485 NULL ++sys_semtimedop_4486 sys_semtimedop 3 4486 NULL ++show_fcstat_prim_seq_protocol_err_count_4487 show_fcstat_prim_seq_protocol_err_count 0 4487 NULL ++udp_sendmsg_4492 udp_sendmsg 0-4 4492 NULL ++vmbus_establish_gpadl_4495 vmbus_establish_gpadl 3 4495 NULL ++ltc4222_get_value_4496 ltc4222_get_value 0 4496 NULL nohasharray ++bus_scan_store_4496 bus_scan_store 0-3 4496 <c4222_get_value_4496 ++_ctl_diag_trigger_mpi_store_4500 _ctl_diag_trigger_mpi_store 0-4 4500 NULL ++o2nm_node_ipv4_address_read_4501 o2nm_node_ipv4_address_read 0 4501 NULL ++set_link_security_4502 set_link_security 4 4502 NULL ++node_read_vmstat_4505 node_read_vmstat 0 4505 NULL ++l1oip_socket_parse_4507 l1oip_socket_parse 4 4507 NULL ++start_usb_capture_4519 start_usb_capture 0 4519 NULL ++acpi_ex_convert_to_integer_4521 acpi_ex_convert_to_integer 0 4521 NULL nohasharray ++afs_fill_page_4521 afs_fill_page 0 4521 &acpi_ex_convert_to_integer_4521 ++write_cnodes_4523 write_cnodes 0 4523 NULL ++xfs_btree_kill_root_4526 xfs_btree_kill_root 0 4526 NULL ++show_modes_4530 show_modes 0 4530 NULL ++ll_max_readahead_per_file_mb_seq_write_4531 ll_max_readahead_per_file_mb_seq_write 3 4531 NULL ++sys_llistxattr_4532 sys_llistxattr 3 4532 NULL ++da9052_group_write_4534 da9052_group_write 0 4534 NULL ++tipc_getname_4539 tipc_getname 0 4539 NULL ++d3cold_allowed_store_4541 d3cold_allowed_store 0-4 4541 NULL ++store_mode_4544 store_mode 0-4 4544 NULL nohasharray ++tty_register_device_4544 tty_register_device 2 4544 &store_mode_4544 ++videobuf_vmalloc_to_sg_4548 videobuf_vmalloc_to_sg 2 4548 NULL ++generic_packet_4551 generic_packet 0 4551 NULL nohasharray ++store_risetime_4551 store_risetime 0-4 4551 &generic_packet_4551 ++show_sched4_4552 show_sched4 0 4552 NULL ++aoedisk_show_state_4553 aoedisk_show_state 0 4553 NULL ++rxrpc_bind_4554 rxrpc_bind 0 4554 NULL ++fsl_edma_prep_slave_sg_4555 fsl_edma_prep_slave_sg 3 4555 NULL ++show_fc_private_host_tgtid_bind_type_4556 show_fc_private_host_tgtid_bind_type 0 4556 NULL ++max_sectors_store_4559 max_sectors_store 0-4 4559 NULL ++show_speed_tolerance_4560 show_speed_tolerance 0 4560 NULL ++rx8581_get_datetime_4561 rx8581_get_datetime 0 4561 NULL ++ubifs_add_dirt_4567 ubifs_add_dirt 0 4567 NULL ++xgmac_set_mac_address_4571 xgmac_set_mac_address 0 4571 NULL ++btrfs_file_extent_inline_item_len_4575 btrfs_file_extent_inline_item_len 0 4575 NULL ++wl18xx_top_reg_write_4577 wl18xx_top_reg_write 0 4577 NULL ++xfs_buf_get_maps_4581 xfs_buf_get_maps 2 4581 NULL ++commit_orphans_4584 commit_orphans 0 4584 NULL ++aty128fb_set_par_4587 aty128fb_set_par 0 4587 NULL ++read_rio_4589 read_rio 0-3 4589 NULL ++acpi_read_fast_4590 acpi_read_fast 3-2 4590 NULL nohasharray ++alt_capture_pcm_prepare_4590 alt_capture_pcm_prepare 0 4590 &acpi_read_fast_4590 ++multipath_add_disk_4591 multipath_add_disk 0 4591 NULL ++bch_alloc_4593 bch_alloc 1 4593 NULL ++ocfs2_refcount_lock_4595 ocfs2_refcount_lock 0 4595 NULL ++generic_removexattr_4597 generic_removexattr 0 4597 NULL ++fuse_copy_one_4602 fuse_copy_one 0 4602 NULL ++pm8001_ctl_iop_log_show_4614 pm8001_ctl_iop_log_show 0 4614 NULL nohasharray ++device_store_int_4614 device_store_int 0-4 4614 &pm8001_ctl_iop_log_show_4614 ++xfs_bmap_add_attrfork_4617 xfs_bmap_add_attrfork 0 4617 NULL ++show_designated_bridge_4619 show_designated_bridge 0 4619 NULL nohasharray ++bdc_gadget_ep_enable_4619 bdc_gadget_ep_enable 0 4619 &show_designated_bridge_4619 ++rp5c01_read_time_4626 rp5c01_read_time 0 4626 NULL ++bpq_device_event_4633 bpq_device_event 0 4633 NULL nohasharray ++ll_rw_extents_stats_seq_write_4633 ll_rw_extents_stats_seq_write 3 4633 &bpq_device_event_4633 ++iwl_dbgfs_tx_queue_read_4635 iwl_dbgfs_tx_queue_read 3-0 4635 NULL nohasharray ++show_valid_zones_4635 show_valid_zones 0 4635 &iwl_dbgfs_tx_queue_read_4635 ++hrz_send_4638 hrz_send 0 4638 NULL ++wlcore_boot_upload_nvs_4639 wlcore_boot_upload_nvs 0 4639 NULL ++nilfs_segments_README_show_4646 nilfs_segments_README_show 0 4646 NULL ++txCommit_4649 txCommit 0 4649 NULL ++pch_phub_gbe_serial_rom_conf_4650 pch_phub_gbe_serial_rom_conf 0 4650 NULL ++f2fs_xattr_generic_set_4651 f2fs_xattr_generic_set 0 4651 NULL ++show_conn_param_ISCSI_PARAM_OFMARKER_EN_4661 show_conn_param_ISCSI_PARAM_OFMARKER_EN 0 4661 NULL ++eeprom_93xx46_eral_4666 eeprom_93xx46_eral 0 4666 NULL ++ttm_pool_store_4671 ttm_pool_store 0-4 4671 NULL ++test_power_get_usb_property_4680 test_power_get_usb_property 0 4680 NULL ++niu_get_eeprom_len_4681 niu_get_eeprom_len 0 4681 NULL ++skb_add_data_nocache_4682 skb_add_data_nocache 4-0 4682 NULL nohasharray ++show_event_log_4682 show_event_log 0 4682 &skb_add_data_nocache_4682 ++cx18_read_pos_4683 cx18_read_pos 3-0 4683 NULL nohasharray ++cvt_auto_temp_4683 cvt_auto_temp 0 4683 &cx18_read_pos_4683 ++__uncore_counter_show_4686 __uncore_counter_show 0 4686 NULL ++short_retry_limit_read_4687 short_retry_limit_read 3-0 4687 NULL ++cifs_sync_read_4688 cifs_sync_read 0 4688 NULL nohasharray ++register_queue_kobjects_4688 register_queue_kobjects 0 4688 &cifs_sync_read_4688 ++kone_receive_4690 kone_receive 0-4 4690 NULL ++soc_mbus_bytes_per_line_4691 soc_mbus_bytes_per_line 0-1 4691 NULL ++integrity_generate_show_4696 integrity_generate_show 0 4696 NULL ++uhid_dev_get_report_reply_4697 uhid_dev_get_report_reply 0 4697 NULL ++iscsi_tpg_auth_show_password_4698 iscsi_tpg_auth_show_password 0 4698 NULL ++round_pipe_size_4701 round_pipe_size 0 4701 NULL nohasharray ++gen8_get_total_gtt_size_4701 gen8_get_total_gtt_size 0-1 4701 &round_pipe_size_4701 nohasharray ++write8_reg_4701 write8_reg 4-0 4701 &gen8_get_total_gtt_size_4701 nohasharray ++tcs3414_buffer_preenable_4701 tcs3414_buffer_preenable 0 4701 &write8_reg_4701 ++hash_netportnet6_expire_4702 hash_netportnet6_expire 4 4702 NULL ++qla2x00_phy_version_show_4706 qla2x00_phy_version_show 0 4706 NULL ++cxgbi_alloc_big_mem_4707 cxgbi_alloc_big_mem 1 4707 NULL ++toshiba_haps_protection_level_4711 toshiba_haps_protection_level 0 4711 NULL ++roccat_common2_sysfs_read_tcu_image_4719 roccat_common2_sysfs_read_tcu_image 0-5-6 4719 NULL ++btrfs_setattr_4721 btrfs_setattr 0 4721 NULL ++ati_create_gatt_pages_4722 ati_create_gatt_pages 1 4722 NULL nohasharray ++show_header_4722 show_header 3 4722 &ati_create_gatt_pages_4722 ++fw_lookup_and_allocate_buf_4723 fw_lookup_and_allocate_buf 0 4723 NULL nohasharray ++cas_change_mtu_4723 cas_change_mtu 0 4723 &fw_lookup_and_allocate_buf_4723 ++path_show_4725 path_show 0 4725 NULL nohasharray ++bl_power_show_4725 bl_power_show 0 4725 &path_show_4725 ++t4_link_start_4726 t4_link_start 0 4726 NULL nohasharray ++fallback_migrate_page_4726 fallback_migrate_page 0 4726 &t4_link_start_4726 ++ims_pcu_verify_block_4733 ims_pcu_verify_block 0 4733 NULL ++ll_rw_offset_stats_seq_write_4736 ll_rw_offset_stats_seq_write 3 4736 NULL ++scsi_level_show_4738 scsi_level_show 0 4738 NULL ++level_show_4741 level_show 0 4741 NULL ++rds_ib_get_mr_4742 rds_ib_get_mr 2 4742 NULL ++acpi_os_signal_4745 acpi_os_signal 0 4745 NULL ++twl6030_pwmled_enable_4747 twl6030_pwmled_enable 0 4747 NULL ++st_gyro_buffer_preenable_4749 st_gyro_buffer_preenable 0 4749 NULL ++_vivid_fb_check_var_4753 _vivid_fb_check_var 0 4753 NULL nohasharray ++lu_buf_alloc_4753 lu_buf_alloc 2 4753 &_vivid_fb_check_var_4753 ++qla4xxx_get_firmware_status_4759 qla4xxx_get_firmware_status 0 4759 NULL ++qla2x00_optrom_fw_version_show_4760 qla2x00_optrom_fw_version_show 0 4760 NULL nohasharray ++_alloc_get_attr_list_4760 _alloc_get_attr_list 0 4760 &qla2x00_optrom_fw_version_show_4760 ++wakeup_active_show_4767 wakeup_active_show 0 4767 NULL ++qib_map_page_4768 qib_map_page 3 4768 NULL ++shm16write__write_file_4771 shm16write__write_file 0 4771 NULL ++__orinoco_hw_setup_enc_4772 __orinoco_hw_setup_enc 0 4772 NULL ++pwr_rcvd_bcns_cnt_read_4774 pwr_rcvd_bcns_cnt_read 3-0 4774 NULL ++kobj_pkt_store_4775 kobj_pkt_store 0-4 4775 NULL ++tlan_get_eeprom_len_4776 tlan_get_eeprom_len 0 4776 NULL ++get_srcimp_4779 get_srcimp 0 4779 NULL nohasharray ++cifs_read_allocate_pages_4779 cifs_read_allocate_pages 0 4779 &get_srcimp_4779 ++ip6_ufo_append_data_4780 ip6_ufo_append_data 7-6-5 4780 NULL ++uwb_drp_avail_reserve_pending_4786 uwb_drp_avail_reserve_pending 0 4786 NULL ++create_subvol_4791 create_subvol 4 4791 NULL ++w1_master_attribute_store_max_slave_count_4792 w1_master_attribute_store_max_slave_count 0-4 4792 NULL ++read_4793 read 0-4 4793 NULL ++sisusb_read_memio_byte_4794 sisusb_read_memio_byte 0 4794 NULL ++opl3_load_patch_4802 opl3_load_patch 0 4802 NULL ++set_sync_endpoint_4803 set_sync_endpoint 0 4803 NULL nohasharray ++au8522_s_ctrl_4803 au8522_s_ctrl 0 4803 &set_sync_endpoint_4803 ++ncp__vol2io_4804 ncp__vol2io 5-0 4804 NULL ++fan_set_level_4805 fan_set_level 0 4805 NULL ++C_SYSC_setsockopt_4806 C_SYSC_setsockopt 5 4806 NULL ++add_new_kprobe_4808 add_new_kprobe 0 4808 NULL ++vt8623fb_set_par_4814 vt8623fb_set_par 0 4814 NULL ++show_sticky_4816 show_sticky 0 4816 NULL ++show_postcode_4819 show_postcode 0 4819 NULL ++part_fail_store_4820 part_fail_store 0-4 4820 NULL ++ubifs_log_post_commit_4824 ubifs_log_post_commit 0 4824 NULL ++esd_usb2_start_4827 esd_usb2_start 0 4827 NULL ++show_4831 show 0 4831 NULL ++show_brightness_changed_4834 show_brightness_changed 0 4834 NULL nohasharray ++acpi_ps_create_op_4834 acpi_ps_create_op 0 4834 &show_brightness_changed_4834 ++__zswap_cpu_notifier_4837 __zswap_cpu_notifier 0 4837 NULL ++cfq_slice_async_rq_show_4838 cfq_slice_async_rq_show 0 4838 NULL ++scsi_end_request_4839 scsi_end_request 3-4 4839 NULL ++iscsit_ta_authentication_4846 iscsit_ta_authentication 0 4846 NULL nohasharray ++adis16480_enable_irq_4846 adis16480_enable_irq 0 4846 &iscsit_ta_authentication_4846 ++iptunnel_pull_header_4847 iptunnel_pull_header 2 4847 NULL ++show_sas_phy_sas_address_4856 show_sas_phy_sas_address 0 4856 NULL nohasharray ++target_core_dev_pr_attr_store_4856 target_core_dev_pr_attr_store 0-4 4856 &show_sas_phy_sas_address_4856 ++roccat_common2_sysfs_read_tcu_4857 roccat_common2_sysfs_read_tcu 0-5-6 4857 NULL ++gigaset_if_receive_4861 gigaset_if_receive 3 4861 NULL ++key_tx_spec_read_4862 key_tx_spec_read 3-0 4862 NULL ++sco_sock_bind_4864 sco_sock_bind 0 4864 NULL ++ncp_read_bounce_4867 ncp_read_bounce 0 4867 NULL ++svc_getname_4869 svc_getname 0 4869 NULL ++__pm_runtime_suspend_4870 __pm_runtime_suspend 0 4870 NULL ++hid_register_field_4874 hid_register_field 3-2 4874 NULL ++tg3_phy_reset_4876 tg3_phy_reset 0 4876 NULL ++n_tracesink_read_4878 n_tracesink_read 0 4878 NULL ++mic_smpt_to_pa_4881 mic_smpt_to_pa 0-2 4881 NULL ++m2p_add_override_4882 m2p_add_override 1 4882 NULL ++wl1271_set_ba_policies_4883 wl1271_set_ba_policies 0 4883 NULL ++vmxnet3_activate_dev_4885 vmxnet3_activate_dev 0 4885 NULL ++vga_arb_read_4886 vga_arb_read 3-0 4886 NULL nohasharray ++ip6_pkt_drop_4886 ip6_pkt_drop 0 4886 &vga_arb_read_4886 ++current_speed_show_4887 current_speed_show 0 4887 NULL ++sys_ipc_4889 sys_ipc 3 4889 NULL ++isdn_divert_write_4891 isdn_divert_write 0-3 4891 NULL ++s2io_ethtool_get_regs_len_4901 s2io_ethtool_get_regs_len 0 4901 NULL ++shadow_fetch_4907 shadow_fetch 2 4907 NULL ++nilfs_segbuf_reset_4912 nilfs_segbuf_reset 0 4912 NULL ++smsc911x_ethtool_getregslen_4913 smsc911x_ethtool_getregslen 0 4913 NULL nohasharray ++qlcnic_82xx_alloc_mbx_args_4913 qlcnic_82xx_alloc_mbx_args 0 4913 &smsc911x_ethtool_getregslen_4913 ++sw_activity_store_4914 sw_activity_store 0 4914 NULL ++acpi_battery_alarm_show_4917 acpi_battery_alarm_show 0 4917 NULL ++show_pwm1_enable_4919 show_pwm1_enable 0 4919 NULL nohasharray ++read_4919 read 0 4919 &show_pwm1_enable_4919 ++single_step_cont_4921 single_step_cont 0 4921 NULL ++wl1271_sysfs_read_fwlog_4922 wl1271_sysfs_read_fwlog 0-6-5 4922 NULL nohasharray ++edac_device_ctl_log_ce_store_4922 edac_device_ctl_log_ce_store 0-3 4922 &wl1271_sysfs_read_fwlog_4922 ++bfad_im_optionrom_version_show_4923 bfad_im_optionrom_version_show 0 4923 NULL ++sys_process_vm_writev_4928 sys_process_vm_writev 3-5 4928 NULL ++rx_compressed_show_4930 rx_compressed_show 0 4930 NULL nohasharray ++show_fnode_tcp_timer_scale_4930 show_fnode_tcp_timer_scale 0 4930 &rx_compressed_show_4930 ++ntfs_rl_insert_4931 ntfs_rl_insert 4-2 4931 NULL ++wm831x_unique_id_show_4937 wm831x_unique_id_show 0 4937 NULL ++ieee80211_if_fmt_ave_beacon_4941 ieee80211_if_fmt_ave_beacon 3 4941 NULL nohasharray ++lp3972_ldo_enable_4941 lp3972_ldo_enable 0 4941 &ieee80211_if_fmt_ave_beacon_4941 nohasharray ++asd_show_dev_bios_build_4941 asd_show_dev_bios_build 0 4941 &lp3972_ldo_enable_4941 ++da9055_reg_write_4942 da9055_reg_write 0 4942 NULL nohasharray ++saa7146_pgtable_build_4942 saa7146_pgtable_build 0 4942 &da9055_reg_write_4942 ++multicast_query_response_interval_store_4943 multicast_query_response_interval_store 4-0 4943 NULL ++bl_power_store_4949 bl_power_store 0-4 4949 NULL ++mt9m001_cropcap_4950 mt9m001_cropcap 0 4950 NULL ++batadv_interface_change_mtu_4952 batadv_interface_change_mtu 0 4952 NULL ++request_msix_data_irqs_4956 request_msix_data_irqs 0 4956 NULL ++netlink_mmap_sendmsg_4957 netlink_mmap_sendmsg 0 4957 NULL ++fb_deferred_io_fsync_4960 fb_deferred_io_fsync 0 4960 NULL ++tg3_setup_copper_phy_4964 tg3_setup_copper_phy 0 4964 NULL ++write_ee_4966 write_ee 0 4966 NULL nohasharray ++devm_kzalloc_4966 devm_kzalloc 2 4966 &write_ee_4966 ++compat_rawv6_setsockopt_4967 compat_rawv6_setsockopt 5 4967 NULL ++ath10k_read_chip_id_4969 ath10k_read_chip_id 3-0 4969 NULL nohasharray ++lock_device_hotplug_sysfs_4969 lock_device_hotplug_sysfs 0 4969 &ath10k_read_chip_id_4969 ++megasas_page_size_show_4971 megasas_page_size_show 0 4971 NULL ++hfsplus_ext_write_extent_4973 hfsplus_ext_write_extent 0 4973 NULL ++set_aout_4974 set_aout 0-4 4974 NULL ++ieee80211_if_fmt_dot11MeshHWMPconfirmationInterval_4976 ieee80211_if_fmt_dot11MeshHWMPconfirmationInterval 3 4976 NULL ++twlreg_read_4977 twlreg_read 0 4977 NULL nohasharray ++do_sync_read_4977 do_sync_read 0-3 4977 &twlreg_read_4977 ++target_core_alua_tg_pt_gp_store_attr_implicit_trans_secs_4981 target_core_alua_tg_pt_gp_store_attr_implicit_trans_secs 0-3 4981 NULL ++da9063_buck_get_mode_4985 da9063_buck_get_mode 0 4985 NULL ++b43_gphy_op_prepare_hardware_4988 b43_gphy_op_prepare_hardware 0 4988 NULL ++bd2802_store_reg0x09_4990 bd2802_store_reg0x09 0-4 4990 NULL ++read_block_4993 read_block 0 4993 NULL ++xfs_da3_node_split_4994 xfs_da3_node_split 0 4994 NULL ++smb3_validate_negotiate_4999 smb3_validate_negotiate 0 4999 NULL ++compat_SyS_ipc_5000 compat_SyS_ipc 3 5000 NULL ++max_readahead_store_5004 max_readahead_store 3-0 5004 NULL ++atl1c_request_irq_5006 atl1c_request_irq 0 5006 NULL ++qla82xx_pci_mem_write_direct_5008 qla82xx_pci_mem_write_direct 2 5008 NULL ++lm3533_als_set_target_5010 lm3533_als_set_target 0 5010 NULL ++xhci_urb_enqueue_5012 xhci_urb_enqueue 0 5012 NULL ++wl12xx_sdio_power_on_5017 wl12xx_sdio_power_on 0 5017 NULL ++do_mincore_5018 do_mincore 0-2-1 5018 NULL ++ucode_regs_read_file_5023 ucode_regs_read_file 0 5023 NULL ++smack_getprocattr_5024 smack_getprocattr 0 5024 NULL nohasharray ++mtd_device_parse_register_5024 mtd_device_parse_register 5 5024 &smack_getprocattr_5024 ++sbi_deprecated_show_5030 sbi_deprecated_show 0 5030 NULL nohasharray ++acpi_pad_rrtime_store_5030 acpi_pad_rrtime_store 0-4 5030 &sbi_deprecated_show_5030 ++net2272_start_5033 net2272_start 0 5033 NULL ++brcm_fet_config_init_5045 brcm_fet_config_init 0 5045 NULL ++s3fb_check_var_5048 s3fb_check_var 0 5048 NULL ++blkdev_get_5050 blkdev_get 0 5050 NULL ++pci_read_aer_5051 pci_read_aer 0 5051 NULL ++snd_hdspm_channel_info_5053 snd_hdspm_channel_info 0 5053 NULL ++show_5055 show 0 5055 NULL ++ocfs2_check_range_for_holes_5066 ocfs2_check_range_for_holes 0 5066 NULL ++__kmalloc_track_caller_5071 __kmalloc_track_caller 1 5071 NULL ++bonding_show_primary_5072 bonding_show_primary 0 5072 NULL ++snd_mixart_BA1_read_5082 snd_mixart_BA1_read 5-0 5082 NULL ++get_fan_failure_5083 get_fan_failure 0 5083 NULL ++hdmi_setup_stream_5087 hdmi_setup_stream 0 5087 NULL ++show_sas_rphy_device_type_5089 show_sas_rphy_device_type 0 5089 NULL ++get_random_bytes_5091 get_random_bytes 2 5091 NULL nohasharray ++kfifo_copy_from_user_5091 kfifo_copy_from_user 3-4 5091 &get_random_bytes_5091 ++set_pwm_auto_temp_5092 set_pwm_auto_temp 0-4 5092 NULL ++compr_fill_5093 compr_fill 2 5093 NULL ++zd_usb_enable_int_5095 zd_usb_enable_int 0 5095 NULL ++acpi_ex_create_alias_5097 acpi_ex_create_alias 0 5097 NULL nohasharray ++pppol2tp_setsockopt_5097 pppol2tp_setsockopt 0 5097 &acpi_ex_create_alias_5097 ++spectrum_cs_resume_5098 spectrum_cs_resume 0 5098 NULL ++sound_write_5102 sound_write 3-0 5102 NULL ++i40e_fcoe_ddp_setup_5105 i40e_fcoe_ddp_setup 4 5105 NULL ++goldfish_pipe_read_5109 goldfish_pipe_read 0-3 5109 NULL nohasharray ++alloc_init_skbufs_5109 alloc_init_skbufs 0 5109 &goldfish_pipe_read_5109 ++iscsi_stat_sess_attr_show_5113 iscsi_stat_sess_attr_show 0 5113 NULL nohasharray ++broadsheet_spiflash_wait_for_bit_5113 broadsheet_spiflash_wait_for_bit 0 5113 &iscsi_stat_sess_attr_show_5113 nohasharray ++f2fs_attr_store_5113 f2fs_attr_store 0-4 5113 &broadsheet_spiflash_wait_for_bit_5113 ++set_pwm_enable_direct_5114 set_pwm_enable_direct 0 5114 NULL ++i40e_dbg_netdev_ops_write_5117 i40e_dbg_netdev_ops_write 3-0 5117 NULL nohasharray ++diolan_write_cmd_5117 diolan_write_cmd 0 5117 &i40e_dbg_netdev_ops_write_5117 ++rhine_open_5133 rhine_open 0 5133 NULL ++il_enqueue_hcmd_5139 il_enqueue_hcmd 0 5139 NULL ++mlx4_en_activate_rx_rings_5146 mlx4_en_activate_rx_rings 0 5146 NULL ++ocfs2_inode_lock_full_nested_5148 ocfs2_inode_lock_full_nested 0 5148 NULL ++macb_get_regs_len_5149 macb_get_regs_len 0 5149 NULL ++toshiba_position_show_5153 toshiba_position_show 0 5153 NULL ++quirks_show_5154 quirks_show 0 5154 NULL ++nfs4_wait_clnt_recover_5156 nfs4_wait_clnt_recover 0 5156 NULL ++o2net_recv_tcp_msg_5158 o2net_recv_tcp_msg 3 5158 NULL ++__uwb_addr_print_5161 __uwb_addr_print 2-0 5161 NULL ++get_auto_brightness_5169 get_auto_brightness 0 5169 NULL ++__az6007_write_5170 __az6007_write 0 5170 NULL ++iwl_dbgfs_status_read_5171 iwl_dbgfs_status_read 3-0 5171 NULL nohasharray ++o2hb_heartbeat_group_threshold_store_5171 o2hb_heartbeat_group_threshold_store 0-3 5171 &iwl_dbgfs_status_read_5171 ++acpi_pcc_get_sqty_5176 acpi_pcc_get_sqty 0 5176 NULL nohasharray ++target_stat_scsi_lu_show_attr_indx_5176 target_stat_scsi_lu_show_attr_indx 0 5176 &acpi_pcc_get_sqty_5176 ++datablob_parse_5177 datablob_parse 0 5177 NULL ++generate_smb3signingkey_5182 generate_smb3signingkey 0 5182 NULL ++sfi_map_memory_5183 sfi_map_memory 1-2 5183 NULL ++adjust_memory_5185 adjust_memory 0 5185 NULL ++bond_option_lacp_rate_set_5190 bond_option_lacp_rate_set 0 5190 NULL ++o2nm_cluster_attr_write_5195 o2nm_cluster_attr_write 0-2 5195 NULL ++config_usb_cfg_attr_store_5199 config_usb_cfg_attr_store 0-4 5199 NULL nohasharray ++raid6_check_reshape_5199 raid6_check_reshape 0 5199 &config_usb_cfg_attr_store_5199 ++b44_alloc_consistent_5200 b44_alloc_consistent 0 5200 NULL ++mxl111sf_write_reg_5203 mxl111sf_write_reg 0 5203 NULL ++pipe_set_size_5204 pipe_set_size 2 5204 NULL ++read_blocklist_5209 read_blocklist 2 5209 NULL ++store_state_disable_5210 store_state_disable 0-4 5210 NULL nohasharray ++bad_inode_removexattr_5210 bad_inode_removexattr 0 5210 &store_state_disable_5210 ++snd_nm256_playback_trigger_5213 snd_nm256_playback_trigger 0 5213 NULL nohasharray ++logfs_readpage_5213 logfs_readpage 0 5213 &snd_nm256_playback_trigger_5213 ++ppp_cp_parse_cr_5214 ppp_cp_parse_cr 4 5214 NULL ++dwc2_hcd_urb_alloc_5217 dwc2_hcd_urb_alloc 2 5217 NULL ++get_ep_param_5218 get_ep_param 0 5218 NULL nohasharray ++saa6752hs_init_5218 saa6752hs_init 0 5218 &get_ep_param_5218 nohasharray ++target_fabric_tpg_auth_attr_show_5218 target_fabric_tpg_auth_attr_show 0 5218 &saa6752hs_init_5218 ++bpq_set_mac_address_5223 bpq_set_mac_address 0 5223 NULL ++ath6kl_debug_roam_tbl_event_5224 ath6kl_debug_roam_tbl_event 3 5224 NULL nohasharray ++reserve_mem_notifier_5224 reserve_mem_notifier 0 5224 &ath6kl_debug_roam_tbl_event_5224 ++atl1e_open_5226 atl1e_open 0 5226 NULL ++ssb_ioremap_5228 ssb_ioremap 2 5228 NULL ++wait_for_response_5229 wait_for_response 0 5229 NULL ++da9052_bat_read_volt_5230 da9052_bat_read_volt 0 5230 NULL ++show_ata_dev_ering_5233 show_ata_dev_ering 0 5233 NULL ++iwl_power_update_mode_5235 iwl_power_update_mode 0 5235 NULL ++cpuset_cpu_active_5236 cpuset_cpu_active 0 5236 NULL nohasharray ++isdn_ppp_skb_push_5236 isdn_ppp_skb_push 2 5236 &cpuset_cpu_active_5236 ++show_iface_delayed_ack_en_5240 show_iface_delayed_ack_en 0 5240 NULL nohasharray ++uwb_dev_LQE_store_5240 uwb_dev_LQE_store 0-4 5240 &show_iface_delayed_ack_en_5240 ++sctp_abort_pkt_new_5241 sctp_abort_pkt_new 6 5241 NULL ++aoedisk_show_mac_5245 aoedisk_show_mac 0 5245 NULL ++iscsi_nacl_attrib_show_dataout_timeout_retries_5249 iscsi_nacl_attrib_show_dataout_timeout_retries 0 5249 NULL ++ti_open_5256 ti_open 0 5256 NULL ++update_nodemask_5257 update_nodemask 0 5257 NULL ++__uncore_thresh8_show_5261 __uncore_thresh8_show 0 5261 NULL ++eurwdt_write_5266 eurwdt_write 0-3 5266 NULL ++bch_cache_set_internal_store_5269 bch_cache_set_internal_store 4-0 5269 NULL ++dvb_ringbuffer_write_user_5270 dvb_ringbuffer_write_user 3 5270 NULL nohasharray ++rxrpc_krb5_decode_tagged_data_5270 rxrpc_krb5_decode_tagged_data 0 5270 &dvb_ringbuffer_write_user_5270 ++xgmac_reg_addr_read_5278 xgmac_reg_addr_read 3 5278 NULL ++mpt_lan_open_5281 mpt_lan_open 0 5281 NULL ++i2o_block_probe_5282 i2o_block_probe 0 5282 NULL ++qlafx00_soft_reset_5284 qlafx00_soft_reset 0 5284 NULL ++alloc_cache_blocks_with_hash_5285 alloc_cache_blocks_with_hash 2 5285 NULL ++__smsc95xx_write_reg_5295 __smsc95xx_write_reg 0 5295 NULL ++snd_seq_ioctl_get_queue_tempo_5296 snd_seq_ioctl_get_queue_tempo 0 5296 NULL ++qla2x00_optrom_fcode_version_show_5297 qla2x00_optrom_fcode_version_show 0 5297 NULL ++lpfc_max_luns_show_5301 lpfc_max_luns_show 0 5301 NULL ++metapage_readpage_5304 metapage_readpage 0 5304 NULL nohasharray ++alloc_dec_temp_buffers_5304 alloc_dec_temp_buffers 0 5304 &metapage_readpage_5304 nohasharray ++t4vf_write_rss_vi_config_5304 t4vf_write_rss_vi_config 0 5304 &alloc_dec_temp_buffers_5304 ++ks8842_open_5309 ks8842_open 0 5309 NULL ++_efx_mcdi_rpc_finish_5310 _efx_mcdi_rpc_finish 0 5310 NULL ++grow_inode_5311 grow_inode 0 5311 NULL ++r592_write_fifo_pio_5315 r592_write_fifo_pio 3 5315 NULL ++sbc_get_write_same_sectors_5317 sbc_get_write_same_sectors 0 5317 NULL ++selinux_ipv4_output_5320 selinux_ipv4_output 0 5320 NULL ++pmcraid_show_log_level_5323 pmcraid_show_log_level 0 5323 NULL nohasharray ++bnx2_init_chip_5323 bnx2_init_chip 0 5323 &pmcraid_show_log_level_5323 ++pwr_elp_enter_read_5324 pwr_elp_enter_read 3-0 5324 NULL ++ocfs2_writepage_5327 ocfs2_writepage 0 5327 NULL ++allocate_cnodes_5329 allocate_cnodes 1 5329 NULL ++max8997_rtc_read_time_5330 max8997_rtc_read_time 0 5330 NULL ++padlock_sha1_update_nano_5335 padlock_sha1_update_nano 0 5335 NULL ++nvkm_ioctl_5338 nvkm_ioctl 0 5338 NULL ++__uncore_occ_edge_show_5340 __uncore_occ_edge_show 0 5340 NULL ++uinput_ioctl_5342 uinput_ioctl 2 5342 NULL ++ad714x_i2c_read_5345 ad714x_i2c_read 4 5345 NULL ++policy_store_5346 policy_store 0-4 5346 NULL ++iio_sysfs_trig_remove_5348 iio_sysfs_trig_remove 0-4 5348 NULL ++target_stat_scsi_dev_show_attr_inst_5353 target_stat_scsi_dev_show_attr_inst 0 5353 NULL nohasharray ++qlcnic_sriov_validate_vlan_cfg_5353 qlcnic_sriov_validate_vlan_cfg 0 5353 &target_stat_scsi_dev_show_attr_inst_5353 ++acpi_tb_validate_table_5356 acpi_tb_validate_table 0 5356 NULL ++ocfs2_figure_hole_clusters_5358 ocfs2_figure_hole_clusters 0 5358 NULL ++ps_pspoll_utilization_read_5361 ps_pspoll_utilization_read 3-0 5361 NULL ++icmp_error_5362 icmp_error 0 5362 NULL ++open_tx_second_5363 open_tx_second 0 5363 NULL ++cciss_allocate_sg_chain_blocks_5368 cciss_allocate_sg_chain_blocks 3-2 5368 NULL ++lowpan_alloc_frag_5370 lowpan_alloc_frag 2 5370 NULL ++set_master_5372 set_master 0 5372 NULL ++set_sample_rate_v2_5376 set_sample_rate_v2 0 5376 NULL nohasharray ++rs5c372_get_datetime_5376 rs5c372_get_datetime 0 5376 &set_sample_rate_v2_5376 ++netlink_autobind_5378 netlink_autobind 0 5378 NULL ++ab3100_enable_regulator_5383 ab3100_enable_regulator 0 5383 NULL ++iscsi_tpg_param_store_DefaultTime2Retain_5384 iscsi_tpg_param_store_DefaultTime2Retain 0-3 5384 NULL nohasharray ++disksize_store_5384 disksize_store 0-4 5384 &iscsi_tpg_param_store_DefaultTime2Retain_5384 nohasharray ++fcr_get_rxtrig_bytes_5384 fcr_get_rxtrig_bytes 0 5384 &disksize_store_5384 ++efx_mcdi_port_reconfigure_5389 efx_mcdi_port_reconfigure 0 5389 NULL ++at86rf230_set_hw_addr_filt_5394 at86rf230_set_hw_addr_filt 0 5394 NULL ++bitmap_fold_5396 bitmap_fold 4 5396 NULL ++brcmf_netdev_set_mac_address_5397 brcmf_netdev_set_mac_address 0 5397 NULL ++xadc_write_adc_reg_5398 xadc_write_adc_reg 0 5398 NULL ++regulator_uV_show_5404 regulator_uV_show 0 5404 NULL ++kvm_reboot_5405 kvm_reboot 0 5405 NULL ++fat_getattr_5406 fat_getattr 0 5406 NULL ++gpio_direction_store_5408 gpio_direction_store 0-4 5408 NULL ++apds990x_prox_reporting_mode_store_5410 apds990x_prox_reporting_mode_store 0-4 5410 NULL ++xfs_free_extent_5411 xfs_free_extent 0 5411 NULL ++deinterlace_queue_setup_5412 deinterlace_queue_setup 0 5412 NULL ++cifs_setattr_5417 cifs_setattr 0 5417 NULL ++sbp_tpg_attrib_show_max_reconnect_timeout_5421 sbp_tpg_attrib_show_max_reconnect_timeout 0 5421 NULL nohasharray ++xfs_bmap_add_attrfork_local_5421 xfs_bmap_add_attrfork_local 0 5421 &sbp_tpg_attrib_show_max_reconnect_timeout_5421 ++show_output_5423 show_output 0 5423 NULL ++thin_provisioning_show_5428 thin_provisioning_show 0 5428 NULL ++dev_attr_show_5429 dev_attr_show 0 5429 NULL ++mxt_check_firmware_format_5432 mxt_check_firmware_format 0 5432 NULL ++qla4xxx_fw_timestamp_show_5433 qla4xxx_fw_timestamp_show 0 5433 NULL ++xadc_zynq_read_adc_reg_5440 xadc_zynq_read_adc_reg 0 5440 NULL ++store_pwm_5441 store_pwm 0-4 5441 NULL ++gadget_dev_desc_bDeviceSubClass_show_5442 gadget_dev_desc_bDeviceSubClass_show 0 5442 NULL ++pci_esp_map_sg_5444 pci_esp_map_sg 3 5444 NULL ++available_uuids_show_5445 available_uuids_show 0 5445 NULL ++wm831x_rtc_setalarm_5447 wm831x_rtc_setalarm 0 5447 NULL ++create_child_5449 create_child 0-4 5449 NULL ++add_host_show_5451 add_host_show 0 5451 NULL ++powerclamp_set_cur_state_5453 powerclamp_set_cur_state 0 5453 NULL ++qla4xxx_fw_state_show_5454 qla4xxx_fw_state_show 0 5454 NULL ++change_wakeup_protocol_5455 change_wakeup_protocol 0 5455 NULL ++adm8211_add_interface_5459 adm8211_add_interface 0 5459 NULL nohasharray ++acpi_video_device_lcd_set_level_5459 acpi_video_device_lcd_set_level 0 5459 &adm8211_add_interface_5459 ++sfi_map_table_5462 sfi_map_table 1 5462 NULL ++xfs_efd_init_5463 xfs_efd_init 3 5463 NULL ++netlink_insert_5465 netlink_insert 0 5465 NULL ++rt5677_gpio_direction_out_5468 rt5677_gpio_direction_out 0 5468 NULL nohasharray ++ll_xattr_cache_refill_5468 ll_xattr_cache_refill 0 5468 &rt5677_gpio_direction_out_5468 ++kernfs_fop_write_5471 kernfs_fop_write 3-0 5471 NULL nohasharray ++lm3530_led_enable_5471 lm3530_led_enable 0 5471 &kernfs_fop_write_5471 ++show_cpu_clock_5473 show_cpu_clock 0 5473 NULL ++show_5474 show 0 5474 NULL nohasharray ++wl18xx_hw_init_5474 wl18xx_hw_init 0 5474 &show_5474 nohasharray ++store_5474 store 0-3 5474 &wl18xx_hw_init_5474 ++xfs_efi_init_5476 xfs_efi_init 2 5476 NULL ++dlm_nodir_show_5477 dlm_nodir_show 0 5477 NULL ++ubi_leb_write_5478 ubi_leb_write 5-4-0 5478 NULL ++kone_sysfs_set_tcu_5481 kone_sysfs_set_tcu 0-4 5481 NULL nohasharray ++max_ratio_store_5481 max_ratio_store 0-4 5481 &kone_sysfs_set_tcu_5481 ++pci_enable_msix_exact_5482 pci_enable_msix_exact 3 5482 NULL ++cifs_security_flags_proc_write_5484 cifs_security_flags_proc_write 3-0 5484 NULL ++jffs2_setattr_5486 jffs2_setattr 0 5486 NULL nohasharray ++pm3fb_set_par_5486 pm3fb_set_par 0 5486 &jffs2_setattr_5486 ++smb2_set_file_info_5487 smb2_set_file_info 0 5487 NULL ++psb_intel_sdvo_ddc_proxy_xfer_5488 psb_intel_sdvo_ddc_proxy_xfer 0-3 5488 NULL ++qla2x00_fw_version_show_5491 qla2x00_fw_version_show 0 5491 NULL ++tty_write_5494 tty_write 3-0 5494 NULL nohasharray ++dlm_user_deadlock_5494 dlm_user_deadlock 0 5494 &tty_write_5494 nohasharray ++u3_exit_store_5494 u3_exit_store 0-4 5494 &dlm_user_deadlock_5494 ++tomoyo_update_domain_5498 tomoyo_update_domain 2 5498 NULL nohasharray ++ieee80211_if_fmt_last_beacon_5498 ieee80211_if_fmt_last_beacon 3 5498 &tomoyo_update_domain_5498 ++adfs_f_update_5499 adfs_f_update 0 5499 NULL nohasharray ++autofs4_d_manage_5499 autofs4_d_manage 0 5499 &adfs_f_update_5499 ++ath10k_init_uart_5501 ath10k_init_uart 0 5501 NULL ++__max_nr_grant_frames_5505 __max_nr_grant_frames 0 5505 NULL ++roccat_common2_sysfs_write_info_5507 roccat_common2_sysfs_write_info 0-6-5 5507 NULL ++show_counter_tx_unsup_vl_errs_5509 show_counter_tx_unsup_vl_errs 0 5509 NULL nohasharray ++default_compression_show_5509 default_compression_show 0 5509 &show_counter_tx_unsup_vl_errs_5509 ++niu_init_hostinfo_5513 niu_init_hostinfo 0 5513 NULL ++nilfs_btree_get_block_5514 nilfs_btree_get_block 0 5514 NULL ++spidev_message_5518 spidev_message 3 5518 NULL ++show_port_state_5521 show_port_state 0 5521 NULL nohasharray ++uuid_parse_5521 uuid_parse 0 5521 &show_port_state_5521 ++show_license_5524 show_license 0 5524 NULL ++pm_qos_remote_wakeup_show_5526 pm_qos_remote_wakeup_show 0 5526 NULL ++sdev_show_queue_depth_5527 sdev_show_queue_depth 0 5527 NULL ++sctp_make_op_error_space_5528 sctp_make_op_error_space 3 5528 NULL ++stop_cpus_5529 stop_cpus 0 5529 NULL ++ata_scsi_em_message_type_show_5530 ata_scsi_em_message_type_show 0 5530 NULL ++ieee80211_if_fmt_auto_open_plinks_5534 ieee80211_if_fmt_auto_open_plinks 3 5534 NULL nohasharray ++prepare_transfer_5534 prepare_transfer 0 5534 &ieee80211_if_fmt_auto_open_plinks_5534 nohasharray ++typhoon_reset_5534 typhoon_reset 0 5534 &prepare_transfer_5534 ++m48t59_rtc_setalarm_5542 m48t59_rtc_setalarm 0 5542 NULL ++ks8995_registers_write_5545 ks8995_registers_write 0-5-6 5545 NULL ++ov9650_set_auto_exposure_5552 ov9650_set_auto_exposure 0 5552 NULL nohasharray ++get_entry_msg_len_5552 get_entry_msg_len 0 5552 &ov9650_set_auto_exposure_5552 ++brcmu_pkt_buf_get_skb_5556 brcmu_pkt_buf_get_skb 1 5556 NULL ++le_readq_5557 le_readq 0 5557 NULL ++thinkpad_acpi_pdev_name_show_5567 thinkpad_acpi_pdev_name_show 0 5567 NULL ++mic_to_dma_addr_5569 mic_to_dma_addr 2 5569 NULL ++v4l2_s_ctrl_5571 v4l2_s_ctrl 0 5571 NULL ++tda18271_set_standby_mode_5572 tda18271_set_standby_mode 0 5572 NULL ++fir16_create_5574 fir16_create 3 5574 NULL ++bioset_create_5580 bioset_create 1 5580 NULL ++fat_block_truncate_page_5581 fat_block_truncate_page 0 5581 NULL nohasharray ++esas2r_write_vda_5581 esas2r_write_vda 0-3-4 5581 &fat_block_truncate_page_5581 ++oz_ep_alloc_5587 oz_ep_alloc 1 5587 NULL ++ecm_opts_dev_addr_show_5594 ecm_opts_dev_addr_show 0 5594 NULL nohasharray ++bch_strtoull_h_5594 bch_strtoull_h 0 5594 &ecm_opts_dev_addr_show_5594 ++thermal_throttle_cpu_callback_5596 thermal_throttle_cpu_callback 0 5596 NULL nohasharray ++bind_store_5596 bind_store 0-3 5596 &thermal_throttle_cpu_callback_5596 ++xcan_set_bittiming_5605 xcan_set_bittiming 0 5605 NULL ++ldm_frag_add_5611 ldm_frag_add 2 5611 NULL ++compat_copy_entries_5617 compat_copy_entries 0 5617 NULL ++__remove_suid_5618 __remove_suid 0 5618 NULL ++lx_hardware_start_5619 lx_hardware_start 0 5619 NULL nohasharray ++ext2_xattr_set_5619 ext2_xattr_set 0 5619 &lx_hardware_start_5619 ++gfs2_unstuffer_page_5620 gfs2_unstuffer_page 0 5620 NULL ++SYSC_init_module_5626 SYSC_init_module 2 5626 NULL ++show_tabletPointerMode_5629 show_tabletPointerMode 0 5629 NULL ++psmouse_set_int_attr_5636 psmouse_set_int_attr 0-4 5636 NULL ++SYSC_fsetxattr_5639 SYSC_fsetxattr 4 5639 NULL nohasharray ++dibx000_i2c_gated_gpio67_xfer_5639 dibx000_i2c_gated_gpio67_xfer 0-3 5639 &SYSC_fsetxattr_5639 nohasharray ++read_port_5639 read_port 0 5639 &dibx000_i2c_gated_gpio67_xfer_5639 ++get_beep_enable_5640 get_beep_enable 0 5640 NULL ++pipe_buffer_setting_5642 pipe_buffer_setting 0 5642 NULL ++snd_pcm_plugin_build_linear_5646 snd_pcm_plugin_build_linear 0 5646 NULL ++em25xx_bus_B_send_bytes_5647 em25xx_bus_B_send_bytes 0-4 5647 NULL nohasharray ++bootmode_show_5647 bootmode_show 0 5647 &em25xx_bus_B_send_bytes_5647 nohasharray ++pci_olpc_read_5647 pci_olpc_read 0 5647 &bootmode_show_5647 ++nilfs_bmap_last_key_5648 nilfs_bmap_last_key 0 5648 NULL ++__iscsi_tpg_auth_store_password_mutual_5649 __iscsi_tpg_auth_store_password_mutual 0-3 5649 NULL ++parse_arg_5657 parse_arg 0-2 5657 NULL ++iscsi_disc_show_userid_5659 iscsi_disc_show_userid 0 5659 NULL ++uhid_hid_get_report_5660 uhid_hid_get_report 0-4 5660 NULL nohasharray ++read_uv_5660 read_uv 0 5660 &uhid_hid_get_report_5660 ++ext4_xattr_get_5661 ext4_xattr_get 0 5661 NULL ++posix_clock_register_5662 posix_clock_register 2 5662 NULL ++clk_prepare_5663 clk_prepare 0 5663 NULL nohasharray ++ovl_permission_5663 ovl_permission 0 5663 &clk_prepare_5663 nohasharray ++store_5663 store 0-3 5663 &ovl_permission_5663 ++mthca_map_reg_5664 mthca_map_reg 2-3 5664 NULL nohasharray ++set_device_state_5664 set_device_state 0 5664 &mthca_map_reg_5664 ++show_rps_dev_flow_table_cnt_5665 show_rps_dev_flow_table_cnt 0 5665 NULL ++ath5k_attr_show_noise_immunity_level_max_5666 ath5k_attr_show_noise_immunity_level_max 0 5666 NULL nohasharray ++show_fnode_snack_req_5666 show_fnode_snack_req 0 5666 &ath5k_attr_show_noise_immunity_level_max_5666 ++wl1251_acx_conn_monit_params_5671 wl1251_acx_conn_monit_params 0 5671 NULL ++idt77252_init_cbr_5679 idt77252_init_cbr 0 5679 NULL ++add_stereo_vol_5690 add_stereo_vol 0 5690 NULL ++lpfc_sriov_hw_max_virtfn_show_5693 lpfc_sriov_hw_max_virtfn_show 0 5693 NULL ++get_arg_5694 get_arg 3 5694 NULL nohasharray ++btrfs_space_info_show_bytes_reserved_5694 btrfs_space_info_show_bytes_reserved 0 5694 &get_arg_5694 ++tx_heartbeat_errors_show_5696 tx_heartbeat_errors_show 0 5696 NULL nohasharray ++show_physical_device_5696 show_physical_device 0 5696 &tx_heartbeat_errors_show_5696 ++squashfs_user_list_5707 squashfs_user_list 0-5 5707 NULL nohasharray ++deadline_init_queue_5707 deadline_init_queue 0 5707 &squashfs_user_list_5707 ++subbuf_read_actor_5708 subbuf_read_actor 3 5708 NULL ++ubifs_wbuf_sync_5710 ubifs_wbuf_sync 0 5710 NULL ++ieee802154_hdr_push_sechdr_5714 ieee802154_hdr_push_sechdr 0 5714 NULL ++batadv_frag_create_5717 batadv_frag_create 3 5717 NULL ++pci_hp_diva_init_5719 pci_hp_diva_init 0 5719 NULL ++show_counter_tx_len_errs_5725 show_counter_tx_len_errs 0 5725 NULL ++mlx4_cq_alloc_icm_5726 mlx4_cq_alloc_icm 0 5726 NULL nohasharray ++qib_dma_map_single_5726 qib_dma_map_single 0 5726 &mlx4_cq_alloc_icm_5726 ++vmw_kms_readback_5727 vmw_kms_readback 6 5727 NULL nohasharray ++wl1271_cmd_interrogate_5727 wl1271_cmd_interrogate 0 5727 &vmw_kms_readback_5727 ++mlx4_en_activate_cq_5729 mlx4_en_activate_cq 0 5729 NULL ++edac_device_ctl_log_ue_show_5730 edac_device_ctl_log_ue_show 0 5730 NULL ++sctp_listen_for_all_5740 sctp_listen_for_all 0 5740 NULL ++sb1_audio_prepare_for_input_5742 sb1_audio_prepare_for_input 0 5742 NULL ++v9fs_mmap_file_write_5745 v9fs_mmap_file_write 0-3 5745 NULL ++vxge_change_mtu_5746 vxge_change_mtu 0 5746 NULL ++get_packet_5747 get_packet 3 5747 NULL ++ubi_calc_fm_size_5749 ubi_calc_fm_size 0 5749 NULL nohasharray ++pktgen_device_event_5749 pktgen_device_event 0 5749 &ubi_calc_fm_size_5749 ++pci_netmos_init_5753 pci_netmos_init 0 5753 NULL ++omfs_writepages_5759 omfs_writepages 0 5759 NULL ++lx_pipe_wait_for_state_5761 lx_pipe_wait_for_state 0 5761 NULL nohasharray ++truncate_data_block_5761 truncate_data_block 0 5761 &lx_pipe_wait_for_state_5761 ++packet_xmit_5762 packet_xmit 0 5762 NULL ++lpfc_serialnum_show_5767 lpfc_serialnum_show 0 5767 NULL ++start_5768 start 0 5768 NULL ++sock_alloc_send_pskb_5769 sock_alloc_send_pskb 2 5769 NULL ++sctp_setsockopt_autoclose_5775 sctp_setsockopt_autoclose 3-0 5775 NULL nohasharray ++qlcnic_83xx_sysfs_flash_read_handler_5775 qlcnic_83xx_sysfs_flash_read_handler 6-0-5 5775 &sctp_setsockopt_autoclose_5775 ++mlx4_alloc_resize_buf_5778 mlx4_alloc_resize_buf 3 5778 NULL ++apply_workqueue_attrs_5779 apply_workqueue_attrs 0 5779 NULL ++compat_sys_writev_5784 compat_sys_writev 3 5784 NULL nohasharray ++selinux_inode_listxattr_5784 selinux_inode_listxattr 0 5784 &compat_sys_writev_5784 nohasharray ++show_map_5784 show_map 0 5784 &selinux_inode_listxattr_5784 ++__vxge_hw_blockpool_malloc_5786 __vxge_hw_blockpool_malloc 2 5786 NULL ++ath10k_download_board_data_5787 ath10k_download_board_data 0 5787 NULL ++ov9650_set_blue_balance_5796 ov9650_set_blue_balance 0 5796 NULL ++nvme_trans_bdev_char_page_5797 nvme_trans_bdev_char_page 3 5797 NULL ++tpm_show_ppi_tcg_operations_5798 tpm_show_ppi_tcg_operations 0 5798 NULL ++nes_show_nonidx_data_5803 nes_show_nonidx_data 0 5803 NULL ++bnad_tx_res_alloc_5811 bnad_tx_res_alloc 0 5811 NULL ++rfcomm_sock_setsockopt_old_5813 rfcomm_sock_setsockopt_old 0 5813 NULL ++ceph_listxattr_5817 ceph_listxattr 0-3 5817 NULL ++trackpoint_show_int_attr_5828 trackpoint_show_int_attr 0 5828 NULL ++sbi_ui_show_5830 sbi_ui_show 0 5830 NULL nohasharray ++core_alua_store_nonop_delay_msecs_5830 core_alua_store_nonop_delay_msecs 0-3 5830 &sbi_ui_show_5830 ++mt9v022_s_stream_5838 mt9v022_s_stream 0 5838 NULL ++stv6110_set_params_5844 stv6110_set_params 0 5844 NULL ++ceph_msg_new_5846 ceph_msg_new 2 5846 NULL ++ixgb_check_copybreak_5847 ixgb_check_copybreak 3 5847 NULL ++ext4_xattr_set_5848 ext4_xattr_set 0 5848 NULL nohasharray ++setup_req_5848 setup_req 3 5848 &ext4_xattr_set_5848 ++enter_state_5850 enter_state 0 5850 NULL ++rx_filter_max_arp_queue_dep_read_5851 rx_filter_max_arp_queue_dep_read 3-0 5851 NULL ++netdev_adjacent_sysfs_add_5853 netdev_adjacent_sysfs_add 0 5853 NULL ++lpfc_cr_delay_show_5855 lpfc_cr_delay_show 0 5855 NULL ++compat_sys_move_pages_5861 compat_sys_move_pages 2 5861 NULL nohasharray ++uinput_compat_ioctl_5861 uinput_compat_ioctl 2 5861 &compat_sys_move_pages_5861 nohasharray ++ssb_pcmcia_cfg_write_5861 ssb_pcmcia_cfg_write 0 5861 &uinput_compat_ioctl_5861 ++nes_show_flash_cmd_5862 nes_show_flash_cmd 0 5862 NULL nohasharray ++sn9c2028_long_command_5862 sn9c2028_long_command 0 5862 &nes_show_flash_cmd_5862 ++padlock_sha256_final_5865 padlock_sha256_final 0 5865 NULL ++vsscanf_5868 vsscanf 0 5868 NULL ++i2o_bus_store_scan_5869 i2o_bus_store_scan 0-4 5869 NULL ++ipx_bind_5871 ipx_bind 0 5871 NULL nohasharray ++store_fc_vport_delete_5871 store_fc_vport_delete 0-4 5871 &ipx_bind_5871 ++bytes_transferred_show_5874 bytes_transferred_show 0 5874 NULL ++iwl_dbgfs_scan_ant_rxchain_write_5877 iwl_dbgfs_scan_ant_rxchain_write 0-3 5877 NULL ++num_tgts_show_5884 num_tgts_show 0 5884 NULL nohasharray ++__alx_open_5884 __alx_open 0 5884 &num_tgts_show_5884 ++scan_bitmap_5888 scan_bitmap 3 5888 NULL ++lprocfs_fid_width_seq_write_5889 lprocfs_fid_width_seq_write 3 5889 NULL ++new_sync_read_5891 new_sync_read 0-3 5891 NULL ++rmd320_final_5897 rmd320_final 0 5897 NULL ++twl4030_pwmled_enable_5901 twl4030_pwmled_enable 0 5901 NULL ++_rtl92cu_init_mac_5902 _rtl92cu_init_mac 0 5902 NULL ++store_fan_time_5903 store_fan_time 0-4 5903 NULL ++port_show_regs_5904 port_show_regs 3-0 5904 NULL ++qlcnic_sriov_cfg_bc_intr_5905 qlcnic_sriov_cfg_bc_intr 0 5905 NULL ++netlbl_unlhsh_add_addr6_5906 netlbl_unlhsh_add_addr6 0 5906 NULL ++rbd_segment_length_5907 rbd_segment_length 0-2-3 5907 NULL nohasharray ++iblock_emulate_read_cap_with_block_size_5907 iblock_emulate_read_cap_with_block_size 0 5907 &rbd_segment_length_5907 nohasharray ++ad198x_parse_auto_config_5907 ad198x_parse_auto_config 0 5907 &iblock_emulate_read_cap_with_block_size_5907 ++devpath_show_5910 devpath_show 0 5910 NULL ++uhci_debug_read_5911 uhci_debug_read 3-0 5911 NULL ++qla82xx_pci_mem_read_2M_5912 qla82xx_pci_mem_read_2M 2 5912 NULL nohasharray ++compass_heading_data_show_5912 compass_heading_data_show 0 5912 &qla82xx_pci_mem_read_2M_5912 ++__alloc_rx_skb_5915 __alloc_rx_skb 1 5915 NULL ++lpfc_suppress_link_up_show_5916 lpfc_suppress_link_up_show 0 5916 NULL ++next_entry_5921 next_entry 0 5921 NULL ++ttm_bo_kmap_ttm_5922 ttm_bo_kmap_ttm 3 5922 NULL nohasharray ++af9005_read_tuner_registers_5922 af9005_read_tuner_registers 0 5922 &ttm_bo_kmap_ttm_5922 ++lbs_highsnr_read_5931 lbs_highsnr_read 3-0 5931 NULL ++ps_poll_ps_poll_timeouts_read_5934 ps_poll_ps_poll_timeouts_read 3-0 5934 NULL ++mlx4_en_create_tx_ring_5938 mlx4_en_create_tx_ring 3 5938 NULL nohasharray ++sctp_bindx_rem_5938 sctp_bindx_rem 0 5938 &mlx4_en_create_tx_ring_5938 ++edac_device_alloc_ctl_info_5941 edac_device_alloc_ctl_info 1 5941 NULL ++ssb_devices_freeze_5945 ssb_devices_freeze 0 5945 NULL ++devkmsg_write_5947 devkmsg_write 0 5947 NULL ++affs_readpage_ofs_5951 affs_readpage_ofs 0 5951 NULL ++bnx2x_req_msix_irqs_5956 bnx2x_req_msix_irqs 0 5956 NULL ++tipc_subseq_alloc_5957 tipc_subseq_alloc 1 5957 NULL nohasharray ++erst_exec_add_value_5957 erst_exec_add_value 0 5957 &tipc_subseq_alloc_5957 ++attr_press_speed_show_tpkbd_5960 attr_press_speed_show_tpkbd 0 5960 NULL ++free_hugepages_show_5961 free_hugepages_show 0 5961 NULL ++ll_statahead_one_5962 ll_statahead_one 3 5962 NULL ++netif_set_real_num_rx_queues_5967 netif_set_real_num_rx_queues 0 5967 NULL ++show_activate_slack_5969 show_activate_slack 0 5969 NULL ++qib_notify_dca_5970 qib_notify_dca 0 5970 NULL ++ieee80211_if_fmt_rc_rateidx_mask_5ghz_5971 ieee80211_if_fmt_rc_rateidx_mask_5ghz 3 5971 NULL ++add_single_cap_ctl_5975 add_single_cap_ctl 0 5975 NULL ++power_limit_0_max_uw_show_5977 power_limit_0_max_uw_show 0 5977 NULL ++sha224_final_5978 sha224_final 0 5978 NULL ++show_5979 show 0 5979 NULL nohasharray ++sb1000_check_CRC_5979 sb1000_check_CRC 0 5979 &show_5979 nohasharray ++store_sf_setup_5979 store_sf_setup 0-4 5979 &sb1000_check_CRC_5979 nohasharray ++jbd2_journal_stop_5979 jbd2_journal_stop 0 5979 &store_sf_setup_5979 ++SyS_semop_5980 SyS_semop 3 5980 NULL ++cifs_user_writev_5982 cifs_user_writev 0 5982 NULL ++ib_send_cm_req_5987 ib_send_cm_req 0 5987 NULL ++tps80031_vbus_is_enabled_5998 tps80031_vbus_is_enabled 0 5998 NULL ++mt9v022_s_crop_6011 mt9v022_s_crop 0 6011 NULL ++numa_node_store_6013 numa_node_store 0-4 6013 NULL ++phys_port_id_show_6014 phys_port_id_show 0 6014 NULL ++jffs2_dynrubin_decompress_6015 jffs2_dynrubin_decompress 0 6015 NULL nohasharray ++fuse_writepage_6015 fuse_writepage 0 6015 &jffs2_dynrubin_decompress_6015 ++ipath_parse_ushort_6016 ipath_parse_ushort 0 6016 NULL ++mei_hbm_cl_flow_control_req_6018 mei_hbm_cl_flow_control_req 0 6018 NULL ++btrfs_item_offset_6019 btrfs_item_offset 0 6019 NULL ++get_sas_linkspeed_names_6021 get_sas_linkspeed_names 0 6021 NULL ++spi_read_6031 spi_read 0 6031 NULL nohasharray ++bnx2x_req_irq_6031 bnx2x_req_irq 0 6031 &spi_read_6031 ++show_pwm_auto_point_channel_6032 show_pwm_auto_point_channel 0 6032 NULL ++radeon_process_i2c_ch_6034 radeon_process_i2c_ch 0 6034 NULL ++ntfs_rl_append_6037 ntfs_rl_append 4-2 6037 NULL ++hvfb_set_par_6038 hvfb_set_par 0 6038 NULL ++crccheck_store_6040 crccheck_store 0-4 6040 NULL ++ipath_set_mtu_6042 ipath_set_mtu 0 6042 NULL ++led_shot_6046 led_shot 0-4 6046 NULL ++otg_handle_notification_6055 otg_handle_notification 0 6055 NULL ++show_session_param_ISCSI_PARAM_DISCOVERY_LOGOUT_EN_6056 show_session_param_ISCSI_PARAM_DISCOVERY_LOGOUT_EN 0 6056 NULL ++da9052_request_irq_6058 da9052_request_irq 2 6058 NULL ++pccard_show_cis_6062 pccard_show_cis 0-5-6 6062 NULL ++si3054_pcm_prepare_6063 si3054_pcm_prepare 0 6063 NULL ++i40e_pf_txq_wait_6068 i40e_pf_txq_wait 0 6068 NULL ++ip6mr_device_event_6069 ip6mr_device_event 0 6069 NULL ++add_break_6070 add_break 1 6070 NULL ++alloc_msg_6072 alloc_msg 1 6072 NULL nohasharray ++probe_data_6072 probe_data 0 6072 &alloc_msg_6072 ++sctp_setsockopt_connectx_6073 sctp_setsockopt_connectx 0-3 6073 NULL ++pvr2_ioread_set_enabled_6085 pvr2_ioread_set_enabled 0 6085 NULL ++alloc_indirect_6087 alloc_indirect 2 6087 NULL ++ivb_pipe_crc_ctl_reg_6088 ivb_pipe_crc_ctl_reg 0 6088 NULL ++__mnt_want_write_6091 __mnt_want_write 0 6091 NULL ++init_6095 init 0 6095 NULL ++_random_read_6098 _random_read 3-0 6098 NULL nohasharray ++iwl_dbgfs_rf_reset_write_6098 iwl_dbgfs_rf_reset_write 0-3 6098 &_random_read_6098 ++snd_seq_queue_alloc_6102 snd_seq_queue_alloc 0 6102 NULL nohasharray ++alloc_mad_6102 alloc_mad 0 6102 &snd_seq_queue_alloc_6102 ++start_vivitar_cam_6107 start_vivitar_cam 0 6107 NULL nohasharray ++vlan_protocol_store_6107 vlan_protocol_store 4-0 6107 &start_vivitar_cam_6107 nohasharray ++pch_udc_pcd_queue_6107 pch_udc_pcd_queue 0 6107 &vlan_protocol_store_6107 ++ipmi_addr_length_6110 ipmi_addr_length 0 6110 NULL nohasharray ++force_static_address_read_6110 force_static_address_read 3-0 6110 &ipmi_addr_length_6110 ++dfs_global_file_write_6112 dfs_global_file_write 3-0 6112 NULL ++mic_read_spad_6115 mic_read_spad 0 6115 NULL nohasharray ++i810fb_check_var_6115 i810fb_check_var 0 6115 &mic_read_spad_6115 ++kovaplus_sysfs_write_info_6117 kovaplus_sysfs_write_info 0-6-5 6117 NULL ++fcoe_ctlr_enabled_6126 fcoe_ctlr_enabled 0 6126 NULL ++matrix_keypad_build_keymap_6129 matrix_keypad_build_keymap 3 6129 NULL ++nouveau_parent_create__6131 nouveau_parent_create_ 7 6131 NULL ++read_packet_6140 read_packet 0 6140 NULL ++xfs_mru_cache_insert_6143 xfs_mru_cache_insert 0 6143 NULL ++ieee80211_if_fmt_beacon_timeout_6153 ieee80211_if_fmt_beacon_timeout 3 6153 NULL nohasharray ++ltc4245_show_voltage_6153 ltc4245_show_voltage 0 6153 &ieee80211_if_fmt_beacon_timeout_6153 ++tc574_resume_6154 tc574_resume 0 6154 NULL ++mwifiex_get_stats_info_6156 mwifiex_get_stats_info 0 6156 NULL ++ivtv_copy_buf_to_user_6159 ivtv_copy_buf_to_user 4 6159 NULL ++tcam_write_6162 tcam_write 0 6162 NULL ++show_temp8_6163 show_temp8 0 6163 NULL ++target_core_alua_lu_gp_attr_show_6166 target_core_alua_lu_gp_attr_show 0 6166 NULL ++mxt_get_object_table_6168 mxt_get_object_table 0 6168 NULL ++vdma_mem_alloc_6171 vdma_mem_alloc 1 6171 NULL ++wl1251_cmd_template_set_6172 wl1251_cmd_template_set 4-0 6172 NULL nohasharray ++auok190xfb_set_par_6172 auok190xfb_set_par 0 6172 &wl1251_cmd_template_set_6172 ++ath5k_attr_store_firstep_level_6173 ath5k_attr_store_firstep_level 0-4 6173 NULL ++nf_conntrack_in_6179 nf_conntrack_in 0 6179 NULL nohasharray ++tc589_resume_6179 tc589_resume 0 6179 &nf_conntrack_in_6179 ++rtc_read_alarm_6180 rtc_read_alarm 0 6180 NULL ++open_outb_mbox_6182 open_outb_mbox 0 6182 NULL nohasharray ++ipr_store_update_fw_6182 ipr_store_update_fw 0-4 6182 &open_outb_mbox_6182 nohasharray ++SyS_setgroups_6182 SyS_setgroups 1 6182 &ipr_store_update_fw_6182 ++freeze_store_6185 freeze_store 0-3 6185 NULL ++snd_efw_command_get_phys_meters_6190 snd_efw_command_get_phys_meters 3 6190 NULL ++llcp_sock_getname_6193 llcp_sock_getname 0 6193 NULL ++_snd_pcm_hw_param_max_6197 _snd_pcm_hw_param_max 0 6197 NULL ++add_interval_6202 add_interval 0 6202 NULL ++mxt_show_instance_6207 mxt_show_instance 0-2 6207 NULL ++show_therm_crit_6210 show_therm_crit 0 6210 NULL nohasharray ++show_fnode_is_fw_assigned_ipv6_6210 show_fnode_is_fw_assigned_ipv6 0 6210 &show_therm_crit_6210 ++iwl_dvm_send_cmd_pdu_6211 iwl_dvm_send_cmd_pdu 0 6211 NULL ++sock_no_sendpage_6214 sock_no_sendpage 4 6214 NULL ++show_tabletCoordinateMode_6217 show_tabletCoordinateMode 0 6217 NULL ++megasas_sysfs_show_support_device_change_6219 megasas_sysfs_show_support_device_change 0 6219 NULL ++snd_hdspm_prepare_6224 snd_hdspm_prepare 0 6224 NULL ++int3403_get_cur_state_6227 int3403_get_cur_state 0 6227 NULL ++mqueue_read_file_6228 mqueue_read_file 3-0 6228 NULL ++pyra_sysfs_read_profilex_settings_6233 pyra_sysfs_read_profilex_settings 0-5-6 6233 NULL nohasharray ++ax_set_mac_address_6233 ax_set_mac_address 0 6233 &pyra_sysfs_read_profilex_settings_6233 ++__clk_prepare_6234 __clk_prepare 0 6234 NULL ++store_rf_kill_6235 store_rf_kill 0-4 6235 NULL ++qla24xx_vport_delete_6236 qla24xx_vport_delete 0 6236 NULL ++f_hidg_read_6238 f_hidg_read 3 6238 NULL ++stk1160_write_reg_6242 stk1160_write_reg 0 6242 NULL nohasharray ++fc_write_6242 fc_write 0-3 6242 &stk1160_write_reg_6242 nohasharray ++jme_get_eeprom_len_6242 jme_get_eeprom_len 0 6242 &fc_write_6242 ++s5m_rtc_stop_alarm_6244 s5m_rtc_stop_alarm 0 6244 NULL ++fbcon_prepare_logo_6246 fbcon_prepare_logo 5 6246 NULL ++init_dma_desc_rings_6247 init_dma_desc_rings 0 6247 NULL ++set_pwm_auto_6252 set_pwm_auto 0-4 6252 NULL ++snd_hda_jack_detect_enable_6269 snd_hda_jack_detect_enable 0 6269 NULL ++of_gpio_count_6270 of_gpio_count 0 6270 NULL ++e1000_vlan_rx_add_vid_6273 e1000_vlan_rx_add_vid 0 6273 NULL ++acpi_unregister_gsi_ioapic_6276 acpi_unregister_gsi_ioapic 1 6276 NULL nohasharray ++read_mflags_6276 read_mflags 0 6276 &acpi_unregister_gsi_ioapic_6276 ++pcpu_next_pop_6277 pcpu_next_pop 4 6277 NULL ++tx_tx_start_null_frame_read_6281 tx_tx_start_null_frame_read 3-0 6281 NULL ++xenbus_file_write_6282 xenbus_file_write 3-0 6282 NULL nohasharray ++snd_hda_override_conn_list_6282 snd_hda_override_conn_list 3-0 6282 &xenbus_file_write_6282 ++posix_acl_fix_xattr_to_user_6283 posix_acl_fix_xattr_to_user 2 6283 NULL ++key_unseal_6285 key_unseal 0 6285 NULL ++sis630_transaction_wait_6288 sis630_transaction_wait 0 6288 NULL ++nf_nat_ipv6_manip_pkt_6289 nf_nat_ipv6_manip_pkt 2 6289 NULL ++serial_port_in_6291 serial_port_in 0 6291 NULL ++da9055_enable_auto_mode_6292 da9055_enable_auto_mode 0 6292 NULL ++acpi_ut_copy_simple_object_6293 acpi_ut_copy_simple_object 0 6293 NULL ++set_activation_height_6303 set_activation_height 0-4 6303 NULL ++raw_request_6307 raw_request 0 6307 NULL ++mid_get_vbt_data_r10_6308 mid_get_vbt_data_r10 2 6308 NULL nohasharray ++snd_card_asihpi_capture_ioctl_6308 snd_card_asihpi_capture_ioctl 0 6308 &mid_get_vbt_data_r10_6308 ++qlcnic_sriov_alloc_bc_msg_6309 qlcnic_sriov_alloc_bc_msg 2 6309 NULL ++tx_aborted_errors_show_6310 tx_aborted_errors_show 0 6310 NULL nohasharray ++sbp_wwn_show_attr_version_6310 sbp_wwn_show_attr_version 0 6310 &tx_aborted_errors_show_6310 ++balance_6312 balance 0 6312 NULL ++ov7670_s_brightness_6313 ov7670_s_brightness 0 6313 NULL nohasharray ++hfsplus_direct_IO_6313 hfsplus_direct_IO 4-0 6313 &ov7670_s_brightness_6313 ++target_stat_scsi_tgt_port_attr_store_6314 target_stat_scsi_tgt_port_attr_store 0 6314 NULL ++store_cluster_6316 store_cluster 0-4 6316 NULL ++write_null_6319 write_null 0-3 6319 NULL ++__netdev_adjacent_dev_link_neighbour_6321 __netdev_adjacent_dev_link_neighbour 0 6321 NULL ++extent_write_full_page_6322 extent_write_full_page 0 6322 NULL ++ibm_get_table_from_acpi_6329 ibm_get_table_from_acpi 0 6329 NULL nohasharray ++SyS_mincore_6329 SyS_mincore 2-1 6329 &ibm_get_table_from_acpi_6329 ++fuse_get_req_for_background_6337 fuse_get_req_for_background 2 6337 NULL ++ucs2_strnlen_6342 ucs2_strnlen 0 6342 NULL nohasharray ++ksocknal_lib_kiov_vmap_6342 ksocknal_lib_kiov_vmap 2 6342 &ucs2_strnlen_6342 ++solos_param_show_6344 solos_param_show 0 6344 NULL ++amd_cpu_notify_6349 amd_cpu_notify 0 6349 NULL ++regcache_sync_block_raw_6350 regcache_sync_block_raw 5-4 6350 NULL ++mei_dbgfs_read_devstate_6352 mei_dbgfs_read_devstate 3-0 6352 NULL ++ks8851_get_eeprom_len_6358 ks8851_get_eeprom_len 0 6358 NULL ++sync_ep_set_params_6361 sync_ep_set_params 0 6361 NULL nohasharray ++hostap_cs_suspend_6361 hostap_cs_suspend 0 6361 &sync_ep_set_params_6361 ++recover_done_show_6363 recover_done_show 0 6363 NULL nohasharray ++iwl_mvm_mac_sta_state_6363 iwl_mvm_mac_sta_state 0 6363 &recover_done_show_6363 ++recv_init_6366 recv_init 0 6366 NULL ++memcg_update_kmem_limit_6368 memcg_update_kmem_limit 0 6368 NULL ++arch_gnttab_valloc_6372 arch_gnttab_valloc 2 6372 NULL nohasharray ++lstats_write_6372 lstats_write 0-3 6372 &arch_gnttab_valloc_6372 ++snd_hda_codec_dev_register_6373 snd_hda_codec_dev_register 0 6373 NULL ++netdev_queue_add_kobject_6375 netdev_queue_add_kobject 0 6375 NULL ++mwl8k_cmd_update_stadb_add_6376 mwl8k_cmd_update_stadb_add 0 6376 NULL ++osd_req_read_sg_kern_6378 osd_req_read_sg_kern 5 6378 NULL nohasharray ++sync_fence_alloc_6378 sync_fence_alloc 1 6378 &osd_req_read_sg_kern_6378 ++msb_write_block_6379 msb_write_block 3 6379 NULL ++xfs_bmap_extents_to_btree_6387 xfs_bmap_extents_to_btree 0 6387 NULL ++cfq_init_queue_6399 cfq_init_queue 0 6399 NULL ++bb_store_6401 bb_store 3-0 6401 NULL ++hash_elasticity_show_6402 hash_elasticity_show 0 6402 NULL ++bt_skb_alloc_6404 bt_skb_alloc 1 6404 NULL ++isku_sysfs_write_light_6406 isku_sysfs_write_light 6-0-5 6406 NULL ++md_attr_show_6408 md_attr_show 0 6408 NULL ++clear_caseopen_6415 clear_caseopen 0-4 6415 NULL ++ds2780_write_param_eeprom_bin_6416 ds2780_write_param_eeprom_bin 6-5-0 6416 NULL ++ims_pcu_update_firmware_store_6419 ims_pcu_update_firmware_store 0-4 6419 NULL ++posix_acl_fix_xattr_userns_6420 posix_acl_fix_xattr_userns 4 6420 NULL ++rx_missed_errors_show_6421 rx_missed_errors_show 0 6421 NULL nohasharray ++snd_hda_create_spdif_in_ctls_6421 snd_hda_create_spdif_in_ctls 0 6421 &rx_missed_errors_show_6421 ++qlcnic_sriov_pf_cfg_flood_6424 qlcnic_sriov_pf_cfg_flood 0 6424 NULL ++dquot_alloc_space_nodirty_6429 dquot_alloc_space_nodirty 0 6429 NULL ++l2up_create_6430 l2up_create 3 6430 NULL ++__alloc_bootmem_node_nopanic_6432 __alloc_bootmem_node_nopanic 2 6432 NULL ++show_ipv4_iface_fragment_disable_6440 show_ipv4_iface_fragment_disable 0 6440 NULL ++i915_gem_object_wait_rendering_6446 i915_gem_object_wait_rendering 0 6446 NULL ++nf_call_ip6tables_show_6447 nf_call_ip6tables_show 0 6447 NULL ++coda_downcall_6448 coda_downcall 0 6448 NULL ++ceph_dir_fsync_6452 ceph_dir_fsync 0 6452 NULL ++add_fx_switch_6459 add_fx_switch 0 6459 NULL ++nfc_llcp_setsockopt_6461 nfc_llcp_setsockopt 0 6461 NULL ++show_sustain_6469 show_sustain 0 6469 NULL ++C_SYSC_vmsplice_6470 C_SYSC_vmsplice 3 6470 NULL nohasharray ++adt7411_show_vdd_6470 adt7411_show_vdd 0 6470 &C_SYSC_vmsplice_6470 ++exofs_direct_IO_6473 exofs_direct_IO 0 6473 NULL ++ieee80211_if_fmt_dot11MeshMaxRetries_6476 ieee80211_if_fmt_dot11MeshMaxRetries 3 6476 NULL ++ibmpex_reset_high_low_6478 ibmpex_reset_high_low 0-4 6478 NULL nohasharray ++set_pwm_auto_point_fan_6478 set_pwm_auto_point_fan 0-4 6478 &ibmpex_reset_high_low_6478 nohasharray ++koneplus_sysfs_write_control_6478 koneplus_sysfs_write_control 0-6-5 6478 &set_pwm_auto_point_fan_6478 ++i740fb_check_var_6479 i740fb_check_var 0 6479 NULL nohasharray ++qp_memcpy_from_queue_6479 qp_memcpy_from_queue 5-4 6479 &i740fb_check_var_6479 ++megasas_sysfs_set_dbg_lvl_6482 megasas_sysfs_set_dbg_lvl 0-3 6482 NULL ++go7007_i2c_xfer_6487 go7007_i2c_xfer 0 6487 NULL ++cipso_v4_map_lvl_hton_6490 cipso_v4_map_lvl_hton 0 6490 NULL ++elants_i2c_send_6493 elants_i2c_send 3-0 6493 NULL nohasharray ++il3945_store_flags_6493 il3945_store_flags 0-4 6493 &elants_i2c_send_6493 ++erst_exec_stall_while_true_6497 erst_exec_stall_while_true 0 6497 NULL nohasharray ++tcm_qla2xxx_npiv_tpg_store_enable_6497 tcm_qla2xxx_npiv_tpg_store_enable 0-3 6497 &erst_exec_stall_while_true_6497 ++dbg_intr_buf_6501 dbg_intr_buf 2 6501 NULL ++da9052_read_vbat_6502 da9052_read_vbat 0 6502 NULL ++mei_read_6507 mei_read 3-0 6507 NULL ++sf_entsize_6521 sf_entsize 0-2 6521 NULL ++brcmf_fil_iovar_data_set_6523 brcmf_fil_iovar_data_set 0 6523 NULL ++sha1_mb_export_6524 sha1_mb_export 0 6524 NULL ++_ctl_fwfault_debug_show_6531 _ctl_fwfault_debug_show 0 6531 NULL ++ufs_truncate_6535 ufs_truncate 0 6535 NULL ++i40e_vsi_request_irq_6536 i40e_vsi_request_irq 0 6536 NULL ++snd_timer_dev_register_6542 snd_timer_dev_register 0 6542 NULL ++m88rs6000t_set_params_6543 m88rs6000t_set_params 0 6543 NULL ++show_min_uV_6544 show_min_uV 0 6544 NULL ++cbaf_wusb_host_name_show_6545 cbaf_wusb_host_name_show 0 6545 NULL ++snd_pcm_plugin_build_copy_6546 snd_pcm_plugin_build_copy 0 6546 NULL ++rndis_set_oid_6547 rndis_set_oid 0-4 6547 NULL nohasharray ++nfs_fscache_inode_get_key_6547 nfs_fscache_inode_get_key 0 6547 &rndis_set_oid_6547 ++wdm_read_6549 wdm_read 3-0 6549 NULL ++nilfs_segctor_last_pseg_block_show_6550 nilfs_segctor_last_pseg_block_show 0 6550 NULL ++dm_stats_create_6551 dm_stats_create 4-2-3 6551 NULL ++lanai_normalize_ci_6553 lanai_normalize_ci 0 6553 NULL nohasharray ++isku_sysfs_write_keys_easyzone_6553 isku_sysfs_write_keys_easyzone 6-0-5 6553 &lanai_normalize_ci_6553 ++fb_alloc_cmap_6554 fb_alloc_cmap 2 6554 NULL ++notify_handler_6557 notify_handler 0 6557 NULL ++alc662_parse_auto_config_6558 alc662_parse_auto_config 0 6558 NULL ++khugepaged_defrag_show_6561 khugepaged_defrag_show 0 6561 NULL ++adp8860_bl_l3_dark_max_store_6563 adp8860_bl_l3_dark_max_store 4-0 6563 NULL nohasharray ++SyS_semtimedop_6563 SyS_semtimedop 3 6563 &adp8860_bl_l3_dark_max_store_6563 ++rt2x00mac_start_6564 rt2x00mac_start 0 6564 NULL ++smsc75xx_phy_initialize_6568 smsc75xx_phy_initialize 0 6568 NULL ++xfs_iozero_6573 xfs_iozero 0-3-2 6573 NULL ++i2c_smbus_write_byte_6574 i2c_smbus_write_byte 0 6574 NULL ++max8997_rtc_set_alarm_6577 max8997_rtc_set_alarm 0 6577 NULL ++bt_skb_send_alloc_6581 bt_skb_send_alloc 2 6581 NULL ++SyS_fcntl64_6582 SyS_fcntl64 3 6582 NULL ++reg_set_6585 reg_set 0 6585 NULL nohasharray ++d_namespace_path_6585 d_namespace_path 0 6585 ®_set_6585 ++log_buf_addr_store_6586 log_buf_addr_store 0-4 6586 NULL ++nfs4_xattr_list_nfs4_acl_6590 nfs4_xattr_list_nfs4_acl 0-5 6590 NULL ++bytes_number_6591 bytes_number 0-2 6591 NULL ++zd_chip_init_hw_6592 zd_chip_init_hw 0 6592 NULL ++psmouse_attr_show_helper_6602 psmouse_attr_show_helper 0 6602 NULL ++vmci_transport_notify_pkt_send_pre_enqueue_6605 vmci_transport_notify_pkt_send_pre_enqueue 0 6605 NULL nohasharray ++store_constraint_time_window_us_6605 store_constraint_time_window_us 0-4 6605 &vmci_transport_notify_pkt_send_pre_enqueue_6605 nohasharray ++gsmi_exec_6605 gsmi_exec 0 6605 &store_constraint_time_window_us_6605 ++f_read_portcntrs_6611 f_read_portcntrs 0 6611 NULL ++aa_set_current_hat_6612 aa_set_current_hat 0 6612 NULL ++show_attr_mode_lsb_6617 show_attr_mode_lsb 0 6617 NULL ++nilfs_construct_segment_6620 nilfs_construct_segment 0 6620 NULL ++snd_tm6000_card_trigger_6622 snd_tm6000_card_trigger 0 6622 NULL ++ebt_in_hook_6624 ebt_in_hook 0 6624 NULL ++ext4_feat_show_6625 ext4_feat_show 0 6625 NULL ++viacam_config_controller_6627 viacam_config_controller 0 6627 NULL nohasharray ++wl12xx_sdio_raw_read_6627 wl12xx_sdio_raw_read 0 6627 &viacam_config_controller_6627 ++irda_open_lsap_6628 irda_open_lsap 0 6628 NULL ++dn_alloc_skb_6631 dn_alloc_skb 2 6631 NULL ++ixgbevf_request_msix_irqs_6637 ixgbevf_request_msix_irqs 0 6637 NULL ++regulator_suspend_disk_state_show_6639 regulator_suspend_disk_state_show 0 6639 NULL ++show_sf_setup_6640 show_sf_setup 0 6640 NULL ++snd_vt1724_pcm_prepare_6646 snd_vt1724_pcm_prepare 0 6646 NULL ++queue_dtd_6652 queue_dtd 0 6652 NULL ++snd_usb_caiaq_send_command_6654 snd_usb_caiaq_send_command 0 6654 NULL ++_unlock_pcol_pages_6655 _unlock_pcol_pages 2 6655 NULL nohasharray ++adp8860_bl_l1_daylight_max_store_6655 adp8860_bl_l1_daylight_max_store 4-0 6655 &_unlock_pcol_pages_6655 ++nilfs_segctor_scan_file_6656 nilfs_segctor_scan_file 0 6656 NULL ++journal_dirty_metadata_6658 journal_dirty_metadata 0 6658 NULL ++aac_srcv_ioremap_6659 aac_srcv_ioremap 2 6659 NULL ++xhci_drop_endpoint_6661 xhci_drop_endpoint 0 6661 NULL ++brcmf_fil_cmd_data_6662 brcmf_fil_cmd_data 0 6662 NULL ++natsemi_change_mtu_6668 natsemi_change_mtu 0 6668 NULL ++sd_start_depth_6669 sd_start_depth 0 6669 NULL nohasharray ++wacom_store_speed_6669 wacom_store_speed 0-4 6669 &sd_start_depth_6669 ++atkbd_show_softrepeat_6672 atkbd_show_softrepeat 0 6672 NULL ++show_prochot_max_6675 show_prochot_max 0 6675 NULL nohasharray ++kone_sysfs_write_settings_6675 kone_sysfs_write_settings 0-6-5 6675 &show_prochot_max_6675 ++init_chip_first_6676 init_chip_first 0 6676 NULL ++scsiback_tpg_store_nexus_6679 scsiback_tpg_store_nexus 0-3 6679 NULL nohasharray ++fuse_dev_splice_read_6679 fuse_dev_splice_read 0 6679 &scsiback_tpg_store_nexus_6679 nohasharray ++process_rcvd_data_6679 process_rcvd_data 3 6679 &fuse_dev_splice_read_6679 ++tsl2550_calculate_lux_6682 tsl2550_calculate_lux 0 6682 NULL nohasharray ++tg3_setup_fiber_phy_6682 tg3_setup_fiber_phy 0 6682 &tsl2550_calculate_lux_6682 ++roccat_common2_sysfs_write_custom_lights_6684 roccat_common2_sysfs_write_custom_lights 0-6-5 6684 NULL ++ql_process_mac_rx_skb_6689 ql_process_mac_rx_skb 4 6689 NULL ++cap_show_6691 cap_show 0 6691 NULL ++btrfs_lookup_csums_range_6696 btrfs_lookup_csums_range 2-3-0 6696 NULL ++ps_pspoll_max_apturn_read_6699 ps_pspoll_max_apturn_read 3-0 6699 NULL nohasharray ++link_path_walk_6699 link_path_walk 0 6699 &ps_pspoll_max_apturn_read_6699 ++bnad_debugfs_write_regrd_6706 bnad_debugfs_write_regrd 3-0 6706 NULL nohasharray ++txLog_6706 txLog 0 6706 &bnad_debugfs_write_regrd_6706 ++mpeg_read_6708 mpeg_read 3-0 6708 NULL ++ibmpex_query_sensor_count_6709 ibmpex_query_sensor_count 0 6709 NULL nohasharray ++show_modalias_6709 show_modalias 0 6709 &ibmpex_query_sensor_count_6709 ++tcm_loop_tpg_store_nexus_6710 tcm_loop_tpg_store_nexus 0-3 6710 NULL nohasharray ++kxcjk1013_set_power_state_6710 kxcjk1013_set_power_state 0 6710 &tcm_loop_tpg_store_nexus_6710 ++kone_get_weight_6713 kone_get_weight 0 6713 NULL ++check_clk_sync_6717 check_clk_sync 2 6717 NULL ++ab3100_disable_regulator_6718 ab3100_disable_regulator 0 6718 NULL nohasharray ++netconsole_netdev_event_6718 netconsole_netdev_event 0 6718 &ab3100_disable_regulator_6718 ++video_proc_write_6724 video_proc_write 3-0 6724 NULL nohasharray ++hfsplus_osx_getxattr_6724 hfsplus_osx_getxattr 0 6724 &video_proc_write_6724 nohasharray ++regulator_status_show_6724 regulator_status_show 0 6724 &hfsplus_osx_getxattr_6724 ++posix_acl_xattr_count_6725 posix_acl_xattr_count 0-1 6725 NULL ++dccp_feat_push_change_6733 dccp_feat_push_change 0 6733 NULL ++xfs_attr_rmtval_set_6734 xfs_attr_rmtval_set 0 6734 NULL ++rds_rdma_pages_6735 rds_rdma_pages 0 6735 NULL ++qla2x00_sysfs_write_optrom_6736 qla2x00_sysfs_write_optrom 0-5-6 6736 NULL ++sst_platform_pcm_trigger_6743 sst_platform_pcm_trigger 0 6743 NULL ++inet_recv_error_6744 inet_recv_error 0-3 6744 NULL ++mv88e6xxx_reg_read_6748 mv88e6xxx_reg_read 0 6748 NULL ++acm_start_wb_6751 acm_start_wb 0 6751 NULL ++wil_reset_6752 wil_reset 0 6752 NULL ++uvesafb_show_nocrtc_6754 uvesafb_show_nocrtc 0 6754 NULL ++beiscsi_phys_port_disp_6756 beiscsi_phys_port_disp 0 6756 NULL nohasharray ++cciss_engage_scsi_6756 cciss_engage_scsi 0 6756 &beiscsi_phys_port_disp_6756 ++mwifiex_cmd_rf_antenna_6757 mwifiex_cmd_rf_antenna 0 6757 NULL ++usbhsh_urb_enqueue_6759 usbhsh_urb_enqueue 0 6759 NULL ++mwl8k_cmd_set_new_stn_add_6760 mwl8k_cmd_set_new_stn_add 0 6760 NULL ++usX2Y_rate_set_6765 usX2Y_rate_set 0 6765 NULL ++gt_min_freq_mhz_store_6766 gt_min_freq_mhz_store 0-4 6766 NULL ++raid10_start_reshape_6768 raid10_start_reshape 0 6768 NULL ++show_tl_retry_count_6769 show_tl_retry_count 0 6769 NULL ++target_core_alua_tg_pt_gp_show_attr_alua_support_active_nonoptimized_6771 target_core_alua_tg_pt_gp_show_attr_alua_support_active_nonoptimized 0 6771 NULL ++sfi_check_table_6772 sfi_check_table 1 6772 NULL ++mcam_read_setup_6773 mcam_read_setup 0 6773 NULL ++ivtv_yuv_udma_frame_6774 ivtv_yuv_udma_frame 0 6774 NULL ++show_fnode_max_outstanding_r2t_6776 show_fnode_max_outstanding_r2t 0 6776 NULL ++wait_mtu_credits_6777 wait_mtu_credits 0 6777 NULL ++cifs_posix_open_6781 cifs_posix_open 0 6781 NULL nohasharray ++kobject_add_varg_6781 kobject_add_varg 0 6781 &cifs_posix_open_6781 ++_nfs4_get_security_label_6782 _nfs4_get_security_label 0 6782 NULL ++iwl_dbgfs_channels_read_6784 iwl_dbgfs_channels_read 3-0 6784 NULL ++ieee80211_if_read_6785 ieee80211_if_read 3-0 6785 NULL ++zone_spanned_pages_in_node_6787 zone_spanned_pages_in_node 0-3-4 6787 NULL ++pnp_disable_dev_6788 pnp_disable_dev 0 6788 NULL ++shared_cpumap_show_func_6789 shared_cpumap_show_func 0 6789 NULL ++atxp1_showgpio2_6790 atxp1_showgpio2 0 6790 NULL ++hdlcdrv_register_6792 hdlcdrv_register 2 6792 NULL ++pm_qos_latency_tolerance_show_6796 pm_qos_latency_tolerance_show 0 6796 NULL ++ll_xattr_cache_find_6798 ll_xattr_cache_find 0 6798 NULL ++tx_tx_done_data_read_6799 tx_tx_done_data_read 3-0 6799 NULL ++qlcnic_fw_cmd_create_rx_ctx_6800 qlcnic_fw_cmd_create_rx_ctx 0 6800 NULL nohasharray ++broken_parity_status_store_6800 broken_parity_status_store 0-4 6800 &qlcnic_fw_cmd_create_rx_ctx_6800 ++get_blocks_6801 get_blocks 0 6801 NULL ++rounded_hashtable_size_6802 rounded_hashtable_size 0 6802 NULL ++i7core_inject_store_rank_6803 i7core_inject_store_rank 0-4 6803 NULL ++il3945_store_tx_power_6804 il3945_store_tx_power 0-4 6804 NULL ++iscsi_stat_login_show_attr_indx_6806 iscsi_stat_login_show_attr_indx 0 6806 NULL ++init_port_6810 init_port 0 6810 NULL ++wait_for_bulk_in_ready_6814 wait_for_bulk_in_ready 0 6814 NULL ++__chksum_finup_6816 __chksum_finup 0 6816 NULL ++codec_reg_show_6818 codec_reg_show 0 6818 NULL nohasharray ++bcm_tx_setup_6818 bcm_tx_setup 0 6818 &codec_reg_show_6818 ++rfcomm_send_frame_6819 rfcomm_send_frame 3 6819 NULL ++lbs_rdrf_write_6826 lbs_rdrf_write 3-0 6826 NULL nohasharray ++host_reset_6826 host_reset 0 6826 &lbs_rdrf_write_6826 ++xfs_bmap_first_unused_6827 xfs_bmap_first_unused 0 6827 NULL ++pca_xfer_6828 pca_xfer 0-3 6828 NULL ++f_tempsense_rd_6829 f_tempsense_rd 0 6829 NULL ++calc_pages_for_6838 calc_pages_for 0-2-1 6838 NULL ++blk_alloc_flush_queue_6839 blk_alloc_flush_queue 3 6839 NULL ++mon_bin_read_6841 mon_bin_read 3-0 6841 NULL ++snd_cs4281_BA0_read_6847 snd_cs4281_BA0_read 5-0 6847 NULL ++__extent_writepage_io_6848 __extent_writepage_io 0 6848 NULL ++hw_breakpoint_exceptions_notify_6850 hw_breakpoint_exceptions_notify 0 6850 NULL ++atmtcp_recv_control_6851 atmtcp_recv_control 0 6851 NULL nohasharray ++xfs_rtany_summary_6851 xfs_rtany_summary 0 6851 &atmtcp_recv_control_6851 ++nilfs_segctor_collect_blocks_6852 nilfs_segctor_collect_blocks 0 6852 NULL nohasharray ++iwl_dbgfs_d0i3_refs_write_6852 iwl_dbgfs_d0i3_refs_write 0-3 6852 &nilfs_segctor_collect_blocks_6852 ++as3722_gpio_to_irq_6861 as3722_gpio_to_irq 2 6861 NULL ++inode_getxattr_6862 inode_getxattr 0 6862 NULL nohasharray ++pn_send_6862 pn_send 0 6862 &inode_getxattr_6862 ++i7core_inject_show_page_6864 i7core_inject_show_page 0 6864 NULL ++perf_output_sample_ustack_6868 perf_output_sample_ustack 2 6868 NULL nohasharray ++iscsi_stat_instance_show_attr_vendor_6868 iscsi_stat_instance_show_attr_vendor 0 6868 &perf_output_sample_ustack_6868 ++subdev_s_ctrl_6869 subdev_s_ctrl 0 6869 NULL ++ecryptfs_write_lower_6870 ecryptfs_write_lower 0-4 6870 NULL ++size_6873 size 0 6873 NULL ++ax88772_link_reset_6876 ax88772_link_reset 0 6876 NULL ++sm501_gpio_input_6877 sm501_gpio_input 0 6877 NULL nohasharray ++store_rotate_6877 store_rotate 0-4 6877 &sm501_gpio_input_6877 ++dio_complete_6879 dio_complete 0-2-3 6879 NULL ++otg_mode_store_6882 otg_mode_store 0-4 6882 NULL ++nes_netdev_open_6886 nes_netdev_open 0 6886 NULL ++resize_async_buffer_6887 resize_async_buffer 3 6887 NULL ++raw_seticmpfilter_6888 raw_seticmpfilter 3-0 6888 NULL nohasharray ++ieee80211_if_fmt_path_refresh_time_6888 ieee80211_if_fmt_path_refresh_time 3 6888 &raw_seticmpfilter_6888 nohasharray ++show_type_6888 show_type 0 6888 &ieee80211_if_fmt_path_refresh_time_6888 ++dlmfs_file_write_6892 dlmfs_file_write 3-0 6892 NULL ++show_fcstat_fc_seq_not_found_6897 show_fcstat_fc_seq_not_found 0 6897 NULL nohasharray ++iscsi_tpg_param_show_DefaultTime2Retain_6897 iscsi_tpg_param_show_DefaultTime2Retain 0 6897 &show_fcstat_fc_seq_not_found_6897 ++max_write_same_blocks_show_6899 max_write_same_blocks_show 0 6899 NULL ++wq_nice_store_6901 wq_nice_store 0-4 6901 NULL ++veth_change_mtu_6902 veth_change_mtu 0 6902 NULL nohasharray ++ext4_inode_bitmap_6902 ext4_inode_bitmap 0 6902 &veth_change_mtu_6902 ++acerhdf_get_trip_temp_6903 acerhdf_get_trip_temp 0 6903 NULL ++hook_6905 hook 0 6905 NULL nohasharray ++qib_init_6905 qib_init 0 6905 &hook_6905 ++target_core_alua_lu_gp_show_attr_lu_gp_id_6909 target_core_alua_lu_gp_show_attr_lu_gp_id 0 6909 NULL ++show_tolerance_6910 show_tolerance 0 6910 NULL nohasharray ++wl1251_hw_init_data_path_config_6910 wl1251_hw_init_data_path_config 0 6910 &show_tolerance_6910 ++proc_sessionid_read_6911 proc_sessionid_read 3-0 6911 NULL nohasharray ++ucma_write_6911 ucma_write 0-3 6911 &proc_sessionid_read_6911 nohasharray ++acm_alloc_minor_6911 acm_alloc_minor 0 6911 &ucma_write_6911 ++humidity1_input_show_6912 humidity1_input_show 0 6912 NULL ++__kfifo_dma_in_finish_r_6913 __kfifo_dma_in_finish_r 2-3 6913 NULL ++ioctl_6914 ioctl 0 6914 NULL ++csio_vport_disable_6917 csio_vport_disable 0 6917 NULL ++do_msgrcv_6921 do_msgrcv 3 6921 NULL nohasharray ++qlcnic_82xx_fw_cmd_create_tx_ctx_6921 qlcnic_82xx_fw_cmd_create_tx_ctx 0 6921 &do_msgrcv_6921 nohasharray ++sm501fb_check_var_crt_6921 sm501fb_check_var_crt 0 6921 &qlcnic_82xx_fw_cmd_create_tx_ctx_6921 ++__vxge_hw_mempool_create_6923 __vxge_hw_mempool_create 3-2-6 6923 NULL nohasharray ++nfs3_proc_statfs_6923 nfs3_proc_statfs 0 6923 &__vxge_hw_mempool_create_6923 ++reg_set_state_6924 reg_set_state 0-4 6924 NULL ++cache_do_downcall_6926 cache_do_downcall 3-0 6926 NULL nohasharray ++vb2_internal_dqbuf_6926 vb2_internal_dqbuf 0 6926 &cache_do_downcall_6926 ++ipath_verbs_send_dma_6929 ipath_verbs_send_dma 6 6929 NULL ++create_multi_out_ctls_6930 create_multi_out_ctls 0 6930 NULL ++__c2port_show_dev_id_6936 __c2port_show_dev_id 0 6936 NULL ++__rpc_pipefs_event_6942 __rpc_pipefs_event 0 6942 NULL ++qsfp_cks_6945 qsfp_cks 2-0 6945 NULL ++hih6130_show_humidity_6948 hih6130_show_humidity 0 6948 NULL ++ab3100_get_register_page_interruptible_6951 ab3100_get_register_page_interruptible 4-0 6951 NULL ++str_to_slot_6952 str_to_slot 0 6952 NULL ++crypto_ahash_update_6959 crypto_ahash_update 0 6959 NULL nohasharray ++nilfs_segctor_extend_segments_6959 nilfs_segctor_extend_segments 0 6959 &crypto_ahash_update_6959 ++shash_update_unaligned_6960 shash_update_unaligned 0 6960 NULL ++pch_uart_hal_read_6961 pch_uart_hal_read 0 6961 NULL ++videobuf_dma_init_kernel_6963 videobuf_dma_init_kernel 3-0 6963 NULL nohasharray ++read_usattenuation_6963 read_usattenuation 0 6963 &videobuf_dma_init_kernel_6963 nohasharray ++check_max_sdu_6963 check_max_sdu 0 6963 &read_usattenuation_6963 ++in_intr_mask_show_6971 in_intr_mask_show 0 6971 NULL ++i40e_dbg_dump_write_6973 i40e_dbg_dump_write 3-0 6973 NULL nohasharray ++rsa_extract_mpi_6973 rsa_extract_mpi 5 6973 &i40e_dbg_dump_write_6973 ++acpi_lpss_platform_notify_6980 acpi_lpss_platform_notify 0 6980 NULL ++ismt_process_desc_6981 ismt_process_desc 0 6981 NULL ++request_key_async_6990 request_key_async 4 6990 NULL ++store_spi_transport_max_qas_6996 store_spi_transport_max_qas 0-4 6996 NULL ++r871x_set_wpa_ie_7000 r871x_set_wpa_ie 3 7000 NULL ++b43legacy_phy_init_7003 b43legacy_phy_init 0 7003 NULL ++qlcnic_sysfs_validate_crb_7004 qlcnic_sysfs_validate_crb 0 7004 NULL nohasharray ++fanotify_handle_event_7004 fanotify_handle_event 0 7004 &qlcnic_sysfs_validate_crb_7004 ++log_wait_commit_7005 log_wait_commit 0 7005 NULL ++cipso_v4_gentag_enum_7006 cipso_v4_gentag_enum 0 7006 NULL ++tracing_cpumask_read_7010 tracing_cpumask_read 3 7010 NULL ++copy_items_7012 copy_items 7 7012 NULL ++ld_usb_write_7022 ld_usb_write 3-0 7022 NULL ++get_performance_level_7023 get_performance_level 0 7023 NULL nohasharray ++c2_pseudo_up_7023 c2_pseudo_up 0 7023 &get_performance_level_7023 ++uwb_rc_mac_addr_store_7027 uwb_rc_mac_addr_store 0-4 7027 NULL ++snd_pcm_do_resume_7028 snd_pcm_do_resume 0 7028 NULL ++reserved_show_7029 reserved_show 0 7029 NULL nohasharray ++ath9k_tx99_init_7029 ath9k_tx99_init 0 7029 &reserved_show_7029 ++wimax_msg_7030 wimax_msg 4 7030 NULL ++ceph_kvmalloc_7033 ceph_kvmalloc 1 7033 NULL ++nilfs_segments_attr_store_7037 nilfs_segments_attr_store 0-4 7037 NULL ++stmmac_hw_setup_7038 stmmac_hw_setup 0 7038 NULL ++metrics_bytes_identical_show_7039 metrics_bytes_identical_show 0 7039 NULL ++nilfs_cpfile_get_checkpoint_block_7041 nilfs_cpfile_get_checkpoint_block 0 7041 NULL ++ipath_get_base_info_7043 ipath_get_base_info 3-0 7043 NULL ++show_fcoe_fcf_device_fc_map_7044 show_fcoe_fcf_device_fc_map 0 7044 NULL ++ath5k_hw_rf5111_chan2athchan_7051 ath5k_hw_rf5111_chan2athchan 0 7051 NULL ++show_sas_expander_component_vendor_id_7054 show_sas_expander_component_vendor_id 0 7054 NULL ++snd_intel8x0_ali_trigger_7055 snd_intel8x0_ali_trigger 0 7055 NULL ++amd64_hole_show_7057 amd64_hole_show 0 7057 NULL nohasharray ++sctp_make_op_error_7057 sctp_make_op_error 6-5 7057 &amd64_hole_show_7057 ++rs5c_get_regs_7062 rs5c_get_regs 0 7062 NULL ++srpt_tpg_show_enable_7063 srpt_tpg_show_enable 0 7063 NULL nohasharray ++nouveau_device_create__7063 nouveau_device_create_ 7 7063 &srpt_tpg_show_enable_7063 ++store_hardware_switching_mode_7064 store_hardware_switching_mode 0-4 7064 NULL ++gart_mapping_error_7065 gart_mapping_error 0-2 7065 NULL ++target_stat_scsi_auth_intr_show_attr_dev_7066 target_stat_scsi_auth_intr_show_attr_dev 0 7066 NULL nohasharray ++csio_store_dbg_level_7066 csio_store_dbg_level 0-4 7066 &target_stat_scsi_auth_intr_show_attr_dev_7066 ++filename_lookup_7071 filename_lookup 0 7071 NULL ++hci_sock_recvmsg_7072 hci_sock_recvmsg 0-4 7072 NULL ++l2cap_sock_getname_7074 l2cap_sock_getname 0 7074 NULL nohasharray ++event_enable_read_7074 event_enable_read 3 7074 &l2cap_sock_getname_7074 ++mii_status_show_7077 mii_status_show 0 7077 NULL ++sh_mobile_ceu_videobuf_setup_7080 sh_mobile_ceu_videobuf_setup 0 7080 NULL ++zd_ioread16v_locked_7082 zd_ioread16v_locked 0 7082 NULL ++read_7087 read 0 7087 NULL nohasharray ++queue_requests_show_7087 queue_requests_show 0 7087 &read_7087 ++beacon_interval_read_7091 beacon_interval_read 3-0 7091 NULL nohasharray ++tipc_send_packet_7091 tipc_send_packet 4-0 7091 &beacon_interval_read_7091 ++show_session_param_ISCSI_PARAM_PDU_INORDER_EN_7095 show_session_param_ISCSI_PARAM_PDU_INORDER_EN 0 7095 NULL nohasharray ++ecryptfs_add_new_key_tfm_7095 ecryptfs_add_new_key_tfm 0 7095 &show_session_param_ISCSI_PARAM_PDU_INORDER_EN_7095 ++raw_pci_read_7098 raw_pci_read 0 7098 NULL nohasharray ++cfq_target_latency_show_7098 cfq_target_latency_show 0 7098 &raw_pci_read_7098 ++journal_begin_7100 journal_begin 0 7100 NULL nohasharray ++nfs_writepage_7100 nfs_writepage 0 7100 &journal_begin_7100 ++cifs_wait_mtu_credits_7101 cifs_wait_mtu_credits 0 7101 NULL ++pipeline_enc_rx_stat_fifo_int_read_7107 pipeline_enc_rx_stat_fifo_int_read 3-0 7107 NULL ++uwb_rc_scan_show_7108 uwb_rc_scan_show 0 7108 NULL ++uwb_rc_beacon_store_7110 uwb_rc_beacon_store 0-4 7110 NULL ++ed_schedule_7117 ed_schedule 0 7117 NULL nohasharray ++xfs_attr3_leaf_split_7117 xfs_attr3_leaf_split 0 7117 &ed_schedule_7117 ++nilfs_mdt_insert_new_block_7118 nilfs_mdt_insert_new_block 0 7118 NULL ++show_value_7119 show_value 0 7119 NULL ++osc_resend_count_seq_write_7120 osc_resend_count_seq_write 3 7120 NULL ++zd_iowrite32_7126 zd_iowrite32 0 7126 NULL ++r8a66597_start_7127 r8a66597_start 0 7127 NULL ++psmouse_attr_set_protocol_7128 psmouse_attr_set_protocol 0-4 7128 NULL ++rtl2832_sdr_wr_7132 rtl2832_sdr_wr 0 7132 NULL ++send_mpa_reject_7135 send_mpa_reject 3 7135 NULL ++qlcnic_enable_msix_7144 qlcnic_enable_msix 2 7144 NULL ++gfs2_setxattr_7146 gfs2_setxattr 0 7146 NULL ++show_bpp_7148 show_bpp 0 7148 NULL ++adc128_set_temp_7149 adc128_set_temp 0-4 7149 NULL ++pscsi_show_configfs_dev_params_7152 pscsi_show_configfs_dev_params 0 7152 NULL ++sky2_get_eeprom_len_7154 sky2_get_eeprom_len 0 7154 NULL ++set_lcd_level_7155 set_lcd_level 0 7155 NULL ++fnic_reset_7163 fnic_reset 0 7163 NULL ++r8a66597_enable_7164 r8a66597_enable 0 7164 NULL ++show_counter_rx_icrc_errs_7167 show_counter_rx_icrc_errs 0 7167 NULL ++core_alua_write_tpg_metadata_7168 core_alua_write_tpg_metadata 3 7168 NULL ++i2c_xfer_7177 i2c_xfer 0-3 7177 NULL ++fsp_attr_set_flags_7182 fsp_attr_set_flags 0-4 7182 NULL nohasharray ++set_rdac1_7182 set_rdac1 4-0 7182 &fsp_attr_set_flags_7182 nohasharray ++ext4_attr_store_7182 ext4_attr_store 0-4 7182 &set_rdac1_7182 ++f_hid_opts_report_desc_store_7188 f_hid_opts_report_desc_store 3 7188 NULL ++snd_mask_refine_max_7191 snd_mask_refine_max 0 7191 NULL nohasharray ++ath10k_install_key_7191 ath10k_install_key 0 7191 &snd_mask_refine_max_7191 ++wl1271_init_pta_7195 wl1271_init_pta 0 7195 NULL ++hfsplus_hash_dentry_7198 hfsplus_hash_dentry 0 7198 NULL ++ext3_xattr_ibody_list_7201 ext3_xattr_ibody_list 0 7201 NULL ++__alloc_objio_seg_7203 __alloc_objio_seg 1 7203 NULL ++sysfs_kf_bin_read_7205 sysfs_kf_bin_read 0-4-3 7205 NULL ++batadv_check_unicast_ttvn_7206 batadv_check_unicast_ttvn 3 7206 NULL ++adjd_s311_update_scan_mode_7208 adjd_s311_update_scan_mode 0 7208 NULL ++fsg_common_set_nluns_7209 fsg_common_set_nluns 2 7209 NULL ++confirm_7211 confirm 0 7211 NULL ++tpm_rng_read_7214 tpm_rng_read 0 7214 NULL ++of_dma_match_channel_7216 of_dma_match_channel 3 7216 NULL ++acpi_device_uid_show_7226 acpi_device_uid_show 0 7226 NULL nohasharray ++ipoib_set_mode_7226 ipoib_set_mode 0 7226 &acpi_device_uid_show_7226 ++usblp_wtest_7227 usblp_wtest 0 7227 NULL ++rpm_suspend_7228 rpm_suspend 0 7228 NULL nohasharray ++evtchn_2l_max_channels_7228 evtchn_2l_max_channels 0 7228 &rpm_suspend_7228 ++edd_show_info_flags_7231 edd_show_info_flags 0 7231 NULL nohasharray ++x1205_sysfs_show_dtrim_7231 x1205_sysfs_show_dtrim 0 7231 &edd_show_info_flags_7231 ++rocker_flow_tbl_acl_7233 rocker_flow_tbl_acl 0 7233 NULL ++usb488_device_capabilities_show_7238 usb488_device_capabilities_show 0 7238 NULL nohasharray ++fm10k_update_vlan_pf_7238 fm10k_update_vlan_pf 0 7238 &usb488_device_capabilities_show_7238 ++rxrpc_listen_7242 rxrpc_listen 0 7242 NULL ++iscsi_tpg_param_store_MaxRecvDataSegmentLength_7243 iscsi_tpg_param_store_MaxRecvDataSegmentLength 0-3 7243 NULL ++show_fnode_targetalias_7247 show_fnode_targetalias 0 7247 NULL ++af_alg_make_sg_7254 af_alg_make_sg 0-3 7254 NULL ++dpm_run_callback_7257 dpm_run_callback 0 7257 NULL ++release_version_show_7263 release_version_show 0 7263 NULL ++max8998_bulk_read_7265 max8998_bulk_read 0 7265 NULL ++snd_mask_refine_7267 snd_mask_refine 0 7267 NULL ++dma_ops_alloc_addresses_7272 dma_ops_alloc_addresses 0-3-4-5 7272 NULL nohasharray ++ssb_bus_resume_7272 ssb_bus_resume 0 7272 &dma_ops_alloc_addresses_7272 ++palmas_update_bits_7273 palmas_update_bits 0 7273 NULL ++htu21_show_humidity_7275 htu21_show_humidity 0 7275 NULL ++radeon_hw_i2c_xfer_7280 radeon_hw_i2c_xfer 0-3 7280 NULL nohasharray ++smack_task_setnice_7280 smack_task_setnice 0 7280 &radeon_hw_i2c_xfer_7280 ++kvm_suspend_7281 kvm_suspend 0 7281 NULL ++kimage_alloc_init_7282 kimage_alloc_init 3 7282 NULL nohasharray ++rx_rate_rx_frames_per_rates_read_7282 rx_rate_rx_frames_per_rates_read 3-0 7282 &kimage_alloc_init_7282 ++iwl_pcie_load_firmware_chunk_7284 iwl_pcie_load_firmware_chunk 0 7284 NULL ++bond_option_arp_all_targets_set_7285 bond_option_arp_all_targets_set 0 7285 NULL ++show_conn_param_ISCSI_PARAM_RECV_TMO_7290 show_conn_param_ISCSI_PARAM_RECV_TMO 0 7290 NULL nohasharray ++setup_idle_tx_channel_7290 setup_idle_tx_channel 0 7290 &show_conn_param_ISCSI_PARAM_RECV_TMO_7290 ++isku_sysfs_write_macro_7293 isku_sysfs_write_macro 6-0-5 7293 NULL ++sctp_primitive_ASSOCIATE_7303 sctp_primitive_ASSOCIATE 0 7303 NULL ++uvesafb_show_vbe_modes_7306 uvesafb_show_vbe_modes 0 7306 NULL ++rose_open_7309 rose_open 0 7309 NULL ++bd2802_store_reg0x11_7311 bd2802_store_reg0x11 0-4 7311 NULL ++ixgbe_fcoe_ddp_setup_7318 ixgbe_fcoe_ddp_setup 4 7318 NULL ++security_inode_need_killpriv_7322 security_inode_need_killpriv 0 7322 NULL ++wait_on_sync_kiocb_7327 wait_on_sync_kiocb 0 7327 NULL ++queue_discard_max_show_7328 queue_discard_max_show 0 7328 NULL ++do_md_stop_7335 do_md_stop 0 7335 NULL ++show_fnode_ipaddress_7338 show_fnode_ipaddress 0 7338 NULL ++ov772x_set_params_7342 ov772x_set_params 0 7342 NULL ++mgmt_control_7349 mgmt_control 3 7349 NULL ++t1_get_slice_7350 t1_get_slice 0 7350 NULL ++diva_xdi_read_7357 diva_xdi_read 0 7357 NULL ++btrfs_listxattr_7359 btrfs_listxattr 0-3 7359 NULL ++bop_delete_7361 bop_delete 0 7361 NULL nohasharray ++carmine_set_par_7361 carmine_set_par 0 7361 &bop_delete_7361 ++ext3_free_blocks_7362 ext3_free_blocks 4-3 7362 NULL ++nfs_fsync_dir_7363 nfs_fsync_dir 0 7363 NULL ++koneplus_sysfs_read_info_7367 koneplus_sysfs_read_info 0-5-6 7367 NULL ++ieee80211_if_read_dot11MeshHWMPactivePathTimeout_7368 ieee80211_if_read_dot11MeshHWMPactivePathTimeout 3-0 7368 NULL ++schedule_timeout_7371 schedule_timeout 0 7371 NULL ++rds_setsockopt_7372 rds_setsockopt 0 7372 NULL ++audit_send_reply_7376 audit_send_reply 7 7376 NULL ++bind_mode_store_7379 bind_mode_store 0-3 7379 NULL ++xfs_btree_delete_7384 xfs_btree_delete 0 7384 NULL ++pm8001_chip_ssp_tm_req_7387 pm8001_chip_ssp_tm_req 0 7387 NULL ++hweight_long_7388 hweight_long 0-1 7388 NULL ++bond_opt_tryset_rtnl_7392 bond_opt_tryset_rtnl 0 7392 NULL ++carrier_store_7396 carrier_store 4-0 7396 NULL nohasharray ++sl_change_mtu_7396 sl_change_mtu 0-2 7396 &carrier_store_7396 ++_ore_add_stripe_unit_7399 _ore_add_stripe_unit 3-6-0 7399 NULL ++audmux_read_file_7400 audmux_read_file 3-0 7400 NULL ++__rtc_read_time_7401 __rtc_read_time 0 7401 NULL ++tipc_recvmsg_7402 tipc_recvmsg 0-4 7402 NULL ++drm_property_create_blob_7414 drm_property_create_blob 2 7414 NULL ++cfhsi_fifo_occupancy_7417 cfhsi_fifo_occupancy 0 7417 NULL ++store_7418 store 0-3 7418 NULL ++switch_mm_7420 switch_mm 0 7420 NULL ++rds_blckcnt_7435 rds_blckcnt 0 7435 NULL ++cxacru_sysfs_store_adsl_state_7437 cxacru_sysfs_store_adsl_state 0-4 7437 NULL ++SendReceiveNoRsp_7438 SendReceiveNoRsp 0 7438 NULL ++romfs_dev_read_7439 romfs_dev_read 0 7439 NULL ++store_7441 store 0 7441 NULL ++bq2415x_get_termination_current_7443 bq2415x_get_termination_current 0 7443 NULL ++acpi_ex_create_processor_7444 acpi_ex_create_processor 0 7444 NULL ++show_mask_7446 show_mask 0 7446 NULL ++ip_options_get_alloc_7448 ip_options_get_alloc 1 7448 NULL nohasharray ++acpi_ex_create_region_7448 acpi_ex_create_region 0 7448 &ip_options_get_alloc_7448 nohasharray ++pci_map_page_7448 pci_map_page 0-3 7448 &acpi_ex_create_region_7448 ++make_node_dirty_7452 make_node_dirty 0 7452 NULL ++SYSC_setgroups_7454 SYSC_setgroups 1 7454 NULL nohasharray ++crypto_sha512_update_7454 crypto_sha512_update 0 7454 &SYSC_setgroups_7454 ++rt2x00debug_read_queue_stats_7455 rt2x00debug_read_queue_stats 3-0 7455 NULL ++show_iface_discovery_logout_7460 show_iface_discovery_logout 0 7460 NULL ++l2tp_ip6_sendmsg_7461 l2tp_ip6_sendmsg 0-4 7461 NULL nohasharray ++rose_listen_7461 rose_listen 0 7461 &l2tp_ip6_sendmsg_7461 ++store_auto_pwm_7463 store_auto_pwm 0-4 7463 NULL ++wm8996_gpio_direction_out_7469 wm8996_gpio_direction_out 0 7469 NULL ++set_speed_7470 set_speed 0-4 7470 NULL ++garp_request_join_7471 garp_request_join 4 7471 NULL nohasharray ++ReadHSCX_7471 ReadHSCX 0 7471 &garp_request_join_7471 ++xcan_chip_start_7472 xcan_chip_start 0 7472 NULL ++show_max_uV_7474 show_max_uV 0 7474 NULL ++snd_seq_ioctl_unsubscribe_port_7481 snd_seq_ioctl_unsubscribe_port 0 7481 NULL ++atalk_getname_7490 atalk_getname 0 7490 NULL ++snd_pcm_lib_read1_7491 snd_pcm_lib_read1 0-3 7491 NULL ++setsockopt_7492 setsockopt 0 7492 NULL ++__padata_add_cpu_7497 __padata_add_cpu 0 7497 NULL ++prism2_change_mtu_7498 prism2_change_mtu 0 7498 NULL ++ntb_netdev_open_7505 ntb_netdev_open 0 7505 NULL ++sdhci_alloc_host_7509 sdhci_alloc_host 2 7509 NULL ++jump_label_add_module_7513 jump_label_add_module 0 7513 NULL ++logfs_readpage_nolock_7514 logfs_readpage_nolock 0 7514 NULL ++array_zalloc_7519 array_zalloc 1-2 7519 NULL ++xfs_fs_statfs_7522 xfs_fs_statfs 0 7522 NULL nohasharray ++tg3_writephy_7522 tg3_writephy 0 7522 &xfs_fs_statfs_7522 ++qlcnic_napi_add_7526 qlcnic_napi_add 0 7526 NULL ++debug_dma_map_page_7528 debug_dma_map_page 6 7528 NULL ++show_prot_capabilities_7532 show_prot_capabilities 0 7532 NULL ++vfio_device_fops_write_7537 vfio_device_fops_write 0-3 7537 NULL ++virtnet_open_7538 virtnet_open 0 7538 NULL ++target_core_hba_show_attr_hba_info_7539 target_core_hba_show_attr_hba_info 0 7539 NULL ++hermes_write_ltv_7541 hermes_write_ltv 0 7541 NULL ++pinmux_request_gpio_7543 pinmux_request_gpio 0 7543 NULL ++smb_send_rqst_7549 smb_send_rqst 0 7549 NULL nohasharray ++write_begin_slow_7549 write_begin_slow 0 7549 &smb_send_rqst_7549 ++input_dev_show_id_version_7550 input_dev_show_id_version 0 7550 NULL ++snd_pcm_plugin_build_route_7551 snd_pcm_plugin_build_route 0 7551 NULL ++ahci_transmit_led_message_7552 ahci_transmit_led_message 0-3 7552 NULL ++goal_in_my_reservation_7553 goal_in_my_reservation 3 7553 NULL ++store_chip_reset_7556 store_chip_reset 0-4 7556 NULL ++ath10k_read_htt_stats_mask_7557 ath10k_read_htt_stats_mask 3-0 7557 NULL nohasharray ++superio_enter_7557 superio_enter 0 7557 &ath10k_read_htt_stats_mask_7557 ++xfs_file_dio_aio_write_7559 xfs_file_dio_aio_write 0 7559 NULL ++store_bank2_setting_7560 store_bank2_setting 0-4 7560 NULL ++smk_read_mapped_7562 smk_read_mapped 3-0 7562 NULL ++netvsc_get_slots_7565 netvsc_get_slots 0 7565 NULL ++chan_alloc_skb_cb_7571 chan_alloc_skb_cb 3-2 7571 NULL nohasharray ++cfs_cpt_num_estimate_7571 cfs_cpt_num_estimate 0 7571 &chan_alloc_skb_cb_7571 ++get_pwm_en_7576 get_pwm_en 0 7576 NULL ++target_fabric_nacl_auth_attr_show_7584 target_fabric_nacl_auth_attr_show 0 7584 NULL ++zd_chip_lock_phy_regs_7589 zd_chip_lock_phy_regs 0 7589 NULL ++ext3_try_to_allocate_7590 ext3_try_to_allocate 3-0-5 7590 NULL ++fsp_attr_show_hscroll_7598 fsp_attr_show_hscroll 0 7598 NULL nohasharray ++bond_option_updelay_set_7598 bond_option_updelay_set 0 7598 &fsp_attr_show_hscroll_7598 ++pre_rsb_struct_7599 pre_rsb_struct 0 7599 NULL ++show_iface_vlan_id_7601 show_iface_vlan_id 0 7601 NULL ++m88e1111_config_init_7609 m88e1111_config_init 0 7609 NULL ++snd_azf3328_pcm_trigger_7613 snd_azf3328_pcm_trigger 0 7613 NULL ++groups_alloc_7614 groups_alloc 1 7614 NULL nohasharray ++create_dir_7614 create_dir 0 7614 &groups_alloc_7614 nohasharray ++scan_secs_write_7614 scan_secs_write 3-0 7614 &create_dir_7614 ++__b44_readphy_7624 __b44_readphy 0 7624 NULL ++send_to_group_7627 send_to_group 0 7627 NULL ++pch_udc_start_7631 pch_udc_start 0 7631 NULL ++hw_port_test_set_7633 hw_port_test_set 0 7633 NULL ++show_pwm_auto_spinup_min_7635 show_pwm_auto_spinup_min 0 7635 NULL ++net2272_queue_7640 net2272_queue 0 7640 NULL ++show_tcrit1_hyst_7645 show_tcrit1_hyst 0 7645 NULL ++write_priomap_7648 write_priomap 0-3 7648 NULL ++ceph_fsync_7650 ceph_fsync 0 7650 NULL ++ipath_sdma_get_inflight_7652 ipath_sdma_get_inflight 0 7652 NULL nohasharray ++iwl_pcie_nic_init_7652 iwl_pcie_nic_init 0 7652 &ipath_sdma_get_inflight_7652 ++xfs_bmap_btalloc_nullfb_7654 xfs_bmap_btalloc_nullfb 0 7654 NULL ++show_fc_rport_supported_classes_7658 show_fc_rport_supported_classes 0 7658 NULL ++fault_inject_write_7662 fault_inject_write 3-0 7662 NULL ++ds1305_set_alarm_7667 ds1305_set_alarm 0 7667 NULL ++acpi_bus_init_power_7670 acpi_bus_init_power 0 7670 NULL ++tcm_qla2xxx_tpg_attrib_store_generate_node_acls_7674 tcm_qla2xxx_tpg_attrib_store_generate_node_acls 0-3 7674 NULL ++b43legacy_upload_microcode_7683 b43legacy_upload_microcode 0 7683 NULL nohasharray ++fm10k_setup_tx_resources_7683 fm10k_setup_tx_resources 0 7683 &b43legacy_upload_microcode_7683 ++acpi_ex_allocate_name_string_7685 acpi_ex_allocate_name_string 1-2 7685 NULL nohasharray ++skb_copy_expand_7685 skb_copy_expand 3-2 7685 &acpi_ex_allocate_name_string_7685 ++card_id_store_attr_7688 card_id_store_attr 0-4 7688 NULL ++ip_options_get_finish_7691 ip_options_get_finish 0 7691 NULL ++device_show_7693 device_show 0 7693 NULL nohasharray ++tpu_pwm_set_polarity_7693 tpu_pwm_set_polarity 0 7693 &device_show_7693 ++xfs_da3_blk_link_7697 xfs_da3_blk_link 0 7697 NULL ++acpi_ns_get_pathname_length_7699 acpi_ns_get_pathname_length 0 7699 NULL ++affs_hash_dentry_7703 affs_hash_dentry 0 7703 NULL nohasharray ++bnx2_init_nic_7703 bnx2_init_nic 0 7703 &affs_hash_dentry_7703 ++dev_info_set_7705 dev_info_set 0 7705 NULL ++ds2781_get_rsgain_setting_7708 ds2781_get_rsgain_setting 0 7708 NULL nohasharray ++dev_write_7708 dev_write 0-3 7708 &ds2781_get_rsgain_setting_7708 ++unmap_region_7709 unmap_region 1 7709 NULL ++nilfs_segbuf_write_7710 nilfs_segbuf_write 0 7710 NULL ++show_7711 show 0 7711 NULL ++dbg_check_cats_7713 dbg_check_cats 0 7713 NULL ++sys_pread64_7721 sys_pread64 3 7721 NULL ++pci_raw_set_power_state_7729 pci_raw_set_power_state 0 7729 NULL ++emul_temp_store_7730 emul_temp_store 0-4 7730 NULL ++__btrfs_add_ordered_extent_7745 __btrfs_add_ordered_extent 0 7745 NULL nohasharray ++bitmap_read_sb_7745 bitmap_read_sb 0 7745 &__btrfs_add_ordered_extent_7745 ++ip_vs_forward_icmp_7747 ip_vs_forward_icmp 0 7747 NULL ++ndo_set_mac_address_7748 ndo_set_mac_address 0 7748 NULL ++ina2xx_show_value_7749 ina2xx_show_value 0 7749 NULL ++write_7751 write 0 7751 NULL ++vxge_device_register_7752 vxge_device_register 4 7752 NULL ++snd_seq_set_queue_tempo_7755 snd_seq_set_queue_tempo 0 7755 NULL ++snd_seq_ioctl_set_queue_timer_7760 snd_seq_ioctl_set_queue_timer 0 7760 NULL ++isl12022_rtc_read_time_7761 isl12022_rtc_read_time 0 7761 NULL ++b43_wireless_core_init_7762 b43_wireless_core_init 0 7762 NULL ++ubi_io_read_vid_hdr_7766 ubi_io_read_vid_hdr 0 7766 NULL ++iwl_dbgfs_bt_cmd_read_7770 iwl_dbgfs_bt_cmd_read 3-0 7770 NULL ++lpfc_used_vpi_show_7773 lpfc_used_vpi_show 0 7773 NULL ++alloc_candev_7776 alloc_candev 2-1 7776 NULL ++wcn36xx_smd_open_7779 wcn36xx_smd_open 0 7779 NULL ++solo_start_streaming_7780 solo_start_streaming 0 7780 NULL ++__videobuf_read_start_7782 __videobuf_read_start 0 7782 NULL nohasharray ++iwl_mvm_binding_add_vif_7782 iwl_mvm_binding_add_vif 0 7782 &__videobuf_read_start_7782 ++dfs_global_file_read_7787 dfs_global_file_read 3-0 7787 NULL ++bnx2_nvram_write_7790 bnx2_nvram_write 2-4 7790 NULL ++diva_os_copy_from_user_7792 diva_os_copy_from_user 4 7792 NULL nohasharray ++lustre_packed_msg_size_7792 lustre_packed_msg_size 0 7792 &diva_os_copy_from_user_7792 ++__uncore_wrap_mode_show_7796 __uncore_wrap_mode_show 0 7796 NULL ++pcxhr_pll_freq_register_7798 pcxhr_pll_freq_register 0 7798 NULL ++get_link_af_size_7802 get_link_af_size 0 7802 NULL ++ecm_opts_qmult_show_7809 ecm_opts_qmult_show 0 7809 NULL ++s2250_s_ctrl_7810 s2250_s_ctrl 0 7810 NULL nohasharray ++cnic_netdev_event_7810 cnic_netdev_event 0 7810 &s2250_s_ctrl_7810 ++validate_slab_node_7825 validate_slab_node 0 7825 NULL nohasharray ++gdm_lte_receive_pkt_7825 gdm_lte_receive_pkt 3 7825 &validate_slab_node_7825 ++seq_buf_alloc_7828 seq_buf_alloc 1 7828 NULL nohasharray ++ubifs_leb_read_7828 ubifs_leb_read 0 7828 &seq_buf_alloc_7828 ++nfs_proc_getattr_7829 nfs_proc_getattr 0 7829 NULL ++show_7835 show 0 7835 NULL ++xfs_alloc_find_best_extent_7837 xfs_alloc_find_best_extent 0 7837 NULL ++acpi_execute_simple_method_7840 acpi_execute_simple_method 0 7840 NULL ++enable_7841 enable 0 7841 NULL nohasharray ++il_send_cmd_7841 il_send_cmd 0 7841 &enable_7841 ++intel_fbdev_set_par_7848 intel_fbdev_set_par 0 7848 NULL ++be_mcc_wait_compl_7854 be_mcc_wait_compl 0 7854 NULL ++da9052_reg_update_7858 da9052_reg_update 0 7858 NULL ++cfs_trace_dump_debug_buffer_usrstr_7861 cfs_trace_dump_debug_buffer_usrstr 2 7861 NULL ++snd_intel8x0m_pcm_trigger_7864 snd_intel8x0m_pcm_trigger 0 7864 NULL nohasharray ++ixgbe_set_vfta_82598_7864 ixgbe_set_vfta_82598 0 7864 &snd_intel8x0m_pcm_trigger_7864 nohasharray ++__add_pages_7864 __add_pages 0 7864 &ixgbe_set_vfta_82598_7864 ++hdcs_set_state_7870 hdcs_set_state 0 7870 NULL ++t4_wr_mbox_ns_7872 t4_wr_mbox_ns 0 7872 NULL ++qla2x00_diag_requests_show_7874 qla2x00_diag_requests_show 0 7874 NULL ++tipc_alloc_entry_7875 tipc_alloc_entry 2 7875 NULL nohasharray ++t4_sge_alloc_ctrl_txq_7875 t4_sge_alloc_ctrl_txq 0 7875 &tipc_alloc_entry_7875 ++mac802154_header_create_7877 mac802154_header_create 0 7877 NULL ++request_7878 request 0 7878 NULL ++nilfs_sufile_mark_dirty_7881 nilfs_sufile_mark_dirty 0 7881 NULL nohasharray ++pn533_set_configuration_7881 pn533_set_configuration 4 7881 &nilfs_sufile_mark_dirty_7881 ++gfs2_permission_7884 gfs2_permission 0 7884 NULL ++__ixgbe_enable_sriov_7887 __ixgbe_enable_sriov 0 7887 NULL ++mvs_phy_control_7890 mvs_phy_control 0 7890 NULL nohasharray ++balloon_init_watcher_7890 balloon_init_watcher 0 7890 &mvs_phy_control_7890 ++dvb_dmxdev_read_sec_7892 dvb_dmxdev_read_sec 4-0 7892 NULL ++sctp_assoc_set_id_7894 sctp_assoc_set_id 0 7894 NULL ++xfs_trans_get_efi_7898 xfs_trans_get_efi 2 7898 NULL ++show_7906 show 0 7906 NULL ++ext3_group_extend_7911 ext3_group_extend 3 7911 NULL ++show_volt_min_7916 show_volt_min 0 7916 NULL nohasharray ++acpi_suspend_enter_7916 acpi_suspend_enter 0 7916 &show_volt_min_7916 ++libfc_host_alloc_7917 libfc_host_alloc 2 7917 NULL ++show_pwm_at_crit_7923 show_pwm_at_crit 0 7923 NULL ++wl1251_boot_7924 wl1251_boot 0 7924 NULL ++sdev_show_eh_timeout_7929 sdev_show_eh_timeout 0 7929 NULL ++f_hidg_write_7932 f_hidg_write 3 7932 NULL ++iwl_dbgfs_bt_force_ant_write_7937 iwl_dbgfs_bt_force_ant_write 0-3 7937 NULL ++ata_scsi_park_show_7938 ata_scsi_park_show 0 7938 NULL nohasharray ++qla24xx_vport_create_7938 qla24xx_vport_create 0 7938 &ata_scsi_park_show_7938 ++ali1563_block_7941 ali1563_block 0 7941 NULL nohasharray ++do_set_rxtrig_7941 do_set_rxtrig 0 7941 &ali1563_block_7941 ++wl1271_cmd_ext_radio_parms_7942 wl1271_cmd_ext_radio_parms 0 7942 NULL ++alloc_block_7943 alloc_block 0 7943 NULL nohasharray ++fsnotify_7943 fsnotify 0 7943 &alloc_block_7943 ++target_core_dev_wwn_store_attr_vpd_assoc_logical_unit_7947 target_core_dev_wwn_store_attr_vpd_assoc_logical_unit 0-3 7947 NULL ++get_formats_7949 get_formats 0 7949 NULL ++multicast_membership_interval_show_7950 multicast_membership_interval_show 0 7950 NULL ++ubifs_lpt_post_commit_7952 ubifs_lpt_post_commit 0 7952 NULL ++ixgbe_write_mbx_pf_7953 ixgbe_write_mbx_pf 0 7953 NULL ++integrity_digsig_verify_7956 integrity_digsig_verify 3 7956 NULL ++clk_set_rate_7957 clk_set_rate 0 7957 NULL ++smk_write_load_self_7958 smk_write_load_self 3-0 7958 NULL ++msi2500_ctrl_msg_7960 msi2500_ctrl_msg 0 7960 NULL nohasharray ++can_clear_store_7960 can_clear_store 0-3 7960 &msi2500_ctrl_msg_7960 ++bd2802_store_wave_pattern_7961 bd2802_store_wave_pattern 0-4 7961 NULL ++protection_mode_show_7963 protection_mode_show 0 7963 NULL ++pm8001_ctl_logging_level_store_7964 pm8001_ctl_logging_level_store 0-4 7964 NULL ++sha512_ssse3_update_7971 sha512_ssse3_update 0 7971 NULL ++ath10k_wmi_alloc_skb_7974 ath10k_wmi_alloc_skb 2 7974 NULL ++vidioc_dqbuf_7975 vidioc_dqbuf 0 7975 NULL ++dlm_user_convert_7982 dlm_user_convert 0 7982 NULL ++_block_isbad_7986 _block_isbad 0 7986 NULL nohasharray ++target_fabric_mappedlun_attr_show_7986 target_fabric_mappedlun_attr_show 0 7986 &_block_isbad_7986 nohasharray ++wl1251_acx_event_mbox_mask_7986 wl1251_acx_event_mbox_mask 0 7986 &target_fabric_mappedlun_attr_show_7986 ++sys_mbind_7990 sys_mbind 5 7990 NULL nohasharray ++qlcnic_fw_cmd_set_mtu_7990 qlcnic_fw_cmd_set_mtu 0 7990 &sys_mbind_7990 ++gsc_m2m_buf_prepare_7992 gsc_m2m_buf_prepare 0 7992 NULL ++ipg_nic_stop_7998 ipg_nic_stop 0 7998 NULL ++ipmi_set_timeout_8005 ipmi_set_timeout 0 8005 NULL ++fb_set_par_8006 fb_set_par 0 8006 NULL ++store_8007 store 0-3 8007 NULL ++nfs_commit_inode_8011 nfs_commit_inode 0 8011 NULL ++tt3650_ci_msg_locked_8013 tt3650_ci_msg_locked 4 8013 NULL nohasharray ++ip6gre_tap_init_8013 ip6gre_tap_init 0 8013 &tt3650_ci_msg_locked_8013 ++vcs_read_8017 vcs_read 3-0 8017 NULL ++cx18_s_audio_mode_8020 cx18_s_audio_mode 0 8020 NULL ++aux3_show_8025 aux3_show 0 8025 NULL ++snd_seq_oss_synth_load_patch_8031 snd_seq_oss_synth_load_patch 0 8031 NULL nohasharray ++cifs_sync_write_8031 cifs_sync_write 0 8031 &snd_seq_oss_synth_load_patch_8031 ++ath10k_vdev_start_restart_8033 ath10k_vdev_start_restart 0 8033 NULL ++fuse_copy_fill_8034 fuse_copy_fill 0 8034 NULL ++bma180_show_scale_avail_8040 bma180_show_scale_avail 0 8040 NULL ++security_syslog_8042 security_syslog 0 8042 NULL ++wakeup_last_time_show_8047 wakeup_last_time_show 0 8047 NULL ++iser_rcv_completion_8048 iser_rcv_completion 2 8048 NULL ++fuse_read_single_forget_8058 fuse_read_single_forget 0 8058 NULL ++selinux_task_setnice_8061 selinux_task_setnice 0 8061 NULL ++show_sas_end_dev_ready_led_meaning_8068 show_sas_end_dev_ready_led_meaning 0 8068 NULL ++leb_read_lock_8070 leb_read_lock 0 8070 NULL nohasharray ++reiserfs_sync_file_8070 reiserfs_sync_file 0 8070 &leb_read_lock_8070 nohasharray ++b43legacy_setup_modes_8070 b43legacy_setup_modes 0 8070 &reiserfs_sync_file_8070 ++spi_write_then_read_8073 spi_write_then_read 5-3-0 8073 NULL nohasharray ++dib0700_i2c_xfer_new_8073 dib0700_i2c_xfer_new 0 8073 &spi_write_then_read_8073 nohasharray ++waitwarn_us_write_8073 waitwarn_us_write 3-0 8073 &dib0700_i2c_xfer_new_8073 nohasharray ++set_pwm_8073 set_pwm 0-4 8073 &waitwarn_us_write_8073 ++alloc_targets_8074 alloc_targets 2 8074 NULL nohasharray ++qla4xxx_post_ping_evt_work_8074 qla4xxx_post_ping_evt_work 4 8074 &alloc_targets_8074 nohasharray ++current_has_perm_8074 current_has_perm 0 8074 &qla4xxx_post_ping_evt_work_8074 nohasharray ++reiserfs_setattr_8074 reiserfs_setattr 0 8074 ¤t_has_perm_8074 ++new_id_show_8076 new_id_show 0 8076 NULL nohasharray ++command_setcompressiontarget_8076 command_setcompressiontarget 0 8076 &new_id_show_8076 ++strict_show_8078 strict_show 0 8078 NULL ++room_for_filename_8085 room_for_filename 3 8085 NULL ++elan_smbus_calibrate_8090 elan_smbus_calibrate 0 8090 NULL ++sys_get_trip_type_8091 sys_get_trip_type 0 8091 NULL nohasharray ++store_spd_enb_8091 store_spd_enb 0-4 8091 &sys_get_trip_type_8091 ++fw_suspend_8094 fw_suspend 0 8094 NULL ++ext2_commit_chunk_8097 ext2_commit_chunk 3 8097 NULL ++ds2781_write_8099 ds2781_write 4-3-0 8099 NULL ++input_dev_show_cap_msc_8102 input_dev_show_cap_msc 0 8102 NULL ++csrow_ue_count_show_8104 csrow_ue_count_show 0 8104 NULL ++show_bpdu_guard_8110 show_bpdu_guard 0 8110 NULL ++uart_get_attr_port_8112 uart_get_attr_port 0 8112 NULL ++client_monitor_conn_id_show_8114 client_monitor_conn_id_show 0 8114 NULL ++ds3234_read_time_8117 ds3234_read_time 0 8117 NULL ++pch_i2c_xfer_8118 pch_i2c_xfer 0-3 8118 NULL ++vsp1_video_queue_setup_8120 vsp1_video_queue_setup 0 8120 NULL nohasharray ++gp2ap020a00f_buffer_postenable_8120 gp2ap020a00f_buffer_postenable 0 8120 &vsp1_video_queue_setup_8120 ++venus_lookup_8121 venus_lookup 4 8121 NULL ++start_recovery_write_8122 start_recovery_write 0-3 8122 NULL ++lm3533_als_set_threshold_8125 lm3533_als_set_threshold 0 8125 NULL ++snd_es1968_pcm_prepare_8126 snd_es1968_pcm_prepare 0 8126 NULL ++ieee80211_if_fmt_num_buffered_multicast_8127 ieee80211_if_fmt_num_buffered_multicast 3 8127 NULL ++acpi_ds_build_internal_object_8129 acpi_ds_build_internal_object 0 8129 NULL ++dlm_user_request_8131 dlm_user_request 0 8131 NULL nohasharray ++adp8860_bl_ambient_light_zone_store_8131 adp8860_bl_ambient_light_zone_store 0-4 8131 &dlm_user_request_8131 ++mcs_statistics_write_8132 mcs_statistics_write 0-3 8132 NULL ++next_signal_8135 next_signal 0 8135 NULL ++mt9m111_set_blue_balance_8136 mt9m111_set_blue_balance 0 8136 NULL ++mxt_check_bootloader_8143 mxt_check_bootloader 0 8143 NULL ++iwl_mvm_up_8144 iwl_mvm_up 0 8144 NULL nohasharray ++deadline_front_merges_store_8144 deadline_front_merges_store 3-0 8144 &iwl_mvm_up_8144 ++acpi_ps_complete_this_op_8145 acpi_ps_complete_this_op 0 8145 NULL nohasharray ++xfs_da3_split_8145 xfs_da3_split 0 8145 &acpi_ps_complete_this_op_8145 ++reload_store_8150 reload_store 0-4 8150 NULL ++asd_can_queue_8155 asd_can_queue 0 8155 NULL nohasharray ++drivename_show_8155 drivename_show 0 8155 &asd_can_queue_8155 ++nouveau_hwmon_temp1_auto_point1_temp_hyst_8156 nouveau_hwmon_temp1_auto_point1_temp_hyst 0 8156 NULL ++ocfs2_xattr_trusted_set_8157 ocfs2_xattr_trusted_set 0 8157 NULL ++ath10k_wmi_set_ap_ps_param_8160 ath10k_wmi_set_ap_ps_param 0 8160 NULL ++num_writes_show_8162 num_writes_show 0 8162 NULL ++show_fcstat_fcp_control_requests_8163 show_fcstat_fcp_control_requests 0 8163 NULL ++fm_tx_set_mute_mode_8166 fm_tx_set_mute_mode 0 8166 NULL ++cxacru_sysfs_showattr_s8_8168 cxacru_sysfs_showattr_s8 0 8168 NULL ++power_limit_1_min_uw_show_8172 power_limit_1_min_uw_show 0 8172 NULL ++qib_ctxt_info_8173 qib_ctxt_info 0 8173 NULL ++kxtj9_set_poll_8177 kxtj9_set_poll 0-4 8177 NULL ++dma_map_area_8178 dma_map_area 3-2-5-0 8178 NULL ++ore_truncate_8181 ore_truncate 0 8181 NULL nohasharray ++mlx4_en_activate_tx_ring_8181 mlx4_en_activate_tx_ring 0 8181 &ore_truncate_8181 ++show_iface_max_burst_len_8182 show_iface_max_burst_len 0 8182 NULL ++lp3943_update_bits_8185 lp3943_update_bits 0 8185 NULL ++ieee80211_if_fmt_dot11MeshHoldingTimeout_8187 ieee80211_if_fmt_dot11MeshHoldingTimeout 3 8187 NULL ++write_classid_8189 write_classid 0 8189 NULL ++rx_frame_errors_show_8192 rx_frame_errors_show 0 8192 NULL ++bq2415x_sysfs_set_timer_8199 bq2415x_sysfs_set_timer 0-4 8199 NULL ++bt_sock_wait_ready_8201 bt_sock_wait_ready 0 8201 NULL ++class_osdblk_list_8202 class_osdblk_list 0 8202 NULL ++target_stat_scsi_tgt_dev_show_attr_indx_8203 target_stat_scsi_tgt_dev_show_attr_indx 0 8203 NULL nohasharray ++bond_option_min_links_set_8203 bond_option_min_links_set 0 8203 &target_stat_scsi_tgt_dev_show_attr_indx_8203 ++mt9m111_set_auto_white_balance_8204 mt9m111_set_auto_white_balance 0 8204 NULL ++qlcnic_sysfs_validate_mem_8205 qlcnic_sysfs_validate_mem 0 8205 NULL nohasharray ++nfs_commit_set_lock_8205 nfs_commit_set_lock 0 8205 &qlcnic_sysfs_validate_mem_8205 ++recent_mt_proc_write_8206 recent_mt_proc_write 3-0 8206 NULL ++__ocfs2_lock_refcount_tree_8207 __ocfs2_lock_refcount_tree 0 8207 NULL ++rt2x00debug_write_bbp_8212 rt2x00debug_write_bbp 3-0 8212 NULL ++ad7879_spi_multi_read_8218 ad7879_spi_multi_read 3 8218 NULL ++play_iframe_8219 play_iframe 3 8219 NULL ++elants_i2c_read_8222 elants_i2c_read 3-0 8222 NULL ++show_iface_port_8225 show_iface_port 0 8225 NULL nohasharray ++pcmciamtd_suspend_8225 pcmciamtd_suspend 0 8225 &show_iface_port_8225 nohasharray ++create_log_8225 create_log 2 8225 &pcmciamtd_suspend_8225 ++twl_pwm_config_8227 twl_pwm_config 0 8227 NULL ++qlcnic_sysfs_read_mem_8231 qlcnic_sysfs_read_mem 0-6-5 8231 NULL ++integrity_attr_show_8235 integrity_attr_show 0 8235 NULL ++iscsit_ta_login_timeout_8238 iscsit_ta_login_timeout 0 8238 NULL ++show_pwm_sensor_8243 show_pwm_sensor 0 8243 NULL ++check_xattr_ref_inode_8244 check_xattr_ref_inode 0 8244 NULL ++show_state_disable_8251 show_state_disable 0 8251 NULL ++nfs_flush_incompatible_8252 nfs_flush_incompatible 0 8252 NULL ++statfs_sync_store_8257 statfs_sync_store 0-3 8257 NULL nohasharray ++add_rx_skb_8257 add_rx_skb 3 8257 &statfs_sync_store_8257 ++__uncore_filter_nid_show_8259 __uncore_filter_nid_show 0 8259 NULL nohasharray ++srpt_tpg_store_enable_8259 srpt_tpg_store_enable 0-3 8259 &__uncore_filter_nid_show_8259 ++t3_init_l2t_8261 t3_init_l2t 1 8261 NULL ++pci_map_sg_8269 pci_map_sg 3 8269 NULL ++ntc_thermistor_get_ohm_8270 ntc_thermistor_get_ohm 0 8270 NULL ++init_cdev_8274 init_cdev 1 8274 NULL ++blk_cpu_notify_8275 blk_cpu_notify 0 8275 NULL ++rproc_recovery_write_8281 rproc_recovery_write 3-0 8281 NULL ++write_file_dummy_8282 write_file_dummy 0-3 8282 NULL ++tcp_listen_for_all_8285 tcp_listen_for_all 0 8285 NULL ++mlx5_core_create_mkey_8290 mlx5_core_create_mkey 0 8290 NULL ++rtl92d_download_fw_8295 rtl92d_download_fw 0 8295 NULL ++hotkey_wakeup_reason_show_8301 hotkey_wakeup_reason_show 0 8301 NULL ++setsockopt_8304 setsockopt 0 8304 NULL ++target_stat_scsi_lu_show_attr_lu_name_8305 target_stat_scsi_lu_show_attr_lu_name 0 8305 NULL ++qib_decode_7220_err_8315 qib_decode_7220_err 3 8315 NULL ++uevent_store_8319 uevent_store 0-4 8319 NULL ++ipwireless_send_packet_8328 ipwireless_send_packet 4 8328 NULL ++niu_set_tcam_key_8334 niu_set_tcam_key 0 8334 NULL ++skein256_init_8337 skein256_init 0 8337 NULL ++vsock_stream_setsockopt_8338 vsock_stream_setsockopt 0 8338 NULL ++bond_option_primary_set_8343 bond_option_primary_set 0 8343 NULL ++tracing_entries_read_8345 tracing_entries_read 3 8345 NULL ++sel_make_policycap_8346 sel_make_policycap 0 8346 NULL ++ieee80211_if_fmt_ht_opmode_8347 ieee80211_if_fmt_ht_opmode 3 8347 NULL ++target_core_dev_pr_show_attr_res_type_8349 target_core_dev_pr_show_attr_res_type 0 8349 NULL ++nfs4_lookup_root_sec_8353 nfs4_lookup_root_sec 0 8353 NULL ++prop_compression_apply_8354 prop_compression_apply 0 8354 NULL nohasharray ++open_candev_8354 open_candev 0 8354 &prop_compression_apply_8354 ++generic_write_sync_8358 generic_write_sync 0 8358 NULL ++qlcnic_open_8359 qlcnic_open 0 8359 NULL ++ping_getfrag_8360 ping_getfrag 3-4 8360 NULL nohasharray ++isku_sysfs_write_talk_8360 isku_sysfs_write_talk 6-0-5 8360 &ping_getfrag_8360 ++ath6kl_lrssi_roam_write_8362 ath6kl_lrssi_roam_write 3-0 8362 NULL nohasharray ++batadv_sysfs_add_vlan_8362 batadv_sysfs_add_vlan 0 8362 &ath6kl_lrssi_roam_write_8362 ++alloc_sleep_millisecs_store_8364 alloc_sleep_millisecs_store 0-4 8364 NULL ++update_read_page_8368 update_read_page 0-2 8368 NULL nohasharray ++chv_gpio_request_enable_8368 chv_gpio_request_enable 0 8368 &update_read_page_8368 ++nilfs_statfs_8369 nilfs_statfs 0 8369 NULL ++wil_open_8375 wil_open 0 8375 NULL ++ndo_init_8377 ndo_init 0 8377 NULL ++read_ahead_kb_show_8378 read_ahead_kb_show 0 8378 NULL ++set_auto_pwm_8383 set_auto_pwm 0-4 8383 NULL ++store_tabletMouseMiddle_8384 store_tabletMouseMiddle 0-4 8384 NULL ++carl9170_op_add_interface_8386 carl9170_op_add_interface 0 8386 NULL ++hfsplus_brec_remove_8389 hfsplus_brec_remove 0 8389 NULL ++bDeviceProtocol_show_8392 bDeviceProtocol_show 0 8392 NULL ++xdi_copy_from_user_8395 xdi_copy_from_user 4 8395 NULL ++brightness_set_8396 brightness_set 0 8396 NULL ++config_8403 config 0 8403 NULL ++zd_rf_scnprint_id_8406 zd_rf_scnprint_id 0-3 8406 NULL ++smk_write_change_rule_8411 smk_write_change_rule 3-0 8411 NULL ++atkbd_show_set_8414 atkbd_show_set 0 8414 NULL ++show_rc6_ms_8417 show_rc6_ms 0 8417 NULL ++alua_activate_8420 alua_activate 0 8420 NULL ++patch_atihdmi_8421 patch_atihdmi 0 8421 NULL ++keyspan_open_8429 keyspan_open 0 8429 NULL nohasharray ++show_gps_8429 show_gps 0 8429 &keyspan_open_8429 ++roccat_common2_sysfs_read_8431 roccat_common2_sysfs_read 0-6 8431 NULL ++capability_set_8433 capability_set 0-4 8433 NULL ++snd_usb_ctl_msg_8436 snd_usb_ctl_msg 0-8 8436 NULL ++irq_create_mapping_8437 irq_create_mapping 0-2 8437 NULL ++sk_stream_wait_memory_8438 sk_stream_wait_memory 0 8438 NULL ++generic_bin_search_8440 generic_bin_search 0 8440 NULL ++get_b_bus_req_8443 get_b_bus_req 0 8443 NULL ++lp3971_dcdc_enable_8444 lp3971_dcdc_enable 0 8444 NULL ++sl_init_8447 sl_init 0 8447 NULL ++wacom_btnimg7_store_8448 wacom_btnimg7_store 0-4 8448 NULL ++hugetlb_vmtruncate_8449 hugetlb_vmtruncate 0 8449 NULL ++l2cap_chan_connect_8450 l2cap_chan_connect 0 8450 NULL ++target_fabric_tpg_param_attr_show_8451 target_fabric_tpg_param_attr_show 0 8451 NULL ++tgr160_final_8455 tgr160_final 0 8455 NULL ++afs_write_end_8456 afs_write_end 0-5 8456 NULL nohasharray ++tcam_wait_bit_8456 tcam_wait_bit 0 8456 &afs_write_end_8456 ++ring_wait_for_space_8457 ring_wait_for_space 0 8457 NULL ++adcxx_show_max_8459 adcxx_show_max 0 8459 NULL ++qlcnic_82xx_get_cap_size_8464 qlcnic_82xx_get_cap_size 0 8464 NULL ++multicast_last_member_interval_show_8468 multicast_last_member_interval_show 0 8468 NULL nohasharray ++cifs_get_inode_info_8468 cifs_get_inode_info 0 8468 &multicast_last_member_interval_show_8468 ++acpi_ds_eval_region_operands_8469 acpi_ds_eval_region_operands 0 8469 NULL nohasharray ++radeon_set_dpm_forced_performance_level_8469 radeon_set_dpm_forced_performance_level 0-4 8469 &acpi_ds_eval_region_operands_8469 ++asd_write_flash_seg_8471 asd_write_flash_seg 0 8471 NULL ++lpfc_oas_tgt_show_8472 lpfc_oas_tgt_show 0 8472 NULL ++apds990x_lux_calib_format_show_8480 apds990x_lux_calib_format_show 0 8480 NULL ++afs_cell_lookup_8482 afs_cell_lookup 2 8482 NULL ++usbip_debug_store_8490 usbip_debug_store 0-4 8490 NULL ++ecp_write_addr_8491 ecp_write_addr 0 8491 NULL ++snd_timer_open_8492 snd_timer_open 0 8492 NULL ++rpcauth_key_timeout_notify_8494 rpcauth_key_timeout_notify 0 8494 NULL ++in0_input_show_8498 in0_input_show 0 8498 NULL ++fore200e_chunk_alloc_8501 fore200e_chunk_alloc 4-3 8501 NULL ++ecryptfs_calculate_md5_8504 ecryptfs_calculate_md5 0 8504 NULL ++dev_config_8506 dev_config 3 8506 NULL ++ACL_to_cifs_posix_8509 ACL_to_cifs_posix 3 8509 NULL nohasharray ++kgdb_notify_8509 kgdb_notify 0 8509 &ACL_to_cifs_posix_8509 ++nouveau_platform_device_create__8514 nouveau_platform_device_create_ 2 8514 NULL ++acpi_ps_complete_op_8518 acpi_ps_complete_op 0-3 8518 NULL nohasharray ++spi_bus_unlock_8518 spi_bus_unlock 0 8518 &acpi_ps_complete_op_8518 ++swap_writepage_8522 swap_writepage 0 8522 NULL ++opticon_process_data_packet_8524 opticon_process_data_packet 3 8524 NULL ++ieee802154_sock_sendmsg_8526 ieee802154_sock_sendmsg 0-4 8526 NULL ++snd_malloc_sgbuf_pages_8532 snd_malloc_sgbuf_pages 2 8532 NULL nohasharray ++pnp_resource_len_8532 pnp_resource_len 0 8532 &snd_malloc_sgbuf_pages_8532 ++alloc_pg_vec_8533 alloc_pg_vec 2 8533 NULL ++lvs_rh_clear_port_feature_8537 lvs_rh_clear_port_feature 0 8537 NULL ++de_alloc_rings_8538 de_alloc_rings 0 8538 NULL ++bh1770_lux_result_show_8541 bh1770_lux_result_show 0 8541 NULL nohasharray ++ubifs_tnc_remove_ino_8541 ubifs_tnc_remove_ino 0 8541 &bh1770_lux_result_show_8541 nohasharray ++niu_zcp_read_8541 niu_zcp_read 0 8541 &ubifs_tnc_remove_ino_8541 ++disarm_req_delay_8542 disarm_req_delay 0 8542 NULL ++asix_write_gpio_8552 asix_write_gpio 0 8552 NULL ++ax88172a_reset_8555 ax88172a_reset 0 8555 NULL ++profile_remove_8556 profile_remove 3-0 8556 NULL nohasharray ++show_pwm_interpolate_8556 show_pwm_interpolate 0 8556 &profile_remove_8556 nohasharray ++mask_and_set_register_interruptible_8556 mask_and_set_register_interruptible 0 8556 &show_pwm_interpolate_8556 ++tm6000_radio_s_ctrl_8559 tm6000_radio_s_ctrl 0 8559 NULL ++btrfs_submit_bio_hook_8560 btrfs_submit_bio_hook 0 8560 NULL nohasharray ++write_8560 write 0 8560 &btrfs_submit_bio_hook_8560 ++ixgb_open_8565 ixgb_open 0 8565 NULL ++set_volume_8569 set_volume 0 8569 NULL ++cache_slow_downcall_8570 cache_slow_downcall 2-0 8570 NULL ++mga_ioremap_8571 mga_ioremap 1-2 8571 NULL ++isr_dma0_done_read_8574 isr_dma0_done_read 3-0 8574 NULL nohasharray ++store_engine3_load_8574 store_engine3_load 0-4 8574 &isr_dma0_done_read_8574 ++tower_write_8580 tower_write 3-0 8580 NULL ++cmd_wait_8582 cmd_wait 0 8582 NULL ++quota_refresh_user_store_8597 quota_refresh_user_store 0-3 8597 NULL ++generic_set_freq_8602 generic_set_freq 0 8602 NULL nohasharray ++sctp_user_addto_chunk_8602 sctp_user_addto_chunk 2 8602 &generic_set_freq_8602 nohasharray ++iwl_run_init_ucode_8602 iwl_run_init_ucode 0 8602 &sctp_user_addto_chunk_8602 ++rtllib_MFIE_rate_len_8606 rtllib_MFIE_rate_len 0 8606 NULL ++i_ipmi_set_timeout_8609 i_ipmi_set_timeout 0 8609 NULL ++ocores_xfer_8613 ocores_xfer 0-3 8613 NULL ++cfs_cpt_number_8618 cfs_cpt_number 0 8618 NULL ++shash_setkey_unaligned_8620 shash_setkey_unaligned 0-3 8620 NULL nohasharray ++ext2_statfs_8620 ext2_statfs 0 8620 &shash_setkey_unaligned_8620 ++__dev_set_allmulti_8622 __dev_set_allmulti 0 8622 NULL ++xfs_qm_dqattach_locked_8625 xfs_qm_dqattach_locked 0 8625 NULL ++cifs_negotiate_8626 cifs_negotiate 0 8626 NULL ++it821x_firmware_command_8628 it821x_firmware_command 3 8628 NULL ++scsi_dma_map_8632 scsi_dma_map 0 8632 NULL ++sh_vou_buf_prepare_8633 sh_vou_buf_prepare 0 8633 NULL ++fuse_send_write_pages_8636 fuse_send_write_pages 0-5 8636 NULL ++get_aw_pt_bi_8641 get_aw_pt_bi 0 8641 NULL ++show_fnode_tcp_recv_wsf_8642 show_fnode_tcp_recv_wsf 0 8642 NULL ++timeout_show_8646 timeout_show 0 8646 NULL nohasharray ++adp8860_read_8646 adp8860_read 0 8646 &timeout_show_8646 ++write_sysrq_trigger_8648 write_sysrq_trigger 0-3 8648 NULL nohasharray ++ufs_add_fragments_8648 ufs_add_fragments 2 8648 &write_sysrq_trigger_8648 ++CIFSSMBFlush_8652 CIFSSMBFlush 0 8652 NULL ++musb_gadget_queue_8656 musb_gadget_queue 0 8656 NULL ++tcmu_show_configfs_dev_params_8660 tcmu_show_configfs_dev_params 0 8660 NULL ++mtd_ecc_stats_corrected_show_8662 mtd_ecc_stats_corrected_show 0 8662 NULL ++mlx5_vzalloc_8663 mlx5_vzalloc 1 8663 NULL ++cs421x_parse_auto_config_8664 cs421x_parse_auto_config 0 8664 NULL ++options_show_8667 options_show 0 8667 NULL ++mei_txe_write_8670 mei_txe_write 0 8670 NULL ++kone_sysfs_read_profilex_8672 kone_sysfs_read_profilex 0-5-6 8672 NULL ++crc32_update_8676 crc32_update 0 8676 NULL ++dio_bio_alloc_8677 dio_bio_alloc 5 8677 NULL ++lbs_bcnmiss_read_8678 lbs_bcnmiss_read 3-0 8678 NULL ++ath9k_tx99_send_8682 ath9k_tx99_send 0 8682 NULL ++rproc_trace_read_8686 rproc_trace_read 3-0 8686 NULL ++wacom_btnimg2_store_8696 wacom_btnimg2_store 4-0 8696 NULL ++start_8697 start 0 8697 NULL ++saa7110_write_block_8701 saa7110_write_block 3 8701 NULL nohasharray ++fan_get_state_8701 fan_get_state 0 8701 &saa7110_write_block_8701 nohasharray ++max197_show_input_8701 max197_show_input 0 8701 &fan_get_state_8701 nohasharray ++sas_smp_get_phy_events_8701 sas_smp_get_phy_events 0 8701 &max197_show_input_8701 ++arcfb_write_8702 arcfb_write 3 8702 NULL ++i_size_read_8703 i_size_read 0 8703 NULL nohasharray ++init_header_8703 init_header 0 8703 &i_size_read_8703 ++HDLC_irq_8709 HDLC_irq 2 8709 NULL ++az6027_i2c_xfer_8710 az6027_i2c_xfer 0-3 8710 NULL ++ctrl_out_8712 ctrl_out 5-3 8712 NULL ++usb_os_desc_attr_store_8714 usb_os_desc_attr_store 0-4 8714 NULL ++charger_state_show_8720 charger_state_show 0 8720 NULL ++set_temp_crit_8721 set_temp_crit 0-4 8721 NULL ++lunid_show_8726 lunid_show 0 8726 NULL ++vt8623fb_check_var_8727 vt8623fb_check_var 0 8727 NULL ++ext4_xattr_user_set_8728 ext4_xattr_user_set 0 8728 NULL nohasharray ++tracing_max_lat_write_8728 tracing_max_lat_write 3 8728 &ext4_xattr_user_set_8728 ++jffs2_acl_count_8729 jffs2_acl_count 0-1 8729 NULL nohasharray ++cfq_var_show_8729 cfq_var_show 0 8729 &jffs2_acl_count_8729 ++f_dupfd_8730 f_dupfd 1 8730 NULL ++ip6gre_tunnel_init_8747 ip6gre_tunnel_init 0 8747 NULL ++iov_iter_zero_8748 iov_iter_zero 1-0 8748 NULL ++tx_tx_exch_expiry_read_8749 tx_tx_exch_expiry_read 3-0 8749 NULL ++compound_order_8750 compound_order 0 8750 NULL nohasharray ++strict_blocks_to_sectors_8750 strict_blocks_to_sectors 0 8750 &compound_order_8750 ++cfg80211_inform_bss_width_8754 cfg80211_inform_bss_width 10 8754 NULL nohasharray ++firmware_show_8754 firmware_show 0 8754 &cfg80211_inform_bss_width_8754 ++read_uscorr_8755 read_uscorr 0 8755 NULL ++xfs_attr_shortform_getvalue_8760 xfs_attr_shortform_getvalue 0 8760 NULL ++yurex_write_8761 yurex_write 3-0 8761 NULL nohasharray ++rndis_opts_host_addr_store_8761 rndis_opts_host_addr_store 0-3 8761 &yurex_write_8761 ++SMB2_tcon_8763 SMB2_tcon 0 8763 NULL ++joydev_compat_ioctl_8765 joydev_compat_ioctl 2 8765 NULL nohasharray ++usb_os_desc_ext_prop_attr_show_8765 usb_os_desc_ext_prop_attr_show 0 8765 &joydev_compat_ioctl_8765 ++sys_prctl_8766 sys_prctl 4 8766 NULL ++acpi_ds_method_data_get_value_8767 acpi_ds_method_data_get_value 0 8767 NULL nohasharray ++aac_show_monitor_version_8767 aac_show_monitor_version 0 8767 &acpi_ds_method_data_get_value_8767 ++i40evf_setup_tx_descriptors_8769 i40evf_setup_tx_descriptors 0 8769 NULL ++ntfs_writepage_8770 ntfs_writepage 0 8770 NULL ++ubifs_leb_map_8771 ubifs_leb_map 0 8771 NULL ++raw_enable_errfilter_8775 raw_enable_errfilter 0 8775 NULL nohasharray ++st_accel_buffer_postenable_8775 st_accel_buffer_postenable 0 8775 &raw_enable_errfilter_8775 ++kstrtoint_from_user_8778 kstrtoint_from_user 2-0 8778 NULL ++acpi_device_modalias_8781 acpi_device_modalias 0 8781 NULL nohasharray ++destroy_by_rcu_show_8781 destroy_by_rcu_show 0 8781 &acpi_device_modalias_8781 ++rtc_read_time_8782 rtc_read_time 0 8782 NULL ++ft_nacl_store_port_name_8784 ft_nacl_store_port_name 0-3 8784 NULL ++ext4_try_to_write_inline_data_8785 ext4_try_to_write_inline_data 4-3 8785 NULL ++show_hardware_8789 show_hardware 0 8789 NULL ++edd_show_sectors_8794 edd_show_sectors 0 8794 NULL ++__bitmap_weight_8796 __bitmap_weight 0 8796 NULL ++ip_vs_remote_request6_8805 ip_vs_remote_request6 0 8805 NULL ++gfs2_glock_nq_8808 gfs2_glock_nq 0 8808 NULL nohasharray ++prod_id2_show_8808 prod_id2_show 0 8808 &gfs2_glock_nq_8808 nohasharray ++intel_ring_begin_8808 intel_ring_begin 0 8808 &prod_id2_show_8808 ++ntfs_commit_pages_after_write_8809 ntfs_commit_pages_after_write 0 8809 NULL ++get_size_8811 get_size 0 8811 NULL ++show_spi_transport_wr_flow_8812 show_spi_transport_wr_flow 0 8812 NULL nohasharray ++bmp085_update_raw_pressure_8812 bmp085_update_raw_pressure 0 8812 &show_spi_transport_wr_flow_8812 ++bd2802_store_reg0x06_8815 bd2802_store_reg0x06 0-4 8815 NULL ++show_counter_rx_dwords_8819 show_counter_rx_dwords 0 8819 NULL ++metronomefb_write_8823 metronomefb_write 3 8823 NULL ++SyS_llistxattr_8824 SyS_llistxattr 3 8824 NULL ++nilfs_segctor_reset_segment_buffer_8825 nilfs_segctor_reset_segment_buffer 0 8825 NULL ++extent_read_full_page_8826 extent_read_full_page 0 8826 NULL ++ll_xattr_cache_get_8829 ll_xattr_cache_get 0 8829 NULL ++convert_8830 convert 0 8830 NULL ++mmc_wait_for_cmd_8832 mmc_wait_for_cmd 0 8832 NULL nohasharray ++new_files_jdata_store_8832 new_files_jdata_store 0-3 8832 &mmc_wait_for_cmd_8832 ++get_queue_depth_8833 get_queue_depth 0 8833 NULL nohasharray ++icmpv6_manip_pkt_8833 icmpv6_manip_pkt 4 8833 &get_queue_depth_8833 ++dvb_ringbuffer_pkt_next_8834 dvb_ringbuffer_pkt_next 0-2 8834 NULL ++nilfs_mdt_get_block_8839 nilfs_mdt_get_block 0 8839 NULL nohasharray ++usb_ep_queue_8839 usb_ep_queue 0 8839 &nilfs_mdt_get_block_8839 ++policydb_bounds_sanity_check_8846 policydb_bounds_sanity_check 0 8846 NULL ++vmci_transport_notify_pkt_send_pre_block_8851 vmci_transport_notify_pkt_send_pre_block 0 8851 NULL ++ahash_op_unaligned_8854 ahash_op_unaligned 0 8854 NULL ++debug_debug1_read_8856 debug_debug1_read 3-0 8856 NULL ++wa_nep_queue_8858 wa_nep_queue 2 8858 NULL ++xgmac_reg_value_write_8860 xgmac_reg_value_write 3 8860 NULL ++inode_getsecurity_8862 inode_getsecurity 0 8862 NULL nohasharray ++wl1251_power_on_8862 wl1251_power_on 0 8862 &inode_getsecurity_8862 ++qlcnic_get_regs_len_8865 qlcnic_get_regs_len 0 8865 NULL nohasharray ++q931_help_8865 q931_help 0 8865 &qlcnic_get_regs_len_8865 ++acpi_ps_complete_final_op_8868 acpi_ps_complete_final_op 0-3 8868 NULL nohasharray ++icmpv6_error_message_8868 icmpv6_error_message 0 8868 &acpi_ps_complete_final_op_8868 ++b43_switch_channel_8872 b43_switch_channel 0 8872 NULL nohasharray ++rocker_group_l2_flood_8872 rocker_group_l2_flood 4 8872 &b43_switch_channel_8872 ++masq_inet_event_8874 masq_inet_event 0 8874 NULL nohasharray ++roccat_common2_sysfs_write_keys_easyzone_8874 roccat_common2_sysfs_write_keys_easyzone 0-6-5 8874 &masq_inet_event_8874 ++radeon_drm_ioctl_8875 radeon_drm_ioctl 2 8875 NULL ++nfs_refresh_inode_locked_8884 nfs_refresh_inode_locked 0 8884 NULL ++compressed_bio_size_8887 compressed_bio_size 0-2 8887 NULL ++show_engine2_mode_8888 show_engine2_mode 0 8888 NULL nohasharray ++m41t80_sysfs_show_sqwfreq_8888 m41t80_sysfs_show_sqwfreq 0 8888 &show_engine2_mode_8888 nohasharray ++qlcnic_attach_8888 qlcnic_attach 0 8888 &m41t80_sysfs_show_sqwfreq_8888 ++ab3100_get_set_reg_8890 ab3100_get_set_reg 3-0 8890 NULL nohasharray ++tracing_max_lat_read_8890 tracing_max_lat_read 3 8890 &ab3100_get_set_reg_8890 ++nilfs_segctor_last_seg_sequence_show_8900 nilfs_segctor_last_seg_sequence_show 0 8900 NULL ++sysv_setattr_8904 sysv_setattr 0 8904 NULL ++msi2500_start_streaming_8905 msi2500_start_streaming 0 8905 NULL ++sdio_max_byte_size_8907 sdio_max_byte_size 0 8907 NULL ++show_pwm_auto_prochot_ramp_8908 show_pwm_auto_prochot_ramp 0 8908 NULL nohasharray ++max_medium_access_timeouts_store_8908 max_medium_access_timeouts_store 0-4 8908 &show_pwm_auto_prochot_ramp_8908 ++bcm7xxx_dummy_config_init_8909 bcm7xxx_dummy_config_init 0 8909 NULL ++adf4350_sync_config_8913 adf4350_sync_config 0 8913 NULL ++sysfs_merge_group_8917 sysfs_merge_group 0 8917 NULL ++write_file_ani_8918 write_file_ani 3-0 8918 NULL ++i2c_nuvoton_get_burstcount_8919 i2c_nuvoton_get_burstcount 0 8919 NULL ++data_sock_create_8920 data_sock_create 0 8920 NULL ++dma_common_contiguous_remap_8921 dma_common_contiguous_remap 2 8921 NULL ++mci_ue_count_show_8923 mci_ue_count_show 0 8923 NULL nohasharray ++cx25840_s_stream_8923 cx25840_s_stream 0 8923 &mci_ue_count_show_8923 nohasharray ++br_stp_set_path_cost_8923 br_stp_set_path_cost 0 8923 &cx25840_s_stream_8923 ++ds2780_get_pio_pin_8925 ds2780_get_pio_pin 0 8925 NULL ++layout_commit_8926 layout_commit 0-3 8926 NULL ++s5m_rtc_read_time_8928 s5m_rtc_read_time 0 8928 NULL nohasharray ++pcnet_resume_8928 pcnet_resume 0 8928 &s5m_rtc_read_time_8928 ++cp2112_hid_get_8933 cp2112_hid_get 0-4 8933 NULL ++adjust_priv_size_8935 adjust_priv_size 0-1 8935 NULL ++apparmor_file_permission_8938 apparmor_file_permission 0 8938 NULL ++driver_stats_read_8944 driver_stats_read 3-0 8944 NULL ++ks8995_registers_read_8945 ks8995_registers_read 0-5-6 8945 NULL nohasharray ++reset_umac_8945 reset_umac 0 8945 &ks8995_registers_read_8945 ++t3_init_hw_8947 t3_init_hw 0 8947 NULL ++snd_ivtv_pcm_trigger_8948 snd_ivtv_pcm_trigger 0 8948 NULL ++claim_show_8950 claim_show 0 8950 NULL nohasharray ++goto_low_power_8950 goto_low_power 0 8950 &claim_show_8950 nohasharray ++lp8788_set_alarm_8950 lp8788_set_alarm 0 8950 &goto_low_power_8950 ++fuse_read_forget_8951 fuse_read_forget 0 8951 NULL ++set_red_8954 set_red 0-4 8954 NULL ++rds_tcp_xmit_8958 rds_tcp_xmit 3 8958 NULL ++read_file_tgt_stats_8959 read_file_tgt_stats 3-0 8959 NULL nohasharray ++v9fs_fid_readpage_8959 v9fs_fid_readpage 0 8959 &read_file_tgt_stats_8959 ++qla2x00_sysfs_read_xgmac_stats_8962 qla2x00_sysfs_read_xgmac_stats 0-6-5 8962 NULL ++seq_bitmap_list_8963 seq_bitmap_list 3 8963 NULL ++usb_allocate_stream_buffers_8964 usb_allocate_stream_buffers 3 8964 NULL nohasharray ++iscsi_nacl_auth_show_userid_mutual_8964 iscsi_nacl_auth_show_userid_mutual 0 8964 &usb_allocate_stream_buffers_8964 ++__v4l2_ctrl_s_ctrl_8965 __v4l2_ctrl_s_ctrl 0 8965 NULL ++qib_qsfp_dump_8966 qib_qsfp_dump 0-3 8966 NULL nohasharray ++atkbd_do_set_set_8966 atkbd_do_set_set 0-4 8966 &qib_qsfp_dump_8966 ++venus_mkdir_8967 venus_mkdir 4 8967 NULL ++seq_open_net_8968 seq_open_net 4 8968 NULL nohasharray ++vol_cdev_read_8968 vol_cdev_read 3-0 8968 &seq_open_net_8968 ++wl1271_acx_tid_cfg_8970 wl1271_acx_tid_cfg 0 8970 NULL ++enqueue_tx_8972 enqueue_tx 0 8972 NULL ++sony_register_touchpad_8981 sony_register_touchpad 2 8981 NULL nohasharray ++spmi_ext_register_writel_8981 spmi_ext_register_writel 0 8981 &sony_register_touchpad_8981 ++cirrusfb_set_par_foo_8986 cirrusfb_set_par_foo 0 8986 NULL ++il3945_store_antenna_8991 il3945_store_antenna 0-4 8991 NULL ++show_state_time_8992 show_state_time 0 8992 NULL ++bcm_read_op_8996 bcm_read_op 0 8996 NULL nohasharray ++cifs_fscache_inode_get_key_8996 cifs_fscache_inode_get_key 0 8996 &bcm_read_op_8996 ++elan_smbus_finish_fw_update_8997 elan_smbus_finish_fw_update 0 8997 NULL ++arvo_sysfs_set_mode_key_9002 arvo_sysfs_set_mode_key 0-4 9002 NULL ++MT2063_AvoidSpurs_9004 MT2063_AvoidSpurs 0 9004 NULL ++wl1271_event_unmask_9005 wl1271_event_unmask 0 9005 NULL ++rd_configure_device_9008 rd_configure_device 0 9008 NULL ++vx_toggle_pipe_9013 vx_toggle_pipe 0 9013 NULL ++epp_read_data_9015 epp_read_data 0 9015 NULL ++il_dbgfs_clear_ucode_stats_write_9016 il_dbgfs_clear_ucode_stats_write 3-0 9016 NULL ++__uncore_mask1_show_9022 __uncore_mask1_show 0 9022 NULL ++acerhdf_get_max_state_9024 acerhdf_get_max_state 0 9024 NULL nohasharray ++set_eeprom0_9024 set_eeprom0 4-0 9024 &acerhdf_get_max_state_9024 ++ql_route_initialize_9027 ql_route_initialize 0 9027 NULL ++atl1_set_mac_9028 atl1_set_mac 0 9028 NULL nohasharray ++fd_ioctl_9028 fd_ioctl 3 9028 &atl1_set_mac_9028 ++amd64_inject_word_store_9031 amd64_inject_word_store 0-4 9031 NULL ++ncp_modify_file_or_subdir_dos_info_path_9032 ncp_modify_file_or_subdir_dos_info_path 0 9032 NULL ++qla4_8xxx_find_flt_start_9037 qla4_8xxx_find_flt_start 0 9037 NULL ++__pskb_copy_9038 __pskb_copy 2 9038 NULL ++soc_camera_platform_fill_fmt_9040 soc_camera_platform_fill_fmt 0 9040 NULL ++nla_put_9042 nla_put 0 9042 NULL ++btrfs_getattr_9046 btrfs_getattr 0 9046 NULL ++sta_tx_latency_stat_header_9050 sta_tx_latency_stat_header 0-3-4 9050 NULL ++clk_ctl_store_9053 clk_ctl_store 0-4 9053 NULL ++__uncore_xbr_mm_cfg_show_9057 __uncore_xbr_mm_cfg_show 0 9057 NULL ++ep_queue_9060 ep_queue 0 9060 NULL ++snd_emu10k1_synth_copy_from_user_9061 snd_emu10k1_synth_copy_from_user 5-3 9061 NULL ++fnic_show_link_state_9062 fnic_show_link_state 0 9062 NULL nohasharray ++snd_gus_dram_peek_9062 snd_gus_dram_peek 4 9062 &fnic_show_link_state_9062 ++nrbchan_show_9066 nrbchan_show 0 9066 NULL ++hci_req_add_9067 hci_req_add 3 9067 NULL ++smi_data_buf_size_store_9071 smi_data_buf_size_store 0-4 9071 NULL ++scrub_raid56_parity_9073 scrub_raid56_parity 5 9073 NULL ++ipath_user_sdma_queue_clean_9074 ipath_user_sdma_queue_clean 0 9074 NULL ++fib_info_hash_alloc_9075 fib_info_hash_alloc 1 9075 NULL nohasharray ++__uncore_xbr_match_show_9075 __uncore_xbr_match_show 0 9075 &fib_info_hash_alloc_9075 ++bh1770_get_prox_thres_9085 bh1770_get_prox_thres 0 9085 NULL ++create_queues_9088 create_queues 3-2 9088 NULL ++ican3_set_bus_state_9090 ican3_set_bus_state 0 9090 NULL ++nvkm_output_create__9091 nvkm_output_create_ 6 9091 NULL ++ftdi_prepare_write_buffer_9093 ftdi_prepare_write_buffer 3 9093 NULL ++ath10k_peer_assoc_prepare_9099 ath10k_peer_assoc_prepare 0 9099 NULL ++tcp_v4_parse_md5_keys_9101 tcp_v4_parse_md5_keys 0 9101 NULL ++target_core_alua_tg_pt_gp_store_attr_trans_delay_msecs_9108 target_core_alua_tg_pt_gp_store_attr_trans_delay_msecs 0-3 9108 NULL nohasharray ++adxl34x_spi_read_block_9108 adxl34x_spi_read_block 3 9108 &target_core_alua_tg_pt_gp_store_attr_trans_delay_msecs_9108 ++caif_stream_sendmsg_9110 caif_stream_sendmsg 4-0 9110 NULL ++bch_stats_show_9112 bch_stats_show 0 9112 NULL ++hackrf_set_lna_gain_9115 hackrf_set_lna_gain 0 9115 NULL nohasharray ++gssp_rpc_create_9115 gssp_rpc_create 0 9115 &hackrf_set_lna_gain_9115 ++isku_sysfs_write_keys_macro_9120 isku_sysfs_write_keys_macro 6-0-5 9120 NULL ++partial_show_9122 partial_show 0 9122 NULL ++qla2x00_sysfs_write_fw_dump_template_9127 qla2x00_sysfs_write_fw_dump_template 0-5-6 9127 NULL ++ext4_list_backups_9138 ext4_list_backups 0 9138 NULL ++dac7512_store_val_9140 dac7512_store_val 0-4 9140 NULL ++cpuidle_latency_notify_9141 cpuidle_latency_notify 0 9141 NULL ++nilfs_superblock_sb_update_frequency_show_9142 nilfs_superblock_sb_update_frequency_show 0 9142 NULL ++__uvc_query_ctrl_9155 __uvc_query_ctrl 0 9155 NULL ++atmel_wakeup_firmware_9156 atmel_wakeup_firmware 0 9156 NULL ++__iscsi_nacl_auth_show_password_9159 __iscsi_nacl_auth_show_password 0 9159 NULL ++target_stat_scsi_auth_intr_attr_show_9160 target_stat_scsi_auth_intr_attr_show 0 9160 NULL ++get_fc_port_roles_names_9164 get_fc_port_roles_names 0 9164 NULL ++dbg_command_buf_9165 dbg_command_buf 2 9165 NULL ++clk_prepare_enable_9166 clk_prepare_enable 0 9166 NULL ++show_num_temp_sensors_9173 show_num_temp_sensors 0 9173 NULL ++pm_autosleep_lock_9176 pm_autosleep_lock 0 9176 NULL ++w1_ds2780_eeprom_cmd_9179 w1_ds2780_eeprom_cmd 0 9179 NULL nohasharray ++ext4_da_write_inline_data_end_9179 ext4_da_write_inline_data_end 4-0 9179 &w1_ds2780_eeprom_cmd_9179 ++isr_irqs_read_9181 isr_irqs_read 3-0 9181 NULL ++count_leading_zeros_9183 count_leading_zeros 0 9183 NULL ++show_counter_ib_link_downeds_9184 show_counter_ib_link_downeds 0 9184 NULL ++ax25_bind_9185 ax25_bind 0 9185 NULL ++xfs_btree_rshift_9187 xfs_btree_rshift 0 9187 NULL ++pnfs_commit_list_9191 pnfs_commit_list 0 9191 NULL nohasharray ++br_dev_open_9191 br_dev_open 0 9191 &pnfs_commit_list_9191 ++alloc_group_attrs_9194 alloc_group_attrs 2 9194 NULL nohasharray ++altera_swap_ir_9194 altera_swap_ir 2 9194 &alloc_group_attrs_9194 nohasharray ++ipath_user_sdma_make_progress_9194 ipath_user_sdma_make_progress 0 9194 &altera_swap_ir_9194 ++gx1_gx_base_9198 gx1_gx_base 0 9198 NULL ++nilfs_btnode_prepare_change_key_9200 nilfs_btnode_prepare_change_key 0 9200 NULL ++sigmadsp_write_i2c_9201 sigmadsp_write_i2c 4 9201 NULL ++fill_delalloc_9202 fill_delalloc 0 9202 NULL ++cx18_av_s_mbus_fmt_9205 cx18_av_s_mbus_fmt 0 9205 NULL ++ci_udc_start_9208 ci_udc_start 0 9208 NULL nohasharray ++zd_rf_init_al7230b_9208 zd_rf_init_al7230b 0 9208 &ci_udc_start_9208 nohasharray ++calibrate_result_9208 calibrate_result 0 9208 &zd_rf_init_al7230b_9208 ++sg_common_write_9209 sg_common_write 0 9209 NULL ++iwl_dbgfs_frame_stats_read_9211 iwl_dbgfs_frame_stats_read 3-0 9211 NULL nohasharray ++adc128_show_temp_9211 adc128_show_temp 0 9211 &iwl_dbgfs_frame_stats_read_9211 ++out_write_index_show_9212 out_write_index_show 0 9212 NULL nohasharray ++new_dev_store_9212 new_dev_store 0-3 9212 &out_write_index_show_9212 ++pm8001_task_prep_smp_9214 pm8001_task_prep_smp 0 9214 NULL ++card_send_command_9215 card_send_command 3 9215 NULL ++vti6_change_mtu_9216 vti6_change_mtu 0 9216 NULL ++protocol_write_9219 protocol_write 3-0 9219 NULL ++store_spi_transport_dt_9220 store_spi_transport_dt 0-4 9220 NULL ++tx_tx_prepared_descs_read_9221 tx_tx_prepared_descs_read 3-0 9221 NULL ++l2cap_create_connless_pdu_9222 l2cap_create_connless_pdu 3 9222 NULL nohasharray ++splice_to_pipe_9222 splice_to_pipe 0 9222 &l2cap_create_connless_pdu_9222 ++sctp_getsockopt_delayed_ack_9232 sctp_getsockopt_delayed_ack 2 9232 NULL nohasharray ++core_alua_show_preferred_bit_9232 core_alua_show_preferred_bit 0 9232 &sctp_getsockopt_delayed_ack_9232 ++edac_dev_ctl_info_store_9233 edac_dev_ctl_info_store 0-4 9233 NULL ++tps6507x_pmic_reg_read_9236 tps6507x_pmic_reg_read 0 9236 NULL ++__bnx2fc_enable_9238 __bnx2fc_enable 0 9238 NULL ++ext4_mark_iloc_dirty_9239 ext4_mark_iloc_dirty 0 9239 NULL ++smack_inode_getsecctx_9240 smack_inode_getsecctx 0 9240 NULL ++hw_init_hmac_9242 hw_init_hmac 0 9242 NULL ++min_freq_store_9245 min_freq_store 0-4 9245 NULL ++cmtp_add_msgpart_9252 cmtp_add_msgpart 4 9252 NULL ++show_ipInTruncatedPkts_9253 show_ipInTruncatedPkts 0 9253 NULL ++queue_max_segment_size_show_9258 queue_max_segment_size_show 0 9258 NULL nohasharray ++tcf_csum_ipv4_icmp_9258 tcf_csum_ipv4_icmp 3 9258 &queue_max_segment_size_show_9258 ++hfsplus_bnode_read_u16_9262 hfsplus_bnode_read_u16 0 9262 NULL ++nfs_refresh_inode_9263 nfs_refresh_inode 0 9263 NULL ++btrfs_search_slot_9264 btrfs_search_slot 0 9264 NULL ++set_in0_max_9266 set_in0_max 0-4 9266 NULL ++sdev_show_evt_inquiry_change_reported_9267 sdev_show_evt_inquiry_change_reported 0 9267 NULL ++CalcStateExt_9270 CalcStateExt 0 9270 NULL ++show_fnode_tcp_timestamp_stat_9272 show_fnode_tcp_timestamp_stat 0 9272 NULL ++hdpvr_read_9273 hdpvr_read 3-0 9273 NULL ++flakey_status_9274 flakey_status 5 9274 NULL ++show_fan_stop_time_9276 show_fan_stop_time 0 9276 NULL ++show_indirect_byte_9278 show_indirect_byte 0 9278 NULL nohasharray ++open_9278 open 0 9278 &show_indirect_byte_9278 ++ipoib_change_mtu_9279 ipoib_change_mtu 0 9279 NULL ++i2c_algo_dp_aux_transaction_9282 i2c_algo_dp_aux_transaction 0 9282 NULL ++show_9287 show 0 9287 NULL ++vmci_qpair_dequev_9288 vmci_qpair_dequev 0-3 9288 NULL nohasharray ++__fuse_direct_read_9288 __fuse_direct_read 0 9288 &vmci_qpair_dequev_9288 ++riva_load_video_mode_9289 riva_load_video_mode 0 9289 NULL ++ppp_sync_write_9296 ppp_sync_write 0 9296 NULL ++pwc_set_awb_9297 pwc_set_awb 0 9297 NULL ++omfs_setattr_9302 omfs_setattr 0 9302 NULL ++qla82xx_pci_set_window_9303 qla82xx_pci_set_window 0-2 9303 NULL nohasharray ++mc44s803_get_if_frequency_9303 mc44s803_get_if_frequency 0 9303 &qla82xx_pci_set_window_9303 ++gpio_keys_show_disabled_switches_9306 gpio_keys_show_disabled_switches 0 9306 NULL ++iwl_dbgfs_stations_read_9309 iwl_dbgfs_stations_read 3-0 9309 NULL ++ceph_sync_setxattr_9310 ceph_sync_setxattr 0 9310 NULL ++r820t_set_mux_9314 r820t_set_mux 0 9314 NULL nohasharray ++tw9903_s_ctrl_9314 tw9903_s_ctrl 0 9314 &r820t_set_mux_9314 ++regmap_i2c_read_9316 regmap_i2c_read 0 9316 NULL ++xfs_bmap_add_attrfork_extents_9318 xfs_bmap_add_attrfork_extents 0 9318 NULL ++__blockdev_direct_IO_9321 __blockdev_direct_IO 0-6 9321 NULL ++goku_ep_enable_9325 goku_ep_enable 0 9325 NULL ++description_show_9327 description_show 0 9327 NULL ++acpi_ex_prep_field_value_9328 acpi_ex_prep_field_value 0 9328 NULL ++module_attr_store_9333 module_attr_store 0-4 9333 NULL ++ieee80211_if_fmt_txpower_9334 ieee80211_if_fmt_txpower 3 9334 NULL ++acerhdf_get_trip_type_9336 acerhdf_get_trip_type 0 9336 NULL nohasharray ++brcmf_sdiod_recv_buf_9336 brcmf_sdiod_recv_buf 3 9336 &acerhdf_get_trip_type_9336 ++nvme_trans_fmt_get_parm_header_9340 nvme_trans_fmt_get_parm_header 2 9340 NULL nohasharray ++b43_pcmcia_suspend_9340 b43_pcmcia_suspend 0 9340 &nvme_trans_fmt_get_parm_header_9340 ++get_pipes_num_9343 get_pipes_num 0 9343 NULL ++esd_usb2_send_msg_9348 esd_usb2_send_msg 0 9348 NULL ++smi_data_buf_realloc_9360 smi_data_buf_realloc 0 9360 NULL ++ll_direct_rw_pages_9361 ll_direct_rw_pages 0 9361 NULL ++fan_get_max_state_9363 fan_get_max_state 0 9363 NULL ++prepare_fw_update_9365 prepare_fw_update 0 9365 NULL ++sta_beacon_loss_count_read_9370 sta_beacon_loss_count_read 3-0 9370 NULL ++b43legacy_attr_interfmode_show_9373 b43legacy_attr_interfmode_show 0 9373 NULL ++raid5_start_reshape_9374 raid5_start_reshape 0 9374 NULL nohasharray ++reiserfs_write_end_9374 reiserfs_write_end 0-5 9374 &raid5_start_reshape_9374 ++qlcnic_82xx_napi_add_9375 qlcnic_82xx_napi_add 0 9375 NULL ++vivid_radio_rx_read_9376 vivid_radio_rx_read 0 9376 NULL ++cx18_av_audio_s_ctrl_9378 cx18_av_audio_s_ctrl 0 9378 NULL ++pci_stub_notifier_9381 pci_stub_notifier 0 9381 NULL ++provides_device_sdrs_show_9385 provides_device_sdrs_show 0 9385 NULL ++queue_skb_9391 queue_skb 0 9391 NULL ++s5m_rtc_start_alarm_9393 s5m_rtc_start_alarm 0 9393 NULL nohasharray ++mlx4_bitmap_init_9393 mlx4_bitmap_init 5-2 9393 &s5m_rtc_start_alarm_9393 ++apds990x_set_arate_9394 apds990x_set_arate 0 9394 NULL ++virtqueue_add_outbuf_9395 virtqueue_add_outbuf 3 9395 NULL ++cx23885_buf_prepare_9397 cx23885_buf_prepare 0 9397 NULL nohasharray ++read_9397 read 3 9397 &cx23885_buf_prepare_9397 ++__jbd2_journal_force_commit_9398 __jbd2_journal_force_commit 0 9398 NULL ++o2nm_node_show_9403 o2nm_node_show 0 9403 NULL ++show_ipInHdrErrors_9405 show_ipInHdrErrors 0 9405 NULL nohasharray ++writepage_nounlock_9405 writepage_nounlock 0 9405 &show_ipInHdrErrors_9405 ++softdog_notify_sys_9410 softdog_notify_sys 0 9410 NULL ++tpm_stm_i2c_send_9412 tpm_stm_i2c_send 3-0 9412 NULL ++nobh_truncate_page_9414 nobh_truncate_page 0 9414 NULL nohasharray ++qlcnic_sriov_pf_cal_res_limit_9414 qlcnic_sriov_pf_cal_res_limit 0 9414 &nobh_truncate_page_9414 ++hash_ipportip4_expire_9415 hash_ipportip4_expire 4 9415 NULL ++i2c_sysfs_new_device_9417 i2c_sysfs_new_device 0-4 9417 NULL ++store_lmc_9418 store_lmc 0-4 9418 NULL nohasharray ++nf_nat_sip_expect_9418 nf_nat_sip_expect 8 9418 &store_lmc_9418 ++show_ipv6_iface_router_state_9425 show_ipv6_iface_router_state 0 9425 NULL nohasharray ++prism2_aux_dump_proc_no_read_9425 prism2_aux_dump_proc_no_read 0-3 9425 &show_ipv6_iface_router_state_9425 ++sync_inode_9429 sync_inode 0 9429 NULL ++bm_realloc_pages_9431 bm_realloc_pages 2 9431 NULL ++kvm_cpu_hotplug_9434 kvm_cpu_hotplug 0 9434 NULL nohasharray ++store_auto_brightness_9434 store_auto_brightness 0-4 9434 &kvm_cpu_hotplug_9434 ++sd_start_72a_9437 sd_start_72a 0 9437 NULL ++wacom_show_speed_9438 wacom_show_speed 0 9438 NULL nohasharray ++ocfs2_last_eb_is_empty_9438 ocfs2_last_eb_is_empty 0 9438 &wacom_show_speed_9438 nohasharray ++ffs_ep0_write_9438 ffs_ep0_write 3 9438 &ocfs2_last_eb_is_empty_9438 ++mc13xxx_irq_unmask_9441 mc13xxx_irq_unmask 2-0 9441 NULL ++kmalloc_array_9444 kmalloc_array 2-1 9444 NULL ++b43_attr_interfmode_show_9448 b43_attr_interfmode_show 0 9448 NULL ++cpu_slabs_show_9451 cpu_slabs_show 0 9451 NULL ++ieee80211_if_fmt_fwded_unicast_9454 ieee80211_if_fmt_fwded_unicast 3 9454 NULL ++mcs_unwrap_mir_9455 mcs_unwrap_mir 3 9455 NULL ++ad_aggregator_id_show_9456 ad_aggregator_id_show 0 9456 NULL ++show_in_max2_9458 show_in_max2 0 9458 NULL ++alloc_stac_spec_9459 alloc_stac_spec 0 9459 NULL ++fcoe_dcb_app_notification_9468 fcoe_dcb_app_notification 0 9468 NULL ++agp_generic_alloc_user_9470 agp_generic_alloc_user 1 9470 NULL nohasharray ++adis16136_read_frequency_9470 adis16136_read_frequency 0 9470 &agp_generic_alloc_user_9470 nohasharray ++get_registers_9470 get_registers 4 9470 &adis16136_read_frequency_9470 ++parport_uss720_write_compat_9471 parport_uss720_write_compat 0 9471 NULL nohasharray ++notify_recv_init_9471 notify_recv_init 0 9471 &parport_uss720_write_compat_9471 ++slab_mem_going_online_callback_9474 slab_mem_going_online_callback 0 9474 NULL ++queue_9475 queue 0 9475 NULL ++shared_cpu_list_show_9488 shared_cpu_list_show 0 9488 NULL nohasharray ++proc_bus_pci_write_9488 proc_bus_pci_write 0-3 9488 &shared_cpu_list_show_9488 ++crypt_status_9492 crypt_status 5 9492 NULL nohasharray ++patch_cs4208_9492 patch_cs4208 0 9492 &crypt_status_9492 nohasharray ++__alloc_preds_9492 __alloc_preds 2 9492 &patch_cs4208_9492 ++target_core_dev_pr_show_attr_res_pr_registered_i_pts_9493 target_core_dev_pr_show_attr_res_pr_registered_i_pts 0 9493 NULL ++show_tabletYtilt_9494 show_tabletYtilt 0 9494 NULL ++spi_w8r8_9497 spi_w8r8 0 9497 NULL ++sock_recvmsg_9500 sock_recvmsg 0-3 9500 NULL ++lbs_threshold_write_9502 lbs_threshold_write 5-0 9502 NULL ++str_to_quirk_9507 str_to_quirk 0 9507 NULL ++keyring_diff_objects_9508 keyring_diff_objects 0 9508 NULL ++amd_ec_wait_read_9509 amd_ec_wait_read 0 9509 NULL ++lp_write_9511 lp_write 3-0 9511 NULL nohasharray ++saa717x_s_ctrl_9511 saa717x_s_ctrl 0 9511 &lp_write_9511 nohasharray ++ad7266_wakeup_9511 ad7266_wakeup 0 9511 &saa717x_s_ctrl_9511 ++vivid_vbi_cap_s_ctrl_9512 vivid_vbi_cap_s_ctrl 0 9512 NULL nohasharray ++powerclamp_get_max_state_9512 powerclamp_get_max_state 0 9512 &vivid_vbi_cap_s_ctrl_9512 ++cx88_risc_databuffer_9515 cx88_risc_databuffer 0 9515 NULL ++disk_events_show_9516 disk_events_show 0 9516 NULL nohasharray ++match_format_9516 match_format 0 9516 &disk_events_show_9516 ++do_strip_9517 do_strip 0 9517 NULL ++target_core_alua_tg_pt_gp_show_attr_preferred_9519 target_core_alua_tg_pt_gp_show_attr_preferred 0 9519 NULL ++roccat_common2_sysfs_read_keys_macro_9524 roccat_common2_sysfs_read_keys_macro 0-5-6 9524 NULL ++log_buf_len_show_9525 log_buf_len_show 0 9525 NULL ++ll_max_read_ahead_whole_mb_seq_write_9528 ll_max_read_ahead_whole_mb_seq_write 3 9528 NULL ++lm3533_update_9529 lm3533_update 0 9529 NULL ++command_setvloffset_9530 command_setvloffset 0 9530 NULL ++radeon_fb_helper_set_par_9531 radeon_fb_helper_set_par 0 9531 NULL ++ceph_vxattrcb_layout_stripe_unit_9532 ceph_vxattrcb_layout_stripe_unit 0 9532 NULL ++ext3_alloc_branch_9534 ext3_alloc_branch 5 9534 NULL ++fuse_readpage_9536 fuse_readpage 0 9536 NULL ++read_cc_table_bin_9538 read_cc_table_bin 0-5-6 9538 NULL ++iwl_dbgfs_bf_params_read_9542 iwl_dbgfs_bf_params_read 3-0 9542 NULL ++il_dbgfs_missed_beacon_write_9546 il_dbgfs_missed_beacon_write 3-0 9546 NULL nohasharray ++unmerge_ksm_pages_9546 unmerge_ksm_pages 0 9546 &il_dbgfs_missed_beacon_write_9546 ++gsc_m2m_start_streaming_9548 gsc_m2m_start_streaming 0 9548 NULL nohasharray ++udc_start_9548 udc_start 0 9548 &gsc_m2m_start_streaming_9548 nohasharray ++audit_log_n_untrustedstring_9548 audit_log_n_untrustedstring 3 9548 &udc_start_9548 nohasharray ++compat_SyS_pwritev64_9548 compat_SyS_pwritev64 3 9548 &audit_log_n_untrustedstring_9548 ++kyrofb_check_var_9550 kyrofb_check_var 0 9550 NULL ++pm_runtime_get_9552 pm_runtime_get 0 9552 NULL ++ads1015_read_adc_9556 ads1015_read_adc 0 9556 NULL ++batadv_tt_prepare_tvlv_global_data_9557 batadv_tt_prepare_tvlv_global_data 0 9557 NULL ++fw_node_create_9559 fw_node_create 2 9559 NULL ++ipath_get_user_pages_9561 ipath_get_user_pages 0 9561 NULL ++_nfs4_proc_access_9563 _nfs4_proc_access 0 9563 NULL nohasharray ++mwifiex_cmd_coalesce_cfg_9563 mwifiex_cmd_coalesce_cfg 0 9563 &_nfs4_proc_access_9563 ++kobj_map_9566 kobj_map 3-2-0 9566 NULL ++status_9569 status 0 9569 NULL nohasharray ++m88e1149_config_init_9569 m88e1149_config_init 0 9569 &status_9569 ++ds1343_set_alarm_9573 ds1343_set_alarm 0 9573 NULL ++f2fs_read_data_pages_9574 f2fs_read_data_pages 4 9574 NULL ++add_memory_9575 add_memory 0 9575 NULL ++sch_access_9576 sch_access 0 9576 NULL ++xc_write_reg_9578 xc_write_reg 0 9578 NULL ++snd_cmipci_capture_spdif_prepare_9581 snd_cmipci_capture_spdif_prepare 0 9581 NULL ++tps65912_reg_enable_9587 tps65912_reg_enable 0 9587 NULL nohasharray ++khugepaged_defrag_store_9587 khugepaged_defrag_store 4-0 9587 &tps65912_reg_enable_9587 ++shmem_write_begin_9589 shmem_write_begin 0 9589 NULL ++bop_mark_9593 bop_mark 0 9593 NULL ++wl1271_cmd_configure_9598 wl1271_cmd_configure 0 9598 NULL ++store_rps_map_9600 store_rps_map 0-4 9600 NULL ++__cfqg_set_weight_device_9602 __cfqg_set_weight_device 0-3 9602 NULL ++do_sync_9604 do_sync 1 9604 NULL ++snd_emu10k1_fx8010_read_9605 snd_emu10k1_fx8010_read 5-0 9605 NULL nohasharray ++xfs_qm_dqattach_one_9605 xfs_qm_dqattach_one 0 9605 &snd_emu10k1_fx8010_read_9605 nohasharray ++batadv_send_skb_push_fill_unicast_9605 batadv_send_skb_push_fill_unicast 2 9605 &xfs_qm_dqattach_one_9605 ++ixgbevf_set_vfta_vf_9608 ixgbevf_set_vfta_vf 0 9608 NULL ++acpi_ns_build_internal_name_9620 acpi_ns_build_internal_name 0 9620 NULL nohasharray ++watchdog_notify_sys_9620 watchdog_notify_sys 0 9620 &acpi_ns_build_internal_name_9620 ++lov_ost_pool_add_9626 lov_ost_pool_add 3 9626 NULL ++saa7164_buffer_alloc_user_9627 saa7164_buffer_alloc_user 2 9627 NULL ++i801_block_transaction_byte_by_byte_9630 i801_block_transaction_byte_by_byte 0 9630 NULL nohasharray ++copy_msghdr_from_user_9630 copy_msghdr_from_user 0 9630 &i801_block_transaction_byte_by_byte_9630 ++kernfs_iop_listxattr_9634 kernfs_iop_listxattr 0-3 9634 NULL ++ceph_copy_user_to_page_vector_9635 ceph_copy_user_to_page_vector 3-4 9635 NULL ++acpi_ex_insert_into_field_9638 acpi_ex_insert_into_field 0 9638 NULL ++compat_sys_keyctl_9639 compat_sys_keyctl 4 9639 NULL nohasharray ++show_umcast_9639 show_umcast 0 9639 &compat_sys_keyctl_9639 nohasharray ++show_country_codes_9639 show_country_codes 0 9639 &show_umcast_9639 ++mptsas_get_enclosure_identifier_9640 mptsas_get_enclosure_identifier 0 9640 NULL ++lmLogInit_9643 lmLogInit 0 9643 NULL ++patch_vt1709_9644 patch_vt1709 0 9644 NULL ++ll_checksum_seq_write_9648 ll_checksum_seq_write 3 9648 NULL ++ocfs2_xattr_get_rec_9652 ocfs2_xattr_get_rec 0 9652 NULL nohasharray ++zd_ioread32_locked_9652 zd_ioread32_locked 0 9652 &ocfs2_xattr_get_rec_9652 ++__uncore_cmask8_show_9653 __uncore_cmask8_show 0 9653 NULL ++snd_seq_ioctl_set_queue_client_9655 snd_seq_ioctl_set_queue_client 0 9655 NULL ++ceph_fscache_inode_get_key_9656 ceph_fscache_inode_get_key 0 9656 NULL ++queue_received_packet_9657 queue_received_packet 5 9657 NULL ++usnic_ib_show_fw_ver_9663 usnic_ib_show_fw_ver 0 9663 NULL nohasharray ++cifs_set_file_info_9663 cifs_set_file_info 0 9663 &usnic_ib_show_fw_ver_9663 ++inode_setattr_9668 inode_setattr 0 9668 NULL ++snd_opl4_mem_proc_write_9670 snd_opl4_mem_proc_write 5 9670 NULL ++s_audio_sampling_freq_9675 s_audio_sampling_freq 0 9675 NULL ++dns_query_9676 dns_query 3 9676 NULL nohasharray ++snd_ac97_dev_register_9676 snd_ac97_dev_register 0 9676 &dns_query_9676 nohasharray ++ks8842_read16_9676 ks8842_read16 0 9676 &snd_ac97_dev_register_9676 ++qib_7322_handle_hwerrors_9678 qib_7322_handle_hwerrors 3 9678 NULL ++calgary_map_sg_9680 calgary_map_sg 0-3 9680 NULL ++urbnum_show_9682 urbnum_show 0 9682 NULL nohasharray ++wl1271_init_templates_config_9682 wl1271_init_templates_config 0 9682 &urbnum_show_9682 ++nilfs_btree_lookup_9685 nilfs_btree_lookup 0 9685 NULL ++show_in0_9686 show_in0 0 9686 NULL ++__erst_read_from_storage_9690 __erst_read_from_storage 0 9690 NULL ++bfs_writepage_9692 bfs_writepage 0 9692 NULL ++crc32_final_9693 crc32_final 0 9693 NULL ++get_max_brightness_9697 get_max_brightness 0 9697 NULL ++lowpan_control_write_9699 lowpan_control_write 3-0 9699 NULL ++vx_transfer_end_9701 vx_transfer_end 0 9701 NULL nohasharray ++show_turbo_cooldown_9701 show_turbo_cooldown 0 9701 &vx_transfer_end_9701 nohasharray ++tpm_tis_send_data_9701 tpm_tis_send_data 0 9701 &show_turbo_cooldown_9701 ++fuse_iter_npages_9705 fuse_iter_npages 0 9705 NULL nohasharray ++ieee80211_if_read_aid_9705 ieee80211_if_read_aid 3-0 9705 &fuse_iter_npages_9705 ++update_flag_9706 update_flag 0 9706 NULL ++core_alua_store_preferred_bit_9711 core_alua_store_preferred_bit 0-3 9711 NULL ++il4965_commit_rxon_9717 il4965_commit_rxon 0 9717 NULL ++parse_uac2_sample_rate_range_9718 parse_uac2_sample_rate_range 0 9718 NULL ++sstfb_set_par_9719 sstfb_set_par 0 9719 NULL ++SYSC_ppoll_9721 SYSC_ppoll 2 9721 NULL ++t4_wr_mbox_9732 t4_wr_mbox 0 9732 NULL ++show_cmd_per_lun_9735 show_cmd_per_lun 0 9735 NULL nohasharray ++c2port_show_rev_id_9735 c2port_show_rev_id 0 9735 &show_cmd_per_lun_9735 ++get_flashnode_param_9736 get_flashnode_param 0 9736 NULL ++ieee80211_if_fmt_num_mcast_sta_9738 ieee80211_if_fmt_num_mcast_sta 3 9738 NULL ++number_of_sets_show_9739 number_of_sets_show 0 9739 NULL ++shmem_replace_page_9740 shmem_replace_page 0 9740 NULL ++ddb_input_read_9743 ddb_input_read 3-0 9743 NULL nohasharray ++set_otp1_9743 set_otp1 4-0 9743 &ddb_input_read_9743 ++uuid_show_9749 uuid_show 0 9749 NULL ++regmap_multi_reg_write_bypassed_9751 regmap_multi_reg_write_bypassed 3 9751 NULL nohasharray ++sta_last_ack_signal_read_9751 sta_last_ack_signal_read 3-0 9751 ®map_multi_reg_write_bypassed_9751 ++dsa_slave_get_regs_len_9753 dsa_slave_get_regs_len 0 9753 NULL ++o2nm_cluster_attr_fence_method_write_9755 o2nm_cluster_attr_fence_method_write 0-3 9755 NULL ++pcpu_alloc_9757 pcpu_alloc 1-2 9757 NULL ++store_fc_rport_fast_io_fail_tmo_9761 store_fc_rport_fast_io_fail_tmo 0-4 9761 NULL ++set_rtc_irq_bit_9763 set_rtc_irq_bit 0 9763 NULL ++__alloc_percpu_9764 __alloc_percpu 1-2 9764 NULL ++kexec_loaded_show_9765 kexec_loaded_show 0 9765 NULL ++sctp_send_asconf_del_ip_9767 sctp_send_asconf_del_ip 0 9767 NULL ++amd_decode_mce_9768 amd_decode_mce 0 9768 NULL ++sh_eth_check_reset_9773 sh_eth_check_reset 0 9773 NULL ++mapping_error_9774 mapping_error 0 9774 NULL ++__blk_queue_init_tags_9778 __blk_queue_init_tags 2 9778 NULL nohasharray ++eni_open_9778 eni_open 0 9778 &__blk_queue_init_tags_9778 ++reset_write_9784 reset_write 0-3 9784 NULL ++wl12xx_fetch_firmware_9788 wl12xx_fetch_firmware 0 9788 NULL nohasharray ++gpio_value_store_9788 gpio_value_store 0-4 9788 &wl12xx_fetch_firmware_9788 ++ali1535_transaction_9792 ali1535_transaction 0 9792 NULL ++dib8096p_tuner_write_serpar_9793 dib8096p_tuner_write_serpar 0-3 9793 NULL ++bio_alloc_map_data_9798 bio_alloc_map_data 1 9798 NULL nohasharray ++snd_pcm_dev_register_9798 snd_pcm_dev_register 0 9798 &bio_alloc_map_data_9798 ++ath10k_debug_start_9800 ath10k_debug_start 0 9800 NULL ++_regmap_write_9803 _regmap_write 0 9803 NULL ++can_change_mtu_9804 can_change_mtu 0 9804 NULL ++ieee80211_if_read_state_9813 ieee80211_if_read_state 3-0 9813 NULL nohasharray ++snd_pcm_lib_alloc_vmalloc_32_buffer_9813 snd_pcm_lib_alloc_vmalloc_32_buffer 2 9813 &ieee80211_if_read_state_9813 nohasharray ++udpv6_recvmsg_9813 udpv6_recvmsg 4-0 9813 &snd_pcm_lib_alloc_vmalloc_32_buffer_9813 ++ath9k_start_9815 ath9k_start 0 9815 NULL ++pnp_mem_start_9817 pnp_mem_start 0 9817 NULL ++kernel_physical_mapping_init_9818 kernel_physical_mapping_init 0-2-1 9818 NULL ++regulator_bypass_show_9824 regulator_bypass_show 0 9824 NULL ++show_sas_rphy_bay_identifier_9826 show_sas_rphy_bay_identifier 0 9826 NULL nohasharray ++tipc_setsockopt_9826 tipc_setsockopt 0 9826 &show_sas_rphy_bay_identifier_9826 ++log_recovery_delay_show_9827 log_recovery_delay_show 0 9827 NULL ++compat_SyS_vmsplice_9828 compat_SyS_vmsplice 3 9828 NULL ++parport_uss720_ecp_write_addr_9838 parport_uss720_ecp_write_addr 0 9838 NULL ++dvb_dvr_set_buffer_size_9840 dvb_dvr_set_buffer_size 2 9840 NULL ++rtl92ce_hw_init_9858 rtl92ce_hw_init 0 9858 NULL ++iwl_poll_prph_bit_9861 iwl_poll_prph_bit 0 9861 NULL ++bfad_im_model_show_9862 bfad_im_model_show 0 9862 NULL ++pmcraid_alloc_sglist_9864 pmcraid_alloc_sglist 1 9864 NULL ++task_can_attach_9867 task_can_attach 0 9867 NULL ++f1x_translate_sysaddr_to_cs_9868 f1x_translate_sysaddr_to_cs 2 9868 NULL ++wil_read_file_ioblob_9878 wil_read_file_ioblob 3-0 9878 NULL nohasharray ++dir_commit_chunk_9878 dir_commit_chunk 3 9878 &wil_read_file_ioblob_9878 ++fuse_dev_read_9884 fuse_dev_read 0 9884 NULL ++wl1271_cmd_radio_parms_9886 wl1271_cmd_radio_parms 0 9886 NULL ++show_sensor_9889 show_sensor 0 9889 NULL ++bm_register_write_9893 bm_register_write 3-0 9893 NULL nohasharray ++snd_midi_event_new_9893 snd_midi_event_new 1 9893 &bm_register_write_9893 ++snd_gf1_pcm_playback_copy_9895 snd_gf1_pcm_playback_copy 5 9895 NULL ++aac_show_vendor_9903 aac_show_vendor 0 9903 NULL ++write_9907 write 0-3 9907 NULL ++compat_sys_ipc_9912 compat_sys_ipc 3 9912 NULL ++sr_write_cmd_async_9921 sr_write_cmd_async 5 9921 NULL ++bq2415x_i2c_read_bit_9924 bq2415x_i2c_read_bit 3-0 9924 NULL ++file_permission_9925 file_permission 0 9925 NULL ++zd1201_mac_reset_9926 zd1201_mac_reset 0 9926 NULL ++iwl_dbgfs_prph_reg_read_9928 iwl_dbgfs_prph_reg_read 3-0 9928 NULL ++store_remote_ip_9929 store_remote_ip 0 9929 NULL ++metapage_writepage_9936 metapage_writepage 0 9936 NULL ++tc3589x_reg_read_9940 tc3589x_reg_read 0 9940 NULL ++pstore_ftrace_knob_read_9947 pstore_ftrace_knob_read 3 9947 NULL ++read_file_misc_9948 read_file_misc 3-0 9948 NULL ++bh1770_get_lux_rate_9949 bh1770_get_lux_rate 0 9949 NULL ++set_rxd_buffer_pointer_9950 set_rxd_buffer_pointer 8 9950 NULL ++ext2_new_blocks_9954 ext2_new_blocks 2-0 9954 NULL ++csum_partial_copy_fromiovecend_9957 csum_partial_copy_fromiovecend 4-3 9957 NULL ++iscsi_tpg_param_show_MaxOutstandingR2T_9959 iscsi_tpg_param_show_MaxOutstandingR2T 0 9959 NULL ++SyS_gethostname_9964 SyS_gethostname 2 9964 NULL ++iscsit_ta_demo_mode_discovery_9966 iscsit_ta_demo_mode_discovery 0 9966 NULL nohasharray ++edac_dev_block_store_9966 edac_dev_block_store 0-4 9966 &iscsit_ta_demo_mode_discovery_9966 ++get_free_serial_index_9969 get_free_serial_index 0 9969 NULL ++vivid_loop_out_s_ctrl_9970 vivid_loop_out_s_ctrl 0 9970 NULL nohasharray ++store_9970 store 0 9970 &vivid_loop_out_s_ctrl_9970 ++btrfs_add_link_9973 btrfs_add_link 5 9973 NULL nohasharray ++show_fcstat_rx_frames_9973 show_fcstat_rx_frames 0 9973 &btrfs_add_link_9973 ++ath6kl_usb_submit_ctrl_out_9978 ath6kl_usb_submit_ctrl_out 6 9978 NULL ++il4965_dump_fh_9979 il4965_dump_fh 0 9979 NULL ++twl6040_power_up_manual_9982 twl6040_power_up_manual 0 9982 NULL nohasharray ++sscanf_9982 sscanf 0 9982 &twl6040_power_up_manual_9982 nohasharray ++ixgbevf_obtain_mbx_lock_vf_9982 ixgbevf_obtain_mbx_lock_vf 0 9982 &sscanf_9982 ++max_power_store_9983 max_power_store 0-4 9983 NULL nohasharray ++store_fan16_9983 store_fan16 0-4 9983 &max_power_store_9983 ++SYSC_move_pages_9986 SYSC_move_pages 2 9986 NULL nohasharray ++nfs_writepage_locked_9986 nfs_writepage_locked 0 9986 &SYSC_move_pages_9986 ++ems_usb_command_msg_9991 ems_usb_command_msg 0 9991 NULL ++set_tcrit1_9995 set_tcrit1 0-4 9995 NULL ++ath10k_peer_create_9999 ath10k_peer_create 0 9999 NULL ++ext2_get_block_10001 ext2_get_block 0 10001 NULL ++store_als_en_10003 store_als_en 0-4 10003 NULL ++dimmdev_edac_mode_show_10010 dimmdev_edac_mode_show 0 10010 NULL ++check_tp_10015 check_tp 0 10015 NULL ++i915_gem_obj_ggtt_pin_10018 i915_gem_obj_ggtt_pin 0 10018 NULL ++aat2870_dump_reg_10019 aat2870_dump_reg 0 10019 NULL ++da9063_rtc_stop_alarm_10020 da9063_rtc_stop_alarm 0 10020 NULL ++nouveau_hwmon_set_temp1_auto_point1_temp_hyst_10022 nouveau_hwmon_set_temp1_auto_point1_temp_hyst 0-4 10022 NULL ++handle_request_10024 handle_request 9 10024 NULL ++show_tcpRtoMin_10025 show_tcpRtoMin 0 10025 NULL ++igb_enable_sriov_10027 igb_enable_sriov 0 10027 NULL ++hdmi_pin_hbr_setup_10030 hdmi_pin_hbr_setup 0 10030 NULL ++bnx2_alloc_bad_rbuf_10032 bnx2_alloc_bad_rbuf 0 10032 NULL ++show_fc_vport_roles_10033 show_fc_vport_roles 0 10033 NULL ++rx8581_rtc_read_time_10036 rx8581_rtc_read_time 0 10036 NULL ++mgmt_alloc_cmd_data_10037 mgmt_alloc_cmd_data 0 10037 NULL ++protection_level_store_10041 protection_level_store 0-4 10041 NULL ++wcn36xx_add_interface_10046 wcn36xx_add_interface 0 10046 NULL nohasharray ++sm501fb_set_par_pnl_10046 sm501fb_set_par_pnl 0 10046 &wcn36xx_add_interface_10046 ++bop_propagate_10048 bop_propagate 0 10048 NULL ++wl1271_acx_bcn_dtim_options_10051 wl1271_acx_bcn_dtim_options 0 10051 NULL ++regulator_ena_gpio_ctrl_10053 regulator_ena_gpio_ctrl 0 10053 NULL nohasharray ++mlx4_en_config_rss_qp_10053 mlx4_en_config_rss_qp 0 10053 ®ulator_ena_gpio_ctrl_10053 ++show_protocol_stat_10062 show_protocol_stat 0 10062 NULL ++vfio_pci_write_10063 vfio_pci_write 3-0 10063 NULL ++asymmetric_key_generate_id_10064 asymmetric_key_generate_id 4-2 10064 NULL nohasharray ++send_common_10064 send_common 0 10064 &asymmetric_key_generate_id_10064 nohasharray ++bnad_setup_rx_10064 bnad_setup_rx 0 10064 &send_common_10064 ++ksdazzle_change_speed_10068 ksdazzle_change_speed 0 10068 NULL ++e100_get_regs_len_10071 e100_get_regs_len 0 10071 NULL ++epat_read_regr_10074 epat_read_regr 0 10074 NULL ++arkfb_set_par_10075 arkfb_set_par 0 10075 NULL ++ali1563_block_start_10077 ali1563_block_start 0 10077 NULL ++cdc_ncm_show_wNdpInAlignment_10081 cdc_ncm_show_wNdpInAlignment 0 10081 NULL nohasharray ++_ctl_device_handle_show_10081 _ctl_device_handle_show 0 10081 &cdc_ncm_show_wNdpInAlignment_10081 nohasharray ++wl1271_acx_feature_cfg_10081 wl1271_acx_feature_cfg 0 10081 &_ctl_device_handle_show_10081 ++hr222_pll_freq_register_10084 hr222_pll_freq_register 0 10084 NULL ++fsa9480_set_manualsw_10088 fsa9480_set_manualsw 0-4 10088 NULL ++il_add_station_common_10089 il_add_station_common 0 10089 NULL ++dev_exceptions_copy_10091 dev_exceptions_copy 0 10091 NULL ++xfs_attr_rmtval_get_10092 xfs_attr_rmtval_get 0 10092 NULL ++class_show_10093 class_show 0 10093 NULL ++nr_create_10094 nr_create 0 10094 NULL ++show_pwm_min_10095 show_pwm_min 0 10095 NULL ++adp8860_bl_l3_dark_dim_store_10096 adp8860_bl_l3_dark_dim_store 4-0 10096 NULL ++sctp_primitive_ASCONF_10098 sctp_primitive_ASCONF 0 10098 NULL nohasharray ++bcm5482_config_init_10098 bcm5482_config_init 0 10098 &sctp_primitive_ASCONF_10098 ++wm831x_gpio_direction_in_10099 wm831x_gpio_direction_in 0 10099 NULL ++em28xx_read_reg_req_len_10100 em28xx_read_reg_req_len 0 10100 NULL nohasharray ++nouveau_hwmon_show_temp_10100 nouveau_hwmon_show_temp 0 10100 &em28xx_read_reg_req_len_10100 ++ubifs_tnc_add_10103 ubifs_tnc_add 0 10103 NULL ++xfs_btree_check_lptr_10104 xfs_btree_check_lptr 0 10104 NULL ++ufs_bitmap_search_10105 ufs_bitmap_search 0-3 10105 NULL ++get_elem_size_10110 get_elem_size 0-2 10110 NULL nohasharray ++dynamic_ps_timeout_read_10110 dynamic_ps_timeout_read 3-0 10110 &get_elem_size_10110 ++gfs2_meta_read_10112 gfs2_meta_read 0 10112 NULL ++host_control_smi_type_store_10118 host_control_smi_type_store 0-4 10118 NULL ++snd_vortex_pcm_trigger_10123 snd_vortex_pcm_trigger 0 10123 NULL ++wl1271_acx_host_if_cfg_bitmap_10124 wl1271_acx_host_if_cfg_bitmap 0 10124 NULL ++offset_to_bit_10134 offset_to_bit 0 10134 NULL nohasharray ++SyS_migrate_pages_10134 SyS_migrate_pages 2 10134 &offset_to_bit_10134 ++tipc_l2_device_event_10137 tipc_l2_device_event 0 10137 NULL ++dev_get_valid_name_10138 dev_get_valid_name 0 10138 NULL ++tw9906_s_ctrl_10143 tw9906_s_ctrl 0 10143 NULL ++null_hash_setkey_10147 null_hash_setkey 0 10147 NULL ++qlge_open_10148 qlge_open 0 10148 NULL ++show_alarms_10150 show_alarms 0 10150 NULL ++__dev_mc_add_10152 __dev_mc_add 0 10152 NULL ++enable_iso_interface_10154 enable_iso_interface 0 10154 NULL ++aes_decrypt_packets_read_10155 aes_decrypt_packets_read 3-0 10155 NULL ++rx_out_of_mem_read_10157 rx_out_of_mem_read 3-0 10157 NULL nohasharray ++lm3530_init_registers_10157 lm3530_init_registers 0 10157 &rx_out_of_mem_read_10157 nohasharray ++tracing_nsecs_write_10157 tracing_nsecs_write 3 10157 &lm3530_init_registers_10157 ++ol_chunk_entries_10159 ol_chunk_entries 0 10159 NULL nohasharray ++hidg_alloc_ep_req_10159 hidg_alloc_ep_req 2 10159 &ol_chunk_entries_10159 ++brcmf_msgbuf_init_pktids_10160 brcmf_msgbuf_init_pktids 1 10160 NULL ++snd_virmidi_dev_attach_seq_10164 snd_virmidi_dev_attach_seq 0 10164 NULL ++asd_store_update_bios_10165 asd_store_update_bios 4-0 10165 NULL ++cx2341x_hdl_api_10167 cx2341x_hdl_api 0 10167 NULL nohasharray ++icmpv6_error_10167 icmpv6_error 0 10167 &cx2341x_hdl_api_10167 ++kstrtol_from_user_10168 kstrtol_from_user 2-0 10168 NULL ++persistent_ram_vmap_10169 persistent_ram_vmap 1-2 10169 NULL ++init_rfdlist_10170 init_rfdlist 0 10170 NULL ++proc_pid_attr_read_10173 proc_pid_attr_read 3-0 10173 NULL ++hpfs_statfs_10175 hpfs_statfs 0 10175 NULL ++pci_bus_write_config_word_10180 pci_bus_write_config_word 0 10180 NULL ++jffs2_user_setxattr_10182 jffs2_user_setxattr 4-0 10182 NULL ++address_read_file_10187 address_read_file 0 10187 NULL ++cw1200_wsm_dumps_10192 cw1200_wsm_dumps 0-3 10192 NULL ++proc_pid_permission_10194 proc_pid_permission 0 10194 NULL ++volume_set_mute_10197 volume_set_mute 0 10197 NULL ++cy8ctmg110_write_regs_10204 cy8ctmg110_write_regs 3 10204 NULL ++extent_writepages_10205 extent_writepages 0 10205 NULL ++cmpc_accel_g_select_show_v4_10207 cmpc_accel_g_select_show_v4 0 10207 NULL ++lpfc_link_state_store_10215 lpfc_link_state_store 0-4 10215 NULL ++__nf_nat_alloc_null_binding_10216 __nf_nat_alloc_null_binding 0 10216 NULL ++wl12xx_spi_raw_write_10217 wl12xx_spi_raw_write 0 10217 NULL ++ihex_validate_fw_10218 ihex_validate_fw 0 10218 NULL ++xfs_attr_rmtval_copyout_10222 xfs_attr_rmtval_copyout 0 10222 NULL ++fsync_10223 fsync 0 10223 NULL ++keene_cmd_main_10225 keene_cmd_main 0 10225 NULL nohasharray ++ima_parse_add_rule_10225 ima_parse_add_rule 0 10225 &keene_cmd_main_10225 ++adv7175_g_fmt_10230 adv7175_g_fmt 0 10230 NULL ++ican3_old_send_msg_10231 ican3_old_send_msg 0 10231 NULL ++ec168_i2c_xfer_10235 ec168_i2c_xfer 0-3 10235 NULL ++videobuf_dma_init_overlay_10236 videobuf_dma_init_overlay 0 10236 NULL ++adfs_fplus_sync_10238 adfs_fplus_sync 0 10238 NULL ++drbd_send_all_10239 drbd_send_all 4 10239 NULL ++qlcnic_83xx_add_rings_10240 qlcnic_83xx_add_rings 0 10240 NULL nohasharray ++hdlc_rpr_irq_10240 hdlc_rpr_irq 2 10240 &qlcnic_83xx_add_rings_10240 ++ecryptfs_readpage_10242 ecryptfs_readpage 0 10242 NULL ++pm8001_ctl_sas_spec_support_show_10243 pm8001_ctl_sas_spec_support_show 0 10243 NULL ++__uncore_filter_mask_show_10244 __uncore_filter_mask_show 0 10244 NULL nohasharray ++mutex_lock_killable_10244 mutex_lock_killable 0 10244 &__uncore_filter_mask_show_10244 nohasharray ++nfc_alloc_recv_skb_10244 nfc_alloc_recv_skb 1 10244 &mutex_lock_killable_10244 ++ipip6_tunnel_init_10251 ipip6_tunnel_init 0 10251 NULL nohasharray ++m2p_find_override_pfn_10251 m2p_find_override_pfn 0-2 10251 &ipip6_tunnel_init_10251 ++ov2640_mask_set_10255 ov2640_mask_set 0 10255 NULL ++cciss_proc_write_10259 cciss_proc_write 3-0 10259 NULL ++store_protocols_10261 store_protocols 0-4 10261 NULL ++target_core_dev_attrib_attr_store_10273 target_core_dev_attrib_attr_store 0 10273 NULL nohasharray ++irq_affinity_proc_write_10273 irq_affinity_proc_write 3-0 10273 &target_core_dev_attrib_attr_store_10273 nohasharray ++snd_pcm_lib_preallocate_pages1_10273 snd_pcm_lib_preallocate_pages1 2 10273 &irq_affinity_proc_write_10273 ++xfs_bmbt_alloc_block_10277 xfs_bmbt_alloc_block 0 10277 NULL ++rx8025_get_clock_adjust_10280 rx8025_get_clock_adjust 0 10280 NULL ++__qlcnic_pci_sriov_enable_10281 __qlcnic_pci_sriov_enable 0-2 10281 NULL ++add_keys_10284 add_keys 0 10284 NULL ++toshiba_kbd_bl_timeout_store_10286 toshiba_kbd_bl_timeout_store 0-4 10286 NULL ++snd_rme9652_capture_copy_10287 snd_rme9652_capture_copy 5 10287 NULL ++ubi_leb_change_10289 ubi_leb_change 4-0 10289 NULL nohasharray ++adp8870_bl_l5_dark_max_show_10289 adp8870_bl_l5_dark_max_show 0 10289 &ubi_leb_change_10289 ++nvif_object_new_10300 nvif_object_new 5 10300 NULL ++therm_throt_device_show_core_throttle_count_10305 therm_throt_device_show_core_throttle_count 0 10305 NULL ++diolan_usb_transfer_10306 diolan_usb_transfer 0 10306 NULL nohasharray ++rocker_port_ctrl_vlan_add_10306 rocker_port_ctrl_vlan_add 0 10306 &diolan_usb_transfer_10306 ++usb_device_read_10309 usb_device_read 0-3 10309 NULL ++read_emulate_10310 read_emulate 2-4 10310 NULL nohasharray ++b43legacy_dma_mapping_error_10310 b43legacy_dma_mapping_error 2 10310 &read_emulate_10310 ++prod_id3_show_10314 prod_id3_show 0 10314 NULL ++show_in_max_alarm_10319 show_in_max_alarm 0 10319 NULL ++read_file_spectral_count_10320 read_file_spectral_count 3-0 10320 NULL nohasharray ++ican3_send_msg_10320 ican3_send_msg 0 10320 &read_file_spectral_count_10320 ++ldo_regulator_enable_10323 ldo_regulator_enable 0 10323 NULL nohasharray ++zd_chip_enable_hwint_10323 zd_chip_enable_hwint 0 10323 &ldo_regulator_enable_10323 ++cifs_permission_10324 cifs_permission 0 10324 NULL ++matroxfb_check_var_10327 matroxfb_check_var 0 10327 NULL nohasharray ++compat_SyS_writev_10327 compat_SyS_writev 3 10327 &matroxfb_check_var_10327 ++ubi_leb_read_10328 ubi_leb_read 0 10328 NULL ++bcmgenet_alloc_rx_buffers_10329 bcmgenet_alloc_rx_buffers 0 10329 NULL ++netlbl_catmap_setbit_10331 netlbl_catmap_setbit 0 10331 NULL ++core_alua_show_implicit_trans_secs_10332 core_alua_show_implicit_trans_secs 0 10332 NULL nohasharray ++usb_string_copy_10332 usb_string_copy 0 10332 &core_alua_show_implicit_trans_secs_10332 ++__smb_init_10336 __smb_init 0 10336 NULL ++tun_sendmsg_10337 tun_sendmsg 0-4 10337 NULL ++em28xx_read_reg_req_len_10340 em28xx_read_reg_req_len 0 10340 NULL nohasharray ++softing_startstop_10340 softing_startstop 0 10340 &em28xx_read_reg_req_len_10340 ++mwifiex_send_tdls_data_frame_10347 mwifiex_send_tdls_data_frame 7 10347 NULL ++ufx_alloc_urb_list_10349 ufx_alloc_urb_list 3 10349 NULL ++erst_exec_load_var2_10352 erst_exec_load_var2 0 10352 NULL ++dbAllocAny_10354 dbAllocAny 0 10354 NULL nohasharray ++durations_show_10354 durations_show 0 10354 &dbAllocAny_10354 ++ath6kl_listen_int_read_10355 ath6kl_listen_int_read 3-0 10355 NULL ++sta_ht_capa_read_10366 sta_ht_capa_read 3-0 10366 NULL ++inotify_handle_event_10370 inotify_handle_event 0 10370 NULL ++sh_dmae_nmi_handler_10371 sh_dmae_nmi_handler 0 10371 NULL ++smc91c92_resume_10372 smc91c92_resume 0 10372 NULL ++phy_connect_direct_10374 phy_connect_direct 0 10374 NULL ++iscsi_nacl_param_show_MaxConnections_10377 iscsi_nacl_param_show_MaxConnections 0 10377 NULL ++rxon_assoc_10379 rxon_assoc 0 10379 NULL nohasharray ++ecryptfs_decode_and_decrypt_filename_10379 ecryptfs_decode_and_decrypt_filename 5 10379 &rxon_assoc_10379 ++show_rdac0_10381 show_rdac0 0 10381 NULL ++si5351_clkin_prepare_10394 si5351_clkin_prepare 0 10394 NULL ++show_gpio_10395 show_gpio 0 10395 NULL ++do_compat_pselect_10398 do_compat_pselect 1 10398 NULL ++airspy_start_streaming_10403 airspy_start_streaming 0 10403 NULL nohasharray ++ad7791_set_mode_10403 ad7791_set_mode 0 10403 &airspy_start_streaming_10403 ++snd_cs4281_capture_prepare_10410 snd_cs4281_capture_prepare 0 10410 NULL ++ima_fw_from_file_10420 ima_fw_from_file 0 10420 NULL ++dead_read_lines_10421 dead_read_lines 0 10421 NULL ++uhid_hid_output_report_10423 uhid_hid_output_report 0-3 10423 NULL ++isl29003_store_power_state_10424 isl29003_store_power_state 0-4 10424 NULL ++elan_i2c_write_cmd_10433 elan_i2c_write_cmd 0 10433 NULL ++max1363_monitor_store_freq_10434 max1363_monitor_store_freq 0-4 10434 NULL nohasharray ++fwtty_rx_10434 fwtty_rx 3 10434 &max1363_monitor_store_freq_10434 ++wacom_led1_select_store_10438 wacom_led1_select_store 0-4 10438 NULL ++ov9640_reg_write_10440 ov9640_reg_write 0 10440 NULL ++free_block_10441 free_block 0 10441 NULL ++ipr_alloc_dump_10445 ipr_alloc_dump 0 10445 NULL ++iscsi_stat_tgt_attr_show_attr_last_fail_type_10446 iscsi_stat_tgt_attr_show_attr_last_fail_type 0 10446 NULL ++show_fc_host_supported_classes_10447 show_fc_host_supported_classes 0 10447 NULL ++show_pwm_auto_spinup_time_10454 show_pwm_auto_spinup_time 0 10454 NULL ++spidev_sync_write_10462 spidev_sync_write 0 10462 NULL ++o2hb_region_dev_write_10463 o2hb_region_dev_write 0-3 10463 NULL ++event_phy_transmit_error_read_10471 event_phy_transmit_error_read 3-0 10471 NULL ++show_control_state_10474 show_control_state 0 10474 NULL ++hash_ipportip6_expire_10478 hash_ipportip6_expire 4 10478 NULL ++clip_device_event_10481 clip_device_event 0 10481 NULL ++nouveau_pwr_create__10483 nouveau_pwr_create_ 4 10483 NULL ++mt9m111_setup_geometry_10485 mt9m111_setup_geometry 0 10485 NULL ++ath10k_wmi_vdev_start_10487 ath10k_wmi_vdev_start 0 10487 NULL ++__il4965_up_10489 __il4965_up 0 10489 NULL nohasharray ++lpfc_fcp_imax_store_10489 lpfc_fcp_imax_store 0-4 10489 &__il4965_up_10489 ++show_card_10491 show_card 0 10491 NULL ++ext2_setattr_10495 ext2_setattr 0 10495 NULL ++dst_frames_10499 dst_frames 0 10499 NULL ++ext4_itable_unused_count_10501 ext4_itable_unused_count 0 10501 NULL ++ca91cx42_alloc_resource_10502 ca91cx42_alloc_resource 2 10502 NULL nohasharray ++ds2781_get_pio_pin_10502 ds2781_get_pio_pin 0 10502 &ca91cx42_alloc_resource_10502 ++si5351_vxco_prepare_10506 si5351_vxco_prepare 0 10506 NULL ++qib_alloc_fast_reg_page_list_10507 qib_alloc_fast_reg_page_list 2 10507 NULL ++sel_write_disable_10511 sel_write_disable 3-0 10511 NULL ++osd_req_write_sg_kern_10514 osd_req_write_sg_kern 5 10514 NULL nohasharray ++therm_throt_device_show_package_throttle_count_10514 therm_throt_device_show_package_throttle_count 0 10514 &osd_req_write_sg_kern_10514 ++rds_message_alloc_10517 rds_message_alloc 1 10517 NULL ++qlcnic_pci_sriov_enable_10519 qlcnic_pci_sriov_enable 0-2 10519 NULL ++get_vm_area_caller_10527 get_vm_area_caller 1 10527 NULL nohasharray ++snd_als4000_playback_prepare_10527 snd_als4000_playback_prepare 0 10527 &get_vm_area_caller_10527 nohasharray ++cw1200_start_10527 cw1200_start 0 10527 &snd_als4000_playback_prepare_10527 ++iscsi_stat_instance_show_attr_inst_10529 iscsi_stat_instance_show_attr_inst 0 10529 NULL nohasharray ++add_control_with_pfx_10529 add_control_with_pfx 0 10529 &iscsi_stat_instance_show_attr_inst_10529 ++set_temp_max_10531 set_temp_max 0-4 10531 NULL nohasharray ++__ceph_tcp_sendpage_10531 __ceph_tcp_sendpage 4 10531 &set_temp_max_10531 ++snd_pcm_lib_read_10536 snd_pcm_lib_read 0-3 10536 NULL nohasharray ++kstrtouint_from_user_10536 kstrtouint_from_user 2-0 10536 &snd_pcm_lib_read_10536 ++get_key_10538 get_key 0 10538 NULL ++sas_set_phy_speed_10540 sas_set_phy_speed 0 10540 NULL ++SYSC_read_10545 SYSC_read 3 10545 NULL ++pm_qos_no_power_off_show_10556 pm_qos_no_power_off_show 0 10556 NULL ++ivtv_start_10559 ivtv_start 0 10559 NULL ++ipr_read_dump_10560 ipr_read_dump 0-5-6 10560 NULL ++dix_show_10568 dix_show 0 10568 NULL ++clip_add_10571 clip_add 0 10571 NULL ++smb2_wait_mtu_credits_10573 smb2_wait_mtu_credits 0 10573 NULL ++ext4_write_begin_10576 ext4_write_begin 3-4-0 10576 NULL nohasharray ++lkfirst_show_10576 lkfirst_show 0 10576 &ext4_write_begin_10576 ++swsusp_write_10582 swsusp_write 0 10582 NULL ++read_usb_charge_10584 read_usb_charge 0 10584 NULL nohasharray ++set_cmci_disabled_10584 set_cmci_disabled 0-4 10584 &read_usb_charge_10584 ++selinux_inode_getxattr_10587 selinux_inode_getxattr 0 10587 NULL ++scrub_remap_extent_10588 scrub_remap_extent 2 10588 NULL ++validate_buf_10589 validate_buf 0 10589 NULL ++set_in_max1_10590 set_in_max1 0-4 10590 NULL ++otp_read_10594 otp_read 5-4-2 10594 NULL ++alloc_sdma_10596 alloc_sdma 0 10596 NULL ++acpi_ds_create_bank_field_10598 acpi_ds_create_bank_field 0 10598 NULL ++em28xx_i2c_send_bytes_10601 em28xx_i2c_send_bytes 0-4 10601 NULL ++supply_map_read_file_10608 supply_map_read_file 3-0 10608 NULL ++usb_8dev_cmd_open_10617 usb_8dev_cmd_open 0 10617 NULL nohasharray ++vxge_hw_vpath_mac_addr_add_10617 vxge_hw_vpath_mac_addr_add 0 10617 &usb_8dev_cmd_open_10617 ++ima_show_htable_violations_10619 ima_show_htable_violations 3-0 10619 NULL nohasharray ++migratepage_10619 migratepage 0 10619 &ima_show_htable_violations_10619 ++cxgb3_get_cpl_reply_skb_10620 cxgb3_get_cpl_reply_skb 2 10620 NULL ++min_partial_show_10625 min_partial_show 0 10625 NULL ++de_refill_rx_10626 de_refill_rx 0 10626 NULL ++set_attr_mode_lsb_10628 set_attr_mode_lsb 0-4 10628 NULL ++alloc_coherent_10632 alloc_coherent 2 10632 NULL nohasharray ++cap_mask_show_10632 cap_mask_show 0 10632 &alloc_coherent_10632 nohasharray ++il4965_send_tx_power_10632 il4965_send_tx_power 0 10632 &cap_mask_show_10632 ++fq_alloc_node_10633 fq_alloc_node 1 10633 NULL ++ov9650_set_auto_gain_10638 ov9650_set_auto_gain 0 10638 NULL nohasharray ++proc_sys_write_10638 proc_sys_write 0-3 10638 &ov9650_set_auto_gain_10638 ++check_transition_10639 check_transition 0 10639 NULL ++devm_request_irq_10640 devm_request_irq 0 10640 NULL nohasharray ++format_nfilters_10640 format_nfilters 0 10640 &devm_request_irq_10640 ++__qbuf_mmap_10642 __qbuf_mmap 0 10642 NULL ++packet_10644 packet 0 10644 NULL ++write_orph_node_10654 write_orph_node 0 10654 NULL ++open_10656 open 0 10656 NULL ++nfs_idmap_lookup_id_10660 nfs_idmap_lookup_id 2 10660 NULL nohasharray ++ubi_io_write_vid_hdr_10660 ubi_io_write_vid_hdr 0 10660 &nfs_idmap_lookup_id_10660 ++ni65_alloc_mem_10664 ni65_alloc_mem 3 10664 NULL ++send_unlock_10666 send_unlock 0 10666 NULL ++parport_write_10669 parport_write 0 10669 NULL ++b43_pio_init_10675 b43_pio_init 0 10675 NULL ++ath9k_hw_process_ini_10682 ath9k_hw_process_ini 0 10682 NULL ++sdram_offsets_show_10683 sdram_offsets_show 0 10683 NULL ++aat2870_ldo_disable_10686 aat2870_ldo_disable 0 10686 NULL ++read_10690 read 0 10690 NULL ++edge_write_10692 edge_write 4-0 10692 NULL ++iap_get_mode_10694 iap_get_mode 0 10694 NULL ++__cached_dev_store_10695 __cached_dev_store 0-4 10695 NULL ++create_endpoint_and_queue_bulk_10698 create_endpoint_and_queue_bulk 0 10698 NULL ++ubi_wl_get_peb_10699 ubi_wl_get_peb 0 10699 NULL ++floppy_cmos_show_10701 floppy_cmos_show 0 10701 NULL ++map_attr_show_10707 map_attr_show 0 10707 NULL ++selinux_inode_setxattr_10708 selinux_inode_setxattr 4-0 10708 NULL ++qla82xx_reset_chip_10709 qla82xx_reset_chip 0 10709 NULL ++bnad_mac_addr_set_locked_10710 bnad_mac_addr_set_locked 0 10710 NULL ++rtl92cu_hw_init_10718 rtl92cu_hw_init 0 10718 NULL ++pvr2_ioread_read_10720 pvr2_ioread_read 3-0 10720 NULL nohasharray ++shash_async_setkey_10720 shash_async_setkey 3 10720 &pvr2_ioread_read_10720 ++radeon_set_pm_method_10722 radeon_set_pm_method 0-4 10722 NULL ++__iscsi_complete_pdu_10726 __iscsi_complete_pdu 4 10726 NULL ++spi_sync_10731 spi_sync 0 10731 NULL ++sctp_getsockopt_maxseg_10737 sctp_getsockopt_maxseg 2 10737 NULL ++show_ideapad_fan_10740 show_ideapad_fan 0 10740 NULL ++quota_sync_store_10741 quota_sync_store 0-3 10741 NULL ++aal0_buffer_allocate_10743 aal0_buffer_allocate 0 10743 NULL ++sys_syslog_10746 sys_syslog 3 10746 NULL ++alloc_one_pg_vec_page_10747 alloc_one_pg_vec_page 1 10747 NULL ++hci_sock_bind_10748 hci_sock_bind 0 10748 NULL ++sdram_size_show_10750 sdram_size_show 0 10750 NULL ++btrfs_sync_file_10755 btrfs_sync_file 0 10755 NULL ++SyS_io_getevents_10756 SyS_io_getevents 3 10756 NULL ++lirc_dev_fop_write_10760 lirc_dev_fop_write 0-3 10760 NULL ++rd_build_prot_space_10761 rd_build_prot_space 3-2 10761 NULL ++kvm_read_guest_atomic_10765 kvm_read_guest_atomic 4 10765 NULL nohasharray ++iwl_dbgfs_netdetect_write_10765 iwl_dbgfs_netdetect_write 0-3 10765 &kvm_read_guest_atomic_10765 ++ufs_write_inode_10767 ufs_write_inode 0 10767 NULL nohasharray ++selinux_disable_10767 selinux_disable 0 10767 &ufs_write_inode_10767 ++qla4xxx_iscsi_version_show_10768 qla4xxx_iscsi_version_show 0 10768 NULL ++mfn_to_local_pfn_10777 mfn_to_local_pfn 1 10777 NULL ++__qp_memcpy_to_queue_10779 __qp_memcpy_to_queue 4-2 10779 NULL ++max_contrast_show_10783 max_contrast_show 0 10783 NULL ++class_osdblk_add_10788 class_osdblk_add 0-4 10788 NULL ++rocker_port_ctrl_vlan_acl_10790 rocker_port_ctrl_vlan_acl 0 10790 NULL ++i915_gem_wait_for_error_10791 i915_gem_wait_for_error 0 10791 NULL nohasharray ++ad7793_set_channel_10791 ad7793_set_channel 0 10791 &i915_gem_wait_for_error_10791 ++b43_lpphy_op_init_10795 b43_lpphy_op_init 0 10795 NULL ++hpwdt_write_10796 hpwdt_write 0-3 10796 NULL nohasharray ++ttm_dma_page_pool_free_10796 ttm_dma_page_pool_free 2-0 10796 &hpwdt_write_10796 ++sys_bind_10799 sys_bind 3 10799 NULL ++query_info_10800 query_info 0 10800 NULL ++usbtv_queue_setup_10801 usbtv_queue_setup 0 10801 NULL ++nfcwilink_send_bts_cmd_10802 nfcwilink_send_bts_cmd 3 10802 NULL ++saa7706h_mute_10805 saa7706h_mute 0 10805 NULL ++i2c_smbus_read_word_data_10810 i2c_smbus_read_word_data 0 10810 NULL nohasharray ++vsock_stream_recvmsg_10810 vsock_stream_recvmsg 0-4 10810 &i2c_smbus_read_word_data_10810 ++rtl2832_sdr_queue_setup_10815 rtl2832_sdr_queue_setup 0 10815 NULL ++snd_seq_ioctl_running_mode_10816 snd_seq_ioctl_running_mode 0 10816 NULL ++make_tree_dirty_10817 make_tree_dirty 0 10817 NULL nohasharray ++__usermodehelper_disable_10817 __usermodehelper_disable 0 10817 &make_tree_dirty_10817 ++ubifs_log_start_commit_10821 ubifs_log_start_commit 0 10821 NULL ++b43legacy_write_initvals_10826 b43legacy_write_initvals 0 10826 NULL nohasharray ++mmc_io_rw_direct_host_10826 mmc_io_rw_direct_host 0 10826 &b43legacy_write_initvals_10826 ++snd_hda_attach_beep_device_10828 snd_hda_attach_beep_device 0 10828 NULL ++rsi_parse_10831 rsi_parse 0 10831 NULL ++pwm_enable_store_10832 pwm_enable_store 0-4 10832 NULL nohasharray ++send_command_10832 send_command 0-4 10832 &pwm_enable_store_10832 ++lbs_sleepparams_read_10840 lbs_sleepparams_read 3-0 10840 NULL ++ext4_direct_IO_10843 ext4_direct_IO 4-0 10843 NULL ++simple_playback_build_controls_10847 simple_playback_build_controls 0 10847 NULL ++show_therm_input_10848 show_therm_input 0 10848 NULL ++xfs_bmbt_free_block_10850 xfs_bmbt_free_block 0 10850 NULL ++ida_get_new_above_10853 ida_get_new_above 0-2 10853 NULL ++fuse_conn_max_background_read_10855 fuse_conn_max_background_read 3-0 10855 NULL ++snd_card_asihpi_playback_ioctl_10857 snd_card_asihpi_playback_ioctl 0 10857 NULL ++usnic_ib_show_qp_per_vf_10858 usnic_ib_show_qp_per_vf 0 10858 NULL ++btrfs_permission_10861 btrfs_permission 0 10861 NULL ++ol_chunk_blocks_10864 ol_chunk_blocks 0 10864 NULL ++trivial_online_10866 trivial_online 0 10866 NULL ++xenfb_set_par_10871 xenfb_set_par 0 10871 NULL ++snd_pcm_oss_write1_10872 snd_pcm_oss_write1 3-0 10872 NULL ++ov7670_s_sat_hue_10873 ov7670_s_sat_hue 0 10873 NULL nohasharray ++tw2804_s_ctrl_10873 tw2804_s_ctrl 0 10873 &ov7670_s_sat_hue_10873 ++u1_timeout_store_10874 u1_timeout_store 0-4 10874 NULL ++rtl2832_sdr_wr_reg_mask_10875 rtl2832_sdr_wr_reg_mask 0 10875 NULL ++mid_get_vbt_data_r0_10876 mid_get_vbt_data_r0 2 10876 NULL nohasharray ++ims_pcu_ofn_reg_addr_store_10876 ims_pcu_ofn_reg_addr_store 0-4 10876 &mid_get_vbt_data_r0_10876 ++queue_working_time_show_10877 queue_working_time_show 0 10877 NULL ++wiidebug_drm_write_10879 wiidebug_drm_write 3-0 10879 NULL ++sha1_mb_final_10881 sha1_mb_final 0 10881 NULL ++jffs2_read_inode_range_10882 jffs2_read_inode_range 0 10882 NULL ++adt7411_show_temp_10883 adt7411_show_temp 0 10883 NULL ++qla2x00_sysfs_read_vpd_10893 qla2x00_sysfs_read_vpd 6-0-5 10893 NULL ++__ipath_get_user_pages_10896 __ipath_get_user_pages 0 10896 NULL ++get_scq_10897 get_scq 2 10897 NULL ++show_plat_type_10901 show_plat_type 0 10901 NULL ++tifm_alloc_adapter_10903 tifm_alloc_adapter 1 10903 NULL nohasharray ++mcam_vb_start_streaming_10903 mcam_vb_start_streaming 0 10903 &tifm_alloc_adapter_10903 ++bt_to_errno_10906 bt_to_errno 0 10906 NULL ++ina209_reset_history_10909 ina209_reset_history 0-4 10909 NULL ++tpacpi_driver_uwb_emulstate_show_10911 tpacpi_driver_uwb_emulstate_show 0 10911 NULL ++lprocfs_wr_atomic_10912 lprocfs_wr_atomic 3 10912 NULL ++cramfs_statfs_10915 cramfs_statfs 0 10915 NULL ++be_cmd_get_mac_from_list_10916 be_cmd_get_mac_from_list 0 10916 NULL ++kobject_add_10919 kobject_add 0 10919 NULL ++qla4xxx_host_reset_10920 qla4xxx_host_reset 0 10920 NULL ++shm_read_file_10927 shm_read_file 0 10927 NULL ++ip_mc_join_group_10930 ip_mc_join_group 0 10930 NULL ++ath10k_sta_state_10939 ath10k_sta_state 0 10939 NULL ++store_guid_10944 store_guid 0-4 10944 NULL ++show_temp_beep_10945 show_temp_beep 0 10945 NULL ++tw9910_g_crop_10948 tw9910_g_crop 0 10948 NULL ++drv_sta_state_10949 drv_sta_state 0 10949 NULL ++tun_put_user_10951 tun_put_user 0 10951 NULL ++da9052_map_irq_10952 da9052_map_irq 2 10952 NULL ++viacam_set_flip_10955 viacam_set_flip 0 10955 NULL ++crypto_shash_ctxsize_10958 crypto_shash_ctxsize 0 10958 NULL ++ar9003_dump_modal_eeprom_10959 ar9003_dump_modal_eeprom 0-2-3 10959 NULL ++bond_sysfs_slave_add_10961 bond_sysfs_slave_add 0 10961 NULL ++ci_port_test_write_10962 ci_port_test_write 3-0 10962 NULL ++zcxx_s_ctrl_10963 zcxx_s_ctrl 0 10963 NULL nohasharray ++legacy_suspend_10963 legacy_suspend 0 10963 &zcxx_s_ctrl_10963 ++pfkey_process_10964 pfkey_process 0 10964 NULL ++qlcnic_diag_alloc_res_10969 qlcnic_diag_alloc_res 0 10969 NULL ++bm_entry_read_10976 bm_entry_read 3-0 10976 NULL nohasharray ++node_weight_write_10976 node_weight_write 0-3 10976 &bm_entry_read_10976 ++sched_autogroup_write_10984 sched_autogroup_write 3-0 10984 NULL ++gfs2_ok_for_dio_10987 gfs2_ok_for_dio 0 10987 NULL ++il3945_send_tx_power_10991 il3945_send_tx_power 0 10991 NULL nohasharray ++restart_firmware_10991 restart_firmware 0 10991 &il3945_send_tx_power_10991 ++edd_show_mbr_signature_10993 edd_show_mbr_signature 0 10993 NULL ++show_designated_cost_10995 show_designated_cost 0 10995 NULL nohasharray ++snd_hda_do_attach_10995 snd_hda_do_attach 0 10995 &show_designated_cost_10995 ++xfrm_hash_alloc_10997 xfrm_hash_alloc 1 10997 NULL ++page_cache_pipe_buf_confirm_11002 page_cache_pipe_buf_confirm 0 11002 NULL ++rx_filter_accum_arp_pend_requests_read_11003 rx_filter_accum_arp_pend_requests_read 3-0 11003 NULL ++security_get_bools_11004 security_get_bools 0 11004 NULL ++show_state_usage_11007 show_state_usage 0 11007 NULL nohasharray ++niu_reset_rx_xmac_11007 niu_reset_rx_xmac 0 11007 &show_state_usage_11007 ++show_io_db_11009 show_io_db 0 11009 NULL ++balloon_cpu_notify_11010 balloon_cpu_notify 0 11010 NULL ++btree_write_cache_pages_11012 btree_write_cache_pages 0 11012 NULL ++enic_open_11015 enic_open 0 11015 NULL ++read_11017 read 0 11017 NULL ++qla4xxx_init_firmware_11018 qla4xxx_init_firmware 0 11018 NULL ++SetLineNumber_11023 SetLineNumber 0 11023 NULL ++crc32_pclmul_setkey_11032 crc32_pclmul_setkey 0 11032 NULL nohasharray ++read_11032 read 0 11032 &crc32_pclmul_setkey_11032 ++mb_find_next_bit_11037 mb_find_next_bit 0-2-3 11037 NULL nohasharray ++ixgbe_disable_sriov_11037 ixgbe_disable_sriov 0 11037 &mb_find_next_bit_11037 ++shmem_listxattr_11040 shmem_listxattr 0-3 11040 NULL ++mask_and_set_register_11042 mask_and_set_register 0 11042 NULL ++sys_sendfile_11048 sys_sendfile 4 11048 NULL nohasharray ++nouveau_gpio_create__11048 nouveau_gpio_create_ 4 11048 &sys_sendfile_11048 ++tda10048_writeregbulk_11050 tda10048_writeregbulk 4 11050 NULL ++char2uni_11054 char2uni 0 11054 NULL ++srpt_tpg_attrib_store_srp_sq_size_11059 srpt_tpg_attrib_store_srp_sq_size 0-3 11059 NULL ++alc260_parse_auto_config_11061 alc260_parse_auto_config 0 11061 NULL ++qlcnic_83xx_calculate_msix_vector_11063 qlcnic_83xx_calculate_msix_vector 0 11063 NULL ++__sysv_write_inode_11069 __sysv_write_inode 0 11069 NULL ++bond_enslave_11070 bond_enslave 0 11070 NULL ++lpt_gc_lnum_11073 lpt_gc_lnum 0 11073 NULL ++tcp_send_mss_11079 tcp_send_mss 0 11079 NULL ++count_argc_11083 count_argc 0 11083 NULL ++gt_min_freq_mhz_show_11084 gt_min_freq_mhz_show 0 11084 NULL ++sda_in_11093 sda_in 0 11093 NULL ++ds2781_write_user_eeprom_bin_11094 ds2781_write_user_eeprom_bin 6-5-0 11094 NULL nohasharray ++wlcore_fw_wakeup_11094 wlcore_fw_wakeup 0 11094 &ds2781_write_user_eeprom_bin_11094 ++hash_sendmsg_11095 hash_sendmsg 0-4 11095 NULL ++aio_read_11102 aio_read 0 11102 NULL ++show_cmd_sg_entries_11103 show_cmd_sg_entries 0 11103 NULL ++avc_stream_set_format_11105 avc_stream_set_format 5 11105 NULL ++kvm_write_guest_cached_11106 kvm_write_guest_cached 4 11106 NULL ++v_midi_open_11109 v_midi_open 0 11109 NULL ++wl18xx_top_reg_read_11114 wl18xx_top_reg_read 0 11114 NULL ++pinctrl_get_device_gpio_range_11118 pinctrl_get_device_gpio_range 0 11118 NULL ++tc90522_master_xfer_11119 tc90522_master_xfer 3-0 11119 NULL ++logi_dj_raw_event_11123 logi_dj_raw_event 4 11123 NULL ++tracing_buffers_read_11124 tracing_buffers_read 3 11124 NULL ++lpfc_cr_delay_store_11125 lpfc_cr_delay_store 0-4 11125 NULL ++alloc_alien_cache_11127 alloc_alien_cache 2 11127 NULL ++store_frontswap_inertia_11129 store_frontswap_inertia 0-4 11129 NULL ++dlfb_realloc_framebuffer_11133 dlfb_realloc_framebuffer 0 11133 NULL ++ip6table_nat_local_fn_11142 ip6table_nat_local_fn 0 11142 NULL ++pcnet32_get_regs_len_11144 pcnet32_get_regs_len 0 11144 NULL nohasharray ++vv6410_set_hflip_11144 vv6410_set_hflip 0 11144 &pcnet32_get_regs_len_11144 ++temp_northbridge_11147 temp_northbridge 0 11147 NULL ++process_ini_11152 process_ini 0 11152 NULL ++ds2780_set_rsgain_register_11153 ds2780_set_rsgain_register 0 11153 NULL ++acpi_os_map_memory_11161 acpi_os_map_memory 1-2 11161 NULL nohasharray ++__uncore_cmask5_show_11161 __uncore_cmask5_show 0 11161 &acpi_os_map_memory_11161 ++iwl_pcie_set_cmd_in_flight_11169 iwl_pcie_set_cmd_in_flight 0 11169 NULL ++target_core_alua_tg_pt_gp_show_attr_alua_access_status_11170 target_core_alua_tg_pt_gp_show_attr_alua_access_status 0 11170 NULL ++ioat2_alloc_ring_11172 ioat2_alloc_ring 2 11172 NULL ++acpi_ec_read_io_11175 acpi_ec_read_io 0-3 11175 NULL ++dlm_user_unlock_11178 dlm_user_unlock 0 11178 NULL ++blkdev_write_end_11180 blkdev_write_end 5-0 11180 NULL ++hfs_statfs_11183 hfs_statfs 0 11183 NULL ++show_local_temp8_11187 show_local_temp8 0 11187 NULL ++store_lanerev_enb_11190 store_lanerev_enb 0-4 11190 NULL ++tomoyo_unix_entry_11195 tomoyo_unix_entry 0 11195 NULL ++rtl2832_sdr_wr_regs_11197 rtl2832_sdr_wr_regs 0 11197 NULL ++fnic_show_drv_version_11198 fnic_show_drv_version 0 11198 NULL ++snd_emu10k1x_pcm_prepare_11205 snd_emu10k1x_pcm_prepare 0 11205 NULL ++qlcnic_get_port_stats_11206 qlcnic_get_port_stats 0 11206 NULL ++solo_start_thread_11207 solo_start_thread 0 11207 NULL ++fb_set_var_11211 fb_set_var 0 11211 NULL ++dma_mapping_error_11213 dma_mapping_error 0-2 11213 NULL ++set_pwm1_11215 set_pwm1 0-4 11215 NULL ++sq_overhead_11218 sq_overhead 0 11218 NULL ++zd_submit_waiting_urb_11219 zd_submit_waiting_urb 0 11219 NULL ++__swab16p_11220 __swab16p 0 11220 NULL ++il_dbgfs_rx_queue_read_11221 il_dbgfs_rx_queue_read 3-0 11221 NULL ++snd_es1938_playback2_trigger_11224 snd_es1938_playback2_trigger 0 11224 NULL ++tda18218_wr_reg_11232 tda18218_wr_reg 0 11232 NULL ++xiic_bus_busy_11233 xiic_bus_busy 0 11233 NULL nohasharray ++vid_out_start_streaming_11233 vid_out_start_streaming 0 11233 &xiic_bus_busy_11233 ++comedi_alloc_spriv_11234 comedi_alloc_spriv 2 11234 NULL ++xfs_bmap_last_before_11237 xfs_bmap_last_before 0 11237 NULL ++__hci_unconf_init_11239 __hci_unconf_init 0 11239 NULL nohasharray ++__add_zone_11239 __add_zone 0 11239 &__hci_unconf_init_11239 ++il3945_show_tx_power_11240 il3945_show_tx_power 0 11240 NULL nohasharray ++show_nservers_11240 show_nservers 0 11240 &il3945_show_tx_power_11240 ++call_usermodehelper_11245 call_usermodehelper 0 11245 NULL ++of_irq_count_11253 of_irq_count 0 11253 NULL ++store_refalign_11257 store_refalign 0-4 11257 NULL ++ubifs_write_node_11258 ubifs_write_node 3-5-0 11258 NULL ++ath5k_attr_show_noise_immunity_level_11266 ath5k_attr_show_noise_immunity_level 0 11266 NULL nohasharray ++srpt_wwn_show_attr_version_11266 srpt_wwn_show_attr_version 0 11266 &ath5k_attr_show_noise_immunity_level_11266 ++hugetlbfs_read_11268 hugetlbfs_read 3-0 11268 NULL ++ec_bhf_alloc_dma_mem_11271 ec_bhf_alloc_dma_mem 0 11271 NULL ++cru_detect_11272 cru_detect 1 11272 NULL ++ath6kl_power_params_write_11274 ath6kl_power_params_write 3-0 11274 NULL ++qnx6_readpage_11279 qnx6_readpage 0 11279 NULL ++SYSC_getrandom_11294 SYSC_getrandom 2 11294 NULL ++reg_write_11295 reg_write 0 11295 NULL ++mptscsih_debug_level_store_11299 mptscsih_debug_level_store 0-4 11299 NULL ++ssb_pcmcia_cor_setup_11300 ssb_pcmcia_cor_setup 0 11300 NULL ++vhci_urb_enqueue_11304 vhci_urb_enqueue 0 11304 NULL nohasharray ++show_mtu_11304 show_mtu 0 11304 &vhci_urb_enqueue_11304 ++__proc_daemon_file_11305 __proc_daemon_file 5 11305 NULL ++rtl2832_sdr_alloc_urbs_11306 rtl2832_sdr_alloc_urbs 0 11306 NULL ++cma_clear_bitmap_11308 cma_clear_bitmap 3 11308 NULL ++bcache_dev_sectors_dirty_add_11315 bcache_dev_sectors_dirty_add 3 11315 NULL ++tcp_send_rcvq_11316 tcp_send_rcvq 3-0 11316 NULL ++vidioc_qbuf_11319 vidioc_qbuf 0 11319 NULL ++kovaplus_sysfs_read_profilex_settings_11320 kovaplus_sysfs_read_profilex_settings 0-5-6 11320 NULL nohasharray ++iscsi_stat_tgt_attr_attr_show_11320 iscsi_stat_tgt_attr_attr_show 0 11320 &kovaplus_sysfs_read_profilex_settings_11320 ++tiadc_buffer_postdisable_11321 tiadc_buffer_postdisable 0 11321 NULL nohasharray ++__pfn_to_mfn_11321 __pfn_to_mfn 0 11321 &tiadc_buffer_postdisable_11321 ++shmem_radix_tree_replace_11325 shmem_radix_tree_replace 0 11325 NULL ++construct_key_11329 construct_key 3 11329 NULL nohasharray ++__kfifo_out_peek_11329 __kfifo_out_peek 0-3 11329 &construct_key_11329 ++cfctrl_linkup_request_11331 cfctrl_linkup_request 0 11331 NULL ++usb_store_new_id_11334 usb_store_new_id 0-5 11334 NULL ++seq_copy_in_user_11336 seq_copy_in_user 3 11336 NULL nohasharray ++patch_nvhdmi_8ch_7x_11336 patch_nvhdmi_8ch_7x 0 11336 &seq_copy_in_user_11336 ++ufx_enable_11338 ufx_enable 0 11338 NULL ++dev_uc_add_11343 dev_uc_add 0 11343 NULL ++setup_cpu_watcher_11344 setup_cpu_watcher 0 11344 NULL ++mt9m001_s_stream_11350 mt9m001_s_stream 0 11350 NULL ++sel_write_create_11353 sel_write_create 3 11353 NULL ++show_in1_input_11354 show_in1_input 0 11354 NULL ++handle_unit_11355 handle_unit 0-1 11355 NULL ++create_input_ctls_11360 create_input_ctls 0 11360 NULL nohasharray ++batadv_skb_head_push_11360 batadv_skb_head_push 2 11360 &create_input_ctls_11360 ++of_get_available_child_count_11361 of_get_available_child_count 0 11361 NULL ++drm_vblank_init_11362 drm_vblank_init 2 11362 NULL nohasharray ++thread_siblings_list_show_11362 thread_siblings_list_show 0 11362 &drm_vblank_init_11362 ++nilfs_superblock_sb_write_time_secs_show_11367 nilfs_superblock_sb_write_time_secs_show 0 11367 NULL nohasharray ++lp3943_pwm_set_mode_11367 lp3943_pwm_set_mode 0 11367 &nilfs_superblock_sb_write_time_secs_show_11367 ++qib_get_base_info_11369 qib_get_base_info 3-0 11369 NULL ++saa6752hs_g_mbus_fmt_11370 saa6752hs_g_mbus_fmt 0 11370 NULL ++thermal_cooling_device_cur_state_show_11373 thermal_cooling_device_cur_state_show 0 11373 NULL ++xfs_bmap_add_attrfork_btree_11375 xfs_bmap_add_attrfork_btree 0 11375 NULL ++lpfc_poll_tmo_show_11377 lpfc_poll_tmo_show 0 11377 NULL ++amd_rng_data_read_11378 amd_rng_data_read 0 11378 NULL ++rtl2832_sdr_alloc_stream_bufs_11380 rtl2832_sdr_alloc_stream_bufs 0 11380 NULL ++tcf_register_action_11381 tcf_register_action 2 11381 NULL ++ext_prop_type_store_11385 ext_prop_type_store 0-3 11385 NULL ++po1030_set_gain_11386 po1030_set_gain 0 11386 NULL nohasharray ++tboot_cpu_callback_11386 tboot_cpu_callback 0 11386 &po1030_set_gain_11386 ++merge_across_nodes_store_11387 merge_across_nodes_store 0-4 11387 NULL ++af9035_rd_regs_11391 af9035_rd_regs 0 11391 NULL nohasharray ++gfs2_quota_refresh_11391 gfs2_quota_refresh 0 11391 &af9035_rd_regs_11391 ++isku_sysfs_read_keys_capslock_11392 isku_sysfs_read_keys_capslock 6-0-5 11392 NULL ++qib_write_11394 qib_write 0-3 11394 NULL ++niu_reset_tx_xmac_11397 niu_reset_tx_xmac 0 11397 NULL ++dev_irnet_write_11398 dev_irnet_write 3-0 11398 NULL nohasharray ++store_selfballoon_interval_11398 store_selfballoon_interval 0-4 11398 &dev_irnet_write_11398 ++cw1200_add_interface_11399 cw1200_add_interface 0 11399 NULL nohasharray ++tse_change_mtu_11399 tse_change_mtu 0 11399 &cw1200_add_interface_11399 ++get_fan_11400 get_fan 0 11400 NULL ++ip_mc_add1_src_11402 ip_mc_add1_src 0 11402 NULL nohasharray ++lprocfs_wr_evict_client_11402 lprocfs_wr_evict_client 3 11402 &ip_mc_add1_src_11402 ++attention_read_file_11404 attention_read_file 0 11404 NULL ++bnx2x_config_rss_eth_11407 bnx2x_config_rss_eth 0 11407 NULL ++___alloc_bootmem_11410 ___alloc_bootmem 1 11410 NULL ++str_to_user_11411 str_to_user 2 11411 NULL ++show_blue_11412 show_blue 0 11412 NULL nohasharray ++matroxfb_dh_check_var_11412 matroxfb_dh_check_var 0 11412 &show_blue_11412 ++mem_fw_gen_free_mem_blks_read_11413 mem_fw_gen_free_mem_blks_read 3-0 11413 NULL ++iscsi_tpg_param_show_HeaderDigest_11416 iscsi_tpg_param_show_HeaderDigest 0 11416 NULL ++adis16480_show_firmware_revision_11417 adis16480_show_firmware_revision 3-0 11417 NULL nohasharray ++xfs_btree_lookup_11417 xfs_btree_lookup 0 11417 &adis16480_show_firmware_revision_11417 ++tx_carrier_errors_show_11418 tx_carrier_errors_show 0 11418 NULL ++mlx4_create_zones_11419 mlx4_create_zones 4-3-5-6 11419 NULL nohasharray ++trace_options_read_11419 trace_options_read 3 11419 &mlx4_create_zones_11419 ++i40e_dbg_command_write_11421 i40e_dbg_command_write 3-0 11421 NULL nohasharray ++nlmsg_perm_11421 nlmsg_perm 0 11421 &i40e_dbg_command_write_11421 ++pccard_show_vcc_11422 pccard_show_vcc 0 11422 NULL ++attr_show_11424 attr_show 0 11424 NULL ++vring_size_11426 vring_size 0-2-1 11426 NULL ++ecryptfs_writepage_11427 ecryptfs_writepage 0 11427 NULL nohasharray ++iwl_mvm_power_send_cmd_11427 iwl_mvm_power_send_cmd 0 11427 &ecryptfs_writepage_11427 ++ext3_xattr_block_list_11428 ext3_xattr_block_list 0 11428 NULL ++ovl_want_write_11429 ovl_want_write 0 11429 NULL ++bttv_read_11432 bttv_read 3-0 11432 NULL ++adt7310_spi_write_byte_11434 adt7310_spi_write_byte 0 11434 NULL ++iommu_group_show_name_11438 iommu_group_show_name 0 11438 NULL ++red_zone_store_11439 red_zone_store 0-3 11439 NULL ++wait_on_bit_lock_action_11447 wait_on_bit_lock_action 0 11447 NULL ++ov2640_g_crop_11448 ov2640_g_crop 0 11448 NULL ++sock_has_perm_11452 sock_has_perm 0 11452 NULL ++create_zero_mask_11453 create_zero_mask 0-1 11453 NULL nohasharray ++store_spi_transport_period_11453 store_spi_transport_period 4-0 11453 &create_zero_mask_11453 ++trigger_test_error_11455 trigger_test_error 0-4 11455 NULL ++adp8860_bl_l2_office_max_store_11458 adp8860_bl_l2_office_max_store 4-0 11458 NULL ++event_file_write_11460 event_file_write 0-3 11460 NULL ++acpi_ex_resolve_to_value_11466 acpi_ex_resolve_to_value 0 11466 NULL ++hidp_sock_create_11468 hidp_sock_create 0 11468 NULL ++ocfs2_file_write_iter_11469 ocfs2_file_write_iter 0 11469 NULL ++mv88e6352_phy_wait_11471 mv88e6352_phy_wait 0 11471 NULL ++st_sensors_write_data_with_mask_11476 st_sensors_write_data_with_mask 0 11476 NULL ++icmpv6_packet_11477 icmpv6_packet 0 11477 NULL ++drv_set_lbt_mode_11478 drv_set_lbt_mode 0 11478 NULL ++pci_set_power_state_11479 pci_set_power_state 0 11479 NULL nohasharray ++sca3000_read_first_n_hw_rb_11479 sca3000_read_first_n_hw_rb 2 11479 &pci_set_power_state_11479 ++set_otp5_11480 set_otp5 4-0 11480 NULL ++thermal_get_trip_type_11486 thermal_get_trip_type 0 11486 NULL ++lpfc_sriov_nr_virtfn_store_11490 lpfc_sriov_nr_virtfn_store 0-4 11490 NULL ++ti_command_out_sync_11491 ti_command_out_sync 0 11491 NULL ++pvr2_v4l2_iosetup_11493 pvr2_v4l2_iosetup 0 11493 NULL ++ads7871_show_name_11494 ads7871_show_name 0 11494 NULL ++vp_try_to_find_vqs_11502 vp_try_to_find_vqs 2 11502 NULL ++skb_copy_datagram_msg_11505 skb_copy_datagram_msg 2-4-0 11505 NULL ++sd_do_mode_sense_11507 sd_do_mode_sense 5 11507 NULL ++s3fb_set_par_11509 s3fb_set_par 0 11509 NULL ++kmem_zalloc_11510 kmem_zalloc 1 11510 NULL ++atkbd_do_set_scroll_11516 atkbd_do_set_scroll 0-4 11516 NULL ++dvb_net_set_mac_11517 dvb_net_set_mac 0 11517 NULL ++c2port_show_name_11518 c2port_show_name 0 11518 NULL nohasharray ++ll_direct_IO_26_seg_11518 ll_direct_IO_26_seg 0 11518 &c2port_show_name_11518 ++__dwc3_gadget_ep_enable_11523 __dwc3_gadget_ep_enable 0 11523 NULL ++twl_direction_in_11527 twl_direction_in 0-2 11527 NULL ++usb_pcwd_temperature_read_11539 usb_pcwd_temperature_read 0-3 11539 NULL ++__uncore_event_ext_show_11540 __uncore_event_ext_show 0 11540 NULL ++hif_usb_send_mgmt_11542 hif_usb_send_mgmt 0 11542 NULL ++batadv_tt_init_11545 batadv_tt_init 0 11545 NULL ++mmc_fwrev_show_11546 mmc_fwrev_show 0 11546 NULL ++vendor_id_show_11549 vendor_id_show 0 11549 NULL ++show_vpd_pg83_11553 show_vpd_pg83 6-0-5 11553 NULL nohasharray ++xfs_rtcheck_alloc_range_11553 xfs_rtcheck_alloc_range 0 11553 &show_vpd_pg83_11553 ++radix_tree_extend_11555 radix_tree_extend 0 11555 NULL ++show_gpio_mask_11556 show_gpio_mask 0 11556 NULL ++fsp_attr_set_getreg_11558 fsp_attr_set_getreg 0-4 11558 NULL ++set_in5_min_11561 set_in5_min 0-4 11561 NULL ++skb_cow_data_11565 skb_cow_data 0-2 11565 NULL ++i2c_smbus_read_word_swapped_11566 i2c_smbus_read_word_swapped 0 11566 NULL nohasharray ++build_avpair_blob_11566 build_avpair_blob 0 11566 &i2c_smbus_read_word_swapped_11566 nohasharray ++set_fan_auto_channel_11566 set_fan_auto_channel 0-4 11566 &build_avpair_blob_11566 nohasharray ++smk_bu_note_11566 smk_bu_note 0-5 11566 &set_fan_auto_channel_11566 ++atomic_notifier_call_chain_11567 atomic_notifier_call_chain 0 11567 NULL ++mlx4_init_cmpt_table_11569 mlx4_init_cmpt_table 3 11569 NULL ++CIFSSMBWrite2_11570 CIFSSMBWrite2 0 11570 NULL ++check_hotplug_memory_range_11575 check_hotplug_memory_range 0 11575 NULL ++lpfc_idiag_ctlacc_write_11576 lpfc_idiag_ctlacc_write 3-0 11576 NULL ++mxl111sf_write_reg_mask_11577 mxl111sf_write_reg_mask 0 11577 NULL nohasharray ++v9fs_xattr_get_acl_11577 v9fs_xattr_get_acl 0 11577 &mxl111sf_write_reg_mask_11577 ++show_11578 show 0 11578 NULL ++oprofilefs_ulong_to_user_11582 oprofilefs_ulong_to_user 3-0 11582 NULL ++batadv_iv_ogm_orig_add_if_11586 batadv_iv_ogm_orig_add_if 2 11586 NULL ++pvc_bind_11588 pvc_bind 0 11588 NULL ++snd_pcm_action_11589 snd_pcm_action 0 11589 NULL ++zd1211_hw_reset_phy_11591 zd1211_hw_reset_phy 0 11591 NULL ++wl128x_boot_clk_11594 wl128x_boot_clk 0 11594 NULL ++fw_device_op_ioctl_11595 fw_device_op_ioctl 2 11595 NULL ++heartbeat_panic_notifier_11596 heartbeat_panic_notifier 0 11596 NULL ++iscsi_iser_get_ep_param_11601 iscsi_iser_get_ep_param 0 11601 NULL ++hycapi_rx_capipkt_11602 hycapi_rx_capipkt 3 11602 NULL ++batadv_iv_ogm_orig_del_if_11604 batadv_iv_ogm_orig_del_if 2 11604 NULL nohasharray ++acpi_smbus_cmi_access_11604 acpi_smbus_cmi_access 0 11604 &batadv_iv_ogm_orig_del_if_11604 ++SYSC_mq_timedsend_11607 SYSC_mq_timedsend 3 11607 NULL ++iscsi_tpg_attrib_show_default_cmdsn_depth_11609 iscsi_tpg_attrib_show_default_cmdsn_depth 0 11609 NULL ++max_active_show_11610 max_active_show 0 11610 NULL ++hackrf_start_streaming_11617 hackrf_start_streaming 0 11617 NULL ++C_SYSC_migrate_pages_11618 C_SYSC_migrate_pages 2 11618 NULL ++show_caps_11619 show_caps 0 11619 NULL ++mb862xxfb_check_var_11620 mb862xxfb_check_var 0 11620 NULL ++tsl2550_get_adc_value_11625 tsl2550_get_adc_value 0 11625 NULL ++power_write_file_11626 power_write_file 0-3 11626 NULL ++attr_get_11639 attr_get 0 11639 NULL ++__issue_creg_rw_11641 __issue_creg_rw 0 11641 NULL ++llc_shdlc_alloc_skb_11645 llc_shdlc_alloc_skb 2 11645 NULL ++pm8001_ctl_aap_log_show_11648 pm8001_ctl_aap_log_show 0 11648 NULL nohasharray ++apds990x_prox_range_show_11648 apds990x_prox_range_show 0 11648 &pm8001_ctl_aap_log_show_11648 ++sisusb_send_bridge_packet_11649 sisusb_send_bridge_packet 2 11649 NULL nohasharray ++select_size_11649 select_size 0 11649 &sisusb_send_bridge_packet_11649 ++slab_ksize_11664 slab_ksize 0 11664 NULL ++sigd_send_11665 sigd_send 0 11665 NULL ++pm8001_ctl_host_sas_address_show_11670 pm8001_ctl_host_sas_address_show 0 11670 NULL ++ide_queue_pc_tail_11673 ide_queue_pc_tail 5 11673 NULL nohasharray ++bond_release_11673 bond_release 0 11673 &ide_queue_pc_tail_11673 ++compat_SyS_msgsnd_11675 compat_SyS_msgsnd 3 11675 NULL ++store_spi_host_signalling_11677 store_spi_host_signalling 0-4 11677 NULL ++btrfs_alloc_delayed_item_11678 btrfs_alloc_delayed_item 1 11678 NULL ++da9055_gpio_direction_output_11680 da9055_gpio_direction_output 0 11680 NULL ++iscsi_stat_login_show_attr_other_fails_11682 iscsi_stat_login_show_attr_other_fails 0 11682 NULL ++dsp_buffer_alloc_11684 dsp_buffer_alloc 2 11684 NULL ++sctp_setsockopt_hmac_ident_11687 sctp_setsockopt_hmac_ident 3-0 11687 NULL nohasharray ++__niu_set_and_wait_clear_ipp_11687 __niu_set_and_wait_clear_ipp 0 11687 &sctp_setsockopt_hmac_ident_11687 ++split_11691 split 2 11691 NULL ++radeon_atom_hw_i2c_xfer_11692 radeon_atom_hw_i2c_xfer 0-3 11692 NULL ++mt9t031_set_params_11693 mt9t031_set_params 0 11693 NULL ++snd_ctl_elem_user_tlv_11695 snd_ctl_elem_user_tlv 3 11695 NULL nohasharray ++ramoops_pstore_read_11695 ramoops_pstore_read 0 11695 &snd_ctl_elem_user_tlv_11695 nohasharray ++compat_SyS_keyctl_11695 compat_SyS_keyctl 4 11695 &ramoops_pstore_read_11695 ++portio_start_show_11704 portio_start_show 0 11704 NULL nohasharray ++ipmr_mfc_add_11704 ipmr_mfc_add 0 11704 &portio_start_show_11704 ++wl1273_fm_set_tx_freq_11706 wl1273_fm_set_tx_freq 0 11706 NULL nohasharray ++batadv_debugfs_add_meshif_11706 batadv_debugfs_add_meshif 0 11706 &wl1273_fm_set_tx_freq_11706 ++store_11711 store 0 11711 NULL ++hfs_setxattr_11719 hfs_setxattr 0 11719 NULL ++fm10k_set_mac_11722 fm10k_set_mac 0 11722 NULL nohasharray ++default_affinity_write_11722 default_affinity_write 0-3 11722 &fm10k_set_mac_11722 ++blk_rq_cur_bytes_11723 blk_rq_cur_bytes 0 11723 NULL ++mxt_acquire_irq_11731 mxt_acquire_irq 0 11731 NULL ++i2c_master_recv_11734 i2c_master_recv 0-3 11734 NULL nohasharray ++id_show_11734 id_show 0 11734 &i2c_master_recv_11734 ++cx25821_vidupstream_init_11736 cx25821_vidupstream_init 0 11736 NULL ++bch_flash_dev_create_11738 bch_flash_dev_create 0 11738 NULL ++sbp_tpg_attrib_store_mgt_orb_timeout_11745 sbp_tpg_attrib_store_mgt_orb_timeout 0-3 11745 NULL ++vmci_transport_error_to_vsock_error_11746 vmci_transport_error_to_vsock_error 0 11746 NULL ++__pm_runtime_resume_11749 __pm_runtime_resume 0 11749 NULL ++iwl_dbgfs_qos_read_11753 iwl_dbgfs_qos_read 3-0 11753 NULL ++intel_map_page_11762 intel_map_page 0-3 11762 NULL ++show_session_param_ISCSI_PARAM_PORTAL_TYPE_11765 show_session_param_ISCSI_PARAM_PORTAL_TYPE 0 11765 NULL ++ieee80211_get_num_supported_channels_11768 ieee80211_get_num_supported_channels 0 11768 NULL ++tipc_sendmsg_11769 tipc_sendmsg 4-0 11769 NULL ++x25_asy_open_dev_11772 x25_asy_open_dev 0 11772 NULL ++ps_pspoll_timeouts_read_11776 ps_pspoll_timeouts_read 3-0 11776 NULL nohasharray ++exofs_statfs_11776 exofs_statfs 0 11776 &ps_pspoll_timeouts_read_11776 nohasharray ++store_root_block_11776 store_root_block 0 11776 &exofs_statfs_11776 ++assert_show_11778 assert_show 0 11778 NULL ++ebt_buf_add_11779 ebt_buf_add 0 11779 NULL ++mwifiex_cmd_reg_access_11781 mwifiex_cmd_reg_access 0 11781 NULL ++btrfs_key_blockptr_11786 btrfs_key_blockptr 0 11786 NULL ++max6902_read_time_11787 max6902_read_time 0 11787 NULL ++adp8870_bl_l1_daylight_max_show_11793 adp8870_bl_l1_daylight_max_show 0 11793 NULL ++stats_clear_11802 stats_clear 0-3 11802 NULL ++show_hca_type_11803 show_hca_type 0 11803 NULL ++func_11804 func 0 11804 NULL ++open_11806 open 0 11806 NULL nohasharray ++saa6752hs_s_ctrl_11806 saa6752hs_s_ctrl 0 11806 &open_11806 ++fan_fan_watchdog_show_11810 fan_fan_watchdog_show 0 11810 NULL ++_ctl_version_nvdata_persistent_show_11814 _ctl_version_nvdata_persistent_show 0 11814 NULL ++cx23885_alsa_dma_init_11816 cx23885_alsa_dma_init 2 11816 NULL ++pcpu_fc_alloc_11818 pcpu_fc_alloc 2 11818 NULL ++ncp_modify_nfs_info_11819 ncp_modify_nfs_info 0 11819 NULL nohasharray ++nfs_server_get_key_11819 nfs_server_get_key 0 11819 &ncp_modify_nfs_info_11819 ++amd64_dhar_show_11820 amd64_dhar_show 0 11820 NULL nohasharray ++__ip_map_update_11820 __ip_map_update 0 11820 &amd64_dhar_show_11820 ++go7007_start_streaming_11821 go7007_start_streaming 0 11821 NULL ++ufshcd_devfreq_get_dev_status_11822 ufshcd_devfreq_get_dev_status 0 11822 NULL ++i2c_hid_set_or_send_report_11824 i2c_hid_set_or_send_report 0-5 11824 NULL ++sctp_setsockopt_maxseg_11829 sctp_setsockopt_maxseg 3-0 11829 NULL nohasharray ++osst_read_back_buffer_and_rewrite_11829 osst_read_back_buffer_and_rewrite 0 11829 &sctp_setsockopt_maxseg_11829 ++rts51x_read_status_11830 rts51x_read_status 4 11830 NULL ++macvtap_put_user_11831 macvtap_put_user 0 11831 NULL ++qla4xxx_recover_adapter_11835 qla4xxx_recover_adapter 0 11835 NULL ++avc_has_perm_11840 avc_has_perm 0 11840 NULL ++__uncore_filter_cfg_en_show_11842 __uncore_filter_cfg_en_show 0 11842 NULL nohasharray ++notify_11842 notify 0 11842 &__uncore_filter_cfg_en_show_11842 ++unix_stream_connect_11844 unix_stream_connect 3 11844 NULL ++ipath_user_sdma_init_payload_11850 ipath_user_sdma_init_payload 0 11850 NULL ++xfs_file_aio_write_checks_11851 xfs_file_aio_write_checks 0 11851 NULL ++pci_enable_msix_range_11852 pci_enable_msix_range 0-4 11852 NULL ++show_local_ib_device_11854 show_local_ib_device 0 11854 NULL ++fsname_show_11856 fsname_show 0 11856 NULL ++rs5c372_rtc_read_time_11858 rs5c372_rtc_read_time 0 11858 NULL ++nf_nat_sdp_media_11863 nf_nat_sdp_media 9 11863 NULL ++show_fcoe_ctlr_device_fcs_error_11865 show_fcoe_ctlr_device_fcs_error 0 11865 NULL nohasharray ++nilfs_segments_attr_show_11865 nilfs_segments_attr_show 0 11865 &show_fcoe_ctlr_device_fcs_error_11865 ++ecryptfs_copy_filename_11868 ecryptfs_copy_filename 4 11868 NULL ++bdc_queue_xfr_11873 bdc_queue_xfr 0 11873 NULL ++fm_rx_get_rds_mode_11874 fm_rx_get_rds_mode 0 11874 NULL ++show_sf2_level_11876 show_sf2_level 0 11876 NULL ++sht15_end_transmission_11877 sht15_end_transmission 0 11877 NULL nohasharray ++nr_hugepages_store_common_11877 nr_hugepages_store_common 0-4 11877 &sht15_end_transmission_11877 ++lpfc_modelname_show_11878 lpfc_modelname_show 0 11878 NULL nohasharray ++l2cap_chan_send_11878 l2cap_chan_send 0-3 11878 &lpfc_modelname_show_11878 ++ext4_xattr_trusted_set_11879 ext4_xattr_trusted_set 0 11879 NULL ++image_read_11880 image_read 0-6-5 11880 NULL ++iwl_mvm_send_cmd_pdu_11883 iwl_mvm_send_cmd_pdu 0 11883 NULL nohasharray ++otg_set_peripheral_11883 otg_set_peripheral 0 11883 &iwl_mvm_send_cmd_pdu_11883 nohasharray ++_l2_alloc_skb_11883 _l2_alloc_skb 1 11883 &otg_set_peripheral_11883 ++ieee80211_rx_bss_info_11887 ieee80211_rx_bss_info 3 11887 NULL ++avc_audit_11888 avc_audit 0 11888 NULL ++itd1000_set_parameters_11891 itd1000_set_parameters 0 11891 NULL ++uwb_rc_ie_add_one_11893 uwb_rc_ie_add_one 0 11893 NULL ++fuse_direct_write_11900 fuse_direct_write 0-3 11900 NULL ++cifs_idmap_key_instantiate_11901 cifs_idmap_key_instantiate 0 11901 NULL ++kgdb_nmi_tty_write_11905 kgdb_nmi_tty_write 0-3 11905 NULL ++snd_pcm_lib_ioctl_channel_info_11906 snd_pcm_lib_ioctl_channel_info 0 11906 NULL nohasharray ++xstateregs_get_11906 xstateregs_get 4 11906 &snd_pcm_lib_ioctl_channel_info_11906 ++signalfd_read_11910 signalfd_read 0-3 11910 NULL ++ti_write_11916 ti_write 0-4 11916 NULL ++pc87413_notify_sys_11917 pc87413_notify_sys 0 11917 NULL ++_rbd_dev_v2_snap_features_11922 _rbd_dev_v2_snap_features 0 11922 NULL ++fs_devrw_entry_11924 fs_devrw_entry 3-0 11924 NULL ++bitmap_remap_11929 bitmap_remap 5 11929 NULL ++show_limit_11932 show_limit 0 11932 NULL ++nf_nat_ipv6_local_fn_11937 nf_nat_ipv6_local_fn 0 11937 NULL nohasharray ++max1027_debugfs_reg_access_11937 max1027_debugfs_reg_access 0 11937 &nf_nat_ipv6_local_fn_11937 ++atomic_sub_return_11939 atomic_sub_return 0 11939 NULL ++dccp_feat_clone_sp_val_11942 dccp_feat_clone_sp_val 3 11942 NULL ++eventlog_write_11943 eventlog_write 0-6-5 11943 NULL ++store_sched6_11945 store_sched6 4-0 11945 NULL nohasharray ++init_memory_block_11945 init_memory_block 0 11945 &store_sched6_11945 ++lpfc_enable_npiv_show_11947 lpfc_enable_npiv_show 0 11947 NULL ++iscsi_tpg_param_show_ImmediateData_11951 iscsi_tpg_param_show_ImmediateData 0 11951 NULL ++node_read_cpumap_11952 node_read_cpumap 0 11952 NULL ++iscsi_nacl_attrib_show_random_datain_seq_offsets_11953 iscsi_nacl_attrib_show_random_datain_seq_offsets 0 11953 NULL nohasharray ++btmrvl_download_cal_data_11953 btmrvl_download_cal_data 3 11953 &iscsi_nacl_attrib_show_random_datain_seq_offsets_11953 ++set_pwmfreq_11955 set_pwmfreq 0-4 11955 NULL ++show_iface_erl_11956 show_iface_erl 0 11956 NULL ++r1_sync_page_io_11963 r1_sync_page_io 3 11963 NULL ++show_11965 show 0 11965 NULL nohasharray ++qla4xxx_mailbox_command_11965 qla4xxx_mailbox_command 0 11965 &show_11965 ++raid56_parity_alloc_scrub_rbio_11966 raid56_parity_alloc_scrub_rbio 5 11966 NULL nohasharray ++lpfc_iocb_hw_show_11966 lpfc_iocb_hw_show 0 11966 &raid56_parity_alloc_scrub_rbio_11966 ++uhid_dev_destroy_11967 uhid_dev_destroy 0 11967 NULL ++f1x_swap_interleaved_region_11970 f1x_swap_interleaved_region 0-2 11970 NULL ++pptp_getname_11971 pptp_getname 0 11971 NULL ++split_node_11976 split_node 0 11976 NULL nohasharray ++create_rx_ctx_11976 create_rx_ctx 0 11976 &split_node_11976 ++st_sensors_i2c_read_byte_11977 st_sensors_i2c_read_byte 0 11977 NULL ++logfs_read_loop_11982 logfs_read_loop 0 11982 NULL ++netxen_init_firmware_11983 netxen_init_firmware 0 11983 NULL ++bma180_show_avail_11986 bma180_show_avail 0 11986 NULL ++read_and_add_raw_conns_11987 read_and_add_raw_conns 0 11987 NULL ++smack_file_permission_11990 smack_file_permission 0 11990 NULL ++cfq_slice_async_rq_store_11995 cfq_slice_async_rq_store 3-0 11995 NULL ++rtl8180_start_12000 rtl8180_start 0 12000 NULL nohasharray ++sxgbe_init_phy_12000 sxgbe_init_phy 0 12000 &rtl8180_start_12000 nohasharray ++iommu_suspend_12000 iommu_suspend 0 12000 &sxgbe_init_phy_12000 ++snd_usb_caiaq_pcm_prepare_12001 snd_usb_caiaq_pcm_prepare 0 12001 NULL ++drv_sta_add_12002 drv_sta_add 0 12002 NULL ++show_spi_transport_rd_strm_12003 show_spi_transport_rd_strm 0 12003 NULL ++bh1780_read_12006 bh1780_read 0 12006 NULL ++rdev_size_show_12007 rdev_size_show 0 12007 NULL ++ad799x_write_config_12010 ad799x_write_config 0 12010 NULL ++i40e_pci_sriov_configure_12011 i40e_pci_sriov_configure 2-0 12011 NULL nohasharray ++atmtcp_v_send_12011 atmtcp_v_send 0 12011 &i40e_pci_sriov_configure_12011 nohasharray ++pas_set_intr_12011 pas_set_intr 0 12011 &atmtcp_v_send_12011 ++efx_check_disabled_12015 efx_check_disabled 0 12015 NULL ++audit_sockaddr_12030 audit_sockaddr 0 12030 NULL ++s2io_card_up_12032 s2io_card_up 0 12032 NULL ++notifier_call_chain_12036 notifier_call_chain 0 12036 NULL ++device_offline_12042 device_offline 0 12042 NULL ++ftdi_elan_total_command_size_12045 ftdi_elan_total_command_size 0 12045 NULL ++bdx_tx_init_12046 bdx_tx_init 0 12046 NULL ++niu_set_mac_addr_12047 niu_set_mac_addr 0 12047 NULL ++tsl2550_store_power_state_12048 tsl2550_store_power_state 0-4 12048 NULL ++ieee80211_if_read_user_power_level_12050 ieee80211_if_read_user_power_level 3-0 12050 NULL ++em28xx_i2c_read_block_12055 em28xx_i2c_read_block 5 12055 NULL ++tg3_test_msi_12057 tg3_test_msi 0 12057 NULL ++mt9m111_s_ctrl_12060 mt9m111_s_ctrl 0 12060 NULL ++brcmf_config_wowl_pattern_12061 brcmf_config_wowl_pattern 4 12061 NULL ++il4965_ucode_tx_stats_read_12064 il4965_ucode_tx_stats_read 3-0 12064 NULL ++dvb_dmxdev_buffer_write_12065 dvb_dmxdev_buffer_write 3 12065 NULL ++srp_new_cm_id_12069 srp_new_cm_id 0 12069 NULL ++wl12xx_acx_config_ps_12073 wl12xx_acx_config_ps 0 12073 NULL ++start_streaming_12074 start_streaming 0 12074 NULL ++ptc_proc_write_12076 ptc_proc_write 3-0 12076 NULL ++ubifs_recover_log_leb_12079 ubifs_recover_log_leb 3 12079 NULL nohasharray ++i2c_send_bytes_12079 i2c_send_bytes 0 12079 &ubifs_recover_log_leb_12079 ++imx074_g_crop_12081 imx074_g_crop 0 12081 NULL nohasharray ++u3_entry_store_12081 u3_entry_store 0-4 12081 &imx074_g_crop_12081 ++efx_mcdi_check_supported_12082 efx_mcdi_check_supported 0 12082 NULL ++show_conn_param_ISCSI_PARAM_TCP_WSF_DISABLE_12083 show_conn_param_ISCSI_PARAM_TCP_WSF_DISABLE 0 12083 NULL nohasharray ++dpm_suspend_end_12083 dpm_suspend_end 0 12083 &show_conn_param_ISCSI_PARAM_TCP_WSF_DISABLE_12083 ++h5_prepare_pkt_12085 h5_prepare_pkt 4 12085 NULL ++ipath_map_sg_12089 ipath_map_sg 0-3 12089 NULL ++mask_rtc_irq_bit_12090 mask_rtc_irq_bit 0 12090 NULL ++logfs_truncate_direct_12095 logfs_truncate_direct 0 12095 NULL ++show_cpu_vid_12097 show_cpu_vid 0 12097 NULL ++mwl8k_request_firmware_12098 mwl8k_request_firmware 0 12098 NULL ++rtw_malloc2d_12102 rtw_malloc2d 3-2-1 12102 NULL ++pcf8583_set_ctrl_12106 pcf8583_set_ctrl 0 12106 NULL ++wm8962_beep_set_12110 wm8962_beep_set 0-4 12110 NULL ++ssb_pcmcia_hardware_setup_12111 ssb_pcmcia_hardware_setup 0 12111 NULL ++rtsx_transfer_data_partial_12113 rtsx_transfer_data_partial 5 12113 NULL ++snd_disconnect_read_12117 snd_disconnect_read 0-3 12117 NULL ++f_gpio_mod_12118 f_gpio_mod 0 12118 NULL nohasharray ++ntc_show_temp_12118 ntc_show_temp 0 12118 &f_gpio_mod_12118 ++da9052_gpio_direction_output_12120 da9052_gpio_direction_output 0 12120 NULL ++lpfc_task_mgmt_tmo_store_12122 lpfc_task_mgmt_tmo_store 0-4 12122 NULL ++alloc_bulk_urbs_generic_12127 alloc_bulk_urbs_generic 5 12127 NULL ++set_powered_12129 set_powered 4 12129 NULL ++ramoops_init_prz_12134 ramoops_init_prz 5 12134 NULL ++xfs_handle_to_dentry_12135 xfs_handle_to_dentry 3 12135 NULL ++rawv6_seticmpfilter_12137 rawv6_seticmpfilter 5-0 12137 NULL nohasharray ++store_u8_12137 store_u8 0-4 12137 &rawv6_seticmpfilter_12137 ++soc_mbus_image_size_12140 soc_mbus_image_size 0-3-2 12140 NULL ++vmw_fifo_reserve_12141 vmw_fifo_reserve 2 12141 NULL ++il4965_store_debug_level_12142 il4965_store_debug_level 0-4 12142 NULL ++rawsock_recvmsg_12144 rawsock_recvmsg 0-4 12144 NULL ++zoran_read_12147 zoran_read 0-3 12147 NULL nohasharray ++goldfish_fb_check_var_12147 goldfish_fb_check_var 0 12147 &zoran_read_12147 ++btmrvl_sdio_host_to_card_12152 btmrvl_sdio_host_to_card 3 12152 NULL nohasharray ++bond_option_arp_interval_set_12152 bond_option_arp_interval_set 0 12152 &btmrvl_sdio_host_to_card_12152 ++vmbus_open_12154 vmbus_open 3-2 12154 NULL ++suspend_lo_show_12159 suspend_lo_show 0 12159 NULL ++ds1374_read_rtc_12161 ds1374_read_rtc 0 12161 NULL ++ec_write_12162 ec_write 0 12162 NULL ++compat_sys_msgrcv_12165 compat_sys_msgrcv 3 12165 NULL nohasharray ++wil_rxdesc_phy_length_12165 wil_rxdesc_phy_length 0 12165 &compat_sys_msgrcv_12165 ++ath5k_attr_show_spur_level_12172 ath5k_attr_show_spur_level 0 12172 NULL ++fnic_reset_stats_write_12177 fnic_reset_stats_write 3-0 12177 NULL nohasharray ++ovs_tun_key_attr_size_12177 ovs_tun_key_attr_size 0 12177 &fnic_reset_stats_write_12177 ++space_show_12178 space_show 0 12178 NULL nohasharray ++LNetEQAlloc_12178 LNetEQAlloc 1 12178 &space_show_12178 ++ddp_make_gl_12179 ddp_make_gl 1 12179 NULL ++sony_pic_bluetoothpower_show_12182 sony_pic_bluetoothpower_show 0 12182 NULL ++compat_do_arpt_set_ctl_12184 compat_do_arpt_set_ctl 4 12184 NULL ++ip_generic_getfrag_12187 ip_generic_getfrag 3-4 12187 NULL nohasharray ++tipc_wait_for_sndpkt_12187 tipc_wait_for_sndpkt 0 12187 &ip_generic_getfrag_12187 ++virtblk_serial_show_12190 virtblk_serial_show 0 12190 NULL ++iscsit_na_random_r2t_offsets_12192 iscsit_na_random_r2t_offsets 0 12192 NULL ++sta_info_insert_finish_12196 sta_info_insert_finish 0 12196 NULL nohasharray ++forward_delay_store_12196 forward_delay_store 4-0 12196 &sta_info_insert_finish_12196 ++qt2160_read_block_12198 qt2160_read_block 4 12198 NULL nohasharray ++m88rs6000t_set_pll_freq_12198 m88rs6000t_set_pll_freq 0 12198 &qt2160_read_block_12198 ++smsc75xx_set_mac_address_12199 smsc75xx_set_mac_address 0 12199 NULL ++wl1273_fm_vidioc_s_ctrl_12204 wl1273_fm_vidioc_s_ctrl 0 12204 NULL ++pci_bus_read_config_dword_12210 pci_bus_read_config_dword 0 12210 NULL nohasharray ++set_fan_target_12210 set_fan_target 0-4 12210 &pci_bus_read_config_dword_12210 ++receive_copy_12216 receive_copy 3 12216 NULL ++btree_writepages_12217 btree_writepages 0 12217 NULL ++snd_pcm_kernel_ioctl_12219 snd_pcm_kernel_ioctl 0 12219 NULL ++fuse_get_req_12221 fuse_get_req 2 12221 NULL nohasharray ++aat2870_reg_read_file_12221 aat2870_reg_read_file 3-0 12221 &fuse_get_req_12221 ++xfs_attr3_leaf_read_12222 xfs_attr3_leaf_read 0 12222 NULL ++mode_show_12223 mode_show 0 12223 NULL ++led_write_12224 led_write 0 12224 NULL ++tun_net_change_mtu_12229 tun_net_change_mtu 0 12229 NULL ++sbpro_audio_prepare_for_input_12234 sbpro_audio_prepare_for_input 0 12234 NULL ++__alloc_bootmem_low_nopanic_12235 __alloc_bootmem_low_nopanic 1 12235 NULL nohasharray ++bnx2x_alloc_mem_12235 bnx2x_alloc_mem 0 12235 &__alloc_bootmem_low_nopanic_12235 ++usnic_ib_qp_grp_dump_rows_12239 usnic_ib_qp_grp_dump_rows 3 12239 NULL ++bcdDevice_show_12240 bcdDevice_show 0 12240 NULL ++tw9910_g_fmt_12243 tw9910_g_fmt 0 12243 NULL ++rx_length_errors_show_12249 rx_length_errors_show 0 12249 NULL ++ib_uverbs_unmarshall_recv_12251 ib_uverbs_unmarshall_recv 5 12251 NULL ++efx_ethtool_get_regs_len_12255 efx_ethtool_get_regs_len 0 12255 NULL nohasharray ++max197_store_range_12255 max197_store_range 0-4 12255 &efx_ethtool_get_regs_len_12255 ++store_12256 store 0-3 12256 NULL ++ath_descdma_setup_12257 ath_descdma_setup 5 12257 NULL ++_nfs4_proc_mknod_12260 _nfs4_proc_mknod 0 12260 NULL nohasharray ++irst_show_wakeup_time_12260 irst_show_wakeup_time 0 12260 &_nfs4_proc_mknod_12260 nohasharray ++qla4xxx_context_reset_12260 qla4xxx_context_reset 0 12260 &irst_show_wakeup_time_12260 ++setsockopt_12262 setsockopt 0 12262 NULL ++ps2pp_attr_show_smartscroll_12263 ps2pp_attr_show_smartscroll 0 12263 NULL ++ocfs2_xattr_user_set_12266 ocfs2_xattr_user_set 0 12266 NULL ++start_12267 start 0 12267 NULL nohasharray ++shash_compat_setkey_12267 shash_compat_setkey 3 12267 &start_12267 ++bond_option_all_slaves_active_set_12268 bond_option_all_slaves_active_set 0 12268 NULL ++add_sctp_bind_addr_12269 add_sctp_bind_addr 3-0 12269 NULL nohasharray ++decode_ext_sec_blob_12269 decode_ext_sec_blob 0 12269 &add_sctp_bind_addr_12269 ++fan_get_state_acpi4_12270 fan_get_state_acpi4 0 12270 NULL ++max8997_led_store_mode_12271 max8997_led_store_mode 0-4 12271 NULL ++amd64_inject_word_show_12272 amd64_inject_word_show 0 12272 NULL ++__ip_local_out_12275 __ip_local_out 0 12275 NULL ++simple_xattr_get_12283 simple_xattr_get 0 12283 NULL nohasharray ++md4_init_12283 md4_init 0 12283 &simple_xattr_get_12283 nohasharray ++mls_compute_sid_12283 mls_compute_sid 0 12283 &md4_init_12283 ++note_last_dentry_12285 note_last_dentry 3 12285 NULL ++il_dbgfs_nvm_read_12288 il_dbgfs_nvm_read 3-0 12288 NULL nohasharray ++show_sas_phy_enable_12288 show_sas_phy_enable 0 12288 &il_dbgfs_nvm_read_12288 nohasharray ++tcm_loop_wwn_show_attr_version_12288 tcm_loop_wwn_show_attr_version 0 12288 &show_sas_phy_enable_12288 ++ds3232_set_alarm_12294 ds3232_set_alarm 0 12294 NULL ++mb862xx_i2c_read_12299 mb862xx_i2c_read 0 12299 NULL ++adfs_f_sync_12305 adfs_f_sync 0 12305 NULL ++__lbs_cmd_12307 __lbs_cmd 0 12307 NULL ++make_ltab_dirty_12311 make_ltab_dirty 0 12311 NULL ++nouveau_hwmon_set_critical_temp_12312 nouveau_hwmon_set_critical_temp 0-4 12312 NULL ++mwl8k_cmd_mimo_config_12314 mwl8k_cmd_mimo_config 0 12314 NULL ++iscsi_tpg_param_show_MaxConnections_12315 iscsi_tpg_param_show_MaxConnections 0 12315 NULL ++cdc_ncm_show_wNdpInPayloadRemainder_12316 cdc_ncm_show_wNdpInPayloadRemainder 0 12316 NULL nohasharray ++bt_sock_recvmsg_12316 bt_sock_recvmsg 0-4 12316 &cdc_ncm_show_wNdpInPayloadRemainder_12316 ++bh1770_set_lux_thresh_below_12318 bh1770_set_lux_thresh_below 0-4 12318 NULL ++usnic_transport_sock_to_str_12322 usnic_transport_sock_to_str 2-0 12322 NULL nohasharray ++ocfs2_statfs_12322 ocfs2_statfs 0 12322 &usnic_transport_sock_to_str_12322 ++write_rbu_packet_size_12325 write_rbu_packet_size 0-6-5 12325 NULL ++show_urb_12326 show_urb 0 12326 NULL ++pcbit_writecmd_12332 pcbit_writecmd 2 12332 NULL ++xfs_bmap_last_extent_12335 xfs_bmap_last_extent 0 12335 NULL ++write_12336 write 0 12336 NULL ++sta_info_insert_rcu_12337 sta_info_insert_rcu 0 12337 NULL ++pppoe_getname_12338 pppoe_getname 0 12338 NULL nohasharray ++set_cpus_allowed_ptr_12338 set_cpus_allowed_ptr 0 12338 &pppoe_getname_12338 ++get_burstcount_12341 get_burstcount 0 12341 NULL ++pn544_hci_i2c_fw_secure_write_frame_cmd_12342 pn544_hci_i2c_fw_secure_write_frame_cmd 3 12342 NULL ++dn_listen_12343 dn_listen 0 12343 NULL ++lio_target_nacl_show_info_12345 lio_target_nacl_show_info 0 12345 NULL ++ipvlan_hard_header_12348 ipvlan_hard_header 0 12348 NULL ++mptctl_ioctl_12355 mptctl_ioctl 2 12355 NULL nohasharray ++sxgbe_init_rx_buffers_12355 sxgbe_init_rx_buffers 4 12355 &mptctl_ioctl_12355 ++kstrtoint_12362 kstrtoint 0 12362 NULL nohasharray ++rtl8187_add_interface_12362 rtl8187_add_interface 0 12362 &kstrtoint_12362 ++__nf_ct_ext_add_length_12364 __nf_ct_ext_add_length 3 12364 NULL ++smp_alloc_skb_cb_12365 smp_alloc_skb_cb 3-2 12365 NULL ++store_12367 store 0 12367 NULL ++ad_sigma_delta_set_channel_12368 ad_sigma_delta_set_channel 0 12368 NULL ++show_pwm_mode_12372 show_pwm_mode 0 12372 NULL nohasharray ++target_stat_scsi_lu_show_attr_inst_12372 target_stat_scsi_lu_show_attr_inst 0 12372 &show_pwm_mode_12372 ++xfs_iext_inline_to_direct_12384 xfs_iext_inline_to_direct 2 12384 NULL ++show_fnode_ipv6_traffic_class_12385 show_fnode_ipv6_traffic_class 0 12385 NULL nohasharray ++sctp_verify_addr_12385 sctp_verify_addr 0 12385 &show_fnode_ipv6_traffic_class_12385 nohasharray ++isoc_nego_12385 isoc_nego 0 12385 &sctp_verify_addr_12385 ++write_file_dump_12391 write_file_dump 3-0 12391 NULL nohasharray ++populate_dir_12391 populate_dir 0 12391 &write_file_dump_12391 ++mp_map_pin_to_irq_12394 mp_map_pin_to_irq 4-1 12394 NULL ++target_fabric_nacl_attrib_attr_store_12395 target_fabric_nacl_attrib_attr_store 0-4 12395 NULL ++fm_v4l2_fops_write_12411 fm_v4l2_fops_write 0-3 12411 NULL ++ext4_bg_num_gdb_nometa_12413 ext4_bg_num_gdb_nometa 0 12413 NULL ++hbucket_elem_add_12416 hbucket_elem_add 3 12416 NULL ++nilfs_wait_on_logs_12418 nilfs_wait_on_logs 0 12418 NULL nohasharray ++mlog_mask_store_12418 mlog_mask_store 0-3 12418 &nilfs_wait_on_logs_12418 ++ieee80211_if_read_num_mcast_sta_12419 ieee80211_if_read_num_mcast_sta 3-0 12419 NULL ++pccard_show_card_pm_state_12422 pccard_show_card_pm_state 0 12422 NULL ++stats_store_12424 stats_store 0-3 12424 NULL ++ppp_sync_read_12426 ppp_sync_read 0 12426 NULL ++show_display_12427 show_display 0 12427 NULL ++coda_file_read_12437 coda_file_read 0-3 12437 NULL ++mos7840_open_12439 mos7840_open 0 12439 NULL ++nilfs_segctor_write_12441 nilfs_segctor_write 0 12441 NULL nohasharray ++cfs_array_alloc_12441 cfs_array_alloc 2 12441 &nilfs_segctor_write_12441 ++hwcache_align_show_12442 hwcache_align_show 0 12442 NULL ++iscsi_stat_login_show_attr_inst_12452 iscsi_stat_login_show_attr_inst 0 12452 NULL ++e1000e_get_sset_count_12456 e1000e_get_sset_count 0 12456 NULL ++deadline_read_expire_store_12459 deadline_read_expire_store 0-3 12459 NULL ++skb_do_copy_data_nocache_12465 skb_do_copy_data_nocache 5-0 12465 NULL ++rbd_dev_v2_header_info_12466 rbd_dev_v2_header_info 0 12466 NULL ++defrag_show_12468 defrag_show 0 12468 NULL nohasharray ++mei_write_message_12468 mei_write_message 0 12468 &defrag_show_12468 ++ql_wait_for_drvr_lock_12472 ql_wait_for_drvr_lock 0 12472 NULL nohasharray ++ip101a_g_config_init_12472 ip101a_g_config_init 0 12472 &ql_wait_for_drvr_lock_12472 nohasharray ++rsi_prepare_skb_12472 rsi_prepare_skb 4-3 12472 &ip101a_g_config_init_12472 ++sst_create_block_and_ipc_msg_12473 sst_create_block_and_ipc_msg 0 12473 NULL ++raw_enable_filters_12474 raw_enable_filters 0 12474 NULL ++qla4_82xx_pci_mem_write_direct_12479 qla4_82xx_pci_mem_write_direct 2 12479 NULL nohasharray ++uvc_queue_setup_12479 uvc_queue_setup 0 12479 &qla4_82xx_pci_mem_write_direct_12479 ++stream_next_buffer_check_queue_12481 stream_next_buffer_check_queue 0 12481 NULL ++selinux_socket_create_12482 selinux_socket_create 0 12482 NULL ++max77802_enable_12483 max77802_enable 0 12483 NULL nohasharray ++target_stat_scsi_lu_show_attr_dev_12483 target_stat_scsi_lu_show_attr_dev 0 12483 &max77802_enable_12483 ++x25_sendmsg_12487 x25_sendmsg 4-0 12487 NULL ++__iwl_read_prph_12491 __iwl_read_prph 0 12491 NULL ++rtllib_auth_challenge_12493 rtllib_auth_challenge 3 12493 NULL ++fnic_trace_ctrl_read_12497 fnic_trace_ctrl_read 3-0 12497 NULL ++nilfs_segctor_last_seg_write_time_secs_show_12500 nilfs_segctor_last_seg_write_time_secs_show 0 12500 NULL ++allow_func_id_match_store_12501 allow_func_id_match_store 0-4 12501 NULL ++filelayout_commit_pagelist_12506 filelayout_commit_pagelist 0 12506 NULL nohasharray ++driver_probe_device_12506 driver_probe_device 0 12506 &filelayout_commit_pagelist_12506 ++nfs_readdir_make_qstr_12509 nfs_readdir_make_qstr 3 12509 NULL ++stream_start_12516 stream_start 0 12516 NULL ++open_12519 open 0 12519 NULL ++write_12520 write 0 12520 NULL ++ql_start_rss_12521 ql_start_rss 0 12521 NULL nohasharray ++reset_store_12521 reset_store 0-4 12521 &ql_start_rss_12521 ++failed_writes_show_12525 failed_writes_show 0 12525 NULL ++qib_alloc_fast_reg_mr_12526 qib_alloc_fast_reg_mr 2 12526 NULL ++mmc_erase_size_show_12530 mmc_erase_size_show 0 12530 NULL ++xfs_da3_path_shift_12532 xfs_da3_path_shift 0 12532 NULL ++acpi_dev_pm_explicit_set_12533 acpi_dev_pm_explicit_set 0 12533 NULL ++efx_nic_get_regs_len_12534 efx_nic_get_regs_len 0 12534 NULL ++inv_mpu6050_validate_trigger_12535 inv_mpu6050_validate_trigger 0 12535 NULL ++e100_hw_init_12536 e100_hw_init 0 12536 NULL ++show_engine_leds_12537 show_engine_leds 0 12537 NULL ++brcms_ops_sta_add_12540 brcms_ops_sta_add 0 12540 NULL ++comm_local_read_12541 comm_local_read 0 12541 NULL ++stv06xx_write_sensor_finish_12543 stv06xx_write_sensor_finish 0 12543 NULL ++masq_device_event_12546 masq_device_event 0 12546 NULL ++efx_ef10_mem_map_size_12547 efx_ef10_mem_map_size 0 12547 NULL ++mr_write_12549 mr_write 0 12549 NULL nohasharray ++show_temp0_max_12549 show_temp0_max 0 12549 &mr_write_12549 ++mesh_get_default_parameters_12550 mesh_get_default_parameters 0 12550 NULL nohasharray ++recover_callbacks_write_12550 recover_callbacks_write 0-3 12550 &mesh_get_default_parameters_12550 nohasharray ++set_limit_12550 set_limit 0-4 12550 &recover_callbacks_write_12550 ++bh1770_prox_enable_show_12551 bh1770_prox_enable_show 0 12551 NULL ++send_convert_12552 send_convert 0 12552 NULL ++ptp_pch_enable_12555 ptp_pch_enable 0 12555 NULL ++store_bank2_mask_12556 store_bank2_mask 0-4 12556 NULL ++joydev_read_12559 joydev_read 0-3 12559 NULL ++__smsc75xx_write_reg_12561 __smsc75xx_write_reg 0 12561 NULL ++ov5642_cropcap_12562 ov5642_cropcap 0 12562 NULL ++add_beep_ctls_12563 add_beep_ctls 0 12563 NULL ++arizona_gpio_direction_out_12564 arizona_gpio_direction_out 0 12564 NULL ++nvkm_event_init_12565 nvkm_event_init 2-3 12565 NULL nohasharray ++write_inode_now_12565 write_inode_now 0 12565 &nvkm_event_init_12565 ++pwm_config_12570 pwm_config 0 12570 NULL ++o2hb_region_block_bytes_read_12574 o2hb_region_block_bytes_read 0 12574 NULL ++hvc_alloc_12579 hvc_alloc 4 12579 NULL ++snd_pcm_plugin_alloc_12580 snd_pcm_plugin_alloc 2-0 12580 NULL nohasharray ++ntfs_file_aio_write_12580 ntfs_file_aio_write 0 12580 &snd_pcm_plugin_alloc_12580 ++bond_option_lp_interval_set_12584 bond_option_lp_interval_set 0 12584 NULL ++request_update_12585 request_update 0 12585 NULL ++nilfs_direct_propagate_12588 nilfs_direct_propagate 0 12588 NULL nohasharray ++ns83820_change_mtu_12588 ns83820_change_mtu 0 12588 &nilfs_direct_propagate_12588 ++pcpu_extend_area_map_12589 pcpu_extend_area_map 2 12589 NULL ++nilfs_segctor_dirty_data_blocks_count_show_12591 nilfs_segctor_dirty_data_blocks_count_show 0 12591 NULL nohasharray ++qla2x00_sysfs_write_vpd_12591 qla2x00_sysfs_write_vpd 0-6-5 12591 &nilfs_segctor_dirty_data_blocks_count_show_12591 ++nft_rbtree_privsize_12592 nft_rbtree_privsize 0 12592 NULL ++add_endpoint_12593 add_endpoint 0 12593 NULL ++xen_write_cr3_12594 xen_write_cr3 1 12594 NULL ++_iwl_dbgfs_prph_reg_write_12597 _iwl_dbgfs_prph_reg_write 3-0 12597 NULL ++tlbflush_write_file_12598 tlbflush_write_file 3-0 12598 NULL ++ipv6_get_l4proto_12600 ipv6_get_l4proto 0-2 12600 NULL ++ssp_io_req_12603 ssp_io_req 0 12603 NULL nohasharray ++ath10k_ce_send_12603 ath10k_ce_send 0 12603 &ssp_io_req_12603 ++vhci_put_user_12604 vhci_put_user 4-0 12604 NULL ++rtc_timer_enqueue_12606 rtc_timer_enqueue 0 12606 NULL ++get_port1_handler_12607 get_port1_handler 0 12607 NULL ++ethoc_get_regs_len_12608 ethoc_get_regs_len 0 12608 NULL ++qla27xx_fwdt_calculate_dump_size_12617 qla27xx_fwdt_calculate_dump_size 0 12617 NULL nohasharray ++cx8800_s_vid_ctrl_12617 cx8800_s_vid_ctrl 0 12617 &qla27xx_fwdt_calculate_dump_size_12617 ++_nfs41_proc_secinfo_no_name_12624 _nfs41_proc_secinfo_no_name 0 12624 NULL nohasharray ++fc_fcp_frame_alloc_12624 fc_fcp_frame_alloc 2 12624 &_nfs41_proc_secinfo_no_name_12624 ++get_component_fault_12625 get_component_fault 0 12625 NULL ++sdhci_pltfm_init_12627 sdhci_pltfm_init 3 12627 NULL ++pwr_rcvd_awake_bcns_cnt_read_12632 pwr_rcvd_awake_bcns_cnt_read 3-0 12632 NULL ++store_blank_12636 store_blank 0-4 12636 NULL ++pn_sendmsg_12640 pn_sendmsg 4-0 12640 NULL ++dwc3_link_state_write_12641 dwc3_link_state_write 3-0 12641 NULL ++nr_recvmsg_12649 nr_recvmsg 0-4 12649 NULL ++wb_create_12651 wb_create 1 12651 NULL ++apply_12652 apply 0 12652 NULL ++proc_reg_read_12653 proc_reg_read 0-3 12653 NULL ++pid_show_12655 pid_show 0 12655 NULL nohasharray ++store_12655 store 0-3 12655 &pid_show_12655 nohasharray ++rtw_android_get_link_speed_12655 rtw_android_get_link_speed 0 12655 &store_12655 ++ocfs2_read_block_12659 ocfs2_read_block 0 12659 NULL ++sparse_mem_maps_populate_node_12669 sparse_mem_maps_populate_node 4 12669 NULL nohasharray ++sel_read_class_12669 sel_read_class 3-0 12669 &sparse_mem_maps_populate_node_12669 ++gl861_i2c_xfer_12676 gl861_i2c_xfer 0-3 12676 NULL ++ipw2100_hw_send_command_12678 ipw2100_hw_send_command 0 12678 NULL ++uncore_event_show_12679 uncore_event_show 0 12679 NULL nohasharray ++sock_splice_read_12679 sock_splice_read 0 12679 &uncore_event_show_12679 ++store_pwm_auto_point_pwm_12680 store_pwm_auto_point_pwm 0-4 12680 NULL ++bnx2x_config_vlan_mac_12682 bnx2x_config_vlan_mac 0 12682 NULL ++show_12685 show 0 12685 NULL ++sidtab_init_12688 sidtab_init 0 12688 NULL ++pm_qos_latency_tolerance_store_12690 pm_qos_latency_tolerance_store 0-4 12690 NULL ++update_cpumask_12691 update_cpumask 0 12691 NULL ++mcp23s08_gpio_to_irq_12692 mcp23s08_gpio_to_irq 2 12692 NULL ++nsc_ircc_net_open_12694 nsc_ircc_net_open 0 12694 NULL ++tlan_open_12699 tlan_open 0 12699 NULL ++ext4_bg_num_gdb_meta_12702 ext4_bg_num_gdb_meta 0 12702 NULL ++saa7146_i2c_reset_12703 saa7146_i2c_reset 0 12703 NULL ++iwl_dbgfs_calib_disabled_write_12707 iwl_dbgfs_calib_disabled_write 3-0 12707 NULL ++ramdisk_show_12715 ramdisk_show 0 12715 NULL ++ieee80211_if_read_num_buffered_multicast_12716 ieee80211_if_read_num_buffered_multicast 3-0 12716 NULL nohasharray ++fill_multi_ios_12716 fill_multi_ios 0 12716 &ieee80211_if_read_num_buffered_multicast_12716 ++ivtv_write_12721 ivtv_write 3-0 12721 NULL nohasharray ++osst_filemark_cnt_show_12721 osst_filemark_cnt_show 0 12721 &ivtv_write_12721 nohasharray ++class_pktcdvd_store_add_12721 class_pktcdvd_store_add 0-4 12721 &osst_filemark_cnt_show_12721 ++mc13783_adc_read_12732 mc13783_adc_read 0 12732 NULL nohasharray ++carl9170_init_phy_from_eeprom_12732 carl9170_init_phy_from_eeprom 0 12732 &mc13783_adc_read_12732 ++key_rx_spec_read_12736 key_rx_spec_read 3-0 12736 NULL ++__mei_cl_async_send_12737 __mei_cl_async_send 3 12737 NULL nohasharray ++xfs_da3_node_read_12737 xfs_da3_node_read 0 12737 &__mei_cl_async_send_12737 ++lio_target_nacl_show_cmdsn_depth_12739 lio_target_nacl_show_cmdsn_depth 0 12739 NULL ++get_if_frequency_12740 get_if_frequency 0 12740 NULL ++pktgen_setup_dev_12745 pktgen_setup_dev 0 12745 NULL ++show_iostat_ioerr_cnt_12747 show_iostat_ioerr_cnt 0 12747 NULL ++snd_usbtv_prepare_12749 snd_usbtv_prepare 0 12749 NULL ++dma_fifo_in_12754 dma_fifo_in 0-3 12754 NULL ++ieee80211_if_read_dot11MeshMaxRetries_12756 ieee80211_if_read_dot11MeshMaxRetries 3-0 12756 NULL ++traceSMB_proc_write_12763 traceSMB_proc_write 0-3 12763 NULL ++stac_create_spdif_mux_ctls_12764 stac_create_spdif_mux_ctls 0 12764 NULL ++snd_emu10k1_capture_trigger_12765 snd_emu10k1_capture_trigger 0 12765 NULL ++iscsi_stat_tgt_attr_show_attr_fail_intr_name_12767 iscsi_stat_tgt_attr_show_attr_fail_intr_name 0 12767 NULL ++listxattr_12769 listxattr 3 12769 NULL ++persistent_show_12774 persistent_show 0 12774 NULL nohasharray ++store_blue_12774 store_blue 0-4 12774 &persistent_show_12774 ++check_ci_12775 check_ci 0 12775 NULL nohasharray ++tiadc_buffer_postenable_12775 tiadc_buffer_postenable 0 12775 &check_ci_12775 nohasharray ++ip_ufo_append_data_12775 ip_ufo_append_data 8-7-6 12775 &tiadc_buffer_postenable_12775 ++validate_index_12777 validate_index 0 12777 NULL ++__iscsi_disc_show_userid_mutual_12779 __iscsi_disc_show_userid_mutual 0 12779 NULL ++store_selfballoon_reserved_mb_12780 store_selfballoon_reserved_mb 0-4 12780 NULL ++o2hb_heartbeat_group_show_12783 o2hb_heartbeat_group_show 0 12783 NULL nohasharray ++bcm54xx_exp_write_12783 bcm54xx_exp_write 0 12783 &o2hb_heartbeat_group_show_12783 ++e1000_setup_all_tx_resources_12786 e1000_setup_all_tx_resources 0 12786 NULL ++ath6kl_wmi_cmd_send_xtnd_12787 ath6kl_wmi_cmd_send_xtnd 0 12787 NULL ++bnx2x_set_mac_one_12791 bnx2x_set_mac_one 0 12791 NULL ++sysfs_ctlreg_read_12803 sysfs_ctlreg_read 0-5-6 12803 NULL ++netdev_get_regs_len_12807 netdev_get_regs_len 0 12807 NULL ++show_spi_transport_period_helper_12808 show_spi_transport_period_helper 0 12808 NULL ++mgmt_event_12810 mgmt_event 4 12810 NULL ++xfs_inumbers_fmt_12817 xfs_inumbers_fmt 3 12817 NULL ++_nfs40_proc_fsid_present_12824 _nfs40_proc_fsid_present 0 12824 NULL nohasharray ++rt2800_load_firmware_12824 rt2800_load_firmware 0 12824 &_nfs40_proc_fsid_present_12824 ++readq_12825 readq 0 12825 NULL ++show_12831 show 0 12831 NULL ++create_12834 create 0 12834 NULL nohasharray ++SyS_add_key_12834 SyS_add_key 4 12834 &create_12834 ++gfs2_log_reserve_12835 gfs2_log_reserve 0 12835 NULL nohasharray ++security_audit_rule_init_12835 security_audit_rule_init 0 12835 &gfs2_log_reserve_12835 ++dn_dst_mtu_12837 dn_dst_mtu 0 12837 NULL nohasharray ++acpi_battery_alarm_store_12837 acpi_battery_alarm_store 0-4 12837 &dn_dst_mtu_12837 ++TSS_authhmac_12839 TSS_authhmac 0 12839 NULL nohasharray ++get_l2cap_conn_12839 get_l2cap_conn 0 12839 &TSS_authhmac_12839 ++mvs_store_interrupt_coalescing_12841 mvs_store_interrupt_coalescing 0-4 12841 NULL ++spidev_sync_12842 spidev_sync 0 12842 NULL nohasharray ++ath6kl_wmi_add_wow_pattern_cmd_12842 ath6kl_wmi_add_wow_pattern_cmd 4 12842 &spidev_sync_12842 ++atkbd_do_set_force_release_12843 atkbd_do_set_force_release 0-4 12843 NULL ++spidev_ioctl_12846 spidev_ioctl 2 12846 NULL nohasharray ++si4713_i2c_read_12846 si4713_i2c_read 0 12846 &spidev_ioctl_12846 ++adp5520_bl_dark_dim_store_12853 adp5520_bl_dark_dim_store 4-0 12853 NULL ++rtl28xxu_i2c_xfer_12854 rtl28xxu_i2c_xfer 0-3 12854 NULL nohasharray ++nilfs_bmap_do_insert_12854 nilfs_bmap_do_insert 0 12854 &rtl28xxu_i2c_xfer_12854 nohasharray ++hiddev_read_12854 hiddev_read 0-3 12854 &nilfs_bmap_do_insert_12854 nohasharray ++cs421x_build_controls_12854 cs421x_build_controls 0 12854 &hiddev_read_12854 ++gadget_dev_desc_bDeviceClass_store_12857 gadget_dev_desc_bDeviceClass_store 0-3 12857 NULL ++ib_post_send_mad_12859 ib_post_send_mad 0 12859 NULL ++fc2580_wr_regs_12863 fc2580_wr_regs 0 12863 NULL ++xfs_rtallocate_extent_exact_12865 xfs_rtallocate_extent_exact 0 12865 NULL ++serio_raw_read_12868 serio_raw_read 0-3 12868 NULL ++snd_atiixp_pcm_trigger_12871 snd_atiixp_pcm_trigger 0 12871 NULL nohasharray ++drop_endpoint_12871 drop_endpoint 0 12871 &snd_atiixp_pcm_trigger_12871 nohasharray ++show_12871 show 0 12871 &drop_endpoint_12871 nohasharray ++md_run_12871 md_run 0 12871 &show_12871 ++nilfs_dev_blocksize_show_12874 nilfs_dev_blocksize_show 0 12874 NULL ++dln2_send_wait_12877 dln2_send_wait 0 12877 NULL ++allow_restart_store_12880 allow_restart_store 0-4 12880 NULL ++ath9k_dump_4k_modal_eeprom_12883 ath9k_dump_4k_modal_eeprom 2-3-0 12883 NULL nohasharray ++do_setattr_12883 do_setattr 0 12883 &ath9k_dump_4k_modal_eeprom_12883 ++show_fnode_tpgt_12887 show_fnode_tpgt 0 12887 NULL ++show_ata_dev_id_12891 show_ata_dev_id 0 12891 NULL ++show_hold_timer_12892 show_hold_timer 0 12892 NULL nohasharray ++get_leb_cnt_12892 get_leb_cnt 0-2 12892 &show_hold_timer_12892 ++minix_readpage_12897 minix_readpage 0 12897 NULL ++wsm_cmd_send_12901 wsm_cmd_send 0 12901 NULL ++_regmap_raw_read_12902 _regmap_raw_read 0 12902 NULL nohasharray ++request_12902 request 0 12902 &_regmap_raw_read_12902 ++ocfs2_hamming_encode_block_12904 ocfs2_hamming_encode_block 2 12904 NULL ++sha512_ssse3_export_12905 sha512_ssse3_export 0 12905 NULL ++elan_write_fw_block_12906 elan_write_fw_block 0 12906 NULL ++get_virtual_node_size_12908 get_virtual_node_size 0 12908 NULL ++qlcnic_clear_esw_stats_12911 qlcnic_clear_esw_stats 0 12911 NULL ++show_temp_status_12912 show_temp_status 0 12912 NULL ++quota_quantum_show_12921 quota_quantum_show 0 12921 NULL ++rds_pages_in_vec_12922 rds_pages_in_vec 0 12922 NULL ++_nfs4_open_expired_12925 _nfs4_open_expired 0 12925 NULL ++ci_ll_init_12930 ci_ll_init 3 12930 NULL ++update_mode_show_12934 update_mode_show 0 12934 NULL nohasharray ++adxl34x_disable_store_12934 adxl34x_disable_store 0-4 12934 &update_mode_show_12934 ++SYSC_sendfile_12936 SYSC_sendfile 4 12936 NULL ++nvme_npages_12938 nvme_npages 0-1 12938 NULL nohasharray ++ican3_sysfs_show_term_12938 ican3_sysfs_show_term 0 12938 &nvme_npages_12938 ++target_core_alua_tg_pt_gp_show_attr_alua_support_offline_12939 target_core_alua_tg_pt_gp_show_attr_alua_support_offline 0 12939 NULL ++sdev_show_scsi_level_12941 sdev_show_scsi_level 0 12941 NULL ++register_memory_12944 register_memory 0 12944 NULL ++do_inode_permission_12946 do_inode_permission 0 12946 NULL ++show_alarm_beep_12949 show_alarm_beep 0 12949 NULL ++_ctl_device_delay_show_12957 _ctl_device_delay_show 0 12957 NULL ++qib_map_sg_12958 qib_map_sg 0-3 12958 NULL ++bcsp_prepare_pkt_12961 bcsp_prepare_pkt 3 12961 NULL ++iwlagn_mac_sta_remove_12962 iwlagn_mac_sta_remove 0 12962 NULL nohasharray ++myri10ge_update_mac_address_12962 myri10ge_update_mac_address 0 12962 &iwlagn_mac_sta_remove_12962 ++bm_status_write_12964 bm_status_write 3-0 12964 NULL ++lpfc_link_speed_show_12965 lpfc_link_speed_show 0 12965 NULL nohasharray ++snd_seq_prioq_cell_in_12965 snd_seq_prioq_cell_in 0 12965 &lpfc_link_speed_show_12965 ++start_khugepaged_12971 start_khugepaged 0 12971 NULL ++iwl_mvm_read_external_nvm_12975 iwl_mvm_read_external_nvm 0 12975 NULL ++broadsheet_setup_plls_12983 broadsheet_setup_plls 0 12983 NULL ++adfs_statfs_12986 adfs_statfs 0 12986 NULL ++sk_peek_offset_12991 sk_peek_offset 0 12991 NULL ++host_lock_show_12993 host_lock_show 0 12993 NULL ++mgmt_get_if_info_12995 mgmt_get_if_info 0 12995 NULL nohasharray ++__iscsi_tpg_auth_show_userid_12995 __iscsi_tpg_auth_show_userid 0 12995 &mgmt_get_if_info_12995 ++drbd_recv_all_13002 drbd_recv_all 3 13002 NULL ++_get_block_create_0_13003 _get_block_create_0 0 13003 NULL nohasharray ++bfad_im_issue_fc_host_lip_13003 bfad_im_issue_fc_host_lip 0 13003 &_get_block_create_0_13003 ++vmci_transport_stream_enqueue_13004 vmci_transport_stream_enqueue 0-3 13004 NULL nohasharray ++set_otp0_13004 set_otp0 4-0 13004 &vmci_transport_stream_enqueue_13004 ++shutdown_event_13006 shutdown_event 0 13006 NULL ++show_octave_13007 show_octave 0 13007 NULL ++cyberjack_open_13012 cyberjack_open 0 13012 NULL nohasharray ++musb_srp_store_13012 musb_srp_store 0-4 13012 &cyberjack_open_13012 ++vsscanf_13014 vsscanf 0 13014 NULL ++snd_register_device_for_dev_13015 snd_register_device_for_dev 0 13015 NULL ++dib8096p_tuner_read_serpar_13017 dib8096p_tuner_read_serpar 0-3 13017 NULL ++netvsc_open_13019 netvsc_open 0 13019 NULL ++subsystem_filter_write_13022 subsystem_filter_write 3 13022 NULL ++__uncore_umask_show_13024 __uncore_umask_show 0 13024 NULL nohasharray ++wsm_set_edca_params_13024 wsm_set_edca_params 0 13024 &__uncore_umask_show_13024 nohasharray ++aa_setprocattr_changehat_13024 aa_setprocattr_changehat 0 13024 &wsm_set_edca_params_13024 ++dw2102_i2c_transfer_13026 dw2102_i2c_transfer 0-3 13026 NULL ++lis3lv02d_position_show_13034 lis3lv02d_position_show 0 13034 NULL nohasharray ++ipg_nic_change_mtu_13034 ipg_nic_change_mtu 0 13034 &lis3lv02d_position_show_13034 ++usbhsh_pipe_attach_13040 usbhsh_pipe_attach 0 13040 NULL nohasharray ++poll_busy_13040 poll_busy 0 13040 &usbhsh_pipe_attach_13040 ++SyS_sendfile64_13043 SyS_sendfile64 4 13043 NULL ++ocfs2_write_begin_13045 ocfs2_write_begin 0 13045 NULL ++nilfs_sync_file_13047 nilfs_sync_file 0 13047 NULL nohasharray ++cifs_write_allocate_pages_13047 cifs_write_allocate_pages 0 13047 &nilfs_sync_file_13047 ++__dn_setsockopt_13060 __dn_setsockopt 5-0 13060 NULL nohasharray ++ctnetlink_timestamp_size_13060 ctnetlink_timestamp_size 0 13060 &__dn_setsockopt_13060 nohasharray ++ptlrpc_lprocfs_threads_min_seq_write_13060 ptlrpc_lprocfs_threads_min_seq_write 3 13060 &ctnetlink_timestamp_size_13060 ++ppp_asynctty_read_13062 ppp_asynctty_read 0 13062 NULL ++adv7175_s_fmt_13066 adv7175_s_fmt 0 13066 NULL ++adis_read_reg_16_13072 adis_read_reg_16 0 13072 NULL ++nf_nat_ipv4_fn_13074 nf_nat_ipv4_fn 0 13074 NULL ++raid5_store_skip_copy_13075 raid5_store_skip_copy 0-3 13075 NULL nohasharray ++bnx2fc_fcoe_reset_13075 bnx2fc_fcoe_reset 0 13075 &raid5_store_skip_copy_13075 ++wl1251_hw_init_templates_config_13078 wl1251_hw_init_templates_config 0 13078 NULL ++ti_do_config_13080 ti_do_config 0 13080 NULL ++get_pwm1_13083 get_pwm1 0 13083 NULL ++synaptics_set_disable_gesture_13085 synaptics_set_disable_gesture 0-4 13085 NULL ++xattr_getsecurity_13090 xattr_getsecurity 0 13090 NULL ++blk_rq_map_sg_13092 blk_rq_map_sg 0 13092 NULL ++show_down_head_align_13093 show_down_head_align 0 13093 NULL ++lec_change_mtu_13094 lec_change_mtu 0 13094 NULL ++sbi_ui_store_13095 sbi_ui_store 0-4 13095 NULL ++il_send_add_sta_13097 il_send_add_sta 0 13097 NULL ++mb_find_next_zero_bit_13100 mb_find_next_zero_bit 3-0-2 13100 NULL ++ttm_dma_pool_alloc_new_pages_13105 ttm_dma_pool_alloc_new_pages 3 13105 NULL ++bma180_set_new_data_intr_state_13106 bma180_set_new_data_intr_state 0 13106 NULL ++ubi_leb_map_13107 ubi_leb_map 0 13107 NULL ++SyS_msgrcv_13109 SyS_msgrcv 3 13109 NULL ++snd_rme96_playback_copy_13111 snd_rme96_playback_copy 5 13111 NULL ++pyra_send_control_13112 pyra_send_control 0 13112 NULL nohasharray ++snd_pcm_lib_preallocate_pages_for_all_13112 snd_pcm_lib_preallocate_pages_for_all 4 13112 &pyra_send_control_13112 ++ltc4215_show_power_13117 ltc4215_show_power 0 13117 NULL ++bfad_debugfs_read_13119 bfad_debugfs_read 3-0 13119 NULL ++relay_file_read_13123 relay_file_read 0-3 13123 NULL nohasharray ++qla2x00_sysfs_write_reset_13123 qla2x00_sysfs_write_reset 0-6-5 13123 &relay_file_read_13123 ++read_13125 read 0-5 13125 NULL ++tlclk_read_13128 tlclk_read 0-3 13128 NULL ++ip_make_skb_13129 ip_make_skb 5-6 13129 NULL ++ipath_do_user_init_13142 ipath_do_user_init 0 13142 NULL nohasharray ++kone_sysfs_set_startup_profile_13142 kone_sysfs_set_startup_profile 0-4 13142 &ipath_do_user_init_13142 ++mei_hbm_cl_write_13143 mei_hbm_cl_write 0 13143 NULL ++blk_update_request_13146 blk_update_request 3 13146 NULL ++erst_reader_13156 erst_reader 0 13156 NULL ++nes_net_event_13163 nes_net_event 0 13163 NULL ++hpfs_write_begin_13164 hpfs_write_begin 0-3 13164 NULL nohasharray ++kmem_cache_shrink_13164 kmem_cache_shrink 0 13164 &hpfs_write_begin_13164 ++cifs_loose_read_iter_13165 cifs_loose_read_iter 0 13165 NULL ++diva_um_idi_write_13170 diva_um_idi_write 0 13170 NULL ++caif_stream_recvmsg_13173 caif_stream_recvmsg 0-4 13173 NULL ++ea_set_i_13174 ea_set_i 0 13174 NULL nohasharray ++iscsi_tpg_param_store_MaxXmitDataSegmentLength_13174 iscsi_tpg_param_store_MaxXmitDataSegmentLength 0-3 13174 &ea_set_i_13174 ++pwr_disable_ps_read_13176 pwr_disable_ps_read 3-0 13176 NULL ++ucs2_strlen_13178 ucs2_strlen 0 13178 NULL ++isl29003_store_mode_13181 isl29003_store_mode 0-4 13181 NULL ++adis16136_get_freq_13183 adis16136_get_freq 0 13183 NULL nohasharray ++macvlan_init_13183 macvlan_init 0 13183 &adis16136_get_freq_13183 ++bql_show_limit_max_13184 bql_show_limit_max 0 13184 NULL nohasharray ++create_trace_uprobe_13184 create_trace_uprobe 1 13184 &bql_show_limit_max_13184 ++dvb_ca_read_13187 dvb_ca_read 0-3 13187 NULL ++sr_get_eeprom_len_13190 sr_get_eeprom_len 0 13190 NULL ++ar5523_start_13193 ar5523_start 0 13193 NULL ++show_session_param_ISCSI_PARAM_PASSWORD_13197 show_session_param_ISCSI_PARAM_PASSWORD 0 13197 NULL nohasharray ++amd64_inject_section_store_13197 amd64_inject_section_store 0-4 13197 &show_session_param_ISCSI_PARAM_PASSWORD_13197 ++rt61pci_set_state_13199 rt61pci_set_state 0 13199 NULL nohasharray ++ax88179_get_eeprom_len_13199 ax88179_get_eeprom_len 0 13199 &rt61pci_set_state_13199 nohasharray ++comedi_read_13199 comedi_read 3 13199 &ax88179_get_eeprom_len_13199 ++set_tach_13200 set_tach 0-4 13200 NULL ++hash_ipport4_expire_13201 hash_ipport4_expire 4 13201 NULL nohasharray ++sync_min_show_13201 sync_min_show 0 13201 &hash_ipport4_expire_13201 ++mem_cgroup_try_charge_13202 mem_cgroup_try_charge 0 13202 NULL ++ilk_pipe_crc_ctl_reg_13204 ilk_pipe_crc_ctl_reg 0 13204 NULL ++mmc_ext_csd_read_13205 mmc_ext_csd_read 3-0 13205 NULL ++nfs_sync_mapping_13207 nfs_sync_mapping 0 13207 NULL ++bitmap_parselist_13211 bitmap_parselist 0 13211 NULL ++__nodes_fold_13215 __nodes_fold 4 13215 NULL ++lp3972_dcdc_enable_13217 lp3972_dcdc_enable 0 13217 NULL ++get_unaligned_le64_13219 get_unaligned_le64 0 13219 NULL ++svm_msrpm_offset_13220 svm_msrpm_offset 0-1 13220 NULL ++set_vrm_13222 set_vrm 0-4 13222 NULL ++fnic_trace_ctrl_write_13229 fnic_trace_ctrl_write 3-0 13229 NULL ++arcmsr_sysfs_iop_message_clear_13239 arcmsr_sysfs_iop_message_clear 0-6-5 13239 NULL ++_iwl_dbgfs_disable_power_off_write_13243 _iwl_dbgfs_disable_power_off_write 3-0 13243 NULL ++soft_show_13244 soft_show 0 13244 NULL ++asix_read_cmd_13245 asix_read_cmd 5 13245 NULL ++nilfs_superblock_attr_show_13246 nilfs_superblock_attr_show 0 13246 NULL nohasharray ++ath5k_hw_rfregs_init_13246 ath5k_hw_rfregs_init 0 13246 &nilfs_superblock_attr_show_13246 ++ov9640_prog_dflt_13247 ov9640_prog_dflt 0 13247 NULL ++snd_emu10k1_fx8010_tram_setup_13248 snd_emu10k1_fx8010_tram_setup 2 13248 NULL ++store_13249 store 0 13249 NULL nohasharray ++fw_download_code_13249 fw_download_code 3 13249 &store_13249 ++__show_chan_per_port_13250 __show_chan_per_port 0 13250 NULL ++clps711x_pwm_enable_13251 clps711x_pwm_enable 0 13251 NULL ++init_tid_tabs_13252 init_tid_tabs 4-3-2 13252 NULL nohasharray ++cpu_rt_runtime_write_13252 cpu_rt_runtime_write 0 13252 &init_tid_tabs_13252 ++hostap_80211_get_hdrlen_13255 hostap_80211_get_hdrlen 0 13255 NULL ++bio_integrity_trim_13259 bio_integrity_trim 3-2 13259 NULL ++simple_attr_write_13260 simple_attr_write 3-0 13260 NULL ++carl9170_rx_13272 carl9170_rx 3 13272 NULL ++pmcraid_notify_aen_13274 pmcraid_notify_aen 3 13274 NULL ++nvkm_ltc_create__13275 nvkm_ltc_create_ 4 13275 NULL ++ip_vs_local_reply6_13278 ip_vs_local_reply6 0 13278 NULL ++il4965_stats_flag_13281 il4965_stats_flag 0-3 13281 NULL ++lpfc_idiag_mbxacc_get_setup_13282 lpfc_idiag_mbxacc_get_setup 0 13282 NULL ++lpfc_vport_disable_13286 lpfc_vport_disable 0 13286 NULL ++platform_device_add_resources_13289 platform_device_add_resources 3 13289 NULL ++nvkm_i2c_pad_create__13292 nvkm_i2c_pad_create_ 5 13292 NULL ++sd_major_13294 sd_major 0-1 13294 NULL ++cx23885_start_audio_dma_13295 cx23885_start_audio_dma 0 13295 NULL ++map_offset_show_13301 map_offset_show 0 13301 NULL ++set_ptk_13304 set_ptk 0 13304 NULL ++store_13310 store 0 13310 NULL ++saa7134_s_ctrl_13313 saa7134_s_ctrl 0 13313 NULL ++read_file_phy_err_13318 read_file_phy_err 3-0 13318 NULL nohasharray ++shmem_getxattr_13318 shmem_getxattr 0 13318 &read_file_phy_err_13318 ++max16065_show_current_13327 max16065_show_current 0 13327 NULL ++koneplus_sysfs_read_tcu_13330 koneplus_sysfs_read_tcu 0-5-6 13330 NULL nohasharray ++us122l_ctl_msg_13330 us122l_ctl_msg 8 13330 &koneplus_sysfs_read_tcu_13330 ++i2c_sysfs_delete_device_13331 i2c_sysfs_delete_device 0-4 13331 NULL ++connect_layer1_13336 connect_layer1 0 13336 NULL ++kvm_read_nested_guest_page_13337 kvm_read_nested_guest_page 5 13337 NULL ++round_event_name_len_13348 round_event_name_len 0 13348 NULL ++dlm_event_store_13352 dlm_event_store 0-3 13352 NULL ++get_bits_13353 get_bits 0-2 13353 NULL ++az6007_i2c_xfer_13357 az6007_i2c_xfer 0-3 13357 NULL ++ths7303_setval_13360 ths7303_setval 0 13360 NULL nohasharray ++hscx_empty_fifo_13360 hscx_empty_fifo 2 13360 &ths7303_setval_13360 ++caif_device_notify_13363 caif_device_notify 0 13363 NULL ++cache_ctr_13364 cache_ctr 2 13364 NULL nohasharray ++xfs_btree_delrec_13364 xfs_btree_delrec 0 13364 &cache_ctr_13364 ++snd_via686_capture_prepare_13373 snd_via686_capture_prepare 0 13373 NULL ++hr222_sub_set_clock_13374 hr222_sub_set_clock 0 13374 NULL ++wep_key_not_found_read_13377 wep_key_not_found_read 3-0 13377 NULL nohasharray ++iso_sched_alloc_13377 iso_sched_alloc 1 13377 &wep_key_not_found_read_13377 ++iio_buffer_read_first_n_outer_13378 iio_buffer_read_first_n_outer 0-3 13378 NULL ++sctp_wait_for_connect_13379 sctp_wait_for_connect 0 13379 NULL ++zl10036_set_params_13381 zl10036_set_params 0 13381 NULL ++activity_write_13388 activity_write 0-6-5 13388 NULL nohasharray ++lov_mds_md_size_13388 lov_mds_md_size 0-1 13388 &activity_write_13388 ++i7core_inject_section_show_13394 i7core_inject_section_show 0 13394 NULL ++vmxnet3_set_mac_addr_13396 vmxnet3_set_mac_addr 0 13396 NULL ++as3935_sensor_sensitivity_store_13401 as3935_sensor_sensitivity_store 0-4 13401 NULL ++tm6000_prepare_isoc_13404 tm6000_prepare_isoc 0 13404 NULL ++ieee80211_check_concurrent_iface_13405 ieee80211_check_concurrent_iface 0 13405 NULL nohasharray ++carl9170_rx_untie_data_13405 carl9170_rx_untie_data 3 13405 &ieee80211_check_concurrent_iface_13405 ++sky2_receive_13407 sky2_receive 2 13407 NULL ++ocfs2_inode_lock_update_13414 ocfs2_inode_lock_update 0 13414 NULL nohasharray ++qib_sdma_get_inflight_13414 qib_sdma_get_inflight 0 13414 &ocfs2_inode_lock_update_13414 ++store_flush_13416 store_flush 0 13416 NULL ++netxen_alloc_sds_rings_13417 netxen_alloc_sds_rings 2 13417 NULL ++compat_SyS_sendfile64_13420 compat_SyS_sendfile64 4 13420 NULL ++show_multicast_fast_leave_13427 show_multicast_fast_leave 0 13427 NULL ++bq2415x_exec_command_13430 bq2415x_exec_command 0 13430 NULL ++smb_sendv_13437 smb_sendv 0 13437 NULL ++mwifiex_get_bss_info_13439 mwifiex_get_bss_info 0 13439 NULL nohasharray ++request_firmware_nowait_13439 request_firmware_nowait 0 13439 &mwifiex_get_bss_info_13439 ++sctp_setsockopt_peer_primary_addr_13440 sctp_setsockopt_peer_primary_addr 3-0 13440 NULL ++ath6kl_cfg80211_connect_event_13443 ath6kl_cfg80211_connect_event 7-8-9 13443 NULL ++close_patch_13445 close_patch 0 13445 NULL ++ath10k_wmi_vdev_spectral_enable_13446 ath10k_wmi_vdev_spectral_enable 0 13446 NULL ++lanai_get_sized_buffer_13448 lanai_get_sized_buffer 0 13448 NULL ++acpi_thermal_get_temperature_13461 acpi_thermal_get_temperature 0 13461 NULL ++cxacru_sysfs_showattr_LINE_13464 cxacru_sysfs_showattr_LINE 0 13464 NULL nohasharray ++igb_notify_dca_13464 igb_notify_dca 0 13464 &cxacru_sysfs_showattr_LINE_13464 nohasharray ++__kgdb_notify_13464 __kgdb_notify 0 13464 &igb_notify_dca_13464 ++nfs4_set_security_label_13465 nfs4_set_security_label 0 13465 NULL ++musb_mode_store_13466 musb_mode_store 0-4 13466 NULL ++xen_unmap_single_13468 xen_unmap_single 2 13468 NULL ++target_freq_show_13471 target_freq_show 0 13471 NULL ++rtc_dev_read_13472 rtc_dev_read 0-3 13472 NULL ++iscsi_post_host_event_13473 iscsi_post_host_event 4 13473 NULL ++show_13475 show 0 13475 NULL nohasharray ++asm_did_show_13475 asm_did_show 0 13475 &show_13475 ++get_temp_13476 get_temp 0 13476 NULL ++sm_lid_show_13478 sm_lid_show 0 13478 NULL ++sb_init_dio_done_wq_13482 sb_init_dio_done_wq 0 13482 NULL ++l3_access_valid_13483 l3_access_valid 0 13483 NULL ++amd8111e_open_13487 amd8111e_open 0 13487 NULL ++write_13490 write 0 13490 NULL ++data_read_13494 data_read 3-0 13494 NULL nohasharray ++qib_write_umem32_13494 qib_write_umem32 0 13494 &data_read_13494 nohasharray ++ext_prop_data_store_13494 ext_prop_data_store 0-3 13494 &qib_write_umem32_13494 ++brcmf_sdiod_ramrw_13500 brcmf_sdiod_ramrw 5 13500 NULL ++queue_nomerges_show_13504 queue_nomerges_show 0 13504 NULL nohasharray ++__cpu_notify_13504 __cpu_notify 0 13504 &queue_nomerges_show_13504 ++rndis_filter_set_device_mac_13505 rndis_filter_set_device_mac 0 13505 NULL ++nfs3_proc_setattr_13506 nfs3_proc_setattr 0 13506 NULL ++core_status_13515 core_status 4-0 13515 NULL nohasharray ++send_cmd_13515 send_cmd 0 13515 &core_status_13515 ++bonding_show_ad_partner_key_13516 bonding_show_ad_partner_key 0 13516 NULL ++show_dock_type_13518 show_dock_type 0 13518 NULL ++smk_write_mapped_13519 smk_write_mapped 3-0 13519 NULL ++max_comp_streams_show_13525 max_comp_streams_show 0 13525 NULL ++bm_init_13529 bm_init 2 13529 NULL ++ocfs2_setattr_13530 ocfs2_setattr 0 13530 NULL nohasharray ++request_any_context_irq_13530 request_any_context_irq 0 13530 &ocfs2_setattr_13530 ++cx23885_load_firmware_13534 cx23885_load_firmware 0 13534 NULL ++get_enclosure_identifier_13536 get_enclosure_identifier 0 13536 NULL nohasharray ++wcn36xx_smd_start_13536 wcn36xx_smd_start 0 13536 &get_enclosure_identifier_13536 ++sync_completed_show_13540 sync_completed_show 0 13540 NULL ++venus_access_13541 venus_access 0 13541 NULL ++arizona_micsupp_enable_13545 arizona_micsupp_enable 0 13545 NULL ++key_getsecurity_13546 key_getsecurity 0 13546 NULL ++vfio_cap_len_13549 vfio_cap_len 0 13549 NULL nohasharray ++do_set_fan_pulses_13549 do_set_fan_pulses 0 13549 &vfio_cap_len_13549 ++adp5520_bl_daylight_dim_show_13550 adp5520_bl_daylight_dim_show 0 13550 NULL nohasharray ++__iscsi_nacl_auth_show_authenticate_target_13550 __iscsi_nacl_auth_show_authenticate_target 0 13550 &adp5520_bl_daylight_dim_show_13550 ++hp100_open_13551 hp100_open 0 13551 NULL ++__rpm_callback_13552 __rpm_callback 0 13552 NULL ++i7core_inject_eccmask_store_13555 i7core_inject_eccmask_store 0-4 13555 NULL ++llcp_sock_recvmsg_13556 llcp_sock_recvmsg 0-4 13556 NULL nohasharray ++migrate_page_move_mapping_13556 migrate_page_move_mapping 0 13556 &llcp_sock_recvmsg_13556 ++ieee80211_if_read_ap_power_level_13558 ieee80211_if_read_ap_power_level 3-0 13558 NULL ++hash_net4_expire_13559 hash_net4_expire 4 13559 NULL ++usb_hcd_link_urb_to_ep_13560 usb_hcd_link_urb_to_ep 0 13560 NULL nohasharray ++setsockopt_13560 setsockopt 0 13560 &usb_hcd_link_urb_to_ep_13560 ++nfs4_schedule_migration_recovery_13561 nfs4_schedule_migration_recovery 0 13561 NULL ++smack_setprocattr_13564 smack_setprocattr 0-4 13564 NULL ++snd_cmipci_playback_prepare_13566 snd_cmipci_playback_prepare 0 13566 NULL ++alx_alloc_rings_13567 alx_alloc_rings 0 13567 NULL ++ath10k_spectral_scan_trigger_13573 ath10k_spectral_scan_trigger 0 13573 NULL ++read_file_antenna_13574 read_file_antenna 3-0 13574 NULL ++__iscsi_disc_store_password_13575 __iscsi_disc_store_password 0-3 13575 NULL ++ci_role_start_13579 ci_role_start 0 13579 NULL ++target_stat_scsi_tgt_port_show_attr_name_13585 target_stat_scsi_tgt_port_show_attr_name 0 13585 NULL ++driver_override_store_13588 driver_override_store 0-4 13588 NULL ++cache_write_13589 cache_write 3-0 13589 NULL nohasharray ++gt_rp_mhz_show_13589 gt_rp_mhz_show 0 13589 &cache_write_13589 ++make_rate_with_tolerance_13592 make_rate_with_tolerance 0 13592 NULL nohasharray ++mpt_lan_receive_post_turbo_13592 mpt_lan_receive_post_turbo 2 13592 &make_rate_with_tolerance_13592 ++niu_set_primary_mac_rdc_table_13593 niu_set_primary_mac_rdc_table 0 13593 NULL nohasharray ++srp_add_target_13593 srp_add_target 0 13593 &niu_set_primary_mac_rdc_table_13593 ++aac_sa_ioremap_13596 aac_sa_ioremap 2 13596 NULL nohasharray ++irias_new_octseq_value_13596 irias_new_octseq_value 2 13596 &aac_sa_ioremap_13596 ++i40e_change_mtu_13598 i40e_change_mtu 0 13598 NULL ++hdlc_change_mtu_13603 hdlc_change_mtu 0 13603 NULL ++twl_rtc_read_time_13605 twl_rtc_read_time 0 13605 NULL ++exofs_setattr_13607 exofs_setattr 0 13607 NULL ++adis_write_reg_16_13608 adis_write_reg_16 0 13608 NULL ++matroxfb_set_par_13610 matroxfb_set_par 0 13610 NULL ++wl1271_init_ap_rates_13613 wl1271_init_ap_rates 0 13613 NULL ++swap_cgroup_swapon_13614 swap_cgroup_swapon 2 13614 NULL ++wm8994_bulk_write_13615 wm8994_bulk_write 2-3 13615 NULL nohasharray ++ov7670_write_smbus_13615 ov7670_write_smbus 0 13615 &wm8994_bulk_write_13615 ++__ntfs_grab_cache_pages_13617 __ntfs_grab_cache_pages 0 13617 NULL ++pmcraid_get_minor_13619 pmcraid_get_minor 0 13619 NULL ++atl1_get_regs_len_13624 atl1_get_regs_len 0 13624 NULL ++iio_device_add_event_sysfs_13627 iio_device_add_event_sysfs 0 13627 NULL ++tpm_stm_i2c_recv_13629 tpm_stm_i2c_recv 0-3 13629 NULL ++i7core_inject_store_dimm_13633 i7core_inject_store_dimm 0-4 13633 NULL ++packet_snd_13634 packet_snd 0-3 13634 NULL nohasharray ++ocfs2_get_clusters_nocache_13634 ocfs2_get_clusters_nocache 0 13634 &packet_snd_13634 nohasharray ++subsystem_id_store_13634 subsystem_id_store 0-4 13634 &ocfs2_get_clusters_nocache_13634 ++decode_lanman_negprot_rsp_13636 decode_lanman_negprot_rsp 0 13636 NULL nohasharray ++__qbuf_userptr_13636 __qbuf_userptr 0 13636 &decode_lanman_negprot_rsp_13636 nohasharray ++adt7310_spi_write_word_13636 adt7310_spi_write_word 0 13636 &__qbuf_userptr_13636 ++vprbrd_i2c_addr_13639 vprbrd_i2c_addr 0 13639 NULL nohasharray ++via_gpio_dir_input_13639 via_gpio_dir_input 0 13639 &vprbrd_i2c_addr_13639 ++ltc4222_show_bool_13640 ltc4222_show_bool 0 13640 NULL ++nilfs_superblock_sb_write_count_show_13641 nilfs_superblock_sb_write_count_show 0 13641 NULL ++period_to_str_13642 period_to_str 0 13642 NULL ++atkbd_show_err_count_13644 atkbd_show_err_count 0 13644 NULL ++blk_msg_write_13655 blk_msg_write 3 13655 NULL ++__hfsplus_ext_write_extent_13656 __hfsplus_ext_write_extent 0 13656 NULL ++crypto_ahash_init_13658 crypto_ahash_init 0 13658 NULL ++generic_listxattr_13665 generic_listxattr 0-3 13665 NULL ++cache_downcall_13666 cache_downcall 3-0 13666 NULL ++nes_store_idx_addr_13673 nes_store_idx_addr 0-3 13673 NULL ++show_ipOutForwDatagrams_13674 show_ipOutForwDatagrams 0 13674 NULL ++omap_hsmmc_show_slot_name_13675 omap_hsmmc_show_slot_name 0 13675 NULL ++dvb_usb_generic_rw_13681 dvb_usb_generic_rw 0 13681 NULL nohasharray ++acpi_suspend_lowlevel_13681 acpi_suspend_lowlevel 0 13681 &dvb_usb_generic_rw_13681 ++ext3_xattr_list_entries_13682 ext3_xattr_list_entries 0 13682 NULL nohasharray ++__iscsi_disc_store_userid_13682 __iscsi_disc_store_userid 0-3 13682 &ext3_xattr_list_entries_13682 ++show_fnode_discovery_logout_13684 show_fnode_discovery_logout 0 13684 NULL nohasharray ++wl1271_acx_init_rx_interrupt_13684 wl1271_acx_init_rx_interrupt 0 13684 &show_fnode_discovery_logout_13684 ++devcd_data_write_13685 devcd_data_write 0-6-5 13685 NULL ++max8997_bulk_read_13688 max8997_bulk_read 0 13688 NULL nohasharray ++fuse_copy_pages_13688 fuse_copy_pages 0 13688 &max8997_bulk_read_13688 ++check_intr_schedule_13691 check_intr_schedule 0 13691 NULL nohasharray ++gadget_dev_desc_bcdUSB_store_13691 gadget_dev_desc_bcdUSB_store 0-3 13691 &check_intr_schedule_13691 nohasharray ++uevent_helper_store_13691 uevent_helper_store 0-4 13691 &gadget_dev_desc_bcdUSB_store_13691 ++usb_get_string_13693 usb_get_string 0 13693 NULL ++patch_vt2002P_13697 patch_vt2002P 0 13697 NULL ++ntc_show_name_13704 ntc_show_name 0 13704 NULL nohasharray ++store_engine3_mode_13704 store_engine3_mode 0-4 13704 &ntc_show_name_13704 nohasharray ++fw_iso_buffer_alloc_13704 fw_iso_buffer_alloc 2 13704 &store_engine3_mode_13704 ++gprs_attach_13708 gprs_attach 0 13708 NULL ++osst_space_over_filemarks_forward_slow_13711 osst_space_over_filemarks_forward_slow 0 13711 NULL nohasharray ++qlcnic_store_diag_mode_13711 qlcnic_store_diag_mode 0-4 13711 &osst_space_over_filemarks_forward_slow_13711 ++nilfs_btree_convert_and_insert_13712 nilfs_btree_convert_and_insert 0 13712 NULL ++manf_id_show_13718 manf_id_show 0 13718 NULL ++wm97xx_bat_get_property_13719 wm97xx_bat_get_property 0 13719 NULL ++store_reconnect_delay_13720 store_reconnect_delay 0-4 13720 NULL ++get_codec_name_13721 get_codec_name 0 13721 NULL ++usnic_ib_show_iface_13726 usnic_ib_show_iface 0 13726 NULL ++mcs_set_reg_13730 mcs_set_reg 0 13730 NULL ++cifs_call_async_13731 cifs_call_async 0 13731 NULL ++dsbr100_setfreq_13739 dsbr100_setfreq 0 13739 NULL nohasharray ++cfg80211_testmode_alloc_event_skb_13739 cfg80211_testmode_alloc_event_skb 2 13739 &dsbr100_setfreq_13739 ++ql_wait_reg_rdy_13741 ql_wait_reg_rdy 0 13741 NULL ++audit_unpack_string_13748 audit_unpack_string 3 13748 NULL ++ufs_dtog_13750 ufs_dtog 0-2 13750 NULL ++lbmLogInit_13756 lbmLogInit 0 13756 NULL ++netprio_set_prio_13758 netprio_set_prio 0 13758 NULL ++lpfc_fwrev_show_13760 lpfc_fwrev_show 0 13760 NULL ++udf_direct_IO_13765 udf_direct_IO 4-0 13765 NULL ++bd2802_store_reg0x0d_13766 bd2802_store_reg0x0d 0-4 13766 NULL ++raid10_add_disk_13776 raid10_add_disk 0 13776 NULL ++fb_sys_read_13778 fb_sys_read 3 13778 NULL ++edac_device_ctl_panic_on_ue_show_13780 edac_device_ctl_panic_on_ue_show 0 13780 NULL ++qib_setup_sdma_13784 qib_setup_sdma 0 13784 NULL ++roccat_common2_sysfs_read_sensor_13788 roccat_common2_sysfs_read_sensor 0-5-6 13788 NULL ++sysfs_do_cmd_13790 sysfs_do_cmd 0-4 13790 NULL ++ath6kl_mgmt_powersave_ap_13791 ath6kl_mgmt_powersave_ap 6 13791 NULL ++mlx4_cq_modify_13796 mlx4_cq_modify 0 13796 NULL ++migrate_pages_13797 migrate_pages 0 13797 NULL ++cpu_down_13801 cpu_down 0 13801 NULL ++fbcon_unbind_13802 fbcon_unbind 0 13802 NULL ++cpu_callback_13812 cpu_callback 0 13812 NULL nohasharray ++e100_rx_alloc_list_13812 e100_rx_alloc_list 0 13812 &cpu_callback_13812 ++random_read_13815 random_read 3-0 13815 NULL nohasharray ++__uncore_inv_show_13815 __uncore_inv_show 0 13815 &random_read_13815 nohasharray ++x86_acpi_suspend_lowlevel_13815 x86_acpi_suspend_lowlevel 0 13815 &__uncore_inv_show_13815 ++gfs2_xattr_remove_13816 gfs2_xattr_remove 0 13816 NULL ++mutex_lock_interruptible_nested_13817 mutex_lock_interruptible_nested 0 13817 NULL ++wl18xx_boot_soft_reset_13819 wl18xx_boot_soft_reset 0 13819 NULL nohasharray ++bnx2_reset_nic_13819 bnx2_reset_nic 0 13819 &wl18xx_boot_soft_reset_13819 ++hsi_register_board_info_13820 hsi_register_board_info 2 13820 NULL ++___mei_cl_send_13821 ___mei_cl_send 3 13821 NULL ++iwl_mvm_add_aux_sta_13827 iwl_mvm_add_aux_sta 0 13827 NULL ++queue_bulk_on_old_endpoint_13828 queue_bulk_on_old_endpoint 0 13828 NULL nohasharray ++__uncore_filter_opc2_show_13828 __uncore_filter_opc2_show 0 13828 &queue_bulk_on_old_endpoint_13828 ++netxen_sysfs_read_mem_13830 netxen_sysfs_read_mem 0-6-5 13830 NULL ++qce_ahash_hmac_setkey_13837 qce_ahash_hmac_setkey 3 13837 NULL ++hwrng_attr_available_show_13843 hwrng_attr_available_show 0 13843 NULL ++acknak_13844 acknak 0 13844 NULL nohasharray ++set_mac_and_bssid_13844 set_mac_and_bssid 0 13844 &acknak_13844 nohasharray ++bdx_fw_load_13844 bdx_fw_load 0 13844 &set_mac_and_bssid_13844 ++nf_nat_setup_info_13845 nf_nat_setup_info 0 13845 NULL nohasharray ++cpufv_store_13845 cpufv_store 0-4 13845 &nf_nat_setup_info_13845 ++snd_bt87x_trigger_13849 snd_bt87x_trigger 0 13849 NULL ++lm95234_read_temp_13850 lm95234_read_temp 0 13850 NULL ++evdev_ioctl_compat_13851 evdev_ioctl_compat 2 13851 NULL ++c2port_poll_out_ready_13852 c2port_poll_out_ready 0 13852 NULL ++vendor_name_store_13862 vendor_name_store 0-4 13862 NULL ++ath10k_wmi_vdev_install_key_13866 ath10k_wmi_vdev_install_key 0 13866 NULL ++lmc_open_13868 lmc_open 0 13868 NULL ++compat_ip_setsockopt_13870 compat_ip_setsockopt 5 13870 NULL ++jfs_listxattr_13871 jfs_listxattr 0-3 13871 NULL ++esas2r_read_vda_13876 esas2r_read_vda 0-3-4 13876 NULL ++speed_show_13879 speed_show 0 13879 NULL ++ad9523_read_13881 ad9523_read 0 13881 NULL ++cpuaffinity_show_13883 cpuaffinity_show 0 13883 NULL ++regmap_spi_async_write_13884 regmap_spi_async_write 0 13884 NULL ++qp_memcpy_to_queue_13886 qp_memcpy_to_queue 5-2 13886 NULL nohasharray ++__fsnotify_parent_13886 __fsnotify_parent 0 13886 &qp_memcpy_to_queue_13886 ++i2c_check_for_device_13887 i2c_check_for_device 0 13887 NULL ++recv_13888 recv 0-3 13888 NULL ++t4_enable_vi_params_13889 t4_enable_vi_params 0 13889 NULL ++get_amixer_13890 get_amixer 0 13890 NULL ++l2cap_sock_create_13894 l2cap_sock_create 0 13894 NULL ++__uncore_set_flag_sel_show_13898 __uncore_set_flag_sel_show 0 13898 NULL ++get_wireless_state_13899 get_wireless_state 0 13899 NULL ++snd_pcm_aio_read_13900 snd_pcm_aio_read 3-0 13900 NULL ++snd_seq_fifo_resize_13901 snd_seq_fifo_resize 0 13901 NULL ++nilfs_bmap_do_truncate_13904 nilfs_bmap_do_truncate 0 13904 NULL ++xfs_dir3_data_init_13911 xfs_dir3_data_init 0 13911 NULL ++f81232_open_13915 f81232_open 0 13915 NULL ++st_sensors_match_odr_13928 st_sensors_match_odr 0 13928 NULL ++ext3_xattr_block_get_13936 ext3_xattr_block_get 0 13936 NULL ++sdev_show_evt_capacity_change_reported_13938 sdev_show_evt_capacity_change_reported 0 13938 NULL nohasharray ++read_packet_data_13938 read_packet_data 0-3-2 13938 &sdev_show_evt_capacity_change_reported_13938 nohasharray ++ath10k_clear_peer_keys_13938 ath10k_clear_peer_keys 0 13938 &read_packet_data_13938 nohasharray ++drbd_send_drequest_csum_13938 drbd_send_drequest_csum 5 13938 &ath10k_clear_peer_keys_13938 ++b43_gpio_init_13939 b43_gpio_init 0 13939 NULL ++ieee80211_if_read_dot11MeshForwarding_13940 ieee80211_if_read_dot11MeshForwarding 3-0 13940 NULL ++iwl_dbgfs_protection_mode_read_13943 iwl_dbgfs_protection_mode_read 3-0 13943 NULL ++da9052_bat_check_presence_13945 da9052_bat_check_presence 0 13945 NULL ++ieee80211_if_read_min_discovery_timeout_13946 ieee80211_if_read_min_discovery_timeout 3-0 13946 NULL ++lpfc_idiag_queacc_read_13950 lpfc_idiag_queacc_read 3-0 13950 NULL nohasharray ++pagecache_write_end_13950 pagecache_write_end 0-5 13950 &lpfc_idiag_queacc_read_13950 ++aa_path_name_13951 aa_path_name 0 13951 NULL nohasharray ++serial_in_13951 serial_in 0 13951 &aa_path_name_13951 ++osc_grant_shrink_interval_seq_write_13952 osc_grant_shrink_interval_seq_write 3 13952 NULL ++hsr_dev_change_mtu_13954 hsr_dev_change_mtu 0 13954 NULL ++audit_caps_13958 audit_caps 3-0 13958 NULL ++sr_write_13961 sr_write 3 13961 NULL ++snd_pcm_plug_slave_size_13967 snd_pcm_plug_slave_size 0-2 13967 NULL nohasharray ++ds2781_set_sense_register_13967 ds2781_set_sense_register 0 13967 &snd_pcm_plug_slave_size_13967 ++ext2_nobh_writepage_13969 ext2_nobh_writepage 0 13969 NULL ++com90xx_found_13974 com90xx_found 3 13974 NULL ++adapter_start_13979 adapter_start 0 13979 NULL nohasharray ++smsc_phy_config_init_13979 smsc_phy_config_init 0 13979 &adapter_start_13979 ++dsp_read_13980 dsp_read 0-2 13980 NULL ++dvb_demux_read_13981 dvb_demux_read 3-0 13981 NULL nohasharray ++func_13981 func 0 13981 &dvb_demux_read_13981 ++os_desc_qw_sign_show_13982 os_desc_qw_sign_show 0 13982 NULL ++mon_notify_13986 mon_notify 0 13986 NULL ++rbd_image_id_show_13990 rbd_image_id_show 0 13990 NULL nohasharray ++state_read_13990 state_read 0-5-6 13990 &rbd_image_id_show_13990 ++reiserfs_readpage_13996 reiserfs_readpage 0 13996 NULL ++stream_pause_release_13997 stream_pause_release 0 13997 NULL ++show_temp_target_14001 show_temp_target 0 14001 NULL nohasharray ++iscsi_tpg_attrib_store_prod_mode_write_protect_14001 iscsi_tpg_attrib_store_prod_mode_write_protect 0-3 14001 &show_temp_target_14001 ++cpu_partial_show_14002 cpu_partial_show 0 14002 NULL nohasharray ++rsbtbl_size_read_14002 rsbtbl_size_read 0 14002 &cpu_partial_show_14002 ++dvb_ca_en50221_io_read_14003 dvb_ca_en50221_io_read 0-3 14003 NULL ++ext2_xattr_trusted_get_14006 ext2_xattr_trusted_get 0 14006 NULL ++rbd_dev_v2_features_14011 rbd_dev_v2_features 0 14011 NULL ++via_rng_data_read_14012 via_rng_data_read 0 14012 NULL ++fib_rules_event_14013 fib_rules_event 0 14013 NULL ++sddr09_write_data_14014 sddr09_write_data 3 14014 NULL ++ext4_journal_force_commit_14015 ext4_journal_force_commit 0 14015 NULL ++btrfs_get_blocks_direct_14016 btrfs_get_blocks_direct 2 14016 NULL ++dmi_format_ids_14018 dmi_format_ids 2 14018 NULL nohasharray ++patch_cmi9880_14018 patch_cmi9880 0 14018 &dmi_format_ids_14018 ++gpio_active_low_store_14019 gpio_active_low_store 0-4 14019 NULL ++ceph_vxattrcb_dir_rsubdirs_14021 ceph_vxattrcb_dir_rsubdirs 0 14021 NULL nohasharray ++devm_kmalloc_array_14021 devm_kmalloc_array 3-2 14021 &ceph_vxattrcb_dir_rsubdirs_14021 nohasharray ++_rtl92s_firmware_downloadcode_14021 _rtl92s_firmware_downloadcode 3 14021 &devm_kmalloc_array_14021 ++iscsi_create_flashnode_conn_14022 iscsi_create_flashnode_conn 4 14022 NULL ++cs42l56_beep_set_14023 cs42l56_beep_set 0-4 14023 NULL ++cifs_user_readv_14027 cifs_user_readv 0 14027 NULL ++adp8870_bl_l3_office_max_store_14028 adp8870_bl_l3_office_max_store 4-0 14028 NULL ++pci_add_ext_cap_save_buffer_14032 pci_add_ext_cap_save_buffer 3 14032 NULL ++pcf8563_write_block_data_14033 pcf8563_write_block_data 0 14033 NULL ++dvb_usercopy_14036 dvb_usercopy 2 14036 NULL ++acpi_gbl_exception_handler_14044 acpi_gbl_exception_handler 0 14044 NULL nohasharray ++xfs_bmap_alloc_14044 xfs_bmap_alloc 0 14044 &acpi_gbl_exception_handler_14044 ++generic_hdmi_init_14045 generic_hdmi_init 0 14045 NULL ++read_14049 read 0 14049 NULL ++vim2m_s_ctrl_14051 vim2m_s_ctrl 0 14051 NULL nohasharray ++iscsi_tpg_attrib_show_authentication_14051 iscsi_tpg_attrib_show_authentication 0 14051 &vim2m_s_ctrl_14051 ++target_fabric_mappedlun_show_write_protect_14053 target_fabric_mappedlun_show_write_protect 0 14053 NULL ++ieee80211_if_fmt_aid_14055 ieee80211_if_fmt_aid 3 14055 NULL ++__wait_latch_14057 __wait_latch 0 14057 NULL ++sta_agg_status_read_14058 sta_agg_status_read 3-0 14058 NULL ++ath9k_htc_start_14061 ath9k_htc_start 0 14061 NULL ++inode_need_killpriv_14062 inode_need_killpriv 0 14062 NULL ++show_pan_14065 show_pan 0 14065 NULL ++_nfs4_proc_statfs_14066 _nfs4_proc_statfs 0 14066 NULL ++pci_conf1_read_14075 pci_conf1_read 0 14075 NULL ++lov_stripeoffset_seq_write_14078 lov_stripeoffset_seq_write 3 14078 NULL ++_cx88_stop_audio_dma_14079 _cx88_stop_audio_dma 0 14079 NULL nohasharray ++cp_tm1217_write_14079 cp_tm1217_write 3 14079 &_cx88_stop_audio_dma_14079 ++w1_master_attribute_store_pullup_14080 w1_master_attribute_store_pullup 0-4 14080 NULL ++_nfs4_proc_readdir_14082 _nfs4_proc_readdir 0 14082 NULL ++cond_read_av_list_14085 cond_read_av_list 0 14085 NULL ++store_sched2_14094 store_sched2 4-0 14094 NULL ++do_proc_readlink_14096 do_proc_readlink 3-0 14096 NULL nohasharray ++show_session_param_ISCSI_PARAM_USERNAME_IN_14096 show_session_param_ISCSI_PARAM_USERNAME_IN 0 14096 &do_proc_readlink_14096 ++iwl_mvm_binding_cmd_14097 iwl_mvm_binding_cmd 0 14097 NULL nohasharray ++snd_seq_ioctl_set_queue_tempo_14097 snd_seq_ioctl_set_queue_tempo 0 14097 &iwl_mvm_binding_cmd_14097 ++ch341_control_in_14100 ch341_control_in 0 14100 NULL ++btrfs_clone_alignment_show_14101 btrfs_clone_alignment_show 0 14101 NULL ++compat_sys_pselect6_14105 compat_sys_pselect6 1 14105 NULL ++qib_cq_init_14106 qib_cq_init 0 14106 NULL ++sdev_show_type_14107 sdev_show_type 0 14107 NULL ++sys_bpf_14109 sys_bpf 3 14109 NULL ++palmas_rtc_read_time_14110 palmas_rtc_read_time 0 14110 NULL ++btrfs_space_info_show_bytes_used_14115 btrfs_space_info_show_bytes_used 0 14115 NULL ++selinux_vm_enough_memory_14116 selinux_vm_enough_memory 0 14116 NULL ++wl12xx_set_power_on_14117 wl12xx_set_power_on 0 14117 NULL ++rsc_parse_14119 rsc_parse 0 14119 NULL nohasharray ++enic_set_mac_addr_14119 enic_set_mac_addr 0 14119 &rsc_parse_14119 ++brcmf_sdio_bus_txctl_14123 brcmf_sdio_bus_txctl 3 14123 NULL ++readSuper_14128 readSuper 0 14128 NULL ++show_deactivate_slack_14129 show_deactivate_slack 0 14129 NULL nohasharray ++iscsi_conn_get_addr_param_14129 iscsi_conn_get_addr_param 0 14129 &show_deactivate_slack_14129 ++bnep_send_14132 bnep_send 3 14132 NULL ++hibernate_preallocate_memory_14134 hibernate_preallocate_memory 0 14134 NULL ++ntfs_rl_replace_14136 ntfs_rl_replace 4-2 14136 NULL ++mt9t031_s_stream_14137 mt9t031_s_stream 0 14137 NULL ++isku_sysfs_read_light_14140 isku_sysfs_read_light 6-0-5 14140 NULL ++e100_change_mtu_14143 e100_change_mtu 0 14143 NULL ++pm_trace_show_14146 pm_trace_show 0 14146 NULL ++em_canid_change_14150 em_canid_change 3 14150 NULL ++smm665_show_input_14152 smm665_show_input 0 14152 NULL ++gsm_dlci_data_14155 gsm_dlci_data 3 14155 NULL ++alx_open_14158 alx_open 0 14158 NULL nohasharray ++lpfc_oas_lun_store_14158 lpfc_oas_lun_store 0-4 14158 &alx_open_14158 ++midi_alloc_ep_req_14159 midi_alloc_ep_req 2 14159 NULL ++w1_master_attribute_store_remove_14160 w1_master_attribute_store_remove 0-4 14160 NULL nohasharray ++sdio_uart_claim_func_14160 sdio_uart_claim_func 0 14160 &w1_master_attribute_store_remove_14160 ++do_write_inode_14162 do_write_inode 0 14162 NULL ++simple_dvb_set_params_14166 simple_dvb_set_params 0 14166 NULL ++ccp_alloc_ksb_14167 ccp_alloc_ksb 2 14167 NULL ++print_input_mask_14168 print_input_mask 0-3 14168 NULL ++ov9650_set_exposure_14176 ov9650_set_exposure 0 14176 NULL nohasharray ++ixgbevf_write_mbx_vf_14176 ixgbevf_write_mbx_vf 0 14176 &ov9650_set_exposure_14176 ++uhid_dev_input_14180 uhid_dev_input 0 14180 NULL ++datafab_read_data_14186 datafab_read_data 4 14186 NULL ++show_rf_kill_14187 show_rf_kill 0 14187 NULL ++__platform_create_bundle_14191 __platform_create_bundle 6-4 14191 NULL ++suspend_14194 suspend 0 14194 NULL nohasharray ++bh1780_write_14194 bh1780_write 0 14194 &suspend_14194 ++do_splice_14196 do_splice 5 14196 NULL ++sctp_outq_uncork_14198 sctp_outq_uncork 0 14198 NULL ++zone_wait_table_init_14199 zone_wait_table_init 0 14199 NULL ++hfsplus_brec_find_14200 hfsplus_brec_find 0 14200 NULL ++show_auto_temp_max_14202 show_auto_temp_max 0 14202 NULL nohasharray ++ahci_show_host_cap2_14202 ahci_show_host_cap2 0 14202 &show_auto_temp_max_14202 nohasharray ++vfio_user_config_read_14202 vfio_user_config_read 0 14202 &ahci_show_host_cap2_14202 ++sisusb_recv_bulk_msg_14205 sisusb_recv_bulk_msg 0 14205 NULL ++cancel_lock_14207 cancel_lock 0 14207 NULL ++mv88e6352_get_temp_limit_14208 mv88e6352_get_temp_limit 0 14208 NULL nohasharray ++alloc_async_14208 alloc_async 1 14208 &mv88e6352_get_temp_limit_14208 ++fscache_read_or_alloc_page_14210 fscache_read_or_alloc_page 0 14210 NULL ++store_temp_min_14217 store_temp_min 0-4 14217 NULL ++ath6kl_regread_write_14220 ath6kl_regread_write 3-0 14220 NULL nohasharray ++sst_stream_start_14220 sst_stream_start 0 14220 &ath6kl_regread_write_14220 ++sys_kexec_load_14222 sys_kexec_load 2 14222 NULL ++mcp795_read_time_14224 mcp795_read_time 0 14224 NULL ++wl1251_acx_pd_threshold_14226 wl1251_acx_pd_threshold 0 14226 NULL ++vfio_direct_config_read_14231 vfio_direct_config_read 0-3 14231 NULL ++ieee80211_if_write_uapsd_max_sp_len_14233 ieee80211_if_write_uapsd_max_sp_len 3-0 14233 NULL nohasharray ++store_engine2_load_14233 store_engine2_load 4-0 14233 &ieee80211_if_write_uapsd_max_sp_len_14233 ++show_fc_host_maxframe_size_14237 show_fc_host_maxframe_size 0 14237 NULL ++usbhsh_endpoint_attach_14238 usbhsh_endpoint_attach 0 14238 NULL ++de_get_regs_len_14241 de_get_regs_len 0 14241 NULL ++dma_declare_coherent_memory_14244 dma_declare_coherent_memory 2-4 14244 NULL ++iscsi_tpg_param_store_AuthMethod_14245 iscsi_tpg_param_store_AuthMethod 0-3 14245 NULL ++btrfs_token_file_extent_ram_bytes_14247 btrfs_token_file_extent_ram_bytes 0 14247 NULL nohasharray ++__dwc3_gadget_kick_transfer_14247 __dwc3_gadget_kick_transfer 0 14247 &btrfs_token_file_extent_ram_bytes_14247 ++ext4_setattr_14248 ext4_setattr 0 14248 NULL nohasharray ++cgroup_populate_dir_14248 cgroup_populate_dir 0 14248 &ext4_setattr_14248 ++pnp_auto_config_dev_14250 pnp_auto_config_dev 0 14250 NULL ++raid5_show_group_thread_cnt_14251 raid5_show_group_thread_cnt 0 14251 NULL ++ubifs_write_master_14258 ubifs_write_master 0 14258 NULL ++bh1770_get_prox_rate_above_14264 bh1770_get_prox_rate_above 0 14264 NULL ++zd1211_hw_init_hmac_14265 zd1211_hw_init_hmac 0 14265 NULL ++ath6kl_connect_event_14267 ath6kl_connect_event 7-8-9 14267 NULL ++l2tp_ip_open_14268 l2tp_ip_open 0 14268 NULL ++cifs_strict_fsync_14271 cifs_strict_fsync 0 14271 NULL ++acpi_os_map_iomem_14273 acpi_os_map_iomem 1-2 14273 NULL nohasharray ++add_numbered_child_14273 add_numbered_child 5 14273 &acpi_os_map_iomem_14273 ++compat_SyS_semtimedop_14276 compat_SyS_semtimedop 3 14276 NULL ++snd_seq_oss_readq_new_14283 snd_seq_oss_readq_new 2 14283 NULL ++show_shost_state_14285 show_shost_state 0 14285 NULL ++exofs_readpage_14288 exofs_readpage 0 14288 NULL ++rxrpc_krb5_decode_ticket_14290 rxrpc_krb5_decode_ticket 0 14290 NULL ++rr_status_14293 rr_status 5-0 14293 NULL ++restart_write_file_14294 restart_write_file 0 14294 NULL ++lp8788_write_byte_14299 lp8788_write_byte 0 14299 NULL ++read_default_ldt_14302 read_default_ldt 2 14302 NULL nohasharray ++cbus_transfer_14302 cbus_transfer 0 14302 &read_default_ldt_14302 nohasharray ++tw28xx_show_14302 tw28xx_show 0 14302 &cbus_transfer_14302 ++edac_dev_block_show_14303 edac_dev_block_show 0 14303 NULL nohasharray ++update_rgrp_lvb_14303 update_rgrp_lvb 0 14303 &edac_dev_block_show_14303 ++mic_smpt_offset_14304 mic_smpt_offset 0-2 14304 NULL ++iwl_alive_notify_14306 iwl_alive_notify 0 14306 NULL nohasharray ++store_regs_in_min0_14306 store_regs_in_min0 0-4 14306 &iwl_alive_notify_14306 ++i740fb_decode_var_14308 i740fb_decode_var 0 14308 NULL ++list_one_attr_14309 list_one_attr 0 14309 NULL ++ov9740_s_stream_14315 ov9740_s_stream 0 14315 NULL nohasharray ++x2apic_cpu_mask_to_apicid_and_14315 x2apic_cpu_mask_to_apicid_and 0 14315 &ov9740_s_stream_14315 ++show_otp4en_14321 show_otp4en 0 14321 NULL ++cma_netdev_change_14326 cma_netdev_change 0 14326 NULL ++xfs_bmap_last_offset_14327 xfs_bmap_last_offset 0 14327 NULL ++dvb_usbv2_generic_write_14335 dvb_usbv2_generic_write 0 14335 NULL nohasharray ++rtpm_usagecount_show_14335 rtpm_usagecount_show 0 14335 &dvb_usbv2_generic_write_14335 ++ch341_get_status_14337 ch341_get_status 0 14337 NULL ++reshape_direction_store_14340 reshape_direction_store 0-3 14340 NULL ++sbp_tpg_show_enable_14341 sbp_tpg_show_enable 0 14341 NULL ++reset_protection_store_14344 reset_protection_store 0-4 14344 NULL ++p9_client_zc_rpc_14345 p9_client_zc_rpc 7 14345 NULL ++ep_aio_rwtail_14347 ep_aio_rwtail 6 14347 NULL ++writepages_14348 writepages 0 14348 NULL ++bnx2_request_uncached_firmware_14349 bnx2_request_uncached_firmware 0 14349 NULL nohasharray ++alloc_tx_struct_14349 alloc_tx_struct 1 14349 &bnx2_request_uncached_firmware_14349 ++__dev_open_14352 __dev_open 0 14352 NULL nohasharray ++ath5k_hw_nic_wakeup_14352 ath5k_hw_nic_wakeup 0 14352 &__dev_open_14352 ++hash_ipportnet4_expire_14354 hash_ipportnet4_expire 4 14354 NULL nohasharray ++__sha256_ssse3_update_14354 __sha256_ssse3_update 0 14354 &hash_ipportnet4_expire_14354 ++read_block_data_14358 read_block_data 0 14358 NULL ++_kstrtol_14359 _kstrtol 0 14359 NULL ++cdc_ncm_store_min_tx_pkt_14360 cdc_ncm_store_min_tx_pkt 0-4 14360 NULL nohasharray ++tg_set_cfs_period_14360 tg_set_cfs_period 0 14360 &cdc_ncm_store_min_tx_pkt_14360 ++revision_id_show_14361 revision_id_show 0 14361 NULL ++snd_pcm_lib_readv_14363 snd_pcm_lib_readv 3-0 14363 NULL ++vlan_dev_change_mtu_14364 vlan_dev_change_mtu 0 14364 NULL ++isofs_hashi_common_14371 isofs_hashi_common 0 14371 NULL ++_nfs40_proc_get_locations_14375 _nfs40_proc_get_locations 0 14375 NULL ++vortex_open_14377 vortex_open 0 14377 NULL nohasharray ++atl1c_get_eeprom_len_14377 atl1c_get_eeprom_len 0 14377 &vortex_open_14377 ++acpi_get_override_irq_14381 acpi_get_override_irq 1 14381 NULL nohasharray ++mptscsih_version_mpi_show_14381 mptscsih_version_mpi_show 0 14381 &acpi_get_override_irq_14381 ++ext3_write_begin_14384 ext3_write_begin 0 14384 NULL ++srp_tmo_valid_14386 srp_tmo_valid 0 14386 NULL ++ath6kl_regdump_read_14393 ath6kl_regdump_read 3-0 14393 NULL ++smk_write_onlycap_14400 smk_write_onlycap 3-0 14400 NULL ++kernel_module_request_14403 kernel_module_request 0 14403 NULL ++mac80211_hwsim_netlink_notify_14405 mac80211_hwsim_netlink_notify 0 14405 NULL ++gpio_edge_store_14412 gpio_edge_store 0-4 14412 NULL ++show_cpumask_14414 show_cpumask 0 14414 NULL ++rocker_port_router_mac_14415 rocker_port_router_mac 0 14415 NULL ++mtd_concat_create_14416 mtd_concat_create 2 14416 NULL ++mtdchar_read_14417 mtdchar_read 0-3 14417 NULL ++__b44_writephy_14420 __b44_writephy 0 14420 NULL ++__smsc95xx_phy_wait_not_busy_14423 __smsc95xx_phy_wait_not_busy 0 14423 NULL ++get_kcore_size_14425 get_kcore_size 0 14425 NULL ++store_threeg_14430 store_threeg 4 14430 NULL ++show_temp_label_14434 show_temp_label 0 14434 NULL ++dn_bind_14436 dn_bind 0 14436 NULL nohasharray ++acpi_hibernation_begin_14436 acpi_hibernation_begin 0 14436 &dn_bind_14436 ++_iwl_dbgfs_sram_write_14439 _iwl_dbgfs_sram_write 3-0 14439 NULL ++rbd_snap_show_14440 rbd_snap_show 0 14440 NULL nohasharray ++qla2x00_zio_store_14440 qla2x00_zio_store 0-4 14440 &rbd_snap_show_14440 ++apds990x_lux_thresh_above_show_14441 apds990x_lux_thresh_above_show 0 14441 NULL ++_nfs4_proc_getdeviceinfo_14446 _nfs4_proc_getdeviceinfo 0 14446 NULL ++t4_read_reg64_14447 t4_read_reg64 0 14447 NULL ++rocker_group_tbl_del_14451 rocker_group_tbl_del 0 14451 NULL nohasharray ++open_14451 open 0 14451 &rocker_group_tbl_del_14451 ++scsi_add_single_device_14457 scsi_add_single_device 0 14457 NULL ++ath10k_write_htt_stats_mask_14458 ath10k_write_htt_stats_mask 3-0 14458 NULL ++access_store_14459 access_store 0-4 14459 NULL ++qt1010_get_if_frequency_14468 qt1010_get_if_frequency 0 14468 NULL ++lustre_msg_size_v2_14470 lustre_msg_size_v2 0 14470 NULL ++ath5k_attr_show_firstep_level_max_14473 ath5k_attr_show_firstep_level_max 0 14473 NULL nohasharray ++als_sensing_range_store_14473 als_sensing_range_store 0-4 14473 &ath5k_attr_show_firstep_level_max_14473 ++set_peek_off_14474 set_peek_off 0 14474 NULL ++ath10k_pci_hif_power_up_14475 ath10k_pci_hif_power_up 0 14475 NULL ++rt2x00debug_read_cap_flags_14477 rt2x00debug_read_cap_flags 0-3 14477 NULL nohasharray ++hotplug_hrtick_14477 hotplug_hrtick 0 14477 &rt2x00debug_read_cap_flags_14477 ++store_14478 store 0-4 14478 NULL ++udplite_getfrag_14479 udplite_getfrag 3-4 14479 NULL nohasharray ++diolan_usb_cmd_14479 diolan_usb_cmd 0 14479 &udplite_getfrag_14479 ++flexcop_master_xfer_14483 flexcop_master_xfer 0-3 14483 NULL ++ieee80211_if_read_dot11MeshGateAnnouncementProtocol_14486 ieee80211_if_read_dot11MeshGateAnnouncementProtocol 3-0 14486 NULL nohasharray ++show_nfilters_14486 show_nfilters 0 14486 &ieee80211_if_read_dot11MeshGateAnnouncementProtocol_14486 ++split_state_14491 split_state 0 14491 NULL ++soc_camera_client_g_rect_14492 soc_camera_client_g_rect 0 14492 NULL ++sbp_tpg_attrib_store_max_reconnect_timeout_14494 sbp_tpg_attrib_store_max_reconnect_timeout 0-3 14494 NULL ++ds1343_show_alarmstatus_14496 ds1343_show_alarmstatus 0 14496 NULL ++skein_1024_init_14498 skein_1024_init 0 14498 NULL ++i801_check_post_14501 i801_check_post 0 14501 NULL ++ocfs2_debug_read_14507 ocfs2_debug_read 3-0 14507 NULL ++patch_cr157_14509 patch_cr157 0 14509 NULL ++show_drivers_autoprobe_14510 show_drivers_autoprobe 0 14510 NULL ++ahci_led_store_14513 ahci_led_store 0-3 14513 NULL ++do_loop_readv_writev_14515 do_loop_readv_writev 0 14515 NULL ++mt2266_set_params_14520 mt2266_set_params 0 14520 NULL nohasharray ++cache_type_store_14520 cache_type_store 0-4 14520 &mt2266_set_params_14520 ++mwl8k_probe_hw_14526 mwl8k_probe_hw 0 14526 NULL ++audit_watch_handle_event_14534 audit_watch_handle_event 0 14534 NULL nohasharray ++nfc_hci_hcp_message_tx_14534 nfc_hci_hcp_message_tx 6 14534 &audit_watch_handle_event_14534 ++dataflash_read_user_otp_14536 dataflash_read_user_otp 3-2 14536 NULL nohasharray ++rtl2830_wr_reg_mask_14536 rtl2830_wr_reg_mask 0 14536 &dataflash_read_user_otp_14536 nohasharray ++ep0_write_14536 ep0_write 3 14536 &rtl2830_wr_reg_mask_14536 nohasharray ++prepare_data_14536 prepare_data 3 14536 &ep0_write_14536 ++fuse_write_inode_14540 fuse_write_inode 0 14540 NULL nohasharray ++patch_alc680_14540 patch_alc680 0 14540 &fuse_write_inode_14540 ++lola_stream_wait_for_fifo_14541 lola_stream_wait_for_fifo 0 14541 NULL ++_rtl_usb_receive_14542 _rtl_usb_receive 0 14542 NULL ++getxattr_14545 getxattr 0 14545 NULL nohasharray ++max8997_rtc_start_alarm_14545 max8997_rtc_start_alarm 0 14545 &getxattr_14545 ++l2cap_send_cmd_14548 l2cap_send_cmd 4 14548 NULL ++picolcd_debug_eeprom_read_14549 picolcd_debug_eeprom_read 3-0 14549 NULL ++em28xx_i2c_check_for_device_14556 em28xx_i2c_check_for_device 0 14556 NULL ++edt_ft5x06_setting_store_14557 edt_ft5x06_setting_store 0-4 14557 NULL nohasharray ++xfs_fs_log_dummy_14557 xfs_fs_log_dummy 0 14557 &edt_ft5x06_setting_store_14557 ++ath10k_wmi_dbglog_cfg_14561 ath10k_wmi_dbglog_cfg 0 14561 NULL ++qp_host_alloc_queue_14566 qp_host_alloc_queue 1 14566 NULL ++label_cpu_14568 label_cpu 0 14568 NULL ++SyS_setdomainname_14569 SyS_setdomainname 2 14569 NULL ++wmi_rxon_14574 wmi_rxon 0 14574 NULL ++show_temp_auto_pwm_min_14575 show_temp_auto_pwm_min 0 14575 NULL ++ecryptfs_d_revalidate_14579 ecryptfs_d_revalidate 0 14579 NULL ++w1_slave_read_14580 w1_slave_read 5-6-0 14580 NULL ++stuffed_readpage_14581 stuffed_readpage 0 14581 NULL ++write_info_14584 write_info 0-3 14584 NULL ++af9005_i2c_read_14586 af9005_i2c_read 0 14586 NULL ++uart_get_attr_xmit_fifo_size_14588 uart_get_attr_xmit_fifo_size 0 14588 NULL ++bd2802_store_reg0x0b_14590 bd2802_store_reg0x0b 0-4 14590 NULL ++idmap_pipe_downcall_14591 idmap_pipe_downcall 3-0 14591 NULL ++nfs4_xattr_get_nfs4_label_14596 nfs4_xattr_get_nfs4_label 0 14596 NULL ++i2c_smbus_write_word_swapped_14597 i2c_smbus_write_word_swapped 0 14597 NULL nohasharray ++ceph_osdc_alloc_request_14597 ceph_osdc_alloc_request 3 14597 &i2c_smbus_write_word_swapped_14597 nohasharray ++show_14597 show 0 14597 &ceph_osdc_alloc_request_14597 ++nfs4_xattr_list_nfs4_label_14598 nfs4_xattr_list_nfs4_label 0-5 14598 NULL ++bq2415x_i2c_read_14599 bq2415x_i2c_read 0 14599 NULL ++uhid_hid_raw_request_14609 uhid_hid_raw_request 0-4 14609 NULL ++init_nic_14611 init_nic 0 14611 NULL ++snd_es1938_playback_prepare_14613 snd_es1938_playback_prepare 0 14613 NULL ++vmci_transport_send_read_14617 vmci_transport_send_read 0 14617 NULL ++ems_usb_start_14619 ems_usb_start 0 14619 NULL ++sb1000_start_get_set_command_14626 sb1000_start_get_set_command 0 14626 NULL nohasharray ++__intel_ring_prepare_14626 __intel_ring_prepare 0 14626 &sb1000_start_get_set_command_14626 ++show_temphyst_14627 show_temphyst 0 14627 NULL ++xen_swiotlb_free_coherent_14630 xen_swiotlb_free_coherent 4 14630 NULL ++async_syndrome_val_14633 async_syndrome_val 2 14633 NULL ++rpipe_get_by_ep_14635 rpipe_get_by_ep 0 14635 NULL ++rt2500pci_set_state_14638 rt2500pci_set_state 0 14638 NULL ++adp8860_bl_ambient_light_zone_show_14639 adp8860_bl_ambient_light_zone_show 0 14639 NULL ++ocfs2_trim_group_14641 ocfs2_trim_group 3-4 14641 NULL ++write_14642 write 0 14642 NULL ++dbJoin_14644 dbJoin 0 14644 NULL ++profile_replace_14652 profile_replace 3-0 14652 NULL ++klsi_105_open_14653 klsi_105_open 0 14653 NULL ++cachefiles_allocate_page_14654 cachefiles_allocate_page 0 14654 NULL ++show_tcpEstabResets_14657 show_tcpEstabResets 0 14657 NULL ++store_pwm_auto_spinup_time_14661 store_pwm_auto_spinup_time 0-4 14661 NULL nohasharray ++store_14661 store 0-3 14661 &store_pwm_auto_spinup_time_14661 ++usnic_vnic_dump_14662 usnic_vnic_dump 3 14662 NULL ++f2fs_xattr_generic_get_14665 f2fs_xattr_generic_get 0 14665 NULL nohasharray ++wusb_dev_set_gtk_14665 wusb_dev_set_gtk 0 14665 &f2fs_xattr_generic_get_14665 ++ecryptfs_getattr_14674 ecryptfs_getattr 0 14674 NULL ++min_bytes_needed_14675 min_bytes_needed 0 14675 NULL ++nvme_trans_log_info_exceptions_14677 nvme_trans_log_info_exceptions 3 14677 NULL ++show_temp_auto_temp_crit_14678 show_temp_auto_temp_crit 0 14678 NULL ++store_auto_fan_14679 store_auto_fan 0-4 14679 NULL ++mfd_add_hotplug_devices_14680 mfd_add_hotplug_devices 3 14680 NULL nohasharray ++pipeline_enc_tx_stat_fifo_int_read_14680 pipeline_enc_tx_stat_fifo_int_read 3-0 14680 &mfd_add_hotplug_devices_14680 nohasharray ++gpio_keys_show_disabled_keys_14680 gpio_keys_show_disabled_keys 0 14680 &pipeline_enc_tx_stat_fifo_int_read_14680 ++tcp_v6_init_sock_14681 tcp_v6_init_sock 0 14681 NULL ++ieee80211_if_fmt_rc_rateidx_mask_2ghz_14683 ieee80211_if_fmt_rc_rateidx_mask_2ghz 3 14683 NULL ++tsi148_master_set_14685 tsi148_master_set 4 14685 NULL ++find_shared_port_14689 find_shared_port 0 14689 NULL ++mt9m001_s_ctrl_14690 mt9m001_s_ctrl 0 14690 NULL ++show_engine1_mode_14691 show_engine1_mode 0 14691 NULL nohasharray ++acpi_ds_init_aml_walk_14691 acpi_ds_init_aml_walk 0 14691 &show_engine1_mode_14691 ++usnic_ib_show_board_14694 usnic_ib_show_board 0 14694 NULL ++tomoyo_path_permission_14701 tomoyo_path_permission 0 14701 NULL nohasharray ++walk_tg_tree_14701 walk_tg_tree 0 14701 &tomoyo_path_permission_14701 ++SyS_fsetxattr_14702 SyS_fsetxattr 4 14702 NULL ++power_supply_show_property_14703 power_supply_show_property 0 14703 NULL ++persistent_ram_ecc_string_14704 persistent_ram_ecc_string 0 14704 NULL nohasharray ++mt9t112_auto_focus_setting_14704 mt9t112_auto_focus_setting 0 14704 &persistent_ram_ecc_string_14704 ++iblock_show_configfs_dev_params_14709 iblock_show_configfs_dev_params 0 14709 NULL nohasharray ++u_audio_playback_14709 u_audio_playback 3 14709 &iblock_show_configfs_dev_params_14709 ++chv_get_total_gtt_size_14710 chv_get_total_gtt_size 0-1 14710 NULL ++ntfs_file_fsync_14713 ntfs_file_fsync 0 14713 NULL ++e4000_set_mixer_gain_14714 e4000_set_mixer_gain 0 14714 NULL nohasharray ++sctp_setsockopt_recvrcvinfo_14714 sctp_setsockopt_recvrcvinfo 0 14714 &e4000_set_mixer_gain_14714 ++cp_set_mac_address_14715 cp_set_mac_address 0 14715 NULL ++set_register_interruptible_14716 set_register_interruptible 0 14716 NULL nohasharray ++blk_mq_tag_update_depth_14716 blk_mq_tag_update_depth 0 14716 &set_register_interruptible_14716 ++vfd_write_14717 vfd_write 3-0 14717 NULL ++SyS_sendfile_14718 SyS_sendfile 4 14718 NULL ++inet_listen_14723 inet_listen 0 14723 NULL ++show_interval_14725 show_interval 0 14725 NULL nohasharray ++read_ahead_kb_store_14725 read_ahead_kb_store 0-4 14725 &show_interval_14725 ++show_fcstat_fc_no_free_exch_xid_14727 show_fcstat_fc_no_free_exch_xid 0 14727 NULL ++__blk_end_request_14729 __blk_end_request 3 14729 NULL ++rh_urb_enqueue_14733 rh_urb_enqueue 0 14733 NULL ++raid1_resize_14740 raid1_resize 2-0 14740 NULL ++show_conn_param_ISCSI_PARAM_IPV6_TC_14747 show_conn_param_ISCSI_PARAM_IPV6_TC 0 14747 NULL ++sh_mobile_ceu_get_formats_14748 sh_mobile_ceu_get_formats 0 14748 NULL ++store_camera_14751 store_camera 4-0 14751 NULL ++btrfs_inode_extref_name_len_14752 btrfs_inode_extref_name_len 0 14752 NULL ++rx_rx_cmplt_read_14753 rx_rx_cmplt_read 3-0 14753 NULL ++blogic_write_info_14757 blogic_write_info 0-3 14757 NULL ++multicast_query_use_ifaddr_show_14759 multicast_query_use_ifaddr_show 0 14759 NULL ++cfq_slice_idle_show_14764 cfq_slice_idle_show 0 14764 NULL nohasharray ++send_mad_14764 send_mad 0 14764 &cfq_slice_idle_show_14764 ++qla82xx_pci_mem_write_2M_14765 qla82xx_pci_mem_write_2M 2 14765 NULL ++deliver_to_subscribers_14769 deliver_to_subscribers 0 14769 NULL ++elv_register_queue_14771 elv_register_queue 0 14771 NULL ++regmap_range_read_file_14775 regmap_range_read_file 0-3 14775 NULL ++lm3533_als_get_hysteresis_14776 lm3533_als_get_hysteresis 0 14776 NULL ++pch_i2c_writebytes_14779 pch_i2c_writebytes 0 14779 NULL ++sta_dev_read_14782 sta_dev_read 3-0 14782 NULL ++shm32read__write_file_14786 shm32read__write_file 0 14786 NULL ++qla4_8xxx_device_bootstrap_14787 qla4_8xxx_device_bootstrap 0 14787 NULL ++wm8775_s_ctrl_14789 wm8775_s_ctrl 0 14789 NULL nohasharray ++fuse_setattr_14789 fuse_setattr 0 14789 &wm8775_s_ctrl_14789 ++bd2802_store_reg0x0a_14790 bd2802_store_reg0x0a 0-4 14790 NULL ++keys_proc_write_14792 keys_proc_write 3-0 14792 NULL nohasharray ++cp_tm1217_read_14792 cp_tm1217_read 3 14792 &keys_proc_write_14792 ++ext4_kvmalloc_14796 ext4_kvmalloc 1 14796 NULL ++__kfifo_in_14797 __kfifo_in 0-3 14797 NULL ++hpet_readl_14801 hpet_readl 0 14801 NULL ++wb_smsc_wdt_notify_sys_14805 wb_smsc_wdt_notify_sys 0 14805 NULL ++show_fcstat_fc_xid_busy_14807 show_fcstat_fc_xid_busy 0 14807 NULL nohasharray ++gameport_bind_driver_14807 gameport_bind_driver 0 14807 &show_fcstat_fc_xid_busy_14807 ++f2fs_write_inode_14812 f2fs_write_inode 0 14812 NULL ++unix_gid_parse_14819 unix_gid_parse 0 14819 NULL ++ib_umem_num_pages_14820 ib_umem_num_pages 0 14820 NULL ++mtd_ecc_step_size_show_14822 mtd_ecc_step_size_show 0 14822 NULL ++xfs_btree_kill_iroot_14824 xfs_btree_kill_iroot 0 14824 NULL nohasharray ++store_net_stats_14824 store_net_stats 0-4 14824 &xfs_btree_kill_iroot_14824 ++acpi_ps_init_scope_14825 acpi_ps_init_scope 0 14825 NULL ++tx_fifo_errors_show_14827 tx_fifo_errors_show 0 14827 NULL ++show_temp_input_14828 show_temp_input 0 14828 NULL ++ocfs2_xattr_get_14831 ocfs2_xattr_get 0 14831 NULL ++ocfs2_permission_14834 ocfs2_permission 0 14834 NULL ++max_power_show_14836 max_power_show 0 14836 NULL ++name_len_14843 name_len 0-2 14843 NULL ++subsystem_vendor_show_14845 subsystem_vendor_show 0 14845 NULL ++mrp_attr_create_14853 mrp_attr_create 3 14853 NULL ++__krealloc_14857 __krealloc 2 14857 NULL nohasharray ++lcd_write_14857 lcd_write 3-0 14857 &__krealloc_14857 ++i2c_nuvoton_wait_for_stat_14859 i2c_nuvoton_wait_for_stat 0 14859 NULL nohasharray ++blkcg_activate_policy_14859 blkcg_activate_policy 0 14859 &i2c_nuvoton_wait_for_stat_14859 ++get_user_cpu_mask_14861 get_user_cpu_mask 2 14861 NULL ++asd_erase_nv_sector_14865 asd_erase_nv_sector 0 14865 NULL ++ds1553_nvram_read_14868 ds1553_nvram_read 0-5-6 14868 NULL nohasharray ++send_cancel_14868 send_cancel 0 14868 &ds1553_nvram_read_14868 ++snd_cmipci_capture_prepare_14878 snd_cmipci_capture_prepare 0 14878 NULL ++bInterfaceProtocol_show_14880 bInterfaceProtocol_show 0 14880 NULL ++dma_generic_free_coherent_14883 dma_generic_free_coherent 2 14883 NULL ++aoechr_read_14884 aoechr_read 0-3 14884 NULL ++xfs_bmapi_convert_unwritten_14886 xfs_bmapi_convert_unwritten 0 14886 NULL ++acpi_os_allocate_14892 acpi_os_allocate 1 14892 NULL ++mfg_show_14897 mfg_show 0 14897 NULL ++ea_init_14899 ea_init 0 14899 NULL ++mwl8k_cmd_radio_enable_14900 mwl8k_cmd_radio_enable 0 14900 NULL ++SYSC_readv_14901 SYSC_readv 3 14901 NULL ++netlbl_catmap_walk_14902 netlbl_catmap_walk 0-2 14902 NULL nohasharray ++playback_pcm_trigger_14902 playback_pcm_trigger 0 14902 &netlbl_catmap_walk_14902 ++acpi_ds_method_error_14906 acpi_ds_method_error 0-1 14906 NULL ++krealloc_14908 krealloc 2 14908 NULL nohasharray ++lkfirst_store_14908 lkfirst_store 0-3 14908 &krealloc_14908 ++regmap_irq_get_virq_14910 regmap_irq_get_virq 2 14910 NULL nohasharray ++acpi_pm_prepare_14910 acpi_pm_prepare 0 14910 ®map_irq_get_virq_14910 ++sel_make_bools_14912 sel_make_bools 0 14912 NULL nohasharray ++wlcore_write_data_14912 wlcore_write_data 0 14912 &sel_make_bools_14912 ++sis5595_transaction_14915 sis5595_transaction 0 14915 NULL ++__arch_hweight64_14923 __arch_hweight64 0 14923 NULL nohasharray ++qp_memcpy_to_queue_iov_14923 qp_memcpy_to_queue_iov 5-2 14923 &__arch_hweight64_14923 nohasharray ++parport_uss720_read_data_14923 parport_uss720_read_data 0 14923 &qp_memcpy_to_queue_iov_14923 ++af9005_usb_write_tuner_registers_14924 af9005_usb_write_tuner_registers 0 14924 NULL ++ratelimit_handler_14925 ratelimit_handler 0 14925 NULL ++lpfc_request_firmware_upgrade_store_14932 lpfc_request_firmware_upgrade_store 0-4 14932 NULL ++gether_opts_host_addr_store_14933 gether_opts_host_addr_store 0-3 14933 NULL ++store_sys_wmi_14934 store_sys_wmi 0-4 14934 NULL ++__omfs_write_inode_14935 __omfs_write_inode 0 14935 NULL ++start_cif_cam_14937 start_cif_cam 0 14937 NULL ++sierra_net_change_mtu_14941 sierra_net_change_mtu 0 14941 NULL ++queue_cnt_14951 queue_cnt 0 14951 NULL ++unix_dgram_recvmsg_14952 unix_dgram_recvmsg 0-4 14952 NULL ++lbs_set_reg_14953 lbs_set_reg 0 14953 NULL ++ipw_ethtool_get_eeprom_len_14954 ipw_ethtool_get_eeprom_len 0 14954 NULL ++videobuf_read_stream_14956 videobuf_read_stream 3-0 14956 NULL ++imx074_s_stream_14963 imx074_s_stream 0 14963 NULL ++reiserfs_end_persistent_transaction_14965 reiserfs_end_persistent_transaction 0 14965 NULL ++s3c_camif_subdev_s_ctrl_14968 s3c_camif_subdev_s_ctrl 0 14968 NULL nohasharray ++ar5523_add_interface_14968 ar5523_add_interface 0 14968 &s3c_camif_subdev_s_ctrl_14968 ++twl6030reg_disable_14969 twl6030reg_disable 0 14969 NULL ++snd_pcm_oss_make_ready_14971 snd_pcm_oss_make_ready 0 14971 NULL ++mce_flush_rx_buffer_14976 mce_flush_rx_buffer 2 14976 NULL ++mpoa_event_listener_14977 mpoa_event_listener 0 14977 NULL ++s5p_mfc_enc_s_ctrl_14984 s5p_mfc_enc_s_ctrl 0 14984 NULL ++mc13xxx_irq_mask_14985 mc13xxx_irq_mask 2-0 14985 NULL nohasharray ++bnx2x_setup_queue_14985 bnx2x_setup_queue 0 14985 &mc13xxx_irq_mask_14985 ++block_ce_count_show_14986 block_ce_count_show 0 14986 NULL ++gpio_twl4030_write_14987 gpio_twl4030_write 0-1 14987 NULL nohasharray ++zr364xx_vidioc_streamon_14987 zr364xx_vidioc_streamon 0 14987 &gpio_twl4030_write_14987 nohasharray ++setkey_14987 setkey 3 14987 &zr364xx_vidioc_streamon_14987 ++als_sensing_range_show_14991 als_sensing_range_show 0 14991 NULL ++adp8870_bl_l1_daylight_dim_show_14995 adp8870_bl_l1_daylight_dim_show 0 14995 NULL nohasharray ++setkey_14995 setkey 0 14995 &adp8870_bl_l1_daylight_dim_show_14995 ++hvc_write_14999 hvc_write 0-3 14999 NULL ++acpi_ds_obj_stack_push_15001 acpi_ds_obj_stack_push 0 15001 NULL ++store_touchpad_15003 store_touchpad 4-0 15003 NULL nohasharray ++add_request_15003 add_request 0 15003 &store_touchpad_15003 ++show_slidebar_mode_15004 show_slidebar_mode 0 15004 NULL ++dump_write_15008 dump_write 0-3 15008 NULL ++mt9m111_set_global_gain_15009 mt9m111_set_global_gain 0 15009 NULL ++sctp_setsockopt_default_sndinfo_15011 sctp_setsockopt_default_sndinfo 3-0 15011 NULL nohasharray ++update_streaming_15011 update_streaming 0 15011 &sctp_setsockopt_default_sndinfo_15011 ++cpuset_cpu_inactive_15013 cpuset_cpu_inactive 0 15013 NULL ++reconfig_codec_15017 reconfig_codec 0 15017 NULL ++prepare_hardware_15022 prepare_hardware 0 15022 NULL ++predisable_15024 predisable 0 15024 NULL ++vmap_15025 vmap 2 15025 NULL ++ab3100_is_enabled_regulator_15026 ab3100_is_enabled_regulator 0 15026 NULL ++set_temp_offset_15033 set_temp_offset 0-4 15033 NULL ++alloc_ad_spec_15035 alloc_ad_spec 0 15035 NULL ++cache_dma_show_15038 cache_dma_show 0 15038 NULL nohasharray ++srp_parse_tmo_15038 srp_parse_tmo 0 15038 &cache_dma_show_15038 ++priority_store_15039 priority_store 4-0 15039 NULL ++read_file_node_aggr_15040 read_file_node_aggr 3-0 15040 NULL ++nfs3_rpc_wrapper_15047 nfs3_rpc_wrapper 0 15047 NULL ++fuse_launder_page_15048 fuse_launder_page 0 15048 NULL nohasharray ++iscsi_stat_sess_show_attr_rxdata_octs_15048 iscsi_stat_sess_show_attr_rxdata_octs 0 15048 &fuse_launder_page_15048 nohasharray ++loop_attr_partscan_show_15048 loop_attr_partscan_show 0 15048 &iscsi_stat_sess_show_attr_rxdata_octs_15048 ++show_otp3en_15049 show_otp3en 0 15049 NULL ++show_15051 show 0 15051 NULL ++irq_get_next_irq_15053 irq_get_next_irq 1-0 15053 NULL ++cld_pipe_downcall_15058 cld_pipe_downcall 3-0 15058 NULL ++store_lslvl_15059 store_lslvl 4-0 15059 NULL ++br_change_mtu_15064 br_change_mtu 0 15064 NULL ++ieee80211_if_read_uapsd_max_sp_len_15067 ieee80211_if_read_uapsd_max_sp_len 3-0 15067 NULL ++zero_pages_show_15069 zero_pages_show 0 15069 NULL ++nfs4_write_cached_acl_15070 nfs4_write_cached_acl 4 15070 NULL ++ntfs_copy_from_user_15072 ntfs_copy_from_user 0-5-3 15072 NULL ++pppoe_recvmsg_15073 pppoe_recvmsg 0-4 15073 NULL ++group_addr_show_15078 group_addr_show 0 15078 NULL ++s6x0_i2c_transfer_15080 s6x0_i2c_transfer 0-3 15080 NULL ++atkbd_attr_set_helper_15085 atkbd_attr_set_helper 0 15085 NULL ++copy_version_to_user_15087 copy_version_to_user 0 15087 NULL nohasharray ++xfrm_dev_event_15087 xfrm_dev_event 0 15087 ©_version_to_user_15087 ++xfs_btree_insrec_15090 xfs_btree_insrec 0 15090 NULL ++btrfs_readpage_15094 btrfs_readpage 0 15094 NULL ++bond_option_downdelay_set_15095 bond_option_downdelay_set 0 15095 NULL ++ath10k_pci_hif_tx_sg_15096 ath10k_pci_hif_tx_sg 0 15096 NULL ++show_designated_root_15098 show_designated_root 0 15098 NULL ++lcd_power_store_15100 lcd_power_store 0-4 15100 NULL ++xadc_postdisable_15107 xadc_postdisable 0 15107 NULL ++fc_vport_setup_15109 fc_vport_setup 0 15109 NULL ++show_interface_15117 show_interface 0 15117 NULL ++compat_SyS_pwritev_15118 compat_SyS_pwritev 3 15118 NULL ++hex_dump_to_buffer_15121 hex_dump_to_buffer 6 15121 NULL nohasharray ++acpi_power_in_use_show_15121 acpi_power_in_use_show 0 15121 &hex_dump_to_buffer_15121 ++kone_sysfs_show_firmware_version_15123 kone_sysfs_show_firmware_version 0 15123 NULL ++niu_set_ip_frag_rule_15124 niu_set_ip_frag_rule 0 15124 NULL ++show_sas_expander_component_id_15127 show_sas_expander_component_id 0 15127 NULL ++set_max_15128 set_max 0-4 15128 NULL ++lp55xx_show_max_current_15132 lp55xx_show_max_current 0 15132 NULL ++nfs4_xattr_set_nfs4_label_15137 nfs4_xattr_set_nfs4_label 0 15137 NULL ++dummy_hrtimer_prepare_15148 dummy_hrtimer_prepare 0 15148 NULL ++show_fast_charge_timer_15151 show_fast_charge_timer 0 15151 NULL ++s5m8767_wait_for_udr_update_15152 s5m8767_wait_for_udr_update 0 15152 NULL ++ipwireless_ppp_mru_15153 ipwireless_ppp_mru 0 15153 NULL ++setup_sge_queues_15154 setup_sge_queues 0 15154 NULL ++aty_var_to_pll_1703_15155 aty_var_to_pll_1703 0 15155 NULL ++btrfs_submit_compressed_read_15157 btrfs_submit_compressed_read 0 15157 NULL ++_ctl_diag_trigger_event_store_15158 _ctl_diag_trigger_event_store 0-4 15158 NULL ++set_temp_auto_temp_crit_15163 set_temp_auto_temp_crit 0-4 15163 NULL ++acpi_power_transition_15165 acpi_power_transition 0 15165 NULL ++iwl_dbgfs_sta_drain_write_15167 iwl_dbgfs_sta_drain_write 0-3 15167 NULL ++_nfs4_proc_getlk_15168 _nfs4_proc_getlk 0 15168 NULL ++self_check_not_bad_15175 self_check_not_bad 0 15175 NULL ++et131x_change_mtu_15176 et131x_change_mtu 0 15176 NULL ++ocontext_read_15178 ocontext_read 0 15178 NULL ++t4_sge_alloc_ofld_txq_15179 t4_sge_alloc_ofld_txq 0 15179 NULL ++SYSC_setdomainname_15180 SYSC_setdomainname 2 15180 NULL ++pda_power_get_property_15191 pda_power_get_property 0 15191 NULL ++iscsi_create_endpoint_15193 iscsi_create_endpoint 1 15193 NULL nohasharray ++radeonfb_check_var_15193 radeonfb_check_var 0 15193 &iscsi_create_endpoint_15193 ++pci200_open_15194 pci200_open 0 15194 NULL ++async_show_15209 async_show 0 15209 NULL ++command_setflickerctrl_15210 command_setflickerctrl 0 15210 NULL ++get_name_to_buffer_15211 get_name_to_buffer 0 15211 NULL ++bfad_debugfs_write_regrd_15218 bfad_debugfs_write_regrd 3-0 15218 NULL ++m88rs6000t_set_demod_mclk_15221 m88rs6000t_set_demod_mclk 0 15221 NULL nohasharray ++kxcjk1013_setup_any_motion_interrupt_15221 kxcjk1013_setup_any_motion_interrupt 0 15221 &m88rs6000t_set_demod_mclk_15221 ++vx_send_irqa_15223 vx_send_irqa 0 15223 NULL ++netlink_set_ring_15224 netlink_set_ring 0 15224 NULL ++c2port_write_dr_15227 c2port_write_dr 0 15227 NULL ++igb_get_regs_len_15229 igb_get_regs_len 0 15229 NULL nohasharray ++bonding_show_miimon_15229 bonding_show_miimon 0 15229 &igb_get_regs_len_15229 ++init_unsol_queue_15233 init_unsol_queue 0 15233 NULL ++zf_notify_sys_15234 zf_notify_sys 0 15234 NULL nohasharray ++netxen_nic_set_mac_15234 netxen_nic_set_mac 0 15234 &zf_notify_sys_15234 ++iptable_nat_ipv4_out_15236 iptable_nat_ipv4_out 0 15236 NULL ++iwl_dbgfs_sram_write_15239 iwl_dbgfs_sram_write 3-0 15239 NULL ++show_temp_input1_15242 show_temp_input1 0 15242 NULL nohasharray ++getattr_15242 getattr 0 15242 &show_temp_input1_15242 ++il_dbgfs_rx_stats_read_15243 il_dbgfs_rx_stats_read 3-0 15243 NULL ++statfs_slow_store_15251 statfs_slow_store 3-0 15251 NULL ++tg3_init_hw_15257 tg3_init_hw 0 15257 NULL ++nr_bind_15261 nr_bind 0 15261 NULL ++div64_u64_15263 div64_u64 0 15263 NULL ++wacom_led_putimage_15264 wacom_led_putimage 4-0 15264 NULL ++simple_strtol_15273 simple_strtol 0 15273 NULL ++rose_set_mac_address_15277 rose_set_mac_address 0 15277 NULL ++fw_realloc_buffer_15280 fw_realloc_buffer 0-2 15280 NULL ++nvhdmi_8ch_7x_pcm_prepare_15281 nvhdmi_8ch_7x_pcm_prepare 0 15281 NULL ++snd_aw2_pcm_prepare_capture_15282 snd_aw2_pcm_prepare_capture 0 15282 NULL ++snd_via82xx_pcm_prepare_15284 snd_via82xx_pcm_prepare 0 15284 NULL ++qib_sdma_get_complete_15288 qib_sdma_get_complete 0 15288 NULL ++xlate_dev_mem_ptr_15291 xlate_dev_mem_ptr 1 15291 NULL nohasharray ++sys_connect_15291 sys_connect 3 15291 &xlate_dev_mem_ptr_15291 ++send_write_15294 send_write 6-5-0 15294 NULL ++iwl_trans_pcie_read_prph_15295 iwl_trans_pcie_read_prph 0 15295 NULL ++recover_store_15296 recover_store 0-3 15296 NULL ++cachefiles_daemon_cull_15298 cachefiles_daemon_cull 0 15298 NULL ++multicast_query_use_ifaddr_store_15300 multicast_query_use_ifaddr_store 4-0 15300 NULL ++readpage_15301 readpage 0 15301 NULL ++tpm_tis_init_15304 tpm_tis_init 2-3 15304 NULL nohasharray ++kernel_getsockname_15304 kernel_getsockname 0 15304 &tpm_tis_init_15304 ++C_SYSC_move_pages_15305 C_SYSC_move_pages 2 15305 NULL nohasharray ++ocfs2_read_refcount_block_15305 ocfs2_read_refcount_block 0 15305 &C_SYSC_move_pages_15305 ++cfhsi_rx_15306 cfhsi_rx 0 15306 NULL ++show_reg_pages_15308 show_reg_pages 0 15308 NULL nohasharray ++fcoe_ctlr_send_keep_alive_15308 fcoe_ctlr_send_keep_alive 3 15308 &show_reg_pages_15308 ++alc_init_15309 alc_init 0 15309 NULL ++qla4_8xxx_stop_firmware_15311 qla4_8xxx_stop_firmware 0 15311 NULL ++pwm_set_polarity_15313 pwm_set_polarity 0 15313 NULL ++packet_set_ring_15316 packet_set_ring 0 15316 NULL ++iscsi_tpg_param_show_MaxXmitDataSegmentLength_15326 iscsi_tpg_param_show_MaxXmitDataSegmentLength 0 15326 NULL ++bad_inode_getxattr_15327 bad_inode_getxattr 0 15327 NULL ++show_counter_rx_p3_hdr_egr_ovfls_15329 show_counter_rx_p3_hdr_egr_ovfls 0 15329 NULL ++lp3943_write_byte_15336 lp3943_write_byte 0 15336 NULL ++kovaplus_sysfs_read_15337 kovaplus_sysfs_read 0-6 15337 NULL ++ioread16_15342 ioread16 0 15342 NULL ++alloc_ring_15345 alloc_ring 2-4 15345 NULL nohasharray ++crc32_finup_15345 crc32_finup 0 15345 &alloc_ring_15345 ++nfs4_lookup_revalidate_15346 nfs4_lookup_revalidate 0 15346 NULL ++tpacpi_driver_debug_show_15350 tpacpi_driver_debug_show 0 15350 NULL nohasharray ++islpci_open_15350 islpci_open 0 15350 &tpacpi_driver_debug_show_15350 ++ext3_commit_super_15352 ext3_commit_super 0 15352 NULL ++mvs_show_interrupt_coalescing_15353 mvs_show_interrupt_coalescing 0 15353 NULL ++devid_mask_show_15354 devid_mask_show 0 15354 NULL ++blkdev_readpages_15357 blkdev_readpages 4 15357 NULL ++nouveau_hwmon_set_emergency_temp_15358 nouveau_hwmon_set_emergency_temp 0-4 15358 NULL ++acpi_ut_create_string_object_15360 acpi_ut_create_string_object 1 15360 NULL nohasharray ++cx88_alsa_dma_init_15360 cx88_alsa_dma_init 2 15360 &acpi_ut_create_string_object_15360 ++wusb_key_derive_15364 wusb_key_derive 0 15364 NULL ++cfg80211_netdev_notifier_call_15366 cfg80211_netdev_notifier_call 0 15366 NULL nohasharray ++st_press_buffer_predisable_15366 st_press_buffer_predisable 0 15366 &cfg80211_netdev_notifier_call_15366 ++gpio_keys_show_switches_15369 gpio_keys_show_switches 0 15369 NULL ++graph_depth_read_15371 graph_depth_read 3 15371 NULL ++regmap_mmio_read_15372 regmap_mmio_read 0 15372 NULL ++compat_sys_process_vm_readv_15374 compat_sys_process_vm_readv 3-5 15374 NULL ++print_cpus_offline_15377 print_cpus_offline 0 15377 NULL ++fq_codel_zalloc_15378 fq_codel_zalloc 1 15378 NULL nohasharray ++solo_s_ctrl_15378 solo_s_ctrl 0 15378 &fq_codel_zalloc_15378 ++domain_flush_pages_15379 domain_flush_pages 3-2 15379 NULL nohasharray ++iosf_mbi_read_15379 iosf_mbi_read 0 15379 &domain_flush_pages_15379 ++alloc_fddidev_15382 alloc_fddidev 1 15382 NULL ++hotkey_user_mask_set_15391 hotkey_user_mask_set 0 15391 NULL ++show_lwid_enb_15392 show_lwid_enb 0 15392 NULL ++_regmap_read_15396 _regmap_read 0 15396 NULL ++mlx4_cmd_wait_15399 mlx4_cmd_wait 0 15399 NULL ++sm501fb_check_var_15402 sm501fb_check_var 0 15402 NULL ++pipeline_csum_to_rx_xfer_swi_read_15403 pipeline_csum_to_rx_xfer_swi_read 3-0 15403 NULL ++get_modalias_15406 get_modalias 2-0 15406 NULL nohasharray ++nfs_setattr_15406 nfs_setattr 0 15406 &get_modalias_15406 ++qlcnic_83xx_get_cap_size_15413 qlcnic_83xx_get_cap_size 0 15413 NULL ++multicast_membership_interval_store_15419 multicast_membership_interval_store 4-0 15419 NULL ++show_pwm_auto_channels_15421 show_pwm_auto_channels 0 15421 NULL nohasharray ++ov772x_s_stream_15421 ov772x_s_stream 0 15421 &show_pwm_auto_channels_15421 ++metric_id_set_15422 metric_id_set 0-4 15422 NULL ++__videobuf_copy_to_user_15423 __videobuf_copy_to_user 4-0 15423 NULL ++tsl2550_store_operating_mode_15427 tsl2550_store_operating_mode 0-4 15427 NULL ++target_core_store_dev_alias_15430 target_core_store_dev_alias 0-3 15430 NULL ++dvb_pll_configure_15432 dvb_pll_configure 0-3 15432 NULL ++prepare_hardware_15436 prepare_hardware 0 15436 NULL ++tcp_mtu_to_mss_15438 tcp_mtu_to_mss 2-0 15438 NULL ++wakeup_count_show_15444 wakeup_count_show 0 15444 NULL ++wl12xx_boot_15445 wl12xx_boot 0 15445 NULL ++mISDN_sock_recvmsg_15446 mISDN_sock_recvmsg 0-4 15446 NULL ++regulator_suspend_standby_uV_show_15448 regulator_suspend_standby_uV_show 0 15448 NULL ++memweight_15450 memweight 0 15450 NULL ++show_tabletEventsReceived_15451 show_tabletEventsReceived 0 15451 NULL ++ceph_tcp_recvpage_15453 ceph_tcp_recvpage 4 15453 NULL ++i2400m_rx_stats_write_15455 i2400m_rx_stats_write 0-3 15455 NULL ++vmalloc_15464 vmalloc 1 15464 NULL ++show_sas_phy_target_port_protocols_15466 show_sas_phy_target_port_protocols 0 15466 NULL ++w1_f2d_write_15467 w1_f2d_write 3 15467 NULL ++find_smbios_instance_string_15470 find_smbios_instance_string 0 15470 NULL ++mtd_flags_show_15472 mtd_flags_show 0 15472 NULL nohasharray ++__mutex_lock_killable_slowpath_15472 __mutex_lock_killable_slowpath 0 15472 &mtd_flags_show_15472 ++snd_m3_pcm_stop_15476 snd_m3_pcm_stop 0 15476 NULL nohasharray ++snd_seq_ioctl_query_subs_15476 snd_seq_ioctl_query_subs 0 15476 &snd_m3_pcm_stop_15476 ++ath9k_get_stats_15482 ath9k_get_stats 0 15482 NULL ++i2c_readbytes_15483 i2c_readbytes 0 15483 NULL ++cp2112_read_15484 cp2112_read 0 15484 NULL nohasharray ++target_stat_scsi_dev_attr_show_15484 target_stat_scsi_dev_attr_show 0 15484 &cp2112_read_15484 ++ds2781_read_block_15486 ds2781_read_block 4-3-0 15486 NULL ++target_core_alua_lu_gp_show_attr_members_15487 target_core_alua_lu_gp_show_attr_members 0 15487 NULL nohasharray ++write_hw_15487 write_hw 0-6-5 15487 &target_core_alua_lu_gp_show_attr_members_15487 ++mcs7830_set_mac_address_15497 mcs7830_set_mac_address 0 15497 NULL ++__clone_and_map_data_bio_15498 __clone_and_map_data_bio 3 15498 NULL ++vringh_iov_pull_user_15499 vringh_iov_pull_user 3 15499 NULL ++iolock_15500 iolock 0 15500 NULL ++psmouse_attr_set_helper_15505 psmouse_attr_set_helper 0-4 15505 NULL ++bNumInterfaces_show_15506 bNumInterfaces_show 0 15506 NULL ++mwl8k_load_fw_image_15508 mwl8k_load_fw_image 0 15508 NULL ++map_sg_15523 map_sg 0-3 15523 NULL ++da9052_rtc_read_time_15524 da9052_rtc_read_time 0 15524 NULL ++store_15525 store 0 15525 NULL ++il4965_mac_sta_add_15529 il4965_mac_sta_add 0 15529 NULL ++ifx_spi_write_15531 ifx_spi_write 3 15531 NULL ++da9052_bat_irq_15533 da9052_bat_irq 1 15533 NULL ++p9_check_zc_errors_15534 p9_check_zc_errors 4 15534 NULL ++set_pwm_auto_point_temp_15535 set_pwm_auto_point_temp 0-4 15535 NULL ++show_rdac2_15539 show_rdac2 0 15539 NULL ++adf4350_reg_access_15542 adf4350_reg_access 0 15542 NULL ++ql_process_mac_rx_page_15543 ql_process_mac_rx_page 4 15543 NULL ++get_fc_cos_names_15544 get_fc_cos_names 0 15544 NULL nohasharray ++zero_the_pointer_15544 zero_the_pointer 0 15544 &get_fc_cos_names_15544 nohasharray ++sb1000_get_firmware_version_15544 sb1000_get_firmware_version 0 15544 &zero_the_pointer_15544 ++kxcjk1013_get_mode_15550 kxcjk1013_get_mode 0 15550 NULL ++ipv6_synproxy_hook_15554 ipv6_synproxy_hook 0 15554 NULL ++iscsi_stat_sess_show_attr_node_15558 iscsi_stat_sess_show_attr_node 0 15558 NULL ++do_send_15559 do_send 4 15559 NULL nohasharray ++_write_oob_15559 _write_oob 0 15559 &do_send_15559 ++i801_block_transaction_15562 i801_block_transaction 0 15562 NULL nohasharray ++create_capture_mixers_15562 create_capture_mixers 0 15562 &i801_block_transaction_15562 ++get_checksum_15564 get_checksum 0 15564 NULL ++iwl_nvm_read_section_15568 iwl_nvm_read_section 0 15568 NULL ++_read_user_prot_reg_15571 _read_user_prot_reg 0 15571 NULL ++persistent_status_15574 persistent_status 4 15574 NULL ++bnx2fc_process_unsol_compl_15576 bnx2fc_process_unsol_compl 2 15576 NULL ++usbtv_start_streaming_15581 usbtv_start_streaming 0 15581 NULL ++usbhsh_status_stage_packet_push_15582 usbhsh_status_stage_packet_push 0 15582 NULL ++notify_recv_pre_dequeue_15583 notify_recv_pre_dequeue 0 15583 NULL ++show_tcpRtoMax_15584 show_tcpRtoMax 0 15584 NULL ++vme_user_write_15587 vme_user_write 3 15587 NULL ++permission_15588 permission 0 15588 NULL ++adt7x10_show_alarm_15602 adt7x10_show_alarm 0 15602 NULL ++nes_store_flash_cmd_15603 nes_store_flash_cmd 0-3 15603 NULL ++x1205_get_datetime_15608 x1205_get_datetime 0 15608 NULL ++i40evf_request_traffic_irqs_15610 i40evf_request_traffic_irqs 0 15610 NULL ++wusb_chid_show_15613 wusb_chid_show 0 15613 NULL nohasharray ++sdev_show_rev_15613 sdev_show_rev 0 15613 &wusb_chid_show_15613 ++kxcjk1013_data_rdy_trigger_set_state_15617 kxcjk1013_data_rdy_trigger_set_state 0 15617 NULL ++mic_map_15618 mic_map 0-2 15618 NULL ++store_rtap_iface_15620 store_rtap_iface 0-4 15620 NULL ++pci_user_read_config_dword_15624 pci_user_read_config_dword 0 15624 NULL ++dsp_cmx_send_member_15625 dsp_cmx_send_member 2 15625 NULL ++ubifs_add_bud_to_log_15628 ubifs_add_bud_to_log 0 15628 NULL ++proc_loginuid_read_15631 proc_loginuid_read 3-0 15631 NULL ++authorized_show_15636 authorized_show 0 15636 NULL ++fill_func_15640 fill_func 0 15640 NULL ++bonding_show_xmit_hash_15641 bonding_show_xmit_hash 0 15641 NULL ++tomoyo_scan_bprm_15642 tomoyo_scan_bprm 4-2 15642 NULL nohasharray ++pipeline_hs_tx_stat_fifo_int_read_15642 pipeline_hs_tx_stat_fifo_int_read 3-0 15642 &tomoyo_scan_bprm_15642 ++joydev_handle_JSIOCSBTNMAP_15643 joydev_handle_JSIOCSBTNMAP 3 15643 NULL ++mgmt_exec_nonemb_cmd_15644 mgmt_exec_nonemb_cmd 0 15644 NULL ++fs_path_add_15648 fs_path_add 3 15648 NULL ++__do_readpage_15652 __do_readpage 0 15652 NULL ++xsd_read_15653 xsd_read 3-0 15653 NULL ++compat_sys_fcntl_15654 compat_sys_fcntl 3 15654 NULL ++show_attr_powered_15658 show_attr_powered 0 15658 NULL ++elan_i2c_read_block_15663 elan_i2c_read_block 0 15663 NULL ++store_15665 store 0-3 15665 NULL ++unix_bind_15668 unix_bind 3-0 15668 NULL ++idetape_init_rw_15671 idetape_init_rw 0 15671 NULL ++snd_korg1212_ioctl_15674 snd_korg1212_ioctl 0 15674 NULL nohasharray ++SyS_connect_15674 SyS_connect 3 15674 &snd_korg1212_ioctl_15674 nohasharray ++dm_read_15674 dm_read 3 15674 &SyS_connect_15674 ++snd_usb_caiaq_pcm_trigger_15684 snd_usb_caiaq_pcm_trigger 0 15684 NULL ++qib_diagpkt_write_15685 qib_diagpkt_write 0-3 15685 NULL ++ndo_open_15687 ndo_open 0 15687 NULL ++psmouse_attr_show_protocol_15693 psmouse_attr_show_protocol 0 15693 NULL ++uinput_str_to_user_15695 uinput_str_to_user 3 15695 NULL nohasharray ++spidev_read_15695 spidev_read 0-3 15695 &uinput_str_to_user_15695 ++show_sas_expander_product_rev_15701 show_sas_expander_product_rev 0 15701 NULL ++suspend_hi_store_15706 suspend_hi_store 0-3 15706 NULL ++s6e63m0_sysfs_store_gamma_mode_15708 s6e63m0_sysfs_store_gamma_mode 0-4 15708 NULL ++as3722_irq_get_virq_15718 as3722_irq_get_virq 2 15718 NULL ++tracing_snapshot_write_15719 tracing_snapshot_write 3 15719 NULL ++rio_request_inb_dbell_15726 rio_request_inb_dbell 0 15726 NULL ++pinctrl_utils_reserve_map_15730 pinctrl_utils_reserve_map 5 15730 NULL nohasharray ++btrfs_writepage_15730 btrfs_writepage 0 15730 &pinctrl_utils_reserve_map_15730 ++acpi_ex_setup_region_15734 acpi_ex_setup_region 0 15734 NULL ++ea_alloc_skeleton_15736 ea_alloc_skeleton 0 15736 NULL ++__tree_mod_log_insert_15744 __tree_mod_log_insert 0 15744 NULL ++HiSax_readstatus_15752 HiSax_readstatus 2 15752 NULL nohasharray ++rcar_i2c_bus_barrier_15752 rcar_i2c_bus_barrier 0 15752 &HiSax_readstatus_15752 ++ufs_update_inode_15753 ufs_update_inode 0 15753 NULL ++array_state_show_15758 array_state_show 0 15758 NULL ++bitmap_search_next_usable_block_15762 bitmap_search_next_usable_block 0-1-3 15762 NULL ++thermal_get_temp_15766 thermal_get_temp 0 15766 NULL nohasharray ++do_test_15766 do_test 1 15766 &thermal_get_temp_15766 ++fuse_direct_read_15768 fuse_direct_read 0-3 15768 NULL ++isl1208_i2c_get_atr_15771 isl1208_i2c_get_atr 0 15771 NULL nohasharray ++chunksize_store_15771 chunksize_store 0-3 15771 &isl1208_i2c_get_atr_15771 ++corb_send_verb_15777 corb_send_verb 0 15777 NULL ++ipr_write_dump_15780 ipr_write_dump 0-6-5 15780 NULL ++call_modprobe_15781 call_modprobe 0 15781 NULL ++rj54n1_commit_15787 rj54n1_commit 0 15787 NULL nohasharray ++usbdev_notify_15787 usbdev_notify 0 15787 &rj54n1_commit_15787 ++scsi_prot_sg_count_15789 scsi_prot_sg_count 0 15789 NULL ++iscsi_stat_logout_show_attr_normal_logouts_15790 iscsi_stat_logout_show_attr_normal_logouts 0 15790 NULL ++i915_gem_init_seqno_15793 i915_gem_init_seqno 0 15793 NULL ++eem_opts_dev_addr_store_15800 eem_opts_dev_addr_store 0-3 15800 NULL ++smk_read_direct_15803 smk_read_direct 3-0 15803 NULL ++keyboard_notifier_call_15804 keyboard_notifier_call 0 15804 NULL ++intel_rng_init_15805 intel_rng_init 0 15805 NULL ++sysfs_show_current_clocksources_15807 sysfs_show_current_clocksources 0 15807 NULL ++gsmi_clear_eventlog_store_15814 gsmi_clear_eventlog_store 0-4 15814 NULL ++gx1_read_conf_reg_15817 gx1_read_conf_reg 0 15817 NULL nohasharray ++nameseq_list_15817 nameseq_list 3-0 15817 &gx1_read_conf_reg_15817 nohasharray ++gnttab_expand_15817 gnttab_expand 1 15817 &nameseq_list_15817 ++snd_seq_ioctl_set_port_info_15819 snd_seq_ioctl_set_port_info 0 15819 NULL ++afs_proc_rootcell_write_15822 afs_proc_rootcell_write 3-0 15822 NULL ++ql_start_tx_ring_15823 ql_start_tx_ring 0 15823 NULL ++tps65912_reg_read_15825 tps65912_reg_read 0 15825 NULL ++s5p_jpeg_queue_setup_15831 s5p_jpeg_queue_setup 0 15831 NULL ++i40e_configure_rx_ring_15835 i40e_configure_rx_ring 0 15835 NULL ++read_reg_15838 read_reg 0 15838 NULL ++nilfs_dev_free_blocks_show_15843 nilfs_dev_free_blocks_show 0 15843 NULL ++p54_setup_mac_15852 p54_setup_mac 0 15852 NULL ++write_file_tx99_15856 write_file_tx99 3-0 15856 NULL ++iscsi_stat_instance_show_attr_max_ver_15860 iscsi_stat_instance_show_attr_max_ver 0 15860 NULL ++recovery_start_store_15862 recovery_start_store 0-3 15862 NULL ++errors_show_15863 errors_show 0 15863 NULL nohasharray ++show_ipv6_iface_router_addr_15863 show_ipv6_iface_router_addr 0 15863 &errors_show_15863 ++acpi_sleep_prepare_15866 acpi_sleep_prepare 0 15866 NULL ++block_write_full_page_15868 block_write_full_page 0 15868 NULL ++media_entity_init_15870 media_entity_init 4-2 15870 NULL nohasharray ++ubi_io_write_15870 ubi_io_write 5-4-0 15870 &media_entity_init_15870 ++set_in_min_15872 set_in_min 0-4 15872 NULL ++__mptctl_ioctl_15875 __mptctl_ioctl 2 15875 NULL ++afs_vnode_fetch_data_15877 afs_vnode_fetch_data 0 15877 NULL ++show_dock_state_15881 show_dock_state 0 15881 NULL nohasharray ++show_temp_alarm_15881 show_temp_alarm 0 15881 &show_dock_state_15881 nohasharray ++partition_id_show_15881 partition_id_show 0 15881 &show_temp_alarm_15881 ++do_truncation_15882 do_truncation 0 15882 NULL ++hwahc_op_urb_enqueue_15883 hwahc_op_urb_enqueue 0 15883 NULL ++m5602_write_bridge_15886 m5602_write_bridge 0 15886 NULL ++usbhid_output_report_15891 usbhid_output_report 0 15891 NULL ++raid5_show_preread_threshold_15892 raid5_show_preread_threshold 0 15892 NULL ++sp_set_mac_address_15899 sp_set_mac_address 0 15899 NULL ++show_spi_transport_qas_15902 show_spi_transport_qas 0 15902 NULL nohasharray ++sctp_apply_peer_addr_params_15902 sctp_apply_peer_addr_params 0 15902 &show_spi_transport_qas_15902 ++host_control_action_store_15906 host_control_action_store 0-4 15906 NULL ++send_tx_power_15914 send_tx_power 0 15914 NULL ++alc_build_controls_15918 alc_build_controls 0 15918 NULL ++hid_hw_power_15921 hid_hw_power 0 15921 NULL ++erst_exec_store_var1_15933 erst_exec_store_var1 0 15933 NULL ++wm5100_gpio_direction_in_15934 wm5100_gpio_direction_in 0 15934 NULL ++tda18218_wr_regs_15935 tda18218_wr_regs 0 15935 NULL ++power_read_15939 power_read 3-0 15939 NULL ++hfs_listxattr_15946 hfs_listxattr 0-3 15946 NULL nohasharray ++sirdev_open_15946 sirdev_open 0 15946 &hfs_listxattr_15946 ++lpfc_idiag_drbacc_read_15948 lpfc_idiag_drbacc_read 3-0 15948 NULL ++mwifiex_cmd_mac_control_15949 mwifiex_cmd_mac_control 0 15949 NULL ++snd_pcm_lib_read_transfer_15952 snd_pcm_lib_read_transfer 5 15952 NULL ++memblock_virt_alloc_try_nid_15954 memblock_virt_alloc_try_nid 1 15954 NULL ++i40e_get_phys_port_id_15955 i40e_get_phys_port_id 0 15955 NULL ++mxl5005s_set_params_15963 mxl5005s_set_params 0 15963 NULL ++b43_nphy_op_switch_channel_15964 b43_nphy_op_switch_channel 0 15964 NULL ++remap_pci_mem_15966 remap_pci_mem 1-2 15966 NULL nohasharray ++find_rsb_15966 find_rsb 0 15966 &remap_pci_mem_15966 ++rocker_netdevice_event_15969 rocker_netdevice_event 0 15969 NULL ++usb_autopm_get_interface_async_15970 usb_autopm_get_interface_async 0 15970 NULL nohasharray ++mls_read_range_helper_15970 mls_read_range_helper 0 15970 &usb_autopm_get_interface_async_15970 ++sht15_connection_reset_15973 sht15_connection_reset 0 15973 NULL ++smk_read_ptrace_15974 smk_read_ptrace 3-0 15974 NULL ++rx_queue_attr_show_15978 rx_queue_attr_show 0 15978 NULL ++frame_alloc_15981 frame_alloc 4-0 15981 NULL ++alloc_vm_area_15989 alloc_vm_area 1 15989 NULL ++stir_net_open_15991 stir_net_open 0 15991 NULL ++recv_pre_block_15995 recv_pre_block 0 15995 NULL ++rpm_check_suspend_allowed_15996 rpm_check_suspend_allowed 0 15996 NULL ++vfs_removexattr_16000 vfs_removexattr 0 16000 NULL ++iwlagn_rxon_disconn_16003 iwlagn_rxon_disconn 0 16003 NULL ++period_store_16008 period_store 0-4 16008 NULL ++do_open_16009 do_open 0 16009 NULL ++hdpvr_register_videodev_16010 hdpvr_register_videodev 3 16010 NULL ++crypto_shash_export_16014 crypto_shash_export 0 16014 NULL ++viafb_vt1636_proc_write_16018 viafb_vt1636_proc_write 3-0 16018 NULL ++qlcnic_sysfs_read_esw_config_16022 qlcnic_sysfs_read_esw_config 0-6-5 16022 NULL ++mlx4_qp_reserve_range_16026 mlx4_qp_reserve_range 0-3 16026 NULL nohasharray ++wrmsr_safe_on_cpu_16026 wrmsr_safe_on_cpu 0 16026 &mlx4_qp_reserve_range_16026 ++si476x_core_cmd_agc_status_16027 si476x_core_cmd_agc_status 0 16027 NULL ++got_frame_16028 got_frame 2 16028 NULL ++wl1251_acx_rx_config_16034 wl1251_acx_rx_config 0 16034 NULL ++il3945_tx_reset_16042 il3945_tx_reset 0 16042 NULL ++iscsi_stat_instance_show_attr_fail_rem_name_16045 iscsi_stat_instance_show_attr_fail_rem_name 0 16045 NULL ++show_virtual_16047 show_virtual 0 16047 NULL ++hidp_send_message_16052 hidp_send_message 0-6 16052 NULL ++dccp_recvmsg_16056 dccp_recvmsg 0-4 16056 NULL ++read_file_spectral_period_16057 read_file_spectral_period 3-0 16057 NULL ++SYSC_kexec_file_load_16058 SYSC_kexec_file_load 3 16058 NULL nohasharray ++nf_call_iptables_store_16058 nf_call_iptables_store 4-0 16058 &SYSC_kexec_file_load_16058 ++si5351_msynth_params_address_16062 si5351_msynth_params_address 0-1 16062 NULL ++cp2112_write_req_16068 cp2112_write_req 0-5 16068 NULL ++udf_extend_file_16069 udf_extend_file 0 16069 NULL ++file_has_perm_16070 file_has_perm 0 16070 NULL ++__iscsi_tpg_auth_show_authenticate_target_16071 __iscsi_tpg_auth_show_authenticate_target 0 16071 NULL ++atkbd_attr_show_helper_16073 atkbd_attr_show_helper 0 16073 NULL ++show_modinfo_srcversion_16077 show_modinfo_srcversion 0 16077 NULL ++ext4_bio_write_page_16078 ext4_bio_write_page 0 16078 NULL ++updateSuper_16079 updateSuper 0 16079 NULL ++mt2063_read_16080 mt2063_read 0 16080 NULL ++sctp_setsockopt_disable_fragments_16088 sctp_setsockopt_disable_fragments 0 16088 NULL ++wl1271_acx_tx_power_16092 wl1271_acx_tx_power 0 16092 NULL ++ps2pp_attr_set_smartscroll_16094 ps2pp_attr_set_smartscroll 0-4 16094 NULL ++pb0100_set_gain_16099 pb0100_set_gain 0 16099 NULL ++_ctl_ioc_reset_count_show_16102 _ctl_ioc_reset_count_show 0 16102 NULL ++isr_tx_exch_complete_read_16103 isr_tx_exch_complete_read 3-0 16103 NULL nohasharray ++mwifiex_cmd_802_11d_domain_info_16103 mwifiex_cmd_802_11d_domain_info 0 16103 &isr_tx_exch_complete_read_16103 ++_submit_bh_16106 _submit_bh 0 16106 NULL ++isr_hw_pm_mode_changes_read_16110 isr_hw_pm_mode_changes_read 3-0 16110 NULL nohasharray ++dma_tx_requested_read_16110 dma_tx_requested_read 3-0 16110 &isr_hw_pm_mode_changes_read_16110 nohasharray ++wlcore_raw_write32_16110 wlcore_raw_write32 0 16110 &dma_tx_requested_read_16110 ++goldfish_pipe_error_convert_16111 goldfish_pipe_error_convert 0 16111 NULL nohasharray ++udelay_test_write_16111 udelay_test_write 3 16111 &goldfish_pipe_error_convert_16111 ++iommu_map_mmio_space_16114 iommu_map_mmio_space 1-2 16114 NULL ++wsm_write_mib_16116 wsm_write_mib 4-0 16116 NULL ++target_core_hba_store_attr_hba_mode_16117 target_core_hba_store_attr_hba_mode 0-3 16117 NULL nohasharray ++rd_mem_16117 rd_mem 0 16117 &target_core_hba_store_attr_hba_mode_16117 ++ethoc_change_mtu_16120 ethoc_change_mtu 0 16120 NULL ++mwl8k_cmd_set_post_scan_16121 mwl8k_cmd_set_post_scan 0 16121 NULL ++dn_getname_16122 dn_getname 0 16122 NULL ++gsmi_die_callback_16123 gsmi_die_callback 0 16123 NULL ++snmp_conntrack_help_16126 snmp_conntrack_help 0 16126 NULL ++sysv_statfs_16128 sysv_statfs 0 16128 NULL ++compat_sys_select_16131 compat_sys_select 1 16131 NULL ++fsm_init_16134 fsm_init 2 16134 NULL ++hysdn_rx_netpkt_16136 hysdn_rx_netpkt 3 16136 NULL ++sht21_update_measurements_16143 sht21_update_measurements 0 16143 NULL nohasharray ++cfq_fifo_expire_sync_store_16143 cfq_fifo_expire_sync_store 3-0 16143 &sht21_update_measurements_16143 ++input_register_device_16147 input_register_device 0 16147 NULL ++ext4_xattr_block_get_16148 ext4_xattr_block_get 0 16148 NULL nohasharray ++set_port1_16148 set_port1 0-4 16148 &ext4_xattr_block_get_16148 ++hidp_send_intr_message_16150 hidp_send_intr_message 0-4 16150 NULL ++lpfc_vportnum_show_16152 lpfc_vportnum_show 0 16152 NULL ++ext4_read_inline_data_16156 ext4_read_inline_data 0-3 16156 NULL ++queues_show_16159 queues_show 0 16159 NULL nohasharray ++usb2_lpm_besl_store_16159 usb2_lpm_besl_store 0-4 16159 &queues_show_16159 nohasharray ++mgmt_device_found_16159 mgmt_device_found 9-11 16159 &usb2_lpm_besl_store_16159 ++pn_header_create_16161 pn_header_create 0 16161 NULL nohasharray ++__hw_addr_create_ex_16161 __hw_addr_create_ex 0 16161 &pn_header_create_16161 ++osd_finalize_request_16163 osd_finalize_request 0 16163 NULL ++bnx2i_get_cid_num_16166 bnx2i_get_cid_num 0 16166 NULL ++sdev_show_timeout_16167 sdev_show_timeout 0 16167 NULL nohasharray ++nfcwilink_skb_alloc_16167 nfcwilink_skb_alloc 1 16167 &sdev_show_timeout_16167 ++iscsi_stat_tgt_attr_show_attr_login_fails_16172 iscsi_stat_tgt_attr_show_attr_login_fails 0 16172 NULL ++dst_output_sk_16174 dst_output_sk 0 16174 NULL ++show_beep_enable_16177 show_beep_enable 0 16177 NULL ++show_tcpCurrEstab_16188 show_tcpCurrEstab 0 16188 NULL ++megaraid_sysfs_show_ldnum_16189 megaraid_sysfs_show_ldnum 0 16189 NULL nohasharray ++ovl_dir_fsync_16189 ovl_dir_fsync 0 16189 &megaraid_sysfs_show_ldnum_16189 ++i40e_allocate_virt_mem_d_16191 i40e_allocate_virt_mem_d 3 16191 NULL nohasharray ++rcu_oom_notify_16191 rcu_oom_notify 0 16191 &i40e_allocate_virt_mem_d_16191 ++musb_vbus_show_16194 musb_vbus_show 0 16194 NULL ++cipso_v4_map_cat_rng_hton_16203 cipso_v4_map_cat_rng_hton 0 16203 NULL ++m5602_read_sensor_16209 m5602_read_sensor 0 16209 NULL ++bind_16210 bind 0 16210 NULL nohasharray ++SyS_pselect6_16210 SyS_pselect6 1 16210 &bind_16210 ++create_table_16213 create_table 2 16213 NULL ++patch_stac927x_16218 patch_stac927x 0 16218 NULL ++si476x_core_send_command_16219 si476x_core_send_command 4-6-0 16219 NULL nohasharray ++hdaps_calibrate_show_16219 hdaps_calibrate_show 0 16219 &si476x_core_send_command_16219 nohasharray ++ps_get_cur_chrage_cntl_limit_16219 ps_get_cur_chrage_cntl_limit 0 16219 &hdaps_calibrate_show_16219 ++sysfs_mbox_write_16220 sysfs_mbox_write 0-6-5 16220 NULL ++set_fan_max_16221 set_fan_max 0-4 16221 NULL ++sock_no_getname_16223 sock_no_getname 0 16223 NULL ++ath9k_hw_ar9287_dump_eeprom_16224 ath9k_hw_ar9287_dump_eeprom 4-5-0 16224 NULL ++atomic_read_file_16227 atomic_read_file 3-0 16227 NULL ++cc770_open_16228 cc770_open 0 16228 NULL ++mlx4_en_get_phys_port_id_16231 mlx4_en_get_phys_port_id 0 16231 NULL ++r6040_up_16233 r6040_up 0 16233 NULL ++wl12xx_cmd_set_peer_state_16234 wl12xx_cmd_set_peer_state 0 16234 NULL ++nmi_timer_cpu_notifier_16236 nmi_timer_cpu_notifier 0 16236 NULL ++pep_setsockopt_16241 pep_setsockopt 0 16241 NULL ++update_mctime_16242 update_mctime 0 16242 NULL ++ds1390_read_time_16244 ds1390_read_time 0 16244 NULL ++max8998_write_reg_16245 max8998_write_reg 0 16245 NULL ++btrfs_dev_extent_chunk_offset_16247 btrfs_dev_extent_chunk_offset 0 16247 NULL nohasharray ++i40e_dbg_dump_read_16247 i40e_dbg_dump_read 3-0 16247 &btrfs_dev_extent_chunk_offset_16247 nohasharray ++scm_send_16247 scm_send 0 16247 &i40e_dbg_dump_read_16247 ++il_dbgfs_disable_ht40_write_16249 il_dbgfs_disable_ht40_write 3-0 16249 NULL ++show_xoffset_16251 show_xoffset 0 16251 NULL ++__apei_exec_write_register_16253 __apei_exec_write_register 0 16253 NULL nohasharray ++do_shrink_16253 do_shrink 0 16253 &__apei_exec_write_register_16253 nohasharray ++netlink_setsockopt_16253 netlink_setsockopt 0 16253 &do_shrink_16253 ++SyS_fgetxattr_16254 SyS_fgetxattr 4 16254 NULL ++saa7164_api_i2c_read_16257 saa7164_api_i2c_read 0 16257 NULL ++reiserfs_acl_count_16265 reiserfs_acl_count 0-1 16265 NULL nohasharray ++evm_inode_setxattr_16265 evm_inode_setxattr 0 16265 &reiserfs_acl_count_16265 ++ath10k_wmi_peer_set_param_16266 ath10k_wmi_peer_set_param 0 16266 NULL ++wacom_button_image_store_16269 wacom_button_image_store 0-4 16269 NULL ++snd_ali_trigger_16277 snd_ali_trigger 0 16277 NULL ++nand_bch_init_16280 nand_bch_init 3-2 16280 NULL ++ims_pcu_ofn_reg_addr_show_16282 ims_pcu_ofn_reg_addr_show 0 16282 NULL nohasharray ++iscsi_tpg_param_store_OFMarkInt_16282 iscsi_tpg_param_store_OFMarkInt 0-3 16282 &ims_pcu_ofn_reg_addr_show_16282 ++account_16283 account 0-4-2 16283 NULL nohasharray ++mirror_status_16283 mirror_status 5 16283 &account_16283 ++regcache_rbtree_insert_to_block_16285 regcache_rbtree_insert_to_block 3-4-0 16285 NULL nohasharray ++rfcomm_sock_getname_16285 rfcomm_sock_getname 0 16285 ®cache_rbtree_insert_to_block_16285 nohasharray ++reclaim_account_show_16285 reclaim_account_show 0 16285 &rfcomm_sock_getname_16285 ++jumpshot_read_data_16287 jumpshot_read_data 4 16287 NULL nohasharray ++show_analog_out_reg_16287 show_analog_out_reg 0 16287 &jumpshot_read_data_16287 ++bh1770_power_state_store_16288 bh1770_power_state_store 0-4 16288 NULL ++snd_als4000_capture_trigger_16290 snd_als4000_capture_trigger 0 16290 NULL ++stk_allocate_buffers_16291 stk_allocate_buffers 2 16291 NULL ++sha1_ssse3_update_16293 sha1_ssse3_update 0 16293 NULL ++adis16136_set_freq_16295 adis16136_set_freq 0 16295 NULL ++snd_at73c213_pcm_trigger_16297 snd_at73c213_pcm_trigger 0 16297 NULL nohasharray ++SyS_send_16297 SyS_send 3 16297 &snd_at73c213_pcm_trigger_16297 ++pyra_sysfs_write_profile_buttons_16301 pyra_sysfs_write_profile_buttons 0-6-5 16301 NULL ++fore200e_setsockopt_16304 fore200e_setsockopt 0 16304 NULL ++ipr_show_resource_path_16307 ipr_show_resource_path 0 16307 NULL ++show_ipv4_iface_dhcp_use_vendor_id_en_16308 show_ipv4_iface_dhcp_use_vendor_id_en 0 16308 NULL ++ixgbe_setup_fcoe_ddp_resources_16311 ixgbe_setup_fcoe_ddp_resources 0 16311 NULL ++ds1511_nvram_write_16312 ds1511_nvram_write 0-6-5 16312 NULL ++bonding_show_arp_validate_16313 bonding_show_arp_validate 0 16313 NULL ++of_property_read_string_helper_16314 of_property_read_string_helper 0-5 16314 NULL ++ar5523_cmd_16318 ar5523_cmd 0 16318 NULL ++do_set_pwm_16320 do_set_pwm 0 16320 NULL ++snd_bt87x_prepare_16323 snd_bt87x_prepare 0 16323 NULL ++enable_periodic_16329 enable_periodic 0 16329 NULL ++vmw_cursor_update_image_16332 vmw_cursor_update_image 4-3 16332 NULL ++show_ipOutBcastPkts_16333 show_ipOutBcastPkts 0 16333 NULL ++acpi_power_get_list_state_16334 acpi_power_get_list_state 0 16334 NULL nohasharray ++show_conn_param_ISCSI_PARAM_HDRDGST_EN_16334 show_conn_param_ISCSI_PARAM_HDRDGST_EN 0 16334 &acpi_power_get_list_state_16334 ++iptable_nat_ipv4_local_fn_16340 iptable_nat_ipv4_local_fn 0 16340 NULL ++host_store_rescan_16343 host_store_rescan 0-4 16343 NULL ++rcar_thermal_get_trip_type_16349 rcar_thermal_get_trip_type 0 16349 NULL ++cx231xx_i2c_xfer_16353 cx231xx_i2c_xfer 0-3 16353 NULL ++crypto_pcomp_extsize_16357 crypto_pcomp_extsize 0 16357 NULL ++tps80031_update_16360 tps80031_update 0 16360 NULL nohasharray ++sysfs_create_groups_16360 sysfs_create_groups 0 16360 &tps80031_update_16360 ++snd_cs46xx_capture_trigger_16362 snd_cs46xx_capture_trigger 0 16362 NULL ++total_ps_buffered_read_16365 total_ps_buffered_read 3-0 16365 NULL nohasharray ++be_cmd_mac_addr_query_16365 be_cmd_mac_addr_query 0 16365 &total_ps_buffered_read_16365 ++rbd_add_16366 rbd_add 0-3 16366 NULL ++rtl92ee_hw_init_16367 rtl92ee_hw_init 0 16367 NULL ++acpi_device_adr_show_16370 acpi_device_adr_show 0 16370 NULL ++set_max_uA_16374 set_max_uA 0-4 16374 NULL ++socket_post_create_16376 socket_post_create 0 16376 NULL nohasharray ++iscsi_tcp_conn_setup_16376 iscsi_tcp_conn_setup 2 16376 &socket_post_create_16376 ++wl1251_hw_init_tx_queue_config_16381 wl1251_hw_init_tx_queue_config 0 16381 NULL ++show_ipInBcastPkts_16384 show_ipInBcastPkts 0 16384 NULL ++rmd160_init_16389 rmd160_init 0 16389 NULL ++rate_ctrl_alg_read_16394 rate_ctrl_alg_read 3-0 16394 NULL nohasharray ++nilfs_palloc_get_entry_block_16394 nilfs_palloc_get_entry_block 0 16394 &rate_ctrl_alg_read_16394 ++l2cap_add_scid_16395 l2cap_add_scid 0 16395 NULL ++lio_target_nacl_show_tag_16400 lio_target_nacl_show_tag 0 16400 NULL ++isl29003_show_range_16402 isl29003_show_range 0 16402 NULL ++diva_os_malloc_16406 diva_os_malloc 2 16406 NULL nohasharray ++ath10k_pci_diag_read_mem_16406 ath10k_pci_diag_read_mem 0 16406 &diva_os_malloc_16406 ++crypto_ahash_final_16410 crypto_ahash_final 0 16410 NULL nohasharray ++xfs_file_fsync_16410 xfs_file_fsync 0 16410 &crypto_ahash_final_16410 ++iwl_dbgfs_prph_reg_write_16411 iwl_dbgfs_prph_reg_write 0-3 16411 NULL ++iio_device_add_event_16412 iio_device_add_event 0 16412 NULL ++roccat_common2_sysfs_read_actual_profile_16414 roccat_common2_sysfs_read_actual_profile 0-5-6 16414 NULL ++w1_slave_show_16415 w1_slave_show 0 16415 NULL nohasharray ++patch_alc861vd_16415 patch_alc861vd 0 16415 &w1_slave_show_16415 ++fill_buffer_16418 fill_buffer 0 16418 NULL ++xfs_btree_check_block_16419 xfs_btree_check_block 0 16419 NULL ++ieee80211_if_read_tsf_16420 ieee80211_if_read_tsf 3-0 16420 NULL ++mptsas_phy_reset_16421 mptsas_phy_reset 0 16421 NULL ++acpiindex_show_16422 acpiindex_show 0 16422 NULL ++format_nservers_16426 format_nservers 0 16426 NULL ++nilfs_bmap_insert_16430 nilfs_bmap_insert 0 16430 NULL ++rxrpc_server_keyring_16431 rxrpc_server_keyring 3-0 16431 NULL ++__bio_add_page_16435 __bio_add_page 0-4 16435 NULL ++kvaser_usb_send_msg_16436 kvaser_usb_send_msg 0 16436 NULL ++tps6507x_pmic_enable_16438 tps6507x_pmic_enable 0 16438 NULL ++cmdline_store_16442 cmdline_store 4-0 16442 NULL ++do_uevent_16445 do_uevent 0 16445 NULL ++security_sb_statfs_16448 security_sb_statfs 0 16448 NULL ++calculate_inocache_hashsize_16449 calculate_inocache_hashsize 0-1 16449 NULL ++blk_mq_sysfs_completed_show_16454 blk_mq_sysfs_completed_show 0 16454 NULL nohasharray ++atm_init_aal0_16454 atm_init_aal0 0 16454 &blk_mq_sysfs_completed_show_16454 ++netlink_change_ngroups_16457 netlink_change_ngroups 2 16457 NULL ++req_capsule_get_size_16467 req_capsule_get_size 0 16467 NULL ++snd_virmidi_dev_register_16470 snd_virmidi_dev_register 0 16470 NULL ++sock_wmalloc_16472 sock_wmalloc 2 16472 NULL ++videobuf_iolock_16478 videobuf_iolock 0 16478 NULL ++max8925_is_enabled_16479 max8925_is_enabled 0 16479 NULL ++uhci_urb_enqueue_16485 uhci_urb_enqueue 0 16485 NULL ++store_line1_16491 store_line1 4-0 16491 NULL ++tracing_readme_read_16493 tracing_readme_read 3 16493 NULL ++ovl_getxattr_16494 ovl_getxattr 0 16494 NULL nohasharray ++ufshcd_scale_clks_16494 ufshcd_scale_clks 0 16494 &ovl_getxattr_16494 ++validate_request_16496 validate_request 0 16496 NULL ++tomoyo_inode_getattr_16497 tomoyo_inode_getattr 0 16497 NULL ++bmp085_update_raw_temperature_16500 bmp085_update_raw_temperature 0 16500 NULL ++ecryptfs_get_tfm_and_mutex_for_cipher_name_16503 ecryptfs_get_tfm_and_mutex_for_cipher_name 0 16503 NULL ++sfe4001_poweron_16505 sfe4001_poweron 0 16505 NULL ++filemap_write_and_wait_16506 filemap_write_and_wait 0 16506 NULL ++page_ext_callback_16510 page_ext_callback 0 16510 NULL ++capi_read_16511 capi_read 0-3 16511 NULL ++ubifs_gc_end_commit_16518 ubifs_gc_end_commit 0 16518 NULL ++bad_file_aio_read_16523 bad_file_aio_read 0 16523 NULL ++ath10k_htc_wait_target_16526 ath10k_htc_wait_target 0 16526 NULL ++snd_interval_max_16529 snd_interval_max 0 16529 NULL nohasharray ++snd_seq_client_enqueue_event_16529 snd_seq_client_enqueue_event 0 16529 &snd_interval_max_16529 ++ahash_save_req_16534 ahash_save_req 0 16534 NULL ++qib_user_sdma_queue_pkts_16536 qib_user_sdma_queue_pkts 0 16536 NULL ++raid10_resize_16537 raid10_resize 2-0 16537 NULL ++date_show_16538 date_show 0 16538 NULL ++b43_dma_set_mask_16540 b43_dma_set_mask 0 16540 NULL nohasharray ++adp8870_bl_l2_bright_max_store_16540 adp8870_bl_l2_bright_max_store 4-0 16540 &b43_dma_set_mask_16540 ++timekeeping_suspend_16546 timekeeping_suspend 0 16546 NULL ++usb_8dev_open_16548 usb_8dev_open 0 16548 NULL ++ad799x_write_frequency_16549 ad799x_write_frequency 0-4 16549 NULL ++fuse_listxattr_16550 fuse_listxattr 0-3 16550 NULL ++nfc_llcp_send_snl_sdres_16557 nfc_llcp_send_snl_sdres 3 16557 NULL ++dib0700_i2c_xfer_16559 dib0700_i2c_xfer 0-3 16559 NULL ++tcp_manip_pkt_16563 tcp_manip_pkt 4 16563 NULL ++wcn36xx_dxe_init_16565 wcn36xx_dxe_init 0 16565 NULL ++lpfc_debugfs_read_16566 lpfc_debugfs_read 3-0 16566 NULL ++transmit_skb_16573 transmit_skb 0 16573 NULL ++agp_allocate_memory_wrap_16576 agp_allocate_memory_wrap 1 16576 NULL ++set_attr_rdpmc_16581 set_attr_rdpmc 0-4 16581 NULL ++psend_16586 psend 0 16586 NULL ++lustre_msg_hdr_size_v2_16589 lustre_msg_hdr_size_v2 0 16589 NULL ++efx_net_open_16592 efx_net_open 0 16592 NULL ++ncp_file_read_16593 ncp_file_read 0-3 16593 NULL ++nilfs_sufile_get_stat_16597 nilfs_sufile_get_stat 0 16597 NULL ++make_lsave_dirty_16600 make_lsave_dirty 0 16600 NULL ++target_core_hba_attr_show_16601 target_core_hba_attr_show 0 16601 NULL nohasharray ++iscsi_stat_sess_attr_store_16601 iscsi_stat_sess_attr_store 0 16601 &target_core_hba_attr_show_16601 ++ixgbe_setup_all_tx_resources_16602 ixgbe_setup_all_tx_resources 0 16602 NULL ++set_analog_out_reg_16611 set_analog_out_reg 0-4 16611 NULL ++pptp_inbound_pkt_16613 pptp_inbound_pkt 0 16613 NULL nohasharray ++palmas_irq_get_virq_16613 palmas_irq_get_virq 2 16613 &pptp_inbound_pkt_16613 ++compat_SyS_migrate_pages_16618 compat_SyS_migrate_pages 2 16618 NULL ++show_mem_start_phys_index_16622 show_mem_start_phys_index 0 16622 NULL ++s5k83a_s_ctrl_16628 s5k83a_s_ctrl 0 16628 NULL nohasharray ++_xadc_read_adc_reg_16628 _xadc_read_adc_reg 0 16628 &s5k83a_s_ctrl_16628 ++tuner_i2c_xfer_send_16629 tuner_i2c_xfer_send 0-3 16629 NULL ++__wait_on_bit_lock_16630 __wait_on_bit_lock 0 16630 NULL ++strict_store_16631 strict_store 0-3 16631 NULL ++rtw_set_wpa_ie_16633 rtw_set_wpa_ie 3 16633 NULL ++orinoco_hw_program_rids_16634 orinoco_hw_program_rids 0 16634 NULL ++display_crc_ctl_parse_16635 display_crc_ctl_parse 0 16635 NULL ++led_delay_on_show_16640 led_delay_on_show 0 16640 NULL ++__sha512_ssse3_update_16646 __sha512_ssse3_update 0 16646 NULL ++iwl_pcie_load_section_16647 iwl_pcie_load_section 0 16647 NULL ++pm8001_ctl_fatal_log_show_16650 pm8001_ctl_fatal_log_show 0 16650 NULL ++btrfs_get_token_32_16651 btrfs_get_token_32 0 16651 NULL ++nes_netdev_set_mac_address_16657 nes_netdev_set_mac_address 0 16657 NULL ++__add_to_page_cache_locked_16659 __add_to_page_cache_locked 0 16659 NULL ++ims_pcu_ofn_reg_data_show_16664 ims_pcu_ofn_reg_data_show 0 16664 NULL ++phy_read_mmd_indirect_16665 phy_read_mmd_indirect 0 16665 NULL ++store_remote_port_16666 store_remote_port 0 16666 NULL ++mfd_add_devices_16668 mfd_add_devices 4 16668 NULL ++ax88179_write_cmd_async_16671 ax88179_write_cmd_async 5 16671 NULL ++hash_elasticity_store_16673 hash_elasticity_store 4-0 16673 NULL ++smsc_ircc_net_open_16680 smsc_ircc_net_open 0 16680 NULL ++da9052_reg_write_16685 da9052_reg_write 0 16685 NULL ++t4_set_rxmode_16689 t4_set_rxmode 0 16689 NULL ++drbd_drain_block_16697 drbd_drain_block 2 16697 NULL ++__wa_populate_dto_urb_16699 __wa_populate_dto_urb 3-4-0 16699 NULL ++follow_automount_16700 follow_automount 0 16700 NULL ++_iwl_dbgfs_bt_force_ant_write_16701 _iwl_dbgfs_bt_force_ant_write 3-0 16701 NULL ++gadget_dev_desc_bcdDevice_store_16702 gadget_dev_desc_bcdDevice_store 0-3 16702 NULL nohasharray ++store_simple_pwm_16702 store_simple_pwm 0-4 16702 &gadget_dev_desc_bcdDevice_store_16702 ++dlm_recover_nodeid_show_16709 dlm_recover_nodeid_show 0 16709 NULL nohasharray ++ath5k_attr_store_cck_weak_signal_detection_16709 ath5k_attr_store_cck_weak_signal_detection 0-4 16709 &dlm_recover_nodeid_show_16709 ++ndisc_netdev_event_16711 ndisc_netdev_event 0 16711 NULL ++__proc_lnet_buffers_16717 __proc_lnet_buffers 5 16717 NULL ++show_counter_rx_p0_hdr_egr_ovfls_16725 show_counter_rx_p0_hdr_egr_ovfls 0 16725 NULL nohasharray ++store_instr_16725 store_instr 0 16725 &show_counter_rx_p0_hdr_egr_ovfls_16725 ++sky2_alloc_rx_skbs_16726 sky2_alloc_rx_skbs 0 16726 NULL ++xfs_attr3_leaf_create_16728 xfs_attr3_leaf_create 0 16728 NULL ++ad7877_dac_show_16729 ad7877_dac_show 0 16729 NULL ++_read_reg_16730 _read_reg 0 16730 NULL ++com20020_resume_16732 com20020_resume 0 16732 NULL ++sht21_show_humidity_16735 sht21_show_humidity 0 16735 NULL ++acpi_ds_method_data_get_node_16736 acpi_ds_method_data_get_node 0 16736 NULL ++apds990x_lux_calib_store_16745 apds990x_lux_calib_store 0-4 16745 NULL ++__copy_to_user_swizzled_16748 __copy_to_user_swizzled 3-4 16748 NULL nohasharray ++ubifs_update_one_lp_16748 ubifs_update_one_lp 0 16748 &__copy_to_user_swizzled_16748 ++trackpoint_set_int_attr_16751 trackpoint_set_int_attr 0-4 16751 NULL ++store_tabletStylusUpper_16752 store_tabletStylusUpper 0-4 16752 NULL ++save_mixer_state_16753 save_mixer_state 0 16753 NULL ++mlx4_en_fill_rx_buffers_16755 mlx4_en_fill_rx_buffers 0 16755 NULL nohasharray ++iscsi_recv_pdu_16755 iscsi_recv_pdu 4 16755 &mlx4_en_fill_rx_buffers_16755 ++raid5_show_skip_copy_16760 raid5_show_skip_copy 0 16760 NULL ++offline_16765 offline 0 16765 NULL ++migratepage_16769 migratepage 0 16769 NULL ++blk_rq_map_user_iov_16772 blk_rq_map_user_iov 5 16772 NULL nohasharray ++pvc_setsockopt_16772 pvc_setsockopt 0 16772 &blk_rq_map_user_iov_16772 ++niu_tx_channel_reset_16777 niu_tx_channel_reset 0 16777 NULL ++savagefb_set_par_16780 savagefb_set_par 0 16780 NULL ++generic_write_end_16782 generic_write_end 0-5 16782 NULL ++show_engine_mode_16787 show_engine_mode 0 16787 NULL ++i2o_parm_issue_16790 i2o_parm_issue 0 16790 NULL ++pcf85063_rtc_read_time_16795 pcf85063_rtc_read_time 0 16795 NULL ++rx8025_set_clock_adjust_16798 rx8025_set_clock_adjust 0 16798 NULL ++wl1271_sysfs_store_bt_coex_state_16800 wl1271_sysfs_store_bt_coex_state 0-4 16800 NULL ++sdebug_change_qdepth_16802 sdebug_change_qdepth 0-2 16802 NULL ++get_server_iovec_16804 get_server_iovec 2 16804 NULL ++mc13xxx_irq_request_16806 mc13xxx_irq_request 2 16806 NULL ++calc_sq_size_16810 calc_sq_size 0 16810 NULL nohasharray ++mesh_fwd_csa_frame_16810 mesh_fwd_csa_frame 3 16810 &calc_sq_size_16810 ++rt2x00mac_add_interface_16811 rt2x00mac_add_interface 0 16811 NULL ++dm_vcalloc_16814 dm_vcalloc 2-1 16814 NULL ++mcp251x_spi_trans_16815 mcp251x_spi_trans 0 16815 NULL ++spcp8x5_open_16818 spcp8x5_open 0 16818 NULL ++bAlternateSetting_show_16822 bAlternateSetting_show 0 16822 NULL ++diWrite_16825 diWrite 0 16825 NULL ++drm_malloc_ab_16831 drm_malloc_ab 2-1 16831 NULL ++show_imon_clock_16835 show_imon_clock 0 16835 NULL nohasharray ++scsi_mode_sense_16835 scsi_mode_sense 5 16835 &show_imon_clock_16835 ++avc_has_perm_noaudit_16837 avc_has_perm_noaudit 0 16837 NULL nohasharray ++nilfs_dev_attr_store_16837 nilfs_dev_attr_store 0-4 16837 &avc_has_perm_noaudit_16837 ++full_scans_show_16839 full_scans_show 0 16839 NULL nohasharray ++target_stat_scsi_tgt_port_show_attr_hs_in_cmds_16839 target_stat_scsi_tgt_port_show_attr_hs_in_cmds 0 16839 &full_scans_show_16839 ++csio_t4_edc_read_16841 csio_t4_edc_read 0 16841 NULL ++ad5398_write_reg_16845 ad5398_write_reg 0 16845 NULL ++amd8111e_change_mtu_16846 amd8111e_change_mtu 0 16846 NULL ++qla4_8xxx_sysfs_read_fw_dump_16847 qla4_8xxx_sysfs_read_fw_dump 6-0-5 16847 NULL ++tun_chr_read_iter_16849 tun_chr_read_iter 0 16849 NULL ++invalidate_inode_pages2_16850 invalidate_inode_pages2 0 16850 NULL ++get_pwm_enable_16851 get_pwm_enable 0 16851 NULL ++hfsplus_min_io_size_16859 hfsplus_min_io_size 0 16859 NULL nohasharray ++freeze_super_16859 freeze_super 0 16859 &hfsplus_min_io_size_16859 ++vfio_pci_rw_16861 vfio_pci_rw 0-3 16861 NULL ++__ip_append_data_16864 __ip_append_data 8-9 16864 NULL ++pm8001_queue_command_16867 pm8001_queue_command 0 16867 NULL ++alloc_idx_lebs_16872 alloc_idx_lebs 0-2 16872 NULL ++carl9170_debugfs_ampdu_state_read_16873 carl9170_debugfs_ampdu_state_read 3 16873 NULL ++st_write_16874 st_write 3-0 16874 NULL ++__kfifo_peek_n_16877 __kfifo_peek_n 0 16877 NULL nohasharray ++show_session_param_ISCSI_PARAM_FAST_ABORT_16877 show_session_param_ISCSI_PARAM_FAST_ABORT 0 16877 &__kfifo_peek_n_16877 ++always_connected_16878 always_connected 0 16878 NULL ++tulip_open_16881 tulip_open 0 16881 NULL ++rtl8187b_init_hw_16888 rtl8187b_init_hw 0 16888 NULL ++target_core_alua_tg_pt_gp_store_attr_alua_support_offline_16889 target_core_alua_tg_pt_gp_store_attr_alua_support_offline 0-3 16889 NULL ++xfs_attr_refillstate_16894 xfs_attr_refillstate 0 16894 NULL nohasharray ++megasas_fw_crash_buffer_store_16894 megasas_fw_crash_buffer_store 0-4 16894 &xfs_attr_refillstate_16894 ++xhci_queue_intr_tx_16899 xhci_queue_intr_tx 0 16899 NULL nohasharray ++sitd_submit_16899 sitd_submit 0 16899 &xhci_queue_intr_tx_16899 ++xhci_check_bandwidth_16900 xhci_check_bandwidth 0 16900 NULL ++mt9v022_s_fmt_16903 mt9v022_s_fmt 0 16903 NULL nohasharray ++fotg210_udc_start_16903 fotg210_udc_start 0 16903 &mt9v022_s_fmt_16903 ++__uncore_match_rds_show_16908 __uncore_match_rds_show 0 16908 NULL ++wm8350_set_bits_16911 wm8350_set_bits 0 16911 NULL nohasharray ++sdev_show_evt_mode_parameter_change_reported_16911 sdev_show_evt_mode_parameter_change_reported 0 16911 &wm8350_set_bits_16911 nohasharray ++sd_start_16911 sd_start 0 16911 &sdev_show_evt_mode_parameter_change_reported_16911 nohasharray ++jme_change_mtu_16911 jme_change_mtu 0 16911 &sd_start_16911 ++energy_uj_store_16916 energy_uj_store 0-4 16916 NULL ++rsi_mac80211_sta_add_16920 rsi_mac80211_sta_add 0 16920 NULL ++btrfs_space_info_show_total_bytes_pinned_16924 btrfs_space_info_show_total_bytes_pinned 0 16924 NULL ++psb_unlocked_ioctl_16926 psb_unlocked_ioctl 2 16926 NULL nohasharray ++sha1_init_16926 sha1_init 0 16926 &psb_unlocked_ioctl_16926 nohasharray ++snd_gf1_mem_proc_dump_16926 snd_gf1_mem_proc_dump 5 16926 &sha1_init_16926 ++iwl_trans_pcie_send_hcmd_16933 iwl_trans_pcie_send_hcmd 0 16933 NULL ++__crc32c_intel_finup_16934 __crc32c_intel_finup 0 16934 NULL ++stable_pages_required_show_16935 stable_pages_required_show 0 16935 NULL ++nilfs_segctor_update_payload_blocknr_16940 nilfs_segctor_update_payload_blocknr 0 16940 NULL ++input_polldev_get_min_16941 input_polldev_get_min 0 16941 NULL ++ip_append_data_16942 ip_append_data 5-6 16942 NULL ++vmci_qpair_enqueue_16943 vmci_qpair_enqueue 3 16943 NULL ++_sp2d_alloc_16944 _sp2d_alloc 3-2-1 16944 NULL ++squashfs_read_table_16945 squashfs_read_table 3 16945 NULL ++affs_direct_IO_16946 affs_direct_IO 4-0 16946 NULL ++riic_xfer_16947 riic_xfer 0-3 16947 NULL ++bq2415x_set_battery_regulation_voltage_16953 bq2415x_set_battery_regulation_voltage 0 16953 NULL nohasharray ++pm_freeze_timeout_store_16953 pm_freeze_timeout_store 0-4 16953 &bq2415x_set_battery_regulation_voltage_16953 ++parse_hints_16960 parse_hints 0 16960 NULL ++svcxdr_dupstr_16963 svcxdr_dupstr 3 16963 NULL nohasharray ++max8660_write_16963 max8660_write 0 16963 &svcxdr_dupstr_16963 ++usbdux_firmware_upload_16966 usbdux_firmware_upload 3 16966 NULL ++keyctl_instantiate_key_iov_16969 keyctl_instantiate_key_iov 3 16969 NULL ++lid_show_16974 lid_show 0 16974 NULL nohasharray ++roccat_common2_sysfs_read_stored_lights_16974 roccat_common2_sysfs_read_stored_lights 0-5-6 16974 &lid_show_16974 ++htu21_show_temperature_16981 htu21_show_temperature 0 16981 NULL ++adt7410_i2c_read_word_16994 adt7410_i2c_read_word 0 16994 NULL ++recover_timer_read_16998 recover_timer_read 0 16998 NULL nohasharray ++ieee80211_tdls_build_mgmt_packet_data_16998 ieee80211_tdls_build_mgmt_packet_data 8 16998 &recover_timer_read_16998 ++bnx2fc_cpu_callback_16999 bnx2fc_cpu_callback 0 16999 NULL ++qla2x00_beacon_show_17001 qla2x00_beacon_show 0 17001 NULL ++da9055_read_tjunc_17002 da9055_read_tjunc 0 17002 NULL ++target_fabric_np_base_attr_store_17003 target_fabric_np_base_attr_store 0-4 17003 NULL ++smack_inode_getsecurity_17004 smack_inode_getsecurity 0 17004 NULL nohasharray ++show_phys_device_17004 show_phys_device 0 17004 &smack_inode_getsecurity_17004 nohasharray ++ad7266_update_scan_mode_17004 ad7266_update_scan_mode 0 17004 &show_phys_device_17004 ++ceph_read_dir_17005 ceph_read_dir 3-0 17005 NULL nohasharray ++l2tp_ip_bind_17005 l2tp_ip_bind 0 17005 &ceph_read_dir_17005 nohasharray ++store_hyst_17005 store_hyst 0-4 17005 &l2tp_ip_bind_17005 ++mei_fw_status2str_17009 mei_fw_status2str 3 17009 NULL ++show_dgid_17011 show_dgid 0 17011 NULL ++atk_name_show_17015 atk_name_show 0 17015 NULL ++irda_bind_17016 irda_bind 0 17016 NULL ++rcu_expedited_store_17017 rcu_expedited_store 0-4 17017 NULL ++snd_mask_refine_first_17026 snd_mask_refine_first 0 17026 NULL ++copy_counters_to_user_17027 copy_counters_to_user 5 17027 NULL ++iwl_sta_update_ht_17031 iwl_sta_update_ht 0 17031 NULL ++tg3_load_tso_firmware_17032 tg3_load_tso_firmware 0 17032 NULL ++bl_trig_invert_show_17033 bl_trig_invert_show 0 17033 NULL ++tps65090_fet_enable_17037 tps65090_fet_enable 0 17037 NULL ++C_SYSC_keyctl_17041 C_SYSC_keyctl 4 17041 NULL ++jffs2_trusted_setxattr_17048 jffs2_trusted_setxattr 4-0 17048 NULL nohasharray ++detect_cache_attributes_17048 detect_cache_attributes 0 17048 &jffs2_trusted_setxattr_17048 ++savage_map_video_17053 savage_map_video 2 17053 NULL nohasharray ++rbd_dev_v2_snap_context_17053 rbd_dev_v2_snap_context 0 17053 &savage_map_video_17053 ++smsc95xx_read_reg_17058 smsc95xx_read_reg 0 17058 NULL nohasharray ++store_sockfd_17058 store_sockfd 0-4 17058 &smsc95xx_read_reg_17058 ++__arch_hweight32_17060 __arch_hweight32 0 17060 NULL ++__copy_user_nocache_17065 __copy_user_nocache 0 17065 NULL nohasharray ++rw_write_17065 rw_write 0-6-5 17065 &__copy_user_nocache_17065 ++sh_veu_queue_setup_17066 sh_veu_queue_setup 0 17066 NULL ++sddr55_read_data_17072 sddr55_read_data 4 17072 NULL ++dvb_dvr_read_17073 dvb_dvr_read 3-0 17073 NULL nohasharray ++mxt_load_fw_17073 mxt_load_fw 0 17073 &dvb_dvr_read_17073 ++simple_transaction_read_17076 simple_transaction_read 3-0 17076 NULL ++tpm_transmit_17077 tpm_transmit 0-3 17077 NULL ++__kmalloc_reserve_17080 __kmalloc_reserve 1 17080 NULL ++carl9170_debugfs_mem_usage_read_17084 carl9170_debugfs_mem_usage_read 3 17084 NULL nohasharray ++kovaplus_select_profile_17084 kovaplus_select_profile 0 17084 &carl9170_debugfs_mem_usage_read_17084 ++entry_length_17093 entry_length 0 17093 NULL ++write_reg_17098 write_reg 0 17098 NULL ++sys_preadv_17100 sys_preadv 3 17100 NULL ++block_ue_count_show_17104 block_ue_count_show 0 17104 NULL nohasharray ++show_sas_rphy_phy_identifier_17104 show_sas_rphy_phy_identifier 0 17104 &block_ue_count_show_17104 ++components_show_17105 components_show 0 17105 NULL ++gsm_mux_net_open_17107 gsm_mux_net_open 0 17107 NULL ++r_heartbeat_file_read_17112 r_heartbeat_file_read 0-3 17112 NULL ++md4_final_17113 md4_final 0 17113 NULL ++write_mem_17114 write_mem 3-0 17114 NULL ++disk_range_show_17116 disk_range_show 0 17116 NULL ++iscsi_stat_sess_err_show_attr_inst_17120 iscsi_stat_sess_err_show_attr_inst 0 17120 NULL ++pvr2_hdw_state_report_17121 pvr2_hdw_state_report 3 17121 NULL ++e1000_open_17127 e1000_open 0 17127 NULL ++lpfc_hba_down_link_17129 lpfc_hba_down_link 0 17129 NULL ++mwifiex_get_common_rates_17131 mwifiex_get_common_rates 3 17131 NULL ++emc6w201_write8_17132 emc6w201_write8 0 17132 NULL ++hifn_setup_src_desc_17140 hifn_setup_src_desc 3 17140 NULL ++br_sysfs_renameif_17142 br_sysfs_renameif 0 17142 NULL ++do_blockdev_direct_IO_17143 do_blockdev_direct_IO 0-6 17143 NULL ++nouveau_instobj_create__17144 nouveau_instobj_create_ 4 17144 NULL nohasharray ++video_set_cur_state_17144 video_set_cur_state 0 17144 &nouveau_instobj_create__17144 ++xfs_attr_node_removename_17149 xfs_attr_node_removename 0 17149 NULL ++show_sas_rphy_enclosure_identifier_17150 show_sas_rphy_enclosure_identifier 0 17150 NULL ++jumpshot_write_data_17151 jumpshot_write_data 4 17151 NULL ++o2nm_cluster_attr_keepalive_delay_ms_write_17152 o2nm_cluster_attr_keepalive_delay_ms_write 3-0 17152 NULL ++dapm_widget_show_codec_17153 dapm_widget_show_codec 0 17153 NULL ++genphy_soft_reset_17154 genphy_soft_reset 0 17154 NULL ++mxt_upload_cfg_mem_17157 mxt_upload_cfg_mem 4 17157 NULL ++cciss_show_usage_count_17161 cciss_show_usage_count 0 17161 NULL ++befs_nls2utf_17163 befs_nls2utf 3 17163 NULL ++tx_tx_start_templates_read_17164 tx_tx_start_templates_read 3-0 17164 NULL nohasharray ++smb2_sync_read_17164 smb2_sync_read 0 17164 &tx_tx_start_templates_read_17164 ++vhci_get_user_17165 vhci_get_user 0 17165 NULL ++ceph_vxattrcb_dir_rentries_17167 ceph_vxattrcb_dir_rentries 0 17167 NULL ++UniStrnlen_17169 UniStrnlen 0 17169 NULL nohasharray ++nilfs_dat_mark_dirty_17169 nilfs_dat_mark_dirty 0 17169 &UniStrnlen_17169 ++nilfs_write_begin_17172 nilfs_write_begin 0 17172 NULL nohasharray ++ipoib_dev_init_17172 ipoib_dev_init 0 17172 &nilfs_write_begin_17172 ++fan_set_state_17173 fan_set_state 0 17173 NULL ++l1oip_socket_send_17174 l1oip_socket_send 7 17174 NULL ++ipath_create_user_egr_17175 ipath_create_user_egr 0 17175 NULL ++set_otp2_17177 set_otp2 4-0 17177 NULL ++ds2780_set_pmod_enabled_17185 ds2780_set_pmod_enabled 0-4 17185 NULL ++set_otp2en_17188 set_otp2en 4-0 17188 NULL ++access_remote_vm_17189 access_remote_vm 0 17189 NULL nohasharray ++iwl_dbgfs_txfifo_flush_write_17189 iwl_dbgfs_txfifo_flush_write 3-0 17189 &access_remote_vm_17189 ++show_lut_temp_hyst_17190 show_lut_temp_hyst 0 17190 NULL nohasharray ++store_temp_src_17190 store_temp_src 0-4 17190 &show_lut_temp_hyst_17190 ++driver_state_read_17194 driver_state_read 3-0 17194 NULL nohasharray ++pl2303_set_control_lines_17194 pl2303_set_control_lines 0 17194 &driver_state_read_17194 nohasharray ++e1000_request_irq_17194 e1000_request_irq 0 17194 &pl2303_set_control_lines_17194 nohasharray ++iscsit_find_cmd_from_itt_or_dump_17194 iscsit_find_cmd_from_itt_or_dump 3 17194 &e1000_request_irq_17194 ++regulator_max_uV_show_17198 regulator_max_uV_show 0 17198 NULL ++mergeable_rx_buffer_size_show_17199 mergeable_rx_buffer_size_show 0 17199 NULL nohasharray ++ath10k_core_start_17199 ath10k_core_start 0 17199 &mergeable_rx_buffer_size_show_17199 ++show_pwmctrl_17208 show_pwmctrl 0 17208 NULL nohasharray ++sync_request_17208 sync_request 2 17208 &show_pwmctrl_17208 ++dn_recvmsg_17213 dn_recvmsg 0-4 17213 NULL ++st6422_s_ctrl_17215 st6422_s_ctrl 0 17215 NULL nohasharray ++rtl8150_open_17215 rtl8150_open 0 17215 &st6422_s_ctrl_17215 ++ipath_user_sdma_push_pkts_17221 ipath_user_sdma_push_pkts 0 17221 NULL ++elan_i2c_prepare_fw_update_17228 elan_i2c_prepare_fw_update 0 17228 NULL ++metadata_show_17234 metadata_show 0 17234 NULL ++show_hddtemp_17237 show_hddtemp 0 17237 NULL ++store_fatal_error_17242 store_fatal_error 0-4 17242 NULL ++odev_attr_store_17252 odev_attr_store 0-4 17252 NULL ++r3964_read_17257 r3964_read 0 17257 NULL ++lprocfs_read_frac_helper_17261 lprocfs_read_frac_helper 0 17261 NULL ++error_error_frame_cts_nul_flid_read_17262 error_error_frame_cts_nul_flid_read 3-0 17262 NULL ++pt3_i2c_master_xfer_17264 pt3_i2c_master_xfer 0-3 17264 NULL ++lola_pcm_trigger_17268 lola_pcm_trigger 0 17268 NULL nohasharray ++i8k_hwmon_show_temp_17268 i8k_hwmon_show_temp 0 17268 &lola_pcm_trigger_17268 ++alloc_ep_17269 alloc_ep 1 17269 NULL ++get_locations_17274 get_locations 0 17274 NULL ++bq2415x_get_charge_current_17275 bq2415x_get_charge_current 0 17275 NULL nohasharray ++store_spi_transport_max_offset_17275 store_spi_transport_max_offset 0-4 17275 &bq2415x_get_charge_current_17275 ++pg_read_17276 pg_read 3-0 17276 NULL ++raw_recvmsg_17277 raw_recvmsg 0-4 17277 NULL ++hmac_sha256_17278 hmac_sha256 2 17278 NULL ++aty_var_to_pll_18818_17279 aty_var_to_pll_18818 0 17279 NULL ++neigh_hash_grow_17283 neigh_hash_grow 2 17283 NULL nohasharray ++rpc_pipefs_event_17283 rpc_pipefs_event 0 17283 &neigh_hash_grow_17283 ++mmc_serial_show_17285 mmc_serial_show 0 17285 NULL ++minstrel_stats_read_17290 minstrel_stats_read 3-0 17290 NULL nohasharray ++fmc_set_mute_mode_17290 fmc_set_mute_mode 0 17290 &minstrel_stats_read_17290 ++natsemi_show_dspcfg_workaround_17291 natsemi_show_dspcfg_workaround 0 17291 NULL ++pasid_mask_show_17292 pasid_mask_show 0 17292 NULL nohasharray ++bond_netdev_event_17292 bond_netdev_event 0 17292 &pasid_mask_show_17292 ++shadow_rd08_17293 shadow_rd08 2 17293 NULL ++blk_mq_hw_sysfs_cpus_show_17295 blk_mq_hw_sysfs_cpus_show 0 17295 NULL ++ieee80211_if_fmt_dot11MeshForwarding_17301 ieee80211_if_fmt_dot11MeshForwarding 3 17301 NULL ++skb_pad_17302 skb_pad 2 17302 NULL ++mb_cache_create_17307 mb_cache_create 2 17307 NULL ++qlcnic_alloc_hw_resources_17308 qlcnic_alloc_hw_resources 0 17308 NULL ++saa7706h_set_reg24_err_17312 saa7706h_set_reg24_err 0 17312 NULL nohasharray ++time_cpufreq_notifier_17312 time_cpufreq_notifier 0 17312 &saa7706h_set_reg24_err_17312 ++regmap_bulk_read_17314 regmap_bulk_read 0 17314 NULL nohasharray ++mgt_update_addr_17314 mgt_update_addr 0 17314 ®map_bulk_read_17314 ++read_17315 read 0 17315 NULL nohasharray ++rds_get_mr_for_dest_17315 rds_get_mr_for_dest 0 17315 &read_17315 nohasharray ++attr_set_17315 attr_set 0 17315 &rds_get_mr_for_dest_17315 ++ixgbe_poll_for_ack_17316 ixgbe_poll_for_ack 0 17316 NULL ++mt9m111_reg_clear_17321 mt9m111_reg_clear 0 17321 NULL ++protection_type_show_17322 protection_type_show 0 17322 NULL ++rocker_flow_tbl_do_17325 rocker_flow_tbl_do 0 17325 NULL nohasharray ++ata_host_alloc_pinfo_17325 ata_host_alloc_pinfo 3 17325 &rocker_flow_tbl_do_17325 ++vol_attribute_show_17328 vol_attribute_show 0 17328 NULL nohasharray ++aty128fb_check_var_17328 aty128fb_check_var 0 17328 &vol_attribute_show_17328 ++wiimote_cmd_acquire_17330 wiimote_cmd_acquire 0 17330 NULL ++hfsplus_system_write_inode_17331 hfsplus_system_write_inode 0 17331 NULL ++SYSC_pread64_17337 SYSC_pread64 3 17337 NULL ++max8997_read_reg_17341 max8997_read_reg 0 17341 NULL ++roccat_common2_sysfs_read_profile_settings_17342 roccat_common2_sysfs_read_profile_settings 0-5-6 17342 NULL ++device_suspend_17343 device_suspend 0 17343 NULL ++ieee80211_if_read_dot11MeshHWMPperrMinInterval_17346 ieee80211_if_read_dot11MeshHWMPperrMinInterval 3-0 17346 NULL ++sis900_open_17347 sis900_open 0 17347 NULL nohasharray ++ath6kl_wmi_send_mgmt_cmd_17347 ath6kl_wmi_send_mgmt_cmd 7 17347 &sis900_open_17347 ++nfs_readpage_from_fscache_17356 nfs_readpage_from_fscache 0 17356 NULL ++p54_sta_add_remove_17358 p54_sta_add_remove 0 17358 NULL ++ivtv_set_speed_17377 ivtv_set_speed 0 17377 NULL ++show_pwm_hyst_17380 show_pwm_hyst 0 17380 NULL ++mt2063_lockStatus_17381 mt2063_lockStatus 0 17381 NULL ++processor_get_cur_state_17387 processor_get_cur_state 0 17387 NULL ++comm_local_write_17388 comm_local_write 0-3 17388 NULL ++bh1770_lux_calib_default_show_17391 bh1770_lux_calib_default_show 0 17391 NULL nohasharray ++handle_outgoing_dr_smp_17391 handle_outgoing_dr_smp 0 17391 &bh1770_lux_calib_default_show_17391 ++get_property_17392 get_property 0 17392 NULL nohasharray ++usb_deauthorize_device_17392 usb_deauthorize_device 0 17392 &get_property_17392 ++iscsi_nacl_auth_show_password_17395 iscsi_nacl_auth_show_password 0 17395 NULL ++bfad_im_vport_delete_17400 bfad_im_vport_delete 0 17400 NULL ++snmp6_register_dev_17402 snmp6_register_dev 0 17402 NULL ++ipip_tunnel_init_17407 ipip_tunnel_init 0 17407 NULL ++mdc_import_seq_write_17409 mdc_import_seq_write 3 17409 NULL ++edt_ft5x06_register_write_17413 edt_ft5x06_register_write 0 17413 NULL nohasharray ++i40e_get_eeprom_len_17413 i40e_get_eeprom_len 0 17413 &edt_ft5x06_register_write_17413 ++store_enabled_17417 store_enabled 0 17417 NULL ++ecryptfs_listxattr_17419 ecryptfs_listxattr 0-3 17419 NULL nohasharray ++fwnet_change_mtu_17419 fwnet_change_mtu 0 17419 &ecryptfs_listxattr_17419 ++__acpi_pm_prepare_17423 __acpi_pm_prepare 0 17423 NULL ++lpfc_debugfs_dif_err_write_17424 lpfc_debugfs_dif_err_write 3-0 17424 NULL ++drm_dp_i2c_xfer_17425 drm_dp_i2c_xfer 0-3 17425 NULL nohasharray ++skein256_update_17425 skein256_update 0 17425 &drm_dp_i2c_xfer_17425 ++uart_get_attr_io_type_17427 uart_get_attr_io_type 0 17427 NULL ++compat_sys_ppoll_17430 compat_sys_ppoll 2 17430 NULL ++copy_from_iter_17433 copy_from_iter 0-2 17433 NULL ++sta_connected_time_read_17435 sta_connected_time_read 3-0 17435 NULL nohasharray ++aa_audit_17435 aa_audit 0 17435 &sta_connected_time_read_17435 nohasharray ++sctp_inetaddr_event_17435 sctp_inetaddr_event 0 17435 &aa_audit_17435 ++s3c_hsotg_ep_queue_lock_17437 s3c_hsotg_ep_queue_lock 0 17437 NULL ++usb_gsi_openclose_17439 usb_gsi_openclose 0 17439 NULL nohasharray ++startup_17439 startup 0 17439 &usb_gsi_openclose_17439 ++hdpvr_try_ctrl_17440 hdpvr_try_ctrl 0 17440 NULL nohasharray ++iwl_pcie_send_hcmd_async_17440 iwl_pcie_send_hcmd_async 0 17440 &hdpvr_try_ctrl_17440 ++SYSC_fcntl_17441 SYSC_fcntl 3 17441 NULL nohasharray ++snd_hammerfall_get_buffer_17441 snd_hammerfall_get_buffer 3 17441 &SYSC_fcntl_17441 ++ov772x_s_fmt_17443 ov772x_s_fmt 0 17443 NULL nohasharray ++snd_hda_parse_generic_codec_17443 snd_hda_parse_generic_codec 0 17443 &ov772x_s_fmt_17443 nohasharray ++ath5k_attr_store_noise_immunity_level_17443 ath5k_attr_store_noise_immunity_level 0-4 17443 &snd_hda_parse_generic_codec_17443 ++libcfs_ipif_enumerate_17445 libcfs_ipif_enumerate 0 17445 NULL ++xfs_btree_lshift_17448 xfs_btree_lshift 0 17448 NULL ++readpage_strip_17452 readpage_strip 0 17452 NULL ++show_conn_param_ISCSI_PARAM_PERSISTENT_ADDRESS_17460 show_conn_param_ISCSI_PARAM_PERSISTENT_ADDRESS 0 17460 NULL ++__ref_totlen_17461 __ref_totlen 0 17461 NULL ++show_proc_name_17464 show_proc_name 0 17464 NULL ++probe_bios_17467 probe_bios 1 17467 NULL ++show_temp_min_17471 show_temp_min 0 17471 NULL ++probe_kernel_write_17481 probe_kernel_write 3 17481 NULL nohasharray ++vv6410_set_exposure_17481 vv6410_set_exposure 0 17481 &probe_kernel_write_17481 ++v9fs_xattr_trusted_set_17485 v9fs_xattr_trusted_set 0 17485 NULL ++TSS_rawhmac_17486 TSS_rawhmac 0 17486 NULL ++tomoyo_check_unix_address_17491 tomoyo_check_unix_address 0 17491 NULL ++bql_set_hold_time_17501 bql_set_hold_time 0-4 17501 NULL ++bitmap_pos_to_ord_17503 bitmap_pos_to_ord 3 17503 NULL ++rds_get_mr_17506 rds_get_mr 0 17506 NULL ++multicast_last_member_interval_store_17508 multicast_last_member_interval_store 4-0 17508 NULL ++of_device_get_modalias_17511 of_device_get_modalias 0 17511 NULL ++copy_page_from_iter_17512 copy_page_from_iter 0-3 17512 NULL ++reiserfs_direct_IO_17513 reiserfs_direct_IO 4-0 17513 NULL nohasharray ++fc_vport_terminate_17513 fc_vport_terminate 0 17513 &reiserfs_direct_IO_17513 ++lbs_highrssi_write_17515 lbs_highrssi_write 3-0 17515 NULL ++wl1271_acx_dco_itrim_params_17523 wl1271_acx_dco_itrim_params 0 17523 NULL ++fsp_attr_show_flags_17527 fsp_attr_show_flags 0 17527 NULL ++acerhdf_get_cur_state_17531 acerhdf_get_cur_state 0 17531 NULL ++show_ipInNoRoutes_17533 show_ipInNoRoutes 0 17533 NULL ++ixgbe_set_vfta_generic_17534 ixgbe_set_vfta_generic 0 17534 NULL ++ctnetlink_acct_size_17536 ctnetlink_acct_size 0 17536 NULL ++show_tabletToolMode_17539 show_tabletToolMode 0 17539 NULL ++elan_i2c_get_baseline_data_17541 elan_i2c_get_baseline_data 0 17541 NULL ++v9fs_xattr_trusted_get_17542 v9fs_xattr_trusted_get 0 17542 NULL ++cdc_ncm_show_bmNtbFormatsSupported_17554 cdc_ncm_show_bmNtbFormatsSupported 0 17554 NULL ++posix_acl_xattr_get_17556 posix_acl_xattr_get 0 17556 NULL ++csrow_dev_type_show_17557 csrow_dev_type_show 0 17557 NULL ++copy_from_user_17559 copy_from_user 3-0 17559 NULL ++skein_512_init_17565 skein_512_init 0 17565 NULL ++vmci_transport_notify_pkt_recv_post_dequeue_17567 vmci_transport_notify_pkt_recv_post_dequeue 0 17567 NULL ++hash_netport4_expire_17573 hash_netport4_expire 4 17573 NULL nohasharray ++ds1343_show_tricklecharger_17573 ds1343_show_tricklecharger 0 17573 &hash_netport4_expire_17573 ++airspy_s_ctrl_17575 airspy_s_ctrl 0 17575 NULL ++tcm_qla2xxx_tpg_store_enable_17580 tcm_qla2xxx_tpg_store_enable 0-3 17580 NULL ++wil_write_file_rxon_17581 wil_write_file_rxon 3-0 17581 NULL nohasharray ++snd_p16v_pcm_prepare_capture_17581 snd_p16v_pcm_prepare_capture 0 17581 &wil_write_file_rxon_17581 ++show_ata_dev_pio_mode_17582 show_ata_dev_pio_mode 0 17582 NULL ++netxen_init_old_ctx_17585 netxen_init_old_ctx 0 17585 NULL ++show_auto_temp_off_17588 show_auto_temp_off 0 17588 NULL ++command_setcolourparams_17592 command_setcolourparams 0 17592 NULL nohasharray ++write_17592 write 0-3 17592 &command_setcolourparams_17592 ++acpi_ut_create_package_object_17594 acpi_ut_create_package_object 1 17594 NULL nohasharray ++show_sf2_temp_17594 show_sf2_temp 0 17594 &acpi_ut_create_package_object_17594 ++neigh_hash_alloc_17595 neigh_hash_alloc 1 17595 NULL nohasharray ++xen_release_pud_17595 xen_release_pud 1 17595 &neigh_hash_alloc_17595 ++rts51x_write_mem_17598 rts51x_write_mem 4 17598 NULL ++da9055_rtc_enable_alarm_17599 da9055_rtc_enable_alarm 0 17599 NULL ++wm8994_gpio_to_irq_17604 wm8994_gpio_to_irq 2 17604 NULL ++osst_execute_17607 osst_execute 7-6 17607 NULL nohasharray ++svc_export_parse_17607 svc_export_parse 0 17607 &osst_execute_17607 ++ieee80211_if_read_dot11MeshHWMPactivePathToRootTimeout_17618 ieee80211_if_read_dot11MeshHWMPactivePathToRootTimeout 3-0 17618 NULL ++null_show_17619 null_show 0 17619 NULL ++show_selfballoon_downhys_17620 show_selfballoon_downhys 0 17620 NULL ++vid_cap_queue_setup_17626 vid_cap_queue_setup 0 17626 NULL ++dma_map_page_17628 dma_map_page 0-3 17628 NULL ++__uncore_match_rnid30_show_17629 __uncore_match_rnid30_show 0 17629 NULL ++purge_port_17641 purge_port 0 17641 NULL ++twl4030_set_gpio_direction_17645 twl4030_set_gpio_direction 0-1 17645 NULL nohasharray ++show_conn_param_ISCSI_PARAM_TCP_XMIT_WSF_17645 show_conn_param_ISCSI_PARAM_TCP_XMIT_WSF 0 17645 &twl4030_set_gpio_direction_17645 nohasharray ++access_show_17645 access_show 0 17645 &show_conn_param_ISCSI_PARAM_TCP_XMIT_WSF_17645 ++vcc_setsockopt_17647 vcc_setsockopt 0 17647 NULL ++ledtrig_cpu_syscore_suspend_17654 ledtrig_cpu_syscore_suspend 0 17654 NULL ++SYSC_migrate_pages_17657 SYSC_migrate_pages 2 17657 NULL nohasharray ++may_lookup_17657 may_lookup 0 17657 &SYSC_migrate_pages_17657 ++cfg802154_netdev_notifier_call_17658 cfg802154_netdev_notifier_call 0 17658 NULL ++max8997_reg_disable_17661 max8997_reg_disable 0 17661 NULL ++packet_setsockopt_17662 packet_setsockopt 5-0 17662 NULL nohasharray ++ubi_io_read_data_17662 ubi_io_read_data 0 17662 &packet_setsockopt_17662 nohasharray ++vmw_pm_prepare_17662 vmw_pm_prepare 0 17662 &ubi_io_read_data_17662 ++mpage_writepages_17664 mpage_writepages 0 17664 NULL ++kernel_write_17665 kernel_write 0-3 17665 NULL ++fm10k_qv_request_irq_17666 fm10k_qv_request_irq 0 17666 NULL ++store_hrtbt_enb_17670 store_hrtbt_enb 0-3 17670 NULL ++lpfc_oas_vpt_show_17673 lpfc_oas_vpt_show 0 17673 NULL ++lpfc_bg_apptag_err_show_17676 lpfc_bg_apptag_err_show 0 17676 NULL nohasharray ++bond_opt_check_deps_17676 bond_opt_check_deps 0 17676 &lpfc_bg_apptag_err_show_17676 ++dsp_tone_hw_message_17678 dsp_tone_hw_message 3 17678 NULL ++show_iface_cache_id_17685 show_iface_cache_id 0 17685 NULL ++pwr_enable_ps_read_17686 pwr_enable_ps_read 3-0 17686 NULL ++__uncore_filter_cid_show_17688 __uncore_filter_cid_show 0 17688 NULL nohasharray ++filemap_fdatawait_17688 filemap_fdatawait 0 17688 &__uncore_filter_cid_show_17688 ++snd_cx23885_card_trigger_17689 snd_cx23885_card_trigger 0 17689 NULL nohasharray ++transient_activate_store_17689 transient_activate_store 0-4 17689 &snd_cx23885_card_trigger_17689 ++rds_bind_17690 rds_bind 0 17690 NULL ++apds990x_prox_enable_store_17693 apds990x_prox_enable_store 0-4 17693 NULL ++nilfs_superblock_README_show_17704 nilfs_superblock_README_show 0 17704 NULL ++venus_rename_17707 venus_rename 4-5 17707 NULL nohasharray ++__einj_error_trigger_17707 __einj_error_trigger 1 17707 &venus_rename_17707 nohasharray ++jfs_writepage_17707 jfs_writepage 0 17707 &__einj_error_trigger_17707 nohasharray ++skein512_update_17707 skein512_update 0 17707 &jfs_writepage_17707 ++crc32_setkey_17711 crc32_setkey 0 17711 NULL nohasharray ++store_in_min_17711 store_in_min 0-4 17711 &crc32_setkey_17711 ++zd_usb_ioread16v_17715 zd_usb_ioread16v 0 17715 NULL ++sensor_write_regs_17718 sensor_write_regs 0 17718 NULL ++wl18xx_set_host_cfg_bitmap_17719 wl18xx_set_host_cfg_bitmap 0 17719 NULL ++show_dev_abi_version_17720 show_dev_abi_version 0 17720 NULL ++afs_writepage_17722 afs_writepage 0 17722 NULL ++isku_sysfs_write_keys_function_17726 isku_sysfs_write_keys_function 6-0-5 17726 NULL ++brcms_ops_start_17727 brcms_ops_start 0 17727 NULL nohasharray ++vlsi_start_hw_17727 vlsi_start_hw 0 17727 &brcms_ops_start_17727 ++frpw_read_regr_17728 frpw_read_regr 0 17728 NULL nohasharray ++mgsl_adapter_test_17728 mgsl_adapter_test 0 17728 &frpw_read_regr_17728 ++cpufreq_stat_notifier_trans_17729 cpufreq_stat_notifier_trans 0 17729 NULL ++show_counter_ib_link_err_recoveries_17732 show_counter_ib_link_err_recoveries 0 17732 NULL ++exofs_read_lookup_dev_table_17733 exofs_read_lookup_dev_table 3 17733 NULL nohasharray ++pcpu_alloc_area_17733 pcpu_alloc_area 0-3 17733 &exofs_read_lookup_dev_table_17733 nohasharray ++layout_show_17733 layout_show 0 17733 &pcpu_alloc_area_17733 ++sctpprobe_read_17741 sctpprobe_read 3-0 17741 NULL ++i2o_exec_show_product_id_17744 i2o_exec_show_product_id 0 17744 NULL nohasharray ++inode_setxattr_17744 inode_setxattr 0 17744 &i2o_exec_show_product_id_17744 ++qlcnic_sysfs_read_crb_17747 qlcnic_sysfs_read_crb 0-6-5 17747 NULL ++csrow_size_show_17755 csrow_size_show 0 17755 NULL ++s5k83a_set_exposure_17758 s5k83a_set_exposure 0 17758 NULL ++add_durable_context_17763 add_durable_context 0 17763 NULL ++brcmf_usb_attach_17766 brcmf_usb_attach 2-3 17766 NULL nohasharray ++fm10k_vlan_rx_add_vid_17766 fm10k_vlan_rx_add_vid 0 17766 &brcmf_usb_attach_17766 ++ath10k_ce_init_pipe_17768 ath10k_ce_init_pipe 0 17768 NULL ++cxacru_sysfs_show_adsl_headend_environment_17770 cxacru_sysfs_show_adsl_headend_environment 0 17770 NULL ++jme_fill_tx_map_17776 jme_fill_tx_map 5 17776 NULL ++batadv_log_read_17778 batadv_log_read 0-3 17778 NULL ++get_battery_life_extender_17780 get_battery_life_extender 0 17780 NULL ++nfs_generic_commit_list_17784 nfs_generic_commit_list 0 17784 NULL ++ubifs_leb_change_17789 ubifs_leb_change 4-0 17789 NULL ++nouveau_hwmon_get_pwm1_17791 nouveau_hwmon_get_pwm1 0 17791 NULL ++get_unaligned_be64_17794 get_unaligned_be64 0 17794 NULL ++g2d_queue_setup_17795 g2d_queue_setup 0 17795 NULL ++reiserfs_write_begin_17797 reiserfs_write_begin 0 17797 NULL ++lpuart_copy_rx_to_tty_17801 lpuart_copy_rx_to_tty 3 17801 NULL ++_iwl_dbgfs_set_nic_temperature_write_17804 _iwl_dbgfs_set_nic_temperature_write 3-0 17804 NULL ++mmc_rel_sectors_show_17806 mmc_rel_sectors_show 0 17806 NULL ++show_pci_clock_sel_17807 show_pci_clock_sel 0 17807 NULL ++show_bind_17808 show_bind 0 17808 NULL nohasharray ++fuse_do_readpage_17808 fuse_do_readpage 0 17808 &show_bind_17808 ++vb2_dma_sg_get_userptr_17809 vb2_dma_sg_get_userptr 3-2 17809 NULL ++xhci_queue_ctrl_tx_17814 xhci_queue_ctrl_tx 0 17814 NULL nohasharray ++command_setsensorfps_17814 command_setsensorfps 0 17814 &xhci_queue_ctrl_tx_17814 ++copy_out_args_17816 copy_out_args 0 17816 NULL ++generic_validate_add_page_17818 generic_validate_add_page 0 17818 NULL ++_snd_pcm_lib_alloc_vmalloc_buffer_17820 _snd_pcm_lib_alloc_vmalloc_buffer 2 17820 NULL ++gnet_stats_copy_app_17821 gnet_stats_copy_app 3 17821 NULL ++regmap_i2c_gather_write_17823 regmap_i2c_gather_write 0 17823 NULL ++jme_request_irq_17824 jme_request_irq 0 17824 NULL ++velocity_init_td_ring_17825 velocity_init_td_ring 0 17825 NULL ++__netdev_adjacent_dev_link_17826 __netdev_adjacent_dev_link 0 17826 NULL ++gr_setup_in_desc_list_17828 gr_setup_in_desc_list 0 17828 NULL ++bd2802_show_rgb_current_17830 bd2802_show_rgb_current 0 17830 NULL ++hiface_pcm_trigger_17831 hiface_pcm_trigger 0 17831 NULL nohasharray ++show_prochot_short_17831 show_prochot_short 0 17831 &hiface_pcm_trigger_17831 ++bq2415x_sysfs_show_enable_17832 bq2415x_sysfs_show_enable 0 17832 NULL nohasharray ++ixgb_set_mac_17832 ixgb_set_mac 0 17832 &bq2415x_sysfs_show_enable_17832 ++cipso_v4_gentag_rbm_17836 cipso_v4_gentag_rbm 0 17836 NULL nohasharray ++wdt_write_17836 wdt_write 0-3 17836 &cipso_v4_gentag_rbm_17836 ++sn9c2028_command_17840 sn9c2028_command 0 17840 NULL ++sdev_show_model_17842 sdev_show_model 0 17842 NULL nohasharray ++tcp_repair_options_est_17842 tcp_repair_options_est 0 17842 &sdev_show_model_17842 nohasharray ++count_leafs_17842 count_leafs 0 17842 &tcp_repair_options_est_17842 ++em28xx_audio_ep_packet_size_17844 em28xx_audio_ep_packet_size 0 17844 NULL ++sysfs_rename_link_ns_17848 sysfs_rename_link_ns 0 17848 NULL ++enumerate_17850 enumerate 0 17850 NULL ++tps80031_reg_disable_17856 tps80031_reg_disable 0 17856 NULL ++show_fnode_statsn_17861 show_fnode_statsn 0 17861 NULL ++extsize_17863 extsize 0 17863 NULL nohasharray ++dm_stats_message_17863 dm_stats_message 5 17863 &extsize_17863 ++sisusb_send_bulk_msg_17864 sisusb_send_bulk_msg 3-0 17864 NULL ++pcpu_fit_in_area_17865 pcpu_fit_in_area 0-5-2-3 17865 NULL ++show_spi_transport_hold_mcs_17867 show_spi_transport_hold_mcs 0 17867 NULL nohasharray ++swiotlb_dma_mapping_error_17867 swiotlb_dma_mapping_error 0-2 17867 &show_spi_transport_hold_mcs_17867 ++alloc_sja1000dev_17868 alloc_sja1000dev 1 17868 NULL nohasharray ++show_tcpRetransSegs_17868 show_tcpRetransSegs 0 17868 &alloc_sja1000dev_17868 ++linear_run_17869 linear_run 0 17869 NULL ++virtio_cread32_17873 virtio_cread32 0 17873 NULL ++ray_cs_essid_proc_write_17875 ray_cs_essid_proc_write 3-0 17875 NULL nohasharray ++mwifiex_cmd_ibss_coalescing_status_17875 mwifiex_cmd_ibss_coalescing_status 0 17875 &ray_cs_essid_proc_write_17875 ++show_logged_errs_17876 show_logged_errs 0 17876 NULL nohasharray ++shm32read__read_file_17876 shm32read__read_file 0 17876 &show_logged_errs_17876 ++sedlbauer_resume_17877 sedlbauer_resume 0 17877 NULL ++orinoco_set_key_17878 orinoco_set_key 5-7 17878 NULL nohasharray ++i40e_align_l2obj_base_17878 i40e_align_l2obj_base 0-1 17878 &orinoco_set_key_17878 ++init_per_cpu_17880 init_per_cpu 1 17880 NULL ++ieee80211_if_fmt_dot11MeshMaxPeerLinks_17883 ieee80211_if_fmt_dot11MeshMaxPeerLinks 3 17883 NULL ++compat_sys_pwritev_17886 compat_sys_pwritev 3 17886 NULL ++iwl_dbgfs_bcast_filters_macs_write_17887 iwl_dbgfs_bcast_filters_macs_write 0-3 17887 NULL ++usb_interrupt_msg_17888 usb_interrupt_msg 0 17888 NULL ++shmem_writepage_17889 shmem_writepage 0 17889 NULL ++ieee80211_if_fmt_dot11MeshHWMPRootMode_17890 ieee80211_if_fmt_dot11MeshHWMPRootMode 3 17890 NULL ++sctp_setsockopt_partial_delivery_point_17891 sctp_setsockopt_partial_delivery_point 0 17891 NULL ++store_pwm_auto_point1_pwm_17897 store_pwm_auto_point1_pwm 0-4 17897 NULL ++validate_slab_cache_17901 validate_slab_cache 0 17901 NULL ++niu_tx_cs_reset_poll_17902 niu_tx_cs_reset_poll 0 17902 NULL nohasharray ++_cpu_down_17902 _cpu_down 0 17902 &niu_tx_cs_reset_poll_17902 ++recover_head_17904 recover_head 3 17904 NULL ++systab_show_17907 systab_show 0 17907 NULL ++dev_pm_opp_get_opp_count_17911 dev_pm_opp_get_opp_count 0 17911 NULL ++elan_sysfs_update_fw_17912 elan_sysfs_update_fw 0-4 17912 NULL ++dccp_feat_register_sp_17914 dccp_feat_register_sp 0-5 17914 NULL ++xfs_buf_associate_memory_17915 xfs_buf_associate_memory 3 17915 NULL nohasharray ++wm831x_boostp_get_status_17915 wm831x_boostp_get_status 0 17915 &xfs_buf_associate_memory_17915 ++xfs_rtallocate_extent_near_17916 xfs_rtallocate_extent_near 0 17916 NULL ++media_show_17920 media_show 0 17920 NULL ++create_17922 create 0 17922 NULL nohasharray ++i40e_fcoe_ddp_get_17922 i40e_fcoe_ddp_get 4 17922 &create_17922 ++aty128_var_to_pll_17926 aty128_var_to_pll 0 17926 NULL ++find_dmi_entry_17927 find_dmi_entry 0 17927 NULL ++edac_pci_dev_show_17928 edac_pci_dev_show 0 17928 NULL ++acpi_ns_lookup_17929 acpi_ns_lookup 0 17929 NULL nohasharray ++show_ipv6_iface_nd_rexmit_time_17929 show_ipv6_iface_nd_rexmit_time 0 17929 &acpi_ns_lookup_17929 ++vif_delete_17931 vif_delete 0 17931 NULL ++carl9170_init_interface_17934 carl9170_init_interface 0 17934 NULL ++serio_raw_write_17945 serio_raw_write 0-3 17945 NULL ++gart_map_sg_17946 gart_map_sg 0-3 17946 NULL ++beacon_interval_write_17952 beacon_interval_write 3-0 17952 NULL ++show_otp3_17954 show_otp3 0 17954 NULL ++enic_rxcopybreak_17955 enic_rxcopybreak 4 17955 NULL ++cp2112_xfer_17956 cp2112_xfer 0 17956 NULL ++sr_sw_reset_17961 sr_sw_reset 0 17961 NULL ++ufs_free_blocks_17963 ufs_free_blocks 3-2 17963 NULL ++lpt_tgc_end_17965 lpt_tgc_end 0 17965 NULL ++qib_portattr_show_17966 qib_portattr_show 0 17966 NULL ++show_serial_17967 show_serial 0 17967 NULL ++acpi_ex_check_object_type_17972 acpi_ex_check_object_type 0 17972 NULL nohasharray ++il_send_cmd_async_17972 il_send_cmd_async 0 17972 &acpi_ex_check_object_type_17972 ++wm831x_gp_ldo_get_status_17977 wm831x_gp_ldo_get_status 0 17977 NULL ++iwlagn_disconn_pan_17978 iwlagn_disconn_pan 0 17978 NULL ++show_fc_host_optionrom_version_17983 show_fc_host_optionrom_version 0 17983 NULL ++br_nf_local_in_17986 br_nf_local_in 0 17986 NULL nohasharray ++dwc3_gadget_set_ep_config_17986 dwc3_gadget_set_ep_config 0 17986 &br_nf_local_in_17986 ++smk_write_cipso_17989 smk_write_cipso 3-0 17989 NULL ++sync_blockdev_17990 sync_blockdev 0 17990 NULL ++gnttab_max_grant_frames_17993 gnttab_max_grant_frames 0 17993 NULL ++show_tty_active_17994 show_tty_active 0 17994 NULL ++init_umac_17998 init_umac 0 17998 NULL ++mc13xxx_rtc_reset_handler_17999 mc13xxx_rtc_reset_handler 1 17999 NULL ++ext4_num_overhead_clusters_18001 ext4_num_overhead_clusters 2 18001 NULL ++pvr2_v4l2_read_18006 pvr2_v4l2_read 3-0 18006 NULL nohasharray ++write_reg_18006 write_reg 0 18006 &pvr2_v4l2_read_18006 ++tpm_show_ppi_transition_action_18008 tpm_show_ppi_transition_action 0 18008 NULL ++target_core_dev_wwn_attr_show_18010 target_core_dev_wwn_attr_show 0 18010 NULL ++ql_change_rx_buffers_18011 ql_change_rx_buffers 0 18011 NULL ++da903x_set_bits_18012 da903x_set_bits 0 18012 NULL ++he_proc_read_18015 he_proc_read 0 18015 NULL ++wake_up_modem_store_18016 wake_up_modem_store 0-4 18016 NULL ++pmcraid_store_log_level_18020 pmcraid_store_log_level 0-4 18020 NULL ++sdev_show_evt_media_change_18024 sdev_show_evt_media_change 0 18024 NULL ++iscsi_tpg_auth_show_userid_mutual_18025 iscsi_tpg_auth_show_userid_mutual 0 18025 NULL ++netxen_alloc_sw_resources_18026 netxen_alloc_sw_resources 0 18026 NULL ++raw_write_18028 raw_write 3-0 18028 NULL ++tps65912_i2c_write_18030 tps65912_i2c_write 3 18030 NULL ++wil_fw_handle_record_18033 wil_fw_handle_record 0 18033 NULL ++__posix_lock_file_18035 __posix_lock_file 0 18035 NULL nohasharray ++rio_init_mports_18035 rio_init_mports 0 18035 &__posix_lock_file_18035 ++show_ppi_operations_18037 show_ppi_operations 0 18037 NULL nohasharray ++emit_request_18037 emit_request 0 18037 &show_ppi_operations_18037 ++qlcnic_get_cap_size_18042 qlcnic_get_cap_size 0 18042 NULL ++nfs_check_inode_attributes_18043 nfs_check_inode_attributes 0 18043 NULL ++cryptd_alloc_instance_18048 cryptd_alloc_instance 3-2 18048 NULL ++find_next_inuse_18051 find_next_inuse 2-3-0 18051 NULL ++policydb_load_isids_18052 policydb_load_isids 0 18052 NULL nohasharray ++core_tpg_set_initiator_node_queue_depth_18052 core_tpg_set_initiator_node_queue_depth 0 18052 &policydb_load_isids_18052 nohasharray ++t3_config_sched_18052 t3_config_sched 0 18052 &core_tpg_set_initiator_node_queue_depth_18052 ++ddebug_proc_write_18055 ddebug_proc_write 3-0 18055 NULL ++zisofs_fill_pages_18057 zisofs_fill_pages 0 18057 NULL ++max8925_enable_18058 max8925_enable 0 18058 NULL ++dlfb_set_video_mode_18061 dlfb_set_video_mode 0 18061 NULL ++lua_sysfs_read_18062 lua_sysfs_read 0-6 18062 NULL nohasharray ++dccp_error_18062 dccp_error 0 18062 &lua_sysfs_read_18062 ++process_measurement_18064 process_measurement 0 18064 NULL ++fpregs_get_18066 fpregs_get 4 18066 NULL ++pvr2_hdw_wait_18072 pvr2_hdw_wait 0 18072 NULL ++kvm_read_guest_page_18074 kvm_read_guest_page 5 18074 NULL nohasharray ++do_budget_space_18074 do_budget_space 0 18074 &kvm_read_guest_page_18074 nohasharray ++open_18074 open 0 18074 &do_budget_space_18074 ++SYSC_pselect6_18076 SYSC_pselect6 1 18076 NULL nohasharray ++mlx4_en_get_rxfh_indir_size_18076 mlx4_en_get_rxfh_indir_size 0 18076 &SYSC_pselect6_18076 ++bop_insert_18078 bop_insert 0 18078 NULL ++get_vm_area_18080 get_vm_area 1 18080 NULL ++ds2781_get_pmod_enabled_18081 ds2781_get_pmod_enabled 0 18081 NULL nohasharray ++ds2781_set_control_register_18081 ds2781_set_control_register 0 18081 &ds2781_get_pmod_enabled_18081 ++x86_pmu_notifier_18082 x86_pmu_notifier 0 18082 NULL ++stv06xx_read_sensor_18085 stv06xx_read_sensor 0 18085 NULL ++rtl8139_change_mtu_18088 rtl8139_change_mtu 0 18088 NULL ++vmw_fops_read_18089 vmw_fops_read 0-3 18089 NULL ++SYSC_semtimedop_18091 SYSC_semtimedop 3 18091 NULL nohasharray ++show_txchan_per_port_18091 show_txchan_per_port 0 18091 &SYSC_semtimedop_18091 ++twl6030reg_enable_18092 twl6030reg_enable 0 18092 NULL nohasharray ++snd_seq_fifo_cell_out_18092 snd_seq_fifo_cell_out 0 18092 &twl6030reg_enable_18092 ++mpi_alloc_18094 mpi_alloc 1 18094 NULL nohasharray ++spi_w8r16be_18094 spi_w8r16be 0 18094 &mpi_alloc_18094 ++hackrf_set_bandwidth_18095 hackrf_set_bandwidth 0 18095 NULL nohasharray ++lm8323_pwm_show_time_18095 lm8323_pwm_show_time 0 18095 &hackrf_set_bandwidth_18095 ++_nfs4_proc_lookup_18096 _nfs4_proc_lookup 0 18096 NULL ++show_rtap_filter_18107 show_rtap_filter 0 18107 NULL ++read_18109 read 0 18109 NULL ++ocfs2_control_install_private_18110 ocfs2_control_install_private 0 18110 NULL ++dib0090_set_params_18113 dib0090_set_params 0 18113 NULL nohasharray ++sctp_bind_addr_copy_18113 sctp_bind_addr_copy 0 18113 &dib0090_set_params_18113 ++pep_sock_connect_18114 pep_sock_connect 0 18114 NULL ++set_in_18115 set_in 0-4 18115 NULL ++dfs_file_read_18116 dfs_file_read 3-0 18116 NULL ++svc_getnl_18120 svc_getnl 0 18120 NULL ++p9_client_wstat_18130 p9_client_wstat 0 18130 NULL ++xfs_zero_eof_18134 xfs_zero_eof 0-3-2 18134 NULL nohasharray ++lapbeth_open_18134 lapbeth_open 0 18134 &xfs_zero_eof_18134 ++wil_tid_ampdu_rx_alloc_18140 wil_tid_ampdu_rx_alloc 2 18140 NULL ++removexattr_18147 removexattr 0 18147 NULL ++selinux_inode_setsecurity_18148 selinux_inode_setsecurity 4-0 18148 NULL ++pcipcwd_temp_read_18149 pcipcwd_temp_read 0-3 18149 NULL ++show_wr_req_18151 show_wr_req 0 18151 NULL ++show_pwm_setting_18157 show_pwm_setting 0 18157 NULL ++show_tabletDiagnosticMessage_18165 show_tabletDiagnosticMessage 0 18165 NULL ++mdiobus_read_18169 mdiobus_read 0 18169 NULL ++cciss_show_raid_level_18170 cciss_show_raid_level 0 18170 NULL nohasharray ++enable_ints_write_18170 enable_ints_write 3 18170 &cciss_show_raid_level_18170 ++tomoyo_inet_entry_18174 tomoyo_inet_entry 0 18174 NULL ++pccard_store_cis_18176 pccard_store_cis 6-0-5 18176 NULL ++bnx2_get_eeprom_len_18179 bnx2_get_eeprom_len 0 18179 NULL ++snd_hda_add_new_ctls_18185 snd_hda_add_new_ctls 0 18185 NULL ++aio_write_18187 aio_write 0 18187 NULL ++read_first_n_18197 read_first_n 0 18197 NULL nohasharray ++o2net_start_listening_18197 o2net_start_listening 0 18197 &read_first_n_18197 nohasharray ++cfpkt_create_18197 cfpkt_create 1 18197 &o2net_start_listening_18197 ++aty_var_to_crtc_18199 aty_var_to_crtc 0 18199 NULL ++dib8096p_tuner_xfer_18205 dib8096p_tuner_xfer 0-3 18205 NULL nohasharray ++selinux_nlmsg_perm_18205 selinux_nlmsg_perm 0 18205 &dib8096p_tuner_xfer_18205 ++orinoco_add_extscan_result_18207 orinoco_add_extscan_result 3 18207 NULL ++show_immediate_18208 show_immediate 0 18208 NULL ++gsm_control_message_18209 gsm_control_message 4 18209 NULL ++bq2415x_sysfs_show_limit_18213 bq2415x_sysfs_show_limit 0 18213 NULL nohasharray ++show_phy_type_18213 show_phy_type 0 18213 &bq2415x_sysfs_show_limit_18213 nohasharray ++read_rindex_entry_18213 read_rindex_entry 0 18213 &show_phy_type_18213 ++si4713_set_rds_ps_name_18214 si4713_set_rds_ps_name 0 18214 NULL ++do_ipv6_setsockopt_18215 do_ipv6_setsockopt 5-0 18215 NULL ++pcmcia_enable_device_18218 pcmcia_enable_device 0 18218 NULL ++ov7670_s_autogain_18219 ov7670_s_autogain 0 18219 NULL ++gnttab_alloc_grant_references_18240 gnttab_alloc_grant_references 1 18240 NULL ++jffs2_read_dnode_18244 jffs2_read_dnode 0 18244 NULL nohasharray ++cond_policydb_init_18244 cond_policydb_init 0 18244 &jffs2_read_dnode_18244 ++ecryptfs_miscdev_read_18247 ecryptfs_miscdev_read 0-3 18247 NULL nohasharray ++alloc_trace_uprobe_18247 alloc_trace_uprobe 3 18247 &ecryptfs_miscdev_read_18247 ++clip_inet_event_18252 clip_inet_event 0 18252 NULL ++e4000_set_params_18253 e4000_set_params 0 18253 NULL nohasharray ++i7core_inject_store_page_18253 i7core_inject_store_page 0-4 18253 &e4000_set_params_18253 ++rfcomm_sock_setsockopt_18254 rfcomm_sock_setsockopt 5-0 18254 NULL nohasharray ++e1000_setup_all_rx_resources_18254 e1000_setup_all_rx_resources 0 18254 &rfcomm_sock_setsockopt_18254 ++qdisc_class_hash_alloc_18262 qdisc_class_hash_alloc 1 18262 NULL nohasharray ++show_18262 show 0 18262 &qdisc_class_hash_alloc_18262 nohasharray ++logfs_write_end_18262 logfs_write_end 0-5 18262 &show_18262 ++mcs_setup_transceiver_18268 mcs_setup_transceiver 0 18268 NULL ++show_temp_auto_offset_18270 show_temp_auto_offset 0 18270 NULL ++tg3_bmcr_reset_18271 tg3_bmcr_reset 0 18271 NULL ++gfs2_alloc_sort_buffer_18275 gfs2_alloc_sort_buffer 1 18275 NULL ++alloc_ring_18278 alloc_ring 4-2 18278 NULL ++nouveau_subdev_create__18281 nouveau_subdev_create_ 7 18281 NULL ++ext4_readpages_18283 ext4_readpages 4 18283 NULL ++mmc_send_bus_test_18285 mmc_send_bus_test 4 18285 NULL ++ipv4_mtu_18287 ipv4_mtu 0 18287 NULL nohasharray ++lpfc_fcp_cpu_map_show_18287 lpfc_fcp_cpu_map_show 0 18287 &ipv4_mtu_18287 nohasharray ++alloc_kmem_cache_cpus_18287 alloc_kmem_cache_cpus 2 18287 &lpfc_fcp_cpu_map_show_18287 ++tipc_sk_withdraw_18291 tipc_sk_withdraw 0 18291 NULL ++um_idi_write_18293 um_idi_write 3-0 18293 NULL nohasharray ++show_fnode_username_in_18293 show_fnode_username_in 0 18293 &um_idi_write_18293 nohasharray ++xfs_file_read_iter_18293 xfs_file_read_iter 0 18293 &show_fnode_username_in_18293 nohasharray ++__follow_pte_18293 __follow_pte 0 18293 &xfs_file_read_iter_18293 ++part_timeout_show_18298 part_timeout_show 0 18298 NULL ++mwl8k_sta_add_18299 mwl8k_sta_add 0 18299 NULL ++iscsi_stat_sess_err_show_attr_cxn_errors_18301 iscsi_stat_sess_err_show_attr_cxn_errors 0 18301 NULL ++tg3_request_irq_18303 tg3_request_irq 0 18303 NULL ++nouveau_disp_create__18305 nouveau_disp_create_ 4-7 18305 NULL ++ip6ip6_err_18308 ip6ip6_err 5 18308 NULL ++vga_r_18310 vga_r 0 18310 NULL ++class_add_profile_18315 class_add_profile 1-3-5 18315 NULL ++w1_slave_detach_18316 w1_slave_detach 0 18316 NULL ++sgdma_initialize_18317 sgdma_initialize 0 18317 NULL ++csio_mem_read_18319 csio_mem_read 3-0 18319 NULL ++mc13892_powermisc_rmw_18320 mc13892_powermisc_rmw 0 18320 NULL nohasharray ++single_flag_show_18320 single_flag_show 0 18320 &mc13892_powermisc_rmw_18320 ++alloc_and_copy_string_18321 alloc_and_copy_string 2 18321 NULL ++ecryptfs_send_message_18322 ecryptfs_send_message 2 18322 NULL ++show_temp_auto_base_18323 show_temp_auto_base 0 18323 NULL ++bio_integrity_advance_18324 bio_integrity_advance 2 18324 NULL nohasharray ++vivid_radio_tx_write_18324 vivid_radio_tx_write 0 18324 &bio_integrity_advance_18324 ++acpi_ds_create_operands_18327 acpi_ds_create_operands 0 18327 NULL ++st21nfca_im_send_atr_req_18331 st21nfca_im_send_atr_req 3 18331 NULL ++xfs_da_shrink_inode_18335 xfs_da_shrink_inode 0 18335 NULL ++wm8994_gpio_direction_out_18337 wm8994_gpio_direction_out 0 18337 NULL ++outlen_read_18339 outlen_read 0-3 18339 NULL nohasharray ++get_free_region_18339 get_free_region 0-3 18339 &outlen_read_18339 ++roccat_common2_sysfs_write_key_mask_18343 roccat_common2_sysfs_write_key_mask 0-6-5 18343 NULL ++copy_page_to_iter_18345 copy_page_to_iter 3-0 18345 NULL ++show_sf_ctrl_18348 show_sf_ctrl 0 18348 NULL ++lcd_proc_write_18351 lcd_proc_write 3-0 18351 NULL nohasharray ++smb2_read_data_offset_18351 smb2_read_data_offset 0 18351 &lcd_proc_write_18351 ++pwr_power_save_off_read_18355 pwr_power_save_off_read 3-0 18355 NULL ++write_update_fw_18357 write_update_fw 0-4 18357 NULL ++fw_core_add_descriptor_18361 fw_core_add_descriptor 0 18361 NULL ++xlbd_reserve_minors_18365 xlbd_reserve_minors 2-1 18365 NULL nohasharray ++show_remote_ip_18365 show_remote_ip 0 18365 &xlbd_reserve_minors_18365 ++SyS_process_vm_readv_18366 SyS_process_vm_readv 3-5 18366 NULL ++irq_show_18367 irq_show 0 18367 NULL nohasharray ++ep_io_18367 ep_io 0 18367 &irq_show_18367 ++qib_user_sdma_num_pages_18371 qib_user_sdma_num_pages 0 18371 NULL ++nilfs_checkpoints_README_show_18372 nilfs_checkpoints_README_show 0 18372 NULL ++usbhsg_ep_queue_18376 usbhsg_ep_queue 0 18376 NULL ++temp2_show_18377 temp2_show 0 18377 NULL ++show_iface_tcp_timestamp_en_18381 show_iface_tcp_timestamp_en 0 18381 NULL ++hpfs_file_fsync_18384 hpfs_file_fsync 0 18384 NULL ++acpi_ds_create_buffer_field_18385 acpi_ds_create_buffer_field 0 18385 NULL nohasharray ++gss_key_timeout_18385 gss_key_timeout 0 18385 &acpi_ds_create_buffer_field_18385 ++__ceph_getxattr_18386 __ceph_getxattr 0 18386 NULL ++ci_role_write_18388 ci_role_write 3-0 18388 NULL nohasharray ++irq_find_mapping_18388 irq_find_mapping 0-2 18388 &ci_role_write_18388 ++il_set_tx_power_18394 il_set_tx_power 0 18394 NULL ++snd_compr_read_18396 snd_compr_read 0-3 18396 NULL nohasharray ++reshape_position_store_18396 reshape_position_store 0-3 18396 &snd_compr_read_18396 ++hdlc_empty_fifo_18397 hdlc_empty_fifo 2 18397 NULL ++__video_register_device_18399 __video_register_device 3 18399 NULL nohasharray ++ext4_xattr_security_list_18399 ext4_xattr_security_list 0-5 18399 &__video_register_device_18399 nohasharray ++bcm7xxx_28nm_d0_afe_config_init_18399 bcm7xxx_28nm_d0_afe_config_init 0 18399 &ext4_xattr_security_list_18399 ++adis16136_show_serial_18402 adis16136_show_serial 3-0 18402 NULL ++ixgbe_request_msix_irqs_18403 ixgbe_request_msix_irqs 0 18403 NULL ++get_temp_auto_point_temp_18404 get_temp_auto_point_temp 0 18404 NULL ++si4713_tx_rds_ps_18405 si4713_tx_rds_ps 0 18405 NULL ++link_state_show_18407 link_state_show 0 18407 NULL ++ceph_writepages_start_18410 ceph_writepages_start 0 18410 NULL ++rtl8169_rx_fill_18416 rtl8169_rx_fill 0 18416 NULL ++nvif_device_init_18418 nvif_device_init 6 18418 NULL ++usbnet_write_cmd_nopm_18426 usbnet_write_cmd_nopm 0-7 18426 NULL ++fwnet_broadcast_start_18428 fwnet_broadcast_start 0 18428 NULL ++memblock_virt_alloc_node_nopanic_18431 memblock_virt_alloc_node_nopanic 1 18431 NULL nohasharray ++jffs2_zlib_decompress_18431 jffs2_zlib_decompress 0 18431 &memblock_virt_alloc_node_nopanic_18431 ++iscsi_create_flashnode_sess_18433 iscsi_create_flashnode_sess 4 18433 NULL ++s5p_jpeg_start_streaming_18435 s5p_jpeg_start_streaming 0 18435 NULL ++match_number_18436 match_number 0 18436 NULL ++target_core_alua_tg_pt_gp_show_attr_alua_support_active_optimized_18437 target_core_alua_tg_pt_gp_show_attr_alua_support_active_optimized 0 18437 NULL nohasharray ++snd_hda_get_connections_18437 snd_hda_get_connections 0 18437 &target_core_alua_tg_pt_gp_show_attr_alua_support_active_optimized_18437 ++hctosys_show_18444 hctosys_show 0 18444 NULL nohasharray ++set_out0_enable_18444 set_out0_enable 0-4 18444 &hctosys_show_18444 ++bd2802_store_reg0x0f_18445 bd2802_store_reg0x0f 0-4 18445 NULL ++carl9170_mod_virtual_mac_18447 carl9170_mod_virtual_mac 0 18447 NULL ++ds1347_read_time_18452 ds1347_read_time 0 18452 NULL ++set_component_status_18453 set_component_status 0-4 18453 NULL ++mmc_init_card_18455 mmc_init_card 0 18455 NULL ++fuse_perform_write_18457 fuse_perform_write 4-0 18457 NULL ++regset_tls_set_18459 regset_tls_set 4 18459 NULL ++transfer_18460 transfer 0 18460 NULL nohasharray ++store_remote_mac_18460 store_remote_mac 0 18460 &transfer_18460 ++max_gen_clk_probe_18462 max_gen_clk_probe 5 18462 NULL ++dma_alloc_from_contiguous_18466 dma_alloc_from_contiguous 2-3 18466 NULL nohasharray ++cuse_class_waiting_show_18466 cuse_class_waiting_show 0 18466 &dma_alloc_from_contiguous_18466 ++t3_wait_op_done_18469 t3_wait_op_done 0 18469 NULL ++iwl_mvm_mac_ctxt_send_cmd_18481 iwl_mvm_mac_ctxt_send_cmd 0 18481 NULL ++_nfs4_do_open_reclaim_18483 _nfs4_do_open_reclaim 0 18483 NULL nohasharray ++__c2port_write_flash_data_18483 __c2port_write_flash_data 0-3-4 18483 &_nfs4_do_open_reclaim_18483 ++technisat_usb2_i2c_access_18484 technisat_usb2_i2c_access 0 18484 NULL ++udpv6_setsockopt_18487 udpv6_setsockopt 5-0 18487 NULL nohasharray ++snd_pcm_plugin_build_mulaw_18487 snd_pcm_plugin_build_mulaw 0 18487 &udpv6_setsockopt_18487 ++aoedisk_show_netif_18490 aoedisk_show_netif 0 18490 NULL ++sctp_setsockopt_mappedv4_18497 sctp_setsockopt_mappedv4 0 18497 NULL ++zd_usb_ioread16_18502 zd_usb_ioread16 0 18502 NULL nohasharray ++iwl_mvm_alloc_bcast_sta_18502 iwl_mvm_alloc_bcast_sta 0 18502 &zd_usb_ioread16_18502 nohasharray ++iscsi_tpg_param_store_MaxBurstLength_18502 iscsi_tpg_param_store_MaxBurstLength 0-3 18502 &iwl_mvm_alloc_bcast_sta_18502 ++w1_ds2781_read_18508 w1_ds2781_read 4-3 18508 NULL ++limit_read_18510 limit_read 0-3 18510 NULL nohasharray ++__copy_user_zeroing_intel_18510 __copy_user_zeroing_intel 0 18510 &limit_read_18510 ++__block_write_begin_18511 __block_write_begin 0 18511 NULL ++pcrs_show_18512 pcrs_show 0 18512 NULL ++snd_vx_inb_18514 snd_vx_inb 0 18514 NULL ++atl2_setup_ring_resources_18515 atl2_setup_ring_resources 0 18515 NULL ++nilfs_segctor_current_last_full_seg_show_18517 nilfs_segctor_current_last_full_seg_show 0 18517 NULL ++store_engine1_mode_18519 store_engine1_mode 4-0 18519 NULL ++sha512_ssse3_init_18520 sha512_ssse3_init 0 18520 NULL ++i40e_set_mac_18521 i40e_set_mac 0 18521 NULL ++sm501fb_set_par_common_18523 sm501fb_set_par_common 0 18523 NULL ++snd_gus_dram_poke_18525 snd_gus_dram_poke 4 18525 NULL ++ix2505v_set_params_18528 ix2505v_set_params 0 18528 NULL ++try_to_take_rt_mutex_18529 try_to_take_rt_mutex 0 18529 NULL ++dpm_suspend_late_18530 dpm_suspend_late 0 18530 NULL nohasharray ++nouveau_fifo_channel_create__18530 nouveau_fifo_channel_create_ 9 18530 &dpm_suspend_late_18530 ++t3_sge_init_flcntxt_18535 t3_sge_init_flcntxt 0 18535 NULL ++vlan_vids_add_by_dev_18537 vlan_vids_add_by_dev 0 18537 NULL ++seq_copy_in_user_18543 seq_copy_in_user 3 18543 NULL ++nilfs_segctor_sync_18549 nilfs_segctor_sync 0 18549 NULL ++acpi_register_gsi_ioapic_18550 acpi_register_gsi_ioapic 2 18550 NULL ++lapbeth_set_mac_address_18552 lapbeth_set_mac_address 0 18552 NULL ++nforce2_access_18557 nforce2_access 0 18557 NULL ++wiidebug_eeprom_read_18560 wiidebug_eeprom_read 0-3 18560 NULL nohasharray ++timer_cpu_notify_18560 timer_cpu_notify 0 18560 &wiidebug_eeprom_read_18560 nohasharray ++rt2x00lib_request_firmware_18560 rt2x00lib_request_firmware 0 18560 &timer_cpu_notify_18560 nohasharray ++elants_i2c_initialize_18560 elants_i2c_initialize 0 18560 &rt2x00lib_request_firmware_18560 ++vb2_streamon_18562 vb2_streamon 0 18562 NULL ++posix_acl_xattr_list_18564 posix_acl_xattr_list 0-5 18564 NULL ++smk_write_rules_list_18565 smk_write_rules_list 3-0 18565 NULL ++ceph_tcp_sendpage_18568 ceph_tcp_sendpage 4 18568 NULL ++vmci_datagram_send_18571 vmci_datagram_send 0 18571 NULL ++debug_output_18575 debug_output 3-0 18575 NULL nohasharray ++pm_wake_lock_18575 pm_wake_lock 0 18575 &debug_output_18575 ++mtd_size_show_18578 mtd_size_show 0 18578 NULL ++vivid_radio_read_18579 vivid_radio_read 0-3 18579 NULL ++metrics_bytes_rendered_show_18580 metrics_bytes_rendered_show 0 18580 NULL ++pn_socket_create_18581 pn_socket_create 0 18581 NULL ++ipath_reset_device_18584 ipath_reset_device 0 18584 NULL ++show_target_speed_18587 show_target_speed 0 18587 NULL ++st_accel_buffer_predisable_18589 st_accel_buffer_predisable 0 18589 NULL ++wm831x_isink_is_enabled_18590 wm831x_isink_is_enabled 0 18590 NULL nohasharray ++write_18590 write 0 18590 &wm831x_isink_is_enabled_18590 ++oaktrail_hdmi_i2c_access_18591 oaktrail_hdmi_i2c_access 0-3 18591 NULL ++__netdev_alloc_skb_18595 __netdev_alloc_skb 2 18595 NULL ++zd1211b_hw_reset_phy_18596 zd1211b_hw_reset_phy 0 18596 NULL ++xfs_btree_read_bufl_18597 xfs_btree_read_bufl 0 18597 NULL nohasharray ++wlcore_boot_static_data_18597 wlcore_boot_static_data 0 18597 &xfs_btree_read_bufl_18597 ++show_pwm_temp_map_18598 show_pwm_temp_map 0 18598 NULL ++filemap_fdatawait_range_18600 filemap_fdatawait_range 0 18600 NULL nohasharray ++slabinfo_write_18600 slabinfo_write 0-3 18600 &filemap_fdatawait_range_18600 ++_nfs4_do_set_security_label_18602 _nfs4_do_set_security_label 0 18602 NULL ++transfer_18603 transfer 0 18603 NULL ++iowarrior_write_18604 iowarrior_write 3-0 18604 NULL ++netxen_netdev_event_18605 netxen_netdev_event 0 18605 NULL ++show_in_18609 show_in 0 18609 NULL nohasharray ++batadv_arp_get_type_18609 batadv_arp_get_type 3 18609 &show_in_18609 ++rtl8187b_init_status_urb_18610 rtl8187b_init_status_urb 0 18610 NULL ++bql_set_limit_18612 bql_set_limit 4-0 18612 NULL ++store_selfballoon_downhys_18615 store_selfballoon_downhys 0-4 18615 NULL ++pci_parent_bus_reset_18619 pci_parent_bus_reset 0 18619 NULL ++show_saturation_18621 show_saturation 0 18621 NULL ++read_hw_18624 read_hw 0-5-6 18624 NULL ++from_buffer_18625 from_buffer 3-0 18625 NULL ++adcxx_show_name_18627 adcxx_show_name 0 18627 NULL ++qlcnic_request_irq_18630 qlcnic_request_irq 0 18630 NULL ++dnrmg_hook_18631 dnrmg_hook 0 18631 NULL ++ext4_xattr_security_set_18633 ext4_xattr_security_set 0 18633 NULL ++edd_show_legacy_sectors_per_track_18638 edd_show_legacy_sectors_per_track 0 18638 NULL ++crypto_sha256_update_18640 crypto_sha256_update 0 18640 NULL nohasharray ++vnic_dev_cmd_18640 vnic_dev_cmd 0 18640 &crypto_sha256_update_18640 ++rocker_flow_tbl_term_mac_18641 rocker_flow_tbl_term_mac 0 18641 NULL nohasharray ++dwc3_gadget_start_18641 dwc3_gadget_start 0 18641 &rocker_flow_tbl_term_mac_18641 nohasharray ++lpfc_oas_tgt_store_18641 lpfc_oas_tgt_store 0-4 18641 &dwc3_gadget_start_18641 ++__dev_set_mtu_18647 __dev_set_mtu 0 18647 NULL ++as3935_sensor_sensitivity_show_18652 as3935_sensor_sensitivity_show 0 18652 NULL ++boot_vga_show_18654 boot_vga_show 0 18654 NULL ++show_18656 show 0 18656 NULL nohasharray ++gpiod_request_18656 gpiod_request 0 18656 &show_18656 nohasharray ++veth_get_sset_count_18656 veth_get_sset_count 0 18656 &gpiod_request_18656 ++snd_pcm_oss_write3_18657 snd_pcm_oss_write3 0-3 18657 NULL ++raid5_set_cache_size_18660 raid5_set_cache_size 0 18660 NULL ++ieee80211_if_fmt_rssi_threshold_18664 ieee80211_if_fmt_rssi_threshold 3 18664 NULL ++unmap_page_18665 unmap_page 3-2 18665 NULL ++xfs_iext_insert_18667 xfs_iext_insert 3 18667 NULL ++blk_mq_main_cpu_notify_18677 blk_mq_main_cpu_notify 0 18677 NULL ++wl12xx_set_authorized_18681 wl12xx_set_authorized 0 18681 NULL ++fnic_stats_debugfs_read_18688 fnic_stats_debugfs_read 3-0 18688 NULL ++snd_seq_timer_set_ppq_18693 snd_seq_timer_set_ppq 0 18693 NULL nohasharray ++echo_client_prep_commit_18693 echo_client_prep_commit 8 18693 &snd_seq_timer_set_ppq_18693 ++lbs_set_snmp_mib_18694 lbs_set_snmp_mib 0 18694 NULL ++cx231xx_send_usb_command_18699 cx231xx_send_usb_command 0 18699 NULL ++kernfs_iop_getattr_18700 kernfs_iop_getattr 0 18700 NULL ++w5300_get_regs_len_18702 w5300_get_regs_len 0 18702 NULL ++snd_pcm_do_pause_18703 snd_pcm_do_pause 0 18703 NULL ++replay_log_leb_18704 replay_log_leb 3 18704 NULL ++dlm_recoverd_start_18705 dlm_recoverd_start 0 18705 NULL ++iwl_dbgfs_rx_handlers_read_18708 iwl_dbgfs_rx_handlers_read 3-0 18708 NULL nohasharray ++vmci_q_header_buf_ready_18708 vmci_q_header_buf_ready 3-0 18708 &iwl_dbgfs_rx_handlers_read_18708 ++ceph_alloc_page_vector_18710 ceph_alloc_page_vector 1 18710 NULL ++fuse_dev_splice_write_18712 fuse_dev_splice_write 4 18712 NULL ++show_fc_starget_port_id_18713 show_fc_starget_port_id 0 18713 NULL ++nfs4_init_callback_netid_18717 nfs4_init_callback_netid 3 18717 NULL ++add_host_store_18718 add_host_store 0-3 18718 NULL ++dst_ca_read_18719 dst_ca_read 0-3 18719 NULL ++store_uevent_18721 store_uevent 0-4 18721 NULL ++pem_show_data_18725 pem_show_data 0 18725 NULL ++meye_s_ctrl_18733 meye_s_ctrl 0 18733 NULL ++wl12xx_top_reg_read_18735 wl12xx_top_reg_read 0 18735 NULL ++show_temp_auto_point1_temp_18736 show_temp_auto_point1_temp 0 18736 NULL ++store_scan_18738 store_scan 0-4 18738 NULL ++aa_getprocattr_18740 aa_getprocattr 0 18740 NULL nohasharray ++saa7110_s_stream_18740 saa7110_s_stream 0 18740 &aa_getprocattr_18740 ++o2hb_debug_create_18744 o2hb_debug_create 4 18744 NULL nohasharray ++memcg_alloc_cache_id_18744 memcg_alloc_cache_id 0 18744 &o2hb_debug_create_18744 ++show_fnode_max_recv_dlength_18750 show_fnode_max_recv_dlength 0 18750 NULL ++wep_packets_read_18751 wep_packets_read 3-0 18751 NULL ++iscsit_na_dataout_timeout_retries_18758 iscsit_na_dataout_timeout_retries 0 18758 NULL ++netxen_inetaddr_event_18760 netxen_inetaddr_event 0 18760 NULL ++power_mode_show_18761 power_mode_show 0 18761 NULL ++ov772x_mask_set_18767 ov772x_mask_set 0 18767 NULL nohasharray ++vsock_create_18767 vsock_create 0 18767 &ov772x_mask_set_18767 ++snd_cx18_pcm_ioctl_18773 snd_cx18_pcm_ioctl 0 18773 NULL nohasharray ++notify_free_show_18773 notify_free_show 0 18773 &snd_cx18_pcm_ioctl_18773 ++uinput_inject_events_18774 uinput_inject_events 0 18774 NULL ++SyS_lsetxattr_18776 SyS_lsetxattr 4 18776 NULL ++temp1_max_store_18777 temp1_max_store 0-4 18777 NULL ++hw_init_18779 hw_init 0 18779 NULL ++alloc_fcdev_18780 alloc_fcdev 1 18780 NULL ++hidp_raw_request_18781 hidp_raw_request 0-4 18781 NULL nohasharray ++show_vid_18781 show_vid 0 18781 &hidp_raw_request_18781 ++mfn_to_pfn_no_overrides_18783 mfn_to_pfn_no_overrides 0-1 18783 NULL ++show_fc_rport_fast_io_fail_tmo_18784 show_fc_rport_fast_io_fail_tmo 0 18784 NULL ++usb_reset_configuration_18787 usb_reset_configuration 0 18787 NULL ++acpi_ec_transaction_18803 acpi_ec_transaction 0 18803 NULL ++ims_pcu_attribute_show_18806 ims_pcu_attribute_show 0 18806 NULL nohasharray ++mutex_lock_killable_nested_18806 mutex_lock_killable_nested 0 18806 &ims_pcu_attribute_show_18806 ++show_fc_host_port_type_18810 show_fc_host_port_type 0 18810 NULL nohasharray ++ieee80211_auth_challenge_18810 ieee80211_auth_challenge 3 18810 &show_fc_host_port_type_18810 ++dm_stats_print_18815 dm_stats_print 7 18815 NULL ++iscsi_nacl_attrib_store_dataout_timeout_retries_18816 iscsi_nacl_attrib_store_dataout_timeout_retries 0-3 18816 NULL ++go7007_snd_pcm_prepare_18819 go7007_snd_pcm_prepare 0 18819 NULL ++disabled_show_18820 disabled_show 0 18820 NULL ++sys_modify_ldt_18824 sys_modify_ldt 3 18824 NULL ++playback_pcm_prepare_18828 playback_pcm_prepare 0 18828 NULL ++vmxnet3_create_queues_18830 vmxnet3_create_queues 0 18830 NULL ++nmclan_suspend_18833 nmclan_suspend 0 18833 NULL ++sanity_checks_store_18835 sanity_checks_store 0-3 18835 NULL ++vidioc_reqbufs_18839 vidioc_reqbufs 0 18839 NULL ++blkdev_write_iter_18840 blkdev_write_iter 0 18840 NULL ++mtf_test_write_18844 mtf_test_write 3-0 18844 NULL ++__uncore_flag_mode_show_18848 __uncore_flag_mode_show 0 18848 NULL ++show_tcpInErrs_18849 show_tcpInErrs 0 18849 NULL ++t3_sge_write_context_18852 t3_sge_write_context 0 18852 NULL ++drm_ht_create_18853 drm_ht_create 2 18853 NULL ++sctp_setsockopt_events_18862 sctp_setsockopt_events 3-0 18862 NULL ++mlx4_SET_PORT_qpn_calc_18866 mlx4_SET_PORT_qpn_calc 0 18866 NULL ++ieee80211_if_read_element_ttl_18869 ieee80211_if_read_element_ttl 3-0 18869 NULL ++xlog_find_verify_log_record_18870 xlog_find_verify_log_record 2 18870 NULL ++ubifs_tnc_locate_18876 ubifs_tnc_locate 0 18876 NULL ++scsi_change_queue_depth_18881 scsi_change_queue_depth 2-0 18881 NULL ++___alloc_bootmem_node_18882 ___alloc_bootmem_node 2 18882 NULL ++tps6507x_pmic_is_enabled_18883 tps6507x_pmic_is_enabled 0 18883 NULL ++tpacpi_driver_bluetooth_emulstate_show_18885 tpacpi_driver_bluetooth_emulstate_show 0 18885 NULL ++sta_tx_latency_stat_reset_write_18887 sta_tx_latency_stat_reset_write 0-3 18887 NULL ++lola_set_sample_rate_18888 lola_set_sample_rate 0 18888 NULL ++chip_name_store_18889 chip_name_store 0-4 18889 NULL ++imx074_cropcap_18891 imx074_cropcap 0 18891 NULL ++max77802_rtc_stop_alarm_18896 max77802_rtc_stop_alarm 0 18896 NULL ++rj54n1_set_rect_18898 rj54n1_set_rect 0 18898 NULL ++devm_mdiobus_alloc_size_18902 devm_mdiobus_alloc_size 2 18902 NULL nohasharray ++nilfs_btree_assign_v_18902 nilfs_btree_assign_v 0 18902 &devm_mdiobus_alloc_size_18902 nohasharray ++gro_cells_init_18902 gro_cells_init 0 18902 &nilfs_btree_assign_v_18902 ++ipw2100_set_mac_address_18908 ipw2100_set_mac_address 0 18908 NULL ++tracing_thresh_write_18909 tracing_thresh_write 3 18909 NULL ++show_fnode_data_pdu_in_order_18910 show_fnode_data_pdu_in_order 0 18910 NULL ++uwb_rc_scan_18911 uwb_rc_scan 0 18911 NULL ++set_temp2_crit_hyst_18912 set_temp2_crit_hyst 0-4 18912 NULL ++ceph_setxattr_18913 ceph_setxattr 4-0 18913 NULL nohasharray ++sess_setup_18913 sess_setup 0 18913 &ceph_setxattr_18913 ++rtl8187_init_hw_18914 rtl8187_init_hw 0 18914 NULL ++da9052_read_misc_channel_18915 da9052_read_misc_channel 0 18915 NULL ++lpfc_fdmi_on_store_18917 lpfc_fdmi_on_store 0-4 18917 NULL ++show_thermal_cruise_18919 show_thermal_cruise 0 18919 NULL ++mangle_packet_18920 mangle_packet 7-9 18920 NULL ++xfs_buf_read_uncached_18922 xfs_buf_read_uncached 3 18922 NULL nohasharray ++max_user_freq_store_18922 max_user_freq_store 0-4 18922 &xfs_buf_read_uncached_18922 ++snapshot_write_next_18937 snapshot_write_next 0 18937 NULL ++mxl5005s_SetRfFreqHz_18939 mxl5005s_SetRfFreqHz 0 18939 NULL ++fmc_device_register_n_18942 fmc_device_register_n 2 18942 NULL ++mtrr_del_18943 mtrr_del 1 18943 NULL ++ida_get_new_18948 ida_get_new 0 18948 NULL ++svc_sock_reclen_18950 svc_sock_reclen 0 18950 NULL ++alloc_rx_slot_18951 alloc_rx_slot 0 18951 NULL ++inv_mpu6050_set_enable_18952 inv_mpu6050_set_enable 0 18952 NULL nohasharray ++sctp_tsnmap_num_gabs_18952 sctp_tsnmap_num_gabs 0 18952 &inv_mpu6050_set_enable_18952 ++__br_netpoll_enable_18953 __br_netpoll_enable 0 18953 NULL ++store_18955 store 0 18955 NULL ++dma_common_pages_remap_18966 dma_common_pages_remap 2 18966 NULL ++ipv6_defrag_18967 ipv6_defrag 0 18967 NULL nohasharray ++readfn_18967 readfn 0-3 18967 &ipv6_defrag_18967 ++lpfc_static_vport_show_18970 lpfc_static_vport_show 0 18970 NULL ++rbd_minor_show_18974 rbd_minor_show 0 18974 NULL nohasharray ++ath9k_htc_get_stats_18974 ath9k_htc_get_stats 0 18974 &rbd_minor_show_18974 ++twl4030reg_is_enabled_18977 twl4030reg_is_enabled 0 18977 NULL ++tty_write_lock_18991 tty_write_lock 0 18991 NULL ++net_open_18997 net_open 0 18997 NULL ++si4713_transfer_18998 si4713_transfer 0-3 18998 NULL nohasharray ++store_18998 store 0-3 18998 &si4713_transfer_18998 ++bnx2x_init_hw_18999 bnx2x_init_hw 0 18999 NULL ++rt2400pci_set_state_19000 rt2400pci_set_state 0 19000 NULL nohasharray ++phy_scan_fixups_19000 phy_scan_fixups 0 19000 &rt2400pci_set_state_19000 ++show_frontswap_inertia_19004 show_frontswap_inertia 0 19004 NULL ++mei_me_fw_status_19005 mei_me_fw_status 0 19005 NULL ++ibm_get_attention_status_19006 ibm_get_attention_status 0 19006 NULL nohasharray ++layout_in_gaps_19006 layout_in_gaps 0-2 19006 &ibm_get_attention_status_19006 ++acpi_ev_initialize_region_19007 acpi_ev_initialize_region 0 19007 NULL ++wait_port_writable_19011 wait_port_writable 0 19011 NULL ++f2fs_setxattr_19012 f2fs_setxattr 0 19012 NULL ++hash_netport6_expire_19013 hash_netport6_expire 4 19013 NULL ++rc5t583_rtc_set_alarm_19017 rc5t583_rtc_set_alarm 0 19017 NULL nohasharray ++store_shost_state_19017 store_shost_state 0-4 19017 &rc5t583_rtc_set_alarm_19017 ++xfs_trans_roll_19018 xfs_trans_roll 0 19018 NULL ++tcp_port_write_19020 tcp_port_write 3-0 19020 NULL ++cachefiles_daemon_bind_19023 cachefiles_daemon_bind 0 19023 NULL nohasharray ++rtl92de_hw_init_19023 rtl92de_hw_init 0 19023 &cachefiles_daemon_bind_19023 ++edac_pci_dev_store_19027 edac_pci_dev_store 0-4 19027 NULL ++xgmac_dma_desc_rings_init_19032 xgmac_dma_desc_rings_init 0 19032 NULL ++sysfs_create_dir_ns_19033 sysfs_create_dir_ns 0 19033 NULL ++revalidate_19043 revalidate 2-0 19043 NULL nohasharray ++mb862xx_i2c_write_19043 mb862xx_i2c_write 0 19043 &revalidate_19043 nohasharray ++snprintk_buf_19043 snprintk_buf 0 19043 &mb862xx_i2c_write_19043 nohasharray ++acpi_install_table_19043 acpi_install_table 1 19043 &snprintk_buf_19043 ++drm_fb_helper_init_19044 drm_fb_helper_init 4-3 19044 NULL ++acpi_ds_get_package_arguments_19046 acpi_ds_get_package_arguments 0 19046 NULL nohasharray ++demote_rq_store_19046 demote_rq_store 0-3 19046 &acpi_ds_get_package_arguments_19046 ++afs_vnode_store_data_19048 afs_vnode_store_data 0 19048 NULL ++osc_pinger_recov_seq_write_19056 osc_pinger_recov_seq_write 3 19056 NULL ++pas_audio_prepare_for_input_19057 pas_audio_prepare_for_input 0 19057 NULL nohasharray ++il_process_add_sta_resp_19057 il_process_add_sta_resp 0 19057 &pas_audio_prepare_for_input_19057 ++ads7846_disable_show_19061 ads7846_disable_show 0 19061 NULL ++create_gpadl_header_19064 create_gpadl_header 2 19064 NULL ++transient_duration_show_19065 transient_duration_show 0 19065 NULL ++msix_map_region_19072 msix_map_region 2 19072 NULL ++tg3_get_rxfh_indir_size_19074 tg3_get_rxfh_indir_size 0 19074 NULL ++atkbd_do_show_extra_19077 atkbd_do_show_extra 0 19077 NULL ++selinux_ip_output_19078 selinux_ip_output 0 19078 NULL ++ceph_create_snap_context_19082 ceph_create_snap_context 1 19082 NULL nohasharray ++show_fc_host_symbolic_name_19082 show_fc_host_symbolic_name 0 19082 &ceph_create_snap_context_19082 ++show_sched7_19083 show_sched7 0 19083 NULL ++abx500_get_register_interruptible_19084 abx500_get_register_interruptible 0 19084 NULL ++write_19086 write 0 19086 NULL ++sys_process_vm_readv_19090 sys_process_vm_readv 3-5 19090 NULL nohasharray ++brcmf_usbdev_qinit_19090 brcmf_usbdev_qinit 2 19090 &sys_process_vm_readv_19090 ++fw_flash_update_req_19092 fw_flash_update_req 0 19092 NULL ++nouveau_sysfs_pstate_get_19094 nouveau_sysfs_pstate_get 0 19094 NULL ++write_byte_19095 write_byte 0 19095 NULL ++bcmgenet_init_rx_ring_19100 bcmgenet_init_rx_ring 0 19100 NULL ++snd_pcm_oss_period_size_19101 snd_pcm_oss_period_size 0 19101 NULL ++lm3556_indicator_pattern_store_19105 lm3556_indicator_pattern_store 0-4 19105 NULL ++sta_last_seq_ctrl_read_19106 sta_last_seq_ctrl_read 3-0 19106 NULL ++cifs_readv_from_socket_19109 cifs_readv_from_socket 3-4-0 19109 NULL ++befs_statfs_19114 befs_statfs 0 19114 NULL ++b43_gphy_op_init_19116 b43_gphy_op_init 0 19116 NULL ++eni_setsockopt_19118 eni_setsockopt 0 19118 NULL ++ov6650_g_fmt_19124 ov6650_g_fmt 0 19124 NULL nohasharray ++nb_callback_19124 nb_callback 0 19124 &ov6650_g_fmt_19124 ++ext4_inode_table_19125 ext4_inode_table 0 19125 NULL nohasharray ++bh1770_prox_persistence_store_19125 bh1770_prox_persistence_store 0-4 19125 &ext4_inode_table_19125 ++max14577_read_reg_19127 max14577_read_reg 0 19127 NULL ++mcam_vb_sg_buf_prepare_19130 mcam_vb_sg_buf_prepare 0 19130 NULL ++show_alarms_reg_19136 show_alarms_reg 0 19136 NULL ++lpfc_mlomgmt_show_19137 lpfc_mlomgmt_show 0 19137 NULL nohasharray ++__gfs2_xattr_set_19137 __gfs2_xattr_set 0 19137 &lpfc_mlomgmt_show_19137 nohasharray ++tg3_phy_reset_chanpat_19137 tg3_phy_reset_chanpat 0 19137 &__gfs2_xattr_set_19137 ++adp8860_bl_l1_daylight_dim_show_19139 adp8860_bl_l1_daylight_dim_show 0 19139 NULL ++alloc_irdadev_19140 alloc_irdadev 1 19140 NULL ++snd_pcm_lib_ioctl_fifo_size_19142 snd_pcm_lib_ioctl_fifo_size 0 19142 NULL ++o2nm_cluster_show_19143 o2nm_cluster_show 0 19143 NULL ++koneplus_sysfs_show_firmware_version_19147 koneplus_sysfs_show_firmware_version 0 19147 NULL ++nfs4_handle_exception_19150 nfs4_handle_exception 0-2 19150 NULL ++mls_context_to_sid_19151 mls_context_to_sid 0 19151 NULL ++sleep_auth_read_19159 sleep_auth_read 3-0 19159 NULL ++store_virtual_19163 store_virtual 0-4 19163 NULL nohasharray ++ext3_reserve_inode_write_19163 ext3_reserve_inode_write 0 19163 &store_virtual_19163 ++p2wi_smbus_xfer_19165 p2wi_smbus_xfer 0 19165 NULL ++smk_write_access2_19170 smk_write_access2 3-0 19170 NULL ++show_fcstat_fcp_output_requests_19177 show_fcstat_fcp_output_requests 0 19177 NULL ++task_exit_notify_19181 task_exit_notify 0 19181 NULL ++read_extent_buffer_to_user_19189 read_extent_buffer_to_user 4-3 19189 NULL nohasharray ++snd_riptide_trigger_19189 snd_riptide_trigger 0 19189 &read_extent_buffer_to_user_19189 ++show_service_id_19190 show_service_id 0 19190 NULL ++vlan_protocol_show_19193 vlan_protocol_show 0 19193 NULL ++__iscsi_tpg_auth_show_userid_mutual_19197 __iscsi_tpg_auth_show_userid_mutual 0 19197 NULL ++_ctl_board_tracer_show_19199 _ctl_board_tracer_show 0 19199 NULL ++nouveau_hwmon_critical_temp_hyst_19201 nouveau_hwmon_critical_temp_hyst 0 19201 NULL ++nilfs_direct_check_insert_19202 nilfs_direct_check_insert 0-2 19202 NULL ++tw9910_s_stream_19204 tw9910_s_stream 0 19204 NULL nohasharray ++mlx4_unicast_attach_19204 mlx4_unicast_attach 0 19204 &tw9910_s_stream_19204 ++iwl_dbgfs_reply_tx_error_read_19205 iwl_dbgfs_reply_tx_error_read 3-0 19205 NULL ++qlcnic_store_beacon_19206 qlcnic_store_beacon 0-4 19206 NULL ++show_sys_image_guid_19207 show_sys_image_guid 0 19207 NULL ++dev_counters_read_19216 dev_counters_read 3-0 19216 NULL ++wbcir_tx_19219 wbcir_tx 3 19219 NULL ++nouveau_hwmon_max_temp_19222 nouveau_hwmon_max_temp 0 19222 NULL ++snd_mask_max_19224 snd_mask_max 0 19224 NULL ++_ctl_host_trace_buffer_enable_show_19227 _ctl_host_trace_buffer_enable_show 0 19227 NULL ++kxcjk1013_validate_trigger_19230 kxcjk1013_validate_trigger 0 19230 NULL ++vnic_dev_cmd_proxy_19232 vnic_dev_cmd_proxy 0 19232 NULL ++bio_alloc_mddev_19238 bio_alloc_mddev 2 19238 NULL ++airspy_set_mixer_gain_19239 airspy_set_mixer_gain 0 19239 NULL nohasharray ++stk_s_ctrl_19239 stk_s_ctrl 0 19239 &airspy_set_mixer_gain_19239 nohasharray ++set_attr_powered_19239 set_attr_powered 0-4 19239 &stk_s_ctrl_19239 ++smp_call_function_single_19240 smp_call_function_single 0 19240 NULL nohasharray ++w5300_set_macaddr_19240 w5300_set_macaddr 0 19240 &smp_call_function_single_19240 ++selinux_inode_getsecctx_19244 selinux_inode_getsecctx 0 19244 NULL nohasharray ++eth_validate_addr_19244 eth_validate_addr 0 19244 &selinux_inode_getsecctx_19244 ++store_priv_session_recovery_tmo_19245 store_priv_session_recovery_tmo 0-4 19245 NULL ++aac_show_max_channel_19248 aac_show_max_channel 0 19248 NULL ++bttv_risc_packed_19255 bttv_risc_packed 0 19255 NULL ++ucma_query_19260 ucma_query 4 19260 NULL nohasharray ++lp3972_ldo_is_enabled_19260 lp3972_ldo_is_enabled 0 19260 &ucma_query_19260 ++wdog_panic_handler_19262 wdog_panic_handler 0 19262 NULL ++store_19264 store 0-3 19264 NULL nohasharray ++fb_check_var_19264 fb_check_var 0 19264 &store_19264 ++twl_show_stats_19266 twl_show_stats 0 19266 NULL ++isight_start_streaming_19267 isight_start_streaming 0 19267 NULL nohasharray ++sys_fcntl_19267 sys_fcntl 3 19267 &isight_start_streaming_19267 nohasharray ++show_sys_hwmon_19267 show_sys_hwmon 0 19267 &sys_fcntl_19267 nohasharray ++bru_s_stream_19267 bru_s_stream 0 19267 &show_sys_hwmon_19267 ++store_engine1_load_19269 store_engine1_load 4-0 19269 NULL ++rtl_pci_start_19273 rtl_pci_start 0 19273 NULL ++tps65910_rtc_set_alarm_19275 tps65910_rtc_set_alarm 0 19275 NULL ++patch_si3054_19278 patch_si3054 0 19278 NULL ++il_dbgfs_rxon_filter_flags_read_19281 il_dbgfs_rxon_filter_flags_read 3-0 19281 NULL ++md5_export_19284 md5_export 0 19284 NULL nohasharray ++io_mapping_map_wc_19284 io_mapping_map_wc 2 19284 &md5_export_19284 ++batadv_tt_save_orig_buffer_19288 batadv_tt_save_orig_buffer 4 19288 NULL ++snd_rawmidi_dev_register_19290 snd_rawmidi_dev_register 0 19290 NULL ++show_in_max1_19293 show_in_max1 0 19293 NULL ++virtnet_change_mtu_19294 virtnet_change_mtu 0 19294 NULL ++patch_simple_hdmi_19296 patch_simple_hdmi 0 19296 NULL ++TermChar_show_19300 TermChar_show 0 19300 NULL ++fan_pwm1_show_19301 fan_pwm1_show 0 19301 NULL ++ocfs2_prepare_inode_for_refcount_19303 ocfs2_prepare_inode_for_refcount 0 19303 NULL ++event_tx_stuck_read_19305 event_tx_stuck_read 3-0 19305 NULL ++bh1770_prox_persistence_show_19308 bh1770_prox_persistence_show 0 19308 NULL nohasharray ++jffs2_do_setattr_19308 jffs2_do_setattr 0 19308 &bh1770_prox_persistence_show_19308 ++mtd_write_oob_19310 mtd_write_oob 0 19310 NULL ++sr_write_gpio_19313 sr_write_gpio 0 19313 NULL ++task_free_notify_19318 task_free_notify 0 19318 NULL nohasharray ++update_scan_mode_19318 update_scan_mode 0 19318 &task_free_notify_19318 ++cx25821_upstream_buffer_prepare_19320 cx25821_upstream_buffer_prepare 0 19320 NULL ++debug_read_19322 debug_read 3-0 19322 NULL nohasharray ++rsxx_creg_read_19322 rsxx_creg_read 0 19322 &debug_read_19322 ++SYSC_sendfile64_19327 SYSC_sendfile64 4 19327 NULL nohasharray ++wl1251_boot_run_firmware_19327 wl1251_boot_run_firmware 0 19327 &SYSC_sendfile64_19327 ++elan_smbus_get_checksum_19330 elan_smbus_get_checksum 0 19330 NULL ++lbs_host_sleep_write_19332 lbs_host_sleep_write 3-0 19332 NULL ++pwc_set_u16_ctrl_19335 pwc_set_u16_ctrl 0 19335 NULL nohasharray ++ov7670_store_cmatrix_19335 ov7670_store_cmatrix 0 19335 &pwc_set_u16_ctrl_19335 ++saa7706h_set_reg24_19339 saa7706h_set_reg24 0 19339 NULL ++bq32k_read_19342 bq32k_read 0 19342 NULL ++group_show_19349 group_show 0 19349 NULL ++__uncore_filter_isoc_show_19351 __uncore_filter_isoc_show 0 19351 NULL ++bnx2x_get_phys_port_id_19355 bnx2x_get_phys_port_id 0 19355 NULL ++si4713_choose_econtrol_action_19357 si4713_choose_econtrol_action 0 19357 NULL ++musb_urb_enqueue_19358 musb_urb_enqueue 0 19358 NULL ++firmware_data_write_19360 firmware_data_write 0-6-5 19360 NULL ++mmio32read__write_file_19364 mmio32read__write_file 0 19364 NULL ++ipheth_open_19366 ipheth_open 0 19366 NULL ++qlge_vlan_rx_add_vid_19385 qlge_vlan_rx_add_vid 0 19385 NULL ++interpret_user_input_19393 interpret_user_input 2-0 19393 NULL ++v9fs_xattr_security_set_19396 v9fs_xattr_security_set 0 19396 NULL nohasharray ++lxt973a2_read_status_19396 lxt973a2_read_status 0 19396 &v9fs_xattr_security_set_19396 ++sync_fill_pt_info_19397 sync_fill_pt_info 0 19397 NULL ++get_unaligned_be16_19400 get_unaligned_be16 0 19400 NULL ++get_n_events_by_type_19401 get_n_events_by_type 0 19401 NULL nohasharray ++read_values_19401 read_values 0 19401 &get_n_events_by_type_19401 ++pep_recvmsg_19402 pep_recvmsg 0-4 19402 NULL ++recover_timer_write_19403 recover_timer_write 3-0 19403 NULL ++hid_hw_raw_request_19408 hid_hw_raw_request 0 19408 NULL ++compr_flush_19409 compr_flush 2 19409 NULL ++show_counter_rx_buf_ovfls_19414 show_counter_rx_buf_ovfls 0 19414 NULL nohasharray ++perf_reboot_19414 perf_reboot 0 19414 &show_counter_rx_buf_ovfls_19414 ++target_fabric_tpg_param_attr_store_19419 target_fabric_tpg_param_attr_store 0-4 19419 NULL ++synproxy_options_size_19422 synproxy_options_size 0 19422 NULL ++dvbdmx_write_19423 dvbdmx_write 3 19423 NULL ++write_begin_19424 write_begin 0 19424 NULL ++snd_seq_ioctl_delete_port_19425 snd_seq_ioctl_delete_port 0 19425 NULL ++packet_read_list_19427 packet_read_list 0 19427 NULL ++cond_search_mask_read_19430 cond_search_mask_read 0-5-6 19430 NULL ++esas2r_write_fw_19434 esas2r_write_fw 0-3-4 19434 NULL nohasharray ++__phys_addr_19434 __phys_addr 0 19434 &esas2r_write_fw_19434 ++xfs_qm_vop_dqalloc_19436 xfs_qm_vop_dqalloc 0 19436 NULL nohasharray ++rds_cancel_sent_to_19436 rds_cancel_sent_to 0 19436 &xfs_qm_vop_dqalloc_19436 ++snd_pcm_do_drain_init_19442 snd_pcm_do_drain_init 0 19442 NULL nohasharray ++p2m_timeout_store_19442 p2m_timeout_store 0-4 19442 &snd_pcm_do_drain_init_19442 ++store_19443 store 0 19443 NULL ++SyS_sched_getaffinity_19444 SyS_sched_getaffinity 2 19444 NULL ++double_flag_store_19445 double_flag_store 0-4 19445 NULL ++show_iface_mtu_19446 show_iface_mtu 0 19446 NULL ++store_link_state_19448 store_link_state 0-4 19448 NULL ++ds2781_set_pio_pin_19451 ds2781_set_pio_pin 0-4 19451 NULL ++tps6507x_pmic_disable_19465 tps6507x_pmic_disable 0 19465 NULL ++team_device_event_19466 team_device_event 0 19466 NULL ++gp2ap020a00f_get_thresh_reg_19468 gp2ap020a00f_get_thresh_reg 0 19468 NULL ++sctp_cmd_interpreter_19470 sctp_cmd_interpreter 0 19470 NULL ++acpi_ut_validate_buffer_19473 acpi_ut_validate_buffer 0 19473 NULL ++ab3100_get_register_interruptible_19474 ab3100_get_register_interruptible 0 19474 NULL ++refill_pool_19477 refill_pool 2 19477 NULL ++pxa_ep_queue_19480 pxa_ep_queue 0 19480 NULL ++tipc_link_xmit_19481 tipc_link_xmit 0 19481 NULL ++ksz9031_config_init_19483 ksz9031_config_init 0 19483 NULL ++cpuset_can_attach_19498 cpuset_can_attach 0 19498 NULL ++kstrtoll_from_user_19500 kstrtoll_from_user 2 19500 NULL ++dequeue_signal_19504 dequeue_signal 0 19504 NULL ++show_phys_width_19505 show_phys_width 0 19505 NULL nohasharray ++bnx2fc_vport_destroy_19505 bnx2fc_vport_destroy 0 19505 &show_phys_width_19505 ++security_inode_setxattr_19506 security_inode_setxattr 0 19506 NULL ++usb6fire_pcm_set_rate_19507 usb6fire_pcm_set_rate 0 19507 NULL ++i2c_nuvoton_send_19508 i2c_nuvoton_send 0-3 19508 NULL nohasharray ++rio_setup_inb_dbell_19508 rio_setup_inb_dbell 0 19508 &i2c_nuvoton_send_19508 ++ext4_add_new_descs_19509 ext4_add_new_descs 3 19509 NULL ++i40e_get_regs_len_19512 i40e_get_regs_len 0 19512 NULL ++ath10k_mem_value_write_19516 ath10k_mem_value_write 3-0 19516 NULL nohasharray ++skb_realloc_headroom_19516 skb_realloc_headroom 2 19516 &ath10k_mem_value_write_19516 ++atm_alloc_charge_19517 atm_alloc_charge 2 19517 NULL nohasharray ++dev_alloc_skb_19517 dev_alloc_skb 1 19517 &atm_alloc_charge_19517 ++batadv_tvlv_container_register_19520 batadv_tvlv_container_register 5 19520 NULL ++gmbus_wait_hw_status_19522 gmbus_wait_hw_status 0 19522 NULL nohasharray ++reg_write_19522 reg_write 0 19522 &gmbus_wait_hw_status_19522 nohasharray ++__uncore_filter_tid3_show_19522 __uncore_filter_tid3_show 0 19522 ®_write_19522 ++pages_sharing_show_19524 pages_sharing_show 0 19524 NULL nohasharray ++lpfc_oas_lun_state_set_19524 lpfc_oas_lun_state_set 0 19524 &pages_sharing_show_19524 ++iscsi_stat_instance_show_attr_fail_sess_19526 iscsi_stat_instance_show_attr_fail_sess 0 19526 NULL ++jfs_fsync_19527 jfs_fsync 0 19527 NULL ++set_eeprom3_19532 set_eeprom3 4-0 19532 NULL ++nfc_llcp_build_tlv_19536 nfc_llcp_build_tlv 3 19536 NULL nohasharray ++qla4xxx_phy_port_cnt_show_19536 qla4xxx_phy_port_cnt_show 0 19536 &nfc_llcp_build_tlv_19536 ++__videobuf_iolock_19538 __videobuf_iolock 0 19538 NULL ++rx_packets_show_19543 rx_packets_show 0 19543 NULL nohasharray ++vfb_check_var_19543 vfb_check_var 0 19543 &rx_packets_show_19543 ++koneplus_sysfs_read_sensor_19544 koneplus_sysfs_read_sensor 0-5-6 19544 NULL ++pppoe_device_event_19547 pppoe_device_event 0 19547 NULL ++cifs_revalidate_dentry_attr_19548 cifs_revalidate_dentry_attr 0 19548 NULL ++pcrlock_19550 pcrlock 0 19550 NULL ++shutdown_status_show_19554 shutdown_status_show 0 19554 NULL nohasharray ++apds990x_prox_reporting_mode_show_19554 apds990x_prox_reporting_mode_show 0 19554 &shutdown_status_show_19554 ++set_pec_19556 set_pec 0-4 19556 NULL ++eem_opts_ifname_show_19558 eem_opts_ifname_show 0 19558 NULL nohasharray ++smack_inode_setsecurity_19558 smack_inode_setsecurity 0 19558 &eem_opts_ifname_show_19558 ++kernel_read_19559 kernel_read 0-4 19559 NULL ++usb_show_dynids_19560 usb_show_dynids 0 19560 NULL ++xen_release_ptpage_19561 xen_release_ptpage 1 19561 NULL ++ocfs2_control_message_19564 ocfs2_control_message 3-0 19564 NULL ++wlcore_hw_get_rx_packet_len_19565 wlcore_hw_get_rx_packet_len 0 19565 NULL ++sctp_disconnect_19567 sctp_disconnect 0 19567 NULL ++nfsd_read_19568 nfsd_read 5 19568 NULL ++iscsi_tpg_param_show_TargetAlias_19570 iscsi_tpg_param_show_TargetAlias 0 19570 NULL ++edac_device_ctl_poll_msec_store_19573 edac_device_ctl_poll_msec_store 0-3 19573 NULL ++set_rx_filter_19574 set_rx_filter 0 19574 NULL ++ieee80211_key_alloc_19575 ieee80211_key_alloc 3 19575 NULL ++rcutorture_cpu_notify_19581 rcutorture_cpu_notify 0 19581 NULL ++__da903x_read_19582 __da903x_read 0 19582 NULL ++bm_status_read_19583 bm_status_read 3-0 19583 NULL ++load_xattr_datum_19594 load_xattr_datum 0 19594 NULL nohasharray ++selinux_inode_getattr_19594 selinux_inode_getattr 0 19594 &load_xattr_datum_19594 nohasharray ++com20020_set_hwaddr_19594 com20020_set_hwaddr 0 19594 &selinux_inode_getattr_19594 ++show_message_age_timer_19595 show_message_age_timer 0 19595 NULL ++iwl_pcie_load_cpu_sections_19600 iwl_pcie_load_cpu_sections 0 19600 NULL ++msi_bus_store_19603 msi_bus_store 0-4 19603 NULL ++drbg_sec_strength_19604 drbg_sec_strength 0 19604 NULL ++reg_reqs_19606 reg_reqs 0 19606 NULL nohasharray ++hdmi_create_eld_ctl_19606 hdmi_create_eld_ctl 0 19606 ®_reqs_19606 ++qib_aio_write_19613 qib_aio_write 0 19613 NULL ++show_srp_rport_state_19617 show_srp_rport_state 0 19617 NULL nohasharray ++_ctl_host_trace_buffer_store_19617 _ctl_host_trace_buffer_store 0-4 19617 &show_srp_rport_state_19617 ++lm8323_set_disable_19619 lm8323_set_disable 0-4 19619 NULL ++fmc_read_eeprom_19626 fmc_read_eeprom 0-5-6 19626 NULL ++get_rfc1002_length_19628 get_rfc1002_length 0 19628 NULL ++show_failed_reconnects_19629 show_failed_reconnects 0 19629 NULL ++set_spdif_rate_19632 set_spdif_rate 0 19632 NULL nohasharray ++init_verbs_show_19632 init_verbs_show 0 19632 &set_spdif_rate_19632 ++__mei_cl_recv_19636 __mei_cl_recv 3 19636 NULL ++s2255_s_ctrl_19642 s2255_s_ctrl 0 19642 NULL nohasharray ++selinux_syslog_19642 selinux_syslog 0 19642 &s2255_s_ctrl_19642 ++bridge_id_show_19644 bridge_id_show 0 19644 NULL ++__zs_cpu_up_19647 __zs_cpu_up 0 19647 NULL ++advwdt_write_19648 advwdt_write 0-3 19648 NULL nohasharray ++xadc_power_adc_b_19648 xadc_power_adc_b 0 19648 &advwdt_write_19648 ++au8522_s_stream_19649 au8522_s_stream 0 19649 NULL ++cm_get_battery_temperature_19650 cm_get_battery_temperature 0 19650 NULL ++parser_init_19651 parser_init 2 19651 NULL ++usbvision_rvmalloc_19655 usbvision_rvmalloc 1 19655 NULL nohasharray ++xfs_attr_args_init_19655 xfs_attr_args_init 0 19655 &usbvision_rvmalloc_19655 ++LoadBitmap_19658 LoadBitmap 2 19658 NULL nohasharray ++gpiochip_lock_as_irq_19658 gpiochip_lock_as_irq 0 19658 &LoadBitmap_19658 ++pwm_polarity_show_19660 pwm_polarity_show 0 19660 NULL nohasharray ++instantiate_19660 instantiate 0 19660 &pwm_polarity_show_19660 nohasharray ++iwl_dbgfs_pm_params_write_19660 iwl_dbgfs_pm_params_write 0-3 19660 &instantiate_19660 ++edd_show_interface_19665 edd_show_interface 0 19665 NULL nohasharray ++wl1271_acx_beacon_filter_table_19665 wl1271_acx_beacon_filter_table 0 19665 &edd_show_interface_19665 ++ath10k_read_pktlog_filter_19667 ath10k_read_pktlog_filter 3-0 19667 NULL ++selinux_socket_sendmsg_19668 selinux_socket_sendmsg 0 19668 NULL ++show_crash_notes_size_19669 show_crash_notes_size 0 19669 NULL ++nettel_reboot_notifier_19672 nettel_reboot_notifier 0 19672 NULL nohasharray ++enable_19672 enable 0 19672 &nettel_reboot_notifier_19672 ++acpi_read_slow_19673 acpi_read_slow 3-2 19673 NULL ++usbnet_write_cmd_19679 usbnet_write_cmd 0-7 19679 NULL ++pm8001_chip_fw_flash_update_build_19685 pm8001_chip_fw_flash_update_build 0 19685 NULL ++edac_device_ctl_panic_on_ue_store_19687 edac_device_ctl_panic_on_ue_store 0-3 19687 NULL ++validate_npar_config_19688 validate_npar_config 0 19688 NULL ++airspy_queue_setup_19692 airspy_queue_setup 0 19692 NULL ++f2fs_issue_flush_19697 f2fs_issue_flush 0 19697 NULL ++hints_show_19705 hints_show 0 19705 NULL ++i2c_smbus_write_i2c_block_data_19706 i2c_smbus_write_i2c_block_data 0 19706 NULL nohasharray ++store_fan_div_19706 store_fan_div 0-4 19706 &i2c_smbus_write_i2c_block_data_19706 ++memblock_virt_alloc_low_nopanic_19714 memblock_virt_alloc_low_nopanic 1 19714 NULL ++read_reg_19723 read_reg 0 19723 NULL nohasharray ++port_enable_19723 port_enable 0 19723 &read_reg_19723 ++wm8350_block_write_19727 wm8350_block_write 2-3-0 19727 NULL ++target_stat_scsi_transport_show_attr_inst_19730 target_stat_scsi_transport_show_attr_inst 0 19730 NULL ++memcpy_toiovecend_19736 memcpy_toiovecend 3-4 19736 NULL ++iwlagn_commit_rxon_19737 iwlagn_commit_rxon 0 19737 NULL ++snd_usX2Y_usbpcm_prepare_19741 snd_usX2Y_usbpcm_prepare 0 19741 NULL ++p9_client_read_19750 p9_client_read 5-0 19750 NULL ++lookup_level0_dirty_19752 lookup_level0_dirty 0 19752 NULL ++pnpbios_proc_write_19758 pnpbios_proc_write 3 19758 NULL ++ocfs2_readpages_19759 ocfs2_readpages 4 19759 NULL nohasharray ++broadsheet_spiflash_write_sector_19759 broadsheet_spiflash_write_sector 0 19759 &ocfs2_readpages_19759 ++jffs2_acl_from_medium_19762 jffs2_acl_from_medium 2 19762 NULL ++osst_recover_wait_frame_19766 osst_recover_wait_frame 0 19766 NULL ++readhscx_19769 readhscx 0 19769 NULL ++flush_write_buffer_19770 flush_write_buffer 0 19770 NULL ++pch_phub_gbe_serial_rom_conf_mp_19773 pch_phub_gbe_serial_rom_conf_mp 0 19773 NULL ++ipath_f_get_base_info_19778 ipath_f_get_base_info 0 19778 NULL ++set_battery_life_extender_19779 set_battery_life_extender 0-4 19779 NULL ++saa7146_vmalloc_build_pgtable_19780 saa7146_vmalloc_build_pgtable 2 19780 NULL nohasharray ++v3020_read_time_19780 v3020_read_time 0 19780 &saa7146_vmalloc_build_pgtable_19780 nohasharray ++pm80xx_chip_ssp_io_req_19780 pm80xx_chip_ssp_io_req 0 19780 &v3020_read_time_19780 ++target_core_alua_tg_pt_gp_show_attr_alua_support_lba_dependent_19782 target_core_alua_tg_pt_gp_show_attr_alua_support_lba_dependent 0 19782 NULL ++team_change_mtu_19785 team_change_mtu 0 19785 NULL ++max_adj_show_19786 max_adj_show 0 19786 NULL nohasharray ++ixgbe_fcoe_ddp_get_19786 ixgbe_fcoe_ddp_get 4 19786 &max_adj_show_19786 ++efm32_i2c_master_xfer_19788 efm32_i2c_master_xfer 0-3 19788 NULL ++elan_sysfs_read_product_id_19789 elan_sysfs_read_product_id 0 19789 NULL ++multicast_querier_interval_store_19790 multicast_querier_interval_store 4-0 19790 NULL ++si3054_build_controls_19795 si3054_build_controls 0 19795 NULL ++ems_usb_write_mode_19800 ems_usb_write_mode 0 19800 NULL nohasharray ++btree_migratepage_19800 btree_migratepage 0 19800 &ems_usb_write_mode_19800 ++check_acpi_ids_19802 check_acpi_ids 0 19802 NULL ++memory_isolate_notify_19808 memory_isolate_notify 0 19808 NULL ++store_thermal_cruise_19810 store_thermal_cruise 0-4 19810 NULL ++ext2_setsize_19812 ext2_setsize 0 19812 NULL ++m2p_19814 m2p 1 19814 NULL ++fsa9480_show_manualsw_19815 fsa9480_show_manualsw 0 19815 NULL ++ath10k_write_htt_max_amsdu_ampdu_19820 ath10k_write_htt_max_amsdu_ampdu 3-0 19820 NULL ++mwl8k_get_stats_19823 mwl8k_get_stats 0 19823 NULL nohasharray ++iwl_dbgfs_disable_power_off_write_19823 iwl_dbgfs_disable_power_off_write 0-3 19823 &mwl8k_get_stats_19823 ++irda_setsockopt_19824 irda_setsockopt 5-0 19824 NULL nohasharray ++index_show_19824 index_show 0 19824 &irda_setsockopt_19824 ++xfs_bmap_add_extent_hole_real_19828 xfs_bmap_add_extent_hole_real 0 19828 NULL ++pcpu_next_unpop_19831 pcpu_next_unpop 4 19831 NULL ++vfs_getxattr_19832 vfs_getxattr 0 19832 NULL nohasharray ++hash_walk_new_entry_19832 hash_walk_new_entry 0 19832 &vfs_getxattr_19832 ++c2port_show_flash_size_19834 c2port_show_flash_size 0 19834 NULL ++__vfs_setxattr_noperm_19838 __vfs_setxattr_noperm 0 19838 NULL ++bad_inode_listxattr_19840 bad_inode_listxattr 0-3 19840 NULL ++_regulator_disable_19841 _regulator_disable 0 19841 NULL ++ks959_change_speed_19843 ks959_change_speed 0 19843 NULL ++crypt_alloc_buffer_19846 crypt_alloc_buffer 2 19846 NULL ++ath10k_vdev_setup_sync_19847 ath10k_vdev_setup_sync 0 19847 NULL ++ieee80211_mesh_rx_mgmt_action_19849 ieee80211_mesh_rx_mgmt_action 3 19849 NULL ++oti6858_open_19850 oti6858_open 0 19850 NULL ++sis190_mac_addr_19851 sis190_mac_addr 0 19851 NULL ++cfg80211_mlme_register_mgmt_19852 cfg80211_mlme_register_mgmt 5 19852 NULL ++dlm_lock_19858 dlm_lock 0 19858 NULL ++local_cpus_show_19862 local_cpus_show 0 19862 NULL nohasharray ++use_zero_page_store_19862 use_zero_page_store 0-4 19862 &local_cpus_show_19862 ++twlreg_grp_19866 twlreg_grp 0 19866 NULL nohasharray ++llcp_allocate_pdu_19866 llcp_allocate_pdu 3 19866 &twlreg_grp_19866 ++vid_out_queue_setup_19869 vid_out_queue_setup 0 19869 NULL nohasharray ++ext3_xattr_user_set_19869 ext3_xattr_user_set 0 19869 &vid_out_queue_setup_19869 nohasharray ++ip6gre_err_19869 ip6gre_err 5 19869 &ext3_xattr_user_set_19869 ++iwl_mvm_add_bcast_sta_19871 iwl_mvm_add_bcast_sta 0 19871 NULL nohasharray ++store_19871 store 0 19871 &iwl_mvm_add_bcast_sta_19871 ++si5351_xtal_prepare_19878 si5351_xtal_prepare 0 19878 NULL nohasharray ++start_19878 start 0 19878 &si5351_xtal_prepare_19878 ++netevent_callback_19879 netevent_callback 0 19879 NULL ++mrp_request_join_19882 mrp_request_join 4 19882 NULL nohasharray ++dummy_hrtimer_stop_19882 dummy_hrtimer_stop 0 19882 &mrp_request_join_19882 nohasharray ++security_setprocattr_19882 security_setprocattr 0-4 19882 &dummy_hrtimer_stop_19882 ++dev_pm_qos_update_user_latency_tolerance_19891 dev_pm_qos_update_user_latency_tolerance 0 19891 NULL ++acpi_pm_pre_suspend_19892 acpi_pm_pre_suspend 0 19892 NULL ++show_19893 show 0 19893 NULL nohasharray ++_readpage_19893 _readpage 0 19893 &show_19893 ++wl1251_chip_wakeup_19894 wl1251_chip_wakeup 0 19894 NULL ++qlcnic_sysfs_read_pci_config_19901 qlcnic_sysfs_read_pci_config 6-0-5 19901 NULL nohasharray ++xgbe_init_ring_19901 xgbe_init_ring 3 19901 &qlcnic_sysfs_read_pci_config_19901 ++bonding_show_fail_over_mac_19903 bonding_show_fail_over_mac 0 19903 NULL ++aes_decrypt_interrupt_read_19910 aes_decrypt_interrupt_read 3-0 19910 NULL ++ecryptfs_read_xattr_region_19911 ecryptfs_read_xattr_region 0 19911 NULL ++rt73usb_set_state_19917 rt73usb_set_state 0 19917 NULL ++ps_upsd_max_apturn_read_19918 ps_upsd_max_apturn_read 3-0 19918 NULL ++ipath_tempsense_read_19921 ipath_tempsense_read 0 19921 NULL ++mangle_name_19923 mangle_name 0 19923 NULL ++tipc_sk_show_19928 tipc_sk_show 3-0 19928 NULL ++cgroup_task_count_19930 cgroup_task_count 0 19930 NULL ++__add_section_19931 __add_section 0 19931 NULL ++ceph_read_iter_19940 ceph_read_iter 0 19940 NULL ++v4l2_ctrl_new_19942 v4l2_ctrl_new 12-8 19942 NULL ++iwl_dbgfs_rx_queue_read_19943 iwl_dbgfs_rx_queue_read 3-0 19943 NULL ++ds1672_get_datetime_19948 ds1672_get_datetime 0 19948 NULL nohasharray ++store_temp_target_19948 store_temp_target 0-4 19948 &ds1672_get_datetime_19948 ++set_volt_max_19950 set_volt_max 0-4 19950 NULL ++zd_ioread32v_locked_19953 zd_ioread32v_locked 0 19953 NULL ++ll_xattr_cache_list_19954 ll_xattr_cache_list 0 19954 NULL ++tipc_bind_19957 tipc_bind 0 19957 NULL ++wl3501_resume_19959 wl3501_resume 0 19959 NULL ++hfsplus_user_listxattr_19960 hfsplus_user_listxattr 0-5 19960 NULL ++sd_s_ctrl_19963 sd_s_ctrl 0 19963 NULL ++bt819_s_ctrl_19964 bt819_s_ctrl 0 19964 NULL nohasharray ++ax25_send_frame_19964 ax25_send_frame 2 19964 &bt819_s_ctrl_19964 ++set_aw_pt_bi_19967 set_aw_pt_bi 0 19967 NULL ++ims_pcu_ofn_reg_data_store_19974 ims_pcu_ofn_reg_data_store 0-4 19974 NULL ++apparmor_getprocattr_19982 apparmor_getprocattr 0 19982 NULL ++snd_usbtv_card_trigger_19983 snd_usbtv_card_trigger 0 19983 NULL ++attach_hdlc_protocol_19986 attach_hdlc_protocol 3 19986 NULL ++i40e_reserve_msix_vectors_19989 i40e_reserve_msix_vectors 2 19989 NULL nohasharray ++rtw_set_wps_probe_resp_19989 rtw_set_wps_probe_resp 3 19989 &i40e_reserve_msix_vectors_19989 ++_osd_req_finalize_set_attr_list_19990 _osd_req_finalize_set_attr_list 0 19990 NULL nohasharray ++islpci_upload_fw_19990 islpci_upload_fw 0 19990 &_osd_req_finalize_set_attr_list_19990 ++find_overflow_devnum_19995 find_overflow_devnum 0 19995 NULL ++reshape_direction_show_19999 reshape_direction_show 0 19999 NULL ++diva_um_idi_read_20003 diva_um_idi_read 0 20003 NULL ++cpuset_write_s64_20004 cpuset_write_s64 0 20004 NULL ++spmi_ext_register_readl_20005 spmi_ext_register_readl 0 20005 NULL ++event_trigger_write_20009 event_trigger_write 3 20009 NULL ++tree_mod_log_eb_move_20011 tree_mod_log_eb_move 5 20011 NULL ++disk_events_async_show_20020 disk_events_async_show 0 20020 NULL ++sisusb_write_memio_long_20026 sisusb_write_memio_long 0 20026 NULL nohasharray ++smsc911x_reg_read_20026 smsc911x_reg_read 0 20026 &sisusb_write_memio_long_20026 ++SYSC_fgetxattr_20027 SYSC_fgetxattr 4 20027 NULL ++split_scan_timeout_read_20029 split_scan_timeout_read 3-0 20029 NULL nohasharray ++ufs_readpage_20029 ufs_readpage 0 20029 &split_scan_timeout_read_20029 ++acpi_ds_obj_stack_pop_20030 acpi_ds_obj_stack_pop 0 20030 NULL nohasharray ++bq2415x_sysfs_set_enable_20030 bq2415x_sysfs_set_enable 0-4 20030 &acpi_ds_obj_stack_pop_20030 ++radeon_hwmon_show_temp_20032 radeon_hwmon_show_temp 0 20032 NULL nohasharray ++ocfs2_xattr_security_set_20032 ocfs2_xattr_security_set 0 20032 &radeon_hwmon_show_temp_20032 ++platform_suspend_prepare_20036 platform_suspend_prepare 0 20036 NULL ++read_tape_20037 read_tape 0 20037 NULL ++cxacru_sysfs_show_upstream_attenuation_20040 cxacru_sysfs_show_upstream_attenuation 0 20040 NULL ++mwl8k_init_txqs_20042 mwl8k_init_txqs 0 20042 NULL ++cmdline_show_20044 cmdline_show 0 20044 NULL ++mt_show_quirks_20045 mt_show_quirks 0 20045 NULL ++show_compression_20048 show_compression 0 20048 NULL ++usX2Y_urbs_allocate_20052 usX2Y_urbs_allocate 0 20052 NULL ++lpfc_txcmplq_hw_show_20055 lpfc_txcmplq_hw_show 0 20055 NULL ++__be32_to_cpup_20056 __be32_to_cpup 0 20056 NULL ++roccat_common2_sysfs_write_stored_lights_20059 roccat_common2_sysfs_write_stored_lights 0-6-5 20059 NULL ++upcall_20060 upcall 0-4 20060 NULL ++w1_ds2760_io_20065 w1_ds2760_io 3-4-0 20065 NULL ++iwl_mvm_power_mac_dbgfs_read_20067 iwl_mvm_power_mac_dbgfs_read 4-0 20067 NULL nohasharray ++__uncore_filter_state2_show_20067 __uncore_filter_state2_show 0 20067 &iwl_mvm_power_mac_dbgfs_read_20067 ++l2tp_ip6_getname_20071 l2tp_ip6_getname 0 20071 NULL ++target_message_20072 target_message 2 20072 NULL ++rawv6_sendmsg_20080 rawv6_sendmsg 4-0 20080 NULL nohasharray ++init_chip_reset_20080 init_chip_reset 0 20080 &rawv6_sendmsg_20080 ++fuse_conn_limit_read_20084 fuse_conn_limit_read 3-0 20084 NULL ++aat2870_reg_write_file_20086 aat2870_reg_write_file 3-0 20086 NULL ++reiserfs_dir_fsync_20088 reiserfs_dir_fsync 0 20088 NULL ++team_options_register_20091 team_options_register 3-0 20091 NULL nohasharray ++lpfc_poll_show_20091 lpfc_poll_show 0 20091 &team_options_register_20091 nohasharray ++rt2800pci_set_state_20091 rt2800pci_set_state 0 20091 &lpfc_poll_show_20091 nohasharray ++ssb_attr_sprom_store_20091 ssb_attr_sprom_store 0-3 20091 &rt2800pci_set_state_20091 ++sctp_make_data_20093 sctp_make_data 3 20093 NULL ++mls_context_cpy_high_20094 mls_context_cpy_high 0 20094 NULL ++mptscsih_board_assembly_show_20096 mptscsih_board_assembly_show 0 20096 NULL ++read_int_20098 read_int 0 20098 NULL nohasharray ++dn_auto_bind_20098 dn_auto_bind 0 20098 &read_int_20098 ++attr_press_speed_store_tpkbd_20100 attr_press_speed_store_tpkbd 0-4 20100 NULL ++snd_es1938_playback1_trigger_20102 snd_es1938_playback1_trigger 0 20102 NULL ++xfs_qm_dqget_20103 xfs_qm_dqget 0 20103 NULL ++nilfs_segments_clean_segments_show_20115 nilfs_segments_clean_segments_show 0 20115 NULL ++iscsi_tpg_param_store_TargetAlias_20119 iscsi_tpg_param_store_TargetAlias 0-3 20119 NULL ++cx18_s_audio_sampling_freq_20123 cx18_s_audio_sampling_freq 0 20123 NULL nohasharray ++adp8870_bl_l4_indoor_dim_store_20123 adp8870_bl_l4_indoor_dim_store 4-0 20123 &cx18_s_audio_sampling_freq_20123 ++bluetooth_get_status_20129 bluetooth_get_status 0 20129 NULL nohasharray ++dlci_open_20129 dlci_open 0 20129 &bluetooth_get_status_20129 ++noop_init_queue_20130 noop_init_queue 0 20130 NULL ++self_check_vid_hdr_20131 self_check_vid_hdr 0 20131 NULL ++selinux_ip_postroute_compat_20134 selinux_ip_postroute_compat 0 20134 NULL ++snd_info_register_20136 snd_info_register 0 20136 NULL ++jffs2_fsync_20143 jffs2_fsync 0 20143 NULL ++btrfs_writepages_20144 btrfs_writepages 0 20144 NULL ++get_fan_off_20148 get_fan_off 0 20148 NULL nohasharray ++scsi_bus_prepare_20148 scsi_bus_prepare 0 20148 &get_fan_off_20148 ++send_init_20149 send_init 0 20149 NULL nohasharray ++ip_vs_in_icmp_20149 ip_vs_in_icmp 0 20149 &send_init_20149 ++write_20150 write 0 20150 NULL ++rbd_dev_v2_image_size_20154 rbd_dev_v2_image_size 0 20154 NULL ++ext4_ext_direct_IO_20165 ext4_ext_direct_IO 4-0 20165 NULL ++tomoyo_commit_ok_20167 tomoyo_commit_ok 2 20167 NULL ++os_desc_attr_show_20169 os_desc_attr_show 0 20169 NULL nohasharray ++qib_user_sdma_writev_20169 qib_user_sdma_writev 0 20169 &os_desc_attr_show_20169 nohasharray ++gem_open_20169 gem_open 0 20169 &qib_user_sdma_writev_20169 ++jffs2_rubinmips_decompress_20170 jffs2_rubinmips_decompress 0 20170 NULL ++read_flush_pipefs_20171 read_flush_pipefs 3-0 20171 NULL ++wep_addr_key_count_read_20174 wep_addr_key_count_read 3-0 20174 NULL ++kstrtou8_20177 kstrtou8 0 20177 NULL ++i2c_send_byte_20180 i2c_send_byte 0 20180 NULL ++acpi_ds_load2_end_op_20185 acpi_ds_load2_end_op 0 20185 NULL nohasharray ++atm_init_aal5_20185 atm_init_aal5 0 20185 &acpi_ds_load2_end_op_20185 ++ax25_hard_header_20187 ax25_hard_header 0 20187 NULL nohasharray ++atl1e_phy_setup_autoneg_adv_20187 atl1e_phy_setup_autoneg_adv 0 20187 &ax25_hard_header_20187 ++trusted_set_20196 trusted_set 0 20196 NULL ++fan_pwm1_enable_show_20200 fan_pwm1_enable_show 0 20200 NULL nohasharray ++phy_init_hw_20200 phy_init_hw 0 20200 &fan_pwm1_enable_show_20200 ++video_end_20205 video_end 0 20205 NULL ++bitmap_find_next_zero_area_off_20211 bitmap_find_next_zero_area_off 3-0-4-5-6-2 20211 NULL ++ds1343_read_time_20213 ds1343_read_time 0 20213 NULL ++udf_do_extend_file_20214 udf_do_extend_file 0 20214 NULL nohasharray ++udf_bitmap_new_block_20214 udf_bitmap_new_block 4 20214 &udf_do_extend_file_20214 ++parport_uss720_epp_write_addr_20216 parport_uss720_epp_write_addr 0 20216 NULL ++dpm_suspend_noirq_20217 dpm_suspend_noirq 0 20217 NULL ++target_fabric_port_attr_show_20218 target_fabric_port_attr_show 0 20218 NULL ++__radix_tree_create_20221 __radix_tree_create 0 20221 NULL ++efivar_attr_read_20222 efivar_attr_read 0 20222 NULL nohasharray ++destid_show_20222 destid_show 0 20222 &efivar_attr_read_20222 ++bind_20227 bind 0 20227 NULL ++pvr2_ctrl_value_to_sym_20229 pvr2_ctrl_value_to_sym 5 20229 NULL ++ds1374_wdt_read_20232 ds1374_wdt_read 0-3 20232 NULL ++ath10k_mac_set_frag_20235 ath10k_mac_set_frag 0 20235 NULL ++sstfb_check_var_20237 sstfb_check_var 0 20237 NULL nohasharray ++ext2_unfreeze_20237 ext2_unfreeze 0 20237 &sstfb_check_var_20237 ++show_selfballoon_min_usable_mb_20238 show_selfballoon_min_usable_mb 0 20238 NULL ++ltc4261_show_value_20241 ltc4261_show_value 0 20241 NULL ++stk1160_i2c_xfer_20245 stk1160_i2c_xfer 0-3 20245 NULL ++uvc_init_video_bulk_20246 uvc_init_video_bulk 0 20246 NULL nohasharray ++fm3130_set_alarm_20246 fm3130_set_alarm 0 20246 &uvc_init_video_bulk_20246 nohasharray ++sxgbe_change_mtu_20246 sxgbe_change_mtu 0 20246 &fm3130_set_alarm_20246 ++rose_sendmsg_20249 rose_sendmsg 4-0 20249 NULL ++tm6000_i2c_send_regs_20250 tm6000_i2c_send_regs 5-0 20250 NULL ++async_20251 async 0 20251 NULL ++store_filter_20252 store_filter 0-4 20252 NULL ++resource_size_20256 resource_size 0 20256 NULL ++ssd1307fb_write_array_20258 ssd1307fb_write_array 3 20258 NULL ++sru_s_stream_20259 sru_s_stream 0 20259 NULL ++wl1271_boot_soft_reset_20262 wl1271_boot_soft_reset 0 20262 NULL nohasharray ++target_core_hba_attr_store_20262 target_core_hba_attr_store 0-4 20262 &wl1271_boot_soft_reset_20262 ++mt2063_set_dnc_output_enable_20263 mt2063_set_dnc_output_enable 0 20263 NULL nohasharray ++i40e_open_20263 i40e_open 0 20263 &mt2063_set_dnc_output_enable_20263 ++notifier_from_errno_20267 notifier_from_errno 0-1 20267 NULL ++torture_shutdown_notify_20269 torture_shutdown_notify 0 20269 NULL ++gadget_dev_desc_idProduct_show_20270 gadget_dev_desc_idProduct_show 0 20270 NULL ++fuse_copy_args_20271 fuse_copy_args 0 20271 NULL ++tg3_restart_hw_20272 tg3_restart_hw 0 20272 NULL ++vcc_mode_show_20273 vcc_mode_show 0 20273 NULL ++snd_seq_ioctl_get_port_info_20274 snd_seq_ioctl_get_port_info 0 20274 NULL ++mp_unregister_gsi_20278 mp_unregister_gsi 1 20278 NULL nohasharray ++power_up_20278 power_up 0 20278 &mp_unregister_gsi_20278 ++w1_master_attribute_show_max_slave_count_20280 w1_master_attribute_show_max_slave_count 0 20280 NULL ++mx2_start_streaming_20282 mx2_start_streaming 0 20282 NULL ++gfs2_setattr_simple_20283 gfs2_setattr_simple 0 20283 NULL ++__uncore_match_rnid4_show_20285 __uncore_match_rnid4_show 0 20285 NULL ++__rds_rdma_map_20287 __rds_rdma_map 0 20287 NULL ++snd_pcm_hw_param_near_20288 snd_pcm_hw_param_near 0 20288 NULL nohasharray ++rxrpc_krb5_decode_principal_20288 rxrpc_krb5_decode_principal 0 20288 &snd_pcm_hw_param_near_20288 ++wait_for_bulk_out_ready_20289 wait_for_bulk_out_ready 0 20289 NULL ++blk_mq_hw_sysfs_queued_show_20294 blk_mq_hw_sysfs_queued_show 0 20294 NULL ++btrfs_header_nritems_20296 btrfs_header_nritems 0 20296 NULL ++do_take_over_console_20297 do_take_over_console 0 20297 NULL ++r10_sync_page_io_20307 r10_sync_page_io 3 20307 NULL ++curr_bitstream_show_20308 curr_bitstream_show 0 20308 NULL ++lpfc_cr_count_show_20309 lpfc_cr_count_show 0 20309 NULL ++show_sched1_20310 show_sched1 0 20310 NULL nohasharray ++sock_common_recvmsg_20310 sock_common_recvmsg 0-4 20310 &show_sched1_20310 ++_rtl92s_get_h2c_cmdlen_20312 _rtl92s_get_h2c_cmdlen 0 20312 NULL ++dm_get_reserved_bio_based_ios_20315 dm_get_reserved_bio_based_ios 0 20315 NULL nohasharray ++lapic_suspend_20315 lapic_suspend 0 20315 &dm_get_reserved_bio_based_ios_20315 ++tx_tx_burst_programmed_read_20320 tx_tx_burst_programmed_read 3-0 20320 NULL ++qlcnic_sysfs_get_port_stats_20321 qlcnic_sysfs_get_port_stats 0-6-5 20321 NULL nohasharray ++disable_hwint_20321 disable_hwint 0 20321 &qlcnic_sysfs_get_port_stats_20321 ++vx_send_msg_nolock_20322 vx_send_msg_nolock 0 20322 NULL nohasharray ++target_stat_scsi_tgt_port_show_attr_dev_20322 target_stat_scsi_tgt_port_show_attr_dev 0 20322 &vx_send_msg_nolock_20322 ++snd_cs4281_BA1_read_20323 snd_cs4281_BA1_read 5-0 20323 NULL ++clockevents_unbind_20324 clockevents_unbind 0 20324 NULL ++wacom_buttons_luminance_store_20325 wacom_buttons_luminance_store 0-4 20325 NULL ++sys_dmi_modalias_show_20334 sys_dmi_modalias_show 0 20334 NULL ++lpt_gc_20337 lpt_gc 0 20337 NULL ++patch_nvhdmi_2ch_20339 patch_nvhdmi_2ch 0 20339 NULL ++gfs2_glock_nq_m_20347 gfs2_glock_nq_m 1-0 20347 NULL ++show_turbo_20348 show_turbo 0 20348 NULL ++si2157_cmd_execute_20350 si2157_cmd_execute 0 20350 NULL ++show_tablet_20355 show_tablet 0 20355 NULL ++fw_load_from_user_helper_20360 fw_load_from_user_helper 0 20360 NULL ++ltc4245_show_power_20364 ltc4245_show_power 0 20364 NULL ++aio_migratepage_20365 aio_migratepage 0 20365 NULL ++qla82xx_pci_mem_read_direct_20368 qla82xx_pci_mem_read_direct 2 20368 NULL ++core_num_show_20369 core_num_show 0 20369 NULL ++wl1271_acx_keep_alive_mode_20372 wl1271_acx_keep_alive_mode 0 20372 NULL ++asix_get_eeprom_len_20373 asix_get_eeprom_len 0 20373 NULL ++thermal_get_sensor_20377 thermal_get_sensor 0 20377 NULL ++wakeup_total_time_show_20378 wakeup_total_time_show 0 20378 NULL ++smk_set_cipso_20379 smk_set_cipso 3-0 20379 NULL ++block_read_full_page_20380 block_read_full_page 0 20380 NULL ++SMB2_flush_20381 SMB2_flush 0 20381 NULL ++show_fcoe_ctlr_device_miss_fka_20388 show_fcoe_ctlr_device_miss_fka 0 20388 NULL ++sdev_show_device_busy_20392 sdev_show_device_busy 0 20392 NULL nohasharray ++vxge_hw_vpath_mac_addr_delete_20392 vxge_hw_vpath_mac_addr_delete 0 20392 &sdev_show_device_busy_20392 ++power_supply_read_temp_20397 power_supply_read_temp 0 20397 NULL ++__kfifo_from_user_20399 __kfifo_from_user 3 20399 NULL nohasharray ++SyS_get_mempolicy_20399 SyS_get_mempolicy 3 20399 &__kfifo_from_user_20399 ++igb_vlan_rx_add_vid_20402 igb_vlan_rx_add_vid 0 20402 NULL ++arcmsr_attr_host_fw_version_20411 arcmsr_attr_host_fw_version 0 20411 NULL nohasharray ++whole_disk_show_20411 whole_disk_show 0 20411 &arcmsr_attr_host_fw_version_20411 ++acpi_ds_init_object_from_op_20413 acpi_ds_init_object_from_op 0 20413 NULL nohasharray ++a_alt_hnp_support_show_20413 a_alt_hnp_support_show 0 20413 &acpi_ds_init_object_from_op_20413 ++wl1271_acx_sg_enable_20415 wl1271_acx_sg_enable 0 20415 NULL ++cx231xx_i2c_check_for_device_20416 cx231xx_i2c_check_for_device 0 20416 NULL ++eeprom_store_20424 eeprom_store 0-4 20424 NULL ++igb_setup_rx_resources_20425 igb_setup_rx_resources 0 20425 NULL ++igbvf_setup_tx_resources_20428 igbvf_setup_tx_resources 0 20428 NULL ++anysee_ctrl_msg_20430 anysee_ctrl_msg 0 20430 NULL ++find_skb_20431 find_skb 2 20431 NULL ++fmc_send_cmd_20435 fmc_send_cmd 0-5 20435 NULL ++mptscsih_debug_level_show_20438 mptscsih_debug_level_show 0 20438 NULL ++_ctl_version_mpi_show_20455 _ctl_version_mpi_show 0 20455 NULL nohasharray ++show_fc_host_port_id_20455 show_fc_host_port_id 0 20455 &_ctl_version_mpi_show_20455 nohasharray ++adp8860_bl_l3_dark_dim_show_20455 adp8860_bl_l3_dark_dim_show 0 20455 &show_fc_host_port_id_20455 ++ath10k_pci_hif_map_service_to_pipe_20460 ath10k_pci_hif_map_service_to_pipe 0 20460 NULL ++ir_open_20461 ir_open 0 20461 NULL nohasharray ++ds2781_read_user_eeprom_bin_20461 ds2781_read_user_eeprom_bin 6-5-0 20461 &ir_open_20461 ++wl18xx_wait_for_event_20464 wl18xx_wait_for_event 0 20464 NULL ++compat_ipv6_setsockopt_20468 compat_ipv6_setsockopt 5 20468 NULL nohasharray ++adp8860_bl_l1_daylight_max_show_20468 adp8860_bl_l1_daylight_max_show 0 20468 &compat_ipv6_setsockopt_20468 nohasharray ++mwl8k_reload_firmware_20468 mwl8k_reload_firmware 0 20468 &adp8860_bl_l1_daylight_max_show_20468 ++read_buf_20469 read_buf 2 20469 NULL ++reiserfs_chown_xattrs_20471 reiserfs_chown_xattrs 0 20471 NULL ++bio_trim_20472 bio_trim 2 20472 NULL nohasharray ++alloc_pipe_config_20472 alloc_pipe_config 0 20472 &bio_trim_20472 ++pci_mmcfg_read_numachip_20473 pci_mmcfg_read_numachip 0 20473 NULL ++nfs4_do_setattr_20475 nfs4_do_setattr 0 20475 NULL ++btrfs_get_32_20476 btrfs_get_32 0 20476 NULL nohasharray ++adt7x10_write_byte_20476 adt7x10_write_byte 0 20476 &btrfs_get_32_20476 ++show_scan_age_20477 show_scan_age 0 20477 NULL nohasharray ++start_service_discovery_20477 start_service_discovery 4 20477 &show_scan_age_20477 ++vxge_open_20497 vxge_open 0 20497 NULL ++i7core_inject_enable_store_20501 i7core_inject_enable_store 0-4 20501 NULL ++elan_sysfs_read_iap_ver_20502 elan_sysfs_read_iap_ver 0 20502 NULL ++mcs_net_open_20503 mcs_net_open 0 20503 NULL nohasharray ++ocfs2_db_frozen_trigger_20503 ocfs2_db_frozen_trigger 4 20503 &mcs_net_open_20503 nohasharray ++hidraw_report_event_20503 hidraw_report_event 3 20503 &ocfs2_db_frozen_trigger_20503 ++w1_master_attribute_show_pullup_20506 w1_master_attribute_show_pullup 0 20506 NULL ++ipr_store_adapter_state_20513 ipr_store_adapter_state 0-4 20513 NULL ++i2c_atmel_recv_20516 i2c_atmel_recv 0-3 20516 NULL nohasharray ++thermal_throttle_add_dev_20516 thermal_throttle_add_dev 0 20516 &i2c_atmel_recv_20516 ++nilfs_snapshot_blocks_count_show_20518 nilfs_snapshot_blocks_count_show 0 20518 NULL ++xfs_dir3_leaf_get_buf_20519 xfs_dir3_leaf_get_buf 0 20519 NULL ++xfs_iext_realloc_direct_20521 xfs_iext_realloc_direct 2 20521 NULL ++drbd_bm_resize_20522 drbd_bm_resize 2 20522 NULL ++dpm_suspend_start_20531 dpm_suspend_start 0 20531 NULL ++amd_create_gatt_pages_20537 amd_create_gatt_pages 1 20537 NULL ++acpi_ex_extract_from_field_20539 acpi_ex_extract_from_field 0 20539 NULL ++mwifiex_cmd_802_11_subsc_evt_20540 mwifiex_cmd_802_11_subsc_evt 0 20540 NULL ++store_soft_offline_page_20548 store_soft_offline_page 0-4 20548 NULL ++scsi_report_opcode_20551 scsi_report_opcode 3 20551 NULL ++bch_snprint_string_list_20552 bch_snprint_string_list 0 20552 NULL ++venus_create_20555 venus_create 4 20555 NULL ++show_fc_rport_port_state_20557 show_fc_rport_port_state 0 20557 NULL ++pm8001_chip_sata_req_20559 pm8001_chip_sata_req 0 20559 NULL ++iscsi_stat_instance_show_attr_fail_type_20560 iscsi_stat_instance_show_attr_fail_type 0 20560 NULL ++rt2x00debug_read_rfcsr_20562 rt2x00debug_read_rfcsr 0-3 20562 NULL ++o2hb_heartbeat_group_threshold_show_20570 o2hb_heartbeat_group_threshold_show 0 20570 NULL nohasharray ++xfs_bmap_isaeof_20570 xfs_bmap_isaeof 0 20570 &o2hb_heartbeat_group_threshold_show_20570 ++isight_prepare_20572 isight_prepare 0 20572 NULL nohasharray ++ctnetlink_label_size_20572 ctnetlink_label_size 0 20572 &isight_prepare_20572 ++bch_flash_dev_show_20574 bch_flash_dev_show 0 20574 NULL nohasharray ++dead_read_20574 dead_read 0 20574 &bch_flash_dev_show_20574 ++cachefiles_daemon_frun_20577 cachefiles_daemon_frun 0 20577 NULL ++bluetooth_enable_show_20578 bluetooth_enable_show 0 20578 NULL nohasharray ++command_setcolourbalance_20578 command_setcolourbalance 0 20578 &bluetooth_enable_show_20578 nohasharray ++wl1271_acx_sta_rate_policies_20578 wl1271_acx_sta_rate_policies 0 20578 &command_setcolourbalance_20578 ++xen_pci_notifier_20579 xen_pci_notifier 0 20579 NULL ++set_performance_level_20580 set_performance_level 0-4 20580 NULL ++saa711x_s_stream_20581 saa711x_s_stream 0 20581 NULL ++uwb_rc_dev_addr_mgmt_20582 uwb_rc_dev_addr_mgmt 0 20582 NULL ++store_pwm_ast_20585 store_pwm_ast 0-4 20585 NULL ++ksz8873mll_read_status_20586 ksz8873mll_read_status 0 20586 NULL ++ocfs2_cluster_lock_20588 ocfs2_cluster_lock 0 20588 NULL ++r820t_get_if_frequency_20589 r820t_get_if_frequency 0 20589 NULL ++nforce2_check_status_20594 nforce2_check_status 0 20594 NULL ++set_secure_conn_20596 set_secure_conn 4 20596 NULL ++quota_refresh_group_store_20597 quota_refresh_group_store 0-3 20597 NULL ++saa7706h_set_reg16_20600 saa7706h_set_reg16 0 20600 NULL nohasharray ++lpfc_task_mgmt_tmo_show_20600 lpfc_task_mgmt_tmo_show 0 20600 &saa7706h_set_reg16_20600 ++sync_timeline_create_20601 sync_timeline_create 2 20601 NULL ++_netdev_open_20602 _netdev_open 0 20602 NULL ++lirc_write_20604 lirc_write 3 20604 NULL ++qlcnic_config_led_20611 qlcnic_config_led 0 20611 NULL ++first_done_show_20612 first_done_show 0 20612 NULL ++i2c_mux_master_xfer_20613 i2c_mux_master_xfer 3 20613 NULL ++qib_qsfp_write_20614 qib_qsfp_write 0-2-4 20614 NULL ++inject_enable_write_20617 inject_enable_write 0-3 20617 NULL ++device_capabilities_show_20619 device_capabilities_show 0 20619 NULL ++show_20621 show 0 20621 NULL ++adp8860_bl_l1_daylight_dim_store_20623 adp8860_bl_l1_daylight_dim_store 0-4 20623 NULL ++rpipe_check_aim_20627 rpipe_check_aim 0 20627 NULL ++show_min_hyst_20635 show_min_hyst 0 20635 NULL nohasharray ++adfs_dir_read_20635 adfs_dir_read 0 20635 &show_min_hyst_20635 ++squashfs_trusted_get_20637 squashfs_trusted_get 0 20637 NULL ++w1_ds2780_io_20638 w1_ds2780_io 4-3-0 20638 NULL ++snd_pcm_oss_prepare_20641 snd_pcm_oss_prepare 0 20641 NULL ++__uncore_iss_show_20642 __uncore_iss_show 0 20642 NULL nohasharray ++asus_gps_switch_20642 asus_gps_switch 0 20642 &__uncore_iss_show_20642 ++setattr_20644 setattr 0 20644 NULL ++kfifo_copy_to_user_20646 kfifo_copy_to_user 3-4 20646 NULL ++cpulist_scnprintf_20648 cpulist_scnprintf 2-0 20648 NULL ++oz_add_farewell_20652 oz_add_farewell 5 20652 NULL ++macvtap_get_user_20655 macvtap_get_user 0 20655 NULL nohasharray ++bond_option_arp_validate_set_20655 bond_option_arp_validate_set 0 20655 &macvtap_get_user_20655 ++wacom_luminance_store_20659 wacom_luminance_store 0-4 20659 NULL nohasharray ++oz_cdev_read_20659 oz_cdev_read 3 20659 &wacom_luminance_store_20659 ++ixgbe_open_20663 ixgbe_open 0 20663 NULL ++fcoe_enable_20664 fcoe_enable 0 20664 NULL ++selinux_nlmsg_lookup_20665 selinux_nlmsg_lookup 0 20665 NULL nohasharray ++smk_netlbl_mls_20665 smk_netlbl_mls 0 20665 &selinux_nlmsg_lookup_20665 nohasharray ++ad1983_add_spdif_mux_ctl_20665 ad1983_add_spdif_mux_ctl 0 20665 &smk_netlbl_mls_20665 ++show_temp_crit_20674 show_temp_crit 0 20674 NULL ++downcall_20675 downcall 0-3 20675 NULL ++snd_hdsp_playback_copy_20676 snd_hdsp_playback_copy 5 20676 NULL nohasharray ++btrfs_qgroup_reserve_20676 btrfs_qgroup_reserve 0 20676 &snd_hdsp_playback_copy_20676 ++session_write_kbytes_show_20678 session_write_kbytes_show 0 20678 NULL ++dvb_dmxdev_buffer_read_20682 dvb_dmxdev_buffer_read 0-4 20682 NULL ++btrfs_node_blockptr_20685 btrfs_node_blockptr 0 20685 NULL ++store_20687 store 0 20687 NULL ++ipath_user_sdma_coalesce_20688 ipath_user_sdma_coalesce 0 20688 NULL ++set_sas_linkspeed_names_20690 set_sas_linkspeed_names 0 20690 NULL ++show_low_power_20693 show_low_power 0 20693 NULL nohasharray ++cross_eof_20693 cross_eof 0 20693 &show_low_power_20693 ++xpcs_reg_addr_write_20694 xpcs_reg_addr_write 3 20694 NULL ++cifs_d_revalidate_20695 cifs_d_revalidate 0 20695 NULL ++read_file_tgt_int_stats_20697 read_file_tgt_int_stats 3-0 20697 NULL nohasharray ++bond_master_netdev_event_20697 bond_master_netdev_event 0 20697 &read_file_tgt_int_stats_20697 ++cipso_v4_gentag_rng_20703 cipso_v4_gentag_rng 0 20703 NULL nohasharray ++show_conn_param_ISCSI_PARAM_IPV6_FLOW_LABEL_20703 show_conn_param_ISCSI_PARAM_IPV6_FLOW_LABEL 0 20703 &cipso_v4_gentag_rng_20703 ++roles_init_20704 roles_init 0 20704 NULL ++fwnet_header_create_20705 fwnet_header_create 0 20705 NULL ++set_alarm_20706 set_alarm 0 20706 NULL ++pcpu_page_first_chunk_20712 pcpu_page_first_chunk 1 20712 NULL nohasharray ++dev_show_model_20712 dev_show_model 0 20712 &pcpu_page_first_chunk_20712 nohasharray ++carl9170_debugfs_bug_write_20712 carl9170_debugfs_bug_write 0-3 20712 &dev_show_model_20712 ++hfs_direct_IO_20714 hfs_direct_IO 4-0 20714 NULL ++ocfs2_read_xattr_bucket_20722 ocfs2_read_xattr_bucket 0 20722 NULL ++security_context_to_sid_force_20724 security_context_to_sid_force 2-0 20724 NULL ++msi001_set_gain_20725 msi001_set_gain 0 20725 NULL nohasharray ++dlm_user_cancel_20725 dlm_user_cancel 0 20725 &msi001_set_gain_20725 ++vmxnet3_open_20730 vmxnet3_open 0 20730 NULL ++mt2063_write_20732 mt2063_write 0 20732 NULL ++write_field_20735 write_field 0 20735 NULL nohasharray ++edd_show_host_bus_20735 edd_show_host_bus 0 20735 &write_field_20735 ++mem_used_max_store_20741 mem_used_max_store 0-4 20741 NULL ++br_netpoll_setup_20742 br_netpoll_setup 0 20742 NULL ++fb_prepare_logo_20743 fb_prepare_logo 0 20743 NULL nohasharray ++show_vpd_pg80_20743 show_vpd_pg80 6-0-5 20743 &fb_prepare_logo_20743 ++e1000_test_msi_20744 e1000_test_msi 0 20744 NULL ++axxia_i2c_xfer_msg_20746 axxia_i2c_xfer_msg 0 20746 NULL nohasharray ++__page_symlink_20746 __page_symlink 3 20746 &axxia_i2c_xfer_msg_20746 ++vol_cdev_direct_write_20751 vol_cdev_direct_write 3-0 20751 NULL ++pm860x_rtc_read_time_20756 pm860x_rtc_read_time 0 20756 NULL nohasharray ++f2fs_sbi_show_20756 f2fs_sbi_show 0 20756 &pm860x_rtc_read_time_20756 ++iwlagn_alloc_bcast_station_20759 iwlagn_alloc_bcast_station 0 20759 NULL ++splice_read_20762 splice_read 0 20762 NULL ++brcmf_p2p_escan_20763 brcmf_p2p_escan 2 20763 NULL ++bfad_im_hw_version_show_20764 bfad_im_hw_version_show 0 20764 NULL ++ubi_io_read_20767 ubi_io_read 0 20767 NULL ++SyS_recvfrom_20771 SyS_recvfrom 3 20771 NULL ++acpi_ex_resolve_operands_20782 acpi_ex_resolve_operands 0 20782 NULL nohasharray ++dlci_dev_event_20782 dlci_dev_event 0 20782 &acpi_ex_resolve_operands_20782 ++vmw_fb_check_var_20787 vmw_fb_check_var 0 20787 NULL ++fd_show_configfs_dev_params_20788 fd_show_configfs_dev_params 0 20788 NULL nohasharray ++swap_write_page_20788 swap_write_page 0 20788 &fd_show_configfs_dev_params_20788 ++store_hard_offline_page_20792 store_hard_offline_page 0-4 20792 NULL nohasharray ++fb_alloc_cmap_gfp_20792 fb_alloc_cmap_gfp 2 20792 &store_hard_offline_page_20792 ++iommu_range_alloc_20794 iommu_range_alloc 3-0 20794 NULL ++iwl_dbgfs_rxon_flags_read_20795 iwl_dbgfs_rxon_flags_read 3-0 20795 NULL ++compat_filldir64_20796 compat_filldir64 3 20796 NULL nohasharray ++ipip6_tunnel_change_mtu_20796 ipip6_tunnel_change_mtu 0 20796 &compat_filldir64_20796 ++edid_write_20797 edid_write 3-0 20797 NULL ++ath10k_wmi_connect_20798 ath10k_wmi_connect 0 20798 NULL ++snd_p16v_pcm_trigger_playback_20799 snd_p16v_pcm_trigger_playback 0 20799 NULL ++show_nguid_20800 show_nguid 0 20800 NULL ++iwl_pcie_prepare_card_hw_20801 iwl_pcie_prepare_card_hw 0 20801 NULL ++lp3972_dcdc_is_enabled_20807 lp3972_dcdc_is_enabled 0 20807 NULL ++wl12xx_acx_sg_cfg_20808 wl12xx_acx_sg_cfg 0 20808 NULL nohasharray ++netxen_napi_add_20808 netxen_napi_add 0 20808 &wl12xx_acx_sg_cfg_20808 ++sys_sendto_20809 sys_sendto 6-3 20809 NULL ++cfv_alloc_and_copy_skb_20812 cfv_alloc_and_copy_skb 4 20812 NULL ++sysfs_add_file_to_group_20814 sysfs_add_file_to_group 0 20814 NULL ++strndup_user_20819 strndup_user 2 20819 NULL nohasharray ++do_glock_20819 do_glock 0 20819 &strndup_user_20819 ++cp_alloc_rings_20823 cp_alloc_rings 0 20823 NULL ++make_rate_20827 make_rate 0 20827 NULL ++kvaser_usb_open_20828 kvaser_usb_open 0 20828 NULL ++hugetlbfs_setattr_20829 hugetlbfs_setattr 0 20829 NULL ++__cfs_schedulable_20830 __cfs_schedulable 0 20830 NULL ++wl1271_format_buffer_20834 wl1271_format_buffer 2-0 20834 NULL nohasharray ++lpfc_hba_queue_depth_show_20834 lpfc_hba_queue_depth_show 0 20834 &wl1271_format_buffer_20834 ++uvc_alloc_entity_20836 uvc_alloc_entity 3-4 20836 NULL nohasharray ++nilfs_checkpoints_attr_show_20836 nilfs_checkpoints_attr_show 0 20836 &uvc_alloc_entity_20836 nohasharray ++d_weak_revalidate_20836 d_weak_revalidate 0 20836 &nilfs_checkpoints_attr_show_20836 ++show_min_width_20837 show_min_width 0 20837 NULL ++keyspan_write_20838 keyspan_write 0-4 20838 NULL ++get_fan_target_20839 get_fan_target 0 20839 NULL ++fsp_attr_show_vscroll_20843 fsp_attr_show_vscroll 0 20843 NULL ++p9_tag_alloc_20845 p9_tag_alloc 3 20845 NULL ++nvme_trans_supported_vpd_pages_20847 nvme_trans_supported_vpd_pages 4 20847 NULL nohasharray ++usnic_ib_netdevice_event_20847 usnic_ib_netdevice_event 0 20847 &nvme_trans_supported_vpd_pages_20847 ++usb_serial_generic_submit_read_urb_20848 usb_serial_generic_submit_read_urb 0 20848 NULL ++v4l2_write_20849 v4l2_write 0-3 20849 NULL ++midi_synth_load_patch_20852 midi_synth_load_patch 0 20852 NULL ++decompress_20854 decompress 0 20854 NULL ++cp2112_i2c_xfer_20860 cp2112_i2c_xfer 0-3 20860 NULL ++dsa_slave_init_20862 dsa_slave_init 0 20862 NULL ++target_stat_scsi_transport_show_attr_dev_name_20864 target_stat_scsi_transport_show_attr_dev_name 0 20864 NULL ++iwl_dbgfs_pm_params_read_20866 iwl_dbgfs_pm_params_read 3-0 20866 NULL ++bond_option_pps_set_20867 bond_option_pps_set 0 20867 NULL ++nc_register_read_20875 nc_register_read 0 20875 NULL ++command_setexposure_20876 command_setexposure 0 20876 NULL ++pci_xircom_init_20881 pci_xircom_init 0 20881 NULL ++ace_open_20884 ace_open 0 20884 NULL nohasharray ++cfs_cpt_table_create_20884 cfs_cpt_table_create 1 20884 &ace_open_20884 ++rb_simple_write_20890 rb_simple_write 3 20890 NULL ++sisusb_send_packet_20891 sisusb_send_packet 2-0 20891 NULL ++lpfc_cr_count_store_20893 lpfc_cr_count_store 0-4 20893 NULL ++key_icverrors_read_20895 key_icverrors_read 3-0 20895 NULL ++ipv4_conntrack_local_20896 ipv4_conntrack_local 0 20896 NULL ++of_property_match_string_20897 of_property_match_string 0 20897 NULL ++show_pch_mac_20898 show_pch_mac 0 20898 NULL ++vfio_msi_enable_20906 vfio_msi_enable 2 20906 NULL ++compat_sys_readv_20911 compat_sys_readv 3 20911 NULL ++eeprom_show_20916 eeprom_show 0 20916 NULL ++batadv_nc_mesh_init_20917 batadv_nc_mesh_init 0 20917 NULL ++lbs_rdbbp_write_20918 lbs_rdbbp_write 3-0 20918 NULL ++ad7793_show_scale_available_20920 ad7793_show_scale_available 0 20920 NULL ++usb_gadget_unregister_driver_20924 usb_gadget_unregister_driver 0 20924 NULL ++sctp_del_bind_addr_20927 sctp_del_bind_addr 0 20927 NULL ++llcp_sock_create_20929 llcp_sock_create 0 20929 NULL ++ds1305_nvram_read_20931 ds1305_nvram_read 0-5-6 20931 NULL nohasharray ++tcp_v6_connect_20931 tcp_v6_connect 0 20931 &ds1305_nvram_read_20931 ++htable_bits_20933 htable_bits 0 20933 NULL ++perf_ibs_suspend_20935 perf_ibs_suspend 0 20935 NULL ++set_usb_charge_20936 set_usb_charge 0-4 20936 NULL ++dimmdev_location_show_20937 dimmdev_location_show 0 20937 NULL ++gadget_dev_desc_bcdDevice_show_20940 gadget_dev_desc_bcdDevice_show 0 20940 NULL nohasharray ++show_20940 show 0 20940 &gadget_dev_desc_bcdDevice_show_20940 nohasharray ++ide_park_store_20940 ide_park_store 0-4 20940 &show_20940 ++sh_eth_phy_start_20943 sh_eth_phy_start 0 20943 NULL ++eir_append_data_20945 eir_append_data 0-5-2 20945 NULL ++altera_set_ir_post_20948 altera_set_ir_post 2 20948 NULL ++rx_rx_phy_hdr_read_20950 rx_rx_phy_hdr_read 3-0 20950 NULL ++nilfs_ifile_count_free_inodes_20953 nilfs_ifile_count_free_inodes 0 20953 NULL nohasharray ++ath10k_ce_send_nolock_20953 ath10k_ce_send_nolock 0 20953 &nilfs_ifile_count_free_inodes_20953 ++lm70_sense_temp_20954 lm70_sense_temp 0 20954 NULL ++rsxx_cram_read_20957 rsxx_cram_read 3-0 20957 NULL ++saa7146_i2c_transfer_20961 saa7146_i2c_transfer 0-3 20961 NULL ++nfs_map_name_to_uid_20962 nfs_map_name_to_uid 3 20962 NULL ++config_usb_cfg_attr_show_20966 config_usb_cfg_attr_show 0 20966 NULL ++bfad_im_vport_create_20967 bfad_im_vport_create 0 20967 NULL ++snd_rme9652_playback_copy_20970 snd_rme9652_playback_copy 5 20970 NULL nohasharray ++proc_root_getattr_20970 proc_root_getattr 0 20970 &snd_rme9652_playback_copy_20970 ++ov2640_s_fmt_20973 ov2640_s_fmt 0 20973 NULL nohasharray ++__mmc_test_register_dbgfs_file_20973 __mmc_test_register_dbgfs_file 0 20973 &ov2640_s_fmt_20973 ++acpi_ds_exec_begin_op_20975 acpi_ds_exec_begin_op 0 20975 NULL ++uinput_write_20977 uinput_write 0-3 20977 NULL ++clear_codec_20983 clear_codec 0 20983 NULL ++alg_setsockopt_20985 alg_setsockopt 5-0 20985 NULL ++iwl_mvm_load_ucode_wait_alive_20992 iwl_mvm_load_ucode_wait_alive 0 20992 NULL ++qib_verbs_send_20999 qib_verbs_send 5-3 20999 NULL ++alx_alloc_descriptors_21000 alx_alloc_descriptors 0 21000 NULL ++ocfs2_free_clusters_21001 ocfs2_free_clusters 4 21001 NULL ++iwl_phy_db_get_section_data_21006 iwl_phy_db_get_section_data 0 21006 NULL ++orinoco_cs_suspend_21007 orinoco_cs_suspend 0 21007 NULL ++slow_avc_audit_21019 slow_avc_audit 0 21019 NULL nohasharray ++btrfs_dirty_pages_21019 btrfs_dirty_pages 0 21019 &slow_avc_audit_21019 nohasharray ++selinux_revalidate_file_permission_21019 selinux_revalidate_file_permission 0 21019 &btrfs_dirty_pages_21019 ++mac802154_wpan_mac_addr_21020 mac802154_wpan_mac_addr 0 21020 NULL nohasharray ++adp8870_bl_l2_bright_dim_store_21020 adp8870_bl_l2_bright_dim_store 4-0 21020 &mac802154_wpan_mac_addr_21020 ++btrfs_inode_ref_name_len_21024 btrfs_inode_ref_name_len 0 21024 NULL ++xfs_btree_new_root_21028 xfs_btree_new_root 0 21028 NULL ++arch_gnttab_init_21030 arch_gnttab_init 1 21030 NULL nohasharray ++read_page_21030 read_page 0 21030 &arch_gnttab_init_21030 ++rx_defrag_tkip_called_read_21031 rx_defrag_tkip_called_read 3-0 21031 NULL nohasharray ++suspended_show_21031 suspended_show 0 21031 &rx_defrag_tkip_called_read_21031 nohasharray ++snd_pcm_lib_preallocate_pages_21031 snd_pcm_lib_preallocate_pages 4 21031 &suspended_show_21031 ++nilfs_btree_propagate_v_21037 nilfs_btree_propagate_v 0 21037 NULL ++show_address_21038 show_address 0 21038 NULL nohasharray ++snd_hda_parse_pin_defcfg_21038 snd_hda_parse_pin_defcfg 0 21038 &show_address_21038 ++lbs_threshold_read_21046 lbs_threshold_read 5-0 21046 NULL ++trigger_cmd_21049 trigger_cmd 0 21049 NULL ++mt9m111_set_flip_21052 mt9m111_set_flip 0 21052 NULL ++proc_fault_inject_write_21058 proc_fault_inject_write 3-0 21058 NULL ++tc574_suspend_21067 tc574_suspend 0 21067 NULL nohasharray ++rose_create_facilities_21067 rose_create_facilities 0 21067 &tc574_suspend_21067 ++encrypt_21069 encrypt 0 21069 NULL ++tea575x_s_ctrl_21072 tea575x_s_ctrl 0 21072 NULL nohasharray ++validate_new_21072 validate_new 0 21072 &tea575x_s_ctrl_21072 nohasharray ++fuse_removexattr_21072 fuse_removexattr 0 21072 &validate_new_21072 ++ieee802154_hdr_push_addr_21080 ieee802154_hdr_push_addr 0 21080 NULL ++event_calibration_read_21083 event_calibration_read 3-0 21083 NULL ++lio_target_np_store_sctp_21084 lio_target_np_store_sctp 0-3 21084 NULL ++michael_final_21085 michael_final 0 21085 NULL ++wl18xx_handle_static_data_21088 wl18xx_handle_static_data 0 21088 NULL ++multipath_status_21094 multipath_status 5 21094 NULL ++ext2_valid_block_bitmap_21101 ext2_valid_block_bitmap 3 21101 NULL ++zd_write_mac_addr_common_21102 zd_write_mac_addr_common 0 21102 NULL ++airspy_ctrl_msg_21103 airspy_ctrl_msg 0 21103 NULL ++atc_pcm_capture_prepare_21105 atc_pcm_capture_prepare 0 21105 NULL ++write_posted_21108 write_posted 0 21108 NULL ++ath6kl_send_go_probe_resp_21113 ath6kl_send_go_probe_resp 3 21113 NULL ++target_core_show_dev_info_21116 target_core_show_dev_info 0 21116 NULL ++snd_ice1712_playback_ds_trigger_21118 snd_ice1712_playback_ds_trigger 0 21118 NULL nohasharray ++ddebug_exec_queries_21118 ddebug_exec_queries 0 21118 &snd_ice1712_playback_ds_trigger_21118 nohasharray ++i40e_vlan_rx_add_vid_21118 i40e_vlan_rx_add_vid 0 21118 &ddebug_exec_queries_21118 ++target_core_alua_tg_pt_gp_show_attr_members_21119 target_core_alua_tg_pt_gp_show_attr_members 0 21119 NULL nohasharray ++transient_state_store_21119 transient_state_store 0-4 21119 &target_core_alua_tg_pt_gp_show_attr_members_21119 nohasharray ++_efx_mcdi_rpc_async_21119 _efx_mcdi_rpc_async 4-5 21119 &transient_state_store_21119 ++show_21126 show 0 21126 NULL nohasharray ++target_fabric_nacl_param_attr_store_21126 target_fabric_nacl_param_attr_store 0 21126 &show_21126 ++i2400m_rx_trace_21127 i2400m_rx_trace 3 21127 NULL ++st_gyro_buffer_postenable_21128 st_gyro_buffer_postenable 0 21128 NULL ++snd_nm256_capture_trigger_21135 snd_nm256_capture_trigger 0 21135 NULL ++ubifs_write_iter_21137 ubifs_write_iter 0 21137 NULL ++target_core_dev_pr_show_attr_res_pr_generation_21138 target_core_dev_pr_show_attr_res_pr_generation 0 21138 NULL ++omfs_writepage_21143 omfs_writepage 0 21143 NULL ++tps6586x_irq_init_21144 tps6586x_irq_init 3 21144 NULL ++aoedisk_show_payload_21147 aoedisk_show_payload 0 21147 NULL ++new_skb_21148 new_skb 1 21148 NULL ++ocfs2_block_check_validate_21149 ocfs2_block_check_validate 2 21149 NULL ++dgram_disconnect_21152 dgram_disconnect 0 21152 NULL ++sisfb_set_mode_21155 sisfb_set_mode 0 21155 NULL ++alloc_pg_vec_21159 alloc_pg_vec 3 21159 NULL ++tg3_load_firmware_cpu_21170 tg3_load_firmware_cpu 0 21170 NULL ++mei_dbgfs_read_active_21172 mei_dbgfs_read_active 3-0 21172 NULL nohasharray ++show_therm_max_21172 show_therm_max 0 21172 &mei_dbgfs_read_active_21172 ++hfsplus_writepage_21177 hfsplus_writepage 0 21177 NULL ++bioset_create_nobvec_21180 bioset_create_nobvec 1 21180 NULL nohasharray ++kone_sysfs_read_settings_21180 kone_sysfs_read_settings 0-5-6 21180 &bioset_create_nobvec_21180 ++niu_set_alt_mac_rdc_table_21181 niu_set_alt_mac_rdc_table 0 21181 NULL ++start_command_port_21191 start_command_port 0 21191 NULL ++iptable_nat_ipv4_fn_21192 iptable_nat_ipv4_fn 0 21192 NULL ++cpuset_write_resmask_21193 cpuset_write_resmask 0-3 21193 NULL ++cx18_v4l2_read_21196 cx18_v4l2_read 3-0 21196 NULL ++adt7x10_read_word_21199 adt7x10_read_word 0 21199 NULL ++ipc_rcu_alloc_21208 ipc_rcu_alloc 1 21208 NULL ++brcmf_sdio_txpkt_hdalign_21211 brcmf_sdio_txpkt_hdalign 0 21211 NULL ++prepare_header_21212 prepare_header 0 21212 NULL ++scsi_execute_req_flags_21215 scsi_execute_req_flags 5 21215 NULL ++hdlcdev_open_21219 hdlcdev_open 0 21219 NULL ++_ocfs2_free_clusters_21220 _ocfs2_free_clusters 4 21220 NULL ++show_sched2_21224 show_sched2 0 21224 NULL ++t4_wr_mbox_meat_21225 t4_wr_mbox_meat 0 21225 NULL ++elv_attr_store_21226 elv_attr_store 0-4 21226 NULL ++get_numpages_21227 get_numpages 0-2-1 21227 NULL ++show_session_param_ISCSI_PARAM_ABORT_TMO_21231 show_session_param_ISCSI_PARAM_ABORT_TMO 0 21231 NULL ++fscache_wait_for_operation_activation_21235 fscache_wait_for_operation_activation 0 21235 NULL nohasharray ++iscsi_stat_sess_err_show_attr_digest_errors_21235 iscsi_stat_sess_err_show_attr_digest_errors 0 21235 &fscache_wait_for_operation_activation_21235 ++input_ff_create_21240 input_ff_create 2 21240 NULL ++show_bssinfo_21241 show_bssinfo 0 21241 NULL ++svc_bind_21244 svc_bind 0 21244 NULL nohasharray ++gpio_keys_attr_store_helper_21244 gpio_keys_attr_store_helper 0 21244 &svc_bind_21244 ++target_core_dev_store_21245 target_core_dev_store 0-4 21245 NULL ++nes_store_nonidx_addr_21252 nes_store_nonidx_addr 0-3 21252 NULL ++wp_retry_size_21260 wp_retry_size 0 21260 NULL nohasharray ++pre_snapshot_21260 pre_snapshot 0 21260 &wp_retry_size_21260 ++do_journal_end_21262 do_journal_end 0 21262 NULL nohasharray ++rtw_set_wps_beacon_21262 rtw_set_wps_beacon 3 21262 &do_journal_end_21262 ++gadget_config_desc_bmAttributes_store_21263 gadget_config_desc_bmAttributes_store 0-3 21263 NULL ++ip_vs_icmp_xmit_21269 ip_vs_icmp_xmit 0-4 21269 NULL nohasharray ++do_unlock_21269 do_unlock 0 21269 &ip_vs_icmp_xmit_21269 ++mc13783_adc_show_name_21271 mc13783_adc_show_name 0 21271 NULL ++mmc_date_show_21275 mmc_date_show 0 21275 NULL ++xfs_alloc_ag_vextent_size_21276 xfs_alloc_ag_vextent_size 0 21276 NULL ++s2mps14_regulator_enable_21278 s2mps14_regulator_enable 0 21278 NULL nohasharray ++socket_sendmsg_21278 socket_sendmsg 0 21278 &s2mps14_regulator_enable_21278 ++zd_write_mac_addr_21280 zd_write_mac_addr 0 21280 NULL ++get_alarms_21285 get_alarms 0 21285 NULL ++ubifs_getattr_21290 ubifs_getattr 0 21290 NULL ++t4vf_wr_mbox_core_21291 t4vf_wr_mbox_core 0 21291 NULL ++acpi_ds_init_buffer_field_21296 acpi_ds_init_buffer_field 0 21296 NULL nohasharray ++ax25_listen_21296 ax25_listen 0 21296 &acpi_ds_init_buffer_field_21296 nohasharray ++pwm_polarity_store_21296 pwm_polarity_store 0-4 21296 &ax25_listen_21296 nohasharray ++drm_universal_plane_init_21296 drm_universal_plane_init 6 21296 &pwm_polarity_store_21296 ++net_rx_queue_update_kobjects_21298 net_rx_queue_update_kobjects 0 21298 NULL ++show_pwm2_enable_21299 show_pwm2_enable 0 21299 NULL ++powerclamp_get_cur_state_21302 powerclamp_get_cur_state 0 21302 NULL nohasharray ++ib_umad_read_21302 ib_umad_read 0-3 21302 &powerclamp_get_cur_state_21302 ++offline_pages_21306 offline_pages 0 21306 NULL ++do_msg_fill_21307 do_msg_fill 3 21307 NULL ++show_bank2_value_21309 show_bank2_value 0 21309 NULL ++add_res_range_21310 add_res_range 4 21310 NULL ++store_bluetooth_21320 store_bluetooth 4-0 21320 NULL ++get_zeroed_page_21322 get_zeroed_page 0 21322 NULL ++ftrace_profile_read_21327 ftrace_profile_read 3 21327 NULL ++pcxhr_send_msg_nolock_21331 pcxhr_send_msg_nolock 0 21331 NULL ++show_path_cost_21334 show_path_cost 0 21334 NULL ++iscsi_nacl_param_show_InitialR2T_21337 iscsi_nacl_param_show_InitialR2T 0 21337 NULL ++ext2_get_blocks_21342 ext2_get_blocks 0 21342 NULL ++parport_ieee1284_ecp_read_data_21343 parport_ieee1284_ecp_read_data 0 21343 NULL nohasharray ++nes_store_ee_cmd_21343 nes_store_ee_cmd 0-3 21343 &parport_ieee1284_ecp_read_data_21343 ++read_file_bool_bmps_21344 read_file_bool_bmps 3-0 21344 NULL ++readbytes_21351 readbytes 0 21351 NULL ++gfs2_ea_get_copy_21353 gfs2_ea_get_copy 0 21353 NULL nohasharray ++ppp_dev_init_21353 ppp_dev_init 0 21353 &gfs2_ea_get_copy_21353 ++get_rxfh_indir_size_21355 get_rxfh_indir_size 0 21355 NULL nohasharray ++get_labels_21355 get_labels 0 21355 &get_rxfh_indir_size_21355 nohasharray ++allocate_cmdlines_buffer_21355 allocate_cmdlines_buffer 1 21355 &get_labels_21355 ++squashfs_user_get_21360 squashfs_user_get 0 21360 NULL nohasharray ++saa717x_s_stream_21360 saa717x_s_stream 0 21360 &squashfs_user_get_21360 ++store_associate_remote_21366 store_associate_remote 0-4 21366 NULL ++pin_request_21370 pin_request 0 21370 NULL ++alloc_orinocodev_21371 alloc_orinocodev 1 21371 NULL ++split_leaf_21378 split_leaf 0 21378 NULL nohasharray ++smsc911x_open_21378 smsc911x_open 0 21378 &split_leaf_21378 ++SYSC_rt_sigpending_21379 SYSC_rt_sigpending 2 21379 NULL ++video_ioctl2_21380 video_ioctl2 2 21380 NULL ++bad_file_read_21382 bad_file_read 0-3 21382 NULL nohasharray ++uwb_rsv_establish_21382 uwb_rsv_establish 0 21382 &bad_file_read_21382 ++insert_ptr_21386 insert_ptr 6 21386 NULL ++show_tolerance2_21387 show_tolerance2 0 21387 NULL ++rx_errors_show_21388 rx_errors_show 0 21388 NULL nohasharray ++bonding_show_slaves_21388 bonding_show_slaves 0 21388 &rx_errors_show_21388 ++vivid_user_gen_s_ctrl_21389 vivid_user_gen_s_ctrl 0 21389 NULL ++snd_hda_codec_build_controls_21398 snd_hda_codec_build_controls 0 21398 NULL nohasharray ++a2mp_chan_alloc_skb_cb_21398 a2mp_chan_alloc_skb_cb 3-2 21398 &snd_hda_codec_build_controls_21398 ++diva_get_driver_dbg_mask_21399 diva_get_driver_dbg_mask 0 21399 NULL ++show_fc_host_node_name_21401 show_fc_host_node_name 0 21401 NULL ++rx8025_sysfs_show_clock_adjust_21403 rx8025_sysfs_show_clock_adjust 0 21403 NULL ++max1363_update_scan_mode_21409 max1363_update_scan_mode 0 21409 NULL nohasharray ++e1000_set_mac_21409 e1000_set_mac 0 21409 &max1363_update_scan_mode_21409 ++__swap_writepage_21412 __swap_writepage 0 21412 NULL nohasharray ++handler_21412 handler 0 21412 &__swap_writepage_21412 ++saa7134_ts_buffer_prepare_21413 saa7134_ts_buffer_prepare 0 21413 NULL ++pvr2_ioread_avail_21417 pvr2_ioread_avail 0 21417 NULL ++s3c_hsotg_ep_enable_21420 s3c_hsotg_ep_enable 0 21420 NULL ++usnic_ib_dump_vf_hdr_21423 usnic_ib_dump_vf_hdr 3 21423 NULL ++snapshot_read_next_21426 snapshot_read_next 0 21426 NULL nohasharray ++fsloc_parse_21426 fsloc_parse 0 21426 &snapshot_read_next_21426 ++snd_seq_event_dup_21427 snd_seq_event_dup 0 21427 NULL ++tcp_bound_to_half_wnd_21429 tcp_bound_to_half_wnd 0-2 21429 NULL ++input_dev_show_modalias_21432 input_dev_show_modalias 0 21432 NULL ++cp210x_open_21435 cp210x_open 0 21435 NULL ++adp5520_read_21437 adp5520_read 0 21437 NULL ++aggr_size_tx_agg_vs_rate_read_21438 aggr_size_tx_agg_vs_rate_read 3-0 21438 NULL ++syslog_21440 syslog 0 21440 NULL nohasharray ++isl29003_store_resolution_21440 isl29003_store_resolution 0-4 21440 &syslog_21440 ++hci_dev_do_open_21446 hci_dev_do_open 0 21446 NULL ++show_attr_text_21448 show_attr_text 0 21448 NULL ++nouveau_clock_create__21449 nouveau_clock_create_ 8 21449 NULL ++__ertm_hdr_size_21450 __ertm_hdr_size 0 21450 NULL ++concat_writev_21451 concat_writev 3 21451 NULL ++nfc_hci_send_event_21452 nfc_hci_send_event 5 21452 NULL ++extend_netdev_table_21453 extend_netdev_table 0 21453 NULL ++min_sync_store_21454 min_sync_store 0-3 21454 NULL ++__rapl_event_show_21455 __rapl_event_show 0 21455 NULL ++xfs_vm_writepage_21459 xfs_vm_writepage 0 21459 NULL ++show_cluster_21466 show_cluster 0 21466 NULL nohasharray ++lm3533_als_set_int_mode_21466 lm3533_als_set_int_mode 0 21466 &show_cluster_21466 ++ltc4215_show_alarm_21467 ltc4215_show_alarm 0 21467 NULL ++block_write_begin_21470 block_write_begin 0 21470 NULL nohasharray ++store_engine_load_21470 store_engine_load 0-4 21470 &block_write_begin_21470 ++tm_calc_21474 tm_calc 0 21474 NULL ++mei_nfc_send_21477 mei_nfc_send 3 21477 NULL nohasharray ++regcache_write_21477 regcache_write 0 21477 &mei_nfc_send_21477 nohasharray ++spmi_register_read_21477 spmi_register_read 0 21477 ®cache_write_21477 ++description_show_21480 description_show 0 21480 NULL ++show_threeg_21486 show_threeg 0 21486 NULL ++read_file_xmit_21487 read_file_xmit 3-0 21487 NULL ++firmware_data_read_21488 firmware_data_read 0-5-6 21488 NULL ++set_postcode_21490 set_postcode 0-4 21490 NULL ++security_list_21491 security_list 0-5 21491 NULL ++ads7846_read12_ser_21501 ads7846_read12_ser 0 21501 NULL ++mmc_alloc_sg_21504 mmc_alloc_sg 1 21504 NULL ++show_beep_mask_21507 show_beep_mask 0 21507 NULL nohasharray ++ieee80211_tdls_prep_mgmt_packet_21507 ieee80211_tdls_prep_mgmt_packet 10 21507 &show_beep_mask_21507 ++saa7146_stop_preview_21508 saa7146_stop_preview 0 21508 NULL ++show_pwm_auto_temp_21509 show_pwm_auto_temp 0 21509 NULL ++carl9170_debugfs_hw_iowrite32_write_21513 carl9170_debugfs_hw_iowrite32_write 0-3 21513 NULL ++tpacpi_driver_uwb_emulstate_store_21517 tpacpi_driver_uwb_emulstate_store 0-3 21517 NULL ++cpia2_set_gpio_21520 cpia2_set_gpio 0 21520 NULL ++show_rd_req_21521 show_rd_req 0 21521 NULL ++nilfs_readpage_21524 nilfs_readpage 0 21524 NULL ++isdn_net_header_21527 isdn_net_header 0 21527 NULL ++wm831x_aldo_get_mode_21530 wm831x_aldo_get_mode 0 21530 NULL ++il_dbgfs_stations_read_21532 il_dbgfs_stations_read 3-0 21532 NULL ++f2fs_read_data_page_21533 f2fs_read_data_page 0 21533 NULL ++s2io_set_mac_addr_21534 s2io_set_mac_addr 0 21534 NULL ++shmem_removexattr_21537 shmem_removexattr 0 21537 NULL ++dvb_dmxdev_section_callback_21539 dvb_dmxdev_section_callback 2-4 21539 NULL ++cipso_v4_map_cat_enum_hton_21540 cipso_v4_map_cat_enum_hton 0 21540 NULL ++show_node_state_21543 show_node_state 0 21543 NULL ++fat_ioctl_filldir_21547 fat_ioctl_filldir 3 21547 NULL ++rxrpc_send_data_21553 rxrpc_send_data 5 21553 NULL ++fc0013_get_if_frequency_21554 fc0013_get_if_frequency 0 21554 NULL ++rx_rx_beacon_early_term_read_21559 rx_rx_beacon_early_term_read 3-0 21559 NULL ++ioctl_21564 ioctl 0 21564 NULL ++bh1770_prox_abs_thres_show_21567 bh1770_prox_abs_thres_show 0 21567 NULL ++store_fan_stop_output_21574 store_fan_stop_output 0-4 21574 NULL ++stac_init_21576 stac_init 0 21576 NULL ++multicast_startup_query_interval_show_21579 multicast_startup_query_interval_show 0 21579 NULL ++ov9650_start_21580 ov9650_start 0 21580 NULL ++hw_set_pwm_21583 hw_set_pwm 0 21583 NULL ++ahd_proc_write_seeprom_21584 ahd_proc_write_seeprom 0-3 21584 NULL ++pci_siig10x_init_21592 pci_siig10x_init 0 21592 NULL ++netxen_nic_open_21600 netxen_nic_open 0 21600 NULL ++kone_set_profile_21602 kone_set_profile 0 21602 NULL ++bttv_i2c_sendbytes_21603 bttv_i2c_sendbytes 0 21603 NULL ++ocfs2_acl_from_xattr_21604 ocfs2_acl_from_xattr 2 21604 NULL ++ib_dma_map_single_21605 ib_dma_map_single 0 21605 NULL ++clk_ctl_show_21606 clk_ctl_show 0 21606 NULL nohasharray ++ebt_nat_in_21606 ebt_nat_in 0 21606 &clk_ctl_show_21606 ++dbg_check_orphans_21607 dbg_check_orphans 0 21607 NULL ++recover_status_show_21609 recover_status_show 0 21609 NULL ++nilfs_direct_lookup_21611 nilfs_direct_lookup 0 21611 NULL ++sha1_mb_update_21612 sha1_mb_update 0 21612 NULL ++pccard_store_eject_21618 pccard_store_eject 0-4 21618 NULL ++brightness_store_21623 brightness_store 0-4 21623 NULL ++gfs2_glock_nq_init_21624 gfs2_glock_nq_init 0 21624 NULL ++ipr_show_log_level_21626 ipr_show_log_level 0 21626 NULL ++ath10k_wmi_vdev_restart_21628 ath10k_wmi_vdev_restart 0 21628 NULL ++ocfs2_refcount_cow_hunk_21630 ocfs2_refcount_cow_hunk 0 21630 NULL nohasharray ++ndisc_addr_option_pad_21630 ndisc_addr_option_pad 0 21630 &ocfs2_refcount_cow_hunk_21630 ++__jfs_getxattr_21631 __jfs_getxattr 0 21631 NULL ++ca0132_dig_playback_pcm_prepare_21635 ca0132_dig_playback_pcm_prepare 0 21635 NULL ++max_sync_show_21636 max_sync_show 0 21636 NULL nohasharray ++roccat_common2_receive_control_status_21636 roccat_common2_receive_control_status 0 21636 &max_sync_show_21636 ++setattr_chown_21638 setattr_chown 0 21638 NULL ++__irq_alloc_descs_21639 __irq_alloc_descs 2-0-3-1 21639 NULL ++show_tabletMouseMiddle_21650 show_tabletMouseMiddle 0 21650 NULL ++iwl_set_power_21654 iwl_set_power 0 21654 NULL ++carl9170_rx_copy_data_21656 carl9170_rx_copy_data 2 21656 NULL ++hiface_pcm_prepare_21657 hiface_pcm_prepare 0 21657 NULL ++ixgb_change_mtu_21665 ixgb_change_mtu 0 21665 NULL nohasharray ++imsttfb_set_par_21665 imsttfb_set_par 0 21665 &ixgb_change_mtu_21665 ++aty_var_to_pll_ct_21674 aty_var_to_pll_ct 0 21674 NULL ++atalk_sendmsg_21677 atalk_sendmsg 4-0 21677 NULL ++ocfs2_xattr_get_nolock_21678 ocfs2_xattr_get_nolock 0 21678 NULL nohasharray ++nilfs_segctor_scan_file_dsync_21678 nilfs_segctor_scan_file_dsync 0 21678 &ocfs2_xattr_get_nolock_21678 ++regmap_register_patch_21681 regmap_register_patch 3 21681 NULL ++tomoyo_read_control_21682 tomoyo_read_control 0 21682 NULL ++tcp_tso_autosize_21683 tcp_tso_autosize 0-2 21683 NULL ++iwl_mvm_get_temp_cmd_21684 iwl_mvm_get_temp_cmd 0 21684 NULL ++iwl_dbgfs_fw_nmi_write_21685 iwl_dbgfs_fw_nmi_write 0-3 21685 NULL ++proc_maps_open_21687 proc_maps_open 4 21687 NULL nohasharray ++rtllib_alloc_txb_21687 rtllib_alloc_txb 2-1 21687 &proc_maps_open_21687 ++set_mc_hash_21690 set_mc_hash 0 21690 NULL ++show_sf4_temp_21691 show_sf4_temp 0 21691 NULL ++lp55xx_store_current_21692 lp55xx_store_current 0-4 21692 NULL ++MT2063_ClearPowerMaskBits_21702 MT2063_ClearPowerMaskBits 0 21702 NULL ++evdev_ioctl_handler_21705 evdev_ioctl_handler 2 21705 NULL ++set_21707 set 0-4 21707 NULL ++usbpn_set_mtu_21708 usbpn_set_mtu 0 21708 NULL ++xfs_btree_insert_21712 xfs_btree_insert 0 21712 NULL nohasharray ++ipath_wait_linkstate_21712 ipath_wait_linkstate 0 21712 &xfs_btree_insert_21712 ++ieee80211_stop_tx_ba_session_21713 ieee80211_stop_tx_ba_session 0 21713 NULL nohasharray ++pm_runtime_put_autosuspend_21713 pm_runtime_put_autosuspend 0 21713 &ieee80211_stop_tx_ba_session_21713 ++light_set_status_21714 light_set_status 0 21714 NULL ++update_time_21719 update_time 0 21719 NULL ++lpfc_log_verbose_store_21726 lpfc_log_verbose_store 0-4 21726 NULL ++lprocfs_wr_import_21728 lprocfs_wr_import 3 21728 NULL ++reiserfs_allocate_list_bitmaps_21732 reiserfs_allocate_list_bitmaps 3 21732 NULL ++dma_maxpq_21736 dma_maxpq 0 21736 NULL nohasharray ++ixgb_setup_tx_resources_21736 ixgb_setup_tx_resources 0 21736 &dma_maxpq_21736 nohasharray ++nr_set_mac_address_21736 nr_set_mac_address 0 21736 &ixgb_setup_tx_resources_21736 ++cx18_av_s_ctrl_21740 cx18_av_s_ctrl 0 21740 NULL ++show_temp23_21741 show_temp23 0 21741 NULL ++ipv6_confirm_21743 ipv6_confirm 0 21743 NULL ++at91_open_21744 at91_open 0 21744 NULL nohasharray ++__nf_nat_mangle_tcp_packet_21744 __nf_nat_mangle_tcp_packet 6-8 21744 &at91_open_21744 ++set_sticky_21752 set_sticky 0-4 21752 NULL ++mthca_alloc_init_21754 mthca_alloc_init 2 21754 NULL ++l2down_create_21755 l2down_create 4 21755 NULL ++lpfc_temp_sensor_show_21758 lpfc_temp_sensor_show 0 21758 NULL ++addrconf_sysctl_register_21762 addrconf_sysctl_register 0 21762 NULL nohasharray ++usbat_flash_read_data_21762 usbat_flash_read_data 4 21762 &addrconf_sysctl_register_21762 ++mmc_test_register_dbgfs_file_21763 mmc_test_register_dbgfs_file 0 21763 NULL ++t4vf_change_mac_21765 t4vf_change_mac 0 21765 NULL ++nlmon_dev_init_21771 nlmon_dev_init 0 21771 NULL ++show_sas_expander_level_21775 show_sas_expander_level 0 21775 NULL nohasharray ++qla4xxx_session_get_param_21775 qla4xxx_session_get_param 0 21775 &show_sas_expander_level_21775 ++gen_pool_add_21776 gen_pool_add 3 21776 NULL ++SyS_sendfile_21777 SyS_sendfile 4 21777 NULL ++snd_ad1889_playback_trigger_21779 snd_ad1889_playback_trigger 0 21779 NULL ++xfs_da_grow_inode_int_21785 xfs_da_grow_inode_int 3-0 21785 NULL ++kmalloc_order_trace_21788 kmalloc_order_trace 1 21788 NULL ++tpu_pwm_enable_21790 tpu_pwm_enable 0 21790 NULL ++_cx88_start_audio_dma_21792 _cx88_start_audio_dma 0 21792 NULL nohasharray ++libipw_get_hdrlen_21792 libipw_get_hdrlen 0 21792 &_cx88_start_audio_dma_21792 ++d3cold_allowed_show_21797 d3cold_allowed_show 0 21797 NULL ++aa_may_ptrace_21798 aa_may_ptrace 0 21798 NULL ++show_pwm_auto_point_temp_hyst_21800 show_pwm_auto_point_temp_hyst 0 21800 NULL ++min_odd_21802 min_odd 0-1-2 21802 NULL ++show_rotate_21803 show_rotate 0 21803 NULL ++show_node_desc_21804 show_node_desc 0 21804 NULL ++cfspi_init_21807 cfspi_init 0 21807 NULL nohasharray ++freeze_processes_21807 freeze_processes 0 21807 &cfspi_init_21807 ++nilfs_checkpoints_checkpoints_number_show_21809 nilfs_checkpoints_checkpoints_number_show 0 21809 NULL ++dvb_generic_ioctl_21810 dvb_generic_ioctl 2 21810 NULL ++__ocfs2_cluster_lock_21812 __ocfs2_cluster_lock 0 21812 NULL ++create_basic_memory_bitmaps_21814 create_basic_memory_bitmaps 0 21814 NULL ++qib_portattr_store_21817 qib_portattr_store 0-4 21817 NULL nohasharray ++__kernel_write_21817 __kernel_write 3-0 21817 &qib_portattr_store_21817 ++ov9740_g_crop_21818 ov9740_g_crop 0 21818 NULL ++wm8994_request_irq_21822 wm8994_request_irq 2 21822 NULL ++lm95234_fill_cache_21823 lm95234_fill_cache 0 21823 NULL ++mtd_ecc_stats_errors_show_21825 mtd_ecc_stats_errors_show 0 21825 NULL nohasharray ++store_node_21825 store_node 0-4 21825 &mtd_ecc_stats_errors_show_21825 ++max8907_rtc_read_time_21829 max8907_rtc_read_time 0 21829 NULL ++show_therm_max_alarm_21830 show_therm_max_alarm 0 21830 NULL ++io_submit_add_bh_21832 io_submit_add_bh 0 21832 NULL nohasharray ++fb_pan_display_21832 fb_pan_display 0 21832 &io_submit_add_bh_21832 ++tpacket_snd_21833 tpacket_snd 0 21833 NULL ++task_setnice_21835 task_setnice 0 21835 NULL ++_iwl_dbgfs_sta_drain_write_21837 _iwl_dbgfs_sta_drain_write 3-0 21837 NULL ++smb_init_21838 smb_init 0 21838 NULL ++bad_file_write_21839 bad_file_write 0-3 21839 NULL ++run_21841 run 0 21841 NULL ++block_truncate_page_21842 block_truncate_page 0 21842 NULL ++lpfc_log_verbose_show_21843 lpfc_log_verbose_show 0 21843 NULL ++ecryptfs_truncate_21845 ecryptfs_truncate 0 21845 NULL ++oom_adj_read_21847 oom_adj_read 3-0 21847 NULL ++snd_disconnect_write_21851 snd_disconnect_write 0-3 21851 NULL ++irq_affinity_list_proc_write_21852 irq_affinity_list_proc_write 0-3 21852 NULL ++wl1271_acx_beacon_filter_opt_21855 wl1271_acx_beacon_filter_opt 0 21855 NULL ++usb_autopm_get_interface_21858 usb_autopm_get_interface 0 21858 NULL ++rapl_cpu_notifier_21859 rapl_cpu_notifier 0 21859 NULL ++wl1271_acx_rssi_snr_avg_weights_21862 wl1271_acx_rssi_snr_avg_weights 0 21862 NULL ++lpfc_idiag_extacc_avail_get_21865 lpfc_idiag_extacc_avail_get 0-3 21865 NULL ++msix_capability_init_21870 msix_capability_init 0 21870 NULL ++sisusbcon_bmove_21873 sisusbcon_bmove 7-5-6 21873 NULL nohasharray ++show_conn_param_ISCSI_PARAM_TCP_RECV_WSF_21873 show_conn_param_ISCSI_PARAM_TCP_RECV_WSF 0 21873 &sisusbcon_bmove_21873 ++em28xx_write_regs_req_21874 em28xx_write_regs_req 0 21874 NULL nohasharray ++security_compute_sid_21874 security_compute_sid 0 21874 &em28xx_write_regs_req_21874 nohasharray ++c_can_wait_for_ctrl_init_21874 c_can_wait_for_ctrl_init 0 21874 &security_compute_sid_21874 ++cpumask_set_cpu_local_first_21879 cpumask_set_cpu_local_first 0 21879 NULL ++gadget_dev_desc_idProduct_store_21881 gadget_dev_desc_idProduct_store 0-3 21881 NULL ++show_oversampling_21883 show_oversampling 0 21883 NULL ++mei_amthif_send_cmd_21885 mei_amthif_send_cmd 0 21885 NULL ++xen_swiotlb_map_page_21886 xen_swiotlb_map_page 0-3 21886 NULL ++ips_halt_21887 ips_halt 0 21887 NULL ++ldlm_lock_create_21888 ldlm_lock_create 7 21888 NULL ++target_stat_scsi_tgt_port_show_attr_inst_21890 target_stat_scsi_tgt_port_show_attr_inst 0 21890 NULL ++__btrfs_direct_write_21894 __btrfs_direct_write 3-0 21894 NULL ++__alloc_reserved_percpu_21895 __alloc_reserved_percpu 1-2 21895 NULL ++xhci_configure_endpoint_result_21900 xhci_configure_endpoint_result 0 21900 NULL nohasharray ++rio_destid_first_21900 rio_destid_first 0 21900 &xhci_configure_endpoint_result_21900 ++cx18_s_video_encoding_21901 cx18_s_video_encoding 0 21901 NULL ++pcm_capture_prepare_21906 pcm_capture_prepare 0 21906 NULL ++__logfs_write_rec_21907 __logfs_write_rec 0 21907 NULL ++dbAllocCtl_21911 dbAllocCtl 0 21911 NULL ++qsfp_1_read_21915 qsfp_1_read 3-0 21915 NULL ++l2tp_ip_disconnect_21920 l2tp_ip_disconnect 0 21920 NULL ++go7007_s_ctrl_21935 go7007_s_ctrl 0 21935 NULL ++bond_option_xmit_hash_policy_set_21936 bond_option_xmit_hash_policy_set 0 21936 NULL ++ceph_permission_21941 ceph_permission 0 21941 NULL ++bnx2fc_destroy_21942 bnx2fc_destroy 0 21942 NULL ++f2fs_read_inline_data_21946 f2fs_read_inline_data 0 21946 NULL ++led_delay_off_store_21947 led_delay_off_store 0-4 21947 NULL ++show_remote_temp8_21948 show_remote_temp8 0 21948 NULL nohasharray ++wl1271_cmd_general_parms_21948 wl1271_cmd_general_parms 0 21948 &show_remote_temp8_21948 ++bus_attr_show_21949 bus_attr_show 0 21949 NULL ++wl1271_sysfs_show_bt_coex_state_21950 wl1271_sysfs_show_bt_coex_state 0 21950 NULL nohasharray ++usb_remove_device_21950 usb_remove_device 0 21950 &wl1271_sysfs_show_bt_coex_state_21950 ++loopback_check_format_21951 loopback_check_format 0 21951 NULL ++twl_i2c_write_u16_21953 twl_i2c_write_u16 0-3 21953 NULL ++prism2_set_mac_address_21958 prism2_set_mac_address 0 21958 NULL ++rtl2832_sdr_set_tuner_freq_21960 rtl2832_sdr_set_tuner_freq 0 21960 NULL nohasharray ++write_fifo_21960 write_fifo 0 21960 &rtl2832_sdr_set_tuner_freq_21960 ++ethoc_set_mac_address_21964 ethoc_set_mac_address 0 21964 NULL ++pt1_i2c_end_21971 pt1_i2c_end 0 21971 NULL ++alloc_ldt_21972 alloc_ldt 2 21972 NULL nohasharray ++isl1208_i2c_read_time_21972 isl1208_i2c_read_time 0 21972 &alloc_ldt_21972 nohasharray ++atalk_pick_and_bind_port_21972 atalk_pick_and_bind_port 0 21972 &isl1208_i2c_read_time_21972 ++__build_xattrs_21979 __build_xattrs 0 21979 NULL ++SYSC_prctl_21980 SYSC_prctl 4 21980 NULL nohasharray ++tda18271_tune_21980 tda18271_tune 0 21980 &SYSC_prctl_21980 ++smm665_show_max_21981 smm665_show_max 0 21981 NULL ++xen_bind_pirq_msi_to_irq_21986 xen_bind_pirq_msi_to_irq 4 21986 NULL nohasharray ++pm_show_wakelocks_21986 pm_show_wakelocks 0 21986 &xen_bind_pirq_msi_to_irq_21986 ++ath5k_hw_rf5112_channel_21993 ath5k_hw_rf5112_channel 0 21993 NULL ++w1_f2d_readblock_21994 w1_f2d_readblock 3 21994 NULL ++proc_sched_autogroup_set_nice_21995 proc_sched_autogroup_set_nice 0 21995 NULL ++compat_rw_copy_check_uvector_22001 compat_rw_copy_check_uvector 3-0 22001 NULL nohasharray ++rxpipe_descr_host_int_trig_rx_data_read_22001 rxpipe_descr_host_int_trig_rx_data_read 3-0 22001 &compat_rw_copy_check_uvector_22001 ++osst_linux_media_version_show_22002 osst_linux_media_version_show 0 22002 NULL ++autofs4_mount_wait_22004 autofs4_mount_wait 0 22004 NULL ++kobil_open_22009 kobil_open 0 22009 NULL ++rndis_filter_set_packet_filter_22011 rndis_filter_set_packet_filter 0 22011 NULL ++nv_set_mac_address_22012 nv_set_mac_address 0 22012 NULL ++show_trans_timeout_22013 show_trans_timeout 0 22013 NULL ++netdev_queue_attr_show_22015 netdev_queue_attr_show 0 22015 NULL ++fbcon_fb_registered_22016 fbcon_fb_registered 0 22016 NULL nohasharray ++il_alloc_txq_mem_22016 il_alloc_txq_mem 0 22016 &fbcon_fb_registered_22016 ++atl1e_get_eeprom_len_22018 atl1e_get_eeprom_len 0 22018 NULL ++xfs_attr3_leaf_to_shortform_22019 xfs_attr3_leaf_to_shortform 0 22019 NULL ++regcache_sync_block_raw_flush_22021 regcache_sync_block_raw_flush 3-4 22021 NULL ++gether_get_host_addr_22022 gether_get_host_addr 0 22022 NULL ++btrfs_get_16_22023 btrfs_get_16 0 22023 NULL ++write_usb_charge_22024 write_usb_charge 0 22024 NULL ++ocfs2_control_validate_protocol_22029 ocfs2_control_validate_protocol 0-3 22029 NULL ++da9052_bat_check_status_22030 da9052_bat_check_status 0 22030 NULL ++_sp2d_min_pg_22032 _sp2d_min_pg 0 22032 NULL ++disable_nonboot_cpus_22037 disable_nonboot_cpus 0 22037 NULL ++lookup_metapath_22039 lookup_metapath 0 22039 NULL nohasharray ++rtsx_pci_dma_map_sg_22039 rtsx_pci_dma_map_sg 3 22039 &lookup_metapath_22039 ++mt9v011_s_mbus_fmt_22040 mt9v011_s_mbus_fmt 0 22040 NULL ++nfs_permission_22042 nfs_permission 0 22042 NULL nohasharray ++ath5k_attr_show_firstep_level_22042 ath5k_attr_show_firstep_level 0 22042 &nfs_permission_22042 ++xfs_fs_freeze_22048 xfs_fs_freeze 0 22048 NULL ++zd_usb_read_fw_22049 zd_usb_read_fw 4 22049 NULL nohasharray ++nilfs_segctor_wait_22049 nilfs_segctor_wait 0 22049 &zd_usb_read_fw_22049 ++vbi_buffer_prepare_22050 vbi_buffer_prepare 0 22050 NULL ++create_speaker_out_ctls_22052 create_speaker_out_ctls 0 22052 NULL ++atalk_recvmsg_22053 atalk_recvmsg 0-4 22053 NULL ++ieee80211_if_fmt_dropped_frames_ttl_22054 ieee80211_if_fmt_dropped_frames_ttl 3 22054 NULL nohasharray ++skge_ring_alloc_22054 skge_ring_alloc 0 22054 &ieee80211_if_fmt_dropped_frames_ttl_22054 nohasharray ++sys_recvfrom_22054 sys_recvfrom 3 22054 &skge_ring_alloc_22054 ++end_show_22058 end_show 0 22058 NULL nohasharray ++show_sas_phy_minimum_linkrate_hw_22058 show_sas_phy_minimum_linkrate_hw 0 22058 &end_show_22058 nohasharray ++uart_mode_store_22058 uart_mode_store 0-4 22058 &show_sas_phy_minimum_linkrate_hw_22058 ++acpi_ds_get_field_names_22059 acpi_ds_get_field_names 0 22059 NULL nohasharray ++pio_write_22059 pio_write 0-6-5 22059 &acpi_ds_get_field_names_22059 ++cfqg_set_weight_device_22062 cfqg_set_weight_device 3-0 22062 NULL ++trunc_end_22065 trunc_end 0 22065 NULL nohasharray ++il_tx_queue_init_22065 il_tx_queue_init 0 22065 &trunc_end_22065 ++bNumEndpoints_show_22075 bNumEndpoints_show 0 22075 NULL ++btrfs_reloc_clone_csums_22077 btrfs_reloc_clone_csums 2-3-0 22077 NULL nohasharray ++sigmadsp_write_regmap_22077 sigmadsp_write_regmap 2-4 22077 &btrfs_reloc_clone_csums_22077 ++find_trange_value_22079 find_trange_value 0 22079 NULL ++timeout_show_22081 timeout_show 0 22081 NULL ++clear_store_22082 clear_store 0-4 22082 NULL ++ov772x_cropcap_22083 ov772x_cropcap 0 22083 NULL ++mem_rw_22085 mem_rw 3-0 22085 NULL nohasharray ++sb1000_end_get_set_command_22085 sb1000_end_get_set_command 0 22085 &mem_rw_22085 ++nf_ct_seq_adjust_22086 nf_ct_seq_adjust 4 22086 NULL ++acerhdf_get_mode_22088 acerhdf_get_mode 0 22088 NULL ++niu_init_one_rx_channel_22095 niu_init_one_rx_channel 0 22095 NULL ++ext3_setattr_22100 ext3_setattr 0 22100 NULL ++portio_name_show_22101 portio_name_show 0 22101 NULL ++rndis_error_status_22103 rndis_error_status 0 22103 NULL nohasharray ++qlcnic_sriov_pf_enable_22103 qlcnic_sriov_pf_enable 0 22103 &rndis_error_status_22103 ++find_free_port_22104 find_free_port 0 22104 NULL ++rt2x00debug_read_crypto_stats_22109 rt2x00debug_read_crypto_stats 3-0 22109 NULL ++get_pwm_22113 get_pwm 0 22113 NULL ++arvo_sysfs_show_key_mask_22117 arvo_sysfs_show_key_mask 0 22117 NULL nohasharray ++beiscsi_log_enable_store_22117 beiscsi_log_enable_store 0-4 22117 &arvo_sysfs_show_key_mask_22117 ++mlog_show_22119 mlog_show 0 22119 NULL ++show_session_param_ISCSI_PARAM_TARGET_NAME_22122 show_session_param_ISCSI_PARAM_TARGET_NAME 0 22122 NULL ++tps65217_reg_read_22125 tps65217_reg_read 0 22125 NULL ++show_fan_min_22127 show_fan_min 0 22127 NULL ++get_results_22130 get_results 0 22130 NULL nohasharray ++snd_hda_codec_read_22130 snd_hda_codec_read 0 22130 &get_results_22130 ++mx2_videobuf_setup_22136 mx2_videobuf_setup 0 22136 NULL ++__bitmap_size_22138 __bitmap_size 0 22138 NULL ++read_cal_int_tables_22139 read_cal_int_tables 0 22139 NULL ++listxattr_22142 listxattr 0-3 22142 NULL ++reset_atmel_card_22143 reset_atmel_card 0 22143 NULL ++SyS_sched_setaffinity_22148 SyS_sched_setaffinity 2 22148 NULL ++smsc95xx_reset_22152 smsc95xx_reset 0 22152 NULL ++netlink_bind_22153 netlink_bind 0 22153 NULL ++pn533_dep_link_up_22154 pn533_dep_link_up 5 22154 NULL ++isci_task_execute_task_22155 isci_task_execute_task 0 22155 NULL ++__vlan_device_event_22159 __vlan_device_event 0 22159 NULL ++show_otp2en_22160 show_otp2en 0 22160 NULL ++set_pwm_enable_22161 set_pwm_enable 0-4 22161 NULL ++pm8001_phy_control_22163 pm8001_phy_control 0 22163 NULL nohasharray ++store_pwm_interpolate_22163 store_pwm_interpolate 0-4 22163 &pm8001_phy_control_22163 ++lx_hardware_open_22166 lx_hardware_open 0 22166 NULL ++usbhsh_dcp_queue_push_22167 usbhsh_dcp_queue_push 0 22167 NULL ++reiserfs_paste_into_item_22170 reiserfs_paste_into_item 0 22170 NULL ++__kfifo_alloc_22173 __kfifo_alloc 3-0 22173 NULL nohasharray ++max8997_reg_enable_22173 max8997_reg_enable 0 22173 &__kfifo_alloc_22173 ++dccp_disconnect_22174 dccp_disconnect 0 22174 NULL ++beiscsi_adap_family_disp_22179 beiscsi_adap_family_disp 0 22179 NULL nohasharray ++nf_nat_ipv6_in_22179 nf_nat_ipv6_in 0 22179 &beiscsi_adap_family_disp_22179 ++iscsi_disc_show_userid_mutual_22181 iscsi_disc_show_userid_mutual 0 22181 NULL ++channel_dimm_label_store_22189 channel_dimm_label_store 0-4 22189 NULL ++xen_acpi_processor_resume_22190 xen_acpi_processor_resume 0 22190 NULL ++tps80031_rtc_alarm_irq_enable_22198 tps80031_rtc_alarm_irq_enable 0 22198 NULL ++btrfs_space_info_show_disk_total_22200 btrfs_space_info_show_disk_total 0 22200 NULL ++cmd_exec_22204 cmd_exec 0 22204 NULL ++fls_22210 fls 0 22210 NULL ++f2fs_write_data_pages_22217 f2fs_write_data_pages 0 22217 NULL ++fat_compat_ioctl_filldir_22222 fat_compat_ioctl_filldir 3 22222 NULL ++show_22225 show 0 22225 NULL ++rfcomm_sock_recvmsg_22227 rfcomm_sock_recvmsg 0-4 22227 NULL nohasharray ++xirc2ps_resume_22227 xirc2ps_resume 0 22227 &rfcomm_sock_recvmsg_22227 ++core_alua_show_tg_pt_gp_info_22228 core_alua_show_tg_pt_gp_info 0 22228 NULL ++mem_write_22232 mem_write 3-0 22232 NULL ++mwl8k_cmd_set_pre_scan_22233 mwl8k_cmd_set_pre_scan 0 22233 NULL ++fw_status_show_22234 fw_status_show 0 22234 NULL ++av7110_fw_cmd_22236 av7110_fw_cmd 0 22236 NULL nohasharray ++i810_check_params_22236 i810_check_params 0 22236 &av7110_fw_cmd_22236 ++store_tabletMouseRight_22238 store_tabletMouseRight 0-4 22238 NULL ++p9_virtio_zc_request_22240 p9_virtio_zc_request 6-5 22240 NULL ++show_fnode_redirect_ipaddr_22241 show_fnode_redirect_ipaddr 0 22241 NULL nohasharray ++mwifiex_cmd_recfg_tx_buf_22241 mwifiex_cmd_recfg_tx_buf 0 22241 &show_fnode_redirect_ipaddr_22241 ++ath10k_push_board_ext_data_22243 ath10k_push_board_ext_data 0 22243 NULL nohasharray ++fsnotify_parent_22243 fsnotify_parent 0 22243 &ath10k_push_board_ext_data_22243 ++prepare_to_wait_event_22247 prepare_to_wait_event 0 22247 NULL ++capability_id_show_22253 capability_id_show 0 22253 NULL ++compat_process_vm_rw_22254 compat_process_vm_rw 3-5 22254 NULL ++show_fc_rport_maxframe_size_22260 show_fc_rport_maxframe_size 0 22260 NULL ++ping_common_sendmsg_22261 ping_common_sendmsg 5 22261 NULL ++add_res_tree_22263 add_res_tree 7 22263 NULL ++at91ether_open_22272 at91ether_open 0 22272 NULL ++bmc150_accel_set_power_state_22273 bmc150_accel_set_power_state 0 22273 NULL ++adp8870_bl_l4_indoor_dim_show_22281 adp8870_bl_l4_indoor_dim_show 0 22281 NULL ++show_ipInReceives_22282 show_ipInReceives 0 22282 NULL nohasharray ++scan_sleep_millisecs_show_22282 scan_sleep_millisecs_show 0 22282 &show_ipInReceives_22282 ++container_offline_22283 container_offline 0 22283 NULL ++pm8001_ctl_logging_level_show_22284 pm8001_ctl_logging_level_show 0 22284 NULL ++ndo_validate_addr_22293 ndo_validate_addr 0 22293 NULL ++snd_sb16_playback_prepare_22296 snd_sb16_playback_prepare 0 22296 NULL ++__tun_chr_ioctl_22300 __tun_chr_ioctl 4 22300 NULL ++anysee_master_xfer_22303 anysee_master_xfer 0-3 22303 NULL nohasharray ++csrow_edac_mode_show_22303 csrow_edac_mode_show 0 22303 &anysee_master_xfer_22303 ++mesh_table_alloc_22305 mesh_table_alloc 1 22305 NULL ++show_ipv4_iface_dhcp_vendor_id_22308 show_ipv4_iface_dhcp_vendor_id 0 22308 NULL nohasharray ++hw_ep_enable_22308 hw_ep_enable 0 22308 &show_ipv4_iface_dhcp_vendor_id_22308 ++in_tx_cp_show_22316 in_tx_cp_show 0 22316 NULL nohasharray ++udpv6_sendmsg_22316 udpv6_sendmsg 0-4 22316 &in_tx_cp_show_22316 ++C_SYSC_msgrcv_22320 C_SYSC_msgrcv 3 22320 NULL ++tg3_get_regs_len_22327 tg3_get_regs_len 0 22327 NULL nohasharray ++statfs_slow_show_22327 statfs_slow_show 0 22327 &tg3_get_regs_len_22327 ++page_cache_tree_insert_22331 page_cache_tree_insert 0 22331 NULL ++ipr_show_fw_version_22332 ipr_show_fw_version 0 22332 NULL ++show_temp_crit_ext_22334 show_temp_crit_ext 0 22334 NULL nohasharray ++do_migrate_range_22334 do_migrate_range 0 22334 &show_temp_crit_ext_22334 ++kempld_i2c_xfer_22335 kempld_i2c_xfer 0-3 22335 NULL ++target_stat_scsi_lu_show_attr_write_mbytes_22338 target_stat_scsi_lu_show_attr_write_mbytes 0 22338 NULL ++ch341_set_handshake_22339 ch341_set_handshake 0 22339 NULL ++lbs_set_monitor_mode_22340 lbs_set_monitor_mode 0 22340 NULL ++sys_read_22343 sys_read 3 22343 NULL ++wl18xx_boot_22344 wl18xx_boot 0 22344 NULL ++part_timeout_store_22351 part_timeout_store 0-4 22351 NULL ++ptn3460_read_bytes_22352 ptn3460_read_bytes 4 22352 NULL nohasharray ++block_store_22352 block_store 0-3 22352 &ptn3460_read_bytes_22352 ++ll_lazystatfs_seq_write_22353 ll_lazystatfs_seq_write 3 22353 NULL ++c_can_chip_config_22357 c_can_chip_config 0 22357 NULL ++__device_suspend_noirq_22360 __device_suspend_noirq 0 22360 NULL ++regmap_spi_gather_write_22364 regmap_spi_gather_write 0 22364 NULL nohasharray ++o2nm_cluster_attr_reconnect_delay_ms_read_22364 o2nm_cluster_attr_reconnect_delay_ms_read 0 22364 ®map_spi_gather_write_22364 nohasharray ++gem_set_mac_address_22364 gem_set_mac_address 0 22364 &o2nm_cluster_attr_reconnect_delay_ms_read_22364 ++tps6586x_gpio_to_irq_22365 tps6586x_gpio_to_irq 2 22365 NULL nohasharray ++show_lcd_level_22365 show_lcd_level 0 22365 &tps6586x_gpio_to_irq_22365 ++build_ntlmssp_auth_blob_22366 build_ntlmssp_auth_blob 0 22366 NULL ++dbg_check_znode_22369 dbg_check_znode 0 22369 NULL ++roccat_common2_sysfs_write_keys_primary_22370 roccat_common2_sysfs_write_keys_primary 0-6-5 22370 NULL ++evdev_ioctl_22371 evdev_ioctl 2 22371 NULL ++wake_up_lan_show_22373 wake_up_lan_show 0 22373 NULL nohasharray ++hugetlbfs_write_begin_22373 hugetlbfs_write_begin 0 22373 &wake_up_lan_show_22373 ++ufx_reg_clear_bits_22374 ufx_reg_clear_bits 0 22374 NULL ++gfs2_attr_store_22375 gfs2_attr_store 0-4 22375 NULL ++sysfs_kf_read_22385 sysfs_kf_read 0 22385 NULL nohasharray ++pktgen_alloc_skb_22385 pktgen_alloc_skb 3 22385 &sysfs_kf_read_22385 ++qlcnic_set_mac_22387 qlcnic_set_mac 0 22387 NULL ++show_sas_phy_running_disparity_error_count_22389 show_sas_phy_running_disparity_error_count 0 22389 NULL ++saa7164_api_i2c_write_22390 saa7164_api_i2c_write 0 22390 NULL ++alloc_large_system_hash_22391 alloc_large_system_hash 2 22391 NULL nohasharray ++ath10k_debug_fw_reset_stats_read_22391 ath10k_debug_fw_reset_stats_read 3-0 22391 &alloc_large_system_hash_22391 ++ocfs2_assign_bh_22392 ocfs2_assign_bh 0 22392 NULL ++commit_pagelist_22396 commit_pagelist 0 22396 NULL ++lpfc_max_xri_show_22398 lpfc_max_xri_show 0 22398 NULL ++vb2_internal_qbuf_22400 vb2_internal_qbuf 0 22400 NULL ++crash_shrink_memory_22401 crash_shrink_memory 0 22401 NULL ++zoran_write_22404 zoran_write 3-0 22404 NULL ++show_debug_level_22406 show_debug_level 0 22406 NULL ++pnp_start_dev_22411 pnp_start_dev 0 22411 NULL ++queue_reply_22416 queue_reply 3-0 22416 NULL ++iscsi_stat_sess_err_show_attr_format_errors_22417 iscsi_stat_sess_err_show_attr_format_errors 0 22417 NULL ++usbhsg_gadget_start_22424 usbhsg_gadget_start 0 22424 NULL ++sg_finish_rem_req_22426 sg_finish_rem_req 0 22426 NULL ++update_22427 update 0 22427 NULL ++isci_show_id_22428 isci_show_id 0 22428 NULL nohasharray ++erst_exec_set_src_address_base_22428 erst_exec_set_src_address_base 0 22428 &isci_show_id_22428 ++__set_enter_print_fmt_22431 __set_enter_print_fmt 0 22431 NULL ++xenfb_check_var_22441 xenfb_check_var 0 22441 NULL ++rtl2832_sdr_start_streaming_22446 rtl2832_sdr_start_streaming 0 22446 NULL ++show_sas_phy_phy_identifier_22447 show_sas_phy_phy_identifier 0 22447 NULL ++ceph_write_iter_22449 ceph_write_iter 0 22449 NULL ++handle_received_packet_22457 handle_received_packet 3 22457 NULL ++write_fs_22465 write_fs 0-6-5 22465 NULL ++acpi_ut_copy_eobject_to_iobject_22466 acpi_ut_copy_eobject_to_iobject 0 22466 NULL ++batadv_check_unicast_packet_22468 batadv_check_unicast_packet 3 22468 NULL ++ieee80211_alloc_hw_nm_22469 ieee80211_alloc_hw_nm 1 22469 NULL ++__mv88e6352_phy_read_22471 __mv88e6352_phy_read 0 22471 NULL ++show_port1_22474 show_port1 0 22474 NULL ++ecryptfs_write_22488 ecryptfs_write 0-4-3 22488 NULL ++qib_user_sdma_alloc_header_22490 qib_user_sdma_alloc_header 2 22490 NULL nohasharray ++video_write_22490 video_write 3-0 22490 &qib_user_sdma_alloc_header_22490 ++cache_write_procfs_22491 cache_write_procfs 3-0 22491 NULL nohasharray ++lm3642_torch_pin_store_22491 lm3642_torch_pin_store 0-4 22491 &cache_write_procfs_22491 nohasharray ++rfcomm_send_test_22491 rfcomm_send_test 4 22491 &lm3642_torch_pin_store_22491 ++put_chars_22498 put_chars 3 22498 NULL ++mp_find_ioapic_pin_22499 mp_find_ioapic_pin 0-2 22499 NULL nohasharray ++edac_device_ctl_log_ue_store_22499 edac_device_ctl_log_ue_store 0-3 22499 &mp_find_ioapic_pin_22499 ++ad5398_read_reg_22504 ad5398_read_reg 0 22504 NULL ++mutex_lock_interruptible_22505 mutex_lock_interruptible 0 22505 NULL nohasharray ++asd_version_show_22505 asd_version_show 0 22505 &mutex_lock_interruptible_22505 ++fan_pwm1_store_22510 fan_pwm1_store 0-4 22510 NULL ++trim_no_bitmap_22524 trim_no_bitmap 4-3 22524 NULL ++attr_press_to_select_store_tpkbd_22525 attr_press_to_select_store_tpkbd 0-4 22525 NULL ++snd_cx23885_prepare_22528 snd_cx23885_prepare 0 22528 NULL ++read_ohm_22544 read_ohm 0 22544 NULL ++pskb_may_pull_22546 pskb_may_pull 2 22546 NULL ++adxl34x_position_show_22547 adxl34x_position_show 0 22547 NULL ++ntb_setup_bwd_msix_22549 ntb_setup_bwd_msix 2 22549 NULL ++ocfs2_read_extent_block_22550 ocfs2_read_extent_block 0 22550 NULL ++port_delete_22553 port_delete 0 22553 NULL ++agp_alloc_page_array_22554 agp_alloc_page_array 1 22554 NULL ++wq_numa_store_22563 wq_numa_store 0-4 22563 NULL ++w7090p_tuner_rw_serpar_22568 w7090p_tuner_rw_serpar 0-3 22568 NULL nohasharray ++aac_show_raid_level_22568 aac_show_raid_level 0 22568 &w7090p_tuner_rw_serpar_22568 ++get_regs_len_22569 get_regs_len 0 22569 NULL ++adt7411_set_bit_22579 adt7411_set_bit 0-4 22579 NULL ++mlx4_cmd_imm_22582 mlx4_cmd_imm 0 22582 NULL ++elan_sysfs_read_fw_ver_22586 elan_sysfs_read_fw_ver 0 22586 NULL nohasharray ++il3945_mac_start_22586 il3945_mac_start 0 22586 &elan_sysfs_read_fw_ver_22586 ++dbFindCtl_22587 dbFindCtl 0 22587 NULL ++wp384_final_22591 wp384_final 0 22591 NULL ++twl_sysfs_aen_read_22596 twl_sysfs_aen_read 6-0-5 22596 NULL ++da9052_read_ich_22600 da9052_read_ich 0 22600 NULL ++snapshot_read_22601 snapshot_read 3-0 22601 NULL nohasharray ++qla4_82xx_isp_reset_22601 qla4_82xx_isp_reset 0 22601 &snapshot_read_22601 ++shrink_show_22604 shrink_show 0 22604 NULL ++pci_dev_specific_reset_22605 pci_dev_specific_reset 0 22605 NULL ++__uncore_pld_show_22606 __uncore_pld_show 0 22606 NULL ++nat_receive_22609 nat_receive 0-3 22609 NULL ++il4965_hw_nic_init_22611 il4965_hw_nic_init 0 22611 NULL ++btrfs_delalloc_reserve_space_22617 btrfs_delalloc_reserve_space 0 22617 NULL ++bootflag_get_22618 bootflag_get 0 22618 NULL ++qlcnic_pci_sriov_disable_22622 qlcnic_pci_sriov_disable 0 22622 NULL ++_maybe_not_all_in_one_io_22626 _maybe_not_all_in_one_io 0 22626 NULL ++sctp_setsockopt_connectx_old_22631 sctp_setsockopt_connectx_old 0-3 22631 NULL ++v9fs_vfs_getattr_dotl_22632 v9fs_vfs_getattr_dotl 0 22632 NULL ++ide_core_cp_entry_22636 ide_core_cp_entry 3-0 22636 NULL ++wl1271_rx_filter_get_fields_size_22638 wl1271_rx_filter_get_fields_size 0 22638 NULL ++pwr_wake_on_timer_exp_read_22640 pwr_wake_on_timer_exp_read 3-0 22640 NULL nohasharray ++multicast_query_interval_show_22640 multicast_query_interval_show 0 22640 &pwr_wake_on_timer_exp_read_22640 nohasharray ++reiserfs_get_block_22640 reiserfs_get_block 0 22640 &multicast_query_interval_show_22640 ++rtl_op_sta_add_22642 rtl_op_sta_add 0 22642 NULL ++iwl_mvm_mac_ctxt_cmd_ibss_22646 iwl_mvm_mac_ctxt_cmd_ibss 0 22646 NULL ++snd_riptide_prepare_22648 snd_riptide_prepare 0 22648 NULL ++iwl_dbgfs_calib_disabled_read_22649 iwl_dbgfs_calib_disabled_read 3-0 22649 NULL ++ieee80211_probereq_get_22651 ieee80211_probereq_get 5-4 22651 NULL ++smsc911x_rx_get_rxstatus_22654 smsc911x_rx_get_rxstatus 0 22654 NULL ++snd_seq_queue_timer_set_tempo_22655 snd_seq_queue_timer_set_tempo 0 22655 NULL ++__iscsi_nacl_auth_store_userid_22656 __iscsi_nacl_auth_store_userid 0-3 22656 NULL ++mem_map_size_22660 mem_map_size 0 22660 NULL nohasharray ++tnc_insert_22660 tnc_insert 0 22660 &mem_map_size_22660 ++compat_SyS_msgrcv_22661 compat_SyS_msgrcv 3 22661 NULL ++br_stp_set_port_priority_22665 br_stp_set_port_priority 0 22665 NULL ++show_u8_22667 show_u8 0 22667 NULL ++call_netdevice_notifiers_22672 call_netdevice_notifiers 0 22672 NULL ++show_up_tail_align_22676 show_up_tail_align 0 22676 NULL nohasharray ++show_fcstat_fcp_packet_aborts_22676 show_fcstat_fcp_packet_aborts 0 22676 &show_up_tail_align_22676 ++ubifs_leb_write_22679 ubifs_leb_write 5-4-0 22679 NULL nohasharray ++tmiofb_set_par_22679 tmiofb_set_par 0 22679 &ubifs_leb_write_22679 ++qlcnic_83xx_sysfs_flash_write_handler_22680 qlcnic_83xx_sysfs_flash_write_handler 6-0-5 22680 NULL nohasharray ++d_revalidate_22680 d_revalidate 0 22680 &qlcnic_83xx_sysfs_flash_write_handler_22680 ++l2tp_ip_recvmsg_22681 l2tp_ip_recvmsg 0-4 22681 NULL ++iscsit_na_default_erl_22682 iscsit_na_default_erl 0 22682 NULL ++bch_dump_read_22685 bch_dump_read 3-0 22685 NULL ++reg_umr_22686 reg_umr 5 22686 NULL ++sys_ppoll_22688 sys_ppoll 2 22688 NULL nohasharray ++show_hdmi_source_22688 show_hdmi_source 0 22688 &sys_ppoll_22688 ++bmc150_accel_data_rdy_trigger_set_state_22689 bmc150_accel_data_rdy_trigger_set_state 0 22689 NULL ++mxl111sf_read_reg_22690 mxl111sf_read_reg 0 22690 NULL ++SYSC_vmsplice_22697 SYSC_vmsplice 3 22697 NULL ++vnic_dev_notify_setcmd_22700 vnic_dev_notify_setcmd 0 22700 NULL ++show_conn_param_ISCSI_PARAM_KEEPALIVE_TMO_22701 show_conn_param_ISCSI_PARAM_KEEPALIVE_TMO 0 22701 NULL ++ov7670_read_smbus_22702 ov7670_read_smbus 0 22702 NULL ++ecm_opts_host_addr_store_22705 ecm_opts_host_addr_store 0-3 22705 NULL nohasharray ++tomoyo_check_inet_address_22705 tomoyo_check_inet_address 0 22705 &ecm_opts_host_addr_store_22705 ++alloc_libipw_22708 alloc_libipw 1 22708 NULL ++show_iface_enabled_22711 show_iface_enabled 0 22711 NULL ++read_iter_zero_22715 read_iter_zero 0 22715 NULL ++m2p_remove_override_22717 m2p_remove_override 3 22717 NULL ++qlcnic_83xx_lockless_flash_read32_22721 qlcnic_83xx_lockless_flash_read32 0 22721 NULL nohasharray ++ecryptfs_write_metadata_to_contents_22721 ecryptfs_write_metadata_to_contents 3 22721 &qlcnic_83xx_lockless_flash_read32_22721 ++mxuport_send_ctrl_urb_22723 mxuport_send_ctrl_urb 0 22723 NULL ++channel_dimm_label_show_22728 channel_dimm_label_show 0 22728 NULL nohasharray ++acpi_ex_get_name_string_22728 acpi_ex_get_name_string 0 22728 &channel_dimm_label_show_22728 ++filename_trans_read_22730 filename_trans_read 0 22730 NULL ++cx18_copy_buf_to_user_22735 cx18_copy_buf_to_user 4-0 22735 NULL nohasharray ++show_filter_22735 show_filter 0 22735 &cx18_copy_buf_to_user_22735 nohasharray ++__mlx4_cq_alloc_icm_22735 __mlx4_cq_alloc_icm 0 22735 &show_filter_22735 ++ax25_output_22736 ax25_output 2 22736 NULL ++ceph_decode_32_22738 ceph_decode_32 0 22738 NULL nohasharray ++__mei_cl_send_22738 __mei_cl_send 3 22738 &ceph_decode_32_22738 ++__writeback_single_inode_22739 __writeback_single_inode 0 22739 NULL ++iio_debugfs_write_reg_22742 iio_debugfs_write_reg 3-0 22742 NULL ++show_fnode_password_in_22752 show_fnode_password_in 0 22752 NULL nohasharray ++fore200e_proc_read_22752 fore200e_proc_read 0 22752 &show_fnode_password_in_22752 nohasharray ++loctls_read_file_22752 loctls_read_file 0 22752 &fore200e_proc_read_22752 ++output_write_22753 output_write 0-6-5 22753 NULL ++sky2_alloc_buffers_22754 sky2_alloc_buffers 0 22754 NULL nohasharray ++iosf_mbi_pci_read_mdr_22754 iosf_mbi_pci_read_mdr 0 22754 &sky2_alloc_buffers_22754 ++eth_header_22760 eth_header 0 22760 NULL ++qlcnic_sriov_init_22762 qlcnic_sriov_init 2-0 22762 NULL ++tw28_set_ctrl_val_22763 tw28_set_ctrl_val 0 22763 NULL ++si4713_write_property_22765 si4713_write_property 0 22765 NULL ++hdmi_g_mbus_fmt_22768 hdmi_g_mbus_fmt 0 22768 NULL nohasharray ++nilfs_mdt_submit_block_22768 nilfs_mdt_submit_block 0 22768 &hdmi_g_mbus_fmt_22768 ++print_frame_22769 print_frame 0 22769 NULL ++show_in_max3_22770 show_in_max3 0 22770 NULL ++elan_smbus_prepare_fw_update_22771 elan_smbus_prepare_fw_update 0 22771 NULL ++ftrace_arch_read_dyn_info_22773 ftrace_arch_read_dyn_info 0 22773 NULL ++compat_SyS_io_getevents_22774 compat_SyS_io_getevents 3 22774 NULL ++ath9k_add_interface_22776 ath9k_add_interface 0 22776 NULL nohasharray ++tg3_setup_fiber_mii_phy_22776 tg3_setup_fiber_mii_phy 0 22776 &ath9k_add_interface_22776 ++__break_lease_22777 __break_lease 0 22777 NULL ++alloc_calls_show_22782 alloc_calls_show 0 22782 NULL ++show_fc_fc4s_22784 show_fc_fc4s 0 22784 NULL ++preenable_22790 preenable 0 22790 NULL ++vnic_dev_get_res_count_22791 vnic_dev_get_res_count 0 22791 NULL ++page_counter_limit_22795 page_counter_limit 0 22795 NULL ++rocker_dma_test_offset_22796 rocker_dma_test_offset 3 22796 NULL ++pla_ocp_write_22802 pla_ocp_write 4 22802 NULL ++__generic_copy_to_user_intel_22806 __generic_copy_to_user_intel 0 22806 NULL ++btrfs_getxattr_22809 btrfs_getxattr 0 22809 NULL ++efs_symlink_readpage_22812 efs_symlink_readpage 0 22812 NULL nohasharray ++rx8025_set_alarm_22812 rx8025_set_alarm 0 22812 &efs_symlink_readpage_22812 ++bnx2_get_regs_len_22813 bnx2_get_regs_len 0 22813 NULL ++comm_addr_list_read_22819 comm_addr_list_read 0 22819 NULL ++init_after_reset_22823 init_after_reset 0 22823 NULL ++show_fbstate_22824 show_fbstate 0 22824 NULL ++ghash_init_22826 ghash_init 0 22826 NULL ++max8998_ldo_is_enabled_22833 max8998_ldo_is_enabled 0 22833 NULL ++afs_permission_22835 afs_permission 0 22835 NULL ++mb862xxfb_show_dispregs_22838 mb862xxfb_show_dispregs 0 22838 NULL ++__scm_send_22841 __scm_send 0 22841 NULL ++data_ep_set_params_22843 data_ep_set_params 0 22843 NULL ++iscsi_tpg_attrib_store_demo_mode_write_protect_22844 iscsi_tpg_attrib_store_demo_mode_write_protect 0-3 22844 NULL ++atxp1_storevcore_22847 atxp1_storevcore 0-4 22847 NULL ++ext4_reserve_clusters_22850 ext4_reserve_clusters 0 22850 NULL ++show_local_ip_22854 show_local_ip 0 22854 NULL nohasharray ++__smsc95xx_read_reg_22854 __smsc95xx_read_reg 0 22854 &show_local_ip_22854 ++bluetooth_enable_store_22857 bluetooth_enable_store 0-4 22857 NULL ++asd_reset_flash_22858 asd_reset_flash 0 22858 NULL ++atmel_resume_22860 atmel_resume 0 22860 NULL ++create_attr_set_22861 create_attr_set 1 22861 NULL ++nr_hugepages_show_22864 nr_hugepages_show 0 22864 NULL ++hash_ip6_expire_22867 hash_ip6_expire 4 22867 NULL ++ntfs_setattr_22871 ntfs_setattr 0 22871 NULL ++vmxnet3_request_irqs_22878 vmxnet3_request_irqs 0 22878 NULL ++smb_set_file_info_22880 smb_set_file_info 0 22880 NULL ++pxa_ep_enable_22883 pxa_ep_enable 0 22883 NULL ++vmw_execbuf_process_22885 vmw_execbuf_process 5 22885 NULL nohasharray ++show_counter_tx_flow_stalls_22885 show_counter_tx_flow_stalls 0 22885 &vmw_execbuf_process_22885 ++set_phy_speed_22886 set_phy_speed 0 22886 NULL ++show_green_22889 show_green 0 22889 NULL ++v9fs_direct_write_22891 v9fs_direct_write 0-3 22891 NULL ++usblp_new_writeurb_22894 usblp_new_writeurb 2 22894 NULL nohasharray ++cifs_file_write_iter_22894 cifs_file_write_iter 0 22894 &usblp_new_writeurb_22894 ++mdc800_device_read_22896 mdc800_device_read 3-0 22896 NULL nohasharray ++store_test_22896 store_test 0-4 22896 &mdc800_device_read_22896 ++_xadc_write_adc_reg_22899 _xadc_write_adc_reg 0 22899 NULL ++policy_emit_config_values_22900 policy_emit_config_values 3 22900 NULL nohasharray ++ion_handle_test_kernel_22900 ion_handle_test_kernel 3-4 22900 &policy_emit_config_values_22900 ++bdc_issue_cmd_22903 bdc_issue_cmd 0 22903 NULL nohasharray ++bmg160_validate_trigger_22903 bmg160_validate_trigger 0 22903 &bdc_issue_cmd_22903 ++bnx2i_show_ccell_info_22908 bnx2i_show_ccell_info 0 22908 NULL ++ip_vs_forward_icmp_v6_22912 ip_vs_forward_icmp_v6 0 22912 NULL ++nfs4_acl_bytes_22915 nfs4_acl_bytes 0-1 22915 NULL ++gadget_info_attr_store_22919 gadget_info_attr_store 0-4 22919 NULL ++br_vlan_add_22922 br_vlan_add 0 22922 NULL nohasharray ++mwl8k_cmd_get_hw_spec_sta_22922 mwl8k_cmd_get_hw_spec_sta 0 22922 &br_vlan_add_22922 ++__set_xattr_22923 __set_xattr 0 22923 NULL ++sg_start_req_22924 sg_start_req 0 22924 NULL ++qce_mapsg_22925 qce_mapsg 3 22925 NULL ++xstateregs_set_22932 xstateregs_set 4 22932 NULL ++dlm_status_to_errno_22935 dlm_status_to_errno 0 22935 NULL nohasharray ++uwb_rc_set_ie_22935 uwb_rc_set_ie 0 22935 &dlm_status_to_errno_22935 ++__iscsi_nacl_auth_show_userid_22936 __iscsi_nacl_auth_show_userid 0 22936 NULL nohasharray ++i40e_fcoe_change_mtu_22936 i40e_fcoe_change_mtu 0 22936 &__iscsi_nacl_auth_show_userid_22936 ++max8925_write_device_22937 max8925_write_device 3-0 22937 NULL nohasharray ++show_alert_led_22937 show_alert_led 0 22937 &max8925_write_device_22937 ++wil_rx_refill_22940 wil_rx_refill 0 22940 NULL ++nfs4_get_security_label_22946 nfs4_get_security_label 0 22946 NULL ++pcpu_mem_zalloc_22948 pcpu_mem_zalloc 1 22948 NULL ++i2c_bit_xfer_22953 i2c_bit_xfer 0-3 22953 NULL ++r_heartbeat_file_write_22954 r_heartbeat_file_write 0-3 22954 NULL nohasharray ++__bch_cache_store_22954 __bch_cache_store 0-4 22954 &r_heartbeat_file_write_22954 ++logfs_segment_write_compress_22957 logfs_segment_write_compress 0 22957 NULL ++alloc_sglist_22960 alloc_sglist 1-3-2 22960 NULL ++caif_seqpkt_sendmsg_22961 caif_seqpkt_sendmsg 4-0 22961 NULL ++vme_get_size_22964 vme_get_size 0 22964 NULL ++__sync_blockdev_22967 __sync_blockdev 0 22967 NULL nohasharray ++store_sf2_temp_22967 store_sf2_temp 0-4 22967 &__sync_blockdev_22967 ++pwm_enable_from_reg_22969 pwm_enable_from_reg 0 22969 NULL ++tx_frag_key_not_found_read_22971 tx_frag_key_not_found_read 3-0 22971 NULL ++snd_ice1712_playback_ds_prepare_22973 snd_ice1712_playback_ds_prepare 0 22973 NULL nohasharray ++rbd_dev_v2_object_prefix_22973 rbd_dev_v2_object_prefix 0 22973 &snd_ice1712_playback_ds_prepare_22973 ++cached_dev_cache_miss_22979 cached_dev_cache_miss 4 22979 NULL nohasharray ++subscribe_port_22979 subscribe_port 0 22979 &cached_dev_cache_miss_22979 ++usb_get_langid_22983 usb_get_langid 0 22983 NULL ++open_22984 open 0 22984 NULL ++ceph_vxattrcb_dir_rctime_22987 ceph_vxattrcb_dir_rctime 0 22987 NULL nohasharray ++remote_settings_file_write_22987 remote_settings_file_write 3-0 22987 &ceph_vxattrcb_dir_rctime_22987 nohasharray ++snd_cs46xx_capture_prepare_22987 snd_cs46xx_capture_prepare 0 22987 &remote_settings_file_write_22987 ++find_root_sec_22988 find_root_sec 0 22988 NULL ++tsf_write_file_22990 tsf_write_file 0 22990 NULL ++bdi_set_min_ratio_22993 bdi_set_min_ratio 0 22993 NULL ++show_pwm_temp_sel_common_22994 show_pwm_temp_sel_common 0 22994 NULL nohasharray ++iwl_mvm_rm_sta_common_22994 iwl_mvm_rm_sta_common 0 22994 &show_pwm_temp_sel_common_22994 ++nouveau_hwmon_show_temp1_auto_point1_pwm_22996 nouveau_hwmon_show_temp1_auto_point1_pwm 0 22996 NULL ++pcan_usb_pro_set_silent_23000 pcan_usb_pro_set_silent 0 23000 NULL ++ubifs_find_free_leb_for_idx_23003 ubifs_find_free_leb_for_idx 0 23003 NULL ++tw68_start_streaming_23004 tw68_start_streaming 0 23004 NULL ++dig_playback_pcm_prepare_23006 dig_playback_pcm_prepare 0 23006 NULL ++iwl_trans_start_fw_23009 iwl_trans_start_fw 0 23009 NULL ++wsm_configuration_23013 wsm_configuration 0 23013 NULL ++amb_proc_read_23014 amb_proc_read 0 23014 NULL ++data_sock_bind_23015 data_sock_bind 0 23015 NULL ++set_crit_hyst_23017 set_crit_hyst 0-4 23017 NULL ++_nfs4_proc_secinfo_23019 _nfs4_proc_secinfo 0 23019 NULL ++validate_esw_config_23021 validate_esw_config 0 23021 NULL ++nilfs_bmap_prepare_end_ptr_23022 nilfs_bmap_prepare_end_ptr 0 23022 NULL ++viafb_dvp0_proc_write_23023 viafb_dvp0_proc_write 3-0 23023 NULL ++cifs_local_to_utf16_bytes_23025 cifs_local_to_utf16_bytes 0 23025 NULL nohasharray ++i7core_inject_store_bank_23025 i7core_inject_store_bank 0-4 23025 &cifs_local_to_utf16_bytes_23025 ++adm8211_start_23027 adm8211_start 0 23027 NULL ++st_status_23032 st_status 5-0 23032 NULL ++gether_opts_qmult_show_23034 gether_opts_qmult_show 0 23034 NULL ++snd_usb_substream_playback_trigger_23036 snd_usb_substream_playback_trigger 0 23036 NULL nohasharray ++iscsi_stat_tgt_attr_attr_store_23036 iscsi_stat_tgt_attr_attr_store 0 23036 &snd_usb_substream_playback_trigger_23036 nohasharray ++_efx_mcdi_rpc_23036 _efx_mcdi_rpc 0 23036 &iscsi_stat_tgt_attr_attr_store_23036 ++omfs_write_inode_23038 omfs_write_inode 0 23038 NULL ++advansys_eisa_probe_23039 advansys_eisa_probe 0 23039 NULL ++da9055_adc_manual_read_23042 da9055_adc_manual_read 0 23042 NULL ++padlock_sha_init_23044 padlock_sha_init 0 23044 NULL ++wMaxPacketSize_show_23053 wMaxPacketSize_show 0 23053 NULL ++nv50_disp_chan_create__23056 nv50_disp_chan_create_ 5 23056 NULL ++__padata_set_cpumasks_23058 __padata_set_cpumasks 0 23058 NULL ++security_inode_killpriv_23060 security_inode_killpriv 0 23060 NULL nohasharray ++bdx_set_mac_23060 bdx_set_mac 0 23060 &security_inode_killpriv_23060 ++unix_seqpacket_recvmsg_23062 unix_seqpacket_recvmsg 0-4 23062 NULL nohasharray ++reiserfs_add_entry_23062 reiserfs_add_entry 4 23062 &unix_seqpacket_recvmsg_23062 ++atl1c_set_mac_addr_23066 atl1c_set_mac_addr 0 23066 NULL ++mei_cl_send_23068 mei_cl_send 3 23068 NULL ++walk_system_ram_range_23073 walk_system_ram_range 0 23073 NULL ++vm_map_ram_23078 vm_map_ram 2 23078 NULL nohasharray ++raw_sendmsg_23078 raw_sendmsg 4-0 23078 &vm_map_ram_23078 nohasharray ++xfs_dbg_show_23078 xfs_dbg_show 0 23078 &raw_sendmsg_23078 ++lp8788_show_charger_status_23079 lp8788_show_charger_status 0 23079 NULL ++qla4_82xx_pci_mem_read_2M_23081 qla4_82xx_pci_mem_read_2M 2 23081 NULL ++init_23083 init 0 23083 NULL ++isr_tx_procs_read_23084 isr_tx_procs_read 3-0 23084 NULL nohasharray ++btrfs_sectorsize_show_23084 btrfs_sectorsize_show 0 23084 &isr_tx_procs_read_23084 nohasharray ++update_uc_addr_23084 update_uc_addr 0 23084 &btrfs_sectorsize_show_23084 ++stmmac_ethtool_get_regs_len_23089 stmmac_ethtool_get_regs_len 0 23089 NULL ++libfcoe_device_notification_23090 libfcoe_device_notification 0 23090 NULL ++rt2x00debug_write_eeprom_23091 rt2x00debug_write_eeprom 3-0 23091 NULL ++fls_long_23096 fls_long 0 23096 NULL nohasharray ++show_simple_pwm_23096 show_simple_pwm 0 23096 &fls_long_23096 ++ntfs_ucstonls_23097 ntfs_ucstonls 3-5 23097 NULL nohasharray ++st_press_buffer_preenable_23097 st_press_buffer_preenable 0 23097 &ntfs_ucstonls_23097 ++vfio_pci_vga_rw_23098 vfio_pci_vga_rw 0-3 23098 NULL ++airo_set_mac_address_23102 airo_set_mac_address 0 23102 NULL nohasharray ++store_user_store_23102 store_user_store 0-3 23102 &airo_set_mac_address_23102 ++da903x_read_23103 da903x_read 0 23103 NULL ++radeon_show_edid2_23104 radeon_show_edid2 6-0-5 23104 NULL nohasharray ++dgram_recvmsg_23104 dgram_recvmsg 0-4 23104 &radeon_show_edid2_23104 ++kernfs_rename_ns_23106 kernfs_rename_ns 0 23106 NULL ++rawsock_create_23108 rawsock_create 0 23108 NULL ++product_id_store_23109 product_id_store 0-4 23109 NULL ++mwl8k_cmd_set_beacon_23110 mwl8k_cmd_set_beacon 4 23110 NULL ++bset_tree_bytes_23111 bset_tree_bytes 0 23111 NULL ++smm665_show_crit_23114 smm665_show_crit 0 23114 NULL ++__clear_user_23118 __clear_user 0 23118 NULL ++w1_master_attribute_show_remove_23119 w1_master_attribute_show_remove 0 23119 NULL nohasharray ++global_rsv_size_show_23119 global_rsv_size_show 0 23119 &w1_master_attribute_show_remove_23119 ++guard_show_23120 guard_show 0 23120 NULL nohasharray ++dm_write_async_23120 dm_write_async 3 23120 &guard_show_23120 ++id_show_23121 id_show 0 23121 NULL ++drm_mode_create_tv_properties_23122 drm_mode_create_tv_properties 2 23122 NULL ++vx_pcm_prepare_23123 vx_pcm_prepare 0 23123 NULL ++vsc824x_add_skew_23126 vsc824x_add_skew 0 23126 NULL ++do_generic_request_23130 do_generic_request 0 23130 NULL ++fib_inetaddr_event_23134 fib_inetaddr_event 0 23134 NULL ++ext3_listxattr_23137 ext3_listxattr 0-3 23137 NULL ++em28xx_write_regs_req_23138 em28xx_write_regs_req 0 23138 NULL ++i801_check_pre_23143 i801_check_pre 0 23143 NULL ++atl1e_set_mac_addr_23145 atl1e_set_mac_addr 0 23145 NULL ++ca91cx42_master_set_23146 ca91cx42_master_set 4 23146 NULL ++asus_hwmon_temp1_23150 asus_hwmon_temp1 0 23150 NULL ++parse_tunables_write_23152 parse_tunables_write 0 23152 NULL ++handle_event_23156 handle_event 0 23156 NULL ++wm831x_set_bits_23158 wm831x_set_bits 0 23158 NULL ++read_file_ani_23161 read_file_ani 3-0 23161 NULL ++acpi_device_sun_show_23166 acpi_device_sun_show 0 23166 NULL ++video_begin_23167 video_begin 0 23167 NULL ++target_core_dev_wwn_show_attr_vpd_assoc_scsi_target_device_23174 target_core_dev_wwn_show_attr_vpd_assoc_scsi_target_device 0 23174 NULL ++show_fan_auto1_23176 show_fan_auto1 0 23176 NULL nohasharray ++iwl_trans_pcie_start_hw_23176 iwl_trans_pcie_start_hw 0 23176 &show_fan_auto1_23176 ++atkbd_do_set_softrepeat_23177 atkbd_do_set_softrepeat 0-4 23177 NULL ++usblp_write_23178 usblp_write 3-0 23178 NULL nohasharray ++withdraw_show_23178 withdraw_show 0 23178 &usblp_write_23178 ++msnd_fifo_alloc_23179 msnd_fifo_alloc 2 23179 NULL ++gss_pipe_downcall_23182 gss_pipe_downcall 3-0 23182 NULL ++ca0132_capture_pcm_prepare_23183 ca0132_capture_pcm_prepare 0 23183 NULL nohasharray ++ieee80211_get_mesh_hdrlen_23183 ieee80211_get_mesh_hdrlen 0 23183 &ca0132_capture_pcm_prepare_23183 ++fix_unclean_leb_23188 fix_unclean_leb 3 23188 NULL nohasharray ++comm_nodeid_read_23188 comm_nodeid_read 0 23188 &fix_unclean_leb_23188 ++mpi_alloc_limb_space_23190 mpi_alloc_limb_space 1 23190 NULL ++saa7706h_s_ctrl_23192 saa7706h_s_ctrl 0 23192 NULL ++__audit_sockaddr_23194 __audit_sockaddr 0 23194 NULL ++max16065_show_input_23199 max16065_show_input 0 23199 NULL nohasharray ++show_ipv6_iface_router_adv_link_mtu_23199 show_ipv6_iface_router_adv_link_mtu 0 23199 &max16065_show_input_23199 ++evm_inode_removexattr_23201 evm_inode_removexattr 0 23201 NULL ++dvb_pll_set_params_23207 dvb_pll_set_params 0 23207 NULL ++pm80x_free_irq_23210 pm80x_free_irq 2 23210 NULL nohasharray ++rbd_major_show_23210 rbd_major_show 0 23210 &pm80x_free_irq_23210 nohasharray ++of_irq_get_byname_23210 of_irq_get_byname 0 23210 &rbd_major_show_23210 ++sequencer_read_23213 sequencer_read 0-4 23213 NULL nohasharray ++visor_memregion_get_physaddr_23213 visor_memregion_get_physaddr 0 23213 &sequencer_read_23213 ++tipc_sendmcast_23214 tipc_sendmcast 4-0 23214 NULL nohasharray ++get_in_input_23214 get_in_input 0 23214 &tipc_sendmcast_23214 ++ov6650_reg_rmw_23219 ov6650_reg_rmw 0 23219 NULL ++mcryptd_alloc_instance_23221 mcryptd_alloc_instance 3-2 23221 NULL ++mac80211_hwsim_add_interface_23223 mac80211_hwsim_add_interface 0 23223 NULL nohasharray ++set_a_bus_req_23223 set_a_bus_req 0-4 23223 &mac80211_hwsim_add_interface_23223 ++tty_buffer_request_room_23228 tty_buffer_request_room 2-0 23228 NULL nohasharray ++wm8350_isink_is_enabled_23228 wm8350_isink_is_enabled 0 23228 &tty_buffer_request_room_23228 ++xlog_get_bp_23229 xlog_get_bp 2 23229 NULL nohasharray ++__read_status_pci_23229 __read_status_pci 0 23229 &xlog_get_bp_23229 ++__kmalloc_23231 __kmalloc 1 23231 NULL ++mac802154_set_params_23235 mac802154_set_params 0 23235 NULL ++rxrpc_client_sendmsg_23236 rxrpc_client_sendmsg 5 23236 NULL ++mwl8k_cmd_set_rateadapt_mode_23239 mwl8k_cmd_set_rateadapt_mode 0 23239 NULL ++show_attr_mode_msb_23240 show_attr_mode_msb 0 23240 NULL ++nv50_ram_create__23241 nv50_ram_create_ 4 23241 NULL nohasharray ++show_ucode_version_23241 show_ucode_version 0 23241 &nv50_ram_create__23241 nohasharray ++queue_max_sectors_show_23241 queue_max_sectors_show 0 23241 &show_ucode_version_23241 ++ahci_activity_show_23244 ahci_activity_show 0 23244 NULL ++mac80211_hwsim_sta_add_23246 mac80211_hwsim_sta_add 0 23246 NULL ++b43legacy_wireless_core_attach_23259 b43legacy_wireless_core_attach 0 23259 NULL ++f_eem_opts_attr_show_23263 f_eem_opts_attr_show 0 23263 NULL ++sctp_recvmsg_23265 sctp_recvmsg 0-4 23265 NULL nohasharray ++intel_map_sg_23265 intel_map_sg 0-3 23265 &sctp_recvmsg_23265 ++alg_bind_23268 alg_bind 0 23268 NULL ++lan87xx_read_status_23278 lan87xx_read_status 0 23278 NULL ++uwb_dev_addr_print_23282 uwb_dev_addr_print 2 23282 NULL ++snd_compress_dev_register_23283 snd_compress_dev_register 0 23283 NULL nohasharray ++venus_readlink_23283 venus_readlink 0 23283 &snd_compress_dev_register_23283 nohasharray ++ipv6_skip_exthdr_23283 ipv6_skip_exthdr 0-2 23283 &venus_readlink_23283 ++ec_i2c_count_message_23285 ec_i2c_count_message 0-2 23285 NULL nohasharray ++doc_probe_23285 doc_probe 1 23285 &ec_i2c_count_message_23285 ++diva_get_trace_filter_23286 diva_get_trace_filter 0 23286 NULL ++queue_show_nonrot_23293 queue_show_nonrot 0 23293 NULL nohasharray ++process_adv_report_23293 process_adv_report 9 23293 &queue_show_nonrot_23293 ++beacon_timeout_ms_show_23294 beacon_timeout_ms_show 0 23294 NULL ++cx18_s_stream_vbi_fmt_23295 cx18_s_stream_vbi_fmt 0 23295 NULL ++acpi_ds_create_field_23300 acpi_ds_create_field 0 23300 NULL nohasharray ++cpu5wdt_write_23300 cpu5wdt_write 0-3 23300 &acpi_ds_create_field_23300 ++mac802154_wpan_open_23301 mac802154_wpan_open 0 23301 NULL ++b43_upload_initvals_band_23304 b43_upload_initvals_band 0 23304 NULL ++i2cdev_write_23310 i2cdev_write 3-0 23310 NULL ++ns_send_23311 ns_send 0 23311 NULL ++it8761e_gpio_direction_in_23313 it8761e_gpio_direction_in 0 23313 NULL ++parport_uss720_epp_read_data_23314 parport_uss720_epp_read_data 0 23314 NULL nohasharray ++hif_usb_send_regout_23314 hif_usb_send_regout 0 23314 &parport_uss720_epp_read_data_23314 ++acpi_table_show_23317 acpi_table_show 6 23317 NULL ++__aa_kvmalloc_23320 __aa_kvmalloc 1 23320 NULL ++show_spread_enabled_23321 show_spread_enabled 0 23321 NULL nohasharray ++iscsi_tpg_param_show_DataSequenceInOrder_23321 iscsi_tpg_param_show_DataSequenceInOrder 0 23321 &show_spread_enabled_23321 ++poll_oip_23322 poll_oip 0 23322 NULL ++config_led_23323 config_led 0 23323 NULL ++batadv_bla_init_23324 batadv_bla_init 0 23324 NULL ++run_gc_23325 run_gc 0 23325 NULL ++lpfc_devloss_tmo_show_23341 lpfc_devloss_tmo_show 0 23341 NULL ++mc13xxx_get_num_regulators_dt_23344 mc13xxx_get_num_regulators_dt 0 23344 NULL ++page_readlink_23346 page_readlink 3 23346 NULL ++prepare_23350 prepare 0 23350 NULL nohasharray ++usbnet_status_start_23350 usbnet_status_start 0 23350 &prepare_23350 nohasharray ++mxt_t6_command_23350 mxt_t6_command 0 23350 &usbnet_status_start_23350 ++kmem_zalloc_large_23351 kmem_zalloc_large 1 23351 NULL ++get_dst_timing_23358 get_dst_timing 0 23358 NULL nohasharray ++write_inode_23358 write_inode 0 23358 &get_dst_timing_23358 ++generic_key_instantiate_23363 generic_key_instantiate 0 23363 NULL nohasharray ++vmxnet3_get_sset_count_23363 vmxnet3_get_sset_count 0 23363 &generic_key_instantiate_23363 ++regulator_is_enabled_regmap_23365 regulator_is_enabled_regmap 0 23365 NULL ++fscache_fsdef_netfs_get_key_23368 fscache_fsdef_netfs_get_key 0 23368 NULL ++fd_setup_write_same_buf_23369 fd_setup_write_same_buf 3 23369 NULL ++bonding_sysfs_store_option_23382 bonding_sysfs_store_option 0-4 23382 NULL ++fc0011_writereg_23383 fc0011_writereg 0 23383 NULL ++of_parse_phandle_with_args_23389 of_parse_phandle_with_args 0 23389 NULL ++kobil_write_23392 kobil_write 0-4 23392 NULL ++jffs2_listxattr_23402 jffs2_listxattr 0-3 23402 NULL nohasharray ++s_ctrl_23402 s_ctrl 0 23402 &jffs2_listxattr_23402 ++uhci_submit_interrupt_23408 uhci_submit_interrupt 0 23408 NULL nohasharray ++mx2_videobuf_prepare_23408 mx2_videobuf_prepare 0 23408 &uhci_submit_interrupt_23408 ++bond_option_num_peer_notif_set_23409 bond_option_num_peer_notif_set 0 23409 NULL ++goku_queue_23412 goku_queue 0 23412 NULL ++snd_hda_multi_out_dig_prepare_23415 snd_hda_multi_out_dig_prepare 0 23415 NULL ++passive_show_23418 passive_show 0 23418 NULL ++mwifiex_cmd_802_11_key_material_v1_23421 mwifiex_cmd_802_11_key_material_v1 0 23421 NULL ++lpfc_prot_sg_seg_cnt_show_23423 lpfc_prot_sg_seg_cnt_show 0 23423 NULL ++vzalloc_node_23424 vzalloc_node 1 23424 NULL ++lp3972_set_bits_23425 lp3972_set_bits 0 23425 NULL nohasharray ++store_line3_23425 store_line3 0-4 23425 &lp3972_set_bits_23425 ++gpiod_export_23427 gpiod_export 0 23427 NULL ++amd_gpio_dirin_23433 amd_gpio_dirin 0 23433 NULL ++avtab_alloc_23436 avtab_alloc 0 23436 NULL ++mv88e6xxx_get_regs_len_23441 mv88e6xxx_get_regs_len 0 23441 NULL ++wil_target_reset_23443 wil_target_reset 0 23443 NULL ++_ctl_logging_level_store_23445 _ctl_logging_level_store 0-4 23445 NULL ++bInterfaceClass_show_23446 bInterfaceClass_show 0 23446 NULL ++rds_tcp_sendmsg_23447 rds_tcp_sendmsg 3 23447 NULL ++hidraw_send_report_23449 hidraw_send_report 3-0 23449 NULL ++mt9t112_auto_focus_trigger_23450 mt9t112_auto_focus_trigger 0 23450 NULL ++target_core_alua_tg_pt_gp_show_attr_alua_access_type_23452 target_core_alua_tg_pt_gp_show_attr_alua_access_type 0 23452 NULL ++napi_add_23455 napi_add 0 23455 NULL nohasharray ++store_23455 store 0 23455 &napi_add_23455 ++sb_statfs_23456 sb_statfs 0 23456 NULL ++show_ipv4_iface_dhcp_learn_iqn_en_23462 show_ipv4_iface_dhcp_learn_iqn_en 0 23462 NULL ++host_show_resettable_23464 host_show_resettable 0 23464 NULL ++jffs2_trusted_getxattr_23469 jffs2_trusted_getxattr 0 23469 NULL ++res_get_23470 res_get 0 23470 NULL ++ip6table_nat_fn_23482 ip6table_nat_fn 0 23482 NULL ++dpm_prepare_23484 dpm_prepare 0 23484 NULL ++divasa_remap_pci_bar_23485 divasa_remap_pci_bar 3-4 23485 NULL nohasharray ++linear_conf_23485 linear_conf 2 23485 &divasa_remap_pci_bar_23485 nohasharray ++sync_mapping_buffers_23485 sync_mapping_buffers 0 23485 &linear_conf_23485 ++compat_filldir_23489 compat_filldir 3 23489 NULL ++copy_module_from_user_23492 copy_module_from_user 2 23492 NULL ++si4713_send_command_23493 si4713_send_command 4-6-0 23493 NULL ++event_filter_read_23494 event_filter_read 3 23494 NULL ++lustre_acl_xattr_merge2ext_23502 lustre_acl_xattr_merge2ext 2 23502 NULL ++ax88179_reset_23503 ax88179_reset 0 23503 NULL ++bh1770_prox_abs_thres_store_23505 bh1770_prox_abs_thres_store 0-4 23505 NULL ++physical_package_id_show_23509 physical_package_id_show 0 23509 NULL ++saa7706h_unmute_23510 saa7706h_unmute 0 23510 NULL nohasharray ++hpfs_writepages_23510 hpfs_writepages 0 23510 &saa7706h_unmute_23510 ++devm_iio_device_alloc_23511 devm_iio_device_alloc 2 23511 NULL ++pm_generic_prepare_23512 pm_generic_prepare 0 23512 NULL ++show_fcstat_invalid_crc_count_23516 show_fcstat_invalid_crc_count 0 23516 NULL nohasharray ++ad_sd_write_reg_23516 ad_sd_write_reg 0 23516 &show_fcstat_invalid_crc_count_23516 nohasharray ++__proc_cpt_table_23516 __proc_cpt_table 5 23516 &ad_sd_write_reg_23516 ++hash_ipmark6_expire_23518 hash_ipmark6_expire 4 23518 NULL ++iwl_pcie_send_hcmd_sync_23522 iwl_pcie_send_hcmd_sync 0 23522 NULL ++cxacru_sysfs_show_upstream_crc_errors_23523 cxacru_sysfs_show_upstream_crc_errors 0 23523 NULL ++get_component_active_23527 get_component_active 0 23527 NULL ++target_core_dev_wwn_show_attr_vpd_protocol_identifier_23531 target_core_dev_wwn_show_attr_vpd_protocol_identifier 0 23531 NULL ++ima_show_measurements_count_23536 ima_show_measurements_count 3-0 23536 NULL nohasharray ++sky2_device_event_23536 sky2_device_event 0 23536 &ima_show_measurements_count_23536 ++get_usb_charge_23541 get_usb_charge 0 23541 NULL nohasharray ++adp5520_bl_office_dim_store_23541 adp5520_bl_office_dim_store 4-0 23541 &get_usb_charge_23541 ++st_press_trig_set_state_23544 st_press_trig_set_state 0 23544 NULL ++xen_allocate_irq_gsi_23546 xen_allocate_irq_gsi 1 23546 NULL nohasharray ++cxacru_sysfs_showattr_u32_23546 cxacru_sysfs_showattr_u32 0 23546 &xen_allocate_irq_gsi_23546 nohasharray ++isl29125_buffer_preenable_23546 isl29125_buffer_preenable 0 23546 &cxacru_sysfs_showattr_u32_23546 ++tcp_current_mss_23552 tcp_current_mss 0 23552 NULL ++dbg_leb_change_23555 dbg_leb_change 4-0 23555 NULL ++_hardware_enqueue_23558 _hardware_enqueue 0 23558 NULL ++tcp_match_skb_to_sack_23568 tcp_match_skb_to_sack 3-4 23568 NULL ++padlock_sha1_finup_23569 padlock_sha1_finup 0 23569 NULL nohasharray ++mwl8k_cmd_radio_control_23569 mwl8k_cmd_radio_control 0 23569 &padlock_sha1_finup_23569 ++venus_symlink_23570 venus_symlink 6-4 23570 NULL ++show_net_stats_23573 show_net_stats 0 23573 NULL ++iwl_dbgfs_interrupt_read_23574 iwl_dbgfs_interrupt_read 3-0 23574 NULL ++_regmap_select_page_23575 _regmap_select_page 0 23575 NULL nohasharray ++l2cap_parse_conf_req_23575 l2cap_parse_conf_req 0 23575 &_regmap_select_page_23575 ++__netpoll_setup_23578 __netpoll_setup 0 23578 NULL nohasharray ++pm_notifier_call_chain_23578 pm_notifier_call_chain 0 23578 &__netpoll_setup_23578 ++xfpregs_get_23586 xfpregs_get 4 23586 NULL ++show_iface_initiator_name_23588 show_iface_initiator_name 0 23588 NULL nohasharray ++qib_user_sdma_make_progress_23588 qib_user_sdma_make_progress 0 23588 &show_iface_initiator_name_23588 nohasharray ++set_min_23588 set_min 0-4 23588 &qib_user_sdma_make_progress_23588 ++get_power_status_23592 get_power_status 0 23592 NULL ++lpfc_sriov_nr_virtfn_show_23593 lpfc_sriov_nr_virtfn_show 0 23593 NULL nohasharray ++show_fcstat_fcp_input_megabytes_23593 show_fcstat_fcp_input_megabytes 0 23593 &lpfc_sriov_nr_virtfn_show_23593 ++cfpkt_create_pfx_23594 cfpkt_create_pfx 2-1 23594 NULL ++ath10k_pci_diag_read32_23596 ath10k_pci_diag_read32 0 23596 NULL nohasharray ++rt73usb_load_firmware_23596 rt73usb_load_firmware 0 23596 &ath10k_pci_diag_read32_23596 ++ad7266_powerdown_23599 ad7266_powerdown 0 23599 NULL ++show_23604 show 0 23604 NULL ++mtd_erasesize_show_23606 mtd_erasesize_show 0 23606 NULL ++_alloc_cdb_cont_23609 _alloc_cdb_cont 2 23609 NULL nohasharray ++transmit_cmd_23609 transmit_cmd 0-3 23609 &_alloc_cdb_cont_23609 ++islpci_mgt_transaction_23610 islpci_mgt_transaction 0-5 23610 NULL nohasharray ++store_tabletJitterDelay_23610 store_tabletJitterDelay 0-4 23610 &islpci_mgt_transaction_23610 ++_iommu_event_show_23612 _iommu_event_show 0 23612 NULL ++xfs_qm_dqread_23613 xfs_qm_dqread 0 23613 NULL ++qlcnic_sysfs_write_pm_config_23614 qlcnic_sysfs_write_pm_config 0-6-5 23614 NULL ++i40e_dbg_command_read_23617 i40e_dbg_command_read 0-3 23617 NULL nohasharray ++cifs_get_writer_23617 cifs_get_writer 0 23617 &i40e_dbg_command_read_23617 ++ocfs2_dlm_recover_show_23619 ocfs2_dlm_recover_show 0 23619 NULL ++dbg_check_ltab_23620 dbg_check_ltab 0 23620 NULL ++show_button_23622 show_button 0 23622 NULL ++uwb_rc_scan_store_23634 uwb_rc_scan_store 0-4 23634 NULL ++rt2x00mmio_alloc_queue_dma_23638 rt2x00mmio_alloc_queue_dma 0 23638 NULL ++target_fabric_port_show_attr_alua_tg_pt_write_md_23641 target_fabric_port_show_attr_alua_tg_pt_write_md 0 23641 NULL ++qla24xx_reset_chip_23642 qla24xx_reset_chip 0 23642 NULL ++adfs_write_inode_23650 adfs_write_inode 0 23650 NULL nohasharray ++ufx_disable_23650 ufx_disable 0 23650 &adfs_write_inode_23650 ++profile_cpu_callback_23652 profile_cpu_callback 0 23652 NULL nohasharray ++__i2400mu_send_barker_23652 __i2400mu_send_barker 3 23652 &profile_cpu_callback_23652 ++setup_ctxt_23653 setup_ctxt 0 23653 NULL ++wlcore_identify_fw_23654 wlcore_identify_fw 0 23654 NULL ++sh_irda_open_23659 sh_irda_open 0 23659 NULL ++idVendor_show_23662 idVendor_show 0 23662 NULL ++ocfs2_cluster_stack_store_23663 ocfs2_cluster_stack_store 0-4 23663 NULL ++dmi_entry_attr_show_23669 dmi_entry_attr_show 0 23669 NULL nohasharray ++SyS_connect_23669 SyS_connect 3 23669 &dmi_entry_attr_show_23669 ++server_monitor_pending_show_23672 server_monitor_pending_show 0 23672 NULL nohasharray ++asd_control_phy_23672 asd_control_phy 0 23672 &server_monitor_pending_show_23672 nohasharray ++niu_init_ipp_23672 niu_init_ipp 0 23672 &asd_control_phy_23672 ++show_in_alarms_23677 show_in_alarms 0 23677 NULL nohasharray ++__uncore_mask_vnw_show_23677 __uncore_mask_vnw_show 0 23677 &show_in_alarms_23677 nohasharray ++igb_setup_all_rx_resources_23677 igb_setup_all_rx_resources 0 23677 &__uncore_mask_vnw_show_23677 ++iwl_mvm_add_int_sta_common_23678 iwl_mvm_add_int_sta_common 0 23678 NULL ++chnl_net_init_23679 chnl_net_init 0 23679 NULL ++show_frontswap_selfshrinking_23681 show_frontswap_selfshrinking 0 23681 NULL nohasharray ++bad_file_fsync_23681 bad_file_fsync 0 23681 &show_frontswap_selfshrinking_23681 ++po1030_s_ctrl_23683 po1030_s_ctrl 0 23683 NULL ++mv88e6352_phy_page_read_23687 mv88e6352_phy_page_read 0 23687 NULL ++nftl_partscan_23688 nftl_partscan 0 23688 NULL ++zd_rf_init_uw2453_23691 zd_rf_init_uw2453 0 23691 NULL ++mp_map_gsi_to_irq_23695 mp_map_gsi_to_irq 1 23695 NULL ++mc13xxx_adc_do_conversion_23698 mc13xxx_adc_do_conversion 0 23698 NULL ++cx18_read_23699 cx18_read 3-0 23699 NULL ++asus_wmi_get_devstate_simple_23704 asus_wmi_get_devstate_simple 0 23704 NULL ++show_in_min1_23705 show_in_min1 0 23705 NULL nohasharray ++cfq_var_store_23705 cfq_var_store 0-3 23705 &show_in_min1_23705 ++show_constraint_time_window_us_23706 show_constraint_time_window_us 0 23706 NULL nohasharray ++target_core_alua_tg_pt_gp_store_attr_alua_write_metadata_23706 target_core_alua_tg_pt_gp_store_attr_alua_write_metadata 0-3 23706 &show_constraint_time_window_us_23706 ++cyberjack_write_23708 cyberjack_write 0-4 23708 NULL ++keyspan_pda_write_23709 keyspan_pda_write 0-4 23709 NULL ++kiblnd_map_tx_23711 kiblnd_map_tx 4 23711 NULL ++hfs_file_fsync_23713 hfs_file_fsync 0 23713 NULL ++ip4_datagram_connect_23714 ip4_datagram_connect 0 23714 NULL ++isku_sysfs_write_control_23718 isku_sysfs_write_control 6-0-5 23718 NULL ++sock_alloc_send_skb_23720 sock_alloc_send_skb 2 23720 NULL ++snd_pcm_hw_refine_23721 snd_pcm_hw_refine 0 23721 NULL ++get_conn_info_23723 get_conn_info 4 23723 NULL ++mp_config_acpi_gsi_23728 mp_config_acpi_gsi 2 23728 NULL ++inode_getattr_23729 inode_getattr 0 23729 NULL nohasharray ++wsm_set_uapsd_info_23729 wsm_set_uapsd_info 0 23729 &inode_getattr_23729 ++quota_warn_period_store_23730 quota_warn_period_store 3-0 23730 NULL ++iscsi_stat_tgt_attr_show_attr_fail_intr_addr_type_23731 iscsi_stat_tgt_attr_show_attr_fail_intr_addr_type 0 23731 NULL ++get_pwm_mode_23733 get_pwm_mode 0 23733 NULL ++apparmor_setprocattr_23734 apparmor_setprocattr 0-4 23734 NULL ++xadc_update_adc_reg_23740 xadc_update_adc_reg 0 23740 NULL ++tg3_open_23742 tg3_open 0 23742 NULL ++qla2x00_vn_port_mac_address_show_23743 qla2x00_vn_port_mac_address_show 0 23743 NULL ++rtl_show_debug_level_23745 rtl_show_debug_level 0 23745 NULL nohasharray ++dccp_v6_init_sock_23745 dccp_v6_init_sock 0 23745 &rtl_show_debug_level_23745 ++rx_rx_dropped_frame_read_23748 rx_rx_dropped_frame_read 3-0 23748 NULL ++ov6650_g_crop_23751 ov6650_g_crop 0 23751 NULL ++wl18xx_set_mac_and_phy_23754 wl18xx_set_mac_and_phy 0 23754 NULL ++prism54_set_mac_address_23758 prism54_set_mac_address 0 23758 NULL ++show_max_23764 show_max 0 23764 NULL ++dst_discard_sk_23766 dst_discard_sk 0 23766 NULL ++__kfifo_max_r_23768 __kfifo_max_r 0-1-2 23768 NULL nohasharray ++ath10k_reg_value_write_23768 ath10k_reg_value_write 3-0 23768 &__kfifo_max_r_23768 ++ath5k_attr_show_cck_weak_signal_detection_23769 ath5k_attr_show_cck_weak_signal_detection 0 23769 NULL ++security_inode_getxattr_23781 security_inode_getxattr 0 23781 NULL ++cfg80211_inform_bss_width_frame_23782 cfg80211_inform_bss_width_frame 5 23782 NULL ++gt_max_freq_mhz_store_23783 gt_max_freq_mhz_store 0-4 23783 NULL ++twl6040_bitclk_prepare_23790 twl6040_bitclk_prepare 0 23790 NULL nohasharray ++autosleep_show_23790 autosleep_show 0 23790 &twl6040_bitclk_prepare_23790 ++adp5520_bl_daylight_max_show_23794 adp5520_bl_daylight_max_show 0 23794 NULL nohasharray ++iscsi_tpg_param_show_OFMarker_23794 iscsi_tpg_param_show_OFMarker 0 23794 &adp5520_bl_daylight_max_show_23794 ++map_write_23795 map_write 3-0 23795 NULL ++diva_alloc_dma_map_23798 diva_alloc_dma_map 2 23798 NULL ++ov9740_reg_read_23800 ov9740_reg_read 0 23800 NULL nohasharray ++edid_store_23800 edid_store 0-6-5 23800 &ov9740_reg_read_23800 ++rx_path_reset_read_23801 rx_path_reset_read 3-0 23801 NULL ++ocfs2_replace_cow_23803 ocfs2_replace_cow 0 23803 NULL ++multicast_router_show_23806 multicast_router_show 0 23806 NULL ++nilfs_count_free_blocks_23807 nilfs_count_free_blocks 0 23807 NULL ++lbs_anycast_set_23813 lbs_anycast_set 0-4 23813 NULL nohasharray ++macvlan_sync_address_23813 macvlan_sync_address 0 23813 &lbs_anycast_set_23813 ++snd_es1938_playback2_prepare_23819 snd_es1938_playback2_prepare 0 23819 NULL ++brcmf_dongle_roam_23822 brcmf_dongle_roam 0 23822 NULL nohasharray ++team_open_23822 team_open 0 23822 &brcmf_dongle_roam_23822 ++show_conn_param_ISCSI_PARAM_STATSN_23823 show_conn_param_ISCSI_PARAM_STATSN 0 23823 NULL nohasharray ++enic_add_vlan_23823 enic_add_vlan 0 23823 &show_conn_param_ISCSI_PARAM_STATSN_23823 nohasharray ++set_attention_status_23823 set_attention_status 0 23823 &enic_add_vlan_23823 ++__earlyonly_bootmem_alloc_23824 __earlyonly_bootmem_alloc 2 23824 NULL ++hopcount_show_23825 hopcount_show 0 23825 NULL ++apds990x_lux_range_show_23826 apds990x_lux_range_show 0 23826 NULL nohasharray ++iwl_mvm_allocate_int_sta_23826 iwl_mvm_allocate_int_sta 0 23826 &apds990x_lux_range_show_23826 ++lustre_msg_buflen_23827 lustre_msg_buflen 0 23827 NULL ++show_sf4_pwm_23833 show_sf4_pwm 0 23833 NULL ++adt7411_modify_bit_23834 adt7411_modify_bit 0 23834 NULL ++set_trigger_23840 set_trigger 0-4 23840 NULL ++ax_open_dev_23842 ax_open_dev 0 23842 NULL ++usbvision_i2c_write_23843 usbvision_i2c_write 0-4 23843 NULL nohasharray ++cgroup_procs_write_23843 cgroup_procs_write 0-3 23843 &usbvision_i2c_write_23843 ++osst_reposition_and_retry_23844 osst_reposition_and_retry 0 23844 NULL ++iwl_dbgfs_nvm_read_23845 iwl_dbgfs_nvm_read 3-0 23845 NULL ++max1027_validate_trigger_23847 max1027_validate_trigger 0 23847 NULL ++bucket_table_alloc_23849 bucket_table_alloc 1 23849 NULL ++p54_init_common_23850 p54_init_common 1 23850 NULL ++gart_alloc_coherent_23852 gart_alloc_coherent 2 23852 NULL ++bin_to_hex_dup_23853 bin_to_hex_dup 2 23853 NULL ++rocker_port_ctrl_vlan_23854 rocker_port_ctrl_vlan 0 23854 NULL ++__bond_opt_set_23855 __bond_opt_set 0 23855 NULL ++__key_link_begin_23856 __key_link_begin 0 23856 NULL ++ocfs2_xattr_get_clusters_23857 ocfs2_xattr_get_clusters 0 23857 NULL nohasharray ++show_iface_chap_auth_23857 show_iface_chap_auth 0 23857 &ocfs2_xattr_get_clusters_23857 ++nfs4_call_sync_23858 nfs4_call_sync 0 23858 NULL ++mv88e6352_phy_page_write_23862 mv88e6352_phy_page_write 0 23862 NULL ++device_event_23864 device_event 0 23864 NULL ++vmci_transport_notify_send_pre_enqueue_23866 vmci_transport_notify_send_pre_enqueue 0 23866 NULL ++xen_alloc_pte_init_23869 xen_alloc_pte_init 2 23869 NULL ++m88rs6000t_set_bb_23871 m88rs6000t_set_bb 0 23871 NULL ++hdlcdrv_set_mac_address_23872 hdlcdrv_set_mac_address 0 23872 NULL ++ieee80211_if_read_dot11MeshMaxPeerLinks_23878 ieee80211_if_read_dot11MeshMaxPeerLinks 3-0 23878 NULL ++bond_init_23879 bond_init 0 23879 NULL ++writeback_single_inode_23881 writeback_single_inode 0 23881 NULL ++pwc_button_ctrl_23886 pwc_button_ctrl 0 23886 NULL ++__tg3_writephy_23889 __tg3_writephy 0 23889 NULL ++nes_alloc_resource_23891 nes_alloc_resource 3 23891 NULL ++tipc_snprintf_23893 tipc_snprintf 2-0 23893 NULL ++show_temp_auto_boost_23895 show_temp_auto_boost 0 23895 NULL ++vfat_revalidate_23899 vfat_revalidate 0 23899 NULL ++iwch_reject_cr_23901 iwch_reject_cr 3 23901 NULL ++nilfs_freeze_23902 nilfs_freeze 0 23902 NULL ++iov_iter_get_pages_alloc_23903 iov_iter_get_pages_alloc 3-0 23903 NULL ++netxen_sysfs_write_crb_23905 netxen_sysfs_write_crb 0-6-5 23905 NULL ++atxp1_storegpio1_23908 atxp1_storegpio1 0-4 23908 NULL ++add_new_gdb_meta_bg_23911 add_new_gdb_meta_bg 3 23911 NULL nohasharray ++ieee80211_if_read_hw_queues_23911 ieee80211_if_read_hw_queues 3-0 23911 &add_new_gdb_meta_bg_23911 ++ipath_reg_phys_mr_23918 ipath_reg_phys_mr 3 23918 NULL nohasharray ++mpihelp_mul_karatsuba_case_23918 mpihelp_mul_karatsuba_case 5-3 23918 &ipath_reg_phys_mr_23918 ++ncp_do_request_23925 ncp_do_request 0 23925 NULL nohasharray ++cc2520_cmd_strobe_23925 cc2520_cmd_strobe 0 23925 &ncp_do_request_23925 ++ftdi_elan_read_23927 ftdi_elan_read 0-3 23927 NULL ++kvm_read_guest_23928 kvm_read_guest 4-2 23928 NULL nohasharray ++intel_ring_alloc_seqno_23928 intel_ring_alloc_seqno 0 23928 &kvm_read_guest_23928 ++save_image_23929 save_image 0 23929 NULL ++store_temp_pwm_23930 store_temp_pwm 0-4 23930 NULL ++csio_show_dbg_level_23932 csio_show_dbg_level 0 23932 NULL ++_osd_req_finalize_get_attr_list_23933 _osd_req_finalize_get_attr_list 0 23933 NULL ++write_vda_23934 write_vda 0-5-6 23934 NULL ++supports_autosuspend_show_23938 supports_autosuspend_show 0 23938 NULL ++__alloc_skb_23940 __alloc_skb 1 23940 NULL ++DMAbuf_activate_recording_23942 DMAbuf_activate_recording 0 23942 NULL ++qla2x00_sysfs_read_fw_dump_23943 qla2x00_sysfs_read_fw_dump 6-0-5 23943 NULL ++uvc_endpoint_max_bpi_23944 uvc_endpoint_max_bpi 0 23944 NULL nohasharray ++ceph_write_inode_23944 ceph_write_inode 0 23944 &uvc_endpoint_max_bpi_23944 ++bpf_prog_alloc_23945 bpf_prog_alloc 1 23945 NULL nohasharray ++ltc4245_show_current_23945 ltc4245_show_current 0 23945 &bpf_prog_alloc_23945 ++da9052_rtc_enable_alarm_23947 da9052_rtc_enable_alarm 0 23947 NULL ++wl1251_boot_soft_reset_23952 wl1251_boot_soft_reset 0 23952 NULL ++cifs_setxattr_23957 cifs_setxattr 4-0 23957 NULL ++size_roundup_power2_23958 size_roundup_power2 0-1 23958 NULL ++fc2580_rd_reg_23959 fc2580_rd_reg 0 23959 NULL ++wait_on_bit_action_23963 wait_on_bit_action 0 23963 NULL nohasharray ++group_fwd_mask_store_23963 group_fwd_mask_store 0-4 23963 &wait_on_bit_action_23963 ++_ore_read_mirror_23965 _ore_read_mirror 0 23965 NULL ++vfs_write_23971 vfs_write 3-0 23971 NULL ++sch56xx_send_cmd_23978 sch56xx_send_cmd 0 23978 NULL nohasharray ++ci_get_data_23978 ci_get_data 3 23978 &sch56xx_send_cmd_23978 ++virtblk_get_id_23981 virtblk_get_id 0 23981 NULL ++sddr55_write_data_23983 sddr55_write_data 4 23983 NULL ++zd_usb_iowrite16v_async_23984 zd_usb_iowrite16v_async 0-3 23984 NULL ++show_cpu_clock_sel_23986 show_cpu_clock_sel 0 23986 NULL ++mon_bin_wait_event_23993 mon_bin_wait_event 0 23993 NULL ++ipw2100_open_23994 ipw2100_open 0 23994 NULL ++mt9m111_set_autoexposure_23998 mt9m111_set_autoexposure 0 23998 NULL ++os_desc_use_store_24000 os_desc_use_store 0-3 24000 NULL ++broadsheet_setup_spi_24005 broadsheet_setup_spi 0 24005 NULL ++cxgb_alloc_mem_24007 cxgb_alloc_mem 1 24007 NULL ++rx8025_read_reg_24012 rx8025_read_reg 0 24012 NULL ++set_temp_hyst1_24014 set_temp_hyst1 0-4 24014 NULL nohasharray ++intel_ring_idle_24014 intel_ring_idle 0 24014 &set_temp_hyst1_24014 ++wl1251_acx_cca_threshold_24015 wl1251_acx_cca_threshold 0 24015 NULL ++ext2_xattr_set2_24019 ext2_xattr_set2 0 24019 NULL ++average_write_24020 average_write 0-3 24020 NULL ++give_pages_24021 give_pages 3 24021 NULL ++node_page_state_24024 node_page_state 0 24024 NULL nohasharray ++htc_send_epid_24024 htc_send_epid 0 24024 &node_page_state_24024 ++sys_pwrite64_24029 sys_pwrite64 3 24029 NULL ++show_24031 show 0 24031 NULL ++gsmi_panic_callback_24033 gsmi_panic_callback 0 24033 NULL ++set_ctrl_lock_24034 set_ctrl_lock 0 24034 NULL ++adis16400_show_serial_number_24037 adis16400_show_serial_number 3-0 24037 NULL ++get_ata_class_names_24038 get_ata_class_names 0 24038 NULL ++ixgbevf_change_mtu_24040 ixgbevf_change_mtu 0 24040 NULL ++setkey_24042 setkey 0 24042 NULL ++usb_set_configuration_24043 usb_set_configuration 0 24043 NULL ++show_log_width_24047 show_log_width 0 24047 NULL nohasharray ++patch_ad1884_24047 patch_ad1884 0 24047 &show_log_width_24047 ++wl1271_acx_ac_cfg_24051 wl1271_acx_ac_cfg 0 24051 NULL ++afs_cell_alloc_24052 afs_cell_alloc 2 24052 NULL nohasharray ++ipath_setrcvhdrsize_24052 ipath_setrcvhdrsize 0 24052 &afs_cell_alloc_24052 ++ad9523_write_24058 ad9523_write 0 24058 NULL ++iwl_dbgfs_low_latency_read_24062 iwl_dbgfs_low_latency_read 3-0 24062 NULL nohasharray ++notify_recv_pre_block_24062 notify_recv_pre_block 0 24062 &iwl_dbgfs_low_latency_read_24062 ++gem_change_mtu_24066 gem_change_mtu 0 24066 NULL ++domid_show_24067 domid_show 0 24067 NULL nohasharray ++cfhsi_flush_fifo_24067 cfhsi_flush_fifo 0 24067 &domid_show_24067 ++aa_restore_previous_profile_24070 aa_restore_previous_profile 0 24070 NULL nohasharray ++iwl_send_bt_init_conf_24070 iwl_send_bt_init_conf 0 24070 &aa_restore_previous_profile_24070 ++usbnet_open_24073 usbnet_open 0 24073 NULL ++nv_device_resource_start_24075 nv_device_resource_start 0 24075 NULL ++logfs_write_begin_24078 logfs_write_begin 0 24078 NULL ++vb2_fop_read_24080 vb2_fop_read 3-0 24080 NULL ++show_point2_24082 show_point2 0 24082 NULL ++sb_midi_open_24097 sb_midi_open 0 24097 NULL nohasharray ++cachefiles_daemon_secctx_24097 cachefiles_daemon_secctx 0 24097 &sb_midi_open_24097 ++target_core_dev_pr_show_spc2_res_24098 target_core_dev_pr_show_spc2_res 0 24098 NULL ++vivid_fb_check_var_24099 vivid_fb_check_var 0 24099 NULL ++init_pioavailregs_24101 init_pioavailregs 0 24101 NULL ++C_SYSC_process_vm_writev_24102 C_SYSC_process_vm_writev 3-5 24102 NULL ++pipeline_post_proc_swi_read_24108 pipeline_post_proc_swi_read 3-0 24108 NULL ++request_key_auth_read_24109 request_key_auth_read 3 24109 NULL ++queue_ra_show_24111 queue_ra_show 0 24111 NULL ++hv_ringbuffer_write_24114 hv_ringbuffer_write 0 24114 NULL ++show_fcstat_error_frames_24115 show_fcstat_error_frames 0 24115 NULL ++iwlagn_set_pan_params_24118 iwlagn_set_pan_params 0 24118 NULL ++show_session_param_ISCSI_PARAM_BOOT_ROOT_24126 show_session_param_ISCSI_PARAM_BOOT_ROOT 0 24126 NULL ++mwifiex_open_24130 mwifiex_open 0 24130 NULL ++piix4_transaction_24131 piix4_transaction 0 24131 NULL ++_picolcd_flash_write_24134 _picolcd_flash_write 4-0 24134 NULL nohasharray ++si4713_powerup_24134 si4713_powerup 0 24134 &_picolcd_flash_write_24134 ++irnet_ctrl_write_24139 irnet_ctrl_write 3-0 24139 NULL nohasharray ++lis3lv02d_selftest_show_24139 lis3lv02d_selftest_show 0 24139 &irnet_ctrl_write_24139 nohasharray ++xfs_btree_increment_24139 xfs_btree_increment 0 24139 &lis3lv02d_selftest_show_24139 ++ov9650_s_ctrl_24141 ov9650_s_ctrl 0 24141 NULL ++mem_cgroup_can_attach_24142 mem_cgroup_can_attach 0 24142 NULL ++cx24123_tuner_i2c_tuner_xfer_24143 cx24123_tuner_i2c_tuner_xfer 0-3 24143 NULL nohasharray ++attr_dragging_show_tpkbd_24143 attr_dragging_show_tpkbd 0 24143 &cx24123_tuner_i2c_tuner_xfer_24143 ++__niu_wait_bits_clear_24147 __niu_wait_bits_clear 0 24147 NULL ++store_24149 store 0-3 24149 NULL ++SyS_sethostname_24150 SyS_sethostname 2 24150 NULL ++trim_bitmaps_24158 trim_bitmaps 3 24158 NULL ++wan_enable_store_24159 wan_enable_store 4-0 24159 NULL ++__copy_user_zeroing_intel_nocache_24163 __copy_user_zeroing_intel_nocache 0 24163 NULL ++notes_read_24165 notes_read 0-6-5 24165 NULL ++fc2580_wr_reg_24166 fc2580_wr_reg 0 24166 NULL ++orinoco_change_mtu_24172 orinoco_change_mtu 0 24172 NULL ++nr_hugepages_mempolicy_store_24176 nr_hugepages_mempolicy_store 0-4 24176 NULL ++adu_read_24177 adu_read 3-0 24177 NULL nohasharray ++show_ipv4_iface_dhcp_alt_client_id_en_24177 show_ipv4_iface_dhcp_alt_client_id_en 0 24177 &adu_read_24177 ++sock_no_setsockopt_24178 sock_no_setsockopt 0 24178 NULL ++cifs_write_begin_24179 cifs_write_begin 0 24179 NULL ++adv7343_write_24183 adv7343_write 0 24183 NULL ++ql_configure_rings_24184 ql_configure_rings 0 24184 NULL ++safe_prepare_write_buffer_24187 safe_prepare_write_buffer 3 24187 NULL ++resource_show_24189 resource_show 0 24189 NULL ++po1030_set_blue_balance_24191 po1030_set_blue_balance 0 24191 NULL ++irq_remapping_setup_msi_irqs_24194 irq_remapping_setup_msi_irqs 2 24194 NULL nohasharray ++skein1024_init_24194 skein1024_init 0 24194 &irq_remapping_setup_msi_irqs_24194 ++nv94_aux_24197 nv94_aux 0 24197 NULL nohasharray ++list_locations_24197 list_locations 0 24197 &nv94_aux_24197 ++ts_play_24203 ts_play 0-3 24203 NULL ++ieee80211_if_read_dot11MeshHWMPpreqMinInterval_24208 ieee80211_if_read_dot11MeshHWMPpreqMinInterval 3-0 24208 NULL nohasharray ++show_24208 show 0 24208 &ieee80211_if_read_dot11MeshHWMPpreqMinInterval_24208 ++__tsl2550_show_lux_24210 __tsl2550_show_lux 0 24210 NULL ++joydev_0x_read_24213 joydev_0x_read 0 24213 NULL ++show_maxmin_alarm_24216 show_maxmin_alarm 0 24216 NULL nohasharray ++dsm_get_label_24216 dsm_get_label 0 24216 &show_maxmin_alarm_24216 nohasharray ++reiserfs_write_full_page_24216 reiserfs_write_full_page 0 24216 &dsm_get_label_24216 ++set_sync_ep_implicit_fb_quirk_24218 set_sync_ep_implicit_fb_quirk 0 24218 NULL ++SyS_sendfile64_24220 SyS_sendfile64 4 24220 NULL ++tcpprobe_sprint_24222 tcpprobe_sprint 0-2 24222 NULL nohasharray ++set_csma_params_24222 set_csma_params 0 24222 &tcpprobe_sprint_24222 ++mwifiex_send_cmd_24223 mwifiex_send_cmd 0 24223 NULL ++pcpu_embed_first_chunk_24224 pcpu_embed_first_chunk 3-2-1 24224 NULL nohasharray ++mei_amthif_read_24224 mei_amthif_read 4-0 24224 &pcpu_embed_first_chunk_24224 ++niu_rbr_fill_24226 niu_rbr_fill 0 24226 NULL ++autosleep_store_24230 autosleep_store 0-4 24230 NULL ++pci_num_vf_24235 pci_num_vf 0 24235 NULL nohasharray ++mxl5005s_reconfigure_24235 mxl5005s_reconfigure 0 24235 &pci_num_vf_24235 ++sel_read_bool_24236 sel_read_bool 3-0 24236 NULL ++xfs_bmap_rtalloc_24237 xfs_bmap_rtalloc 0 24237 NULL ++set_in16_min_24238 set_in16_min 0-4 24238 NULL ++lpfc_enable_rrq_show_24241 lpfc_enable_rrq_show 0 24241 NULL ++max8998_rtc_set_alarm_24245 max8998_rtc_set_alarm 0 24245 NULL ++safe_delay_show_24247 safe_delay_show 0 24247 NULL nohasharray ++xpnet_dev_change_mtu_24247 xpnet_dev_change_mtu 0 24247 &safe_delay_show_24247 ++security_inode_follow_link_24253 security_inode_follow_link 0 24253 NULL ++rt2x00queue_initialize_24255 rt2x00queue_initialize 0 24255 NULL ++bd2802_show_wave_pattern_24259 bd2802_show_wave_pattern 0 24259 NULL ++em28xx_alloc_urbs_24260 em28xx_alloc_urbs 4-6-0 24260 NULL nohasharray ++vxlan_lowerdev_event_24260 vxlan_lowerdev_event 0 24260 &em28xx_alloc_urbs_24260 ++esp6_get_mtu_24264 esp6_get_mtu 0-2 24264 NULL ++do_set_pwm_enable_24271 do_set_pwm_enable 0 24271 NULL ++tun_chr_write_iter_24273 tun_chr_write_iter 0 24273 NULL nohasharray ++store_24273 store 0 24273 &tun_chr_write_iter_24273 ++vpd_use_hostno_store_24274 vpd_use_hostno_store 0-3 24274 NULL ++nilfs_segctor_add_super_root_24277 nilfs_segctor_add_super_root 0 24277 NULL nohasharray ++pvr2_hdw_set_streaming_24277 pvr2_hdw_set_streaming 0 24277 &nilfs_segctor_add_super_root_24277 nohasharray ++set_bdaddr_24277 set_bdaddr 0 24277 &pvr2_hdw_set_streaming_24277 ++thin_status_24278 thin_status 5 24278 NULL ++compat_sys_preadv64_24283 compat_sys_preadv64 3 24283 NULL ++azx_pcm_prepare_24285 azx_pcm_prepare 0 24285 NULL nohasharray ++power_limit_1_max_uw_show_24285 power_limit_1_max_uw_show 0 24285 &azx_pcm_prepare_24285 ++msg_size_24288 msg_size 0 24288 NULL ++ext2_free_blocks_24292 ext2_free_blocks 3-2 24292 NULL ++i2c_smbus_check_pec_24297 i2c_smbus_check_pec 0 24297 NULL ++map_page_24298 map_page 4-3 24298 NULL ++store_fbstate_24303 store_fbstate 0-4 24303 NULL ++adp8870_bl_l5_dark_dim_show_24305 adp8870_bl_l5_dark_dim_show 0 24305 NULL ++btmrvl_pscmd_read_24308 btmrvl_pscmd_read 3-0 24308 NULL nohasharray ++nfs_proc_statfs_24308 nfs_proc_statfs 0 24308 &btmrvl_pscmd_read_24308 ++oprofile_cpu_notifier_24310 oprofile_cpu_notifier 0 24310 NULL nohasharray ++__ims_pcu_execute_bl_command_24310 __ims_pcu_execute_bl_command 0 24310 &oprofile_cpu_notifier_24310 ++reserve_metadata_bytes_24313 reserve_metadata_bytes 0 24313 NULL ++aliases_show_24315 aliases_show 0 24315 NULL ++bd2802_store_rgb_current_24316 bd2802_store_rgb_current 0-4 24316 NULL ++ath6kl_add_bss_if_needed_24317 ath6kl_add_bss_if_needed 6 24317 NULL nohasharray ++nommu_map_page_24317 nommu_map_page 0-3 24317 &ath6kl_add_bss_if_needed_24317 ++pci_write_config_word_24318 pci_write_config_word 0 24318 NULL ++xfs_dir3_leafn_read_24319 xfs_dir3_leafn_read 0 24319 NULL ++ov6650_s_stream_24322 ov6650_s_stream 0 24322 NULL ++ovl_statfs_24327 ovl_statfs 0 24327 NULL ++si476x_radio_read_acf_blob_24336 si476x_radio_read_acf_blob 3-0 24336 NULL ++arcmsr_attr_host_driver_reset_24341 arcmsr_attr_host_driver_reset 0 24341 NULL nohasharray ++target_fabric_port_show_attr_alua_tg_pt_offline_24341 target_fabric_port_show_attr_alua_tg_pt_offline 0 24341 &arcmsr_attr_host_driver_reset_24341 ++hpc_wait_ctlr_notworking_24344 hpc_wait_ctlr_notworking 0 24344 NULL ++C_SYSC_pwritev_24345 C_SYSC_pwritev 3 24345 NULL ++nf_iterate_24348 nf_iterate 0 24348 NULL ++prepare_pages_24349 prepare_pages 0 24349 NULL ++kzalloc_node_24352 kzalloc_node 1 24352 NULL ++roccat_common2_sysfs_read_macro_24355 roccat_common2_sysfs_read_macro 0-5-6 24355 NULL ++lp3972_i2c_read_24364 lp3972_i2c_read 0 24364 NULL ++cfi_read_pri_24366 cfi_read_pri 3 24366 NULL ++btrfs_item_size_nr_24367 btrfs_item_size_nr 0 24367 NULL nohasharray ++twl_rtc_set_alarm_24367 twl_rtc_set_alarm 0 24367 &btrfs_item_size_nr_24367 nohasharray ++store_attach_24367 store_attach 0-4 24367 &twl_rtc_set_alarm_24367 ++videobuf_read_zerocopy_24369 videobuf_read_zerocopy 0 24369 NULL ++break_deleg_24373 break_deleg 0 24373 NULL ++elevator_init_fn_24375 elevator_init_fn 0 24375 NULL ++submit_24379 submit 0 24379 NULL ++ds2780_get_pmod_enabled_24380 ds2780_get_pmod_enabled 0 24380 NULL ++try_alloc_port_24382 try_alloc_port 0 24382 NULL ++cpu_subsys_offline_24383 cpu_subsys_offline 0 24383 NULL ++acpi_ds_get_buffer_arguments_24384 acpi_ds_get_buffer_arguments 0 24384 NULL ++xfs_bmapi_read_24392 xfs_bmapi_read 0 24392 NULL nohasharray ++sock_xmit_24392 sock_xmit 4 24392 &xfs_bmapi_read_24392 ++osc_cur_grant_bytes_seq_write_24396 osc_cur_grant_bytes_seq_write 3 24396 NULL ++edac_pci_int_show_24397 edac_pci_int_show 0 24397 NULL ++getxattr_24398 getxattr 4 24398 NULL nohasharray ++pvr2_v4l2_ioctl_24398 pvr2_v4l2_ioctl 2 24398 &getxattr_24398 ++populate_msi_sysfs_24399 populate_msi_sysfs 0 24399 NULL ++o2nm_cluster_attr_keepalive_delay_ms_read_24403 o2nm_cluster_attr_keepalive_delay_ms_read 0 24403 NULL ++drm_property_create_bitmask_24412 drm_property_create_bitmask 6 24412 NULL ++save_image_lzo_24413 save_image_lzo 0 24413 NULL ++blk_update_bidi_request_24415 blk_update_bidi_request 3-4 24415 NULL ++default_density_show_24417 default_density_show 0 24417 NULL ++nvme_trans_log_supp_pages_24418 nvme_trans_log_supp_pages 3 24418 NULL ++show_iap_mode_24420 show_iap_mode 0 24420 NULL ++rtl8187_init_urbs_24421 rtl8187_init_urbs 0 24421 NULL ++set_port1_handler_24424 set_port1_handler 0-4 24424 NULL ++b43_debugfs_read_24425 b43_debugfs_read 3-0 24425 NULL ++bq2415x_sysfs_set_limit_24426 bq2415x_sysfs_set_limit 0-4 24426 NULL ++xenbus_file_read_24427 xenbus_file_read 3-0 24427 NULL ++bond_option_ad_select_set_24430 bond_option_ad_select_set 0 24430 NULL nohasharray ++ieee80211_rx_mgmt_beacon_24430 ieee80211_rx_mgmt_beacon 3 24430 &bond_option_ad_select_set_24430 ++pn_socket_sendmsg_24431 pn_socket_sendmsg 4-0 24431 NULL ++copy_and_ioctl_24434 copy_and_ioctl 4 24434 NULL ++suspend_freeze_processes_24436 suspend_freeze_processes 0 24436 NULL ++ixgbe_alloc_q_vector_24439 ixgbe_alloc_q_vector 6-4 24439 NULL ++smk_user_access_24440 smk_user_access 3-0 24440 NULL nohasharray ++rtw_set_wps_assoc_resp_24440 rtw_set_wps_assoc_resp 3 24440 &smk_user_access_24440 ++lpfc_option_rom_version_show_24443 lpfc_option_rom_version_show 0 24443 NULL ++mc13xxx_regulator_enable_24450 mc13xxx_regulator_enable 0 24450 NULL nohasharray ++s5p_jpeg_try_ctrl_24450 s5p_jpeg_try_ctrl 0 24450 &mc13xxx_regulator_enable_24450 ++show_24457 show 0 24457 NULL ++evdev_do_ioctl_24459 evdev_do_ioctl 2 24459 NULL nohasharray ++internal_dev_open_24459 internal_dev_open 0 24459 &evdev_do_ioctl_24459 ++lbs_highsnr_write_24460 lbs_highsnr_write 3-0 24460 NULL nohasharray ++tgr128_final_24460 tgr128_final 0 24460 &lbs_highsnr_write_24460 ++compat_SyS_mq_timedsend_24464 compat_SyS_mq_timedsend 3 24464 NULL ++lport_reset_24466 lport_reset 0 24466 NULL ++sii9234_s_stream_24467 sii9234_s_stream 0 24467 NULL ++bConfigurationValue_store_24484 bConfigurationValue_store 0-4 24484 NULL ++xfs_bmap_local_to_extents_24486 xfs_bmap_local_to_extents 0 24486 NULL nohasharray ++ttm_page_pool_free_24486 ttm_page_pool_free 2-0 24486 &xfs_bmap_local_to_extents_24486 ++snd_pcm_hw_param_first_24487 snd_pcm_hw_param_first 0 24487 NULL ++show_temp_max1_24488 show_temp_max1 0 24488 NULL ++dut_mode_read_24489 dut_mode_read 3-0 24489 NULL ++read_file_spec_scan_ctl_24491 read_file_spec_scan_ctl 3-0 24491 NULL ++pl2303_open_24492 pl2303_open 0 24492 NULL ++i915_gem_obj_offset_24494 i915_gem_obj_offset 0 24494 NULL ++xfs_attr_shortform_remove_24495 xfs_attr_shortform_remove 0 24495 NULL nohasharray ++iscsi_nacl_auth_store_password_24495 iscsi_nacl_auth_store_password 0-3 24495 &xfs_attr_shortform_remove_24495 ++show_counter_rx_link_problems_24496 show_counter_rx_link_problems 0 24496 NULL nohasharray ++sprintf_temp_from_reg_24496 sprintf_temp_from_reg 0 24496 &show_counter_rx_link_problems_24496 ++bond_change_mtu_24497 bond_change_mtu 0 24497 NULL ++lpss_ltr_mode_show_24507 lpss_ltr_mode_show 0 24507 NULL ++pd_video_read_24510 pd_video_read 3 24510 NULL ++fuse_notify_retrieve_24514 fuse_notify_retrieve 0 24514 NULL ++request_key_with_auxdata_24515 request_key_with_auxdata 4 24515 NULL nohasharray ++ipv6_recv_error_24515 ipv6_recv_error 0 24515 &request_key_with_auxdata_24515 ++show_cmd_log_24517 show_cmd_log 0 24517 NULL ++xfs_buf_get_map_24522 xfs_buf_get_map 3 24522 NULL ++target_core_alua_tg_pt_gp_show_attr_alua_support_standby_24523 target_core_alua_tg_pt_gp_show_attr_alua_support_standby 0 24523 NULL ++show_fc_host_hardware_version_24524 show_fc_host_hardware_version 0 24524 NULL ++mtd_bitflip_threshold_show_24528 mtd_bitflip_threshold_show 0 24528 NULL ++named_prepare_buf_24532 named_prepare_buf 2 24532 NULL ++btrfs_feature_attr_show_24534 btrfs_feature_attr_show 0 24534 NULL nohasharray ++nilfs_ifile_get_inode_block_24534 nilfs_ifile_get_inode_block 0 24534 &btrfs_feature_attr_show_24534 nohasharray ++wl1251_acx_service_period_timeout_24534 wl1251_acx_service_period_timeout 0 24534 &nilfs_ifile_get_inode_block_24534 ++do_mpage_readpage_24536 do_mpage_readpage 3 24536 NULL ++mt2063_set_params_24539 mt2063_set_params 0 24539 NULL ++unix_mknod_24543 unix_mknod 0 24543 NULL ++usbhid_set_raw_report_24550 usbhid_set_raw_report 0 24550 NULL ++snd_hda_multi_out_analog_prepare_24553 snd_hda_multi_out_analog_prepare 0 24553 NULL ++bonding_show_downdelay_24554 bonding_show_downdelay 0 24554 NULL ++dcdbas_reboot_notify_24558 dcdbas_reboot_notify 0 24558 NULL ++iwlagn_mac_sta_state_24561 iwlagn_mac_sta_state 0 24561 NULL ++write_cache_pages_24562 write_cache_pages 0 24562 NULL ++tsi148_alloc_resource_24563 tsi148_alloc_resource 2 24563 NULL ++snd_vt1724_playback_indep_prepare_24569 snd_vt1724_playback_indep_prepare 0 24569 NULL nohasharray ++ocfs2_extent_map_lookup_24569 ocfs2_extent_map_lookup 0 24569 &snd_vt1724_playback_indep_prepare_24569 ++twl4030_madc_start_conversion_24573 twl4030_madc_start_conversion 0 24573 NULL ++netlbl_domhsh_init_24576 netlbl_domhsh_init 1 24576 NULL nohasharray ++ipw_net_open_24576 ipw_net_open 0 24576 &netlbl_domhsh_init_24576 ++SyS_pselect6_24582 SyS_pselect6 1 24582 NULL ++gfs2_readpage_24584 gfs2_readpage 0 24584 NULL ++pci_af_flr_24590 pci_af_flr 0 24590 NULL ++__tipc_link_xmit_24592 __tipc_link_xmit 0 24592 NULL nohasharray ++store_local_ip_24592 store_local_ip 0 24592 &__tipc_link_xmit_24592 ++md_notify_reboot_24593 md_notify_reboot 0 24593 NULL ++udf_compute_nr_groups_24594 udf_compute_nr_groups 0 24594 NULL nohasharray ++lola_codec_read_24594 lola_codec_read 0 24594 &udf_compute_nr_groups_24594 ++de_reset_mac_24598 de_reset_mac 0 24598 NULL ++snd_solo_pcm_trigger_24600 snd_solo_pcm_trigger 0 24600 NULL nohasharray ++musb_platform_set_mode_24600 musb_platform_set_mode 0 24600 &snd_solo_pcm_trigger_24600 nohasharray ++count_preds_24600 count_preds 0 24600 &musb_platform_set_mode_24600 ++i915_error_state_buf_init_24605 i915_error_state_buf_init 3-0 24605 NULL nohasharray ++sensor_hub_get_physical_device_count_24605 sensor_hub_get_physical_device_count 0 24605 &i915_error_state_buf_init_24605 nohasharray ++lov_alloc_memmd_24605 lov_alloc_memmd 2 24605 &sensor_hub_get_physical_device_count_24605 ++objs_per_slab_show_24607 objs_per_slab_show 0 24607 NULL nohasharray ++br_nf_pre_routing_ipv6_24607 br_nf_pre_routing_ipv6 0 24607 &objs_per_slab_show_24607 ++acpilabel_show_24612 acpilabel_show 0 24612 NULL ++hfsplus_cat_write_inode_24613 hfsplus_cat_write_inode 0 24613 NULL ++ntfs_readpage_24616 ntfs_readpage 0 24616 NULL ++SyS_poll_24620 SyS_poll 2 24620 NULL ++ipv6_conntrack_in_24627 ipv6_conntrack_in 0 24627 NULL ++nfs_namespace_setattr_24629 nfs_namespace_setattr 0 24629 NULL ++broadsheet_spiflash_erase_sector_24630 broadsheet_spiflash_erase_sector 0 24630 NULL ++addresses_show_24632 addresses_show 0 24632 NULL nohasharray ++cfqg_set_leaf_weight_device_24632 cfqg_set_leaf_weight_device 0-3 24632 &addresses_show_24632 ++wl1251_hw_init_phy_config_24635 wl1251_hw_init_phy_config 0 24635 NULL nohasharray ++alloc_wr_24635 alloc_wr 2-1 24635 &wl1251_hw_init_phy_config_24635 ++n_per_out_show_24637 n_per_out_show 0 24637 NULL ++qla4_82xx_try_start_fw_24640 qla4_82xx_try_start_fw 0 24640 NULL ++fake_mtu_24641 fake_mtu 0 24641 NULL ++context_alloc_24645 context_alloc 3 24645 NULL ++blk_rq_err_bytes_24650 blk_rq_err_bytes 0 24650 NULL ++store_red_24652 store_red 0-4 24652 NULL ++ext2_xattr_trusted_list_24670 ext2_xattr_trusted_list 0-5 24670 NULL ++ath5k_hw_rf5111_channel_24672 ath5k_hw_rf5111_channel 0 24672 NULL ++update_devfreq_24674 update_devfreq 0 24674 NULL ++mISDN_read_24676 mISDN_read 0-3 24676 NULL ++mv88e6xxx_reg_wait_ready_24678 mv88e6xxx_reg_wait_ready 0 24678 NULL nohasharray ++wake_up_pme_show_24678 wake_up_pme_show 0 24678 &mv88e6xxx_reg_wait_ready_24678 ++batadv_tt_local_init_24679 batadv_tt_local_init 0 24679 NULL ++ali1563_access_24683 ali1563_access 0 24683 NULL ++__mlx4_qp_alloc_icm_24684 __mlx4_qp_alloc_icm 0 24684 NULL ++smack_audit_rule_init_24691 smack_audit_rule_init 0 24691 NULL ++btrfs_check_data_free_space_24692 btrfs_check_data_free_space 0 24692 NULL ++pci_olpc_write_24693 pci_olpc_write 0 24693 NULL ++datafab_write_data_24696 datafab_write_data 4 24696 NULL ++dgram_connect_24701 dgram_connect 0 24701 NULL ++nilfs_direct_assign_v_24705 nilfs_direct_assign_v 0 24705 NULL nohasharray ++udf_add_aext_24705 udf_add_aext 0 24705 &nilfs_direct_assign_v_24705 nohasharray ++devm_kmalloc_24705 devm_kmalloc 2 24705 &udf_add_aext_24705 ++wl1251_hw_init_beacon_broadcast_24707 wl1251_hw_init_beacon_broadcast 0 24707 NULL ++niu_change_mtu_24710 niu_change_mtu 0 24710 NULL ++mc13xxx_spi_write_24715 mc13xxx_spi_write 0 24715 NULL nohasharray ++wait_transaction_complete_24715 wait_transaction_complete 0 24715 &mc13xxx_spi_write_24715 ++show_ipv4_iface_dhcp_req_vendor_id_en_24718 show_ipv4_iface_dhcp_req_vendor_id_en 0 24718 NULL ++dps0_is_key_locked_24722 dps0_is_key_locked 0 24722 NULL ++st_int_ioctl_24725 st_int_ioctl 0 24725 NULL ++ip_tunnel_change_mtu_24731 ip_tunnel_change_mtu 0 24731 NULL ++simple_attr_read_24738 simple_attr_read 3-0 24738 NULL ++ath_rxbuf_alloc_24745 ath_rxbuf_alloc 2 24745 NULL ++pps_show_24748 pps_show 0 24748 NULL ++commit_rxon_24749 commit_rxon 0 24749 NULL nohasharray ++get_dma_residue_24749 get_dma_residue 0 24749 &commit_rxon_24749 ++kgdb_hex2mem_24755 kgdb_hex2mem 3 24755 NULL ++ddp_device_event_24756 ddp_device_event 0 24756 NULL ++get_temp_max_hyst_24757 get_temp_max_hyst 0 24757 NULL ++get_src_24759 get_src 0 24759 NULL ++ip_vs_local_reply4_24762 ip_vs_local_reply4 0 24762 NULL ++cgroup_attach_task_24763 cgroup_attach_task 0 24763 NULL ++xhci_change_max_exit_latency_24765 xhci_change_max_exit_latency 0 24765 NULL ++snd_cs46xx_playback_prepare_24768 snd_cs46xx_playback_prepare 0 24768 NULL nohasharray ++security_sid_to_context_24768 security_sid_to_context 0 24768 &snd_cs46xx_playback_prepare_24768 ++mI_alloc_skb_24770 mI_alloc_skb 1 24770 NULL ++isofs_statfs_24772 isofs_statfs 0 24772 NULL ++zd1201_docmd_24773 zd1201_docmd 0 24773 NULL ++snd_seq_ioctl_create_port_24774 snd_seq_ioctl_create_port 0 24774 NULL ++ocfs2_read_blocks_24777 ocfs2_read_blocks 0 24777 NULL ++skb_make_writable_24783 skb_make_writable 2 24783 NULL ++datablob_hmac_verify_24786 datablob_hmac_verify 4 24786 NULL ++pb0100_s_ctrl_24788 pb0100_s_ctrl 0 24788 NULL nohasharray ++mlx4_SET_PORT_general_24788 mlx4_SET_PORT_general 0 24788 &pb0100_s_ctrl_24788 ++cache_read_24790 cache_read 3-0 24790 NULL ++i915_gem_check_wedge_24793 i915_gem_check_wedge 0 24793 NULL ++show_unchecked_isa_dma_24796 show_unchecked_isa_dma 0 24796 NULL ++register_bcache_24797 register_bcache 0-4 24797 NULL ++unpack_str_24798 unpack_str 0 24798 NULL ++tcmu_configure_device_24799 tcmu_configure_device 0 24799 NULL nohasharray ++bcm_kona_gpio_to_irq_24799 bcm_kona_gpio_to_irq 2 24799 &tcmu_configure_device_24799 ++aty128_ddafifo_24801 aty128_ddafifo 0 24801 NULL ++get_register_page_24802 get_register_page 0 24802 NULL ++kvm_read_guest_virt_helper_24804 kvm_read_guest_virt_helper 3-1 24804 NULL ++__next_cpu_nr_24805 __next_cpu_nr 1 24805 NULL ++ath6kl_fwlog_mask_write_24810 ath6kl_fwlog_mask_write 3-0 24810 NULL ++bfad_im_node_name_show_24813 bfad_im_node_name_show 0 24813 NULL ++attr_show_args_24816 attr_show_args 0 24816 NULL ++comedi_buf_alloc_24822 comedi_buf_alloc 3 24822 NULL ++ndo_get_phys_port_id_24825 ndo_get_phys_port_id 0 24825 NULL ++brport_show_24827 brport_show 0 24827 NULL ++cuse_class_abort_store_24829 cuse_class_abort_store 0-4 24829 NULL ++transfer_commit_list_24830 transfer_commit_list 0 24830 NULL nohasharray ++rpf_s_stream_24830 rpf_s_stream 0 24830 &transfer_commit_list_24830 ++__logfs_truncate_24831 __logfs_truncate 0 24831 NULL ++reboot_24837 reboot 0-4 24837 NULL nohasharray ++__cfg80211_alloc_vendor_skb_24837 __cfg80211_alloc_vendor_skb 2 24837 &reboot_24837 ++usnic_ib_show_config_24840 usnic_ib_show_config 0 24840 NULL ++netxen_sysfs_write_mem_24841 netxen_sysfs_write_mem 0-6-5 24841 NULL ++bd2802_store_reg0x02_24843 bd2802_store_reg0x02 0-4 24843 NULL ++get_latch_status_24846 get_latch_status 0 24846 NULL ++nilfs_superblock_sb_update_frequency_store_24852 nilfs_superblock_sb_update_frequency_store 0-4 24852 NULL ++bq2415x_set_mode_24853 bq2415x_set_mode 0 24853 NULL ++pt1_i2c_xfer_24856 pt1_i2c_xfer 0-3 24856 NULL ++wl12xx_chip_wakeup_24858 wl12xx_chip_wakeup 0 24858 NULL ++cifs_negotiate_protocol_24860 cifs_negotiate_protocol 0 24860 NULL ++do_sock_write_24865 do_sock_write 0 24865 NULL ++pnp_alloc_24869 pnp_alloc 1 24869 NULL ++setup_buffering_24872 setup_buffering 0 24872 NULL ++queues_read_24877 queues_read 3-0 24877 NULL nohasharray ++part_ro_show_24877 part_ro_show 0 24877 &queues_read_24877 ++input_map_show_24878 input_map_show 0 24878 NULL ++zf_write_24882 zf_write 0-3 24882 NULL ++set_inc_all_24889 set_inc_all 4-0 24889 NULL ++store_24890 store 0 24890 NULL ++default_pvid_show_24892 default_pvid_show 0 24892 NULL nohasharray ++ext4_jbd2_file_inode_24892 ext4_jbd2_file_inode 0 24892 &default_pvid_show_24892 ++conntrack_pptp_help_24894 conntrack_pptp_help 0 24894 NULL ++bnx2i_set_ccell_info_24896 bnx2i_set_ccell_info 0-4 24896 NULL ++xfs_qm_dqattach_24898 xfs_qm_dqattach 0 24898 NULL ++work_start_24905 work_start 0 24905 NULL ++megaraid_sysfs_show_app_hndl_24908 megaraid_sysfs_show_app_hndl 0 24908 NULL nohasharray ++show_docked_24908 show_docked 0 24908 &megaraid_sysfs_show_app_hndl_24908 ++__hci_init_24909 __hci_init 0 24909 NULL ++codec_list_read_file_24910 codec_list_read_file 3-0 24910 NULL ++min_ratio_show_24911 min_ratio_show 0 24911 NULL ++device_store_bool_24912 device_store_bool 0-4 24912 NULL ++iwl_set_temperature_offset_calib_24913 iwl_set_temperature_offset_calib 0 24913 NULL ++macvlan_hard_header_24914 macvlan_hard_header 0 24914 NULL ++ocrdma_inetaddr_event_24915 ocrdma_inetaddr_event 0 24915 NULL ++xpcs_reg_value_write_24922 xpcs_reg_value_write 3 24922 NULL ++pch_gbe_get_regs_len_24924 pch_gbe_get_regs_len 0 24924 NULL ++get_compat_msghdr_24928 get_compat_msghdr 0 24928 NULL ++next_token_24929 next_token 0 24929 NULL ++fuse_getattr_24934 fuse_getattr 0 24934 NULL nohasharray ++prepare_24934 prepare 0 24934 &fuse_getattr_24934 ++regmap_spi_write_24935 regmap_spi_write 0 24935 NULL ++claim_resources_24936 claim_resources 0 24936 NULL ++fm_tx_set_pwr_lvl_24937 fm_tx_set_pwr_lvl 0 24937 NULL ++twl4030reg_enable_24940 twl4030reg_enable 0 24940 NULL nohasharray ++int3402_thermal_get_trip_temp_24940 int3402_thermal_get_trip_temp 0 24940 &twl4030reg_enable_24940 nohasharray ++hpfs_writepage_24940 hpfs_writepage 0 24940 &int3402_thermal_get_trip_temp_24940 ++reclaim_account_store_24948 reclaim_account_store 0-3 24948 NULL ++packet_sendmsg_24954 packet_sendmsg 0-4 24954 NULL ++eem_opts_host_addr_show_24956 eem_opts_host_addr_show 0 24956 NULL ++ipg_io_config_24957 ipg_io_config 0 24957 NULL ++hotkey_radio_sw_show_24960 hotkey_radio_sw_show 0 24960 NULL nohasharray ++nfs4_proc_getattr_24960 nfs4_proc_getattr 0 24960 &hotkey_radio_sw_show_24960 ++sys_rt_sigpending_24961 sys_rt_sigpending 2 24961 NULL ++store_ctlr_enabled_24970 store_ctlr_enabled 0-4 24970 NULL ++ensure_wear_leveling_24971 ensure_wear_leveling 0 24971 NULL ++twl_i2c_write_u8_24976 twl_i2c_write_u8 3-0 24976 NULL ++nf_nat_sdp_port_24977 nf_nat_sdp_port 7 24977 NULL ++cancel_store_24982 cancel_store 0-4 24982 NULL ++llc_ui_sendmsg_24987 llc_ui_sendmsg 4-0 24987 NULL nohasharray ++ath10k_fw_crash_dump_read_24987 ath10k_fw_crash_dump_read 3-0 24987 &llc_ui_sendmsg_24987 ++get_eeprom_len_24988 get_eeprom_len 0 24988 NULL nohasharray ++info_debugfs_read_helper_24988 info_debugfs_read_helper 0 24988 &get_eeprom_len_24988 ++mce_chrdev_read_24989 mce_chrdev_read 0-3 24989 NULL ++uvc_init_video_isoc_24992 uvc_init_video_isoc 0 24992 NULL ++profiling_store_24997 profiling_store 0-4 24997 NULL ++dibusb_i2c_xfer_24998 dibusb_i2c_xfer 0-3 24998 NULL ++slot_get_24999 slot_get 0 24999 NULL ++genwqe_user_vmap_25003 genwqe_user_vmap 4 25003 NULL nohasharray ++key_conf_hw_key_idx_read_25003 key_conf_hw_key_idx_read 3-0 25003 &genwqe_user_vmap_25003 ++il_dbgfs_channels_read_25005 il_dbgfs_channels_read 3-0 25005 NULL ++mmc_oemid_show_25013 mmc_oemid_show 0 25013 NULL nohasharray ++set_in0_min_25013 set_in0_min 0-4 25013 &mmc_oemid_show_25013 ++nfs4_set_lock_state_25017 nfs4_set_lock_state 0 25017 NULL nohasharray ++tg3_readphy_25017 tg3_readphy 0 25017 &nfs4_set_lock_state_25017 ++tx_errors_show_25018 tx_errors_show 0 25018 NULL ++show_session_param_ISCSI_PARAM_USERNAME_25024 show_session_param_ISCSI_PARAM_USERNAME 0 25024 NULL ++user_pin_configs_store_25027 user_pin_configs_store 0-4 25027 NULL ++phy_interface_show_25036 phy_interface_show 0 25036 NULL nohasharray ++nfs_dns_resolve_name_25036 nfs_dns_resolve_name 3 25036 &phy_interface_show_25036 ++i2400m_open_25041 i2400m_open 0 25041 NULL ++wlcore_cmd_send_failsafe_25042 wlcore_cmd_send_failsafe 0 25042 NULL nohasharray ++store_speed_tolerance_25042 store_speed_tolerance 0-4 25042 &wlcore_cmd_send_failsafe_25042 ++removable_store_25044 removable_store 0-3 25044 NULL ++wl1271_acx_pm_config_25048 wl1271_acx_pm_config 0 25048 NULL ++wait_for_completion_interruptible_timeout_25050 wait_for_completion_interruptible_timeout 0 25050 NULL ++ds2780_read_param_eeprom_bin_25055 ds2780_read_param_eeprom_bin 6-5-0 25055 NULL nohasharray ++configfs_composite_bind_25055 configfs_composite_bind 0 25055 &ds2780_read_param_eeprom_bin_25055 nohasharray ++hw_ep_prime_25055 hw_ep_prime 0 25055 &configfs_composite_bind_25055 ++show_rtc_25056 show_rtc 0 25056 NULL ++pptp_create_25064 pptp_create 0 25064 NULL ++tun_get_user_25067 tun_get_user 0 25067 NULL nohasharray ++gs_buf_alloc_25067 gs_buf_alloc 2 25067 &tun_get_user_25067 ++target_core_alua_tg_pt_gp_show_attr_trans_delay_msecs_25068 target_core_alua_tg_pt_gp_show_attr_trans_delay_msecs 0 25068 NULL nohasharray ++ll_track_pid_seq_write_25068 ll_track_pid_seq_write 3 25068 &target_core_alua_tg_pt_gp_show_attr_trans_delay_msecs_25068 ++do_add_page_to_bio_25071 do_add_page_to_bio 2 25071 NULL ++SYSC_listxattr_25072 SYSC_listxattr 3 25072 NULL ++vsp1_entity_set_streaming_25073 vsp1_entity_set_streaming 0 25073 NULL ++it8708_get_rx_bytes_25079 it8708_get_rx_bytes 0 25079 NULL ++ext3_xattr_user_list_25084 ext3_xattr_user_list 0-5 25084 NULL ++ceph_osdc_writepages_25085 ceph_osdc_writepages 0 25085 NULL ++tsf_read_file_25086 tsf_read_file 0 25086 NULL nohasharray ++chip_gpio_request_25086 chip_gpio_request 0 25086 &tsf_read_file_25086 ++rt2x00mac_get_stats_25087 rt2x00mac_get_stats 0 25087 NULL ++ubifs_write_inode_25089 ubifs_write_inode 0 25089 NULL ++iwl_dbgfs_tx_flush_write_25091 iwl_dbgfs_tx_flush_write 0-3 25091 NULL ++alb_set_mac_address_25093 alb_set_mac_address 0 25093 NULL ++pci_bus_set_aer_ops_25095 pci_bus_set_aer_ops 0 25095 NULL ++ath5k_attr_show_ani_mode_25098 ath5k_attr_show_ani_mode 0 25098 NULL ++wm831x_aldo_get_status_25102 wm831x_aldo_get_status 0 25102 NULL ++statfs_25104 statfs 0 25104 NULL nohasharray ++action_store_25104 action_store 0-3 25104 &statfs_25104 ++reiserfs_freeze_25105 reiserfs_freeze 0 25105 NULL ++snd_rawmidi_kernel_write_25106 snd_rawmidi_kernel_write 3 25106 NULL ++sisusb_read_memio_24bit_25109 sisusb_read_memio_24bit 0 25109 NULL ++mlx4_cmd_poll_25112 mlx4_cmd_poll 0 25112 NULL ++acpi_ex_create_method_25115 acpi_ex_create_method 0 25115 NULL nohasharray ++smb2_reconnect_25115 smb2_reconnect 0 25115 &acpi_ex_create_method_25115 nohasharray ++hci_req_add_ev_25115 hci_req_add_ev 3 25115 &smb2_reconnect_25115 ++rtl2832_sdr_rd_regs_25119 rtl2832_sdr_rd_regs 0 25119 NULL ++wl18xx_acx_set_checksum_state_25124 wl18xx_acx_set_checksum_state 0 25124 NULL ++lpfc_ack0_show_25126 lpfc_ack0_show 0 25126 NULL ++caif_connect_client_25127 caif_connect_client 0 25127 NULL nohasharray ++vmlfb_check_var_locked_25127 vmlfb_check_var_locked 0 25127 &caif_connect_client_25127 ++ses_probe_25128 ses_probe 0 25128 NULL ++gfs2_quota_check_25130 gfs2_quota_check 0 25130 NULL ++iwl_mvm_get_temp_25131 iwl_mvm_get_temp 0 25131 NULL ++snd_via82xx_pcm_trigger_25133 snd_via82xx_pcm_trigger 0 25133 NULL ++lpfc_soft_wwn_enable_store_25137 lpfc_soft_wwn_enable_store 0-4 25137 NULL ++fs32_to_cpu_25143 fs32_to_cpu 0 25143 NULL nohasharray ++es_ui_show_25143 es_ui_show 0 25143 &fs32_to_cpu_25143 ++reiserfs_commit_write_25144 reiserfs_commit_write 0 25144 NULL ++pagesize_show_25147 pagesize_show 0 25147 NULL ++pch_phub_bin_read_25148 pch_phub_bin_read 0-5-6 25148 NULL ++ath6kl_wmi_set_keepalive_cmd_25149 ath6kl_wmi_set_keepalive_cmd 0 25149 NULL ++cnt_ctl_show_25157 cnt_ctl_show 0 25157 NULL nohasharray ++atyfb_reboot_notify_25157 atyfb_reboot_notify 0 25157 &cnt_ctl_show_25157 ++show_eeprom2_25159 show_eeprom2 0 25159 NULL ++netxen_nic_request_irq_25161 netxen_nic_request_irq 0 25161 NULL ++anatop_regmap_disable_25164 anatop_regmap_disable 0 25164 NULL ++sys_fgetxattr_25166 sys_fgetxattr 4 25166 NULL nohasharray ++rose_create_25166 rose_create 0 25166 &sys_fgetxattr_25166 ++ipath_init_qp_table_25167 ipath_init_qp_table 2 25167 NULL nohasharray ++sethdraddr_25167 sethdraddr 0 25167 &ipath_init_qp_table_25167 ++show_src_clock_25168 show_src_clock 0 25168 NULL ++ath10k_pci_wait_for_target_init_25174 ath10k_pci_wait_for_target_init 0 25174 NULL ++fit2_read_regr_25176 fit2_read_regr 0 25176 NULL ++__ims_pcu_execute_command_25178 __ims_pcu_execute_command 0 25178 NULL nohasharray ++wusb_set_dev_addr_25178 wusb_set_dev_addr 0 25178 &__ims_pcu_execute_command_25178 nohasharray ++sctp_getsockopt_local_addrs_25178 sctp_getsockopt_local_addrs 2 25178 &wusb_set_dev_addr_25178 ++cbaf_wusb_host_name_store_25185 cbaf_wusb_host_name_store 0-4 25185 NULL ++ks8851_rdreg32_25187 ks8851_rdreg32 0 25187 NULL ++nes_store_ee_data_25190 nes_store_ee_data 0-3 25190 NULL ++sbp_tpg_store_enable_25193 sbp_tpg_store_enable 0-3 25193 NULL ++nilfs_prepare_segment_lock_25203 nilfs_prepare_segment_lock 0 25203 NULL ++patch_alc662_25213 patch_alc662 0 25213 NULL ++show_thresh_either_en_25218 show_thresh_either_en 0 25218 NULL ++open_rx_first_25220 open_rx_first 0 25220 NULL ++security_socket_post_create_25221 security_socket_post_create 0 25221 NULL ++ocfs2_block_check_compute_25223 ocfs2_block_check_compute 2 25223 NULL ++b43legacy_op_get_stats_25225 b43legacy_op_get_stats 0 25225 NULL ++ieee80211_start_tx_ba_session_25229 ieee80211_start_tx_ba_session 0 25229 NULL ++sonypi_misc_read_25230 sonypi_misc_read 0-3 25230 NULL ++show_temp_auto_offset_hyst_25233 show_temp_auto_offset_hyst 0 25233 NULL ++bq2415x_sysfs_show_status_25234 bq2415x_sysfs_show_status 0 25234 NULL nohasharray ++lbs_set_11d_domain_info_25234 lbs_set_11d_domain_info 0 25234 &bq2415x_sysfs_show_status_25234 ++target_stat_scsi_tgt_dev_show_attr_status_25235 target_stat_scsi_tgt_dev_show_attr_status 0 25235 NULL ++__hfsplus_delete_attr_25237 __hfsplus_delete_attr 0 25237 NULL ++mon_stat_read_25238 mon_stat_read 3-0 25238 NULL ++atl2_set_mac_25239 atl2_set_mac 0 25239 NULL ++nilfs_palloc_find_available_slot_25245 nilfs_palloc_find_available_slot 3-5 25245 NULL ++_ctl_board_assembly_show_25247 _ctl_board_assembly_show 0 25247 NULL ++ivtv_firmware_restart_25248 ivtv_firmware_restart 0 25248 NULL ++t4vf_read_rss_vi_config_25254 t4vf_read_rss_vi_config 0 25254 NULL ++stripe_status_25259 stripe_status 5 25259 NULL ++mmc_power_restore_host_25263 mmc_power_restore_host 0 25263 NULL ++xen_pcpu_up_25265 xen_pcpu_up 0 25265 NULL ++snd_pcm_start_25273 snd_pcm_start 0 25273 NULL nohasharray ++kone_sysfs_show_weight_25273 kone_sysfs_show_weight 0 25273 &snd_pcm_start_25273 ++cciss_show_lunid_25274 cciss_show_lunid 0 25274 NULL ++batadv_algo_select_25275 batadv_algo_select 0 25275 NULL ++crypto_alloc_instance2_25277 crypto_alloc_instance2 3 25277 NULL ++vfs_writev_25278 vfs_writev 3 25278 NULL ++protocol_show_25279 protocol_show 0 25279 NULL ++fc_parse_wwn_25280 fc_parse_wwn 0 25280 NULL ++ray_suspend_25281 ray_suspend 0 25281 NULL ++spi_sync_transfer_25282 spi_sync_transfer 0 25282 NULL ++nibble_read_data_25285 nibble_read_data 0 25285 NULL nohasharray ++sysfs_unbind_tick_dev_25285 sysfs_unbind_tick_dev 0-4 25285 &nibble_read_data_25285 ++l2tp_session_create_25286 l2tp_session_create 1 25286 NULL nohasharray ++adp8870_bl_l3_office_max_show_25286 adp8870_bl_l3_office_max_show 0 25286 &l2tp_session_create_25286 nohasharray ++__ax88179_write_cmd_25286 __ax88179_write_cmd 0 25286 &adp8870_bl_l3_office_max_show_25286 ++mt9t112_g_fmt_25287 mt9t112_g_fmt 0 25287 NULL nohasharray ++ib_query_device_25287 ib_query_device 0 25287 &mt9t112_g_fmt_25287 ++c2port_read_flash_data_25296 c2port_read_flash_data 0-6-5 25296 NULL ++viafb_check_var_25297 viafb_check_var 0 25297 NULL ++patch_generic_hdmi_25299 patch_generic_hdmi 0 25299 NULL ++usb6fire_pcm_stream_start_25305 usb6fire_pcm_stream_start 0 25305 NULL ++read8_reg_25307 read8_reg 4-0 25307 NULL ++firm_open_25313 firm_open 0 25313 NULL ++cx25821_write_frame_25315 cx25821_write_frame 3-0 25315 NULL nohasharray ++rtl8139_get_regs_len_25315 rtl8139_get_regs_len 0 25315 &cx25821_write_frame_25315 nohasharray ++kvm_cpu_notify_25315 kvm_cpu_notify 0 25315 &rtl8139_get_regs_len_25315 ++ath9k_debugfs_read_buf_25316 ath9k_debugfs_read_buf 3-0 25316 NULL nohasharray ++help_25316 help 5 25316 &ath9k_debugfs_read_buf_25316 ++sp5100_tco_write_25320 sp5100_tco_write 0-3 25320 NULL nohasharray ++lp5562_store_pattern_25320 lp5562_store_pattern 0-4 25320 &sp5100_tco_write_25320 ++print_state_25323 print_state 0 25323 NULL ++f2fs_write_begin_25324 f2fs_write_begin 0 25324 NULL nohasharray ++store_command_event_reg_25324 store_command_event_reg 0-4 25324 &f2fs_write_begin_25324 ++get_bay_identifier_25326 get_bay_identifier 0 25326 NULL ++max_sync_store_25329 max_sync_store 0-3 25329 NULL ++usX2Y_format_set_25330 usX2Y_format_set 0 25330 NULL ++show_rps_map_25336 show_rps_map 0 25336 NULL ++atmel_open_25343 atmel_open 0 25343 NULL nohasharray ++store_weight_temp_25343 store_weight_temp 0-4 25343 &atmel_open_25343 ++sn9c2028_read1_25344 sn9c2028_read1 0 25344 NULL ++dump_align_25345 dump_align 2 25345 NULL ++wait_for_completion_killable_25352 wait_for_completion_killable 0 25352 NULL ++show_sas_phy_invalid_dword_count_25354 show_sas_phy_invalid_dword_count 0 25354 NULL ++cpia_usb_transferCmd_25358 cpia_usb_transferCmd 0 25358 NULL ++m48t35_read_time_25359 m48t35_read_time 0 25359 NULL nohasharray ++fuse_writepages_25359 fuse_writepages 0 25359 &m48t35_read_time_25359 ++SYSC_kexec_load_25361 SYSC_kexec_load 2 25361 NULL nohasharray ++snd_vortex_pcm_prepare_25361 snd_vortex_pcm_prepare 0 25361 &SYSC_kexec_load_25361 ++net2272_enable_25362 net2272_enable 0 25362 NULL ++o2net_send_tcp_msg_25367 o2net_send_tcp_msg 4 25367 NULL ++unix_mkname_25368 unix_mkname 0-2 25368 NULL nohasharray ++rio_destid_next_25368 rio_destid_next 2-0 25368 &unix_mkname_25368 ++sel_read_mls_25369 sel_read_mls 3-0 25369 NULL nohasharray ++flock_lock_file_25369 flock_lock_file 0 25369 &sel_read_mls_25369 ++wl1251_cmd_send_25374 wl1251_cmd_send 0 25374 NULL ++rh_queue_status_25378 rh_queue_status 0 25378 NULL nohasharray ++probe_25378 probe 0 25378 &rh_queue_status_25378 ++acpi_pad_idlepct_store_25379 acpi_pad_idlepct_store 0-4 25379 NULL ++part_alignment_offset_show_25380 part_alignment_offset_show 0 25380 NULL ++ep_queue_25382 ep_queue 0 25382 NULL ++sis96x_access_25383 sis96x_access 0 25383 NULL ++wlcore_raw_write_25387 wlcore_raw_write 0 25387 NULL ++command_setyuvtresh_25390 command_setyuvtresh 0 25390 NULL nohasharray ++khugepaged_max_ptes_none_store_25390 khugepaged_max_ptes_none_store 0-4 25390 &command_setyuvtresh_25390 nohasharray ++SyS_splice_25390 SyS_splice 5 25390 &khugepaged_max_ptes_none_store_25390 ++show_truinst_25392 show_truinst 0 25392 NULL ++pci_slot_attr_store_25399 pci_slot_attr_store 0-4 25399 NULL ++snd_pcm_pre_drain_init_25401 snd_pcm_pre_drain_init 0 25401 NULL nohasharray ++adm8211_get_stats_25401 adm8211_get_stats 0 25401 &snd_pcm_pre_drain_init_25401 ++aac_show_kernel_version_25404 aac_show_kernel_version 0 25404 NULL nohasharray ++kovaplus_sysfs_read_info_25404 kovaplus_sysfs_read_info 0-5-6 25404 &aac_show_kernel_version_25404 ++vsp1_entity_init_25407 vsp1_entity_init 3 25407 NULL nohasharray ++set_blue_25407 set_blue 0-4 25407 &vsp1_entity_init_25407 ++ebt_buf_add_pad_25413 ebt_buf_add_pad 0 25413 NULL ++_gpiod_direction_output_raw_25414 _gpiod_direction_output_raw 0 25414 NULL ++mcp795_rtcc_read_25415 mcp795_rtcc_read 0-4 25415 NULL nohasharray ++raid0_run_25415 raid0_run 0 25415 &mcp795_rtcc_read_25415 ++par96_open_25418 par96_open 0 25418 NULL ++dai_list_read_file_25421 dai_list_read_file 3-0 25421 NULL nohasharray ++asd_show_dev_rev_25421 asd_show_dev_rev 0 25421 &dai_list_read_file_25421 nohasharray ++smsc75xx_manage_power_25421 smsc75xx_manage_power 0 25421 &asd_show_dev_rev_25421 ++pinctrl_gpio_direction_25423 pinctrl_gpio_direction 0 25423 NULL ++v4l2_m2m_dqbuf_25427 v4l2_m2m_dqbuf 0 25427 NULL ++snd_pcm_lib_ioctl_reset_25437 snd_pcm_lib_ioctl_reset 0 25437 NULL ++target_core_dev_wwn_show_attr_vpd_assoc_target_port_25438 target_core_dev_wwn_show_attr_vpd_assoc_target_port 0 25438 NULL ++pcmcia_store_new_id_25439 pcmcia_store_new_id 0-3 25439 NULL ++aux_firmware_rev_show_25443 aux_firmware_rev_show 0 25443 NULL ++ath10k_wmi_vdev_create_25447 ath10k_wmi_vdev_create 0 25447 NULL ++xfs_qm_dqtobp_25448 xfs_qm_dqtobp 0 25448 NULL ++show_fnode_ipv6_flow_label_25449 show_fnode_ipv6_flow_label 0 25449 NULL ++pages_to_scan_show_25454 pages_to_scan_show 0 25454 NULL ++print_name_25459 print_name 0 25459 NULL nohasharray ++show_engine3_leds_25459 show_engine3_leds 0 25459 &print_name_25459 nohasharray ++st_gyro_trig_set_state_25459 st_gyro_trig_set_state 0 25459 &show_engine3_leds_25459 ++ath6kl_wmi_beginscan_cmd_25462 ath6kl_wmi_beginscan_cmd 8 25462 NULL ++dma_map_sg_nonforce_25469 dma_map_sg_nonforce 0-3 25469 NULL ++mem_cgroup_force_empty_25473 mem_cgroup_force_empty 0 25473 NULL ++buffer_prepare_25476 buffer_prepare 0 25476 NULL ++show_bl_curve_25479 show_bl_curve 0 25479 NULL ++get_rx_bytes_25485 get_rx_bytes 0 25485 NULL ++bh1770_prox_range_show_25487 bh1770_prox_range_show 0 25487 NULL ++i2c_nuvoton_wait_for_data_avail_25489 i2c_nuvoton_wait_for_data_avail 0 25489 NULL ++read_cmd_25491 read_cmd 0 25491 NULL ++acpi_ut_add_address_range_25492 acpi_ut_add_address_range 0 25492 NULL ++smb2_async_writev_25494 smb2_async_writev 0 25494 NULL ++dev_show_unique_id_25495 dev_show_unique_id 0 25495 NULL nohasharray ++do_tcp_setsockopt_25495 do_tcp_setsockopt 0 25495 &dev_show_unique_id_25495 ++generic_hdmi_build_jack_25496 generic_hdmi_build_jack 0 25496 NULL ++beiscsi_get_host_param_25497 beiscsi_get_host_param 0 25497 NULL ++llc_ui_setsockopt_25501 llc_ui_setsockopt 0 25501 NULL nohasharray ++ocfs2_hamming_encode_25501 ocfs2_hamming_encode 3 25501 &llc_ui_setsockopt_25501 ++ivtv_buf_copy_from_user_25502 ivtv_buf_copy_from_user 4-0 25502 NULL ++snd_pcm_plugin_build_25505 snd_pcm_plugin_build 5-0 25505 NULL nohasharray ++__orinoco_hw_set_wap_25505 __orinoco_hw_set_wap 0 25505 &snd_pcm_plugin_build_25505 ++mt9m001_s_crop_25508 mt9m001_s_crop 0 25508 NULL nohasharray ++store_new_id_25508 store_new_id 0-3 25508 &mt9m001_s_crop_25508 ++__cfq_set_weight_25510 __cfq_set_weight 0 25510 NULL ++parport_uss720_epp_write_data_25512 parport_uss720_epp_write_data 0 25512 NULL ++xfs_alloc_fix_freelist_25514 xfs_alloc_fix_freelist 0 25514 NULL nohasharray ++wl12xx_enable_interrupts_25514 wl12xx_enable_interrupts 0 25514 &xfs_alloc_fix_freelist_25514 ++skein_1024_final_25515 skein_1024_final 0 25515 NULL ++mci_reset_counters_store_25517 mci_reset_counters_store 0-4 25517 NULL ++sb_permission_25523 sb_permission 0 25523 NULL nohasharray ++beiscsi_active_session_disp_25523 beiscsi_active_session_disp 0 25523 &sb_permission_25523 ++bfs_readpage_25524 bfs_readpage 0 25524 NULL ++ad9523_show_25530 ad9523_show 0 25530 NULL ++smb2_negotiate_25531 smb2_negotiate 0 25531 NULL ++b43_phy_init_25534 b43_phy_init 0 25534 NULL ++num_reads_show_25535 num_reads_show 0 25535 NULL ++ext3_get_inode_loc_25542 ext3_get_inode_loc 0 25542 NULL nohasharray ++iwl_mvm_send_cmd_status_25542 iwl_mvm_send_cmd_status 0 25542 &ext3_get_inode_loc_25542 ++ieee80211_if_read_path_refresh_time_25545 ieee80211_if_read_path_refresh_time 3-0 25545 NULL ++wimax_addr_scnprint_25548 wimax_addr_scnprint 2 25548 NULL ++store_octave_25552 store_octave 0-4 25552 NULL ++compat_sys_sendfile64_25553 compat_sys_sendfile64 4 25553 NULL nohasharray ++integrity_verify_store_25553 integrity_verify_store 0-3 25553 &compat_sys_sendfile64_25553 ++ht_print_chan_25556 ht_print_chan 0-4-3 25556 NULL nohasharray ++sidtab_insert_25556 sidtab_insert 0 25556 &ht_print_chan_25556 ++is_a_peripheral_show_25558 is_a_peripheral_show 0 25558 NULL ++read_dscorr_25560 read_dscorr 0 25560 NULL ++reload_for_cpu_25563 reload_for_cpu 0 25563 NULL ++local_cpulist_show_25564 local_cpulist_show 0 25564 NULL ++skb_tailroom_25567 skb_tailroom 0 25567 NULL ++iscsi_tpg_attrib_show_netif_timeout_25572 iscsi_tpg_attrib_show_netif_timeout 0 25572 NULL ++bq2415x_i2c_write_mask_25585 bq2415x_i2c_write_mask 0 25585 NULL ++crypto_blkcipher_ctxsize_25594 crypto_blkcipher_ctxsize 0 25594 NULL ++ping_recvmsg_25597 ping_recvmsg 0-4 25597 NULL ++__devres_alloc_25598 __devres_alloc 2 25598 NULL ++hfsplus_removexattr_25599 hfsplus_removexattr 0 25599 NULL ++sht15_measurement_25600 sht15_measurement 0 25600 NULL nohasharray ++iscsi_tpg_param_show_DataDigest_25600 iscsi_tpg_param_show_DataDigest 0 25600 &sht15_measurement_25600 ++lm3533_als_get_zone_25601 lm3533_als_get_zone 0 25601 NULL ++open_tx_25605 open_tx 0 25605 NULL ++ddp_ppod_write_idata_25610 ddp_ppod_write_idata 5 25610 NULL ++chksum_init_25613 chksum_init 0 25613 NULL ++bh1780_store_power_state_25614 bh1780_store_power_state 0-4 25614 NULL ++nilfs_permission_25619 nilfs_permission 0 25619 NULL ++carl9170_debugfs_hw_ioread32_write_25622 carl9170_debugfs_hw_ioread32_write 0-3 25622 NULL ++proc_coredump_filter_write_25625 proc_coredump_filter_write 3-0 25625 NULL ++befs_utf2nls_25628 befs_utf2nls 3 25628 NULL nohasharray ++__get_user_pages_25628 __get_user_pages 0 25628 &befs_utf2nls_25628 ++sctp_connect_25631 sctp_connect 0 25631 NULL nohasharray ++nes_netdev_change_mtu_25631 nes_netdev_change_mtu 0 25631 &sctp_connect_25631 ++hfs_getxattr_25633 hfs_getxattr 0 25633 NULL ++lbs_prb_rsp_limit_set_25634 lbs_prb_rsp_limit_set 0-4 25634 NULL ++musb_gadget_start_25636 musb_gadget_start 0 25636 NULL ++rt2x00debug_read_csr_25639 rt2x00debug_read_csr 0-3 25639 NULL ++tomoyo_socket_sendmsg_25642 tomoyo_socket_sendmsg 0 25642 NULL ++bNumConfigurations_show_25645 bNumConfigurations_show 0 25645 NULL ++pci_device_update_fixed_25647 pci_device_update_fixed 0 25647 NULL ++zatm_send_25650 zatm_send 0 25650 NULL ++set_acpi_25652 set_acpi 0 25652 NULL ++bd2802_show_adv_conf_25660 bd2802_show_adv_conf 0 25660 NULL ++mlx4_QP_ATTACH_25661 mlx4_QP_ATTACH 0 25661 NULL ++ext2_try_to_allocate_25667 ext2_try_to_allocate 2-0-4 25667 NULL ++ivtv_s_video_encoding_25669 ivtv_s_video_encoding 0 25669 NULL nohasharray ++i7core_inject_show_col_25669 i7core_inject_show_col 0 25669 &ivtv_s_video_encoding_25669 nohasharray ++aircable_prepare_write_buffer_25669 aircable_prepare_write_buffer 3 25669 &i7core_inject_show_col_25669 ++lpfc_idiag_cmd_get_25672 lpfc_idiag_cmd_get 2-0 25672 NULL ++ixgbevf_poll_for_ack_25675 ixgbevf_poll_for_ack 0 25675 NULL ++unix_getname_25678 unix_getname 0 25678 NULL ++netconsole_target_attr_store_25683 netconsole_target_attr_store 0 25683 NULL ++total_objects_show_25687 total_objects_show 0 25687 NULL ++sta_inactive_ms_read_25690 sta_inactive_ms_read 3-0 25690 NULL ++ssb_pcmcia_attr_sprom_show_25691 ssb_pcmcia_attr_sprom_show 0 25691 NULL nohasharray ++show_fnode_link_local_ipv6_25691 show_fnode_link_local_ipv6 0 25691 &ssb_pcmcia_attr_sprom_show_25691 ++prom_early_alloc_25692 prom_early_alloc 1 25692 NULL ++sdricoh_pcmcia_resume_25695 sdricoh_pcmcia_resume 0 25695 NULL ++inet_recvmsg_25696 inet_recvmsg 4-0 25696 NULL ++alloc_ring_25697 alloc_ring 0 25697 NULL ++wm831x_status_src_store_25699 wm831x_status_src_store 0-4 25699 NULL ++privsize_25701 privsize 0 25701 NULL ++ebitmap_start_positive_25703 ebitmap_start_positive 0 25703 NULL ++__blk_rq_unmap_user_25708 __blk_rq_unmap_user 0 25708 NULL ++mxl111sf_tuner_read_reg_25710 mxl111sf_tuner_read_reg 0 25710 NULL nohasharray ++show_camera_25710 show_camera 0 25710 &mxl111sf_tuner_read_reg_25710 ++acpi_ds_create_index_field_25711 acpi_ds_create_index_field 0 25711 NULL ++rx_filter_mc_filter_read_25712 rx_filter_mc_filter_read 3-0 25712 NULL ++koneplus_sysfs_read_profile_buttons_25713 koneplus_sysfs_read_profile_buttons 0-5-6 25713 NULL ++ibmasm_new_command_25714 ibmasm_new_command 2 25714 NULL ++rx_queue_entry_next_25715 rx_queue_entry_next 0 25715 NULL ++packet_bind_spkt_25717 packet_bind_spkt 0 25717 NULL ++il3945_show_status_25719 il3945_show_status 0 25719 NULL nohasharray ++ubifs_return_leb_25719 ubifs_return_leb 0 25719 &il3945_show_status_25719 ++spmi_ext_register_write_25722 spmi_ext_register_write 0 25722 NULL nohasharray ++mlx4_register_mac_25722 mlx4_register_mac 0 25722 &spmi_ext_register_write_25722 ++switch_partition_25723 switch_partition 0 25723 NULL ++eth_bind_25725 eth_bind 0 25725 NULL ++__alloc_bootmem_low_node_25726 __alloc_bootmem_low_node 2 25726 NULL nohasharray ++sel_write_context_25726 sel_write_context 3 25726 &__alloc_bootmem_low_node_25726 ++show_ipv4_iface_dhcp_slp_da_info_en_25728 show_ipv4_iface_dhcp_slp_da_info_en 0 25728 NULL ++blk_mq_hw_sysfs_tags_show_25730 blk_mq_hw_sysfs_tags_show 0 25730 NULL ++raw_getname_25732 raw_getname 0 25732 NULL nohasharray ++cifs_read_from_socket_25732 cifs_read_from_socket 3-0 25732 &raw_getname_25732 ++mcs_unwrap_fir_25733 mcs_unwrap_fir 3 25733 NULL ++ext2_find_near_25734 ext2_find_near 0 25734 NULL nohasharray ++_ctl_version_bios_show_25734 _ctl_version_bios_show 0 25734 &ext2_find_near_25734 ++vx_set_format_25741 vx_set_format 0 25741 NULL ++product_id_show_25743 product_id_show 0 25743 NULL nohasharray ++iscsi_conn_get_param_25743 iscsi_conn_get_param 0 25743 &product_id_show_25743 nohasharray ++_softing_fct_cmd_25743 _softing_fct_cmd 0 25743 &iscsi_conn_get_param_25743 nohasharray ++xgbe_common_read_25743 xgbe_common_read 2 25743 &_softing_fct_cmd_25743 ++cxgbi_device_portmap_create_25747 cxgbi_device_portmap_create 3 25747 NULL ++show_sas_end_dev_initiator_response_timeout_25753 show_sas_end_dev_initiator_response_timeout 0 25753 NULL ++tpm_tis_send_25755 tpm_tis_send 0-3 25755 NULL nohasharray ++fmc_write_eeprom_25755 fmc_write_eeprom 0-6-5 25755 &tpm_tis_send_25755 ++netxen_sysfs_validate_crb_25756 netxen_sysfs_validate_crb 0 25756 NULL ++print_block_size_25763 print_block_size 0 25763 NULL nohasharray ++uart_get_attr_line_25763 uart_get_attr_line 0 25763 &print_block_size_25763 ++csio_t5_edc_read_25765 csio_t5_edc_read 0 25765 NULL ++stac_parse_auto_config_25768 stac_parse_auto_config 0 25768 NULL ++sha512_ssse3_final_25778 sha512_ssse3_final 0 25778 NULL ++bonding_show_mode_25785 bonding_show_mode 0 25785 NULL ++chv_gpio_direction_output_25788 chv_gpio_direction_output 0 25788 NULL ++pci_dev_reset_slot_function_25789 pci_dev_reset_slot_function 0 25789 NULL ++event_rx_pool_read_25792 event_rx_pool_read 3-0 25792 NULL ++read_delin_25798 read_delin 0 25798 NULL ++sg_read_25799 sg_read 3-0 25799 NULL ++xfs_alloc_ag_vextent_exact_25810 xfs_alloc_ag_vextent_exact 0 25810 NULL nohasharray ++wacom_btnimg4_store_25810 wacom_btnimg4_store 4-0 25810 &xfs_alloc_ag_vextent_exact_25810 ++alx_request_irq_25811 alx_request_irq 0 25811 NULL ++s5m_rtc_set_alarm_25813 s5m_rtc_set_alarm 0 25813 NULL ++system_enable_read_25815 system_enable_read 3 25815 NULL ++realloc_buffer_25816 realloc_buffer 2 25816 NULL nohasharray ++brcmf_sdio_verifymemory_25816 brcmf_sdio_verifymemory 4 25816 &realloc_buffer_25816 ++pwr_missing_bcns_read_25824 pwr_missing_bcns_read 3-0 25824 NULL nohasharray ++rand_en_show_25824 rand_en_show 0 25824 &pwr_missing_bcns_read_25824 ++ubifs_orphan_start_commit_25825 ubifs_orphan_start_commit 0 25825 NULL ++atl1c_configure_25826 atl1c_configure 0 25826 NULL ++show_red_25831 show_red 0 25831 NULL nohasharray ++_ctl_version_nvdata_default_show_25831 _ctl_version_nvdata_default_show 0 25831 &show_red_25831 ++f2fs_write_data_page_25834 f2fs_write_data_page 0 25834 NULL ++v9fs_vfs_writepage_locked_25844 v9fs_vfs_writepage_locked 0 25844 NULL ++tg3_change_mtu_25849 tg3_change_mtu 0 25849 NULL ++i2400m_set_idle_timeout_25850 i2400m_set_idle_timeout 0 25850 NULL ++snd_soc_component_update_bits_25854 snd_soc_component_update_bits 0 25854 NULL ++parport_read_25855 parport_read 0 25855 NULL ++acpi_ds_result_stack_push_25857 acpi_ds_result_stack_push 0 25857 NULL ++level_show_25858 level_show 0 25858 NULL ++zcomp_available_show_25860 zcomp_available_show 0 25860 NULL ++m88rs6000t_get_if_frequency_25863 m88rs6000t_get_if_frequency 0 25863 NULL ++null_build_header_25866 null_build_header 0 25866 NULL ++show_iface_def_taskmgmt_tmo_25867 show_iface_def_taskmgmt_tmo 0 25867 NULL ++smbus_xfer_25868 smbus_xfer 0 25868 NULL ++__uncore_count_mode_show_25871 __uncore_count_mode_show 0 25871 NULL nohasharray ++rt2x00lib_enable_radio_25871 rt2x00lib_enable_radio 0 25871 &__uncore_count_mode_show_25871 ++wl1271_init_sta_beacon_filter_25874 wl1271_init_sta_beacon_filter 0 25874 NULL ++fix_io_25879 fix_io 0 25879 NULL nohasharray ++tg3_ptp_enable_25879 tg3_ptp_enable 0 25879 &fix_io_25879 ++mcs7830_get_regs_len_25880 mcs7830_get_regs_len 0 25880 NULL ++ath6kl_regread_read_25884 ath6kl_regread_read 3-0 25884 NULL ++acf_status_25890 acf_status 0 25890 NULL ++s5m8767_rtc_set_alarm_reg_25891 s5m8767_rtc_set_alarm_reg 0 25891 NULL ++run_delalloc_nocow_25896 run_delalloc_nocow 3-4-0 25896 NULL ++sisusbcon_scroll_area_25899 sisusbcon_scroll_area 3-4 25899 NULL ++tua9001_wr_reg_25907 tua9001_wr_reg 0 25907 NULL nohasharray ++scsi_remove_single_device_25907 scsi_remove_single_device 0 25907 &tua9001_wr_reg_25907 ++nvme_trans_mode_page_create_25908 nvme_trans_mode_page_create 7-4 25908 NULL nohasharray ++sisfb_do_set_var_25908 sisfb_do_set_var 0 25908 &nvme_trans_mode_page_create_25908 ++do_jffs2_setxattr_25910 do_jffs2_setxattr 5-0 25910 NULL ++send_purge_25911 send_purge 0 25911 NULL ++resume_store_25917 resume_store 0-4 25917 NULL ++rcname_read_25919 rcname_read 3-0 25919 NULL nohasharray ++rose_header_25919 rose_header 0 25919 &rcname_read_25919 ++hfsplus_writepages_25924 hfsplus_writepages 0 25924 NULL nohasharray ++sisusb_write_memio_word_25924 sisusb_write_memio_word 0 25924 &hfsplus_writepages_25924 nohasharray ++set_ignore_ce_25924 set_ignore_ce 0-4 25924 &sisusb_write_memio_word_25924 ++_get_word_25929 _get_word 0 25929 NULL ++snd_es1938_capture_copy_25930 snd_es1938_capture_copy 5 25930 NULL ++key_flags_read_25931 key_flags_read 3-0 25931 NULL ++sriov_totalvfs_show_25934 sriov_totalvfs_show 0 25934 NULL ++tps80031_clr_bits_25942 tps80031_clr_bits 0 25942 NULL ++MIDIbuf_write_25949 MIDIbuf_write 0 25949 NULL ++hash_max_store_25956 hash_max_store 4-0 25956 NULL ++flush_25957 flush 2-0 25957 NULL ++done_25962 done 0 25962 NULL ++et1011c_read_status_25964 et1011c_read_status 0 25964 NULL ++_regmap_multi_reg_write_25967 _regmap_multi_reg_write 3 25967 NULL ++rs5c372_sysfs_show_trim_25968 rs5c372_sysfs_show_trim 0 25968 NULL ++uvesafb_show_oem_string_25969 uvesafb_show_oem_string 0 25969 NULL ++ipath_set_linkstate_25970 ipath_set_linkstate 0 25970 NULL ++video_register_device_25971 video_register_device 3 25971 NULL ++devm_kcalloc_25975 devm_kcalloc 3-2 25975 NULL ++udp_setsockopt_25985 udp_setsockopt 5-0 25985 NULL ++devkmsg_read_25991 devkmsg_read 0-3 25991 NULL ++show_ipv6_iface_grat_neighbor_adv_en_25996 show_ipv6_iface_grat_neighbor_adv_en 0 25996 NULL ++xfs_allocbt_alloc_block_25997 xfs_allocbt_alloc_block 0 25997 NULL ++gr_setup_out_desc_list_26000 gr_setup_out_desc_list 0 26000 NULL ++logfs_write_direct_26002 logfs_write_direct 0 26002 NULL nohasharray ++mace_open_26002 mace_open 0 26002 &logfs_write_direct_26002 ++fan_get_status_26004 fan_get_status 0 26004 NULL ++init_26006 init 0 26006 NULL ++kirkwood_dma_prepare_26011 kirkwood_dma_prepare 0 26011 NULL ++t1_change_mtu_26013 t1_change_mtu 0 26013 NULL ++tg3_alloc_consistent_26017 tg3_alloc_consistent 0 26017 NULL ++loop_attr_show_26018 loop_attr_show 0 26018 NULL nohasharray ++nx_fw_cmd_create_rx_ctx_26018 nx_fw_cmd_create_rx_ctx 0 26018 &loop_attr_show_26018 nohasharray ++sbp_tpg_attrib_store_max_logins_per_lun_26018 sbp_tpg_attrib_store_max_logins_per_lun 0-3 26018 &nx_fw_cmd_create_rx_ctx_26018 nohasharray ++hippi_mac_addr_26018 hippi_mac_addr 0 26018 &sbp_tpg_attrib_store_max_logins_per_lun_26018 ++SyS_process_vm_readv_26019 SyS_process_vm_readv 3-5 26019 NULL ++show_host_param_ISCSI_HOST_PARAM_IPADDRESS_26020 show_host_param_ISCSI_HOST_PARAM_IPADDRESS 0 26020 NULL ++hugetlb_report_node_meminfo_26023 hugetlb_report_node_meminfo 0 26023 NULL ++irq_create_strict_mappings_26025 irq_create_strict_mappings 4-2 26025 NULL ++blk_mq_sysfs_rq_list_show_26028 blk_mq_sysfs_rq_list_show 0 26028 NULL ++do_sas_phy_reset_26034 do_sas_phy_reset 0-2 26034 NULL nohasharray ++bdc_gadget_ep_queue_26034 bdc_gadget_ep_queue 0 26034 &do_sas_phy_reset_26034 ++bad_inode_setxattr_26035 bad_inode_setxattr 0 26035 NULL ++selinux_inode_post_setxattr_26037 selinux_inode_post_setxattr 4 26037 NULL nohasharray ++rt2x00debug_read_dev_flags_26037 rt2x00debug_read_dev_flags 0-3 26037 &selinux_inode_post_setxattr_26037 ++show_fnode_data_seq_in_order_26041 show_fnode_data_seq_in_order 0 26041 NULL ++ext_tree_prepare_commit_26045 ext_tree_prepare_commit 0 26045 NULL ++pci_timedia_init_26050 pci_timedia_init 0 26050 NULL nohasharray ++elantech_show_int_attr_26050 elantech_show_int_attr 0 26050 &pci_timedia_init_26050 ++__alloc_memory_core_early_26053 __alloc_memory_core_early 2 26053 NULL ++__bch_cache_show_26055 __bch_cache_show 0 26055 NULL ++keyctl_update_key_26061 keyctl_update_key 3 26061 NULL ++pri_wm_latency_write_26063 pri_wm_latency_write 3-0 26063 NULL nohasharray ++fotg210_ep_queue_26063 fotg210_ep_queue 0 26063 &pri_wm_latency_write_26063 ++update_vlan_26069 update_vlan 0 26069 NULL ++show_fnode_local_port_26070 show_fnode_local_port 0 26070 NULL nohasharray ++gfs2_attr_show_26070 gfs2_attr_show 0 26070 &show_fnode_local_port_26070 nohasharray ++enable_26070 enable 0 26070 &gfs2_attr_show_26070 ++exofs_write_begin_export_26071 exofs_write_begin_export 0 26071 NULL ++da903x_disable_26077 da903x_disable 0 26077 NULL nohasharray ++arvo_sysfs_write_button_26077 arvo_sysfs_write_button 0-6-5 26077 &da903x_disable_26077 ++ext2_xattr_trusted_set_26089 ext2_xattr_trusted_set 0 26089 NULL nohasharray ++ifx_modem_reboot_callback_26089 ifx_modem_reboot_callback 0 26089 &ext2_xattr_trusted_set_26089 ++m48t59_rtc_read_time_26090 m48t59_rtc_read_time 0 26090 NULL ++rx_rx_wa_density_dropped_frame_read_26095 rx_rx_wa_density_dropped_frame_read 3-0 26095 NULL ++cpumask_next_26096 cpumask_next 0 26096 NULL nohasharray ++sht15_show_status_26096 sht15_show_status 0 26096 &cpumask_next_26096 nohasharray ++hotkey_mask_set_26096 hotkey_mask_set 0 26096 &sht15_show_status_26096 ++fd_get_blocks_26097 fd_get_blocks 0 26097 NULL nohasharray ++acpi_tb_acquire_table_26097 acpi_tb_acquire_table 0 26097 &fd_get_blocks_26097 nohasharray ++amd64_inject_read_store_26097 amd64_inject_read_store 0-4 26097 &acpi_tb_acquire_table_26097 ++wl1271_init_beacon_broadcast_26103 wl1271_init_beacon_broadcast 0 26103 NULL ++cmd_rsv_terminate_26105 cmd_rsv_terminate 0 26105 NULL ++intel_wrap_ring_buffer_26117 intel_wrap_ring_buffer 0 26117 NULL ++macvlan_change_mtu_26118 macvlan_change_mtu 0 26118 NULL ++read_sb_page_26119 read_sb_page 5-0 26119 NULL ++vtpm_send_26123 vtpm_send 0-3 26123 NULL ++tmiofb_check_var_26129 tmiofb_check_var 0 26129 NULL ++nilfs_mounted_snapshots_attr_show_26134 nilfs_mounted_snapshots_attr_show 0 26134 NULL ++et131x_rx_dma_memory_alloc_26135 et131x_rx_dma_memory_alloc 0 26135 NULL ++SYSC_bpf_26138 SYSC_bpf 3 26138 NULL nohasharray ++mlx4_comm_cmd_wait_26138 mlx4_comm_cmd_wait 0 26138 &SYSC_bpf_26138 nohasharray ++skb_cow_26138 skb_cow 2 26138 &mlx4_comm_cmd_wait_26138 ++video_get_cur_state_26142 video_get_cur_state 0 26142 NULL ++func_id_show_26143 func_id_show 0 26143 NULL ++core_alua_store_tg_pt_gp_info_26144 core_alua_store_tg_pt_gp_info 0-3 26144 NULL ++ath9k_hw_name_26146 ath9k_hw_name 3 26146 NULL ++ivtv_sendbyte_26147 ivtv_sendbyte 0 26147 NULL nohasharray ++ufshcd_devfreq_target_26147 ufshcd_devfreq_target 0 26147 &ivtv_sendbyte_26147 ++snd_trident_si7018_capture_prepare_26149 snd_trident_si7018_capture_prepare 0 26149 NULL ++dsbr100_stop_26150 dsbr100_stop 0 26150 NULL ++ds2780_save_eeprom_26152 ds2780_save_eeprom 0 26152 NULL ++__iscsi_tpg_auth_show_password_mutual_26157 __iscsi_tpg_auth_show_password_mutual 0 26157 NULL ++hdcs_set_gain_26160 hdcs_set_gain 0 26160 NULL ++copy_oldmem_page_26164 copy_oldmem_page 3-1-0 26164 NULL ++read_data_26165 read_data 0 26165 NULL nohasharray ++ax88772_reset_26165 ax88772_reset 0 26165 &read_data_26165 ++gfs2_xattr_acl_get_26166 gfs2_xattr_acl_get 0 26166 NULL nohasharray ++ath6kl_roam_table_read_26166 ath6kl_roam_table_read 3-0 26166 &gfs2_xattr_acl_get_26166 nohasharray ++pci_reset_function_26166 pci_reset_function 0 26166 &ath6kl_roam_table_read_26166 ++query_port_26169 query_port 0 26169 NULL ++mid_get_vbt_data_r1_26170 mid_get_vbt_data_r1 2 26170 NULL ++show_26172 show 0 26172 NULL ++dmaengine_pcm_prepare_and_submit_26173 dmaengine_pcm_prepare_and_submit 0 26173 NULL nohasharray ++ft_nacl_store_node_name_26173 ft_nacl_store_node_name 0-3 26173 &dmaengine_pcm_prepare_and_submit_26173 nohasharray ++tmp103_set_temp_26173 tmp103_set_temp 0-4 26173 &ft_nacl_store_node_name_26173 ++netxen_nic_attach_26177 netxen_nic_attach 0 26177 NULL ++pcf2123_rtc_read_time_26180 pcf2123_rtc_read_time 0 26180 NULL nohasharray ++show_low_kb_26180 show_low_kb 0 26180 &pcf2123_rtc_read_time_26180 ++edac_pci_instance_show_26187 edac_pci_instance_show 0 26187 NULL nohasharray ++order_store_26187 order_store 0-3 26187 &edac_pci_instance_show_26187 ++fuse_reverse_inval_entry_26193 fuse_reverse_inval_entry 0 26193 NULL ++iwl_mvm_enable_beacon_filter_26194 iwl_mvm_enable_beacon_filter 0 26194 NULL ++fan2_get_speed_26196 fan2_get_speed 0 26196 NULL ++ieee80211_if_fmt_dot11MeshTTL_26198 ieee80211_if_fmt_dot11MeshTTL 3 26198 NULL nohasharray ++target_core_alua_tg_pt_gp_show_attr_tg_pt_gp_id_26198 target_core_alua_tg_pt_gp_show_attr_tg_pt_gp_id 0 26198 &ieee80211_if_fmt_dot11MeshTTL_26198 ++xfs_idata_realloc_26199 xfs_idata_realloc 2 26199 NULL nohasharray ++fmc_set_rds_mode_26199 fmc_set_rds_mode 0 26199 &xfs_idata_realloc_26199 nohasharray ++iwl_send_remove_station_26199 iwl_send_remove_station 0 26199 &fmc_set_rds_mode_26199 ++mce_write_26201 mce_write 3 26201 NULL ++pcm_prepare_26203 pcm_prepare 0 26203 NULL nohasharray ++show_state_exit_latency_26203 show_state_exit_latency 0 26203 &pcm_prepare_26203 nohasharray ++logfs_truncate_i0_26203 logfs_truncate_i0 0 26203 &show_state_exit_latency_26203 nohasharray ++pcf50633_rtc_set_alarm_26203 pcf50633_rtc_set_alarm 0 26203 &logfs_truncate_i0_26203 ++acpi_ds_restart_control_method_26205 acpi_ds_restart_control_method 0 26205 NULL ++SyS_splice_26206 SyS_splice 5 26206 NULL ++btrfs_statfs_26210 btrfs_statfs 0 26210 NULL nohasharray ++vcc_mode_store_26210 vcc_mode_store 0-4 26210 &btrfs_statfs_26210 ++sha256_ssse3_update_26217 sha256_ssse3_update 0 26217 NULL ++nilfs_btree_propagate_26218 nilfs_btree_propagate 0 26218 NULL ++rx_crc_errors_show_26219 rx_crc_errors_show 0 26219 NULL nohasharray ++rtl92c_download_fw_26219 rtl92c_download_fw 0 26219 &rx_crc_errors_show_26219 ++teql_master_open_26224 teql_master_open 0 26224 NULL ++mwifiex_regrdwr_write_26225 mwifiex_regrdwr_write 3-0 26225 NULL nohasharray ++g2d_buf_prepare_26225 g2d_buf_prepare 0 26225 &mwifiex_regrdwr_write_26225 nohasharray ++ufs_writepage_26225 ufs_writepage 0 26225 &g2d_buf_prepare_26225 nohasharray ++store_sys_hwmon_26225 store_sys_hwmon 0-3 26225 &ufs_writepage_26225 ++rxrpc_recvmsg_26233 rxrpc_recvmsg 0-4 26233 NULL ++nlm_end_grace_read_26234 nlm_end_grace_read 3-0 26234 NULL nohasharray ++simple_setattr_26234 simple_setattr 0 26234 &nlm_end_grace_read_26234 ++mxl111sf_tuner_set_params_26238 mxl111sf_tuner_set_params 0 26238 NULL ++cifs_strict_writev_26239 cifs_strict_writev 0 26239 NULL ++beiscsi_mccq_compl_26243 beiscsi_mccq_compl 0 26243 NULL ++ecryptfs_read_lower_page_segment_26244 ecryptfs_read_lower_page_segment 0-4 26244 NULL ++show_26245 show 0 26245 NULL ++show_rc6p_ms_26252 show_rc6p_ms 0 26252 NULL ++sisusb_bulkout_msg_26258 sisusb_bulkout_msg 0 26258 NULL ++thermal_get_mode_26262 thermal_get_mode 0 26262 NULL ++genwqe_ffdc_buff_size_26263 genwqe_ffdc_buff_size 0 26263 NULL nohasharray ++twl6040_power_26263 twl6040_power 0 26263 &genwqe_ffdc_buff_size_26263 ++firmware_revision_show_26265 firmware_revision_show 0 26265 NULL ++ltc2945_set_value_26267 ltc2945_set_value 0-4 26267 NULL ++activate_26268 activate 0 26268 NULL ++audit_inode_permission_26277 audit_inode_permission 0 26277 NULL ++crypto_ctxsize_26278 crypto_ctxsize 0 26278 NULL ++wacom_set_device_mode_26280 wacom_set_device_mode 3 26280 NULL nohasharray ++i40evf_setup_rx_descriptors_26280 i40evf_setup_rx_descriptors 0 26280 &wacom_set_device_mode_26280 ++ocfs2_write_end_nolock_26285 ocfs2_write_end_nolock 0-4 26285 NULL ++size_write_26288 size_write 0-3 26288 NULL ++adp8860_bl_l2_office_max_show_26296 adp8860_bl_l2_office_max_show 0 26296 NULL nohasharray ++recursive_scan_26296 recursive_scan 0 26296 &adp8860_bl_l2_office_max_show_26296 nohasharray ++_rtl92cu_init_power_on_26296 _rtl92cu_init_power_on 0 26296 &recursive_scan_26296 ++dbg_write_26301 dbg_write 0-3 26301 NULL ++clear_fw_stats_write_26303 clear_fw_stats_write 0-3 26303 NULL ++show_text_leaf_26305 show_text_leaf 0 26305 NULL ++ext2_find_goal_26306 ext2_find_goal 0 26306 NULL ++snd_pcm_plug_client_channels_buf_26309 snd_pcm_plug_client_channels_buf 0-3 26309 NULL nohasharray ++pax_get_random_long_26309 pax_get_random_long 0 26309 &snd_pcm_plug_client_channels_buf_26309 ++c2_change_mtu_26311 c2_change_mtu 0 26311 NULL ++target_fabric_port_attr_store_26314 target_fabric_port_attr_store 0 26314 NULL ++pwr_wake_on_host_read_26321 pwr_wake_on_host_read 3-0 26321 NULL ++show_temp_26323 show_temp 0 26323 NULL ++check_can_nocow_26336 check_can_nocow 2 26336 NULL ++wcn36xx_dxe_allocate_mem_pools_26340 wcn36xx_dxe_allocate_mem_pools 0 26340 NULL ++fcoe_fcf_set_dev_loss_tmo_26342 fcoe_fcf_set_dev_loss_tmo 0 26342 NULL nohasharray ++efx_rx_mk_skb_26342 efx_rx_mk_skb 5 26342 &fcoe_fcf_set_dev_loss_tmo_26342 ++snd_vx_check_reg_bit_26344 snd_vx_check_reg_bit 0 26344 NULL ++nr_getname_26347 nr_getname 0 26347 NULL ++show_link_address_26348 show_link_address 0 26348 NULL nohasharray ++nfs_file_direct_read_26348 nfs_file_direct_read 0 26348 &show_link_address_26348 ++double_flag_show_26351 double_flag_show 0 26351 NULL nohasharray ++lbs_mesh_access_26351 lbs_mesh_access 0 26351 &double_flag_show_26351 ++osif_xfer_26352 osif_xfer 0-3 26352 NULL ++ocfs2_listxattr_26354 ocfs2_listxattr 0-3 26354 NULL ++elants_i2c_fw_write_page_26355 elants_i2c_fw_write_page 0 26355 NULL ++mt9t112_g_crop_26357 mt9t112_g_crop 0 26357 NULL ++cifs_readdata_alloc_26360 cifs_readdata_alloc 1 26360 NULL nohasharray ++show_in0_input_26360 show_in0_input 0 26360 &cifs_readdata_alloc_26360 ++dup_to_netobj_26363 dup_to_netobj 3 26363 NULL ++direct_bytes_number_26364 direct_bytes_number 0-2 26364 NULL ++merge_across_nodes_show_26366 merge_across_nodes_show 0 26366 NULL nohasharray ++begin_26366 begin 0 26366 &merge_across_nodes_show_26366 ++lpfc_peer_port_login_show_26369 lpfc_peer_port_login_show 0 26369 NULL ++wp512_final_26371 wp512_final 0 26371 NULL nohasharray ++acpi_processor_ppc_notifier_26371 acpi_processor_ppc_notifier 0 26371 &wp512_final_26371 ++snd_atiixp_capture_prepare_26378 snd_atiixp_capture_prepare 0 26378 NULL nohasharray ++open_rx_second_26378 open_rx_second 0 26378 &snd_atiixp_capture_prepare_26378 nohasharray ++processor_set_cur_state_26378 processor_set_cur_state 0 26378 &open_rx_second_26378 ++trigger_26381 trigger 0 26381 NULL ++dbg_check_bud_bytes_26384 dbg_check_bud_bytes 0 26384 NULL ++pl_reset_26387 pl_reset 0 26387 NULL ++ov7670_read_i2c_26396 ov7670_read_i2c 0 26396 NULL nohasharray ++qib_create_rcvhdrq_26396 qib_create_rcvhdrq 0 26396 &ov7670_read_i2c_26396 ++cpu_hotplug_pm_callback_26398 cpu_hotplug_pm_callback 0 26398 NULL ++invalidate_inode_pages2_range_26403 invalidate_inode_pages2_range 0 26403 NULL ++ntty_write_26404 ntty_write 3 26404 NULL ++ext2_xattr_user_get_26405 ext2_xattr_user_get 0 26405 NULL ++cx23885_start_streaming_26406 cx23885_start_streaming 0 26406 NULL ++firmware_store_26408 firmware_store 4-0 26408 NULL ++lx_pcm_trigger_dispatch_26419 lx_pcm_trigger_dispatch 0 26419 NULL nohasharray ++bl_prepare_layoutcommit_26419 bl_prepare_layoutcommit 0 26419 &lx_pcm_trigger_dispatch_26419 ++br_nf_post_routing_26421 br_nf_post_routing 0 26421 NULL ++virtual_start_show_26424 virtual_start_show 0 26424 NULL ++erst_exec_add_26425 erst_exec_add 0 26425 NULL nohasharray ++spectrum_cs_suspend_26425 spectrum_cs_suspend 0 26425 &erst_exec_add_26425 ++suspend_prepare_26427 suspend_prepare 0 26427 NULL ++niu_set_multicast_mac_rdc_table_26428 niu_set_multicast_mac_rdc_table 0 26428 NULL ++bdi_set_max_ratio_26429 bdi_set_max_ratio 0 26429 NULL ++asd_show_update_bios_26430 asd_show_update_bios 0 26430 NULL ++ip_route_me_harder_26436 ip_route_me_harder 0 26436 NULL ++pagemap_read_26441 pagemap_read 3-0 26441 NULL ++hfs_inode_setattr_26448 hfs_inode_setattr 0 26448 NULL ++disk_discard_alignment_show_26449 disk_discard_alignment_show 0 26449 NULL ++set_temp_auto_temp_off_26450 set_temp_auto_temp_off 0-4 26450 NULL ++prism2_open_26452 prism2_open 0 26452 NULL ++amd64_inject_section_show_26456 amd64_inject_section_show 0 26456 NULL ++tower_read_26461 tower_read 3-0 26461 NULL nohasharray ++lx_pipe_release_26461 lx_pipe_release 0 26461 &tower_read_26461 nohasharray ++enc_pools_add_pages_26461 enc_pools_add_pages 1 26461 &lx_pipe_release_26461 ++aio_write_null_26462 aio_write_null 0 26462 NULL nohasharray ++e100_alloc_cbs_26462 e100_alloc_cbs 0 26462 &aio_write_null_26462 ++snd_hda_codec_prepare_26466 snd_hda_codec_prepare 0 26466 NULL ++sch311x_wdt_write_26468 sch311x_wdt_write 0-3 26468 NULL ++show_attribute_26469 show_attribute 0 26469 NULL ++ath10k_core_create_26470 ath10k_core_create 1 26470 NULL ++cifs_calc_signature_26473 cifs_calc_signature 0 26473 NULL ++qm1d1c0042_set_params_26480 qm1d1c0042_set_params 0 26480 NULL ++tipc_link_cong_26482 tipc_link_cong 0 26482 NULL ++ib_alloc_device_26483 ib_alloc_device 1 26483 NULL ++ulong_write_file_26485 ulong_write_file 3-0 26485 NULL ++security_inode_setsecurity_26486 security_inode_setsecurity 0 26486 NULL nohasharray ++wl1251_acx_beacon_filter_opt_26486 wl1251_acx_beacon_filter_opt 0 26486 &security_inode_setsecurity_26486 ++active_show_26489 active_show 0 26489 NULL ++dvb_ca_en50221_io_ioctl_26490 dvb_ca_en50221_io_ioctl 2 26490 NULL nohasharray ++msi_verify_entries_26490 msi_verify_entries 0 26490 &dvb_ca_en50221_io_ioctl_26490 ++iwl_power_set_mode_26491 iwl_power_set_mode 0 26491 NULL ++sel_netif_netdev_notifier_handler_26495 sel_netif_netdev_notifier_handler 0 26495 NULL ++console_cpu_notify_26498 console_cpu_notify 0 26498 NULL ++activate_26500 activate 0 26500 NULL ++read_vmcore_26501 read_vmcore 3-0 26501 NULL ++uhid_char_write_26502 uhid_char_write 3-0 26502 NULL nohasharray ++snd_seq_oss_readq_pick_26502 snd_seq_oss_readq_pick 0 26502 &uhid_char_write_26502 ++vfio_pci_set_msi_trigger_26507 vfio_pci_set_msi_trigger 4-3 26507 NULL ++chunk_size_show_26509 chunk_size_show 0 26509 NULL ++__mt9t112_mcu_read_26510 __mt9t112_mcu_read 0 26510 NULL ++iwl_dbgfs_rf_reset_read_26512 iwl_dbgfs_rf_reset_read 3-0 26512 NULL ++l2cap_build_conf_req_26513 l2cap_build_conf_req 0 26513 NULL ++retu_regmap_write_26516 retu_regmap_write 0 26516 NULL nohasharray ++ths7303_s_dv_timings_26516 ths7303_s_dv_timings 0 26516 &retu_regmap_write_26516 ++cxacru_sysfs_show_line_status_26518 cxacru_sysfs_show_line_status 0 26518 NULL ++alloc_ep_req_26521 alloc_ep_req 3-2 26521 NULL ++portio_size_show_26525 portio_size_show 0 26525 NULL ++show_in0_min_26528 show_in0_min 0 26528 NULL nohasharray ++pccard_show_type_26528 pccard_show_type 0 26528 &show_in0_min_26528 ++ath10k_htt_h2t_ver_req_msg_26537 ath10k_htt_h2t_ver_req_msg 0 26537 NULL ++nilfs_direct_gather_data_26538 nilfs_direct_gather_data 0-4 26538 NULL nohasharray ++SyS_rt_sigpending_26538 SyS_rt_sigpending 2 26538 &nilfs_direct_gather_data_26538 ++lmc_proto_open_26548 lmc_proto_open 0 26548 NULL ++diolan_usb_cmd_data_26549 diolan_usb_cmd_data 0 26549 NULL ++create_extra_outs_26556 create_extra_outs 0 26556 NULL ++macvtap_do_read_26558 macvtap_do_read 0 26558 NULL ++online_show_26562 online_show 0 26562 NULL nohasharray ++dio_new_bio_26562 dio_new_bio 0 26562 &online_show_26562 ++elan_sysfs_read_mode_26563 elan_sysfs_read_mode 0 26563 NULL ++show_available_governors_26564 show_available_governors 0 26564 NULL nohasharray ++mb862xxfb_set_par_26564 mb862xxfb_set_par 0 26564 &show_available_governors_26564 ++mode_string_26566 mode_string 0 26566 NULL ++sha256_export_26571 sha256_export 0 26571 NULL ++rts51x_read_mem_26577 rts51x_read_mem 4 26577 NULL nohasharray ++pm8001_ctl_ib_queue_log_show_26577 pm8001_ctl_ib_queue_log_show 0 26577 &rts51x_read_mem_26577 ++ea_remove_unstuffed_26578 ea_remove_unstuffed 0 26578 NULL nohasharray ++mlx4_en_replace_mac_26578 mlx4_en_replace_mac 0 26578 &ea_remove_unstuffed_26578 ++lpfc_bg_guard_err_show_26583 lpfc_bg_guard_err_show 0 26583 NULL ++qla2x00_zio_show_26584 qla2x00_zio_show 0 26584 NULL nohasharray ++dwc3_gadget_ep_enable_26584 dwc3_gadget_ep_enable 0 26584 &qla2x00_zio_show_26584 ++ipmi_request_supply_msgs_26586 ipmi_request_supply_msgs 0 26586 NULL ++cachefiles_cull_26590 cachefiles_cull 0 26590 NULL ++cirrusfb_get_memsize_26597 cirrusfb_get_memsize 0 26597 NULL nohasharray ++show_jint_idle_ticks_26597 show_jint_idle_ticks 0 26597 &cirrusfb_get_memsize_26597 nohasharray ++hfs_ext_write_extent_26597 hfs_ext_write_extent 0 26597 &show_jint_idle_ticks_26597 ++lpfc_multi_ring_support_show_26601 lpfc_multi_ring_support_show 0 26601 NULL ++__unmap_single_26604 __unmap_single 3-2 26604 NULL ++f_gether_opts_attr_show_26605 f_gether_opts_attr_show 0 26605 NULL ++blk_mq_hw_sysfs_active_show_26606 blk_mq_hw_sysfs_active_show 0 26606 NULL ++efivar_entry_size_26607 efivar_entry_size 0 26607 NULL ++iscsi_boot_show_attribute_26611 iscsi_boot_show_attribute 0 26611 NULL ++xfs_rtcheck_range_26614 xfs_rtcheck_range 0 26614 NULL nohasharray ++tcp_read_sock_26614 tcp_read_sock 0 26614 &xfs_rtcheck_range_26614 ++mem_cgroup_oom_control_write_26619 mem_cgroup_oom_control_write 0 26619 NULL ++iommu_alloc_26621 iommu_alloc 4-0 26621 NULL ++aa_change_profile_26624 aa_change_profile 0 26624 NULL ++pwr_fix_tsf_ps_read_26627 pwr_fix_tsf_ps_read 3-0 26627 NULL ++nouveau_hwmon_set_max_temp_26628 nouveau_hwmon_set_max_temp 0-4 26628 NULL ++si4713_set_rds_radio_text_26629 si4713_set_rds_radio_text 0 26629 NULL ++extent_write_cache_pages_26636 extent_write_cache_pages 0 26636 NULL ++pxa168_eth_change_mtu_26639 pxa168_eth_change_mtu 0 26639 NULL ++qla4_83xx_isp_reset_26640 qla4_83xx_isp_reset 0 26640 NULL ++edt_ft5x06_ts_readwrite_26641 edt_ft5x06_ts_readwrite 0 26641 NULL ++config_init_26642 config_init 0 26642 NULL ++null_digest_26644 null_digest 0 26644 NULL ++amdtp_stream_get_max_payload_26645 amdtp_stream_get_max_payload 0 26645 NULL ++pch_gbe_set_mac_26647 pch_gbe_set_mac 0 26647 NULL ++statfs_quantum_show_26649 statfs_quantum_show 0 26649 NULL ++irq_alloc_generic_chip_26650 irq_alloc_generic_chip 2 26650 NULL ++show_state_desc_26653 show_state_desc 0 26653 NULL nohasharray ++rom_index_show_26653 rom_index_show 0 26653 &show_state_desc_26653 ++nouveau_volt_create__26654 nouveau_volt_create_ 4 26654 NULL ++show_in5_max_26672 show_in5_max 0 26672 NULL nohasharray ++bnx2x_queue_state_change_26672 bnx2x_queue_state_change 0 26672 &show_in5_max_26672 ++c_can_set_bittiming_26674 c_can_set_bittiming 0 26674 NULL nohasharray ++do_sync_readv_writev_26674 do_sync_readv_writev 0 26674 &c_can_set_bittiming_26674 ++btrfs_space_info_show_bytes_pinned_26678 btrfs_space_info_show_bytes_pinned 0 26678 NULL ++cipso_v4_map_cat_rbm_hton_26680 cipso_v4_map_cat_rbm_hton 0 26680 NULL nohasharray ++nv_tco_write_26680 nv_tco_write 0-3 26680 &cipso_v4_map_cat_rbm_hton_26680 ++getxattr_cb_26682 getxattr_cb 0 26682 NULL ++flowinfo_read_26683 flowinfo_read 3-0 26683 NULL nohasharray ++show_current_kb_26683 show_current_kb 0 26683 &flowinfo_read_26683 ++set_nvmd_req_26685 set_nvmd_req 0 26685 NULL ++__alloc_pred_stack_26687 __alloc_pred_stack 2 26687 NULL ++ims_pcu_switch_to_bootloader_26689 ims_pcu_switch_to_bootloader 0 26689 NULL ++viacam_configure_sensor_26693 viacam_configure_sensor 0 26693 NULL ++snd_aw2_pcm_trigger_playback_26695 snd_aw2_pcm_trigger_playback 0 26695 NULL ++text_ip_addr_26699 text_ip_addr 1 26699 NULL ++show_in_input0_26705 show_in_input0 0 26705 NULL nohasharray ++uwb_dev_RSSI_store_26705 uwb_dev_RSSI_store 0-4 26705 &show_in_input0_26705 ++cx18_av_s_stream_26713 cx18_av_s_stream 0 26713 NULL nohasharray ++rtllib_authentication_req_26713 rtllib_authentication_req 3 26713 &cx18_av_s_stream_26713 ++yellowfin_init_ring_26714 yellowfin_init_ring 0 26714 NULL ++sysfs_add_file_26716 sysfs_add_file 0 26716 NULL ++__qlcnic_up_26719 __qlcnic_up 0 26719 NULL ++rtl2832_sdr_set_adc_26720 rtl2832_sdr_set_adc 0 26720 NULL nohasharray ++aty_ld_le32_26720 aty_ld_le32 0 26720 &rtl2832_sdr_set_adc_26720 ++nfc_hci_send_cmd_async_26723 nfc_hci_send_cmd_async 5 26723 NULL ++get_register_26725 get_register 0 26725 NULL ++gadget_strings_attr_show_26728 gadget_strings_attr_show 0 26728 NULL ++hiface_pcm_set_rate_26730 hiface_pcm_set_rate 0 26730 NULL ++nouveau_namedb_create__26732 nouveau_namedb_create_ 7 26732 NULL ++iscsi_stat_sess_show_attr_conn_digest_errors_26737 iscsi_stat_sess_show_attr_conn_digest_errors 0 26737 NULL nohasharray ++SyS_fcntl_26737 SyS_fcntl 3 26737 &iscsi_stat_sess_show_attr_conn_digest_errors_26737 ++crc32c_intel_update_26738 crc32c_intel_update 0 26738 NULL ++b43legacy_attr_preamble_show_26740 b43legacy_attr_preamble_show 0 26740 NULL nohasharray ++osst_probe_26740 osst_probe 0 26740 &b43legacy_attr_preamble_show_26740 ++pipeline_tcp_rx_stat_fifo_int_read_26745 pipeline_tcp_rx_stat_fifo_int_read 3-0 26745 NULL ++bcm87xx_read_status_26749 bcm87xx_read_status 0 26749 NULL ++virtscsi_change_queue_depth_26751 virtscsi_change_queue_depth 0-2 26751 NULL ++msg_from_mpoad_26753 msg_from_mpoad 0 26753 NULL nohasharray ++iwl_mvm_power_update_device_26753 iwl_mvm_power_update_device 0 26753 &msg_from_mpoad_26753 ++store_26755 store 0 26755 NULL ++show_fnode_keepalive_tmo_26758 show_fnode_keepalive_tmo 0 26758 NULL ++vmci_transport_notify_recv_init_26759 vmci_transport_notify_recv_init 0 26759 NULL nohasharray ++pci_bus_read_config_byte_26759 pci_bus_read_config_byte 0 26759 &vmci_transport_notify_recv_init_26759 ++dmi_sysfs_entry_length_26761 dmi_sysfs_entry_length 0 26761 NULL ++snd_hda_get_raw_connections_26762 snd_hda_get_raw_connections 0 26762 NULL ++isdn_divert_read_26763 isdn_divert_read 0-3 26763 NULL ++lpfc_nodev_tmo_store_26764 lpfc_nodev_tmo_store 0-4 26764 NULL ++marvell_read_status_26765 marvell_read_status 0 26765 NULL ++search_for_position_by_key_26766 search_for_position_by_key 0 26766 NULL ++C_SYSC_fcntl64_26767 C_SYSC_fcntl64 3 26767 NULL ++show_ipInMcastPkts_26768 show_ipInMcastPkts 0 26768 NULL nohasharray ++nfs4_write_inode_26768 nfs4_write_inode 0 26768 &show_ipInMcastPkts_26768 ++portio_porttype_show_26775 portio_porttype_show 0 26775 NULL ++bond_slave_netdev_event_26777 bond_slave_netdev_event 0 26777 NULL ++inotify_read_26778 inotify_read 0-3 26778 NULL ++dma_map_single_attrs_26779 dma_map_single_attrs 0 26779 NULL ++read_port_26787 read_port 0-3 26787 NULL ++store_bank1_mask_26793 store_bank1_mask 0-4 26793 NULL ++compat_sys_recv_26794 compat_sys_recv 3 26794 NULL ++qlcnic_alloc_sds_rings_26795 qlcnic_alloc_sds_rings 2 26795 NULL ++select_sec_26799 select_sec 0 26799 NULL ++show_mem_gpio_reg_26800 show_mem_gpio_reg 0 26800 NULL ++wsm_buf_reserve_26801 wsm_buf_reserve 2 26801 NULL ++shdma_prep_dma_cyclic_26808 shdma_prep_dma_cyclic 4-3 26808 NULL ++rbd_remove_single_major_26811 rbd_remove_single_major 3-0 26811 NULL ++cipso_v4_genopt_26812 cipso_v4_genopt 0 26812 NULL ++dmar_pci_bus_notifier_26815 dmar_pci_bus_notifier 0 26815 NULL ++acpi_ps_parse_aml_26818 acpi_ps_parse_aml 0 26818 NULL nohasharray ++tempsens_show_26818 tempsens_show 0 26818 &acpi_ps_parse_aml_26818 ++iwl_trans_read_mem32_26825 iwl_trans_read_mem32 0 26825 NULL ++disk_alignment_offset_show_26826 disk_alignment_offset_show 0 26826 NULL ++smk_write_load_26829 smk_write_load 3-0 26829 NULL ++journal_force_commit_26832 journal_force_commit 0 26832 NULL ++show_fc_host_speed_26833 show_fc_host_speed 0 26833 NULL ++xfs_alloc_pagf_init_26834 xfs_alloc_pagf_init 0 26834 NULL ++ar5523_cmd_read_26837 ar5523_cmd_read 0 26837 NULL ++__nodes_onto_26838 __nodes_onto 4 26838 NULL ++w1_master_attribute_show_pointer_26839 w1_master_attribute_show_pointer 0 26839 NULL ++set_temp_crit_enable_26841 set_temp_crit_enable 0-4 26841 NULL ++scnprint_id_26842 scnprint_id 3-0 26842 NULL nohasharray ++snd_ice1712_capture_trigger_26842 snd_ice1712_capture_trigger 0 26842 &scnprint_id_26842 ++do_tcp_rcv_26844 do_tcp_rcv 3 26844 NULL ++ecryptfs_miscdev_write_26847 ecryptfs_miscdev_write 3-0 26847 NULL ++ss_alloc_ep_req_26848 ss_alloc_ep_req 2 26848 NULL ++gx_frame_buffer_size_26851 gx_frame_buffer_size 0 26851 NULL ++core_tpg_set_initiator_node_tag_26853 core_tpg_set_initiator_node_tag 0 26853 NULL nohasharray ++ipath_f_set_ib_cfg_26853 ipath_f_set_ib_cfg 0 26853 &core_tpg_set_initiator_node_tag_26853 ++sisusb_read_26856 sisusb_read 0-3 26856 NULL ++netxen_nic_hw_read_wx_128M_26858 netxen_nic_hw_read_wx_128M 2 26858 NULL ++notify_send_post_enqueue_26861 notify_send_post_enqueue 0 26861 NULL ++uevent_store_26862 uevent_store 0-3 26862 NULL ++xhci_queue_isoc_tx_26864 xhci_queue_isoc_tx 0 26864 NULL ++tipc_conn_sendmsg_26867 tipc_conn_sendmsg 5 26867 NULL ++asymmetric_key_preparse_26871 asymmetric_key_preparse 0 26871 NULL nohasharray ++acpi_ec_write_io_26871 acpi_ec_write_io 0-3 26871 &asymmetric_key_preparse_26871 ++pm8001_chip_smp_req_26875 pm8001_chip_smp_req 0 26875 NULL ++pyra_sysfs_show_actual_profile_26876 pyra_sysfs_show_actual_profile 0 26876 NULL ++atkbd_show_scroll_26878 atkbd_show_scroll 0 26878 NULL ++ath6kl_create_qos_write_26879 ath6kl_create_qos_write 3-0 26879 NULL ++qla2x00_sysfs_read_sfp_26880 qla2x00_sysfs_read_sfp 0-6-5 26880 NULL ++svc_print_xprts_26881 svc_print_xprts 0 26881 NULL ++usnic_ib_qpn_attr_show_26895 usnic_ib_qpn_attr_show 0 26895 NULL ++iwl_alive_start_26898 iwl_alive_start 0 26898 NULL ++efivar_guid_read_26899 efivar_guid_read 0 26899 NULL ++slhc_uncompress_26905 slhc_uncompress 0-3 26905 NULL ++airspy_set_if_gain_26906 airspy_set_if_gain 0 26906 NULL ++koneplus_sysfs_write_tcu_26909 koneplus_sysfs_write_tcu 0-6-5 26909 NULL ++skb_zerocopy_headlen_26910 skb_zerocopy_headlen 0 26910 NULL ++hhf_zalloc_26912 hhf_zalloc 1 26912 NULL ++twl6030reg_get_status_26915 twl6030reg_get_status 0 26915 NULL ++lpfc_XLanePriority_show_26916 lpfc_XLanePriority_show 0 26916 NULL ++ds3232_read_time_26917 ds3232_read_time 0 26917 NULL ++saa711x_s_ctrl_26924 saa711x_s_ctrl 0 26924 NULL ++sctp_error_26925 sctp_error 0-3 26925 NULL ++x25_asy_change_mtu_26928 x25_asy_change_mtu 2-0 26928 NULL ++brcmf_usb_dl_cmd_26931 brcmf_usb_dl_cmd 4 26931 NULL ++compat_mtw_from_user_26932 compat_mtw_from_user 0 26932 NULL ++rndis_command_26933 rndis_command 0 26933 NULL ++sctp_setsockopt_adaptation_layer_26935 sctp_setsockopt_adaptation_layer 3-0 26935 NULL nohasharray ++pwr_ps_enter_read_26935 pwr_ps_enter_read 3-0 26935 &sctp_setsockopt_adaptation_layer_26935 ++sst_wait_timeout_26938 sst_wait_timeout 0 26938 NULL ++show_rev_26939 show_rev 0 26939 NULL ++carl9170_handle_mpdu_26940 carl9170_handle_mpdu 3 26940 NULL ++dw3101_i2c_transfer_26941 dw3101_i2c_transfer 0-3 26941 NULL nohasharray ++ds1553_rtc_read_time_26941 ds1553_rtc_read_time 0 26941 &dw3101_i2c_transfer_26941 nohasharray ++disk_ro_show_26941 disk_ro_show 0 26941 &ds1553_rtc_read_time_26941 nohasharray ++wdack_show_26941 wdack_show 0 26941 &disk_ro_show_26941 ++hecubafb_write_26942 hecubafb_write 3 26942 NULL ++pvc_open_26949 pvc_open 0 26949 NULL ++extract_entropy_user_26952 extract_entropy_user 3-0 26952 NULL ++lx_dsp_set_granularity_26954 lx_dsp_set_granularity 0 26954 NULL ++mesh_id_set_26957 mesh_id_set 0-4 26957 NULL ++adp8870_bl_ambient_light_zone_store_26959 adp8870_bl_ambient_light_zone_store 0-4 26959 NULL ++ext4_xattr_user_get_26961 ext4_xattr_user_get 0 26961 NULL ++trackpoint_set_bit_attr_26969 trackpoint_set_bit_attr 0-4 26969 NULL ++tb_path_alloc_26976 tb_path_alloc 2 26976 NULL nohasharray ++lpfc_enable_hba_reset_show_26976 lpfc_enable_hba_reset_show 0 26976 &tb_path_alloc_26976 ++do_direct_IO_26979 do_direct_IO 0 26979 NULL ++usbtv_select_norm_26981 usbtv_select_norm 0 26981 NULL ++mlx4_zone_alloc_entries_26984 mlx4_zone_alloc_entries 4 26984 NULL ++m5602_wait_for_i2c_26985 m5602_wait_for_i2c 0 26985 NULL nohasharray ++solo_set_motion_threshold_26985 solo_set_motion_threshold 0 26985 &m5602_wait_for_i2c_26985 ++xfs_vn_setattr_26990 xfs_vn_setattr 0 26990 NULL ++mwl8k_fw_lock_26991 mwl8k_fw_lock 0 26991 NULL ++pcan_usb_pro_start_26994 pcan_usb_pro_start 0 26994 NULL nohasharray ++pm80x_rtc_set_alarm_26994 pm80x_rtc_set_alarm 0 26994 &pcan_usb_pro_start_26994 ++bdx_open_26997 bdx_open 0 26997 NULL ++get_trip_temp_27000 get_trip_temp 0 27000 NULL ++i2c_smbus_xfer_27006 i2c_smbus_xfer 0 27006 NULL nohasharray ++async_write_27006 async_write 0 27006 &i2c_smbus_xfer_27006 nohasharray ++do_serial8250_get_rxtrig_27006 do_serial8250_get_rxtrig 0 27006 &async_write_27006 ++show_sf2_point_27007 show_sf2_point 0 27007 NULL nohasharray ++queue_io_min_show_27007 queue_io_min_show 0 27007 &show_sf2_point_27007 ++pvr2_channel_claim_stream_27010 pvr2_channel_claim_stream 0 27010 NULL ++layout_in_empty_space_27016 layout_in_empty_space 0 27016 NULL ++ks8851_write_mac_addr_27019 ks8851_write_mac_addr 0 27019 NULL ++ubifs_validate_entry_27021 ubifs_validate_entry 0 27021 NULL ++pwc_set_exposure_auto_27022 pwc_set_exposure_auto 0 27022 NULL ++bnx2_init_5709_context_27024 bnx2_init_5709_context 0 27024 NULL ++mc_cpu_callback_27029 mc_cpu_callback 0 27029 NULL ++omfs_allocate_range_27034 omfs_allocate_range 3 27034 NULL ++lpfc_used_xri_show_27038 lpfc_used_xri_show 0 27038 NULL ++snd_via686_playback_prepare_27039 snd_via686_playback_prepare 0 27039 NULL ++mwifiex_cmd_11ac_cfg_27042 mwifiex_cmd_11ac_cfg 0 27042 NULL ++submit_stream_urbs_27044 submit_stream_urbs 0 27044 NULL ++store_line2_27047 store_line2 4-0 27047 NULL ++hotkey_mask_show_27048 hotkey_mask_show 0 27048 NULL ++sc16is7xx_port_read_27051 sc16is7xx_port_read 0 27051 NULL ++show_fnode_discovery_parent_idx_27053 show_fnode_discovery_parent_idx 0 27053 NULL ++ufs_alloc_fragments_27059 ufs_alloc_fragments 3-0-2 27059 NULL ++group_store_27061 group_store 4-0 27061 NULL ++__videobuf_alloc_vb_27062 __videobuf_alloc_vb 1 27062 NULL ++proc_fd_permission_27063 proc_fd_permission 0 27063 NULL ++readpage_nounlock_27064 readpage_nounlock 0 27064 NULL nohasharray ++ext4_convert_unwritten_extents_27064 ext4_convert_unwritten_extents 0 27064 &readpage_nounlock_27064 ++__vmci_transport_send_control_pkt_27072 __vmci_transport_send_control_pkt 0 27072 NULL nohasharray ++cn_netlink_send_27072 cn_netlink_send 0 27072 &__vmci_transport_send_control_pkt_27072 ++clk_gate_enable_27077 clk_gate_enable 0 27077 NULL nohasharray ++paravirt_read_msr_27077 paravirt_read_msr 0 27077 &clk_gate_enable_27077 ++srp_connect_ch_27078 srp_connect_ch 0 27078 NULL ++alloc_fdmem_27083 alloc_fdmem 1 27083 NULL ++find_first_bit_27088 find_first_bit 0 27088 NULL ++btmrvl_hscmd_write_27089 btmrvl_hscmd_write 3-0 27089 NULL nohasharray ++ath9k_hw_4k_dump_eeprom_27089 ath9k_hw_4k_dump_eeprom 4-5-0 27089 &btmrvl_hscmd_write_27089 ++regmap_spmi_base_gather_write_27091 regmap_spmi_base_gather_write 0 27091 NULL ++snd_aw2_pcm_prepare_playback_27093 snd_aw2_pcm_prepare_playback 0 27093 NULL ++store_spi_transport_width_27097 store_spi_transport_width 0-4 27097 NULL ++store_output_27101 store_output 0-4 27101 NULL ++qla2x00_model_name_show_27107 qla2x00_model_name_show 0 27107 NULL ++__devcgroup_inode_permission_27108 __devcgroup_inode_permission 0 27108 NULL ++pb0100_start_27111 pb0100_start 0 27111 NULL ++find_rsb_nodir_27122 find_rsb_nodir 0 27122 NULL ++SYSC_ipc_27123 SYSC_ipc 3 27123 NULL ++write_27128 write 0-3 27128 NULL ++rocker_cmd_exec_27129 rocker_cmd_exec 0 27129 NULL nohasharray ++write_27129 write 0 27129 &rocker_cmd_exec_27129 ++ia_send_27132 ia_send 0 27132 NULL ++skge_get_eeprom_len_27133 skge_get_eeprom_len 0 27133 NULL ++__ext4_handle_dirty_metadata_27137 __ext4_handle_dirty_metadata 0 27137 NULL ++bch_cache_set_internal_show_27139 bch_cache_set_internal_show 0 27139 NULL nohasharray ++ecx_transmit_led_message_27139 ecx_transmit_led_message 0-3 27139 &bch_cache_set_internal_show_27139 ++netstat_show_27140 netstat_show 0 27140 NULL ++drbd_get_capacity_27141 drbd_get_capacity 0 27141 NULL ++pms_capture_27142 pms_capture 4 27142 NULL ++btmrvl_hscfgcmd_write_27143 btmrvl_hscfgcmd_write 3-0 27143 NULL nohasharray ++show_counter_tx_data_pkts_27143 show_counter_tx_data_pkts 0 27143 &btmrvl_hscfgcmd_write_27143 ++tcm_qla2xxx_tpg_show_enable_27147 tcm_qla2xxx_tpg_show_enable 0 27147 NULL ++epp_read_addr_27148 epp_read_addr 0 27148 NULL nohasharray ++mt9m111_s_fmt_27148 mt9m111_s_fmt 0 27148 &epp_read_addr_27148 ++snd_als300_capture_prepare_27149 snd_als300_capture_prepare 0 27149 NULL ++wil_write_file_wmi_27150 wil_write_file_wmi 3-0 27150 NULL nohasharray ++sb1000_activate_27150 sb1000_activate 0 27150 &wil_write_file_wmi_27150 ++edd_attr_show_27151 edd_attr_show 0 27151 NULL ++snd_hdsp_prepare_27161 snd_hdsp_prepare 0 27161 NULL nohasharray ++xudc_ep0_enable_27161 xudc_ep0_enable 0 27161 &snd_hdsp_prepare_27161 ++snd_compr_calc_avail_27165 snd_compr_calc_avail 0 27165 NULL ++show_temp_emergency_27170 show_temp_emergency 0 27170 NULL nohasharray ++sparse_add_one_section_27170 sparse_add_one_section 0 27170 &show_temp_emergency_27170 nohasharray ++i2400m_net_rx_27170 i2400m_net_rx 5 27170 &sparse_add_one_section_27170 ++target_stat_scsi_tgt_dev_show_attr_non_access_lus_27173 target_stat_scsi_tgt_dev_show_attr_non_access_lus 0 27173 NULL ++nilfs_segctor_attr_show_27178 nilfs_segctor_attr_show 0 27178 NULL ++attr_fn_lock_show_cptkbd_27182 attr_fn_lock_show_cptkbd 0 27182 NULL ++ieee80211_if_read_rc_rateidx_mask_5ghz_27183 ieee80211_if_read_rc_rateidx_mask_5ghz 3-0 27183 NULL ++get_unaligned_be32_27184 get_unaligned_be32 0 27184 NULL nohasharray ++target_fabric_tpg_attr_show_27184 target_fabric_tpg_attr_show 0 27184 &get_unaligned_be32_27184 ++ocfs2_xattr_block_list_27186 ocfs2_xattr_block_list 0 27186 NULL ++wait_comp_27187 wait_comp 0 27187 NULL ++ath10k_hif_diag_read_27189 ath10k_hif_diag_read 0 27189 NULL ++mt9t031_g_crop_27191 mt9t031_g_crop 0 27191 NULL ++freeze_fs_27192 freeze_fs 0 27192 NULL ++r852_media_type_show_27193 r852_media_type_show 0 27193 NULL ++vmci_transport_notify_pkt_recv_init_27208 vmci_transport_notify_pkt_recv_init 0 27208 NULL ++toggle_hdmi_source_27212 toggle_hdmi_source 0-4 27212 NULL ++target_stat_scsi_lu_show_attr_dev_type_27222 target_stat_scsi_lu_show_attr_dev_type 0 27222 NULL ++ep0_queue_27223 ep0_queue 0 27223 NULL ++svcxdr_tmpalloc_27225 svcxdr_tmpalloc 2 27225 NULL nohasharray ++write_kmem_27225 write_kmem 3-0 27225 &svcxdr_tmpalloc_27225 ++dbAllocAG_27228 dbAllocAG 0 27228 NULL ++rxrpc_request_key_27235 rxrpc_request_key 3-0 27235 NULL ++o2nm_node_ipv4_port_read_27236 o2nm_node_ipv4_port_read 0 27236 NULL ++ov7660_s_ctrl_27239 ov7660_s_ctrl 0 27239 NULL ++store_dev_name_27240 store_dev_name 0 27240 NULL ++cfq_back_seek_max_show_27243 cfq_back_seek_max_show 0 27243 NULL ++msecs_to_jiffies_27246 msecs_to_jiffies 0 27246 NULL ++do_get_rxtrig_27251 do_get_rxtrig 0 27251 NULL ++_ore_add_parity_unit_27253 _ore_add_parity_unit 0 27253 NULL ++__conn_send_command_27255 __conn_send_command 4-6 27255 NULL ++lpphy_b2063_tune_27256 lpphy_b2063_tune 0 27256 NULL ++ath10k_write_simulate_radar_27260 ath10k_write_simulate_radar 0-3 27260 NULL nohasharray ++cfpkt_add_trail_27260 cfpkt_add_trail 3 27260 &ath10k_write_simulate_radar_27260 ++nlmsg_new_27263 nlmsg_new 1 27263 NULL ++logfs_read_empty_27266 logfs_read_empty 0 27266 NULL ++ll_track_gid_seq_write_27267 ll_track_gid_seq_write 3 27267 NULL ++ch341_control_out_27269 ch341_control_out 0 27269 NULL ++comedi_alloc_devpriv_27272 comedi_alloc_devpriv 2 27272 NULL ++pdacf_pcm_prepare_27275 pdacf_pcm_prepare 0 27275 NULL nohasharray ++gm204_aux_27275 gm204_aux 0 27275 &pdacf_pcm_prepare_27275 nohasharray ++max8925_bulk_read_27275 max8925_bulk_read 0 27275 &gm204_aux_27275 nohasharray ++write_one_eb_27275 write_one_eb 0 27275 &max8925_bulk_read_27275 ++vmxnet3_get_rss_indir_size_27277 vmxnet3_get_rss_indir_size 0 27277 NULL nohasharray ++cmask_show_27277 cmask_show 0 27277 &vmxnet3_get_rss_indir_size_27277 ++usb_submit_urb_27278 usb_submit_urb 0 27278 NULL nohasharray ++_ctl_logging_level_show_27278 _ctl_logging_level_show 0 27278 &usb_submit_urb_27278 ++hdaps_keyboard_activity_show_27279 hdaps_keyboard_activity_show 0 27279 NULL ++get_rx_fifo_content_27283 get_rx_fifo_content 0 27283 NULL ++crccheck_show_27285 crccheck_show 0 27285 NULL nohasharray ++kone_get_settings_27285 kone_get_settings 0 27285 &crccheck_show_27285 ++__dma_map_cont_27289 __dma_map_cont 5 27289 NULL nohasharray ++input_dev_show_cap_led_27289 input_dev_show_cap_led 0 27289 &__dma_map_cont_27289 ++e1000_copybreak_27292 e1000_copybreak 3 27292 NULL ++mt9t031_g_fmt_27294 mt9t031_g_fmt 0 27294 NULL ++__wmi_send_27296 __wmi_send 0 27296 NULL ++show_counter_rx_len_errs_27297 show_counter_rx_len_errs 0 27297 NULL nohasharray ++ufs_statfs_27297 ufs_statfs 0 27297 &show_counter_rx_len_errs_27297 ++hpi_read_reg_27302 hpi_read_reg 0 27302 NULL ++store_pwm_freq_27307 store_pwm_freq 0-4 27307 NULL ++copy_from_buf_27308 copy_from_buf 2-4 27308 NULL ++virtqueue_add_inbuf_27312 virtqueue_add_inbuf 3 27312 NULL nohasharray ++usb_udc_attach_driver_27312 usb_udc_attach_driver 0 27312 &virtqueue_add_inbuf_27312 nohasharray ++ath6kl_wmi_test_cmd_27312 ath6kl_wmi_test_cmd 3 27312 &usb_udc_attach_driver_27312 ++tcp_update_limit_27313 tcp_update_limit 0 27313 NULL ++write_buf_27316 write_buf 3 27316 NULL ++do_rawv6_setsockopt_27321 do_rawv6_setsockopt 0 27321 NULL ++slcan_change_mtu_27324 slcan_change_mtu 0 27324 NULL ++acpi_ut_get_object_size_27325 acpi_ut_get_object_size 0 27325 NULL ++snd_pcm_oss_write2_27332 snd_pcm_oss_write2 0-3 27332 NULL nohasharray ++usbnet_manage_power_27332 usbnet_manage_power 0 27332 &snd_pcm_oss_write2_27332 ++selinux_ip_forward_27337 selinux_ip_forward 0 27337 NULL ++selinux_ipv4_postroute_27340 selinux_ipv4_postroute 0 27340 NULL ++afs_cell_create_27346 afs_cell_create 2 27346 NULL ++qlcnic_sriov_alloc_bc_trans_27353 qlcnic_sriov_alloc_bc_trans 0 27353 NULL ++bnx2x_vlan_mac_push_new_cmd_27355 bnx2x_vlan_mac_push_new_cmd 0 27355 NULL ++ipv4_get_l4proto_27362 ipv4_get_l4proto 0 27362 NULL ++iwl_dbgfs_csr_write_27363 iwl_dbgfs_csr_write 3-0 27363 NULL ++pcbit_stat_27364 pcbit_stat 2 27364 NULL ++show_spi_transport_max_width_27366 show_spi_transport_max_width 0 27366 NULL ++sst_assign_pvt_id_27368 sst_assign_pvt_id 0 27368 NULL nohasharray ++read_txflow_27368 read_txflow 0 27368 &sst_assign_pvt_id_27368 ++store_chassis_clear_27373 store_chassis_clear 0-4 27373 NULL ++rtl_set_mac_address_27377 rtl_set_mac_address 0 27377 NULL ++it87_read_value_27385 it87_read_value 0 27385 NULL ++show_activation_width_27387 show_activation_width 0 27387 NULL ++wl1251_hw_init_rx_config_27393 wl1251_hw_init_rx_config 0 27393 NULL ++init_memory_mapping_27395 init_memory_mapping 0 27395 NULL ++padata_sysfs_store_27398 padata_sysfs_store 0-4 27398 NULL ++if_nlmsg_size_27404 if_nlmsg_size 0 27404 NULL ++tcm_qla2xxx_tpg_attrib_store_demo_mode_login_only_27405 tcm_qla2xxx_tpg_attrib_store_demo_mode_login_only 0-3 27405 NULL ++seq_read_27411 seq_read 3-0 27411 NULL nohasharray ++phys_pte_init_27411 phys_pte_init 0-2-3 27411 &seq_read_27411 ++ib_dma_map_sg_27413 ib_dma_map_sg 0-3 27413 NULL ++lx_set_granularity_27414 lx_set_granularity 0 27414 NULL nohasharray ++brcmf_sdio_firmware_callback_27414 brcmf_sdio_firmware_callback 4 27414 &lx_set_granularity_27414 ++ieee80211_if_read_smps_27416 ieee80211_if_read_smps 3-0 27416 NULL nohasharray ++acpi_os_get_root_pointer_27416 acpi_os_get_root_pointer 0 27416 &ieee80211_if_read_smps_27416 ++crc32_pclmul_update_27419 crc32_pclmul_update 0 27419 NULL ++gfs2_statfs_i_27420 gfs2_statfs_i 0 27420 NULL ++cxgb4vf_open_27421 cxgb4vf_open 0 27421 NULL ++ocfs2_refcount_cal_cow_clusters_27422 ocfs2_refcount_cal_cow_clusters 0 27422 NULL ++cypress_write_27423 cypress_write 4-0 27423 NULL ++wacom_status0_luminance_show_27424 wacom_status0_luminance_show 0 27424 NULL ++show_spi_transport_dt_27426 show_spi_transport_dt 0 27426 NULL ++iwl_send_phy_db_data_27427 iwl_send_phy_db_data 0 27427 NULL ++rds_ib_map_fmr_27428 rds_ib_map_fmr 4 27428 NULL ++show_shost_active_mode_27434 show_shost_active_mode 0 27434 NULL ++fat_write_inode_27435 fat_write_inode 0 27435 NULL ++mc13892_gpo_regulator_enable_27436 mc13892_gpo_regulator_enable 0 27436 NULL nohasharray ++carl9170_init_mac_27436 carl9170_init_mac 0 27436 &mc13892_gpo_regulator_enable_27436 ++priority_show_27437 priority_show 0 27437 NULL nohasharray ++__iscsi_disc_store_password_mutual_27437 __iscsi_disc_store_password_mutual 0-3 27437 &priority_show_27437 ++acpi_ps_get_arguments_27439 acpi_ps_get_arguments 0 27439 NULL ++set_activate_slack_27445 set_activate_slack 0-4 27445 NULL ++sddr09_read_data_27447 sddr09_read_data 3 27447 NULL nohasharray ++lx_pipe_stop_27447 lx_pipe_stop 0 27447 &sddr09_read_data_27447 nohasharray ++deadline_writes_starved_show_27447 deadline_writes_starved_show 0 27447 &lx_pipe_stop_27447 ++xfs_btree_lookup_get_block_27448 xfs_btree_lookup_get_block 0 27448 NULL nohasharray ++hfsplus_create_attributes_file_27448 hfsplus_create_attributes_file 0 27448 &xfs_btree_lookup_get_block_27448 ++cdc_ncm_store_tx_max_27458 cdc_ncm_store_tx_max 0-4 27458 NULL ++nes_show_nonidx_addr_27463 nes_show_nonidx_addr 0 27463 NULL nohasharray ++show_link_rate_27463 show_link_rate 0 27463 &nes_show_nonidx_addr_27463 ++tpm_show_ppi_response_27464 tpm_show_ppi_response 0 27464 NULL ++sriov_numvfs_show_27465 sriov_numvfs_show 0 27465 NULL ++dvb_usbv2_generic_rw_locked_27467 dvb_usbv2_generic_rw_locked 0 27467 NULL ++osst_write_frame_27472 osst_write_frame 0 27472 NULL nohasharray ++amd_pmu_cpu_prepare_27472 amd_pmu_cpu_prepare 0 27472 &osst_write_frame_27472 ++vivid_user_vid_s_ctrl_27477 vivid_user_vid_s_ctrl 0 27477 NULL ++ipath_write_umem32_27483 ipath_write_umem32 0 27483 NULL ++rtsx_write_cfg_seq_27485 rtsx_write_cfg_seq 3-5 27485 NULL ++adt7410_i2c_write_byte_27489 adt7410_i2c_write_byte 0 27489 NULL ++pm_runtime_put_sync_27493 pm_runtime_put_sync 0 27493 NULL ++hcd_buffer_alloc_27495 hcd_buffer_alloc 2 27495 NULL ++qib_create_cq_27497 qib_create_cq 2 27497 NULL ++ip_set_get_h32_27498 ip_set_get_h32 0 27498 NULL nohasharray ++tpacpi_driver_wlsw_emulstate_show_27498 tpacpi_driver_wlsw_emulstate_show 0 27498 &ip_set_get_h32_27498 ++btrfs_get_64_27499 btrfs_get_64 0 27499 NULL nohasharray ++ahci_store_em_buffer_27499 ahci_store_em_buffer 0-4 27499 &btrfs_get_64_27499 ++core_alua_show_offline_bit_27500 core_alua_show_offline_bit 0 27500 NULL nohasharray ++vtpm_recv_27500 vtpm_recv 0-3 27500 &core_alua_show_offline_bit_27500 nohasharray ++__usbnet_write_cmd_27500 __usbnet_write_cmd 0-7 27500 &vtpm_recv_27500 ++iscsi_nacl_auth_store_password_mutual_27503 iscsi_nacl_auth_store_password_mutual 0-3 27503 NULL ++show_port_phy_27505 show_port_phy 0 27505 NULL ++garmin_read_process_27509 garmin_read_process 3 27509 NULL nohasharray ++mcryptd_hash_setkey_27509 mcryptd_hash_setkey 3 27509 &garmin_read_process_27509 ++oti_alloc_cookies_27510 oti_alloc_cookies 2 27510 NULL ++iwl_pcie_load_given_ucode_27511 iwl_pcie_load_given_ucode 0 27511 NULL ++uwb_dev_DevAddr_show_27512 uwb_dev_DevAddr_show 0 27512 NULL nohasharray ++show_initsize_27512 show_initsize 0 27512 &uwb_dev_DevAddr_show_27512 ++store_sensor_27515 store_sensor 0-4 27515 NULL ++cifs_reopen_file_27517 cifs_reopen_file 0 27517 NULL ++ibwdt_write_27518 ibwdt_write 0-3 27518 NULL ++edac_dev_instance_store_27519 edac_dev_instance_store 0-4 27519 NULL ++ocfs2_rw_lock_27520 ocfs2_rw_lock 0 27520 NULL ++skfp_ctl_set_mac_address_27523 skfp_ctl_set_mac_address 0 27523 NULL ++ib_copy_to_udata_27525 ib_copy_to_udata 3 27525 NULL ++ipath_user_sdma_queue_pkts_27534 ipath_user_sdma_queue_pkts 0 27534 NULL ++C_SYSC_fcntl_27538 C_SYSC_fcntl 3 27538 NULL nohasharray ++iscsi_stat_login_show_attr_accepts_27538 iscsi_stat_login_show_attr_accepts 0 27538 &C_SYSC_fcntl_27538 nohasharray ++sky2_setup_irq_27538 sky2_setup_irq 0 27538 &iscsi_stat_login_show_attr_accepts_27538 ++snd_hdspm_ioctl_27545 snd_hdspm_ioctl 0 27545 NULL ++acpi_ut_get_simple_object_size_27557 acpi_ut_get_simple_object_size 0 27557 NULL ++target_stat_scsi_lu_show_attr_full_stat_27558 target_stat_scsi_lu_show_attr_full_stat 0 27558 NULL nohasharray ++smb2_wp_retry_size_27558 smb2_wp_retry_size 0 27558 &target_stat_scsi_lu_show_attr_full_stat_27558 ++cw1200_get_stats_27559 cw1200_get_stats 0 27559 NULL ++sm501_gpio_output_27561 sm501_gpio_output 0 27561 NULL ++get_pwm1_auto_channels_temp_27566 get_pwm1_auto_channels_temp 0 27566 NULL ++cachefiles_has_space_27567 cachefiles_has_space 0 27567 NULL ++rtpm_suspended_time_show_27569 rtpm_suspended_time_show 0 27569 NULL ++SyS_fgetxattr_27571 SyS_fgetxattr 4 27571 NULL ++sco_sock_recvmsg_27572 sco_sock_recvmsg 0-4 27572 NULL ++libipw_alloc_txb_27579 libipw_alloc_txb 1-3-2 27579 NULL nohasharray ++pas_midi_open_27579 pas_midi_open 0 27579 &libipw_alloc_txb_27579 ++mt9m111_setup_rect_ctx_27585 mt9m111_setup_rect_ctx 0 27585 NULL ++cx231xx_gpio_i2c_read_27587 cx231xx_gpio_i2c_read 0 27587 NULL ++dquot_transfer_27588 dquot_transfer 0 27588 NULL nohasharray ++lpfc_fcp_io_sched_store_27588 lpfc_fcp_io_sched_store 0-4 27588 &dquot_transfer_27588 ++fw_map_pages_buf_27597 fw_map_pages_buf 0 27597 NULL ++eth_mac_addr_27598 eth_mac_addr 0 27598 NULL ++target_stat_scsi_auth_intr_show_attr_dev_or_port_27601 target_stat_scsi_auth_intr_show_attr_dev_or_port 0 27601 NULL ++iio_trigger_read_current_27602 iio_trigger_read_current 0 27602 NULL ++tipc_cfg_reply_alloc_27606 tipc_cfg_reply_alloc 1 27606 NULL ++show_mem_state_27608 show_mem_state 0 27608 NULL nohasharray ++platform_suspend_begin_27608 platform_suspend_begin 0 27608 &show_mem_state_27608 ++mgmt_device_connected_27618 mgmt_device_connected 5 27618 NULL ++max_age_show_27620 max_age_show 0 27620 NULL ++show_fnode_immediate_data_27630 show_fnode_immediate_data 0 27630 NULL ++bit_doAddress_27635 bit_doAddress 0 27635 NULL ++C_SYSC_mbind_27636 C_SYSC_mbind 5 27636 NULL nohasharray ++thread_siblings_show_27636 thread_siblings_show 0 27636 &C_SYSC_mbind_27636 nohasharray ++drbd_recv_27636 drbd_recv 3-0 27636 &thread_siblings_show_27636 ++connect_27639 connect 0 27639 NULL ++ocfs2_xattr_ibody_get_27642 ocfs2_xattr_ibody_get 0 27642 NULL nohasharray ++read_flush_procfs_27642 read_flush_procfs 3-0 27642 &ocfs2_xattr_ibody_get_27642 nohasharray ++xfs_alloc_vextent_27642 xfs_alloc_vextent 0 27642 &read_flush_procfs_27642 ++add_new_gdb_27643 add_new_gdb 3 27643 NULL nohasharray ++profiling_show_27643 profiling_show 0 27643 &add_new_gdb_27643 ++qnx6_readpages_27657 qnx6_readpages 4 27657 NULL ++iscsi_stat_login_show_attr_authenticate_fails_27658 iscsi_stat_login_show_attr_authenticate_fails 0 27658 NULL ++generic_get_l4proto_27659 generic_get_l4proto 0 27659 NULL ++cdrom_read_cdda_old_27664 cdrom_read_cdda_old 4 27664 NULL ++vmlfb_set_par_locked_27666 vmlfb_set_par_locked 0 27666 NULL ++presence_read_file_27668 presence_read_file 0 27668 NULL ++vprbrd_i2c_receive_27670 vprbrd_i2c_receive 0 27670 NULL nohasharray ++qword_get_27670 qword_get 0 27670 &vprbrd_i2c_receive_27670 ++min_sync_show_27671 min_sync_show 0 27671 NULL ++adummy_proc_read_27673 adummy_proc_read 0 27673 NULL nohasharray ++recv_dless_read_27673 recv_dless_read 4 27673 &adummy_proc_read_27673 ++ocfs2_xattr_list_entries_27675 ocfs2_xattr_list_entries 0 27675 NULL ++tcm_qla2xxx_tpg_attrib_show_cache_dynamic_acls_27677 tcm_qla2xxx_tpg_attrib_show_cache_dynamic_acls 0 27677 NULL nohasharray ++free_unused_idx_lebs_27677 free_unused_idx_lebs 0 27677 &tcm_qla2xxx_tpg_attrib_show_cache_dynamic_acls_27677 ++read_27678 read 0 27678 NULL ++dm9601_link_reset_27683 dm9601_link_reset 0 27683 NULL nohasharray ++ad7793_write_frequency_27683 ad7793_write_frequency 0-4 27683 &dm9601_link_reset_27683 ++trusted_get_27684 trusted_get 0 27684 NULL ++m88e1118_config_init_27685 m88e1118_config_init 0 27685 NULL ++show_tcpOutRsts_27691 show_tcpOutRsts 0 27691 NULL nohasharray ++tcam_assoc_write_27691 tcam_assoc_write 0 27691 &show_tcpOutRsts_27691 ++cfg80211_check_combinations_27692 cfg80211_check_combinations 0 27692 NULL ++fs_path_add_from_extent_buffer_27702 fs_path_add_from_extent_buffer 4 27702 NULL ++ext2_nobh_write_begin_27704 ext2_nobh_write_begin 0 27704 NULL ++mmio16read__write_file_27708 mmio16read__write_file 0 27708 NULL ++acpi_tb_acquire_temp_table_27709 acpi_tb_acquire_temp_table 2 27709 NULL ++evm_write_key_27715 evm_write_key 3-0 27715 NULL ++ieee80211_if_fmt_dot11MeshGateAnnouncementProtocol_27722 ieee80211_if_fmt_dot11MeshGateAnnouncementProtocol 3 27722 NULL ++audit_set_loginuid_27723 audit_set_loginuid 0 27723 NULL ++reg_w_buf_27724 reg_w_buf 3 27724 NULL ++xfs_dir2_block_sfsize_27727 xfs_dir2_block_sfsize 0 27727 NULL ++ima_protect_xattr_27733 ima_protect_xattr 0 27733 NULL nohasharray ++cbaf_wusb_host_band_groups_store_27733 cbaf_wusb_host_band_groups_store 0-4 27733 &ima_protect_xattr_27733 ++a4t_cs_init_27734 a4t_cs_init 3 27734 NULL ++drv_start_27735 drv_start 0 27735 NULL ++init_timers_cpu_27741 init_timers_cpu 0 27741 NULL ++ov7660_set_auto_gain_27743 ov7660_set_auto_gain 0 27743 NULL ++do_grow_27746 do_grow 0 27746 NULL ++ims_pcu_flash_firmware_27748 ims_pcu_flash_firmware 0 27748 NULL ++roccat_common2_sysfs_write_macro_27750 roccat_common2_sysfs_write_macro 0-6-5 27750 NULL ++lp55xx_request_firmware_27754 lp55xx_request_firmware 0 27754 NULL ++snd_pcm_pre_resume_27757 snd_pcm_pre_resume 0 27757 NULL ++md4_update_27759 md4_update 0 27759 NULL nohasharray ++SyS_setsockopt_27759 SyS_setsockopt 5 27759 &md4_update_27759 ++store_io_db_27768 store_io_db 0-4 27768 NULL ++kcalloc_27770 kcalloc 2-1 27770 NULL ++security_inode_getattr_27774 security_inode_getattr 0 27774 NULL ++transport_init_session_tags_27776 transport_init_session_tags 2-1 27776 NULL ++sched_group_set_shares_27778 sched_group_set_shares 0 27778 NULL ++device_notifier_27779 device_notifier 0 27779 NULL ++megasas_fw_crash_buffer_show_27781 megasas_fw_crash_buffer_show 0 27781 NULL ++ip_sabotage_in_27782 ip_sabotage_in 0 27782 NULL ++t4vf_set_rxmode_27792 t4vf_set_rxmode 0 27792 NULL nohasharray ++twl4030_set_gpio_dataout_27792 twl4030_set_gpio_dataout 1 27792 &t4vf_set_rxmode_27792 ++megasas_sysfs_show_support_poll_for_event_27793 megasas_sysfs_show_support_poll_for_event 0 27793 NULL ++DivaSTraceGetMemotyRequirement_27797 DivaSTraceGetMemotyRequirement 0-1 27797 NULL ++ath6kl_wmi_force_roam_cmd_27800 ath6kl_wmi_force_roam_cmd 0 27800 NULL ++ttm_object_file_init_27804 ttm_object_file_init 2 27804 NULL nohasharray ++SyS_readv_27804 SyS_readv 3 27804 &ttm_object_file_init_27804 ++mpihelp_mul_27805 mpihelp_mul 5-3 27805 NULL ++sisusb_write_memio_24bit_27812 sisusb_write_memio_24bit 0 27812 NULL ++b43_phy_initn_27813 b43_phy_initn 0 27813 NULL ++f2fs_xattr_advise_list_27815 f2fs_xattr_advise_list 0-5 27815 NULL nohasharray ++percpu_counter_hotcpu_callback_27815 percpu_counter_hotcpu_callback 0 27815 &f2fs_xattr_advise_list_27815 ++max_sectors_show_27816 max_sectors_show 0 27816 NULL ++smk_set_access_27817 smk_set_access 0 27817 NULL ++snd_pcm_do_reset_27819 snd_pcm_do_reset 0 27819 NULL ++eventfd_write_27821 eventfd_write 0-3 27821 NULL ++gadget_dev_desc_UDC_show_27827 gadget_dev_desc_UDC_show 0 27827 NULL ++read_vidcpe_27830 read_vidcpe 0 27830 NULL ++sys_listxattr_27833 sys_listxattr 3 27833 NULL nohasharray ++init_header_complete_27833 init_header_complete 0 27833 &sys_listxattr_27833 ++snd_cx18_pcm_trigger_27838 snd_cx18_pcm_trigger 0 27838 NULL ++et131x_open_27842 et131x_open 0 27842 NULL ++jbd2_complete_transaction_27847 jbd2_complete_transaction 0 27847 NULL ++mv_udc_start_27855 mv_udc_start 0 27855 NULL ++read_profile_27859 read_profile 3-0 27859 NULL ++pcan_usb_pro_send_cmd_27860 pcan_usb_pro_send_cmd 0 27860 NULL nohasharray ++store_engine2_leds_27860 store_engine2_leds 4-0 27860 &pcan_usb_pro_send_cmd_27860 ++sky2_pci_read16_27863 sky2_pci_read16 0 27863 NULL ++pci_conf2_write_27866 pci_conf2_write 0 27866 NULL ++__uncore_edge_show_27869 __uncore_edge_show 0 27869 NULL ++ocfs2_file_splice_read_27870 ocfs2_file_splice_read 0 27870 NULL ++ivtv_readbyte_27872 ivtv_readbyte 0 27872 NULL nohasharray ++ipr_update_ioa_ucode_27872 ipr_update_ioa_ucode 0 27872 &ivtv_readbyte_27872 ++ieee80211_if_read_dot11MeshHWMProotInterval_27873 ieee80211_if_read_dot11MeshHWMProotInterval 3-0 27873 NULL ++diag_read_27874 diag_read 0 27874 NULL ++sch_gpio_direction_in_27878 sch_gpio_direction_in 0 27878 NULL ++set_rdac3_27880 set_rdac3 4-0 27880 NULL ++show_als_channel_27889 show_als_channel 0 27889 NULL ++unix_seqpacket_sendmsg_27893 unix_seqpacket_sendmsg 0-4 27893 NULL ++set_pwm_auto_pwm_minctl_27898 set_pwm_auto_pwm_minctl 0-4 27898 NULL ++func_27900 func 0 27900 NULL nohasharray ++tcp_v6_parse_md5_keys_27900 tcp_v6_parse_md5_keys 0 27900 &func_27900 ++gluebi_write_27905 gluebi_write 3 27905 NULL ++handle_dots_27910 handle_dots 0 27910 NULL ++store_27911 store 0-4 27911 NULL ++show_fcoe_ctlr_device_symb_err_27915 show_fcoe_ctlr_device_symb_err 0 27915 NULL ++qla2x00_zio_timer_show_27921 qla2x00_zio_timer_show 0 27921 NULL ++tps6586x_rtc_set_alarm_27924 tps6586x_rtc_set_alarm 0 27924 NULL ++adxl34x_calibrate_store_27928 adxl34x_calibrate_store 0-4 27928 NULL ++bm_find_next_27929 bm_find_next 2 27929 NULL ++adjust_tp_27930 adjust_tp 0 27930 NULL nohasharray ++set_b_bus_req_27930 set_b_bus_req 0-4 27930 &adjust_tp_27930 ++get_alarm_27933 get_alarm 0 27933 NULL ++can_attach_27934 can_attach 0 27934 NULL ++usbhsh_data_stage_packet_push_27936 usbhsh_data_stage_packet_push 0 27936 NULL ++sctp_outq_tail_27937 sctp_outq_tail 0 27937 NULL ++set_min_uV_27943 set_min_uV 0-4 27943 NULL ++mt9m111_cropcap_27947 mt9m111_cropcap 0 27947 NULL ++rt2500usb_set_device_state_27949 rt2500usb_set_device_state 0 27949 NULL nohasharray ++e1000_get_eeprom_len_27949 e1000_get_eeprom_len 0 27949 &rt2500usb_set_device_state_27949 ++_transport_get_linkerrors_27955 _transport_get_linkerrors 0 27955 NULL nohasharray ++is_xen_swiotlb_buffer_27955 is_xen_swiotlb_buffer 1 27955 &_transport_get_linkerrors_27955 ++sctp_make_abort_violation_27959 sctp_make_abort_violation 4 27959 NULL ++provisioning_mode_store_27960 provisioning_mode_store 0-4 27960 NULL ++bio_next_split_27961 bio_next_split 2 27961 NULL nohasharray ++tracing_clock_write_27961 tracing_clock_write 3 27961 &bio_next_split_27961 ++ec168_ctrl_msg_27963 ec168_ctrl_msg 0 27963 NULL ++tipc_media_addr_printf_27971 tipc_media_addr_printf 2 27971 NULL nohasharray ++nfs4_read_cached_acl_27971 nfs4_read_cached_acl 0 27971 &tipc_media_addr_printf_27971 ++mic_rx_pkts_read_27972 mic_rx_pkts_read 3-0 27972 NULL nohasharray ++device_register_27972 device_register 0 27972 &mic_rx_pkts_read_27972 ++xfs_alloc_fixup_trees_27975 xfs_alloc_fixup_trees 0 27975 NULL nohasharray ++b43legacy_upload_initvals_27975 b43legacy_upload_initvals 0 27975 &xfs_alloc_fixup_trees_27975 nohasharray ++compat_SyS_set_mempolicy_27975 compat_SyS_set_mempolicy 3 27975 &b43legacy_upload_initvals_27975 ++adm8211_hw_reset_27976 adm8211_hw_reset 0 27976 NULL ++__kernfs_setattr_27977 __kernfs_setattr 0 27977 NULL nohasharray ++pci_enable_device_flags_27977 pci_enable_device_flags 0 27977 &__kernfs_setattr_27977 ++nilfs_btree_get_new_block_27978 nilfs_btree_get_new_block 0 27978 NULL ++get_max_state_27981 get_max_state 0 27981 NULL ++target_core_alua_tg_pt_gp_store_attr_alua_support_unavailable_27982 target_core_alua_tg_pt_gp_store_attr_alua_support_unavailable 0-3 27982 NULL ++wan_set_status_27984 wan_set_status 0 27984 NULL ++erst_get_record_id_next_27988 erst_get_record_id_next 0 27988 NULL nohasharray ++igb_pci_sriov_configure_27988 igb_pci_sriov_configure 0-2 27988 &erst_get_record_id_next_27988 ++acpi_ds_result_push_27992 acpi_ds_result_push 0 27992 NULL ++edt_ft5x06_debugfs_raw_data_read_28002 edt_ft5x06_debugfs_raw_data_read 3-0 28002 NULL nohasharray ++ixgbe_pci_sriov_disable_28002 ixgbe_pci_sriov_disable 0 28002 &edt_ft5x06_debugfs_raw_data_read_28002 ++ieee802154_alloc_hw_28003 ieee802154_alloc_hw 1 28003 NULL nohasharray ++snd_trident_capture_prepare_28003 snd_trident_capture_prepare 0 28003 &ieee802154_alloc_hw_28003 nohasharray ++esd_usb2_setup_rx_urbs_28003 esd_usb2_setup_rx_urbs 0 28003 &snd_trident_capture_prepare_28003 ++store_sas_phy_minimum_linkrate_28005 store_sas_phy_minimum_linkrate 0-4 28005 NULL ++seq_get_buf_28006 seq_get_buf 0 28006 NULL ++snd_rawmidi_write_28008 snd_rawmidi_write 3-0 28008 NULL nohasharray ++tx_queue_len_show_28008 tx_queue_len_show 0 28008 &snd_rawmidi_write_28008 ++device_id_show_28011 device_id_show 0 28011 NULL ++tg_set_cfs_quota_28014 tg_set_cfs_quota 0 28014 NULL ++show_28017 show 0 28017 NULL nohasharray ++oprofile_cpu_notify_28017 oprofile_cpu_notify 0 28017 &show_28017 ++serial8250_port_size_28019 serial8250_port_size 0 28019 NULL ++get_packet_pg_28023 get_packet_pg 4 28023 NULL ++memory_block_action_28024 memory_block_action 0 28024 NULL ++powercap_register_zone_28028 powercap_register_zone 6 28028 NULL ++alloc_one_pg_vec_page_28031 alloc_one_pg_vec_page 1 28031 NULL nohasharray ++lowpan_dev_init_28031 lowpan_dev_init 0 28031 &alloc_one_pg_vec_page_28031 ++comm_nodeid_write_28033 comm_nodeid_write 0-3 28033 NULL ++in_read_bytes_avail_show_28035 in_read_bytes_avail_show 0 28035 NULL ++smc_open_28037 smc_open 0 28037 NULL nohasharray ++store_map_28037 store_map 0-4 28037 &smc_open_28037 ++show_pools_28038 show_pools 0 28038 NULL ++sctp_setsockopt_maxburst_28041 sctp_setsockopt_maxburst 3-0 28041 NULL ++xen_do_set_identity_and_remap_chunk_28045 xen_do_set_identity_and_remap_chunk 1 28045 NULL ++ath10k_hif_diag_write_28046 ath10k_hif_diag_write 0 28046 NULL ++ip_vs_dst_event_28048 ip_vs_dst_event 0 28048 NULL ++p9_fd_write_28050 p9_fd_write 3 28050 NULL ++cx231xx_init_vbi_isoc_28053 cx231xx_init_vbi_isoc 3-4-2-0 28053 NULL ++pool_status_28055 pool_status 5 28055 NULL ++init_rs_non_canonical_28059 init_rs_non_canonical 1 28059 NULL ++lpfc_idiag_mbxacc_read_28061 lpfc_idiag_mbxacc_read 3-0 28061 NULL ++tx_frag_bad_mblk_num_read_28064 tx_frag_bad_mblk_num_read 3-0 28064 NULL ++ext4_read_block_bitmap_nowait_28078 ext4_read_block_bitmap_nowait 2 28078 NULL ++ib_query_port_28079 ib_query_port 0 28079 NULL ++acpi_gsb_i2c_write_bytes_28082 acpi_gsb_i2c_write_bytes 4 28082 NULL nohasharray ++GetRecvByte_28082 GetRecvByte 0 28082 &acpi_gsb_i2c_write_bytes_28082 ++platform_get_irq_28088 platform_get_irq 0 28088 NULL nohasharray ++ext4_writepage_28088 ext4_writepage 0 28088 &platform_get_irq_28088 ++gdth_init_isa_28091 gdth_init_isa 1 28091 NULL ++xen_set_identity_and_remap_28092 xen_set_identity_and_remap 3 28092 NULL ++blk_update_nr_requests_28098 blk_update_nr_requests 0 28098 NULL ++stream_next_buffer_28101 stream_next_buffer 0 28101 NULL nohasharray ++qib_tid_free_28101 qib_tid_free 0 28101 &stream_next_buffer_28101 ++mmc_test_alloc_mem_28102 mmc_test_alloc_mem 2-3 28102 NULL ++r820t_sysfreq_sel_28105 r820t_sysfreq_sel 0 28105 NULL ++show_initstate_28108 show_initstate 0 28108 NULL ++store_tabletXtilt_28113 store_tabletXtilt 0-4 28113 NULL ++sony_pic_bluetoothpower_store_28114 sony_pic_bluetoothpower_store 0-4 28114 NULL ++rx_defrag_need_defrag_read_28117 rx_defrag_need_defrag_read 3-0 28117 NULL ++show_fan_target_28118 show_fan_target 0 28118 NULL nohasharray ++sha256_final_28118 sha256_final 0 28118 &show_fan_target_28118 ++qla2x00_allow_cna_fw_dump_store_28123 qla2x00_allow_cna_fw_dump_store 0-4 28123 NULL ++acpi_tb_install_standard_table_28124 acpi_tb_install_standard_table 1 28124 NULL nohasharray ++vgacon_adjust_height_28124 vgacon_adjust_height 2 28124 &acpi_tb_install_standard_table_28124 ++musb_mode_show_28126 musb_mode_show 0 28126 NULL ++m25p80_read_reg_28132 m25p80_read_reg 4 28132 NULL ++tx_window_errors_show_28136 tx_window_errors_show 0 28136 NULL ++perf_read_hw_28139 perf_read_hw 0 28139 NULL ++manuf_show_28140 manuf_show 0 28140 NULL ++__nfs_readpage_from_fscache_28144 __nfs_readpage_from_fscache 0 28144 NULL ++ubifs_setattr_28146 ubifs_setattr 0 28146 NULL ++video_read_28148 video_read 3-0 28148 NULL nohasharray ++store_28148 store 0 28148 &video_read_28148 ++alloc_skb_with_frags_28149 alloc_skb_with_frags 1 28149 NULL ++usb_gadget_udc_start_28152 usb_gadget_udc_start 0 28152 NULL ++snd_midi_channel_alloc_set_28153 snd_midi_channel_alloc_set 1 28153 NULL ++stats_dot11FCSErrorCount_read_28154 stats_dot11FCSErrorCount_read 3-0 28154 NULL ++tipc_sk_create_28158 tipc_sk_create 0 28158 NULL ++gen10g_config_init_28159 gen10g_config_init 0 28159 NULL ++toshiba_touchpad_get_28168 toshiba_touchpad_get 0 28168 NULL ++da9055_set_alarm_28172 da9055_set_alarm 0 28172 NULL ++vread_28173 vread 0-3 28173 NULL ++c4iw_reject_cr_28174 c4iw_reject_cr 3 28174 NULL ++hdaps_mouse_activity_show_28175 hdaps_mouse_activity_show 0 28175 NULL ++nfs_do_writepage_28176 nfs_do_writepage 0 28176 NULL ++xfs_bunmapi_28180 xfs_bunmapi 0 28180 NULL ++cifs_writepage_locked_28181 cifs_writepage_locked 0 28181 NULL ++read_disk_sb_28188 read_disk_sb 2 28188 NULL ++nvkm_output_dp_create__28192 nvkm_output_dp_create_ 6 28192 NULL ++write_irq_affinity_28193 write_irq_affinity 0-4 28193 NULL ++show_update_interval_28195 show_update_interval 0 28195 NULL nohasharray ++da9055_rtc_set_alarm_28195 da9055_rtc_set_alarm 0 28195 &show_update_interval_28195 ++cifs_reconnect_tcon_28200 cifs_reconnect_tcon 0 28200 NULL nohasharray ++nouveau_mxm_create__28200 nouveau_mxm_create_ 4 28200 &cifs_reconnect_tcon_28200 ++da9063_rtc_read_time_28206 da9063_rtc_read_time 0 28206 NULL nohasharray ++hfsplus_statfs_28206 hfsplus_statfs 0 28206 &da9063_rtc_read_time_28206 ++niu_ipp_reset_28209 niu_ipp_reset 0 28209 NULL ++mcam_ctlr_configure_28210 mcam_ctlr_configure 0 28210 NULL ++f2fs_write_end_28211 f2fs_write_end 0-5 28211 NULL ++raid5_store_group_thread_cnt_28220 raid5_store_group_thread_cnt 0-3 28220 NULL nohasharray ++pci_pm_prepare_28220 pci_pm_prepare 0 28220 &raid5_store_group_thread_cnt_28220 nohasharray ++__qp_memcpy_from_queue_28220 __qp_memcpy_from_queue 4-3 28220 &pci_pm_prepare_28220 ++vivid_sdtv_cap_s_ctrl_28222 vivid_sdtv_cap_s_ctrl 0 28222 NULL ++i2c_nuvoton_write_buf_28224 i2c_nuvoton_write_buf 0 28224 NULL nohasharray ++genwqe_sriov_configure_28224 genwqe_sriov_configure 0-2 28224 &i2c_nuvoton_write_buf_28224 ++line6_alloc_sysex_buffer_28225 line6_alloc_sysex_buffer 4 28225 NULL ++iio_sysfs_trigger_remove_28227 iio_sysfs_trigger_remove 0 28227 NULL ++cm4000_resume_28231 cm4000_resume 0 28231 NULL ++beiscsi_get_port_speed_28240 beiscsi_get_port_speed 0 28240 NULL ++ext4_validate_block_bitmap_28243 ext4_validate_block_bitmap 3 28243 NULL ++radeon_get_dpm_state_28244 radeon_get_dpm_state 0 28244 NULL ++write_28250 write 0 28250 NULL nohasharray ++usbduxfast_upload_firmware_28250 usbduxfast_upload_firmware 3 28250 &write_28250 ++ipr_show_fw_type_28251 ipr_show_fw_type 0 28251 NULL ++tcp_disconnect_28252 tcp_disconnect 0 28252 NULL ++bl_trig_invert_store_28256 bl_trig_invert_store 0-4 28256 NULL ++pci_notify_28258 pci_notify 0 28258 NULL ++add_interface_28259 add_interface 0 28259 NULL ++tipc_bclink_xmit_28262 tipc_bclink_xmit 0 28262 NULL ++airo_open_28270 airo_open 0 28270 NULL ++avtab_read_28272 avtab_read 0 28272 NULL ++mt9m111_g_crop_28273 mt9m111_g_crop 0 28273 NULL ++stk1160_i2c_check_for_device_28274 stk1160_i2c_check_for_device 0 28274 NULL ++cxacru_sysfs_show_downstream_crc_errors_28276 cxacru_sysfs_show_downstream_crc_errors 0 28276 NULL ++otg_mode_show_28282 otg_mode_show 0 28282 NULL ++inline_xattr_size_28285 inline_xattr_size 0 28285 NULL nohasharray ++dibx000_i2c_master_xfer_gpio34_28285 dibx000_i2c_master_xfer_gpio34 0-3 28285 &inline_xattr_size_28285 ++dma_map_sg_attrs_28289 dma_map_sg_attrs 0-3 28289 NULL ++SyS_ppoll_28290 SyS_ppoll 2 28290 NULL ++acpi_ut_copy_epackage_to_ipackage_28291 acpi_ut_copy_epackage_to_ipackage 0 28291 NULL ++w1_f23_write_28294 w1_f23_write 3 28294 NULL ++si476x_core_cmd_fm_acf_status_28298 si476x_core_cmd_fm_acf_status 0 28298 NULL ++ad_sigma_delta_set_mode_28299 ad_sigma_delta_set_mode 0 28299 NULL ++kstrtos16_from_user_28300 kstrtos16_from_user 2 28300 NULL ++set_fan1_div_28301 set_fan1_div 0-4 28301 NULL ++nouveau_compat_ioctl_28305 nouveau_compat_ioctl 2 28305 NULL nohasharray ++acpi_register_gsi_xen_28305 acpi_register_gsi_xen 2 28305 &nouveau_compat_ioctl_28305 ++print_fw_version_28310 print_fw_version 0 28310 NULL ++phys_switch_id_show_28314 phys_switch_id_show 0 28314 NULL ++adp5520_bl_office_max_store_28316 adp5520_bl_office_max_store 4-0 28316 NULL ++snd_pcm_oss_read_28317 snd_pcm_oss_read 3-0 28317 NULL nohasharray ++il4965_show_temperature_28317 il4965_show_temperature 0 28317 &snd_pcm_oss_read_28317 ++generic_access_phys_28318 generic_access_phys 4-2 28318 NULL ++fc2580_set_params_28319 fc2580_set_params 0 28319 NULL ++filldir64_28323 filldir64 3 28323 NULL ++card_send_command_28325 card_send_command 0 28325 NULL nohasharray ++cmos_command_store_28325 cmos_command_store 0-4 28325 &card_send_command_28325 ++elan_sysfs_read_sm_ver_28327 elan_sysfs_read_sm_ver 0 28327 NULL ++input_dev_show_cap_rel_28328 input_dev_show_cap_rel 0 28328 NULL ++generic_write_checks_28329 generic_write_checks 0 28329 NULL ++rndis_opts_host_addr_show_28331 rndis_opts_host_addr_show 0 28331 NULL nohasharray ++xpcs_mmd_read_28331 xpcs_mmd_read 3 28331 &rndis_opts_host_addr_show_28331 ++bm_entry_write_28338 bm_entry_write 3-0 28338 NULL ++mc13783_adc_read_gp_28341 mc13783_adc_read_gp 0 28341 NULL nohasharray ++show_tabletProgrammableDelay_28341 show_tabletProgrammableDelay 0 28341 &mc13783_adc_read_gp_28341 ++tg3_setup_phy_28343 tg3_setup_phy 0 28343 NULL ++michael_init_28344 michael_init 0 28344 NULL nohasharray ++tcp_copy_to_iovec_28344 tcp_copy_to_iovec 3 28344 &michael_init_28344 ++cachefiles_daemon_bstop_28345 cachefiles_daemon_bstop 0 28345 NULL ++ldlat_show_28348 ldlat_show 0 28348 NULL ++snapshot_write_28351 snapshot_write 3-0 28351 NULL ++emmaprp_buf_prepare_28353 emmaprp_buf_prepare 0 28353 NULL ++nilfs_btree_prepare_update_v_28354 nilfs_btree_prepare_update_v 0 28354 NULL ++pci_ite887x_init_28357 pci_ite887x_init 0 28357 NULL nohasharray ++show_mem_db_28357 show_mem_db 0 28357 &pci_ite887x_init_28357 nohasharray ++data_read_28357 data_read 0 28357 &show_mem_db_28357 ++ibmasm_get_next_event_28359 ibmasm_get_next_event 0 28359 NULL ++sched_cpu_active_28360 sched_cpu_active 0 28360 NULL ++send_control_msg_28366 send_control_msg 0 28366 NULL ++batadv_handle_tt_response_28370 batadv_handle_tt_response 4 28370 NULL ++gfs2_writepage_common_28372 gfs2_writepage_common 0 28372 NULL ++uwb_dev_RSSI_show_28373 uwb_dev_RSSI_show 0 28373 NULL nohasharray ++poison_show_28373 poison_show 0 28373 &uwb_dev_RSSI_show_28373 ++operstate_show_28374 operstate_show 0 28374 NULL ++rt2x00mmio_initialize_28377 rt2x00mmio_initialize 0 28377 NULL ++ext4_force_commit_28382 ext4_force_commit 0 28382 NULL ++sys_writev_28384 sys_writev 3 28384 NULL ++dlmfs_file_read_28385 dlmfs_file_read 3-0 28385 NULL nohasharray ++vb2_internal_streamon_28385 vb2_internal_streamon 0 28385 &dlmfs_file_read_28385 ++lio_target_tpg_store_enable_28391 lio_target_tpg_store_enable 0-3 28391 NULL ++tx_frag_cache_miss_read_28394 tx_frag_cache_miss_read 3-0 28394 NULL ++lio_target_wwn_show_attr_lio_version_28397 lio_target_wwn_show_attr_lio_version 0 28397 NULL nohasharray ++bnx2x_vfpf_config_rss_28397 bnx2x_vfpf_config_rss 0 28397 &lio_target_wwn_show_attr_lio_version_28397 ++apei_read_mce_28399 apei_read_mce 0 28399 NULL ++mtu_28400 mtu 0 28400 NULL ++jffs2_user_listxattr_28404 jffs2_user_listxattr 0-5 28404 NULL ++show_ata_link_sata_spd_limit_28407 show_ata_link_sata_spd_limit 0 28407 NULL nohasharray ++__uncore_tid_en_show_28407 __uncore_tid_en_show 0 28407 &show_ata_link_sata_spd_limit_28407 ++__iscsi_tpg_auth_store_userid_mutual_28409 __iscsi_tpg_auth_store_userid_mutual 0-3 28409 NULL ++compress_file_range_28412 compress_file_range 3-4 28412 NULL ++subdev_ioctl_28417 subdev_ioctl 2 28417 NULL ++ext2_xattr_list_28418 ext2_xattr_list 0 28418 NULL ++s35390a_rtc_read_time_28420 s35390a_rtc_read_time 0 28420 NULL ++__videobuf_mmap_setup_28421 __videobuf_mmap_setup 0 28421 NULL ++vfio_msi_cap_len_28424 vfio_msi_cap_len 0 28424 NULL ++p9_client_fsync_28425 p9_client_fsync 0 28425 NULL ++ksocknal_alloc_tx_28426 ksocknal_alloc_tx 2 28426 NULL ++store_sas_phy_maximum_linkrate_28428 store_sas_phy_maximum_linkrate 0-4 28428 NULL ++hid_hw_output_report_28429 hid_hw_output_report 0 28429 NULL ++snd_trident_foldback_prepare_28431 snd_trident_foldback_prepare 0 28431 NULL ++_kstrtoul_28435 _kstrtoul 0 28435 NULL ++mpage_readpages_28436 mpage_readpages 3 28436 NULL nohasharray ++decrypt_28436 decrypt 0 28436 &mpage_readpages_28436 ++direction_show_28442 direction_show 0 28442 NULL ++snd_ensoniq_playback2_prepare_28444 snd_ensoniq_playback2_prepare 0 28444 NULL ++xfs_rtfind_back_28450 xfs_rtfind_back 0 28450 NULL ++set_fan_min_28453 set_fan_min 0-4 28453 NULL ++lookup_last_28455 lookup_last 0 28455 NULL ++roccat_common2_sysfs_write_keys_thumbster_28456 roccat_common2_sysfs_write_keys_thumbster 0-6-5 28456 NULL ++key_mic_failures_read_28457 key_mic_failures_read 3-0 28457 NULL ++alloc_irq_cpu_rmap_28459 alloc_irq_cpu_rmap 1 28459 NULL ++show_fcstat_fcp_frame_alloc_failures_28461 show_fcstat_fcp_frame_alloc_failures 0 28461 NULL nohasharray ++br_nf_forward_arp_28461 br_nf_forward_arp 0 28461 &show_fcstat_fcp_frame_alloc_failures_28461 ++show_28462 show 0 28462 NULL ++set_mode_28465 set_mode 0 28465 NULL ++u132_urb_enqueue_28468 u132_urb_enqueue 0 28468 NULL ++rtl8169_get_regs_len_28470 rtl8169_get_regs_len 0 28470 NULL nohasharray ++create_urbs_28470 create_urbs 0 28470 &rtl8169_get_regs_len_28470 ++tw9910_set_scale_28474 tw9910_set_scale 0 28474 NULL nohasharray ++ubifs_leb_unmap_28474 ubifs_leb_unmap 0 28474 &tw9910_set_scale_28474 ++vmw_du_crtc_cursor_set_28479 vmw_du_crtc_cursor_set 5-4 28479 NULL ++ocfs2_backup_super_blkno_28484 ocfs2_backup_super_blkno 0-2 28484 NULL nohasharray ++tty_read_28484 tty_read 0-3 28484 &ocfs2_backup_super_blkno_28484 ++__filemap_fdatawrite_28485 __filemap_fdatawrite 0 28485 NULL ++coda_revalidate_inode_28489 coda_revalidate_inode 0 28489 NULL ++max_response_pages_28492 max_response_pages 0 28492 NULL ++pxa168_eth_set_mac_address_28494 pxa168_eth_set_mac_address 0 28494 NULL ++snd_interval_refine_max_28498 snd_interval_refine_max 0 28498 NULL ++show_iface_max_recv_dlength_28500 show_iface_max_recv_dlength 0 28500 NULL ++l2cap_sock_listen_28502 l2cap_sock_listen 0 28502 NULL ++gadget_config_name_attr_store_28503 gadget_config_name_attr_store 0-4 28503 NULL ++dt_remember_or_free_map_28507 dt_remember_or_free_map 5 28507 NULL ++show_fnode_discovery_session_28508 show_fnode_discovery_session 0 28508 NULL ++sctp_inet_listen_28516 sctp_inet_listen 0 28516 NULL ++ps_poll_upsd_utilization_read_28519 ps_poll_upsd_utilization_read 3-0 28519 NULL ++show_temp0_28521 show_temp0 0 28521 NULL nohasharray ++__next_node_28521 __next_node 1-0 28521 &show_temp0_28521 ++sh_irda_init_iobuf_28527 sh_irda_init_iobuf 2 28527 NULL nohasharray ++i2400m_tx_stats_read_28527 i2400m_tx_stats_read 3-0 28527 &sh_irda_init_iobuf_28527 ++early_init_dt_alloc_memory_arch_28528 early_init_dt_alloc_memory_arch 1 28528 NULL ++list_28535 list 0-5 28535 NULL ++capinc_tty_write_28539 capinc_tty_write 3 28539 NULL ++max16065_show_limit_28543 max16065_show_limit 0 28543 NULL nohasharray ++nx_fw_cmd_create_tx_ctx_28543 nx_fw_cmd_create_tx_ctx 0 28543 &max16065_show_limit_28543 ++sel_read_policycap_28544 sel_read_policycap 3-0 28544 NULL nohasharray ++chip_base_show_28544 chip_base_show 0 28544 &sel_read_policycap_28544 ++aio_read_events_28545 aio_read_events 3 28545 NULL nohasharray ++run_delalloc_range_28545 run_delalloc_range 3-4-0 28545 &aio_read_events_28545 nohasharray ++mptctl_getiocinfo_28545 mptctl_getiocinfo 2 28545 &run_delalloc_range_28545 ++statfs_28548 statfs 0 28548 NULL ++__pm_runtime_idle_28549 __pm_runtime_idle 0 28549 NULL ++qlcnic_sysfs_write_npar_config_28550 qlcnic_sysfs_write_npar_config 0-6-5 28550 NULL ++issue_fc_host_lip_28552 issue_fc_host_lip 0 28552 NULL ++b43legacy_debugfs_write_28556 b43legacy_debugfs_write 3-0 28556 NULL ++apds990x_lux_thresh_below_store_28558 apds990x_lux_thresh_below_store 0-4 28558 NULL ++inet_dccp_listen_28565 inet_dccp_listen 0 28565 NULL nohasharray ++store_28565 store 0-4 28565 &inet_dccp_listen_28565 ++lbs_mesh_get_28566 lbs_mesh_get 0 28566 NULL ++qp_enqueue_locked_28567 qp_enqueue_locked 0-5-3 28567 NULL nohasharray ++asymmetric_verify_28567 asymmetric_verify 3 28567 &qp_enqueue_locked_28567 ++gfs2_meta_indirect_buffer_28573 gfs2_meta_indirect_buffer 0 28573 NULL ++phys_pud_init_28574 phys_pud_init 0-2-3 28574 NULL ++saa7127_s_stream_28581 saa7127_s_stream 0 28581 NULL nohasharray ++swsusp_arch_suspend_28581 swsusp_arch_suspend 0 28581 &saa7127_s_stream_28581 ++intel_iommu_show_version_28582 intel_iommu_show_version 0 28582 NULL ++el3_open_28584 el3_open 0 28584 NULL ++capabilities_show_28586 capabilities_show 0 28586 NULL nohasharray ++cfspi_open_28586 cfspi_open 0 28586 &capabilities_show_28586 ++tg3_load_5701_a0_firmware_fix_28593 tg3_load_5701_a0_firmware_fix 0 28593 NULL ++wm8350_clear_bits_28596 wm8350_clear_bits 0 28596 NULL ++acpi_ds_eval_buffer_field_operands_28598 acpi_ds_eval_buffer_field_operands 0 28598 NULL ++map_addr_show_28602 map_addr_show 0 28602 NULL nohasharray ++write_full_28602 write_full 0-3 28602 &map_addr_show_28602 ++extract_entropy_28604 extract_entropy 5-3 28604 NULL nohasharray ++vmxnet3_get_regs_len_28604 vmxnet3_get_regs_len 0 28604 &extract_entropy_28604 ++rt73usb_set_device_state_28607 rt73usb_set_device_state 0 28607 NULL ++xgbe_common_write_28609 xgbe_common_write 2 28609 NULL ++kfifo_unused_28612 kfifo_unused 0 28612 NULL ++gfs2_fsync_28613 gfs2_fsync 0 28613 NULL nohasharray ++d_l1_down_proc_write_28613 d_l1_down_proc_write 0-3 28613 &gfs2_fsync_28613 ++iwlagn_disable_pan_28614 iwlagn_disable_pan 0 28614 NULL ++wq_cpumask_show_28617 wq_cpumask_show 0 28617 NULL ++mp_override_legacy_irq_28618 mp_override_legacy_irq 4 28618 NULL ++snd_nm256_capture_copy_28622 snd_nm256_capture_copy 5 28622 NULL nohasharray ++tsc2005_selftest_show_28622 tsc2005_selftest_show 0 28622 &snd_nm256_capture_copy_28622 ++show_host_param_ISCSI_HOST_PARAM_HWADDRESS_28624 show_host_param_ISCSI_HOST_PARAM_HWADDRESS 0 28624 NULL nohasharray ++of_node_property_read_28624 of_node_property_read 6 28624 &show_host_param_ISCSI_HOST_PARAM_HWADDRESS_28624 ++atkbd_do_show_set_28627 atkbd_do_show_set 0 28627 NULL ++llcp_raw_sock_bind_28630 llcp_raw_sock_bind 0 28630 NULL ++patch_conexant_auto_28632 patch_conexant_auto 0 28632 NULL ++si2157_get_if_frequency_28634 si2157_get_if_frequency 0 28634 NULL ++setup_usemap_28636 setup_usemap 3-4 28636 NULL ++niu_reset_tx_mac_28643 niu_reset_tx_mac 0 28643 NULL ++xfs_bmap_finish_28644 xfs_bmap_finish 0 28644 NULL ++au6610_i2c_xfer_28645 au6610_i2c_xfer 0-3 28645 NULL ++jfs_statfs_28649 jfs_statfs 0 28649 NULL ++byte_read_data_28650 byte_read_data 0 28650 NULL ++p9_fcall_alloc_28652 p9_fcall_alloc 1 28652 NULL ++nilfs_construct_dsync_segment_28656 nilfs_construct_dsync_segment 0 28656 NULL ++dpm_suspend_28657 dpm_suspend 0 28657 NULL ++fsnotify_add_event_28660 fsnotify_add_event 0 28660 NULL ++iwl_dbgfs_nic_temp_read_28662 iwl_dbgfs_nic_temp_read 3-0 28662 NULL ++btrfs_previous_item_28667 btrfs_previous_item 0 28667 NULL ++blk_queue_resize_tags_28670 blk_queue_resize_tags 2 28670 NULL ++show_refcnt_28672 show_refcnt 0 28672 NULL ++adp5520_bl_dark_max_store_28674 adp5520_bl_dark_max_store 4-0 28674 NULL ++show_auto_update_interval_28675 show_auto_update_interval 0 28675 NULL ++cgroup_add_file_28679 cgroup_add_file 0 28679 NULL ++sysfs_format_mac_28681 sysfs_format_mac 0 28681 NULL nohasharray ++_picolcd_flash_read_28681 _picolcd_flash_read 0 28681 &sysfs_format_mac_28681 nohasharray ++__dev_alloc_skb_28681 __dev_alloc_skb 1 28681 &_picolcd_flash_read_28681 ++SyS_setgroups16_28686 SyS_setgroups16 1 28686 NULL ++adau1701_register_size_28688 adau1701_register_size 0 28688 NULL ++hugetlb_total_pages_28689 hugetlb_total_pages 0 28689 NULL ++min_show_28691 min_show 0 28691 NULL nohasharray ++softing_netdev_open_28691 softing_netdev_open 0 28691 &min_show_28691 ++usb6fire_pcm_prepare_28692 usb6fire_pcm_prepare 0 28692 NULL nohasharray ++mem_used_max_show_28692 mem_used_max_show 0 28692 &usb6fire_pcm_prepare_28692 ++_nfs41_proc_fsid_present_28693 _nfs41_proc_fsid_present 0 28693 NULL ++musb_vbus_store_28696 musb_vbus_store 0-4 28696 NULL ++set_pwm_mode_28704 set_pwm_mode 0-4 28704 NULL ++balance_level_28707 balance_level 0 28707 NULL ++power_28709 power 0 28709 NULL nohasharray ++show_vid_reg_28709 show_vid_reg 0 28709 &power_28709 nohasharray ++zd_ep_regs_out_msg_28709 zd_ep_regs_out_msg 0 28709 &show_vid_reg_28709 ++carl9170_set_freq_cal_data_28713 carl9170_set_freq_cal_data 0 28713 NULL ++tcp_cgroup_write_28723 tcp_cgroup_write 0-3 28723 NULL ++ip6_pkt_discard_out_28724 ip6_pkt_discard_out 0 28724 NULL ++spi_sync_locked_28726 spi_sync_locked 0 28726 NULL ++nfs_revalidate_file_size_28731 nfs_revalidate_file_size 0 28731 NULL nohasharray ++drm_plane_init_28731 drm_plane_init 6 28731 &nfs_revalidate_file_size_28731 ++spi_execute_28736 spi_execute 5 28736 NULL ++snd_pcm_aio_write_28738 snd_pcm_aio_write 3-0 28738 NULL nohasharray ++mwifiex_cmd_tx_rate_cfg_28738 mwifiex_cmd_tx_rate_cfg 0 28738 &snd_pcm_aio_write_28738 ++switch_channel_28739 switch_channel 0 28739 NULL ++hotkey_enable_show_28742 hotkey_enable_show 0 28742 NULL ++read_file_btcoex_28743 read_file_btcoex 3-0 28743 NULL ++max_hw_blocks_28748 max_hw_blocks 0 28748 NULL ++getprocattr_28754 getprocattr 0 28754 NULL ++w1_f2d_fix_count_28757 w1_f2d_fix_count 0-2-1-3 28757 NULL ++r500_hw_i2c_xfer_28761 r500_hw_i2c_xfer 0-3 28761 NULL nohasharray ++show_fnode_tcp_nagle_disable_28761 show_fnode_tcp_nagle_disable 0 28761 &r500_hw_i2c_xfer_28761 nohasharray ++sha1_mb_init_28761 sha1_mb_init 0 28761 &show_fnode_tcp_nagle_disable_28761 ++nv50_dmac_create_28762 nv50_dmac_create 5 28762 NULL ++set_beep_mask_28764 set_beep_mask 0-4 28764 NULL ++rpc_pipe_generic_upcall_28766 rpc_pipe_generic_upcall 4-0 28766 NULL ++peek_head_len_28771 peek_head_len 0 28771 NULL ++ima_lsm_rule_init_28777 ima_lsm_rule_init 0 28777 NULL ++ath6kl_get_num_reg_28780 ath6kl_get_num_reg 0 28780 NULL ++ad5360_read_dac_powerdown_28781 ad5360_read_dac_powerdown 0 28781 NULL nohasharray ++store_bit_28781 store_bit 0-4 28781 &ad5360_read_dac_powerdown_28781 ++set_mode_28785 set_mode 0 28785 NULL ++dvb_net_sec_callback_28786 dvb_net_sec_callback 2 28786 NULL ++__iscsi_nacl_auth_show_userid_mutual_28790 __iscsi_nacl_auth_show_userid_mutual 0 28790 NULL ++thaw_super_28793 thaw_super 0 28793 NULL ++sel_write_member_28800 sel_write_member 3 28800 NULL ++show_28801 show 0 28801 NULL ++update_28806 update 0 28806 NULL ++mv_ep_queue_28810 mv_ep_queue 0 28810 NULL ++set_lbt_28811 set_lbt 0 28811 NULL ++udp_packet_28817 udp_packet 0 28817 NULL ++user_preparse_28821 user_preparse 0 28821 NULL ++iwl_send_bt_init_conf_old_28822 iwl_send_bt_init_conf_old 0 28822 NULL nohasharray ++__niu_set_and_wait_clear_mac_28822 __niu_set_and_wait_clear_mac 0 28822 &iwl_send_bt_init_conf_old_28822 ++show_prochot_28824 show_prochot 0 28824 NULL ++savagefb_decode_var_28826 savagefb_decode_var 0 28826 NULL ++iwl_dbgfs_rxon_filter_flags_read_28832 iwl_dbgfs_rxon_filter_flags_read 3-0 28832 NULL ++itg3200_write_reg_8_28833 itg3200_write_reg_8 0 28833 NULL nohasharray ++kernel_tree_alloc_28833 kernel_tree_alloc 1 28833 &itg3200_write_reg_8_28833 ++ims_pcu_read_ofn_config_28839 ims_pcu_read_ofn_config 0 28839 NULL ++udplite_packet_28840 udplite_packet 0 28840 NULL ++set_fan_off_28841 set_fan_off 0-4 28841 NULL nohasharray ++parser_init_byteStream_28841 parser_init_byteStream 2 28841 &set_fan_off_28841 ++lldd_control_phy_28842 lldd_control_phy 0 28842 NULL ++vp_request_msix_vectors_28849 vp_request_msix_vectors 2 28849 NULL ++lp5523_selftest_28851 lp5523_selftest 0 28851 NULL ++ds2781_set_sense_resistor_value_28853 ds2781_set_sense_resistor_value 0-4 28853 NULL ++ssb_bus_powerup_28855 ssb_bus_powerup 0 28855 NULL ++gc_timer_show_28856 gc_timer_show 0 28856 NULL ++input_dev_show_phys_28859 input_dev_show_phys 0 28859 NULL ++e100_self_test_28862 e100_self_test 0 28862 NULL ++ipv6_renew_options_28867 ipv6_renew_options 5 28867 NULL ++disk_store_28868 disk_store 0-4 28868 NULL ++profile_init_28870 profile_init 0 28870 NULL ++b43_gphy_op_interf_mitigation_28872 b43_gphy_op_interf_mitigation 0 28872 NULL ++unix_create_28874 unix_create 0 28874 NULL ++hotkey_all_mask_show_28875 hotkey_all_mask_show 0 28875 NULL nohasharray ++show_selfballoon_reserved_mb_28875 show_selfballoon_reserved_mb 0 28875 &hotkey_all_mask_show_28875 ++packet_sendmsg_spkt_28885 packet_sendmsg_spkt 4-0 28885 NULL nohasharray ++show_temp1_28885 show_temp1 0 28885 &packet_sendmsg_spkt_28885 ++acpi_ut_copy_iobject_to_iobject_28894 acpi_ut_copy_iobject_to_iobject 0 28894 NULL ++da9055_group_write_28904 da9055_group_write 2-3-0 28904 NULL ++nilfs_direct_delete_28910 nilfs_direct_delete 0 28910 NULL ++set_pwm_min_28914 set_pwm_min 0-4 28914 NULL ++vmci_qpair_dequeue_28915 vmci_qpair_dequeue 3 28915 NULL nohasharray ++at91ether_start_28915 at91ether_start 0 28915 &vmci_qpair_dequeue_28915 ++pci_reset_hotplug_slot_28919 pci_reset_hotplug_slot 0 28919 NULL ++cifs_linux_ext_proc_write_28920 cifs_linux_ext_proc_write 0-3 28920 NULL nohasharray ++tcp_md5_do_add_28920 tcp_md5_do_add 0 28920 &cifs_linux_ext_proc_write_28920 ++usbip_status_show_28921 usbip_status_show 0 28921 NULL nohasharray ++als_lux_input_data_show_28921 als_lux_input_data_show 0 28921 &usbip_status_show_28921 ++get_video_status_28922 get_video_status 0 28922 NULL ++walk_tg_tree_from_28923 walk_tg_tree_from 0 28923 NULL ++ps_upsd_timeouts_read_28924 ps_upsd_timeouts_read 3-0 28924 NULL ++iwl_dbgfs_sleep_level_override_write_28925 iwl_dbgfs_sleep_level_override_write 3-0 28925 NULL ++ocfs2_frozen_trigger_28929 ocfs2_frozen_trigger 4 28929 NULL ++__ext2_write_inode_28931 __ext2_write_inode 0 28931 NULL ++btrfs_set_prop_28935 btrfs_set_prop 0 28935 NULL ++patch_cs4213_28937 patch_cs4213 0 28937 NULL ++push_rx_28939 push_rx 3 28939 NULL ++mxuport_prepare_write_buffer_28943 mxuport_prepare_write_buffer 3 28943 NULL ++ds1305_nvram_write_28944 ds1305_nvram_write 0-5-6 28944 NULL ++snd_pcm_add_28947 snd_pcm_add 0 28947 NULL ++icmp_packet_28950 icmp_packet 0 28950 NULL ++affs_intl_hash_dentry_28953 affs_intl_hash_dentry 0 28953 NULL ++cas_get_regs_len_28954 cas_get_regs_len 0 28954 NULL ++ext3_xattr_trusted_get_28960 ext3_xattr_trusted_get 0 28960 NULL ++btrfs_trim_block_group_28963 btrfs_trim_block_group 3-4 28963 NULL ++ext4_unfreeze_28966 ext4_unfreeze 0 28966 NULL ++adxl34x_disable_show_28969 adxl34x_disable_show 0 28969 NULL nohasharray ++cur_speed_read_file_28969 cur_speed_read_file 0 28969 &adxl34x_disable_show_28969 ++alloc_sched_domains_28972 alloc_sched_domains 1 28972 NULL ++set_lcd_level_alt_28975 set_lcd_level_alt 0 28975 NULL ++hash_net6_expire_28979 hash_net6_expire 4 28979 NULL nohasharray ++ltc4215_show_voltage_28979 ltc4215_show_voltage 0 28979 &hash_net6_expire_28979 ++vnic_dev_del_addr_28980 vnic_dev_del_addr 0 28980 NULL ++xfs_alloc_update_28982 xfs_alloc_update 0 28982 NULL ++koneplus_sysfs_write_macro_28983 koneplus_sysfs_write_macro 0-6-5 28983 NULL ++ext4_mb_add_groupinfo_28988 ext4_mb_add_groupinfo 2 28988 NULL nohasharray ++cbus_receive_bit_28988 cbus_receive_bit 0 28988 &ext4_mb_add_groupinfo_28988 nohasharray ++ql_adapter_down_28988 ql_adapter_down 0 28988 &cbus_receive_bit_28988 ++ov2640_cropcap_28991 ov2640_cropcap 0 28991 NULL ++netlink_bind_28992 netlink_bind 0 28992 NULL ++hci_sock_setsockopt_28993 hci_sock_setsockopt 5-0 28993 NULL ++device_show_bool_28994 device_show_bool 0 28994 NULL ++store_28995 store 0 28995 NULL ++bin_uuid_28999 bin_uuid 3 28999 NULL nohasharray ++config_rom_show_28999 config_rom_show 0 28999 &bin_uuid_28999 nohasharray ++set_mtu_28999 set_mtu 0 28999 &config_rom_show_28999 ++show_counter_rx_flow_ctrl_errs_29001 show_counter_rx_flow_ctrl_errs 0 29001 NULL ++fdb_insert_29003 fdb_insert 0 29003 NULL ++fd_execute_rw_29004 fd_execute_rw 3 29004 NULL ++rv3029c2_rtc_i2c_alarm_set_irq_29006 rv3029c2_rtc_i2c_alarm_set_irq 0 29006 NULL ++zd_mac_init_hw_29016 zd_mac_init_hw 0 29016 NULL ++read_alloc_29022 read_alloc 0 29022 NULL ++show_fc_rport_roles_29026 show_fc_rport_roles 0 29026 NULL nohasharray ++__uncore_fvc_show_29026 __uncore_fvc_show 0 29026 &show_fc_rport_roles_29026 nohasharray ++iscsi_stat_sess_show_attr_txdata_octs_29026 iscsi_stat_sess_show_attr_txdata_octs 0 29026 &__uncore_fvc_show_29026 ++rmd160_update_29027 rmd160_update 0 29027 NULL ++xz_dec_init_29029 xz_dec_init 2 29029 NULL ++channels_supported_show_29031 channels_supported_show 0 29031 NULL nohasharray ++sys_fcntl64_29031 sys_fcntl64 3 29031 &channels_supported_show_29031 ++show_can_queue_29035 show_can_queue 0 29035 NULL nohasharray ++hot_add_disk_29035 hot_add_disk 0 29035 &show_can_queue_29035 ++zd_iowrite32_locked_29036 zd_iowrite32_locked 0 29036 NULL ++coda_ioctl_permission_29037 coda_ioctl_permission 0 29037 NULL ++ov772x_s_ctrl_29039 ov772x_s_ctrl 0 29039 NULL nohasharray ++apds990x_prox_threshold_show_29039 apds990x_prox_threshold_show 0 29039 &ov772x_s_ctrl_29039 ++ieee80211_if_read_ht_opmode_29044 ieee80211_if_read_ht_opmode 3-0 29044 NULL nohasharray ++load_patch_29044 load_patch 0 29044 &ieee80211_if_read_ht_opmode_29044 ++ipath_dma_map_single_29047 ipath_dma_map_single 0 29047 NULL ++rxrpc_sendmsg_29049 rxrpc_sendmsg 4-0 29049 NULL nohasharray ++lm3639_bled_mode_store_29049 lm3639_bled_mode_store 0-4 29049 &rxrpc_sendmsg_29049 ++tso_fragment_29050 tso_fragment 3 29050 NULL ++open_tx_first_29051 open_tx_first 0 29051 NULL ++send_request_29054 send_request 0 29054 NULL ++ixgbe_setup_all_rx_resources_29055 ixgbe_setup_all_rx_resources 0 29055 NULL ++store_pwm_auto_prochot_ramp_29057 store_pwm_auto_prochot_ramp 0-4 29057 NULL ++xhci_queue_isoc_tx_prepare_29060 xhci_queue_isoc_tx_prepare 0 29060 NULL nohasharray ++tps6586x_rtc_read_time_29060 tps6586x_rtc_read_time 0 29060 &xhci_queue_isoc_tx_prepare_29060 ++iso_packets_buffer_init_29061 iso_packets_buffer_init 3-4 29061 NULL ++amd64_dbam0_show_29062 amd64_dbam0_show 0 29062 NULL ++show_session_param_ISCSI_PARAM_TSID_29064 show_session_param_ISCSI_PARAM_TSID 0 29064 NULL ++lpfc_idiag_extacc_drivr_get_29067 lpfc_idiag_extacc_drivr_get 0-3 29067 NULL ++sctp_getsockopt_assoc_stats_29074 sctp_getsockopt_assoc_stats 2 29074 NULL ++_nfs4_proc_getattr_29076 _nfs4_proc_getattr 0 29076 NULL ++igbvf_request_msix_29079 igbvf_request_msix 0 29079 NULL ++ubifs_statfs_29082 ubifs_statfs 0 29082 NULL ++qla24xx_vport_create_req_sanity_check_29083 qla24xx_vport_create_req_sanity_check 0 29083 NULL ++ds2781_write_param_eeprom_bin_29084 ds2781_write_param_eeprom_bin 6-5-0 29084 NULL nohasharray ++xfs_alloc_ag_vextent_small_29084 xfs_alloc_ag_vextent_small 0 29084 &ds2781_write_param_eeprom_bin_29084 nohasharray ++ixgbevf_setup_all_rx_resources_29084 ixgbevf_setup_all_rx_resources 0 29084 &xfs_alloc_ag_vextent_small_29084 ++cfq_back_seek_penalty_show_29085 cfq_back_seek_penalty_show 0 29085 NULL ++iwl_dbgfs_log_event_write_29088 iwl_dbgfs_log_event_write 3-0 29088 NULL ++show_29089 show 0 29089 NULL ++jffs2_write_inode_range_29090 jffs2_write_inode_range 0 29090 NULL ++sh_veu_buf_prepare_29093 sh_veu_buf_prepare 0 29093 NULL ++ccp_init_dm_workarea_29097 ccp_init_dm_workarea 3 29097 NULL ++pwm_duty_cycle_show_29098 pwm_duty_cycle_show 0 29098 NULL ++tps65090_try_enable_fet_29101 tps65090_try_enable_fet 0 29101 NULL ++__compat_sys_preadv64_29103 __compat_sys_preadv64 3 29103 NULL ++isdn_ppp_write_29109 isdn_ppp_write 4-0 29109 NULL nohasharray ++ddebug_exec_query_29109 ddebug_exec_query 0 29109 &isdn_ppp_write_29109 ++show_tach_29110 show_tach 0 29110 NULL ++il3945_txq_ctx_reset_29111 il3945_txq_ctx_reset 0 29111 NULL ++ads7828_show_in_29115 ads7828_show_in 0 29115 NULL ++pcifront_bus_read_29118 pcifront_bus_read 0 29118 NULL ++iad_bInterfaceCount_show_29124 iad_bInterfaceCount_show 0 29124 NULL nohasharray ++rcu_pm_notify_29124 rcu_pm_notify 0 29124 &iad_bInterfaceCount_show_29124 ++snprintf_29125 snprintf 0 29125 NULL ++init_mac_29127 init_mac 0 29127 NULL ++debug_cow_store_29128 debug_cow_store 4-0 29128 NULL ++iov_shorten_29130 iov_shorten 0 29130 NULL ++lx_pipe_wait_for_start_29133 lx_pipe_wait_for_start 0 29133 NULL ++nr_overcommit_hugepages_store_29134 nr_overcommit_hugepages_store 0-4 29134 NULL ++show_nports_29139 show_nports 0 29139 NULL nohasharray ++ns_config_init_29139 ns_config_init 0 29139 &show_nports_29139 nohasharray ++vxge_set_mac_addr_29139 vxge_set_mac_addr 0 29139 &ns_config_init_29139 ++proc_scsi_write_29142 proc_scsi_write 3-0 29142 NULL nohasharray ++regulator_suspend_standby_mode_show_29142 regulator_suspend_standby_mode_show 0 29142 &proc_scsi_write_29142 nohasharray ++pn_socket_bind_29142 pn_socket_bind 0 29142 ®ulator_suspend_standby_mode_show_29142 ++store_lwid_enb_29143 store_lwid_enb 0-4 29143 NULL ++chunksize_show_29145 chunksize_show 0 29145 NULL ++reshape_ring_29147 reshape_ring 2 29147 NULL ++show_29152 show 0 29152 NULL nohasharray ++qnx6_statfs_29152 qnx6_statfs 0 29152 &show_29152 ++show_tabletStylusLower_29161 show_tabletStylusLower 0 29161 NULL ++ds2781_read8_29162 ds2781_read8 0-3 29162 NULL ++rndis_opts_ifname_show_29164 rndis_opts_ifname_show 0 29164 NULL ++bpck_read_regr_29165 bpck_read_regr 0 29165 NULL ++deadline_fifo_batch_show_29166 deadline_fifo_batch_show 0 29166 NULL ++tc3589x_set_bits_29167 tc3589x_set_bits 0 29167 NULL nohasharray ++mxt_process_messages_until_invalid_29167 mxt_process_messages_until_invalid 0 29167 &tc3589x_set_bits_29167 ++badblocks_show_29175 badblocks_show 0 29175 NULL ++dummy_systimer_start_29176 dummy_systimer_start 0 29176 NULL ++context_struct_to_string_29181 context_struct_to_string 0 29181 NULL nohasharray ++target_core_dev_pr_show_attr_res_aptpl_metadata_29181 target_core_dev_pr_show_attr_res_aptpl_metadata 0 29181 &context_struct_to_string_29181 ++get_trip_type_29198 get_trip_type 0 29198 NULL nohasharray ++show_ata_dev_class_29198 show_ata_dev_class 0 29198 &get_trip_type_29198 nohasharray ++l1oip_law_to_4bit_29198 l1oip_law_to_4bit 0 29198 &show_ata_dev_class_29198 ++drm_property_create_enum_29201 drm_property_create_enum 5 29201 NULL ++tda18271_get_if_frequency_29202 tda18271_get_if_frequency 0 29202 NULL nohasharray ++kxcjk1013_set_mode_29202 kxcjk1013_set_mode 0 29202 &tda18271_get_if_frequency_29202 ++alloc_group_attrs_29203 alloc_group_attrs 3 29203 NULL nohasharray ++wusb_prf_256_29203 wusb_prf_256 7-0 29203 &alloc_group_attrs_29203 ++comedi_alloc_subdevices_29207 comedi_alloc_subdevices 2 29207 NULL ++processor_get_max_state_29208 processor_get_max_state 0 29208 NULL ++disable_vport_29223 disable_vport 0 29223 NULL ++iwl_dbgfs_temperature_read_29224 iwl_dbgfs_temperature_read 3-0 29224 NULL nohasharray ++snd_seq_ioctl_set_client_info_29224 snd_seq_ioctl_set_client_info 0 29224 &iwl_dbgfs_temperature_read_29224 nohasharray ++security_socket_recvmsg_29224 security_socket_recvmsg 0 29224 &snd_seq_ioctl_set_client_info_29224 ++nvme_trans_copy_from_user_29227 nvme_trans_copy_from_user 3 29227 NULL ++aat2870_ldo_enable_29229 aat2870_ldo_enable 0 29229 NULL nohasharray ++pages_unshared_show_29229 pages_unshared_show 0 29229 &aat2870_ldo_enable_29229 ++l2tp_ip6_bind_29230 l2tp_ip6_bind 0 29230 NULL ++t4vf_wr_mbox_29233 t4vf_wr_mbox 0 29233 NULL ++devm_ioremap_29235 devm_ioremap 2-3 29235 NULL ++irq_domain_add_linear_29236 irq_domain_add_linear 2 29236 NULL ++max6875_read_29237 max6875_read 0-5-6 29237 NULL nohasharray ++target_stat_scsi_att_intr_port_show_attr_inst_29237 target_stat_scsi_att_intr_port_show_attr_inst 0 29237 &max6875_read_29237 ++recover_peb_29238 recover_peb 7-6-0 29238 NULL ++evdev_handle_get_val_29242 evdev_handle_get_val 6-5 29242 NULL ++rw_verify_area_29243 rw_verify_area 0-4 29243 NULL ++help_29245 help 0 29245 NULL nohasharray ++wake_store_29245 wake_store 0-4 29245 &help_29245 ++security_context_to_sid_core_29248 security_context_to_sid_core 2-0 29248 NULL ++sta_info_insert_check_29250 sta_info_insert_check 0 29250 NULL nohasharray ++snd_hda_jack_add_kctls_29250 snd_hda_jack_add_kctls 0 29250 &sta_info_insert_check_29250 ++alc_codec_rename_29252 alc_codec_rename 0 29252 NULL ++roccat_common2_sysfs_read_buttons_29258 roccat_common2_sysfs_read_buttons 0-5-6 29258 NULL ++irst_store_wakeup_time_29260 irst_store_wakeup_time 0-4 29260 NULL ++mwifiex_hscfg_write_29262 mwifiex_hscfg_write 3-0 29262 NULL ++snd_rme9652_prepare_29263 snd_rme9652_prepare 0 29263 NULL ++trans_stat_show_29266 trans_stat_show 0 29266 NULL ++et131x_tx_dma_memory_alloc_29267 et131x_tx_dma_memory_alloc 0 29267 NULL ++show_fcoe_fcf_device_vfid_29268 show_fcoe_fcf_device_vfid 0 29268 NULL ++store_pwmenable_29271 store_pwmenable 0-4 29271 NULL ++__device_suspend_late_29272 __device_suspend_late 0 29272 NULL ++atyfb_set_par_29275 atyfb_set_par 0 29275 NULL ++prism2_set_genericelement_29277 prism2_set_genericelement 3 29277 NULL ++set_force_pwm_max_29278 set_force_pwm_max 0-4 29278 NULL ++bitmap_ord_to_pos_29279 bitmap_ord_to_pos 3 29279 NULL ++iwl_mvm_send_cmd_pdu_status_29288 iwl_mvm_send_cmd_pdu_status 0 29288 NULL ++range_read_29291 range_read 0 29291 NULL ++xfs_bmap_btree_to_extents_29297 xfs_bmap_btree_to_extents 0 29297 NULL ++addrconf_notify_29303 addrconf_notify 0 29303 NULL ++writeset_alloc_29304 writeset_alloc 2 29304 NULL nohasharray ++tpacpi_rfk_update_swstate_29304 tpacpi_rfk_update_swstate 0 29304 &writeset_alloc_29304 ++regmap_spmi_ext_read_29311 regmap_spmi_ext_read 0 29311 NULL ++brcmf_sdio_tx_ctrlframe_29314 brcmf_sdio_tx_ctrlframe 3 29314 NULL ++__fuse_get_req_29315 __fuse_get_req 2 29315 NULL ++dac33_hw_write_29317 dac33_hw_write 3 29317 NULL nohasharray ++default_file_splice_read_29317 default_file_splice_read 0 29317 &dac33_hw_write_29317 ++lp3943_pwm_enable_29319 lp3943_pwm_enable 0 29319 NULL ++lprocfs_write_helper_29323 lprocfs_write_helper 2 29323 NULL ++ip_vs_receive_29330 ip_vs_receive 3 29330 NULL ++obd_proc_jobid_name_seq_write_29332 obd_proc_jobid_name_seq_write 3 29332 NULL ++wl1271_op_start_29333 wl1271_op_start 0 29333 NULL ++set_page_29334 set_page 0 29334 NULL ++proc_bus_pci_read_29337 proc_bus_pci_read 0-3 29337 NULL ++__alloc_ei_netdev_29338 __alloc_ei_netdev 1 29338 NULL ++l2cap_sock_setsockopt_old_29346 l2cap_sock_setsockopt_old 4-0 29346 NULL ++regulator_max_uA_show_29349 regulator_max_uA_show 0 29349 NULL ++module_load_notify_29350 module_load_notify 0 29350 NULL nohasharray ++pcmcia_dev_resume_29350 pcmcia_dev_resume 0 29350 &module_load_notify_29350 ++uwb_rc_ie_add_29354 uwb_rc_ie_add 0 29354 NULL ++context_show_29361 context_show 0 29361 NULL nohasharray ++lpfc_use_msi_show_29361 lpfc_use_msi_show 0 29361 &context_show_29361 ++alloc_and_copy_ftrace_hash_29368 alloc_and_copy_ftrace_hash 1 29368 NULL ++synproxy_tstamp_adjust_29376 synproxy_tstamp_adjust 2 29376 NULL ++show_fnode_portal_type_29378 show_fnode_portal_type 0 29378 NULL ++get_maxrecs_29379 get_maxrecs 0 29379 NULL ++write_block_data_29390 write_block_data 0 29390 NULL nohasharray ++sleep_millisecs_store_29390 sleep_millisecs_store 0-4 29390 &write_block_data_29390 ++store_29393 store 0 29393 NULL ++lpfc_use_adisc_show_29400 lpfc_use_adisc_show 0 29400 NULL ++_ctl_diag_trigger_master_show_29403 _ctl_diag_trigger_master_show 0 29403 NULL nohasharray ++shm16read__write_file_29403 shm16read__write_file 0 29403 &_ctl_diag_trigger_master_show_29403 ++read_file_tx99_power_29405 read_file_tx99_power 3-0 29405 NULL ++pca953x_irq_setup_29407 pca953x_irq_setup 3 29407 NULL ++show_fnode_entry_enable_29415 show_fnode_entry_enable 0 29415 NULL ++class_id_show_29416 class_id_show 0 29416 NULL nohasharray ++csio_show_num_reg_rnodes_29416 csio_show_num_reg_rnodes 0 29416 &class_id_show_29416 ++softing_fct_cmd_29419 softing_fct_cmd 0 29419 NULL ++cgroup_update_dfl_csses_29420 cgroup_update_dfl_csses 0 29420 NULL ++sfi_acpi_table_show_29425 sfi_acpi_table_show 6 29425 NULL ++security_task_setscheduler_29432 security_task_setscheduler 0 29432 NULL ++mempool_create_29437 mempool_create 1 29437 NULL ++cfq_quantum_show_29442 cfq_quantum_show 0 29442 NULL nohasharray ++cifs_sign_smb_29442 cifs_sign_smb 0 29442 &cfq_quantum_show_29442 ++p9_client_prepare_req_29448 p9_client_prepare_req 3 29448 NULL ++resv_hugepages_show_29449 resv_hugepages_show 0 29449 NULL ++superblock_has_perm_29450 superblock_has_perm 0 29450 NULL ++edac_dev_instance_show_29452 edac_dev_instance_show 0 29452 NULL ++show_29455 show 0 29455 NULL nohasharray ++__kmalloc_node_29455 __kmalloc_node 1 29455 &show_29455 ++mlx4_en_do_set_mac_29456 mlx4_en_do_set_mac 0 29456 NULL ++show_counter_rx_flow_pkts_29459 show_counter_rx_flow_pkts 0 29459 NULL nohasharray ++show_prochot_interval_29459 show_prochot_interval 0 29459 &show_counter_rx_flow_pkts_29459 ++acpi_ex_read_data_from_field_29461 acpi_ex_read_data_from_field 0 29461 NULL ++validate_scan_freqs_29462 validate_scan_freqs 0 29462 NULL ++memcg_update_cache_params_29465 memcg_update_cache_params 2-0 29465 NULL nohasharray ++geos_gpio_show_29465 geos_gpio_show 0 29465 &memcg_update_cache_params_29465 nohasharray ++ath10k_hif_map_service_to_pipe_29465 ath10k_hif_map_service_to_pipe 0 29465 &geos_gpio_show_29465 nohasharray ++cramfs_readpage_29465 cramfs_readpage 0 29465 &ath10k_hif_map_service_to_pipe_29465 ++st_sensors_sysfs_scale_avail_29467 st_sensors_sysfs_scale_avail 0 29467 NULL ++mptscsih_board_tracer_show_29471 mptscsih_board_tracer_show 0 29471 NULL ++snd_hda_create_dig_out_ctls_29472 snd_hda_create_dig_out_ctls 0 29472 NULL ++SyS_flistxattr_29474 SyS_flistxattr 3 29474 NULL ++do_register_entry_29478 do_register_entry 4-0 29478 NULL ++be_change_mtu_29479 be_change_mtu 0 29479 NULL ++simple_strtoul_29480 simple_strtoul 0 29480 NULL ++ad_sd_buffer_postenable_29483 ad_sd_buffer_postenable 0 29483 NULL ++topology_change_show_29484 topology_change_show 0 29484 NULL ++nilfs_sufile_freev_29485 nilfs_sufile_freev 0 29485 NULL ++rock_ridge_symlink_readpage_29486 rock_ridge_symlink_readpage 0 29486 NULL ++show_29488 show 0 29488 NULL ++client_monitor_pending_show_29492 client_monitor_pending_show 0 29492 NULL ++store_reset_29502 store_reset 0-4 29502 NULL ++btmrvl_pscmd_write_29504 btmrvl_pscmd_write 3-0 29504 NULL ++btrfs_file_extent_disk_bytenr_29505 btrfs_file_extent_disk_bytenr 0 29505 NULL nohasharray ++routes_show_29505 routes_show 0 29505 &btrfs_file_extent_disk_bytenr_29505 ++target_core_dev_wwn_show_attr_vpd_assoc_logical_unit_29507 target_core_dev_wwn_show_attr_vpd_assoc_logical_unit 0 29507 NULL ++usnic_vnic_spec_dump_29508 usnic_vnic_spec_dump 2 29508 NULL ++input_dev_show_uniq_29511 input_dev_show_uniq 0 29511 NULL ++write_file_regidx_29517 write_file_regidx 3-0 29517 NULL ++calc_ntlmv2_hash_29518 calc_ntlmv2_hash 0 29518 NULL ++uhci_submit_control_29521 uhci_submit_control 0 29521 NULL ++atk_debugfs_ggrp_read_29522 atk_debugfs_ggrp_read 3-0 29522 NULL nohasharray ++cs_build_controls_29522 cs_build_controls 0 29522 &atk_debugfs_ggrp_read_29522 ++qla4xxx_conn_get_param_29523 qla4xxx_conn_get_param 0 29523 NULL ++pci_enable_msix_29524 pci_enable_msix 0 29524 NULL ++pccard_show_irq_mask_29528 pccard_show_irq_mask 0 29528 NULL ++ssb_pci_attr_sprom_show_29530 ssb_pci_attr_sprom_show 0 29530 NULL nohasharray ++mei_cl_write_29530 mei_cl_write 0 29530 &ssb_pci_attr_sprom_show_29530 nohasharray ++unix_autobind_29530 unix_autobind 0 29530 &mei_cl_write_29530 ++mic_vringh_copy_29531 mic_vringh_copy 4 29531 NULL ++add_to_page_cache_lru_29534 add_to_page_cache_lru 0 29534 NULL nohasharray ++et131x_adapter_memory_alloc_29534 et131x_adapter_memory_alloc 0 29534 &add_to_page_cache_lru_29534 ++nilfs_palloc_prepare_alloc_entry_29538 nilfs_palloc_prepare_alloc_entry 0 29538 NULL ++vfs_read_29543 vfs_read 0-3 29543 NULL ++evaluate_cond_node_29546 evaluate_cond_node 0 29546 NULL ++ext2_write_inode_29548 ext2_write_inode 0 29548 NULL ++phase_diversity_29550 phase_diversity 0 29550 NULL nohasharray ++libipw_change_mtu_29550 libipw_change_mtu 0 29550 &phase_diversity_29550 ++ftrace_write_29551 ftrace_write 3-1 29551 NULL ++__extent_writepage_29554 __extent_writepage 0 29554 NULL ++idetape_queue_rw_tail_29562 idetape_queue_rw_tail 3-0 29562 NULL ++show_in_input3_29564 show_in_input3 0 29564 NULL ++leaf_dealloc_29566 leaf_dealloc 3 29566 NULL nohasharray ++bochs_dispi_read_29566 bochs_dispi_read 0 29566 &leaf_dealloc_29566 nohasharray ++alloc_empty_pages_29566 alloc_empty_pages 2 29566 &bochs_dispi_read_29566 ++kvm_read_guest_virt_system_29569 kvm_read_guest_virt_system 4-2 29569 NULL ++p9_fd_read_29570 p9_fd_read 3 29570 NULL ++lbs_lowsnr_read_29571 lbs_lowsnr_read 3-0 29571 NULL ++dvb_ca_en50221_write_data_29574 dvb_ca_en50221_write_data 0-4 29574 NULL ++sisusb_read_memio_word_29581 sisusb_read_memio_word 0 29581 NULL ++savagefb_check_var_29582 savagefb_check_var 0 29582 NULL ++ext3_ordered_write_end_29584 ext3_ordered_write_end 5-0 29584 NULL ++iwl_dbgfs_missed_beacon_write_29586 iwl_dbgfs_missed_beacon_write 3-0 29586 NULL ++snd_device_new_29588 snd_device_new 0 29588 NULL nohasharray ++radeon_set_dpm_state_29588 radeon_set_dpm_state 0-4 29588 &snd_device_new_29588 ++pvr2_hdw_report_unlocked_29589 pvr2_hdw_report_unlocked 0-4 29589 NULL ++mt9t112_cropcap_29595 mt9t112_cropcap 0 29595 NULL ++sierra_submit_rx_urbs_29599 sierra_submit_rx_urbs 0 29599 NULL nohasharray ++dio_set_defer_completion_29599 dio_set_defer_completion 0 29599 &sierra_submit_rx_urbs_29599 ++rocker_flow_tbl_vlan_29600 rocker_flow_tbl_vlan 0 29600 NULL ++x1205_sysfs_show_atrim_29603 x1205_sysfs_show_atrim 0 29603 NULL nohasharray ++therm_throt_device_show_package_power_limit_count_29603 therm_throt_device_show_package_power_limit_count 0 29603 &x1205_sysfs_show_atrim_29603 nohasharray ++lbs_mesh_config_29603 lbs_mesh_config 0 29603 &therm_throt_device_show_package_power_limit_count_29603 ++qla4_82xx_pci_set_window_29605 qla4_82xx_pci_set_window 0-2 29605 NULL ++multicast_snooping_store_29607 multicast_snooping_store 4-0 29607 NULL ++get_fan1_fault_29610 get_fan1_fault 0 29610 NULL nohasharray ++osc_cached_mb_seq_write_29610 osc_cached_mb_seq_write 3 29610 &get_fan1_fault_29610 ++raid5_check_reshape_29611 raid5_check_reshape 0 29611 NULL ++tg3_halt_cpu_29617 tg3_halt_cpu 0 29617 NULL ++pmbus_write_byte_data_29621 pmbus_write_byte_data 0 29621 NULL ++v9fs_remote_get_acl_29623 v9fs_remote_get_acl 0 29623 NULL ++show_power_29626 show_power 0 29626 NULL ++dm_attr_suspended_show_29628 dm_attr_suspended_show 0 29628 NULL nohasharray ++log_tail_lsn_show_29628 log_tail_lsn_show 0 29628 &dm_attr_suspended_show_29628 ++gfs2_alloc_blocks_29630 gfs2_alloc_blocks 0 29630 NULL ++spi_write_29631 spi_write 0 29631 NULL ++ext4_xattr_trusted_get_29632 ext4_xattr_trusted_get 0 29632 NULL ++read_null_29633 read_null 0-3 29633 NULL nohasharray ++iscsi_disc_show_password_29633 iscsi_disc_show_password 0 29633 &read_null_29633 ++tx_frag_cache_hit_read_29639 tx_frag_cache_hit_read 3-0 29639 NULL ++ivtv_firmware_init_29641 ivtv_firmware_init 0 29641 NULL ++md5_init_29643 md5_init 0 29643 NULL ++bnx2x_vfpf_setup_q_29645 bnx2x_vfpf_setup_q 0 29645 NULL ++jump_label_module_notify_29646 jump_label_module_notify 0 29646 NULL ++hyp_sysfs_store_29647 hyp_sysfs_store 0-4 29647 NULL ++uwb_rc_stop_beacon_29649 uwb_rc_stop_beacon 0 29649 NULL ++sctp_make_abort_user_29654 sctp_make_abort_user 3 29654 NULL nohasharray ++spmi_controller_alloc_29654 spmi_controller_alloc 2 29654 &sctp_make_abort_user_29654 ++_regulator_do_enable_29656 _regulator_do_enable 0 29656 NULL nohasharray ++uwb_rc_mac_addr_show_29656 uwb_rc_mac_addr_show 0 29656 &_regulator_do_enable_29656 ++d_hash_29661 d_hash 0 29661 NULL ++chv_gpio_direction_input_29662 chv_gpio_direction_input 0 29662 NULL nohasharray ++e100_phy_init_29662 e100_phy_init 0 29662 &chv_gpio_direction_input_29662 ++user_get_29663 user_get 0 29663 NULL ++br_send_bpdu_29669 br_send_bpdu 3 29669 NULL ++sisusb_write_mem_bulk_29678 sisusb_write_mem_bulk 4-0 29678 NULL ++pmbus_regulator_enable_29679 pmbus_regulator_enable 0 29679 NULL ++netxen_store_bridged_mode_29684 netxen_store_bridged_mode 0-4 29684 NULL ++nes_store_adapter_29687 nes_store_adapter 0-3 29687 NULL ++__btrfs_setxattr_29689 __btrfs_setxattr 0 29689 NULL ++mlx4_qp_alloc_29690 mlx4_qp_alloc 0 29690 NULL ++sync_29693 sync 0 29693 NULL nohasharray ++lustre_posix_acl_xattr_2ext_29693 lustre_posix_acl_xattr_2ext 2 29693 &sync_29693 ++map_descbuffer_29698 map_descbuffer 0 29698 NULL ++output_29700 output 0 29700 NULL ++sas_smp_phy_control_29703 sas_smp_phy_control 0 29703 NULL ++cp_open_29706 cp_open 0 29706 NULL ++posix_acl_from_xattr_29708 posix_acl_from_xattr 3 29708 NULL nohasharray ++sd_alloc_ctl_entry_29708 sd_alloc_ctl_entry 1 29708 &posix_acl_from_xattr_29708 ++probes_write_29711 probes_write 3 29711 NULL ++uinput_events_to_user_29713 uinput_events_to_user 0 29713 NULL ++sht15_show_temp_29714 sht15_show_temp 0 29714 NULL ++compat_write_data_29715 compat_write_data 0 29715 NULL ++target_core_alua_tg_pt_gp_show_attr_alua_write_metadata_29716 target_core_alua_tg_pt_gp_show_attr_alua_write_metadata 0 29716 NULL nohasharray ++wl1251_acx_station_id_29716 wl1251_acx_station_id 0 29716 &target_core_alua_tg_pt_gp_show_attr_alua_write_metadata_29716 ++sdev_show_evt_soft_threshold_reached_29724 sdev_show_evt_soft_threshold_reached 0 29724 NULL ++dbs_cpufreq_notifier_29729 dbs_cpufreq_notifier 0 29729 NULL ++wake_show_29730 wake_show 0 29730 NULL ++emi62_writememory_29731 emi62_writememory 4 29731 NULL ++nv_change_mtu_29732 nv_change_mtu 0 29732 NULL nohasharray ++skein_1024_update_29732 skein_1024_update 0 29732 &nv_change_mtu_29732 ++snd_seq_create_kernel_client_29734 snd_seq_create_kernel_client 0 29734 NULL ++read_cis_cache_29735 read_cis_cache 4 29735 NULL ++xfs_btree_read_buf_block_29736 xfs_btree_read_buf_block 0 29736 NULL ++da9055_gpio_direction_input_29742 da9055_gpio_direction_input 0 29742 NULL nohasharray ++device_user_deadlock_29742 device_user_deadlock 0 29742 &da9055_gpio_direction_input_29742 ++da9055_read_auto_ch_29745 da9055_read_auto_ch 0 29745 NULL ++adp5520_show_29748 adp5520_show 0 29748 NULL ++hotkey_poll_freq_show_29749 hotkey_poll_freq_show 0 29749 NULL ++hfs_readpage_29752 hfs_readpage 0 29752 NULL ++lpfc_multi_ring_rctl_show_29753 lpfc_multi_ring_rctl_show 0 29753 NULL ++raw_pci_write_29754 raw_pci_write 0 29754 NULL ++iscsi_tpg_auth_store_userid_29759 iscsi_tpg_auth_store_userid 0-3 29759 NULL ++max8997_rtc_tm_to_data_29760 max8997_rtc_tm_to_data 0 29760 NULL ++fuse_fsync_29765 fuse_fsync 0 29765 NULL nohasharray ++il3945_store_debug_level_29765 il3945_store_debug_level 0-4 29765 &fuse_fsync_29765 ++vmw_compat_shader_add_29770 vmw_compat_shader_add 6 29770 NULL ++ip_vs_conn_fill_param_sync_29771 ip_vs_conn_fill_param_sync 6 29771 NULL ++devid_show_29772 devid_show 0 29772 NULL ++ati_remote2_show_mode_mask_29775 ati_remote2_show_mode_mask 0 29775 NULL ++tcf_csum_ipv6_icmp_29777 tcf_csum_ipv6_icmp 3 29777 NULL ++wcn36xx_start_29781 wcn36xx_start 0 29781 NULL nohasharray ++store_fanin_29781 store_fanin 0-4 29781 &wcn36xx_start_29781 ++tg3_irq_count_29786 tg3_irq_count 0 29786 NULL ++wake_up_mouse_store_29789 wake_up_mouse_store 0-4 29789 NULL ++dbAlloc_29794 dbAlloc 0 29794 NULL ++__uncore_inc_sel_show_29798 __uncore_inc_sel_show 0 29798 NULL ++pwm_lpss_enable_29799 pwm_lpss_enable 0 29799 NULL ++nf_xfrm_me_harder_29801 nf_xfrm_me_harder 0 29801 NULL ++ext4_trim_all_free_29806 ext4_trim_all_free 2-4-3 29806 NULL ++wcn36xx_smd_send_and_wait_29808 wcn36xx_smd_send_and_wait 0 29808 NULL ++oprofile_start_29810 oprofile_start 0 29810 NULL ++wl1271_acx_ap_max_tx_retry_29816 wl1271_acx_ap_max_tx_retry 0 29816 NULL ++igb_setup_all_tx_resources_29817 igb_setup_all_tx_resources 0 29817 NULL ++nilfs_segctor_next_checkpoint_show_29818 nilfs_segctor_next_checkpoint_show 0 29818 NULL ++stk_sensor_set_brightness_29822 stk_sensor_set_brightness 0 29822 NULL nohasharray ++tmp103_show_temp_29822 tmp103_show_temp 0 29822 &stk_sensor_set_brightness_29822 ++in_write_index_show_29827 in_write_index_show 0 29827 NULL ++tcp_sendpage_29829 tcp_sendpage 4 29829 NULL ++kexec_crash_loaded_show_29830 kexec_crash_loaded_show 0 29830 NULL ++wl18xx_set_clk_29839 wl18xx_set_clk 0 29839 NULL ++scan_bitmap_block_29840 scan_bitmap_block 4 29840 NULL ++__probe_kernel_write_29842 __probe_kernel_write 3 29842 NULL ++ath10k_wmi_cmd_init_29843 ath10k_wmi_cmd_init 0 29843 NULL ++uhci_submit_common_29844 uhci_submit_common 0 29844 NULL nohasharray ++nfs42_set_rw_stateid_29844 nfs42_set_rw_stateid 0 29844 &uhci_submit_common_29844 ++__raw_notifier_call_chain_29847 __raw_notifier_call_chain 0 29847 NULL ++kvm_read_hva_atomic_29848 kvm_read_hva_atomic 3 29848 NULL ++sha_finish_walk_29852 sha_finish_walk 0 29852 NULL ++solo_enc_alloc_29860 solo_enc_alloc 3 29860 NULL ++set_eeprom1_29863 set_eeprom1 4-0 29863 NULL nohasharray ++__dev_pm_qos_update_request_29863 __dev_pm_qos_update_request 0 29863 &set_eeprom1_29863 ++acpi_device_modalias_show_29864 acpi_device_modalias_show 0 29864 NULL ++xfs_rtfind_forw_29866 xfs_rtfind_forw 0 29866 NULL ++write_file_bool_bmps_29870 write_file_bool_bmps 3-0 29870 NULL nohasharray ++extract_icmp6_fields_29870 extract_icmp6_fields 2 29870 &write_file_bool_bmps_29870 ++ipv6_setsockopt_29871 ipv6_setsockopt 5-0 29871 NULL nohasharray ++itd_submit_29871 itd_submit 0 29871 &ipv6_setsockopt_29871 ++dma_map_xdr_29874 dma_map_xdr 0-3 29874 NULL ++show_engine3_mode_29876 show_engine3_mode 0 29876 NULL ++setup_29880 setup 0 29880 NULL ++store_pan_29882 store_pan 0-4 29882 NULL ++find_free_ctxt_29886 find_free_ctxt 0 29886 NULL nohasharray ++nfc_targets_found_29886 nfc_targets_found 3 29886 &find_free_ctxt_29886 ++afs_write_begin_29891 afs_write_begin 0 29891 NULL ++xfs_alloc_read_agf_29893 xfs_alloc_read_agf 0 29893 NULL ++video_outputsw_cycle_29894 video_outputsw_cycle 0 29894 NULL ++kingsun_net_open_29899 kingsun_net_open 0 29899 NULL ++mirred_device_event_29906 mirred_device_event 0 29906 NULL ++bonding_show_min_links_29907 bonding_show_min_links 0 29907 NULL ++follow_pte_29913 follow_pte 0 29913 NULL ++lov_ost_pool_extend_29914 lov_ost_pool_extend 2 29914 NULL ++write_file_queue_29922 write_file_queue 3-0 29922 NULL ++pkcs7_preparse_29923 pkcs7_preparse 0 29923 NULL nohasharray ++brcmf_config_dongle_29923 brcmf_config_dongle 0 29923 &pkcs7_preparse_29923 ++tps65912_reg_is_enabled_29927 tps65912_reg_is_enabled 0 29927 NULL nohasharray ++ipheth_carrier_set_29927 ipheth_carrier_set 0 29927 &tps65912_reg_is_enabled_29927 ++smsc95xx_set_features_29931 smsc95xx_set_features 0 29931 NULL ++b43legacy_op_add_interface_29934 b43legacy_op_add_interface 0 29934 NULL ++tipc_wait_for_sndmsg_29937 tipc_wait_for_sndmsg 0 29937 NULL ++koneplus_sysfs_read_tcu_image_29938 koneplus_sysfs_read_tcu_image 0-5-6 29938 NULL ++security_transition_sid_29940 security_transition_sid 0 29940 NULL ++i915_switch_context_29944 i915_switch_context 0 29944 NULL ++__btrfs_getxattr_29947 __btrfs_getxattr 0 29947 NULL nohasharray ++ipv6_recv_error_29947 ipv6_recv_error 0-3 29947 &__btrfs_getxattr_29947 ++ath6kl_wmi_disctimeout_cmd_29952 ath6kl_wmi_disctimeout_cmd 0 29952 NULL ++snd_es1938_capture_prepare_29953 snd_es1938_capture_prepare 0 29953 NULL ++bin_search_in_dir_item_29954 bin_search_in_dir_item 0 29954 NULL ++is_supply_enabled_29956 is_supply_enabled 0 29956 NULL ++init_29962 init 0 29962 NULL ++ubifs_readpage_29965 ubifs_readpage 0 29965 NULL ++vfb_set_par_29967 vfb_set_par 0 29967 NULL ++register_one_node_29973 register_one_node 0 29973 NULL ++acpi_ut_copy_iobject_to_eobject_29974 acpi_ut_copy_iobject_to_eobject 0 29974 NULL ++pci_get_resource_alignment_param_29979 pci_get_resource_alignment_param 0 29979 NULL ++location_store_29981 location_store 0-3 29981 NULL ++ipr_show_device_id_29982 ipr_show_device_id 0 29982 NULL nohasharray ++follow_pfn_29982 follow_pfn 0 29982 &ipr_show_device_id_29982 nohasharray ++ath10k_wmi_peer_assoc_29982 ath10k_wmi_peer_assoc 0 29982 &follow_pfn_29982 ++diva_os_get_context_size_29983 diva_os_get_context_size 0 29983 NULL nohasharray ++irias_add_octseq_attrib_29983 irias_add_octseq_attrib 4 29983 &diva_os_get_context_size_29983 ++iwl_mvm_send_add_bcast_sta_29987 iwl_mvm_send_add_bcast_sta 0 29987 NULL ++hotkey_tablet_mode_show_29990 hotkey_tablet_mode_show 0 29990 NULL ++TSS_sha1_29994 TSS_sha1 0 29994 NULL ++apds990x_prox_show_30000 apds990x_prox_show 0 30000 NULL ++cpia2_v4l_read_30004 cpia2_v4l_read 0-3 30004 NULL ++memcpy_to_msg_30012 memcpy_to_msg 0-3 30012 NULL ++rpc_call_sync_30021 rpc_call_sync 0 30021 NULL ++show_max_brightness_30023 show_max_brightness 0 30023 NULL ++nfs41_proc_secinfo_no_name_30026 nfs41_proc_secinfo_no_name 0 30026 NULL nohasharray ++set_params_30026 set_params 0 30026 &nfs41_proc_secinfo_no_name_30026 ++dev_mem_write_30028 dev_mem_write 3-0 30028 NULL ++ext2_readpage_30029 ext2_readpage 0 30029 NULL ++sysfs_add_file_mode_ns_30038 sysfs_add_file_mode_ns 0 30038 NULL ++scsi_vpd_inquiry_30040 scsi_vpd_inquiry 0-4 30040 NULL ++sock_no_listen_30043 sock_no_listen 0 30043 NULL ++__iscsi_nacl_auth_show_password_mutual_30047 __iscsi_nacl_auth_show_password_mutual 0 30047 NULL ++on20_read_regr_30051 on20_read_regr 0 30051 NULL ++integrity_generate_store_30052 integrity_generate_store 0-3 30052 NULL ++dev_attribute_show_30056 dev_attribute_show 0 30056 NULL nohasharray ++cyber2000fb_set_par_30056 cyber2000fb_set_par 0 30056 &dev_attribute_show_30056 ++__pci_request_selected_regions_30058 __pci_request_selected_regions 0 30058 NULL ++SyS_write_30059 SyS_write 3 30059 NULL ++general_stats_read_30067 general_stats_read 0 30067 NULL ++capture_pcm_prepare_30072 capture_pcm_prepare 0 30072 NULL ++snd_seq_timer_open_30077 snd_seq_timer_open 0 30077 NULL ++m5602_write_sensor_30078 m5602_write_sensor 0 30078 NULL nohasharray ++sctp_setsockopt_nodelay_30078 sctp_setsockopt_nodelay 0 30078 &m5602_write_sensor_30078 ++adp8870_bl_l3_office_dim_store_30079 adp8870_bl_l3_office_dim_store 4-0 30079 NULL ++ext4_writepages_30088 ext4_writepages 0 30088 NULL nohasharray ++ath5k_hw_setup_rx_desc_30088 ath5k_hw_setup_rx_desc 0 30088 &ext4_writepages_30088 ++cxgbi_ddp_reserve_30091 cxgbi_ddp_reserve 4 30091 NULL ++snd_midi_channel_init_set_30092 snd_midi_channel_init_set 1 30092 NULL ++tg3_run_loopback_30093 tg3_run_loopback 2 30093 NULL ++wake_lock_store_30096 wake_lock_store 0-4 30096 NULL ++rx_filter_data_filter_read_30098 rx_filter_data_filter_read 3-0 30098 NULL ++mlx5_cmd_exec_30102 mlx5_cmd_exec 0 30102 NULL ++skb_pagelen_30113 skb_pagelen 0 30113 NULL ++spi_async_locked_30117 spi_async_locked 0 30117 NULL ++reg_to_rpm_30119 reg_to_rpm 0-1 30119 NULL ++snd_emu10k1_playback_trigger_30121 snd_emu10k1_playback_trigger 0 30121 NULL nohasharray ++tea5764_s_ctrl_30121 tea5764_s_ctrl 0 30121 &snd_emu10k1_playback_trigger_30121 nohasharray ++w1_f1C_read_30121 w1_f1C_read 3-0 30121 &tea5764_s_ctrl_30121 ++show_up_head_align_30126 show_up_head_align 0 30126 NULL ++show_spi_host_width_30127 show_spi_host_width 0 30127 NULL nohasharray ++dell_poweredge_bt_xaction_handler_30127 dell_poweredge_bt_xaction_handler 0 30127 &show_spi_host_width_30127 ++calgary_unmap_page_30130 calgary_unmap_page 3-2 30130 NULL ++_osd_req_sizeof_alist_header_30134 _osd_req_sizeof_alist_header 0 30134 NULL ++security_sid_to_context_force_30137 security_sid_to_context_force 0 30137 NULL ++pxa27x_udc_start_30138 pxa27x_udc_start 0 30138 NULL ++u_memcpya_30139 u_memcpya 2-3 30139 NULL nohasharray ++sysv_hash_30139 sysv_hash 0 30139 &u_memcpya_30139 ++show_prochot_override_30140 show_prochot_override 0 30140 NULL ++qib_user_sdma_coalesce_30141 qib_user_sdma_coalesce 0 30141 NULL ++dbg_port_buf_30145 dbg_port_buf 2 30145 NULL ++start_transfer_30146 start_transfer 0 30146 NULL ++ext4_write_inline_data_end_30151 ext4_write_inline_data_end 0-4 30151 NULL ++hvfb_check_var_30153 hvfb_check_var 0 30153 NULL ++elfcorehdr_read_30159 elfcorehdr_read 2 30159 NULL ++netlink_realloc_groups_30162 netlink_realloc_groups 0 30162 NULL ++alloc_switch_ctx_30165 alloc_switch_ctx 2 30165 NULL ++sundance_set_mac_addr_30166 sundance_set_mac_addr 0 30166 NULL ++cs_init_30168 cs_init 0 30168 NULL ++mwifiex_cmd_802_11_ad_hoc_start_30173 mwifiex_cmd_802_11_ad_hoc_start 0 30173 NULL ++saa6752hs_try_ctrl_30179 saa6752hs_try_ctrl 0 30179 NULL ++nfs4_find_root_sec_30182 nfs4_find_root_sec 0 30182 NULL nohasharray ++sr_write_rx_ctl_30182 sr_write_rx_ctl 0 30182 &nfs4_find_root_sec_30182 ++ksz9021_config_init_30183 ksz9021_config_init 0 30183 NULL ++set_out0_output_30185 set_out0_output 0-4 30185 NULL ++mempool_create_page_pool_30189 mempool_create_page_pool 1 30189 NULL ++hrz_open_30192 hrz_open 0 30192 NULL ++vxlan_change_mtu_30195 vxlan_change_mtu 0 30195 NULL ++__genwqe_readq_30197 __genwqe_readq 0 30197 NULL ++inode_listsecurity_30201 inode_listsecurity 0 30201 NULL nohasharray ++bq2415x_set_current_limit_30201 bq2415x_set_current_limit 0 30201 &inode_listsecurity_30201 ++nilfs_btree_assign_30202 nilfs_btree_assign 0 30202 NULL ++usblp_ioctl_30203 usblp_ioctl 2 30203 NULL nohasharray ++ip_mc_leave_group_30203 ip_mc_leave_group 0 30203 &usblp_ioctl_30203 nohasharray ++softing_enable_irq_30203 softing_enable_irq 0 30203 &ip_mc_leave_group_30203 ++gfs2_stuffed_write_end_30204 gfs2_stuffed_write_end 0-5 30204 NULL ++nouveau_hwmon_emergency_temp_hyst_30207 nouveau_hwmon_emergency_temp_hyst 0 30207 NULL ++efx_netdev_event_30208 efx_netdev_event 0 30208 NULL ++preallocate_pcm_pages_30209 preallocate_pcm_pages 2 30209 NULL ++ath10k_download_fw_30210 ath10k_download_fw 0 30210 NULL ++show_therm_min_alarm_30211 show_therm_min_alarm 0 30211 NULL ++qlcnic_sysfs_read_npar_config_30213 qlcnic_sysfs_read_npar_config 0-6-5 30213 NULL nohasharray ++carl9170_op_sta_add_30213 carl9170_op_sta_add 0 30213 &qlcnic_sysfs_read_npar_config_30213 ++snd_ac97_pcm_assign_30218 snd_ac97_pcm_assign 2 30218 NULL nohasharray ++devfreq_userspace_func_30218 devfreq_userspace_func 0 30218 &snd_ac97_pcm_assign_30218 ++mt9t031_s_ctrl_30219 mt9t031_s_ctrl 0 30219 NULL ++hfsplus_brec_insert_30224 hfsplus_brec_insert 0 30224 NULL ++padlock_sha256_update_nano_30227 padlock_sha256_update_nano 0 30227 NULL nohasharray ++SyS_semop_30227 SyS_semop 3 30227 &padlock_sha256_update_nano_30227 ++read_data_offset_30230 read_data_offset 0 30230 NULL ++nested_symlink_30235 nested_symlink 0 30235 NULL ++em28xx_write_reg_30239 em28xx_write_reg 0 30239 NULL ++rocker_port_stp_update_30240 rocker_port_stp_update 0 30240 NULL ++o2nm_cluster_store_30245 o2nm_cluster_store 0-4 30245 NULL nohasharray ++lg4ff_range_store_30245 lg4ff_range_store 0-4 30245 &o2nm_cluster_store_30245 ++adv7180_s_ctrl_30248 adv7180_s_ctrl 0 30248 NULL ++mc13892_gpo_regulator_is_enabled_30251 mc13892_gpo_regulator_is_enabled 0 30251 NULL ++sock_aio_write_30257 sock_aio_write 0 30257 NULL ++master_xfer_30260 master_xfer 0-3 30260 NULL nohasharray ++snd_seq_deliver_event_30260 snd_seq_deliver_event 0 30260 &master_xfer_30260 ++kexec_crash_size_store_30263 kexec_crash_size_store 0-4 30263 NULL ++rawv6_recvmsg_30265 rawv6_recvmsg 4-0 30265 NULL ++hfsplus_trusted_setxattr_30270 hfsplus_trusted_setxattr 0 30270 NULL ++isr_pci_pm_read_30271 isr_pci_pm_read 3-0 30271 NULL nohasharray ++try_break_deleg_30271 try_break_deleg 0 30271 &isr_pci_pm_read_30271 ++nilfs_segbuf_extend_payload_30272 nilfs_segbuf_extend_payload 0 30272 NULL ++compat_readv_30273 compat_readv 3 30273 NULL nohasharray ++fuse_file_write_iter_30273 fuse_file_write_iter 0 30273 &compat_readv_30273 ++to_addr_param_30275 to_addr_param 0 30275 NULL ++scsi_mq_setup_tags_30278 scsi_mq_setup_tags 0 30278 NULL ++store_spi_transport_min_period_30287 store_spi_transport_min_period 0-4 30287 NULL ++skcipher_sendmsg_30290 skcipher_sendmsg 4-0 30290 NULL nohasharray ++migrate_page_30290 migrate_page 0 30290 &skcipher_sendmsg_30290 ++max77686_rtc_stop_alarm_30293 max77686_rtc_stop_alarm 0 30293 NULL ++pipeline_sec_frag_swi_read_30294 pipeline_sec_frag_swi_read 3-0 30294 NULL nohasharray ++show_conn_param_ISCSI_PARAM_TCP_NAGLE_DISABLE_30294 show_conn_param_ISCSI_PARAM_TCP_NAGLE_DISABLE 0 30294 &pipeline_sec_frag_swi_read_30294 ++snd_cs5535audio_playback_prepare_30295 snd_cs5535audio_playback_prepare 0 30295 NULL ++tcp_sendmsg_30296 tcp_sendmsg 4-0 30296 NULL nohasharray ++dn_dev_get_first_30296 dn_dev_get_first 0 30296 &tcp_sendmsg_30296 ++snd_card_asihpi_playback_prepare_30297 snd_card_asihpi_playback_prepare 0 30297 NULL nohasharray ++lbs_get_reg_30297 lbs_get_reg 0 30297 &snd_card_asihpi_playback_prepare_30297 ++qlcnic_netdev_event_30299 qlcnic_netdev_event 0 30299 NULL ++__av7110_send_fw_cmd_30300 __av7110_send_fw_cmd 0 30300 NULL ++fm_rx_set_mute_mode_30305 fm_rx_set_mute_mode 0 30305 NULL nohasharray ++osc_contention_seconds_seq_write_30305 osc_contention_seconds_seq_write 3 30305 &fm_rx_set_mute_mode_30305 ++pm8001_task_prep_ata_30307 pm8001_task_prep_ata 0 30307 NULL ++r100_hw_i2c_xfer_30309 r100_hw_i2c_xfer 0-3 30309 NULL nohasharray ++simple_getattr_30309 simple_getattr 0 30309 &r100_hw_i2c_xfer_30309 ++ce6230_i2c_master_xfer_30313 ce6230_i2c_master_xfer 0-3 30313 NULL ++anatop_regmap_enable_30314 anatop_regmap_enable 0 30314 NULL ++ext4_acl_from_disk_30320 ext4_acl_from_disk 2 30320 NULL ++target_core_alua_tg_pt_gp_show_attr_implicit_trans_secs_30327 target_core_alua_tg_pt_gp_show_attr_implicit_trans_secs 0 30327 NULL ++uhid_dev_set_report_reply_30330 uhid_dev_set_report_reply 0 30330 NULL ++ath5k_attr_store_ofdm_weak_signal_detection_30334 ath5k_attr_store_ofdm_weak_signal_detection 0-4 30334 NULL ++read_30336 read 0 30336 NULL nohasharray ++cachefiles_daemon_debug_30336 cachefiles_daemon_debug 0 30336 &read_30336 ++tiadc_buffer_predisable_30339 tiadc_buffer_predisable 0 30339 NULL ++o2nm_this_node_30342 o2nm_this_node 0 30342 NULL ++wait_on_node_pages_writeback_30347 wait_on_node_pages_writeback 0 30347 NULL ++show_session_param_ISCSI_PARAM_CHAP_AUTH_EN_30348 show_session_param_ISCSI_PARAM_CHAP_AUTH_EN 0 30348 NULL ++s5k83a_set_hvflip_30350 s5k83a_set_hvflip 0 30350 NULL ++__vmalloc_node_flags_30352 __vmalloc_node_flags 1 30352 NULL nohasharray ++mmio32read__read_file_30352 mmio32read__read_file 0 30352 &__vmalloc_node_flags_30352 ++show_ipOutNoRoutes_30355 show_ipOutNoRoutes 0 30355 NULL ++wake_up_key_show_30358 wake_up_key_show 0 30358 NULL ++gfs2_trans_begin_30359 gfs2_trans_begin 0 30359 NULL ++ipx_getname_30363 ipx_getname 0 30363 NULL ++aten_read_regr_30364 aten_read_regr 0 30364 NULL nohasharray ++pagecache_write_begin_30364 pagecache_write_begin 0 30364 &aten_read_regr_30364 nohasharray ++set_configfs_dev_params_30364 set_configfs_dev_params 0-3 30364 &pagecache_write_begin_30364 ++pci_pm_reset_30366 pci_pm_reset 0 30366 NULL ++C_SYSC_readv_30369 C_SYSC_readv 3 30369 NULL ++xenvif_open_30373 xenvif_open 0 30373 NULL nohasharray ++fc_reset_statistics_30373 fc_reset_statistics 0-4 30373 &xenvif_open_30373 ++rtl88ee_hw_init_30378 rtl88ee_hw_init 0 30378 NULL ++sys_get_mempolicy_30379 sys_get_mempolicy 3 30379 NULL ++mangle_sdp_packet_30381 mangle_sdp_packet 10 30381 NULL ++wl1271_acx_fm_coex_30382 wl1271_acx_fm_coex 0 30382 NULL ++nilfs_sufile_updatev_30383 nilfs_sufile_updatev 0 30383 NULL ++blkdev_issue_zeroout_30392 blkdev_issue_zeroout 3 30392 NULL ++c4iw_init_resource_30393 c4iw_init_resource 2-3 30393 NULL ++show_bank1_value_30396 show_bank1_value 0 30396 NULL ++e1000e_setup_tx_resources_30398 e1000e_setup_tx_resources 0 30398 NULL ++afs_writepages_region_30399 afs_writepages_region 0 30399 NULL ++qlcnic_get_eeprom_len_30400 qlcnic_get_eeprom_len 0 30400 NULL ++ixgb_up_30405 ixgb_up 0 30405 NULL ++sync_force_parallel_store_30410 sync_force_parallel_store 0-3 30410 NULL ++i7core_inject_show_rank_30413 i7core_inject_show_rank 0 30413 NULL nohasharray ++stk17ta8_nvram_read_30413 stk17ta8_nvram_read 0-5-6 30413 &i7core_inject_show_rank_30413 ++_drbd_bm_find_next_zero_30415 _drbd_bm_find_next_zero 2 30415 NULL ++lp3971_set_bits_30418 lp3971_set_bits 0 30418 NULL ++ext3_xattr_list_30419 ext3_xattr_list 0 30419 NULL ++vb2_fop_write_30420 vb2_fop_write 3-0 30420 NULL ++lpfc_npiv_info_show_30421 lpfc_npiv_info_show 0 30421 NULL ++iscsi_stat_login_attr_show_30423 iscsi_stat_login_attr_show 0 30423 NULL ++tx_tx_template_prepared_read_30424 tx_tx_template_prepared_read 3-0 30424 NULL nohasharray ++sequencer_write_30424 sequencer_write 0-4 30424 &tx_tx_template_prepared_read_30424 nohasharray ++call_netdevice_notifier_30424 call_netdevice_notifier 0 30424 &sequencer_write_30424 ++mq_create_30425 mq_create 1 30425 NULL nohasharray ++lstcon_session_info_30425 lstcon_session_info 6 30425 &mq_create_30425 ++ras_help_30427 ras_help 0 30427 NULL nohasharray ++timewarn_cs_write_30427 timewarn_cs_write 3-0 30427 &ras_help_30427 ++can_notifier_30428 can_notifier 0 30428 NULL ++cxacru_sysfs_show_startup_attempts_30429 cxacru_sysfs_show_startup_attempts 0 30429 NULL ++selinux_netlbl_socket_post_create_30430 selinux_netlbl_socket_post_create 0 30430 NULL ++bma180_reset_intr_30432 bma180_reset_intr 0 30432 NULL ++show_30434 show 0 30434 NULL ++target_stat_scsi_att_intr_port_attr_store_30438 target_stat_scsi_att_intr_port_attr_store 0 30438 NULL ++fbcon_mode_deleted_30439 fbcon_mode_deleted 0 30439 NULL ++carl9170_disable_key_30440 carl9170_disable_key 0 30440 NULL ++em28xx_i2c_recv_bytes_30443 em28xx_i2c_recv_bytes 0-4 30443 NULL ++sysv_write_inode_30445 sysv_write_inode 0 30445 NULL ++xfs_attr_node_get_30453 xfs_attr_node_get 0 30453 NULL ++nilfs_sync_super_30455 nilfs_sync_super 0 30455 NULL nohasharray ++crypto_ablkcipher_ctxsize_30455 crypto_ablkcipher_ctxsize 0 30455 &nilfs_sync_super_30455 ++enable_write_30456 enable_write 3-0 30456 NULL nohasharray ++get_lcd_level_30456 get_lcd_level 0 30456 &enable_write_30456 ++tx_tx_template_programmed_read_30461 tx_tx_template_programmed_read 3-0 30461 NULL ++urandom_read_30462 urandom_read 3-0 30462 NULL ++zoran_ioctl_30465 zoran_ioctl 2 30465 NULL ++bop_lookup_30466 bop_lookup 0 30466 NULL ++store_ap2_temp_30472 store_ap2_temp 0-4 30472 NULL ++adt7310_spi_read_word_30473 adt7310_spi_read_word 0 30473 NULL ++i915_mutex_lock_interruptible_30474 i915_mutex_lock_interruptible 0 30474 NULL ++soc_camera_platform_g_crop_30477 soc_camera_platform_g_crop 0 30477 NULL nohasharray ++sysfs_override_clocksource_30477 sysfs_override_clocksource 4-0 30477 &soc_camera_platform_g_crop_30477 ++setexposure_30478 setexposure 0 30478 NULL ++write_head_30481 write_head 4-0 30481 NULL nohasharray ++update_30481 update 0 30481 &write_head_30481 ++submit_bio_hook_30482 submit_bio_hook 0 30482 NULL ++adu_write_30487 adu_write 3-0 30487 NULL ++dtim_interval_write_30489 dtim_interval_write 3-0 30489 NULL nohasharray ++audio_read_30489 audio_read 0-4 30489 &dtim_interval_write_30489 ++mxt_object_show_30491 mxt_object_show 0 30491 NULL nohasharray ++policydb_index_30491 policydb_index 0 30491 &mxt_object_show_30491 ++batadv_send_tt_request_30493 batadv_send_tt_request 5 30493 NULL ++wlcore_write32_30495 wlcore_write32 0 30495 NULL ++rtl8723e_hw_init_30496 rtl8723e_hw_init 0 30496 NULL ++xfs_xattr_get_30499 xfs_xattr_get 0 30499 NULL nohasharray ++dmi_sysfs_entry_type_30499 dmi_sysfs_entry_type 0 30499 &xfs_xattr_get_30499 nohasharray ++sync_min_store_30499 sync_min_store 0-3 30499 &dmi_sysfs_entry_type_30499 ++nfs_file_direct_write_30503 nfs_file_direct_write 0 30503 NULL ++xfs_dir2_leafn_toosmall_30504 xfs_dir2_leafn_toosmall 0 30504 NULL ++target_stat_scsi_att_intr_port_attr_show_30506 target_stat_scsi_att_intr_port_attr_show 0 30506 NULL nohasharray ++wcn36xx_dxe_request_irqs_30506 wcn36xx_dxe_request_irqs 0 30506 &target_stat_scsi_att_intr_port_attr_show_30506 ++cx23885_stop_audio_dma_30508 cx23885_stop_audio_dma 0 30508 NULL ++packet_notifier_30510 packet_notifier 0 30510 NULL ++memblock_virt_alloc_node_30515 memblock_virt_alloc_node 1 30515 NULL ++dwc3_testmode_write_30516 dwc3_testmode_write 3-0 30516 NULL nohasharray ++ea_write_30516 ea_write 0 30516 &dwc3_testmode_write_30516 ++rtl8187_start_30519 rtl8187_start 0 30519 NULL ++debug_debug2_read_30526 debug_debug2_read 3-0 30526 NULL ++picolcd_operation_mode_delay_store_30527 picolcd_operation_mode_delay_store 0-4 30527 NULL ++show_fnode_discovery_parent_type_30528 show_fnode_discovery_parent_type 0 30528 NULL ++init_30531 init 0 30531 NULL ++get_ctrl_reg_30533 get_ctrl_reg 0 30533 NULL ++ioat_attr_show_30535 ioat_attr_show 0 30535 NULL ++do_generic_file_read_30537 do_generic_file_read 0-4 30537 NULL ++ql_sem_spinlock_30547 ql_sem_spinlock 0 30547 NULL ++batadv_dat_snoop_incoming_arp_request_30548 batadv_dat_snoop_incoming_arp_request 3 30548 NULL ++lp3972_i2c_write_30550 lp3972_i2c_write 0 30550 NULL nohasharray ++xfs_setattr_nonsize_30550 xfs_setattr_nonsize 0 30550 &lp3972_i2c_write_30550 nohasharray ++logfs_setattr_30550 logfs_setattr 0 30550 &xfs_setattr_nonsize_30550 ++usb_serial_generic_open_30553 usb_serial_generic_open 0 30553 NULL ++ixgbevf_acquire_msix_vectors_30559 ixgbevf_acquire_msix_vectors 2 30559 NULL ++qlcnic_sriov_pf_create_flr_queue_30560 qlcnic_sriov_pf_create_flr_queue 0 30560 NULL ++disk_expand_part_tbl_30561 disk_expand_part_tbl 2 30561 NULL nohasharray ++rtsx_transfer_data_30561 rtsx_transfer_data 5 30561 &disk_expand_part_tbl_30561 ++pwc_set_motor_30565 pwc_set_motor 0 30565 NULL nohasharray ++koneplus_sysfs_write_profile_settings_30565 koneplus_sysfs_write_profile_settings 0-6-5 30565 &pwc_set_motor_30565 ++vivid_radio_write_30567 vivid_radio_write 0-3 30567 NULL ++gpio_trig_inverted_store_30568 gpio_trig_inverted_store 0-4 30568 NULL ++set_otp5en_30574 set_otp5en 4-0 30574 NULL ++ssb_devices_thaw_30578 ssb_devices_thaw 0 30578 NULL ++asd_execute_task_30579 asd_execute_task 0 30579 NULL ++maxchild_show_30580 maxchild_show 0 30580 NULL nohasharray ++bh1770_lux_rate_30580 bh1770_lux_rate 0 30580 &maxchild_show_30580 ++set_le_30581 set_le 4 30581 NULL ++queue_store_random_30586 queue_store_random 0-3 30586 NULL ++neofb_set_par_30587 neofb_set_par 0 30587 NULL ++blk_init_tags_30592 blk_init_tags 1 30592 NULL ++atc_pcm_playback_prepare_30594 atc_pcm_playback_prepare 0 30594 NULL ++hfsplus_delete_attr_30596 hfsplus_delete_attr 0 30596 NULL ++rx8025_read_regs_30597 rx8025_read_regs 0 30597 NULL ++i2c_hid_get_report_length_30598 i2c_hid_get_report_length 0 30598 NULL ++target_core_alua_tg_pt_gp_show_attr_alua_access_state_30602 target_core_alua_tg_pt_gp_show_attr_alua_access_state 0 30602 NULL ++sgl_map_user_pages_30610 sgl_map_user_pages 2 30610 NULL nohasharray ++roccat_common2_sysfs_read_keys_extra_30610 roccat_common2_sysfs_read_keys_extra 0-5-6 30610 &sgl_map_user_pages_30610 ++SyS_msgrcv_30611 SyS_msgrcv 3 30611 NULL ++__uncore_mask_rnid30_show_30614 __uncore_mask_rnid30_show 0 30614 NULL ++ppa_write_info_30619 ppa_write_info 0-3 30619 NULL ++o2nm_node_local_read_30623 o2nm_node_local_read 0 30623 NULL ++ath9k_htc_add_station_30625 ath9k_htc_add_station 0 30625 NULL ++reload_bitstream_store_30626 reload_bitstream_store 0-4 30626 NULL ++s5k4aa_set_exposure_30627 s5k4aa_set_exposure 0 30627 NULL nohasharray ++ieee802154_max_payload_30627 ieee802154_max_payload 0 30627 &s5k4aa_set_exposure_30627 ++show_activation_height_30629 show_activation_height 0 30629 NULL nohasharray ++macvtap_sendmsg_30629 macvtap_sendmsg 0-4 30629 &show_activation_height_30629 ++ieee80211_if_read_dot11MeshAwakeWindowDuration_30631 ieee80211_if_read_dot11MeshAwakeWindowDuration 3-0 30631 NULL ++run_store_30632 run_store 0-4 30632 NULL ++show_30633 show 0 30633 NULL ++compat_raw_setsockopt_30634 compat_raw_setsockopt 5 30634 NULL nohasharray ++jfs_setattr_30634 jfs_setattr 0 30634 &compat_raw_setsockopt_30634 nohasharray ++ath5k_hw_rf5110_channel_30634 ath5k_hw_rf5110_channel 0 30634 &jfs_setattr_30634 ++rv3029c2_i2c_read_time_30637 rv3029c2_i2c_read_time 0 30637 NULL nohasharray ++nilfs_checkpoints_last_seg_checkpoint_show_30637 nilfs_checkpoints_last_seg_checkpoint_show 0 30637 &rv3029c2_i2c_read_time_30637 ++mlx5_ib_alloc_fast_reg_page_list_30638 mlx5_ib_alloc_fast_reg_page_list 2 30638 NULL ++bonding_show_bonds_30640 bonding_show_bonds 0 30640 NULL ++rt2800usb_set_state_30644 rt2800usb_set_state 0 30644 NULL ++compat_sys_msgsnd_30645 compat_sys_msgsnd 3 30645 NULL ++SyS_listxattr_30647 SyS_listxattr 3 30647 NULL ++show_ipv4_iface_dhcp_alt_client_id_30652 show_ipv4_iface_dhcp_alt_client_id 0 30652 NULL ++show_session_param_ISCSI_PARAM_CHAP_OUT_IDX_30653 show_session_param_ISCSI_PARAM_CHAP_OUT_IDX 0 30653 NULL ++store_frontswap_selfshrinking_30662 store_frontswap_selfshrinking 0-4 30662 NULL ++bnx2x_change_mac_addr_30663 bnx2x_change_mac_addr 0 30663 NULL ++agp_remap_30665 agp_remap 2 30665 NULL ++jffs2_flash_read_30667 jffs2_flash_read 0 30667 NULL nohasharray ++bnx2x_setup_irqs_30667 bnx2x_setup_irqs 0 30667 &jffs2_flash_read_30667 ++cx8800_s_aud_ctrl_30676 cx8800_s_aud_ctrl 0 30676 NULL ++garmin_init_session_30677 garmin_init_session 0 30677 NULL nohasharray ++tda18212_set_params_30677 tda18212_set_params 0 30677 &garmin_init_session_30677 ++__mlx4_qp_modify_30685 __mlx4_qp_modify 0 30685 NULL ++target_fabric_nacl_auth_attr_store_30688 target_fabric_nacl_auth_attr_store 0 30688 NULL ++dlm_id_store_30691 dlm_id_store 0-3 30691 NULL ++xfs_vm_readpage_30695 xfs_vm_readpage 0 30695 NULL ++perf_event_read_one_30698 perf_event_read_one 0 30698 NULL ++sector_size_show_30700 sector_size_show 0 30700 NULL nohasharray ++be_cmd_rx_filter_30700 be_cmd_rx_filter 0 30700 §or_size_show_30700 ++dccp_setsockopt_ccid_30701 dccp_setsockopt_ccid 4-0 30701 NULL nohasharray ++snd_sonicvibes_trigger_30701 snd_sonicvibes_trigger 0 30701 &dccp_setsockopt_ccid_30701 nohasharray ++xfs_bmap_add_extent_unwritten_real_30701 xfs_bmap_add_extent_unwritten_real 0 30701 &snd_sonicvibes_trigger_30701 nohasharray ++iwl_dbgfs_set_nic_temperature_write_30701 iwl_dbgfs_set_nic_temperature_write 0-3 30701 &xfs_bmap_add_extent_unwritten_real_30701 ++qla4xxx_host_get_param_30705 qla4xxx_host_get_param 0 30705 NULL ++br2684_mac_addr_30706 br2684_mac_addr 0 30706 NULL ++acpi_pad_idlepct_show_30707 acpi_pad_idlepct_show 0 30707 NULL ++ip_vs_in_30711 ip_vs_in 0 30711 NULL ++lbs_wrbbp_write_30712 lbs_wrbbp_write 3-0 30712 NULL ++b43_attr_interfmode_store_30718 b43_attr_interfmode_store 0-4 30718 NULL ++l2cap_build_conf_rsp_30719 l2cap_build_conf_rsp 0 30719 NULL ++ceph_getattr_30720 ceph_getattr 0 30720 NULL nohasharray ++heartbeat_reboot_notifier_30720 heartbeat_reboot_notifier 0 30720 &ceph_getattr_30720 ++lbs_debugfs_read_30721 lbs_debugfs_read 3-0 30721 NULL ++itd_urb_transaction_30723 itd_urb_transaction 0 30723 NULL ++affs_symlink_readpage_30728 affs_symlink_readpage 0 30728 NULL ++nfs_super_get_key_30729 nfs_super_get_key 0 30729 NULL ++usb_udc_srp_store_30730 usb_udc_srp_store 0-4 30730 NULL ++pci_resource_alignment_show_30731 pci_resource_alignment_show 0 30731 NULL nohasharray ++cachefiles_read_backing_file_one_30731 cachefiles_read_backing_file_one 0 30731 &pci_resource_alignment_show_30731 ++pci_read_config_word_30732 pci_read_config_word 0 30732 NULL ++x25_setsockopt_30736 x25_setsockopt 0 30736 NULL ++snapshot_status_30744 snapshot_status 5 30744 NULL ++gre_tap_init_30745 gre_tap_init 0 30745 NULL ++kxtj9_get_poll_30750 kxtj9_get_poll 0 30750 NULL ++ixgbe_write_posted_mbx_30751 ixgbe_write_posted_mbx 0 30751 NULL ++fuse_direct_IO_30753 fuse_direct_IO 0 30753 NULL ++iwl_mvm_phy_ctxt_add_30756 iwl_mvm_phy_ctxt_add 0 30756 NULL ++stepping_show_30758 stepping_show 0 30758 NULL ++hfsplus_readpage_30759 hfsplus_readpage 0 30759 NULL ++aa_capable_30763 aa_capable 0 30763 NULL ++hdpvr_set_audio_30764 hdpvr_set_audio 0 30764 NULL nohasharray ++o2hb_region_pid_read_30764 o2hb_region_pid_read 0 30764 &hdpvr_set_audio_30764 ++ath10k_pci_bmi_wait_30766 ath10k_pci_bmi_wait 0 30766 NULL nohasharray ++iscsi_nacl_auth_store_userid_mutual_30766 iscsi_nacl_auth_store_userid_mutual 0-3 30766 &ath10k_pci_bmi_wait_30766 ++st_magn_buffer_preenable_30769 st_magn_buffer_preenable 0 30769 NULL ++fillonedir_30772 fillonedir 3 30772 NULL ++fuse_conn_limit_write_30777 fuse_conn_limit_write 3-0 30777 NULL nohasharray ++nilfs_btree_check_delete_30777 nilfs_btree_check_delete 0-2 30777 &fuse_conn_limit_write_30777 ++SyS_pread64_30778 SyS_pread64 3 30778 NULL ++__bio_alloc_30787 __bio_alloc 3 30787 NULL nohasharray ++mt9t112_init_setting_30787 mt9t112_init_setting 0 30787 &__bio_alloc_30787 ++sel_make_classes_30789 sel_make_classes 0 30789 NULL ++gether_set_dev_addr_30798 gether_set_dev_addr 0 30798 NULL ++populate_cache_leaves_30800 populate_cache_leaves 0 30800 NULL ++carl9170_init_rf_banks_0_7_30804 carl9170_init_rf_banks_0_7 0 30804 NULL ++iscsi_tpg_auth_show_userid_30807 iscsi_tpg_auth_show_userid 0 30807 NULL ++SMBLegacyOpen_30809 SMBLegacyOpen 0 30809 NULL ++smk_read_doi_30813 smk_read_doi 3-0 30813 NULL nohasharray ++cryptomgr_schedule_test_30813 cryptomgr_schedule_test 0 30813 &smk_read_doi_30813 ++SYSC_splice_30820 SYSC_splice 5 30820 NULL ++dn_create_30821 dn_create 0 30821 NULL ++xlog_grant_head_wait_30829 xlog_grant_head_wait 0 30829 NULL ++get_kobj_path_length_30831 get_kobj_path_length 0 30831 NULL ++pvc_create_30834 pvc_create 0 30834 NULL ++ath10k_write_fw_dbglog_30835 ath10k_write_fw_dbglog 3-0 30835 NULL nohasharray ++store_temp1_30835 store_temp1 0-4 30835 &ath10k_write_fw_dbglog_30835 ++vivid_start_generating_vid_out_30840 vivid_start_generating_vid_out 0 30840 NULL nohasharray ++set_therm_max_30840 set_therm_max 0-4 30840 &vivid_start_generating_vid_out_30840 ++of_gpio_named_count_30841 of_gpio_named_count 0 30841 NULL ++llc_ui_create_30842 llc_ui_create 0 30842 NULL ++sctp_setsockopt_auth_chunk_30843 sctp_setsockopt_auth_chunk 3-0 30843 NULL ++nilfs_palloc_count_desc_blocks_30846 nilfs_palloc_count_desc_blocks 0 30846 NULL ++ql_request_irq_30848 ql_request_irq 0 30848 NULL ++input_dev_show_cap_sw_30851 input_dev_show_cap_sw 0 30851 NULL ++is_otg_show_30852 is_otg_show 0 30852 NULL ++s5p_jpeg_buf_prepare_30860 s5p_jpeg_buf_prepare 0 30860 NULL ++regulator_get_voltage_sel_regmap_30864 regulator_get_voltage_sel_regmap 0 30864 NULL ++dlm_device_register_30866 dlm_device_register 0 30866 NULL ++dbg_check_key_order_30867 dbg_check_key_order 0 30867 NULL ++snd_fm801_capture_prepare_30869 snd_fm801_capture_prepare 0 30869 NULL ++ec_i2c_construct_message_30871 ec_i2c_construct_message 0 30871 NULL nohasharray ++lpfc_max_scsicmpl_time_show_30871 lpfc_max_scsicmpl_time_show 0 30871 &ec_i2c_construct_message_30871 ++snd_pcm_plugin_append_30872 snd_pcm_plugin_append 0 30872 NULL ++atl1e_get_regs_len_30883 atl1e_get_regs_len 0 30883 NULL ++ieee80211_if_fmt_dropped_frames_no_route_30884 ieee80211_if_fmt_dropped_frames_no_route 3 30884 NULL ++pn_recvmsg_30887 pn_recvmsg 0-4 30887 NULL nohasharray ++__ei_open_30887 __ei_open 0 30887 &pn_recvmsg_30887 ++regmap_update_bits_check_30894 regmap_update_bits_check 0 30894 NULL nohasharray ++cmd_ie_add_30894 cmd_ie_add 0 30894 ®map_update_bits_check_30894 ++copy_send_mad_30897 copy_send_mad 0 30897 NULL nohasharray ++ubifs_wbuf_seek_nolock_30897 ubifs_wbuf_seek_nolock 0 30897 ©_send_mad_30897 ++pxa168_get_settings_30899 pxa168_get_settings 0 30899 NULL ++copy_to_iter_30901 copy_to_iter 0-2 30901 NULL ++bq2415x_get_battery_regulation_voltage_30903 bq2415x_get_battery_regulation_voltage 0 30903 NULL nohasharray ++fc_host_post_vendor_event_30903 fc_host_post_vendor_event 3 30903 &bq2415x_get_battery_regulation_voltage_30903 ++complain_secs_store_30904 complain_secs_store 3-0 30904 NULL nohasharray ++__do_lo_send_write_30904 __do_lo_send_write 3 30904 &complain_secs_store_30904 ++rocker_port_vlan_flood_group_30908 rocker_port_vlan_flood_group 0 30908 NULL ++num_pages_show_30915 num_pages_show 0 30915 NULL ++osd_req_decode_sense_full_30918 osd_req_decode_sense_full 0 30918 NULL nohasharray ++ath10k_htt_h2t_aggr_cfg_msg_30918 ath10k_htt_h2t_aggr_cfg_msg 0 30918 &osd_req_decode_sense_full_30918 ++plip_hard_header_30919 plip_hard_header 0 30919 NULL ++show_fan_max_30922 show_fan_max 0 30922 NULL ++fit3_read_regr_30923 fit3_read_regr 0 30923 NULL ++tx_dropped_show_30925 tx_dropped_show 0 30925 NULL ++mmc_preferred_erase_size_show_30926 mmc_preferred_erase_size_show 0 30926 NULL ++usnic_debugfs_buildinfo_read_30928 usnic_debugfs_buildinfo_read 3-0 30928 NULL ++w1_master_attribute_store_add_30929 w1_master_attribute_store_add 0-4 30929 NULL ++i7core_show_counter_2_30930 i7core_show_counter_2 0 30930 NULL ++mwifiex_cmd_802_11_ad_hoc_join_30931 mwifiex_cmd_802_11_ad_hoc_join 0 30931 NULL ++hello_time_show_30936 hello_time_show 0 30936 NULL nohasharray ++set_30936 set 0 30936 &hello_time_show_30936 ++kovaplus_sysfs_write_control_30938 kovaplus_sysfs_write_control 0-6-5 30938 NULL ++bnx2x_get_rxfh_indir_size_30939 bnx2x_get_rxfh_indir_size 0 30939 NULL ++read_usunc_30940 read_usunc 0 30940 NULL ++sctp_setsockopt_rtoinfo_30941 sctp_setsockopt_rtoinfo 3-0 30941 NULL nohasharray ++parport_uss720_ecp_read_data_30941 parport_uss720_ecp_read_data 0 30941 &sctp_setsockopt_rtoinfo_30941 ++sctp_do_bind_30943 sctp_do_bind 0 30943 NULL ++reserve_space_30953 reserve_space 0 30953 NULL nohasharray ++store_30953 store 0-4 30953 &reserve_space_30953 ++st_accel_buffer_preenable_30954 st_accel_buffer_preenable 0 30954 NULL ++vicam_control_msg_30956 vicam_control_msg 0 30956 NULL ++oxu_urb_enqueue_30959 oxu_urb_enqueue 0 30959 NULL ++wan_enable_show_30966 wan_enable_show 0 30966 NULL ++set_tcrit2_30967 set_tcrit2 0-4 30967 NULL ++sr_write_async_30968 sr_write_async 3 30968 NULL ++tty_insert_flip_string_flags_30969 tty_insert_flip_string_flags 4 30969 NULL ++call_netdevice_notifiers_info_30980 call_netdevice_notifiers_info 0 30980 NULL ++read_file_bt_ant_diversity_30983 read_file_bt_ant_diversity 3-0 30983 NULL ++cypress_open_30984 cypress_open 0 30984 NULL ++transmit_power_show_30988 transmit_power_show 0 30988 NULL ++i2400mu_rx_size_grow_30989 i2400mu_rx_size_grow 0 30989 NULL ++wan_write_30990 wan_write 0 30990 NULL ++wake_up_lan_store_30992 wake_up_lan_store 0-4 30992 NULL ++odev_attr_show_30995 odev_attr_show 0 30995 NULL ++qlcnic_83xx_enqueue_mbx_cmd_30997 qlcnic_83xx_enqueue_mbx_cmd 0 30997 NULL ++mc13xxx_reg_read_31002 mc13xxx_reg_read 0 31002 NULL ++qla2x00_optrom_efi_version_show_31004 qla2x00_optrom_efi_version_show 0 31004 NULL nohasharray ++__netdev_upper_dev_link_31004 __netdev_upper_dev_link 0 31004 &qla2x00_optrom_efi_version_show_31004 ++max1363_monitor_show_freq_31008 max1363_monitor_show_freq 0 31008 NULL ++igb_setup_tx_resources_31011 igb_setup_tx_resources 0 31011 NULL ++lbs_host_sleep_read_31013 lbs_host_sleep_read 3-0 31013 NULL nohasharray ++validate_and_copy_buf_31013 validate_and_copy_buf 0 31013 &lbs_host_sleep_read_31013 ++ima_eventsig_init_31022 ima_eventsig_init 5 31022 NULL ++snd_usb_init_pitch_31023 snd_usb_init_pitch 0 31023 NULL ++btrfs_space_info_show_bytes_may_use_31024 btrfs_space_info_show_bytes_may_use 0 31024 NULL nohasharray ++phys_pmd_init_31024 phys_pmd_init 0-2-3 31024 &btrfs_space_info_show_bytes_may_use_31024 nohasharray ++iio_sysfs_trigger_probe_31024 iio_sysfs_trigger_probe 0 31024 &phys_pmd_init_31024 ++show_fc_host_max_npiv_vports_31030 show_fc_host_max_npiv_vports 0 31030 NULL ++get_regs_len_31032 get_regs_len 0 31032 NULL ++uhci_check_bandwidth_31041 uhci_check_bandwidth 0 31041 NULL ++do_setup_msi_irqs_31043 do_setup_msi_irqs 2 31043 NULL nohasharray ++carl9170_rx_filter_31043 carl9170_rx_filter 0 31043 &do_setup_msi_irqs_31043 ++__smsc75xx_mdio_read_31046 __smsc75xx_mdio_read 0 31046 NULL ++show_brightness_31047 show_brightness 0 31047 NULL ++ov534_s_ctrl_31054 ov534_s_ctrl 0 31054 NULL ++sys_splice_31055 sys_splice 5 31055 NULL ++pci_set_resource_alignment_param_31057 pci_set_resource_alignment_param 0-2 31057 NULL ++aoedisk_show_fwver_31059 aoedisk_show_fwver 0 31059 NULL ++compat_sys_mq_timedsend_31060 compat_sys_mq_timedsend 3 31060 NULL ++lbs_failcount_read_31063 lbs_failcount_read 3-0 31063 NULL ++pcf8563_rtc_set_alarm_31070 pcf8563_rtc_set_alarm 0 31070 NULL ++memmap_attr_show_31075 memmap_attr_show 0 31075 NULL ++create_multi_channel_mode_31077 create_multi_channel_mode 0 31077 NULL ++ip175c_config_init_31078 ip175c_config_init 0 31078 NULL ++sys_mincore_31079 sys_mincore 2-1 31079 NULL ++arcmsr_attr_host_driver_version_31081 arcmsr_attr_host_driver_version 0 31081 NULL ++ttm_bo_ioremap_31082 ttm_bo_ioremap 2-3 31082 NULL nohasharray ++cfq_quantum_store_31082 cfq_quantum_store 0-3 31082 &ttm_bo_ioremap_31082 ++gt_max_freq_mhz_show_31084 gt_max_freq_mhz_show 0 31084 NULL ++vmstat_cpuup_callback_31085 vmstat_cpuup_callback 0 31085 NULL ++bh1770_set_prox_rate_above_31087 bh1770_set_prox_rate_above 0-4 31087 NULL ++sctp_setsockopt_context_31091 sctp_setsockopt_context 3-0 31091 NULL ++proc_gid_map_write_31093 proc_gid_map_write 3-0 31093 NULL ++pci_mmcfg_write_31103 pci_mmcfg_write 0 31103 NULL ++i915_gem_object_wait_rendering__tail_31104 i915_gem_object_wait_rendering__tail 0 31104 NULL ++output_report_31105 output_report 0 31105 NULL ++store_direct_dword_31108 store_direct_dword 0-4 31108 NULL ++compat_sys_get_mempolicy_31109 compat_sys_get_mempolicy 3 31109 NULL nohasharray ++string_to_context_struct_31109 string_to_context_struct 0 31109 &compat_sys_get_mempolicy_31109 ++dns_resolver_preparse_31110 dns_resolver_preparse 0 31110 NULL ++depth_read_31112 depth_read 3-0 31112 NULL nohasharray ++show_otp5_31112 show_otp5 0 31112 &depth_read_31112 ++show_31115 show 0 31115 NULL ++hash_ipportnet6_expire_31118 hash_ipportnet6_expire 4 31118 NULL ++space_store_31124 space_store 0-3 31124 NULL ++set_temp_type_31125 set_temp_type 0-4 31125 NULL ++lpfc_fcp2_no_tgt_reset_show_31127 lpfc_fcp2_no_tgt_reset_show 0 31127 NULL nohasharray ++preparse_31127 preparse 0 31127 &lpfc_fcp2_no_tgt_reset_show_31127 ++tse_init_rx_buffer_31129 tse_init_rx_buffer 0-3 31129 NULL ++_cancel_lock_31130 _cancel_lock 0 31130 NULL ++acpi_ex_prep_common_field_object_31135 acpi_ex_prep_common_field_object 0 31135 NULL nohasharray ++itg3200_data_rdy_trigger_set_state_31135 itg3200_data_rdy_trigger_set_state 0 31135 &acpi_ex_prep_common_field_object_31135 ++i2c_recv_byte_31137 i2c_recv_byte 0 31137 NULL ++target_stat_scsi_att_intr_port_show_attr_dev_31138 target_stat_scsi_att_intr_port_show_attr_dev 0 31138 NULL ++ssb_read16_31139 ssb_read16 0 31139 NULL ++store_speed_scan_31141 store_speed_scan 0-4 31141 NULL ++b43_sdio_request_irq_31144 b43_sdio_request_irq 0 31144 NULL ++patch_nvhdmi_31148 patch_nvhdmi 0 31148 NULL nohasharray ++w9966_v4l_read_31148 w9966_v4l_read 3 31148 &patch_nvhdmi_31148 ++acpi_cpu_soft_notify_31149 acpi_cpu_soft_notify 0 31149 NULL ++uvc_start_streaming_31157 uvc_start_streaming 0 31157 NULL ++lid_mask_count_show_31167 lid_mask_count_show 0 31167 NULL ++nvme_set_features_31169 nvme_set_features 0 31169 NULL ++get_batt_uV_31171 get_batt_uV 0 31171 NULL nohasharray ++rxq_init_31171 rxq_init 0 31171 &get_batt_uV_31171 ++f2fs_convert_inline_inode_31174 f2fs_convert_inline_inode 0 31174 NULL ++_regulator_do_disable_31175 _regulator_do_disable 0 31175 NULL nohasharray ++pktgen_thread_write_31175 pktgen_thread_write 0-3 31175 &_regulator_do_disable_31175 ++s5k83a_get_rotation_31176 s5k83a_get_rotation 0 31176 NULL ++store_31179 store 0-3 31179 NULL ++mag3110_show_int_plus_micros_31190 mag3110_show_int_plus_micros 0 31190 NULL nohasharray ++raw_init_31190 raw_init 0 31190 &mag3110_show_int_plus_micros_31190 ++acpi_ex_system_memory_space_handler_31192 acpi_ex_system_memory_space_handler 2 31192 NULL nohasharray ++persist_show_31192 persist_show 0 31192 &acpi_ex_system_memory_space_handler_31192 ++__gpiod_request_31195 __gpiod_request 0 31195 NULL ++iscsit_ta_t10_pi_31196 iscsit_ta_t10_pi 0 31196 NULL ++amd8111_access_31197 amd8111_access 0 31197 NULL ++rocker_dma_ring_create_31198 rocker_dma_ring_create 3-0 31198 NULL nohasharray ++r592_read_fifo_pio_31198 r592_read_fifo_pio 3 31198 &rocker_dma_ring_create_31198 ++mtdchar_readoob_31200 mtdchar_readoob 4 31200 NULL ++tps6586x_reads_31201 tps6586x_reads 0 31201 NULL nohasharray ++sh_eth_phy_init_31201 sh_eth_phy_init 0 31201 &tps6586x_reads_31201 ++snd_pcm_plugin_build_rate_31203 snd_pcm_plugin_build_rate 0 31203 NULL ++show_fnode_first_burst_len_31205 show_fnode_first_burst_len 0 31205 NULL ++cpumask_weight_31215 cpumask_weight 0 31215 NULL ++__read_reg_31216 __read_reg 0 31216 NULL ++atm_get_addr_31221 atm_get_addr 3 31221 NULL nohasharray ++lpfc_fips_level_show_31221 lpfc_fips_level_show 0 31221 &atm_get_addr_31221 nohasharray ++srpt_tpg_attrib_show_srp_sq_size_31221 srpt_tpg_attrib_show_srp_sq_size 0 31221 &lpfc_fips_level_show_31221 ++connect_type_show_31228 connect_type_show 0 31228 NULL nohasharray ++crypto_sha1_update_31228 crypto_sha1_update 0 31228 &connect_type_show_31228 ++e1000_setup_rx_resources_31230 e1000_setup_rx_resources 0 31230 NULL ++vmcoreinfo_show_31231 vmcoreinfo_show 0 31231 NULL ++SMB2_sess_setup_31233 SMB2_sess_setup 0 31233 NULL ++store_31237 store 0-3 31237 NULL ++tcp_recvmsg_31238 tcp_recvmsg 4-0 31238 NULL ++cyy_readb_31240 cyy_readb 0 31240 NULL nohasharray ++tty_check_change_31240 tty_check_change 0 31240 &cyy_readb_31240 ++snd_es1938_capture_trigger_31242 snd_es1938_capture_trigger 0 31242 NULL nohasharray ++store_sf4_pwm_31242 store_sf4_pwm 0-4 31242 &snd_es1938_capture_trigger_31242 nohasharray ++lpfc_wwn_set_31242 lpfc_wwn_set 0 31242 &store_sf4_pwm_31242 ++cbaf_wusb_cdid_store_31243 cbaf_wusb_cdid_store 0-4 31243 NULL ++_create_sg_bios_31244 _create_sg_bios 4 31244 NULL nohasharray ++set_otp4_31244 set_otp4 4-0 31244 &_create_sg_bios_31244 ++recv_pre_dequeue_31252 recv_pre_dequeue 0 31252 NULL ++ieee80211_if_read_last_beacon_31257 ieee80211_if_read_last_beacon 3-0 31257 NULL ++sctp_tsnmap_find_gap_ack_31272 sctp_tsnmap_find_gap_ack 3-2 31272 NULL ++uinput_read_31275 uinput_read 0-3 31275 NULL nohasharray ++udf_write_begin_31275 udf_write_begin 0 31275 &uinput_read_31275 ++show_temp_hyst1_31276 show_temp_hyst1 0 31276 NULL ++autosuspend_store_31279 autosuspend_store 0-4 31279 NULL nohasharray ++mwifiex_send_tdls_action_frame_31279 mwifiex_send_tdls_action_frame 7 31279 &autosuspend_store_31279 ++show_ipv4_iface_grat_arp_en_31280 show_ipv4_iface_grat_arp_en 0 31280 NULL nohasharray ++ia_setsockopt_31280 ia_setsockopt 0 31280 &show_ipv4_iface_grat_arp_en_31280 ++mlx5_cmd_exec_cb_31281 mlx5_cmd_exec_cb 0 31281 NULL ++spmi_write_cmd_31283 spmi_write_cmd 0 31283 NULL ++hash_netportnet4_expire_31290 hash_netportnet4_expire 4 31290 NULL ++device_suspend_late_31297 device_suspend_late 0 31297 NULL ++fill_and_eval_dacs_31298 fill_and_eval_dacs 0 31298 NULL ++iwl_dbgfs_set_nic_temperature_read_31300 iwl_dbgfs_set_nic_temperature_read 3-0 31300 NULL ++uvc_simplify_fraction_31303 uvc_simplify_fraction 3 31303 NULL ++sha1_mb_finup_31305 sha1_mb_finup 0 31305 NULL ++tps6507x_pmic_read_31310 tps6507x_pmic_read 0 31310 NULL ++i2c_nuvoton_recv_data_31312 i2c_nuvoton_recv_data 0-4 31312 NULL ++sisusbcon_scroll_31315 sisusbcon_scroll 5-2-3 31315 NULL ++target_fabric_port_store_attr_alua_tg_pt_status_31316 target_fabric_port_store_attr_alua_tg_pt_status 0-3 31316 NULL ++command_file_write_31318 command_file_write 3-0 31318 NULL ++ext4_xattr_block_list_31325 ext4_xattr_block_list 0 31325 NULL nohasharray ++acpi_ev_get_gpe_xrupt_block_31325 acpi_ev_get_gpe_xrupt_block 1 31325 &ext4_xattr_block_list_31325 ++uwb_rc_beacon_show_31326 uwb_rc_beacon_show 0 31326 NULL ++recvmsg_31331 recvmsg 0-4 31331 NULL ++__vb2_cleanup_fileio_31332 __vb2_cleanup_fileio 0 31332 NULL nohasharray ++mmc_power_restore_31332 mmc_power_restore 0 31332 &__vb2_cleanup_fileio_31332 ++_regmap_raw_multi_reg_write_31336 _regmap_raw_multi_reg_write 3 31336 NULL nohasharray ++radix_tree_insert_31336 radix_tree_insert 0 31336 &_regmap_raw_multi_reg_write_31336 ++em28xx_init_usb_xfer_31337 em28xx_init_usb_xfer 4-6-0 31337 NULL ++f2fs_sbi_store_31339 f2fs_sbi_store 0-4 31339 NULL ++platform_device_add_31340 platform_device_add 0 31340 NULL ++jffs2_trusted_listxattr_31348 jffs2_trusted_listxattr 0-5 31348 NULL nohasharray ++snd_seq_enqueue_event_31348 snd_seq_enqueue_event 0 31348 &jffs2_trusted_listxattr_31348 ++queue_setup_31353 queue_setup 0 31353 NULL ++vpx3220_s_ctrl_31356 vpx3220_s_ctrl 0 31356 NULL ++outlen_write_31358 outlen_write 3-0 31358 NULL ++pinctrl_utils_add_map_configs_31359 pinctrl_utils_add_map_configs 7 31359 NULL ++show_fcstat_tx_frames_31360 show_fcstat_tx_frames 0 31360 NULL ++native_setup_msi_irqs_31367 native_setup_msi_irqs 0 31367 NULL ++handler_31368 handler 0 31368 NULL ++xprt_rdma_allocate_31372 xprt_rdma_allocate 2 31372 NULL ++snd_mixart_prepare_31374 snd_mixart_prepare 0 31374 NULL ++fb_blank_31377 fb_blank 0 31377 NULL ++xen_pcibk_config_quirks_add_field_31379 xen_pcibk_config_quirks_add_field 0 31379 NULL nohasharray ++trace_parser_get_init_31379 trace_parser_get_init 2 31379 &xen_pcibk_config_quirks_add_field_31379 ++mp_ioapic_pin_count_31393 mp_ioapic_pin_count 0 31393 NULL ++zd_chip_set_basic_rates_31394 zd_chip_set_basic_rates 0 31394 NULL ++blk_mq_sysfs_dispatched_show_31400 blk_mq_sysfs_dispatched_show 0 31400 NULL ++fat_count_free_clusters_31403 fat_count_free_clusters 0 31403 NULL nohasharray ++i40evf_up_complete_31403 i40evf_up_complete 0 31403 &fat_count_free_clusters_31403 ++pcf8563_rtc_read_time_31404 pcf8563_rtc_read_time 0 31404 NULL nohasharray ++set_bool_threeg_31404 set_bool_threeg 0-4 31404 &pcf8563_rtc_read_time_31404 ++wm831x_reg_unlock_31409 wm831x_reg_unlock 0 31409 NULL ++key_ifindex_read_31411 key_ifindex_read 3-0 31411 NULL nohasharray ++nf_nat_packet_31411 nf_nat_packet 0 31411 &key_ifindex_read_31411 ++mcs7830_set_reg_31413 mcs7830_set_reg 0-3 31413 NULL ++xgene_enet_set_mac_address_31415 xgene_enet_set_mac_address 0 31415 NULL ++set_in5_max_31420 set_in5_max 0-4 31420 NULL ++write_file_simulate_radar_31421 write_file_simulate_radar 0-3 31421 NULL ++test_rtc_read_time_31422 test_rtc_read_time 0 31422 NULL nohasharray ++_sp2d_max_pg_31422 _sp2d_max_pg 0 31422 &test_rtc_read_time_31422 nohasharray ++target_fabric_wwn_attr_store_31422 target_fabric_wwn_attr_store 0 31422 &_sp2d_max_pg_31422 ++cxacru_sysfs_show_downstream_attenuation_31423 cxacru_sysfs_show_downstream_attenuation 0 31423 NULL ++TSS_checkhmac1_31429 TSS_checkhmac1 0 31429 NULL ++iuu_open_31432 iuu_open 0 31432 NULL ++snd_ice1712_capture_prepare_31445 snd_ice1712_capture_prepare 0 31445 NULL nohasharray ++acpi_sci_ioapic_setup_31445 acpi_sci_ioapic_setup 4 31445 &snd_ice1712_capture_prepare_31445 ++security_set_bools_31447 security_set_bools 0 31447 NULL ++transport_alloc_session_tags_31449 transport_alloc_session_tags 3-2 31449 NULL ++interf_grp_compatible_id_show_31450 interf_grp_compatible_id_show 0 31450 NULL ++__uio_register_device_31451 __uio_register_device 0 31451 NULL ++opera1_xilinx_rw_31453 opera1_xilinx_rw 5 31453 NULL ++_regmap_update_bits_31456 _regmap_update_bits 0 31456 NULL ++ubifs_log_end_commit_31463 ubifs_log_end_commit 0 31463 NULL ++input_get_new_minor_31464 input_get_new_minor 1 31464 NULL ++drm_read_31467 drm_read 0-3 31467 NULL ++do_fcntl_31468 do_fcntl 3 31468 NULL ++ab3100_otp_freq_show_31472 ab3100_otp_freq_show 0 31472 NULL nohasharray ++atl1e_phy_init_31472 atl1e_phy_init 0 31472 &ab3100_otp_freq_show_31472 ++xfs_btree_get_numrecs_31477 xfs_btree_get_numrecs 0 31477 NULL nohasharray ++bad_inode_getattr_31477 bad_inode_getattr 0 31477 &xfs_btree_get_numrecs_31477 ++__ext4_journal_get_write_access_31482 __ext4_journal_get_write_access 0 31482 NULL ++ath10k_send_key_31483 ath10k_send_key 0 31483 NULL ++alg_setkey_31485 alg_setkey 3-0 31485 NULL ++show_spi_transport_max_iu_31486 show_spi_transport_max_iu 0 31486 NULL nohasharray ++wm831x_rtc_start_alarm_31486 wm831x_rtc_start_alarm 0 31486 &show_spi_transport_max_iu_31486 ++rds_message_map_pages_31487 rds_message_map_pages 2 31487 NULL ++cpuid_device_create_31489 cpuid_device_create 0 31489 NULL ++blkdev_fsync_31490 blkdev_fsync 0 31490 NULL ++qsfp_2_read_31491 qsfp_2_read 3-0 31491 NULL ++target_stat_scsi_att_intr_port_show_attr_port_ident_31495 target_stat_scsi_att_intr_port_show_attr_port_ident 0 31495 NULL nohasharray ++nes_init_nic_qp_31495 nes_init_nic_qp 0 31495 &target_stat_scsi_att_intr_port_show_attr_port_ident_31495 ++__alloc_bootmem_31498 __alloc_bootmem 1 31498 NULL ++cond_search_polarity_read_31499 cond_search_polarity_read 0-5-6 31499 NULL nohasharray ++ad_sd_validate_trigger_31499 ad_sd_validate_trigger 0 31499 &cond_search_polarity_read_31499 ++cifs_readpage_31509 cifs_readpage 0 31509 NULL ++wl18xx_pre_boot_31510 wl18xx_pre_boot 0 31510 NULL ++lpfc_first_burst_size_store_31512 lpfc_first_burst_size_store 0-4 31512 NULL ++il3945_store_retry_rate_31513 il3945_store_retry_rate 0-4 31513 NULL ++w1_read_block_31521 w1_read_block 0-3 31521 NULL ++wacom_set_report_31524 wacom_set_report 0 31524 NULL ++metrousb_open_31526 metrousb_open 0 31526 NULL nohasharray ++nfs4_proc_layoutcommit_31526 nfs4_proc_layoutcommit 0 31526 &metrousb_open_31526 ++fs_send_31530 fs_send 0 31530 NULL ++__mv88e6xxx_reg_read_31534 __mv88e6xxx_reg_read 0 31534 NULL ++tvp5150_s_ctrl_31535 tvp5150_s_ctrl 0 31535 NULL ++hidraw_write_31536 hidraw_write 3-0 31536 NULL ++powerclamp_cpu_callback_31543 powerclamp_cpu_callback 0 31543 NULL nohasharray ++mtd_div_by_eb_31543 mtd_div_by_eb 0-1 31543 &powerclamp_cpu_callback_31543 ++dvb_ringbuffer_write_31548 dvb_ringbuffer_write 0-3 31548 NULL ++usbvision_read_31555 usbvision_read 3-0 31555 NULL ++phy_attach_direct_31556 phy_attach_direct 0 31556 NULL ++vendor_name_show_31559 vendor_name_show 0 31559 NULL nohasharray ++_aac_reset_adapter_31559 _aac_reset_adapter 0 31559 &vendor_name_show_31559 ++thermal_cooling_device_cur_state_store_31564 thermal_cooling_device_cur_state_store 0-4 31564 NULL ++show_temp_min_alarm_31566 show_temp_min_alarm 0 31566 NULL ++tda18271_read_regs_31567 tda18271_read_regs 0 31567 NULL nohasharray ++cp2112_set_usb_config_31567 cp2112_set_usb_config 0 31567 &tda18271_read_regs_31567 ++latch_read_file_31569 latch_read_file 0 31569 NULL ++temp_cpu_DTS_31570 temp_cpu_DTS 0 31570 NULL ++tx_frag_tkip_called_read_31575 tx_frag_tkip_called_read 3-0 31575 NULL ++get_max_inline_xattr_value_size_31578 get_max_inline_xattr_value_size 0 31578 NULL ++osst_write_31581 osst_write 3-0 31581 NULL ++snd_compr_get_avail_31584 snd_compr_get_avail 0 31584 NULL nohasharray ++pre_handle_cursor_31584 pre_handle_cursor 0 31584 &snd_compr_get_avail_31584 ++fc_read_31589 fc_read 0-3 31589 NULL ++max8997_led_show_mode_31591 max8997_led_show_mode 0 31591 NULL ++adp8870_read_31592 adp8870_read 0 31592 NULL ++fc0011_set_params_31596 fc0011_set_params 0 31596 NULL nohasharray ++show_fc_vport_vport_state_31596 show_fc_vport_vport_state 0 31596 &fc0011_set_params_31596 nohasharray ++diag_write_31596 diag_write 0 31596 &show_fc_vport_vport_state_31596 ++qlcnic_store_bridged_mode_31599 qlcnic_store_bridged_mode 0-4 31599 NULL ++show_conn_param_ISCSI_PARAM_MAX_XMIT_DLENGTH_31608 show_conn_param_ISCSI_PARAM_MAX_XMIT_DLENGTH 0 31608 NULL ++store_31610 store 0-4 31610 NULL ++iwl_dbgfs_ucode_tx_stats_read_31611 iwl_dbgfs_ucode_tx_stats_read 3-0 31611 NULL ++lpfc_used_rpi_show_31612 lpfc_used_rpi_show 0 31612 NULL ++rt2400pci_enable_radio_31614 rt2400pci_enable_radio 0 31614 NULL ++memblock_virt_alloc_nopanic_31617 memblock_virt_alloc_nopanic 1 31617 NULL nohasharray ++arvo_sysfs_read_31617 arvo_sysfs_read 0-6 31617 &memblock_virt_alloc_nopanic_31617 ++ipv4_confirm_31620 ipv4_confirm 0 31620 NULL ++usnic_ib_dump_vf_31623 usnic_ib_dump_vf 3 31623 NULL ++neofb_check_var_31627 neofb_check_var 0 31627 NULL nohasharray ++setup_first_bd_ep0_31627 setup_first_bd_ep0 0 31627 &neofb_check_var_31627 ++disassociate_31631 disassociate 0 31631 NULL ++caif_create_31634 caif_create 0 31634 NULL ++videobuf_read_one_31637 videobuf_read_one 3-0 31637 NULL nohasharray ++snd_cs4281_playback_prepare_31637 snd_cs4281_playback_prepare 0 31637 &videobuf_read_one_31637 ++ext3_sync_file_31639 ext3_sync_file 0 31639 NULL nohasharray ++aty_var_to_pll_408_31639 aty_var_to_pll_408 0 31639 &ext3_sync_file_31639 ++smb3_crypto_shash_allocate_31640 smb3_crypto_shash_allocate 0 31640 NULL ++igmp_netdev_event_31648 igmp_netdev_event 0 31648 NULL ++pod_alloc_sysex_buffer_31651 pod_alloc_sysex_buffer 3 31651 NULL ++rocker_flow_tbl_del_31653 rocker_flow_tbl_del 0 31653 NULL ++show_session_param_ISCSI_PARAM_FIRST_BURST_31655 show_session_param_ISCSI_PARAM_FIRST_BURST 0 31655 NULL ++current_page_show_31657 current_page_show 0 31657 NULL ++reset_31659 reset 0 31659 NULL ++__ceph_do_getattr_31661 __ceph_do_getattr 0 31661 NULL nohasharray ++xfer_secondary_pool_31661 xfer_secondary_pool 2 31661 &__ceph_do_getattr_31661 nohasharray ++bq4802_read_time_31661 bq4802_read_time 0 31661 &xfer_secondary_pool_31661 ++__lgread_31668 __lgread 4 31668 NULL ++target_fabric_mappedlun_store_write_protect_31671 target_fabric_mappedlun_store_write_protect 0-3 31671 NULL ++copy_from_user_nmi_31672 copy_from_user_nmi 3-0 31672 NULL nohasharray ++virtblk_cache_type_show_31672 virtblk_cache_type_show 0 31672 ©_from_user_nmi_31672 nohasharray ++kovaplus_sysfs_read_profilex_buttons_31672 kovaplus_sysfs_read_profilex_buttons 0-5-6 31672 &virtblk_cache_type_show_31672 ++read_cc_setting_bin_31679 read_cc_setting_bin 0-5-6 31679 NULL ++xfs_inobt_get_maxrecs_31680 xfs_inobt_get_maxrecs 0 31680 NULL ++mlx4_en_init_affinity_hint_31682 mlx4_en_init_affinity_hint 0 31682 NULL nohasharray ++bq2415x_set_charge_current_31682 bq2415x_set_charge_current 0 31682 &mlx4_en_init_affinity_hint_31682 nohasharray ++_usb_writeN_sync_31682 _usb_writeN_sync 4 31682 &bq2415x_set_charge_current_31682 ++forced_ps_read_31685 forced_ps_read 3-0 31685 NULL nohasharray ++ip6_tnl_dev_init_31685 ip6_tnl_dev_init 0 31685 &forced_ps_read_31685 ++x25_bind_31686 x25_bind 0 31686 NULL ++reiserfs_in_journal_31689 reiserfs_in_journal 3 31689 NULL ++ext3_xattr_user_get_31691 ext3_xattr_user_get 0 31691 NULL ++read_ofdm_cal_values_31694 read_ofdm_cal_values 0 31694 NULL ++ufs_write_begin_31695 ufs_write_begin 0 31695 NULL ++sht15_transmission_start_31696 sht15_transmission_start 0 31696 NULL ++wl1251_acx_slot_31699 wl1251_acx_slot 0 31699 NULL ++enqueue_cmd_31703 enqueue_cmd 0 31703 NULL ++audit_log_n_string_31705 audit_log_n_string 3 31705 NULL ++ov9640_write_regs_31707 ov9640_write_regs 0 31707 NULL ++tda827xo_set_params_31708 tda827xo_set_params 0 31708 NULL ++bq2415x_sysfs_show_reported_mode_31709 bq2415x_sysfs_show_reported_mode 0 31709 NULL ++apply_constraint_31714 apply_constraint 0 31714 NULL ++fitpc2_wdt_write_31715 fitpc2_wdt_write 0-3 31715 NULL ++id_device_show_31718 id_device_show 0 31718 NULL ++lpfc_multi_ring_type_show_31719 lpfc_multi_ring_type_show 0 31719 NULL nohasharray ++igb_disable_sriov_31719 igb_disable_sriov 0 31719 &lpfc_multi_ring_type_show_31719 ++snd_rme96_capture_trigger_31720 snd_rme96_capture_trigger 0 31720 NULL ++ldo_regulator_is_enabled_31723 ldo_regulator_is_enabled 0 31723 NULL ++ubifs_garbage_collect_leb_31724 ubifs_garbage_collect_leb 0 31724 NULL ++sctp_make_asconf_ack_31726 sctp_make_asconf_ack 3 31726 NULL ++rs_pretty_print_rate_31727 rs_pretty_print_rate 0 31727 NULL ++ath6kl_wmi_send_probe_response_cmd_31728 ath6kl_wmi_send_probe_response_cmd 6 31728 NULL ++skcipher_wait_for_data_31732 skcipher_wait_for_data 0 31732 NULL ++set_audio_31733 set_audio 0 31733 NULL ++label_northbridge_31734 label_northbridge 0 31734 NULL ++utf16s_to_utf8s_31735 utf16s_to_utf8s 0 31735 NULL nohasharray ++fan_get_status_safe_31735 fan_get_status_safe 0 31735 &utf16s_to_utf8s_31735 nohasharray ++skge_up_31735 skge_up 0 31735 &fan_get_status_safe_31735 nohasharray ++lu_buf_check_and_grow_31735 lu_buf_check_and_grow 2 31735 &skge_up_31735 ++shmem_pwrite_slow_31741 shmem_pwrite_slow 2-3 31741 NULL ++input_abs_get_max_31742 input_abs_get_max 0 31742 NULL ++lm3533_ctrlbank_get_pwm_31744 lm3533_ctrlbank_get_pwm 0 31744 NULL ++mtd_read_user_prot_reg_31746 mtd_read_user_prot_reg 0 31746 NULL ++snd_seq_device_new_31753 snd_seq_device_new 4 31753 NULL ++snd_via8233_capture_prepare_31757 snd_via8233_capture_prepare 0 31757 NULL ++show_attr_decimals_31760 show_attr_decimals 0 31760 NULL ++ath10k_mac_inc_num_stations_31762 ath10k_mac_inc_num_stations 0 31762 NULL ++SyS_lsetxattr_31766 SyS_lsetxattr 4 31766 NULL ++dst_dev_event_31770 dst_dev_event 0 31770 NULL ++vfs_getattr_31777 vfs_getattr 0 31777 NULL ++store_srp_rport_dev_loss_tmo_31779 store_srp_rport_dev_loss_tmo 0-4 31779 NULL ++vmw_gmr2_bind_31780 vmw_gmr2_bind 3 31780 NULL ++osync_buffers_list_31789 osync_buffers_list 0 31789 NULL ++usblp_cache_device_id_string_31790 usblp_cache_device_id_string 0 31790 NULL ++tg3_start_31796 tg3_start 0 31796 NULL ++ip1xx_reset_31799 ip1xx_reset 0 31799 NULL ++get_count_order_31800 get_count_order 0 31800 NULL ++ecryptfs_send_message_locked_31801 ecryptfs_send_message_locked 2 31801 NULL ++isr_rx_procs_read_31804 isr_rx_procs_read 3-0 31804 NULL nohasharray ++sc92031_open_31804 sc92031_open 0 31804 &isr_rx_procs_read_31804 ++data_write_31805 data_write 3-0 31805 NULL ++can_clear_show_31809 can_clear_show 0 31809 NULL nohasharray ++da9063_ldo_get_status_31809 da9063_ldo_get_status 0 31809 &can_clear_show_31809 ++t3_mac_set_mtu_31811 t3_mac_set_mtu 0 31811 NULL ++SyS_msgsnd_31814 SyS_msgsnd 3 31814 NULL ++strnlen_user_31815 strnlen_user 0-2 31815 NULL ++cxacru_sysfs_show_upstream_rate_31816 cxacru_sysfs_show_upstream_rate 0 31816 NULL ++sta_last_signal_read_31818 sta_last_signal_read 3-0 31818 NULL ++sysv_writepage_31819 sysv_writepage 0 31819 NULL ++fuse_dir_fsync_31820 fuse_dir_fsync 0 31820 NULL ++ad7793_read_frequency_31825 ad7793_read_frequency 0 31825 NULL ++ocfs2_readpage_inline_31829 ocfs2_readpage_inline 0 31829 NULL ++any_show_31831 any_show 0 31831 NULL ++notify_send_pre_enqueue_31834 notify_send_pre_enqueue 0 31834 NULL ++cachefiles_daemon_fcull_31835 cachefiles_daemon_fcull 0 31835 NULL ++__bond_release_one_31836 __bond_release_one 0 31836 NULL ++isp1362_urb_enqueue_31839 isp1362_urb_enqueue 0 31839 NULL ++bMaxPacketSize0_show_31842 bMaxPacketSize0_show 0 31842 NULL ++fsnotify_perm_31843 fsnotify_perm 0 31843 NULL ++subsystem_id_show_31847 subsystem_id_show 0 31847 NULL ++show_31851 show 0 31851 NULL ++clone_bio_31854 clone_bio 4-3 31854 NULL nohasharray ++velocity_init_rd_ring_31854 velocity_init_rd_ring 0 31854 &clone_bio_31854 ++SyS_ppoll_31855 SyS_ppoll 2 31855 NULL ++allocation_policy_show_31856 allocation_policy_show 0 31856 NULL ++digitv_i2c_xfer_31863 digitv_i2c_xfer 0-3 31863 NULL ++mxl1x1sf_tune_rf_31864 mxl1x1sf_tune_rf 0 31864 NULL ++edd_show_default_sectors_per_track_31865 edd_show_default_sectors_per_track 0 31865 NULL nohasharray ++iwl_setup_interface_31865 iwl_setup_interface 0 31865 &edd_show_default_sectors_per_track_31865 ++regulator_opmode_show_31867 regulator_opmode_show 0 31867 NULL ++adp8870_bl_l4_indoor_max_store_31869 adp8870_bl_l4_indoor_max_store 4-0 31869 NULL ++kovaplus_sysfs_show_actual_sensitivity_y_31873 kovaplus_sysfs_show_actual_sensitivity_y 0 31873 NULL ++iwl_dbgfs_disable_ht40_write_31876 iwl_dbgfs_disable_ht40_write 3-0 31876 NULL nohasharray ++nilfs_segments_dirty_segments_show_31876 nilfs_segments_dirty_segments_show 0 31876 &iwl_dbgfs_disable_ht40_write_31876 ++dvb_ringbuffer_free_31880 dvb_ringbuffer_free 0 31880 NULL ++drm_mode_crtc_set_gamma_size_31881 drm_mode_crtc_set_gamma_size 2 31881 NULL ++ubifs_lpt_start_commit_31884 ubifs_lpt_start_commit 0 31884 NULL ++macvtap_device_event_31891 macvtap_device_event 0 31891 NULL ++opera1_i2c_xfer_31897 opera1_i2c_xfer 0-3 31897 NULL nohasharray ++usbtv_setup_capture_31897 usbtv_setup_capture 0 31897 &opera1_i2c_xfer_31897 ++ddb_output_write_31902 ddb_output_write 3-0 31902 NULL nohasharray ++carl9170_set_qos_31902 carl9170_set_qos 0 31902 &ddb_output_write_31902 ++xattr_permission_31907 xattr_permission 0 31907 NULL ++xfs_da3_blk_unlink_31908 xfs_da3_blk_unlink 0 31908 NULL nohasharray ++bch_read_string_list_31908 bch_read_string_list 0 31908 &xfs_da3_blk_unlink_31908 ++snd_emu10k1_fx8010_register_irq_handler_31912 snd_emu10k1_fx8010_register_irq_handler 0 31912 NULL ++lu_buf_realloc_31915 lu_buf_realloc 2 31915 NULL ++pwm_unexport_store_31918 pwm_unexport_store 0-4 31918 NULL ++new_dir_31919 new_dir 3 31919 NULL ++kmem_alloc_31920 kmem_alloc 1 31920 NULL nohasharray ++show_req_lim_31920 show_req_lim 0 31920 &kmem_alloc_31920 ++show_lsvalue_31923 show_lsvalue 0 31923 NULL ++show_iface_tcp_nagle_disable_31926 show_iface_tcp_nagle_disable 0 31926 NULL ++interf_grp_sub_compatible_id_store_31927 interf_grp_sub_compatible_id_store 0-3 31927 NULL ++input_print_modalias_31930 input_print_modalias 0 31930 NULL ++wusb_phy_rate_store_31931 wusb_phy_rate_store 0-4 31931 NULL ++era_status_31934 era_status 5 31934 NULL ++__uncore_pgt_show_31935 __uncore_pgt_show 0 31935 NULL ++bh1770_set_prox_rate_below_31937 bh1770_set_prox_rate_below 0-4 31937 NULL nohasharray ++guestwidth_to_adjustwidth_31937 guestwidth_to_adjustwidth 0-1 31937 &bh1770_set_prox_rate_below_31937 ++SYSC_sethostname_31940 SYSC_sethostname 2 31940 NULL nohasharray ++bonding_show_lp_interval_31940 bonding_show_lp_interval 0 31940 &SYSC_sethostname_31940 nohasharray ++mgmt_get_gateway_31940 mgmt_get_gateway 0 31940 &bonding_show_lp_interval_31940 ++nfs_writepages_31941 nfs_writepages 0 31941 NULL ++read_mem_31942 read_mem 3-0 31942 NULL ++smc91c92_suspend_31943 smc91c92_suspend 0 31943 NULL ++tda18218_set_params_31944 tda18218_set_params 0 31944 NULL ++nilfs_btree_gather_data_31945 nilfs_btree_gather_data 0-4 31945 NULL ++wusb_retry_count_show_31946 wusb_retry_count_show 0 31946 NULL ++__alloc_percpu_gfp_31947 __alloc_percpu_gfp 1-2 31947 NULL nohasharray ++blocking_notifier_call_chain_31947 blocking_notifier_call_chain 0 31947 &__alloc_percpu_gfp_31947 ++vb2_write_31948 vb2_write 3-0 31948 NULL ++hdmiphy_s_dv_timings_31949 hdmiphy_s_dv_timings 0 31949 NULL ++r820t_set_pll_31950 r820t_set_pll 0 31950 NULL ++pvr2_ctrl_get_valname_31951 pvr2_ctrl_get_valname 4 31951 NULL ++target_core_alua_tg_pt_gp_store_attr_alua_support_standby_31952 target_core_alua_tg_pt_gp_store_attr_alua_support_standby 0-3 31952 NULL ++adm8211_init_rings_31955 adm8211_init_rings 0 31955 NULL ++__ipx_bind_31963 __ipx_bind 0 31963 NULL ++regcache_rbtree_sync_31964 regcache_rbtree_sync 2 31964 NULL ++osst_capacity_show_31965 osst_capacity_show 0 31965 NULL ++copy_from_user_toio_31966 copy_from_user_toio 3 31966 NULL ++pccard_show_vpp_31969 pccard_show_vpp 0 31969 NULL ++mtd_add_partition_31971 mtd_add_partition 3 31971 NULL ++blk_mq_update_nr_requests_31973 blk_mq_update_nr_requests 0 31973 NULL ++bt_dev_init_31974 bt_dev_init 0 31974 NULL ++suspend_nvs_alloc_31980 suspend_nvs_alloc 0 31980 NULL ++exofs_write_end_31981 exofs_write_end 0-5 31981 NULL nohasharray ++lanai_open_31981 lanai_open 0 31981 &exofs_write_end_31981 ++iblock_execute_rw_31982 iblock_execute_rw 3 31982 NULL nohasharray ++vx_read_status_31982 vx_read_status 0 31982 &iblock_execute_rw_31982 ++generic_set_freq_31989 generic_set_freq 0 31989 NULL ++find_next_zero_bit_31990 find_next_zero_bit 0-3-2 31990 NULL ++sockfs_getxattr_31992 sockfs_getxattr 0 31992 NULL nohasharray ++b43_phy_ht_set_channel_31992 b43_phy_ht_set_channel 0 31992 &sockfs_getxattr_31992 nohasharray ++lustre_acl_xattr_merge2posix_31992 lustre_acl_xattr_merge2posix 2 31992 &b43_phy_ht_set_channel_31992 ++si4713_setup_31994 si4713_setup 0 31994 NULL ++sysfs_create_file_31996 sysfs_create_file 0 31996 NULL nohasharray ++patch_alc260_31996 patch_alc260 0 31996 &sysfs_create_file_31996 ++poll_dte_32001 poll_dte 0 32001 NULL ++show_line_32004 show_line 0-3-4 32004 NULL ++jffs2_rtime_decompress_32010 jffs2_rtime_decompress 0 32010 NULL nohasharray ++calc_hmac_32010 calc_hmac 3 32010 &jffs2_rtime_decompress_32010 ++hdaps_variance_show_32012 hdaps_variance_show 0 32012 NULL nohasharray ++check_kprobe_address_safe_32012 check_kprobe_address_safe 0 32012 &hdaps_variance_show_32012 ++evm_protect_xattr_32016 evm_protect_xattr 0 32016 NULL ++sci_dma_rx_push_32029 sci_dma_rx_push 2 32029 NULL ++stk_read_32038 stk_read 3-0 32038 NULL ++camera_show_32039 camera_show 0 32039 NULL ++sdricoh_pcmcia_suspend_32042 sdricoh_pcmcia_suspend 0 32042 NULL ++vmw_cursor_update_dmabuf_32045 vmw_cursor_update_dmabuf 4-3 32045 NULL nohasharray ++mt9t112_set_params_32045 mt9t112_set_params 0 32045 &vmw_cursor_update_dmabuf_32045 ++sys_sched_setaffinity_32046 sys_sched_setaffinity 2 32046 NULL ++mc44s803_writereg_32053 mc44s803_writereg 0 32053 NULL ++dnet_open_32060 dnet_open 0 32060 NULL ++SYSC_llistxattr_32061 SYSC_llistxattr 3 32061 NULL ++flush_buffer_32063 flush_buffer 0 32063 NULL ++proc_scsi_devinfo_write_32064 proc_scsi_devinfo_write 3-0 32064 NULL ++jffs2_lzo_decompress_32065 jffs2_lzo_decompress 0 32065 NULL ++multipath_run_32066 multipath_run 0 32066 NULL ++max_queue_store_32079 max_queue_store 0-3 32079 NULL ++iblock_get_blocks_32080 iblock_get_blocks 0 32080 NULL nohasharray ++target_fabric_discovery_attr_store_32080 target_fabric_discovery_attr_store 0-4 32080 &iblock_get_blocks_32080 ++atmtcp_send_control_32082 atmtcp_send_control 0 32082 NULL ++iscsi_tpg_param_show_InitialR2T_32085 iscsi_tpg_param_show_InitialR2T 0 32085 NULL ++acpi_ds_load2_begin_op_32086 acpi_ds_load2_begin_op 0 32086 NULL nohasharray ++wl12xx_init_fw_32086 wl12xx_init_fw 0 32086 &acpi_ds_load2_begin_op_32086 ++show_counter_rx_p4_hdr_egr_ovfls_32088 show_counter_rx_p4_hdr_egr_ovfls 0 32088 NULL ++toshiba_touchpad_show_32091 toshiba_touchpad_show 0 32091 NULL nohasharray ++cow_file_range_inline_32091 cow_file_range_inline 0 32091 &toshiba_touchpad_show_32091 ++efx_mcdi_set_link_32093 efx_mcdi_set_link 0 32093 NULL nohasharray ++wakeup_count_store_32093 wakeup_count_store 0-4 32093 &efx_mcdi_set_link_32093 ++bio_alloc_32095 bio_alloc 2 32095 NULL ++temp_show_32099 temp_show 0 32099 NULL ++alloc_pwms_32100 alloc_pwms 2-1 32100 NULL ++ath6kl_fwlog_read_32101 ath6kl_fwlog_read 3-0 32101 NULL nohasharray ++iscsi_stat_sess_show_attr_inst_32101 iscsi_stat_sess_show_attr_inst 0 32101 &ath6kl_fwlog_read_32101 ++bond_netpoll_setup_32102 bond_netpoll_setup 0 32102 NULL ++wil_read_file_recovery_32104 wil_read_file_recovery 3-0 32104 NULL ++ep_enable_32105 ep_enable 0 32105 NULL ++ab3100_rtc_read_time_32107 ab3100_rtc_read_time 0 32107 NULL ++radix_tree_callback_32110 radix_tree_callback 0 32110 NULL ++twl_i2c_read_u8_32114 twl_i2c_read_u8 0 32114 NULL ++log_recovery_delay_store_32116 log_recovery_delay_store 0-2 32116 NULL ++disk_status_32120 disk_status 4-0 32120 NULL ++adfs_hash_32125 adfs_hash 0 32125 NULL ++rx8025_write_regs_32130 rx8025_write_regs 0 32130 NULL ++kobject_add_internal_32133 kobject_add_internal 0 32133 NULL ++acpi_power_on_resources_32134 acpi_power_on_resources 0 32134 NULL nohasharray ++ds2780_read_user_eeprom_bin_32134 ds2780_read_user_eeprom_bin 6-5-0 32134 &acpi_power_on_resources_32134 ++stv06xx_write_sensor_32136 stv06xx_write_sensor 0 32136 NULL ++alloc_tx_32143 alloc_tx 2 32143 NULL ++target_stat_scsi_port_show_attr_busy_count_32144 target_stat_scsi_port_show_attr_busy_count 0 32144 NULL ++show_fc_rport_port_id_32145 show_fc_rport_port_id 0 32145 NULL ++pci_mmcfg_write_numachip_32147 pci_mmcfg_write_numachip 0 32147 NULL nohasharray ++set_activation_width_32147 set_activation_width 0-4 32147 &pci_mmcfg_write_numachip_32147 ++xfs_bmap_longest_free_extent_32148 xfs_bmap_longest_free_extent 0 32148 NULL ++sctp_outq_flush_rtx_32149 sctp_outq_flush_rtx 0 32149 NULL ++ecryptfs_getxattr_lower_32150 ecryptfs_getxattr_lower 0 32150 NULL ++bcmgenet_rx_refill_32157 bcmgenet_rx_refill 0 32157 NULL ++bind_32161 bind 0 32161 NULL ++i2c_smbus_write_byte_data_32162 i2c_smbus_write_byte_data 0 32162 NULL ++venus_link_32165 venus_link 5 32165 NULL ++s5p_jpeg_s_ctrl_32166 s5p_jpeg_s_ctrl 0 32166 NULL nohasharray ++channel_get_32166 channel_get 0 32166 &s5p_jpeg_s_ctrl_32166 ++ocfs2_direct_IO_32168 ocfs2_direct_IO 4-0 32168 NULL ++cifs_statfs_32170 cifs_statfs 0 32170 NULL ++get_beep_32172 get_beep 0 32172 NULL ++do_writepages_32173 do_writepages 0 32173 NULL nohasharray ++ntfs_rl_realloc_nofail_32173 ntfs_rl_realloc_nofail 3 32173 &do_writepages_32173 ++arch_prepare_kprobe_32174 arch_prepare_kprobe 0 32174 NULL ++ch_do_scsi_32178 ch_do_scsi 5 32178 NULL ++nfs_file_write_32183 nfs_file_write 0 32183 NULL ++ina209_show_alarm_32185 ina209_show_alarm 0 32185 NULL nohasharray ++_transport_get_enclosure_identifier_32185 _transport_get_enclosure_identifier 0 32185 &ina209_show_alarm_32185 ++validate_add_page_32189 validate_add_page 0 32189 NULL ++ubi_wl_scrub_peb_32196 ubi_wl_scrub_peb 0 32196 NULL ++del_ptr_32197 del_ptr 4 32197 NULL ++show_spi_transport_offset_32198 show_spi_transport_offset 0 32198 NULL ++wusb_ccm_mac_32199 wusb_ccm_mac 7 32199 NULL ++pcxhr_hardware_timer_32206 pcxhr_hardware_timer 0 32206 NULL ++affs_statfs_32208 affs_statfs 0 32208 NULL ++riva_get_cmap_len_32218 riva_get_cmap_len 0 32218 NULL ++sch_gpio_direction_out_32222 sch_gpio_direction_out 0 32222 NULL ++lower_callback_32223 lower_callback 0 32223 NULL ++set_in_max3_32224 set_in_max3 0-4 32224 NULL ++mic_get_smpt_ref_count_32226 mic_get_smpt_ref_count 0 32226 NULL ++open_patch_32229 open_patch 0 32229 NULL ++qlcnic_83xx_alloc_mbx_args_32233 qlcnic_83xx_alloc_mbx_args 0 32233 NULL ++cifs_lookup_cache_proc_write_32236 cifs_lookup_cache_proc_write 0-3 32236 NULL nohasharray ++lm3533_write_32236 lm3533_write 0 32236 &cifs_lookup_cache_proc_write_32236 ++ec_transaction_32239 ec_transaction 0 32239 NULL ++caif_seqpkt_recvmsg_32241 caif_seqpkt_recvmsg 0-4 32241 NULL ++lbs_lowrssi_read_32242 lbs_lowrssi_read 3-0 32242 NULL ++show_regs_in_max0_32247 show_regs_in_max0 0 32247 NULL ++efx_set_mac_address_32250 efx_set_mac_address 0 32250 NULL ++l2tp_ip6_connect_32252 l2tp_ip6_connect 0 32252 NULL ++cifs_super_get_key_32256 cifs_super_get_key 0 32256 NULL ++ext3_statfs_32257 ext3_statfs 0 32257 NULL ++ocfs2_xattr_find_entry_32260 ocfs2_xattr_find_entry 0 32260 NULL ++vxp_suspend_32262 vxp_suspend 0 32262 NULL ++dp_device_event_32266 dp_device_event 0 32266 NULL ++write_cam_control_32268 write_cam_control 0 32268 NULL ++pci_siig20x_init_32269 pci_siig20x_init 0 32269 NULL nohasharray ++natsemi_set_dspcfg_workaround_32269 natsemi_set_dspcfg_workaround 0-4 32269 &pci_siig20x_init_32269 ++store_in_max_32278 store_in_max 0-4 32278 NULL ++cgroup_write_notify_on_release_32281 cgroup_write_notify_on_release 0 32281 NULL ++runtime_resume_32282 runtime_resume 0 32282 NULL ++kernel_getpeername_32285 kernel_getpeername 0 32285 NULL ++show_control_32286 show_control 0 32286 NULL ++uart401_open_32288 uart401_open 0 32288 NULL ++l3_alloc_skb_32289 l3_alloc_skb 1 32289 NULL ++proc_sys_getattr_32297 proc_sys_getattr 0 32297 NULL ++sisusb_read_memio_long_32299 sisusb_read_memio_long 0 32299 NULL ++find_ci_32301 find_ci 0 32301 NULL ++lm3530_mode_set_32305 lm3530_mode_set 0-4 32305 NULL ++smbiosinstance_show_32307 smbiosinstance_show 0 32307 NULL ++vmalloc_user_32308 vmalloc_user 1 32308 NULL ++pm_async_show_32309 pm_async_show 0 32309 NULL ++si476x_cmd_tune_seek_freq_32310 si476x_cmd_tune_seek_freq 4-6 32310 NULL ++SyS_select_32319 SyS_select 1 32319 NULL ++wlcore_hw_init_vif_32322 wlcore_hw_init_vif 0 32322 NULL nohasharray ++write_undock_32322 write_undock 0-4 32322 &wlcore_hw_init_vif_32322 ++i40evf_setup_all_tx_resources_32325 i40evf_setup_all_tx_resources 0 32325 NULL ++store_pwm_enable_32327 store_pwm_enable 0-4 32327 NULL ++patch_stac9872_32328 patch_stac9872 0 32328 NULL ++nouveau_bar_create__32332 nouveau_bar_create_ 4 32332 NULL ++permissive_show_32335 permissive_show 0 32335 NULL nohasharray ++max_write_same_blocks_store_32335 max_write_same_blocks_store 0-4 32335 &permissive_show_32335 ++xfs_bmap_extsize_align_32338 xfs_bmap_extsize_align 0 32338 NULL ++parport_ieee1284_epp_write_addr_32339 parport_ieee1284_epp_write_addr 0 32339 NULL ++adummy_send_32340 adummy_send 0 32340 NULL nohasharray ++wl12xx_sdio_power_off_32340 wl12xx_sdio_power_off 0 32340 &adummy_send_32340 ++out_read_bytes_avail_show_32341 out_read_bytes_avail_show 0 32341 NULL ++t4_alloc_mem_32342 t4_alloc_mem 1 32342 NULL ++lpfc_num_discovered_ports_show_32346 lpfc_num_discovered_ports_show 0 32346 NULL ++__iscsi_tpg_auth_store_password_32349 __iscsi_tpg_auth_store_password 0-3 32349 NULL ++card_number_show_attr_32354 card_number_show_attr 0 32354 NULL ++show_sas_rphy_sas_address_32356 show_sas_rphy_sas_address 0 32356 NULL nohasharray ++chnl_net_open_32356 chnl_net_open 0 32356 &show_sas_rphy_sas_address_32356 ++dispatch_ioctl_32357 dispatch_ioctl 2 32357 NULL nohasharray ++rx_streaming_always_write_32357 rx_streaming_always_write 3-0 32357 &dispatch_ioctl_32357 ++ca0132_build_controls_32359 ca0132_build_controls 0 32359 NULL ++sel_read_initcon_32362 sel_read_initcon 3-0 32362 NULL nohasharray ++ReadHDLCPCI_32362 ReadHDLCPCI 0 32362 &sel_read_initcon_32362 ++hashtab_insert_32364 hashtab_insert 0 32364 NULL nohasharray ++inet_create_32364 inet_create 0 32364 &hashtab_insert_32364 ++dummy_systimer_prepare_32365 dummy_systimer_prepare 0 32365 NULL nohasharray ++event_file_read_32365 event_file_read 0-3 32365 &dummy_systimer_prepare_32365 ++igb_set_mac_32366 igb_set_mac 0 32366 NULL ++_drbd_bm_find_next_32372 _drbd_bm_find_next 2 32372 NULL nohasharray ++send_mpa_reply_32372 send_mpa_reply 3 32372 &_drbd_bm_find_next_32372 ++ubi_check_volume_32373 ubi_check_volume 0 32373 NULL ++klsi_105_get_line_state_32376 klsi_105_get_line_state 0 32376 NULL ++ds1343_nvram_read_32377 ds1343_nvram_read 0-5-6 32377 NULL nohasharray ++usbtmc_read_32377 usbtmc_read 0-3 32377 &ds1343_nvram_read_32377 ++root_port_show_32379 root_port_show 0 32379 NULL ++rtl8821ae_download_fw_32380 rtl8821ae_download_fw 0 32380 NULL ++show_sys_wmi_32385 show_sys_wmi 0 32385 NULL ++ipvlan_addr6_event_32387 ipvlan_addr6_event 0 32387 NULL ++x75create_32394 x75create 0 32394 NULL ++xfs_da3_node_toosmall_32396 xfs_da3_node_toosmall 0 32396 NULL ++runtime_suspend_32397 runtime_suspend 0 32397 NULL ++qla4_82xx_pci_mem_write_2M_32398 qla4_82xx_pci_mem_write_2M 2 32398 NULL nohasharray ++ll_setxattr_common_32398 ll_setxattr_common 4 32398 &qla4_82xx_pci_mem_write_2M_32398 ++xfs_iext_add_indirect_multi_32400 xfs_iext_add_indirect_multi 3 32400 NULL ++usecs_to_dev_32404 usecs_to_dev 0 32404 NULL nohasharray ++lpfc_info_show_32404 lpfc_info_show 0 32404 &usecs_to_dev_32404 nohasharray ++lbs_host_sleep_cfg_32404 lbs_host_sleep_cfg 0 32404 &lpfc_info_show_32404 ++vmci_qp_alloc_32405 vmci_qp_alloc 3-5 32405 NULL nohasharray ++ad7266_preenable_32405 ad7266_preenable 0 32405 &vmci_qp_alloc_32405 ++dm1105_i2c_xfer_32406 dm1105_i2c_xfer 0-3 32406 NULL ++fc2580_rd_regs_32407 fc2580_rd_regs 0 32407 NULL ++kovaplus_sysfs_show_actual_profile_32412 kovaplus_sysfs_show_actual_profile 0 32412 NULL nohasharray ++store_shost_eh_deadline_32412 store_shost_eh_deadline 0-4 32412 &kovaplus_sysfs_show_actual_profile_32412 ++lpfc_programtype_show_32416 lpfc_programtype_show 0 32416 NULL ++start_reshape_32423 start_reshape 0 32423 NULL nohasharray ++xadc_update_scan_mode_32423 xadc_update_scan_mode 0 32423 &start_reshape_32423 ++SyS_send_32424 SyS_send 3 32424 NULL ++at86rf230_set_frame_retries_32429 at86rf230_set_frame_retries 0 32429 NULL ++blk_mq_hw_sysfs_rq_list_show_32433 blk_mq_hw_sysfs_rq_list_show 0 32433 NULL ++ocfs2_active_cluster_plugin_show_32436 ocfs2_active_cluster_plugin_show 0 32436 NULL ++xfs_alloc_put_freelist_32437 xfs_alloc_put_freelist 0 32437 NULL ++bcm7xxx_28nm_b0_afe_config_init_32439 bcm7xxx_28nm_b0_afe_config_init 0 32439 NULL nohasharray ++break_ksm_32439 break_ksm 0 32439 &bcm7xxx_28nm_b0_afe_config_init_32439 ++fore200e_pca_proc_read_32440 fore200e_pca_proc_read 0 32440 NULL nohasharray ++cfq_set_leaf_weight_32440 cfq_set_leaf_weight 0 32440 &fore200e_pca_proc_read_32440 ++show_in16_32441 show_in16 0 32441 NULL ++axnet_resume_32442 axnet_resume 0 32442 NULL ++cx25840_s_ctrl_32444 cx25840_s_ctrl 0 32444 NULL ++hpfs_symlink_readpage_32450 hpfs_symlink_readpage 0 32450 NULL ++set_status_32456 set_status 0 32456 NULL ++wm8350_block_read_32458 wm8350_block_read 0 32458 NULL nohasharray ++__ext4_handle_dirty_super_32458 __ext4_handle_dirty_super 0 32458 &wm8350_block_read_32458 nohasharray ++hid_input_report_32458 hid_input_report 4 32458 &__ext4_handle_dirty_super_32458 ++ext4_file_write_iter_32461 ext4_file_write_iter 0 32461 NULL ++cache_status_32462 cache_status 5 32462 NULL ++show_fanin_32463 show_fanin 0 32463 NULL ++fill_readbuf_32464 fill_readbuf 3-0 32464 NULL nohasharray ++w5300_open_32464 w5300_open 0 32464 &fill_readbuf_32464 ++show_session_param_ISCSI_PARAM_BIDI_CHAP_EN_32465 show_session_param_ISCSI_PARAM_BIDI_CHAP_EN 0 32465 NULL nohasharray ++ieee80211_fill_mesh_addresses_32465 ieee80211_fill_mesh_addresses 0 32465 &show_session_param_ISCSI_PARAM_BIDI_CHAP_EN_32465 ++ina209_show_value_32470 ina209_show_value 0 32470 NULL ++dlm_callback_start_32473 dlm_callback_start 0 32473 NULL ++piix4_access_32474 piix4_access 0 32474 NULL ++ore_io_execute_32479 ore_io_execute 0 32479 NULL ++copy_result_to_user_32486 copy_result_to_user 0 32486 NULL ++kovaplus_sysfs_show_firmware_version_32487 kovaplus_sysfs_show_firmware_version 0 32487 NULL ++temp0_show_32489 temp0_show 0 32489 NULL ++cs42l52_beep_set_32491 cs42l52_beep_set 0-4 32491 NULL ++ide_driver_proc_write_32493 ide_driver_proc_write 3-0 32493 NULL ++snd_emu10k1_fx8010_playback_prepare_32494 snd_emu10k1_fx8010_playback_prepare 0 32494 NULL ++sh_eth_vlan_rx_add_vid_32495 sh_eth_vlan_rx_add_vid 0 32495 NULL ++fuse_setxattr_32496 fuse_setxattr 0 32496 NULL ++lp3943_gpio_direction_input_32499 lp3943_gpio_direction_input 0 32499 NULL ++initialize_32504 initialize 0 32504 NULL ++fwnet_open_32505 fwnet_open 0 32505 NULL ++adv7170_g_fmt_32507 adv7170_g_fmt 0 32507 NULL ++wiimote_cmd_read_32510 wiimote_cmd_read 0 32510 NULL nohasharray ++adt7411_read_10_bit_32510 adt7411_read_10_bit 0-4 32510 &wiimote_cmd_read_32510 nohasharray ++mdc_pinger_recov_seq_write_32510 mdc_pinger_recov_seq_write 3 32510 &adt7411_read_10_bit_32510 ++sysfs_set_reg_32512 sysfs_set_reg 0-4 32512 NULL ++ctrl_std_val_to_sym_32516 ctrl_std_val_to_sym 5 32516 NULL ++hot_reset_store_32518 hot_reset_store 0-4 32518 NULL ++disconnect_32521 disconnect 4 32521 NULL ++qsfp_read_32522 qsfp_read 0-2-4 32522 NULL ++ip_map_parse_32523 ip_map_parse 0 32523 NULL ++be2iscsi_iface_get_param_32527 be2iscsi_iface_get_param 0 32527 NULL ++ilo_read_32531 ilo_read 3-0 32531 NULL ++ieee80211_if_read_estab_plinks_32533 ieee80211_if_read_estab_plinks 3-0 32533 NULL ++da9055_rtc_read_time_32534 da9055_rtc_read_time 0 32534 NULL ++hwrng_attr_current_show_32536 hwrng_attr_current_show 0 32536 NULL ++snd_register_device_32537 snd_register_device 0 32537 NULL ++lb_port_stats_init_32541 lb_port_stats_init 0 32541 NULL ++cciss_scsi_write_info_32542 cciss_scsi_write_info 0-3 32542 NULL ++ieee80211_send_auth_32543 ieee80211_send_auth 6 32543 NULL ++regmap_spmi_base_read_32544 regmap_spmi_base_read 0 32544 NULL ++radeon_get_pm_profile_32545 radeon_get_pm_profile 0 32545 NULL ++format_devstat_counter_32550 format_devstat_counter 3-0 32550 NULL ++iscsi_tpg_attrib_store_default_erl_32551 iscsi_tpg_attrib_store_default_erl 0-3 32551 NULL ++show_fcstat_fcp_packet_alloc_failures_32552 show_fcstat_fcp_packet_alloc_failures 0 32552 NULL nohasharray ++resume_show_32552 resume_show 0 32552 &show_fcstat_fcp_packet_alloc_failures_32552 ++device_change_notifier_32558 device_change_notifier 0 32558 NULL nohasharray ++__first_node_32558 __first_node 0 32558 &device_change_notifier_32558 ++bitmap_store_32559 bitmap_store 0-3 32559 NULL ++ipgre_header_32561 ipgre_header 0 32561 NULL nohasharray ++alloc_dma_desc_resources_32561 alloc_dma_desc_resources 0 32561 &ipgre_header_32561 ++aes_encrypt_fail_read_32562 aes_encrypt_fail_read 3-0 32562 NULL ++loop_attr_backing_file_show_32564 loop_attr_backing_file_show 0 32564 NULL ++async_memcpy_32565 async_memcpy 4-3 32565 NULL nohasharray ++osc_iocontrol_32565 osc_iocontrol 3 32565 &async_memcpy_32565 ++smi_data_write_32567 smi_data_write 0-6-5 32567 NULL ++nilfs_segments_segments_number_show_32568 nilfs_segments_segments_number_show 0 32568 NULL ++listen_32570 listen 0 32570 NULL ++__vlan_add_32575 __vlan_add 0 32575 NULL ++pnp_mem_len_32584 pnp_mem_len 0 32584 NULL nohasharray ++wl12xx_update_sta_state_32584 wl12xx_update_sta_state 0 32584 &pnp_mem_len_32584 ++mem_swapout_entry_32586 mem_swapout_entry 3-0 32586 NULL nohasharray ++jid_show_32586 jid_show 0 32586 &mem_swapout_entry_32586 ++pipeline_tcp_tx_stat_fifo_int_read_32589 pipeline_tcp_tx_stat_fifo_int_read 3-0 32589 NULL ++ath10k_mac_set_rts_32591 ath10k_mac_set_rts 0 32591 NULL nohasharray ++bnx2x_exe_queue_add_32591 bnx2x_exe_queue_add 0 32591 &ath10k_mac_set_rts_32591 ++print_cpus_kernel_max_32592 print_cpus_kernel_max 0 32592 NULL ++erst_exec_subtract_value_32594 erst_exec_subtract_value 0 32594 NULL ++read_file_beacon_32595 read_file_beacon 3-0 32595 NULL ++nilfs_dat_prepare_alloc_32598 nilfs_dat_prepare_alloc 0 32598 NULL ++show_fcoe_fcf_device_mac_32601 show_fcoe_fcf_device_mac 0 32601 NULL ++ieee80211_if_read_dropped_frames_congestion_32603 ieee80211_if_read_dropped_frames_congestion 3-0 32603 NULL ++toshiba_kbd_bl_timeout_show_32606 toshiba_kbd_bl_timeout_show 0 32606 NULL ++sys_set_mempolicy_32608 sys_set_mempolicy 3 32608 NULL nohasharray ++status_control_read_32608 status_control_read 0-5-6 32608 &sys_set_mempolicy_32608 nohasharray ++vbi_out_buf_prepare_32608 vbi_out_buf_prepare 0 32608 &status_control_read_32608 nohasharray ++dma_alloc_pages_32608 dma_alloc_pages 3 32608 &vbi_out_buf_prepare_32608 ++replace_page_cache_page_32613 replace_page_cache_page 0 32613 NULL nohasharray ++read_32613 read 0 32613 &replace_page_cache_page_32613 ++show_spi_transport_rti_32617 show_spi_transport_rti 0 32617 NULL ++smsc75xx_ethtool_get_eeprom_len_32621 smsc75xx_ethtool_get_eeprom_len 0 32621 NULL ++lx_pipe_start_32625 lx_pipe_start 0 32625 NULL ++cifs_writepage_32626 cifs_writepage 0 32626 NULL ++irda_recvmsg_dgram_32631 irda_recvmsg_dgram 0-4 32631 NULL ++cfg80211_roamed_32632 cfg80211_roamed 7-5 32632 NULL ++po1030_set_auto_white_balance_32633 po1030_set_auto_white_balance 0 32633 NULL ++vpivci_to_channel_32635 vpivci_to_channel 0 32635 NULL ++ieee80211_hdrlen_32637 ieee80211_hdrlen 0 32637 NULL ++nilfs_cpfile_get_checkpoint_32639 nilfs_cpfile_get_checkpoint 0 32639 NULL nohasharray ++phonet_device_notify_32639 phonet_device_notify 0 32639 &nilfs_cpfile_get_checkpoint_32639 ++show_abi_version_32641 show_abi_version 0 32641 NULL ++ite_decode_bytes_32642 ite_decode_bytes 3 32642 NULL ++rtl8187_cmd_reset_32643 rtl8187_cmd_reset 0 32643 NULL ++xpcs_reg_value_read_32644 xpcs_reg_value_read 3 32644 NULL ++kvmalloc_32646 kvmalloc 1 32646 NULL ++cxacru_sysfs_show_upstream_bits_per_frame_32651 cxacru_sysfs_show_upstream_bits_per_frame 0 32651 NULL ++generic_readlink_32654 generic_readlink 3-0 32654 NULL ++snd_seq_device_dev_register_32666 snd_seq_device_dev_register 0 32666 NULL ++get_unaligned_be24_32667 get_unaligned_be24 0 32667 NULL ++vbi_cap_start_streaming_32668 vbi_cap_start_streaming 0 32668 NULL ++move_addr_to_kernel_32673 move_addr_to_kernel 2-0 32673 NULL ++cpuup_prepare_32674 cpuup_prepare 0 32674 NULL ++__exofs_wait_obj_created_32678 __exofs_wait_obj_created 0 32678 NULL ++compat_SyS_preadv_32679 compat_SyS_preadv 3 32679 NULL ++mxl111sf_tuner_write_reg_32683 mxl111sf_tuner_write_reg 0 32683 NULL nohasharray ++lp_read_32683 lp_read 0-3 32683 &mxl111sf_tuner_write_reg_32683 ++via_lock_rate_32684 via_lock_rate 0 32684 NULL ++family_show_32685 family_show 0 32685 NULL ++tps80031_set_bits_32686 tps80031_set_bits 0 32686 NULL ++blkdev_writepage_32693 blkdev_writepage 0 32693 NULL ++si4713_i2c_write_32696 si4713_i2c_write 0 32696 NULL ++bnad_vlan_rx_add_vid_32699 bnad_vlan_rx_add_vid 0 32699 NULL ++si3054_init_32700 si3054_init 0 32700 NULL ++jfs_readpages_32702 jfs_readpages 4 32702 NULL nohasharray ++evdev_write_32702 evdev_write 0-3 32702 &jfs_readpages_32702 ++security_get_32703 security_get 0 32703 NULL nohasharray ++cgroup_migrate_32703 cgroup_migrate 0 32703 &security_get_32703 ++check_bdq_32704 check_bdq 0 32704 NULL ++xfs_filestream_new_ag_32711 xfs_filestream_new_ag 0 32711 NULL ++rt2x00debug_read_queue_dump_32712 rt2x00debug_read_queue_dump 3-0 32712 NULL ++stv06xx_write_sensor_words_32713 stv06xx_write_sensor_words 0 32713 NULL nohasharray ++xfs_bmbt_update_32713 xfs_bmbt_update 0 32713 &stv06xx_write_sensor_words_32713 nohasharray ++acpi_processor_suspend_32713 acpi_processor_suspend 0 32713 &xfs_bmbt_update_32713 ++_xfs_buf_get_pages_32715 _xfs_buf_get_pages 2 32715 NULL nohasharray ++vmxnet3_rq_init_32715 vmxnet3_rq_init 0 32715 &_xfs_buf_get_pages_32715 ++usb_ma901radio_s_ctrl_32718 usb_ma901radio_s_ctrl 0 32718 NULL ++show_conn_param_ISCSI_PARAM_EXP_STATSN_32720 show_conn_param_ISCSI_PARAM_EXP_STATSN 0 32720 NULL ++rpm_resume_32734 rpm_resume 0 32734 NULL ++ncp_make_open_32735 ncp_make_open 0 32735 NULL ++ping_get_port_32738 ping_get_port 0 32738 NULL nohasharray ++team_netpoll_setup_32738 team_netpoll_setup 0 32738 &ping_get_port_32738 ++e1000_alloc_ring_dma_32741 e1000_alloc_ring_dma 0 32741 NULL ++i40e_pci_sriov_enable_32742 i40e_pci_sriov_enable 2-0 32742 NULL ++mcp251x_set_normal_mode_32743 mcp251x_set_normal_mode 0 32743 NULL nohasharray ++slc_open_32743 slc_open 0 32743 &mcp251x_set_normal_mode_32743 ++stats_read_ul_32751 stats_read_ul 3-0 32751 NULL ++stv06xx_isoc_nego_32752 stv06xx_isoc_nego 0 32752 NULL ++every_nth_show_32754 every_nth_show 0 32754 NULL ++__uncore_thr_show_32756 __uncore_thr_show 0 32756 NULL ++tg_set_cfs_bandwidth_32757 tg_set_cfs_bandwidth 0 32757 NULL ++__bt_get_word_32770 __bt_get_word 2 32770 NULL ++vmci_transport_dgram_dequeue_32775 vmci_transport_dgram_dequeue 0-4 32775 NULL ++qt2_write_32776 qt2_write 0-4 32776 NULL ++target_stat_scsi_dev_attr_store_32778 target_stat_scsi_dev_attr_store 0 32778 NULL ++pcxhr_get_clock_reg_32779 pcxhr_get_clock_reg 0 32779 NULL nohasharray ++wl1251_cmd_configure_32779 wl1251_cmd_configure 0 32779 &pcxhr_get_clock_reg_32779 ++show_state_field_32780 show_state_field 0 32780 NULL ++rt2800usb_set_device_state_32783 rt2800usb_set_device_state 0 32783 NULL ++sctp_tsnmap_grow_32784 sctp_tsnmap_grow 2 32784 NULL nohasharray ++vbi_cap_buf_prepare_32784 vbi_cap_buf_prepare 0 32784 &sctp_tsnmap_grow_32784 ++ebt_out_hook_32788 ebt_out_hook 0 32788 NULL ++qla2x00_diag_megabytes_show_32789 qla2x00_diag_megabytes_show 0 32789 NULL ++ocfs2_read_inode_block_full_32790 ocfs2_read_inode_block_full 0 32790 NULL nohasharray ++show_tcpPassiveOpens_32790 show_tcpPassiveOpens 0 32790 &ocfs2_read_inode_block_full_32790 nohasharray ++p54_get_stats_32790 p54_get_stats 0 32790 &show_tcpPassiveOpens_32790 ++iscsi_disc_show_password_mutual_32793 iscsi_disc_show_password_mutual 0 32793 NULL ++xfs_trans_read_buf_32795 xfs_trans_read_buf 0 32795 NULL ++mv88e6xxx_reg_write_32803 mv88e6xxx_reg_write 0 32803 NULL ++ath5k_hw_reset_32804 ath5k_hw_reset 0 32804 NULL ++rproc_name_read_32805 rproc_name_read 3-0 32805 NULL ++get_register_page_interruptible_32809 get_register_page_interruptible 5-0 32809 NULL nohasharray ++target_core_alua_tg_pt_gp_store_attr_nonop_delay_msecs_32809 target_core_alua_tg_pt_gp_store_attr_nonop_delay_msecs 0-3 32809 &get_register_page_interruptible_32809 nohasharray ++b43legacy_attr_preamble_store_32809 b43legacy_attr_preamble_store 0-4 32809 &target_core_alua_tg_pt_gp_store_attr_nonop_delay_msecs_32809 ++copy_name_32811 copy_name 0-3 32811 NULL ++ieee80211_tdls_mgmt_32825 ieee80211_tdls_mgmt 10 32825 NULL ++mac802154_wpan_update_llsec_32831 mac802154_wpan_update_llsec 0 32831 NULL ++video_autosw_get_32836 video_autosw_get 0 32836 NULL ++stk17ta8_nvram_write_32843 stk17ta8_nvram_write 0-6-5 32843 NULL ++phy_set_clr_bits_32845 phy_set_clr_bits 0-3-4 32845 NULL ++vga_rseq_32848 vga_rseq 0 32848 NULL ++amd64_inject_write_store_32852 amd64_inject_write_store 0-4 32852 NULL ++hdpvr_s_ctrl_32855 hdpvr_s_ctrl 0 32855 NULL ++show_32860 show 0 32860 NULL ++sta_tx_latency_stat_read_32862 sta_tx_latency_stat_read 3-0 32862 NULL ++new_tape_buffer_32866 new_tape_buffer 2 32866 NULL ++io_apic_setup_irq_pin_32868 io_apic_setup_irq_pin 1 32868 NULL nohasharray ++__uncore_match_vnw_show_32868 __uncore_match_vnw_show 0 32868 &io_apic_setup_irq_pin_32868 ++mxl5007t_write_reg_32872 mxl5007t_write_reg 0 32872 NULL ++solo_osd_print_32873 solo_osd_print 0 32873 NULL ++sha1_final_32876 sha1_final 0 32876 NULL ++cifs_writedata_alloc_32880 cifs_writedata_alloc 1 32880 NULL nohasharray ++__tcp_splice_read_32880 __tcp_splice_read 0 32880 &cifs_writedata_alloc_32880 nohasharray ++ath6kl_usb_submit_ctrl_in_32880 ath6kl_usb_submit_ctrl_in 6 32880 &__tcp_splice_read_32880 ++wl12xx_cmd_config_fwlog_32882 wl12xx_cmd_config_fwlog 0 32882 NULL ++vp702x_usb_inout_cmd_32884 vp702x_usb_inout_cmd 4-6 32884 NULL nohasharray ++_convert_lock_32884 _convert_lock 0 32884 &vp702x_usb_inout_cmd_32884 ++ocfs2_iterate_xattr_index_block_32885 ocfs2_iterate_xattr_index_block 0 32885 NULL ++r820t_write_reg_32889 r820t_write_reg 0 32889 NULL ++msp_s_ctrl_32892 msp_s_ctrl 0 32892 NULL nohasharray ++ath6kl_usb_post_recv_transfers_32892 ath6kl_usb_post_recv_transfers 2 32892 &msp_s_ctrl_32892 ++visorchannel_dump_section_32893 visorchannel_dump_section 4 32893 NULL ++get_pwm1_auto_point_pwm_32898 get_pwm1_auto_point_pwm 0 32898 NULL ++ext4_get_group_number_32899 ext4_get_group_number 0-2 32899 NULL ++ath5k_hw_set_power_mode_32901 ath5k_hw_set_power_mode 0 32901 NULL ++bonding_show_carrier_32902 bonding_show_carrier 0 32902 NULL nohasharray ++tsl2550_show_power_state_32902 tsl2550_show_power_state 0 32902 &bonding_show_carrier_32902 ++arvo_sysfs_show_mode_key_32906 arvo_sysfs_show_mode_key 0 32906 NULL nohasharray ++lpss_reg_read_32906 lpss_reg_read 0 32906 &arvo_sysfs_show_mode_key_32906 ++write_policy_show_32908 write_policy_show 0 32908 NULL ++show_fan16_32912 show_fan16 0 32912 NULL ++il_dbgfs_tx_stats_read_32913 il_dbgfs_tx_stats_read 3-0 32913 NULL ++show_32916 show 0 32916 NULL ++mcp3422_show_samp_freqs_32924 mcp3422_show_samp_freqs 0 32924 NULL nohasharray ++hibernate_32924 hibernate 0 32924 &mcp3422_show_samp_freqs_32924 ++zlib_inflate_workspacesize_32927 zlib_inflate_workspacesize 0 32927 NULL ++xen_swiotlb_dma_mapping_error_32931 xen_swiotlb_dma_mapping_error 0 32931 NULL ++nfs_direct_IO_32932 nfs_direct_IO 0 32932 NULL ++hdmi_conf_apply_32934 hdmi_conf_apply 0 32934 NULL ++i40e_vsi_configure_rx_32937 i40e_vsi_configure_rx 0 32937 NULL ++add_dev_to_thread_32944 add_dev_to_thread 0 32944 NULL ++chip_mc_read_32945 chip_mc_read 0 32945 NULL ++store_temp_auto_boost_hyst_32950 store_temp_auto_boost_hyst 0-4 32950 NULL ++usbatm_atm_proc_read_32951 usbatm_atm_proc_read 0 32951 NULL nohasharray ++set_gpio_32951 set_gpio 0-4 32951 &usbatm_atm_proc_read_32951 ++mdiobus_write_32952 mdiobus_write 0 32952 NULL ++trusted_list_32953 trusted_list 0-5 32953 NULL ++target_core_dev_pr_show_attr_res_pr_holder_tg_port_32956 target_core_dev_pr_show_attr_res_pr_holder_tg_port 0 32956 NULL ++ext4_valid_block_bitmap_32958 ext4_valid_block_bitmap 3 32958 NULL ++xfs_log_reserve_32959 xfs_log_reserve 0 32959 NULL ++wl1251_acx_group_address_tbl_32961 wl1251_acx_group_address_tbl 0 32961 NULL ++afs_writeback_all_32967 afs_writeback_all 0 32967 NULL ++mwl8k_cmd_set_hw_spec_32968 mwl8k_cmd_set_hw_spec 0 32968 NULL ++sh_eth_dev_init_32971 sh_eth_dev_init 0 32971 NULL nohasharray ++ext4_group_overhead_blocks_32971 ext4_group_overhead_blocks 0 32971 &sh_eth_dev_init_32971 ++saa7706h_i2c_send_32979 saa7706h_i2c_send 3-0 32979 NULL ++pte_val_32981 pte_val 0 32981 NULL ++show_selfballooning_32982 show_selfballooning 0 32982 NULL ++show_fnode_header_digest_32983 show_fnode_header_digest 0 32983 NULL ++kvaser_usb_set_opt_mode_32990 kvaser_usb_set_opt_mode 0 32990 NULL ++iwl_mvm_phy_ctxt_apply_33000 iwl_mvm_phy_ctxt_apply 0 33000 NULL nohasharray ++netdev_change_mtu_33000 netdev_change_mtu 0 33000 &iwl_mvm_phy_ctxt_apply_33000 ++fm_v4l2_fops_read_33006 fm_v4l2_fops_read 0-3 33006 NULL ++ext3_alloc_blocks_33007 ext3_alloc_blocks 3-0 33007 NULL nohasharray ++SyS_syslog_33007 SyS_syslog 3 33007 &ext3_alloc_blocks_33007 ++iwl_mvm_power_update_mac_33008 iwl_mvm_power_update_mac 0 33008 NULL ++rt_mutex_slowtrylock_33011 rt_mutex_slowtrylock 0 33011 NULL ++br_multicast_set_hash_max_33012 br_multicast_set_hash_max 2 33012 NULL ++xfs_attr3_leaf_setflag_33014 xfs_attr3_leaf_setflag 0 33014 NULL ++efivar_attr_store_33016 efivar_attr_store 0-4 33016 NULL nohasharray ++snd_hda_parse_hdmi_codec_33016 snd_hda_parse_hdmi_codec 0 33016 &efivar_attr_store_33016 ++dibx000_i2c_master_xfer_gpio12_33018 dibx000_i2c_master_xfer_gpio12 0-3 33018 NULL ++write_file_bt_ant_diversity_33019 write_file_bt_ant_diversity 3-0 33019 NULL ++af9005_write_register_bits_33021 af9005_write_register_bits 0 33021 NULL ++st_magn_buffer_postenable_33025 st_magn_buffer_postenable 0 33025 NULL ++dapm_widget_show_33027 dapm_widget_show 0 33027 NULL ++show_current_governor_33033 show_current_governor 0 33033 NULL ++make_reservation_33038 make_reservation 0 33038 NULL ++ata_scsi_em_message_store_33040 ata_scsi_em_message_store 0-4 33040 NULL ++ov7670_s_hflip_33044 ov7670_s_hflip 0 33044 NULL ++show_ch_count_33045 show_ch_count 0 33045 NULL ++show_sgid_33048 show_sgid 0 33048 NULL ++SYSC_lgetxattr_33049 SYSC_lgetxattr 4 33049 NULL ++pipeline_dec_packet_in_fifo_full_read_33052 pipeline_dec_packet_in_fifo_full_read 3-0 33052 NULL ++ebt_compat_match_offset_33053 ebt_compat_match_offset 0-2 33053 NULL ++bitmap_resize_33054 bitmap_resize 2-0 33054 NULL nohasharray ++nfs_readpage_33054 nfs_readpage 0 33054 &bitmap_resize_33054 ++show_sas_phy_maximum_linkrate_hw_33056 show_sas_phy_maximum_linkrate_hw 0 33056 NULL nohasharray ++qlcnic_send_cmd_descs_33056 qlcnic_send_cmd_descs 0 33056 &show_sas_phy_maximum_linkrate_hw_33056 ++cifs_getattr_33057 cifs_getattr 0 33057 NULL ++target_stat_scsi_lu_show_attr_read_mbytes_33059 target_stat_scsi_lu_show_attr_read_mbytes 0 33059 NULL nohasharray ++intel_ring_flush_all_caches_33059 intel_ring_flush_all_caches 0 33059 &target_stat_scsi_lu_show_attr_read_mbytes_33059 ++stats_dot11RTSSuccessCount_read_33065 stats_dot11RTSSuccessCount_read 3-0 33065 NULL ++sel_read_checkreqprot_33068 sel_read_checkreqprot 3-0 33068 NULL ++vbi_buffer_prepare_33070 vbi_buffer_prepare 0 33070 NULL ++gfs2_write_end_33073 gfs2_write_end 0-5 33073 NULL ++target_stat_scsi_dev_show_attr_role_33074 target_stat_scsi_dev_show_attr_role 0 33074 NULL nohasharray ++ff_write_ee_33074 ff_write_ee 0-2-4 33074 &target_stat_scsi_dev_show_attr_role_33074 ++__key_instantiate_and_link_33075 __key_instantiate_and_link 0 33075 NULL ++tomoyo_write_33076 tomoyo_write 0-3 33076 NULL ++dsa_slave_set_mac_address_33080 dsa_slave_set_mac_address 0 33080 NULL ++i8xx_pipe_crc_ctl_reg_33082 i8xx_pipe_crc_ctl_reg 0 33082 NULL ++acl_permission_check_33083 acl_permission_check 0 33083 NULL nohasharray ++si476x_radio_s_ctrl_33083 si476x_radio_s_ctrl 0 33083 &acl_permission_check_33083 ++os_desc_b_vendor_code_show_33087 os_desc_b_vendor_code_show 0 33087 NULL ++fcoe_cpu_callback_33094 fcoe_cpu_callback 0 33094 NULL ++snd_cx88_prepare_33099 snd_cx88_prepare 0 33099 NULL ++drv_attr_store_33101 drv_attr_store 0-4 33101 NULL ++vnic_dev_cmd_no_proxy_33109 vnic_dev_cmd_no_proxy 0 33109 NULL ++iscsi_tpg_param_store_MaxOutstandingR2T_33111 iscsi_tpg_param_store_MaxOutstandingR2T 0-3 33111 NULL ++isofs_hashi_33112 isofs_hashi 0 33112 NULL nohasharray ++dump_cr_33112 dump_cr 0 33112 &isofs_hashi_33112 nohasharray ++metadata_store_33112 metadata_store 0-3 33112 &dump_cr_33112 nohasharray ++ieee80211_fragment_33112 ieee80211_fragment 4 33112 &metadata_store_33112 ++nf_nat_ipv4_local_fn_33119 nf_nat_ipv4_local_fn 0 33119 NULL nohasharray ++set_beep_33119 set_beep 0-4 33119 &nf_nat_ipv4_local_fn_33119 ++write_node_33121 write_node 4-0 33121 NULL ++virtual_gb_store_33126 virtual_gb_store 0-3 33126 NULL ++fb_sys_write_33130 fb_sys_write 3 33130 NULL nohasharray ++cxgb4_inet6addr_handler_33130 cxgb4_inet6addr_handler 0 33130 &fb_sys_write_33130 ++sas_change_queue_depth_33131 sas_change_queue_depth 0-2 33131 NULL ++show_fcoe_ctlr_device_err_block_33135 show_fcoe_ctlr_device_err_block 0 33135 NULL nohasharray ++asm_rev_show_33135 asm_rev_show 0 33135 &show_fcoe_ctlr_device_err_block_33135 nohasharray ++i40e_vsi_add_vlan_33135 i40e_vsi_add_vlan 0 33135 &asm_rev_show_33135 ++iwl_mvm_mac_ctx_send_33141 iwl_mvm_mac_ctx_send 0 33141 NULL ++backlog_show_33143 backlog_show 0 33143 NULL nohasharray ++notify_change_33143 notify_change 0 33143 &backlog_show_33143 ++SyS_poll_33152 SyS_poll 2 33152 NULL ++_pci_add_cap_save_buffer_33153 _pci_add_cap_save_buffer 4 33153 NULL ++ubifs_gc_start_commit_33160 ubifs_gc_start_commit 0 33160 NULL ++regmap_spmi_ext_write_33161 regmap_spmi_ext_write 0 33161 NULL ++async_gen_syndrome_33162 async_gen_syndrome 2 33162 NULL ++wl1271_sta_hw_init_33163 wl1271_sta_hw_init 0 33163 NULL ++__erst_clear_from_storage_33167 __erst_clear_from_storage 0 33167 NULL ++debug_debug6_read_33168 debug_debug6_read 3-0 33168 NULL ++acpi_ex_access_region_33170 acpi_ex_access_region 0 33170 NULL ++da9052_bat_check_health_33171 da9052_bat_check_health 0 33171 NULL ++show_otp2_33172 show_otp2 0 33172 NULL ++begin_33173 begin 0 33173 NULL ++bq2415x_i2c_write_33181 bq2415x_i2c_write 0 33181 NULL ++store_fc_private_host_tgtid_bind_type_33187 store_fc_private_host_tgtid_bind_type 0-4 33187 NULL ++hfsplus_security_listxattr_33189 hfsplus_security_listxattr 0-5 33189 NULL nohasharray ++il3945_dump_error_log_33189 il3945_dump_error_log 0-4 33189 &hfsplus_security_listxattr_33189 ++rtl_usb_start_33190 rtl_usb_start 0 33190 NULL nohasharray ++iwl_mvm_mac_ctxt_add_33190 iwl_mvm_mac_ctxt_add 0 33190 &rtl_usb_start_33190 ++flash_store_33203 flash_store 0-4 33203 NULL ++dataflash_read_fact_otp_33204 dataflash_read_fact_otp 3-2 33204 NULL nohasharray ++r820t_write_reg_mask_33204 r820t_write_reg_mask 0 33204 &dataflash_read_fact_otp_33204 ++pp_read_33210 pp_read 3-0 33210 NULL nohasharray ++xen_allocate_irqs_dynamic_33210 xen_allocate_irqs_dynamic 1 33210 &pp_read_33210 nohasharray ++ax_open_33210 ax_open 0 33210 &xen_allocate_irqs_dynamic_33210 ++reqbufs_capture_33214 reqbufs_capture 0 33214 NULL ++rt2x00queue_alloc_rxskbs_33217 rt2x00queue_alloc_rxskbs 0 33217 NULL nohasharray ++mwl8k_send_fw_load_cmd_33217 mwl8k_send_fw_load_cmd 0 33217 &rt2x00queue_alloc_rxskbs_33217 ++atm_pcr_check_33218 atm_pcr_check 0 33218 NULL ++fops_write_33219 fops_write 0-3 33219 NULL ++iommu_group_attr_store_33221 iommu_group_attr_store 0-4 33221 NULL ++ovl_setattr_33227 ovl_setattr 0 33227 NULL nohasharray ++store_flag_33227 store_flag 0 33227 &ovl_setattr_33227 ++lp55xx_store_engine_run_33230 lp55xx_store_engine_run 0-4 33230 NULL ++netlbl_unlhsh_remove_addr4_33231 netlbl_unlhsh_remove_addr4 0 33231 NULL ++store_rps_dev_flow_table_cnt_33235 store_rps_dev_flow_table_cnt 0-4 33235 NULL ++pm8001_task_prep_ssp_33237 pm8001_task_prep_ssp 0 33237 NULL ++snd_seq_ioctl_get_subscription_33238 snd_seq_ioctl_get_subscription 0 33238 NULL ++__vb2_wait_for_done_vb_33246 __vb2_wait_for_done_vb 0 33246 NULL ++x1205_rtc_set_alarm_33247 x1205_rtc_set_alarm 0 33247 NULL ++sbp2_sysfs_ieee1394_id_show_33248 sbp2_sysfs_ieee1394_id_show 0 33248 NULL ++auto_abort_show_33251 auto_abort_show 0 33251 NULL ++vt_notifier_call_33259 vt_notifier_call 0 33259 NULL ++mwl8k_cmd_tx_power_33260 mwl8k_cmd_tx_power 0 33260 NULL ++usbtv_set_regs_33265 usbtv_set_regs 0 33265 NULL ++snd_pcm_plug_client_size_33267 snd_pcm_plug_client_size 0-2 33267 NULL nohasharray ++modes_show_33267 modes_show 0 33267 &snd_pcm_plug_client_size_33267 nohasharray ++latency_timer_store_33267 latency_timer_store 0-4 33267 &modes_show_33267 ++ipgre_open_33270 ipgre_open 0 33270 NULL ++cachefiles_cook_key_33274 cachefiles_cook_key 2 33274 NULL ++sctp_primitive_REQUESTHEARTBEAT_33276 sctp_primitive_REQUESTHEARTBEAT 0 33276 NULL nohasharray ++ipath_dma_map_page_33276 ipath_dma_map_page 0-3 33276 &sctp_primitive_REQUESTHEARTBEAT_33276 ++security_genfs_sid_33277 security_genfs_sid 0 33277 NULL ++qlcnic_vlan_rx_add_33279 qlcnic_vlan_rx_add 0 33279 NULL ++gadget_strings_product_show_33281 gadget_strings_product_show 0 33281 NULL ++bnx2i_set_sq_info_33282 bnx2i_set_sq_info 0-4 33282 NULL nohasharray ++sync_pt_create_33282 sync_pt_create 2 33282 &bnx2i_set_sq_info_33282 ++sg_new_write_33283 sg_new_write 0-4 33283 NULL ++hotkey_source_mask_store_33288 hotkey_source_mask_store 0-4 33288 NULL ++bin_search_33289 bin_search 0 33289 NULL ++tps80031_reg_enable_33293 tps80031_reg_enable 0 33293 NULL ++xfs_attr_leaf_addname_33299 xfs_attr_leaf_addname 0 33299 NULL ++dw_wdt_write_33300 dw_wdt_write 0-3 33300 NULL ++wlcore_validate_fw_ver_33302 wlcore_validate_fw_ver 0 33302 NULL ++mcs7830_get_reg_33308 mcs7830_get_reg 3 33308 NULL ++isku_sysfs_read_keys_easyzone_33318 isku_sysfs_read_keys_easyzone 6-0-5 33318 NULL ++show_pwm_auto_point_fan_33320 show_pwm_auto_point_fan 0 33320 NULL nohasharray ++set_attr_mode_msb_33320 set_attr_mode_msb 0-4 33320 &show_pwm_auto_point_fan_33320 ++usb_dev_prepare_33322 usb_dev_prepare 0 33322 NULL ++ath6kl_usb_ctrl_msg_exchange_33327 ath6kl_usb_ctrl_msg_exchange 4 33327 NULL ++vx_send_irq_dsp_33329 vx_send_irq_dsp 0 33329 NULL nohasharray ++vfio_pci_bar_rw_33329 vfio_pci_bar_rw 3-0 33329 &vx_send_irq_dsp_33329 ++sas_get_linkerrors_33331 sas_get_linkerrors 0 33331 NULL ++bma180_data_rdy_trigger_set_state_33332 bma180_data_rdy_trigger_set_state 0 33332 NULL ++bdc_run_33333 bdc_run 0 33333 NULL ++gsm_mux_rx_netchar_33336 gsm_mux_rx_netchar 3 33336 NULL ++show_fc_host_model_33339 show_fc_host_model 0 33339 NULL ++joydev_ioctl_33343 joydev_ioctl 2 33343 NULL ++smk_ipv6_port_check_33347 smk_ipv6_port_check 0 33347 NULL ++cpulist_parse_33350 cpulist_parse 0 33350 NULL ++lov_stripesize_seq_write_33353 lov_stripesize_seq_write 3 33353 NULL ++i2o_exec_probe_33354 i2o_exec_probe 0 33354 NULL ++create_xattr_datum_33356 create_xattr_datum 5 33356 NULL nohasharray ++irq_pkt_threshold_read_33356 irq_pkt_threshold_read 3-0 33356 &create_xattr_datum_33356 ++ath10k_pci_wake_wait_33360 ath10k_pci_wake_wait 0 33360 NULL ++ksm_memory_callback_33363 ksm_memory_callback 0 33363 NULL ++read_file_regidx_33370 read_file_regidx 3-0 33370 NULL nohasharray ++sl2vl_attr_show_33370 sl2vl_attr_show 0 33370 &read_file_regidx_33370 ++cxacru_sysfs_show_adsl_headend_33376 cxacru_sysfs_show_adsl_headend 0 33376 NULL ++sctp_ulpevent_new_33377 sctp_ulpevent_new 1 33377 NULL ++aic26_keyclick_set_33378 aic26_keyclick_set 0-4 33378 NULL ++mem_cgroup_resize_memsw_limit_33379 mem_cgroup_resize_memsw_limit 0 33379 NULL ++setsockopt_33380 setsockopt 0 33380 NULL ++hackrf_alloc_stream_bufs_33381 hackrf_alloc_stream_bufs 0 33381 NULL ++ieee80211_if_read_dropped_frames_no_route_33383 ieee80211_if_read_dropped_frames_no_route 3-0 33383 NULL ++airo_suspend_33386 airo_suspend 0 33386 NULL ++bmc150_accel_setup_new_data_interrupt_33387 bmc150_accel_setup_new_data_interrupt 0 33387 NULL ++btrfs_write_inode_33388 btrfs_write_inode 0 33388 NULL ++show_ipInAddrErrors_33390 show_ipInAddrErrors 0 33390 NULL nohasharray ++logfs_write_buf_33390 logfs_write_buf 0 33390 &show_ipInAddrErrors_33390 ++nvc0_ram_create__33391 nvc0_ram_create_ 5 33391 NULL ++e100_exec_cb_33393 e100_exec_cb 0 33393 NULL ++cfs_trace_copyin_string_33396 cfs_trace_copyin_string 4 33396 NULL ++size_read_33399 size_read 0-3 33399 NULL ++show_yoffset_33400 show_yoffset 0 33400 NULL ++regulator_set_voltage_sel_regmap_33407 regulator_set_voltage_sel_regmap 0 33407 NULL ++snd_pcm_capture_ioctl1_33408 snd_pcm_capture_ioctl1 0 33408 NULL nohasharray ++dummy_urb_enqueue_33408 dummy_urb_enqueue 0 33408 &snd_pcm_capture_ioctl1_33408 nohasharray ++ext4_meta_bg_first_block_no_33408 ext4_meta_bg_first_block_no 2 33408 &dummy_urb_enqueue_33408 ++ufs_getfrag_block_33409 ufs_getfrag_block 2-0 33409 NULL nohasharray ++set_in_min3_33409 set_in_min3 0-4 33409 &ufs_getfrag_block_33409 ++dst_metric_raw_33414 dst_metric_raw 0 33414 NULL ++show_risetime_33415 show_risetime 0 33415 NULL nohasharray ++power_limit_0_tmin_us_show_33415 power_limit_0_tmin_us_show 0 33415 &show_risetime_33415 nohasharray ++filemap_fdatawrite_33415 filemap_fdatawrite 0 33415 &power_limit_0_tmin_us_show_33415 ++show_eeprom5_33416 show_eeprom5 0 33416 NULL nohasharray ++register_aggr_kprobe_33416 register_aggr_kprobe 0 33416 &show_eeprom5_33416 ++iscsi_nacl_attrib_store_random_r2t_offsets_33418 iscsi_nacl_attrib_store_random_r2t_offsets 0-3 33418 NULL ++ims_pcu_write_ofn_config_33420 ims_pcu_write_ofn_config 0 33420 NULL ++hash_netiface6_expire_33421 hash_netiface6_expire 4 33421 NULL ++mic_start_33422 mic_start 0 33422 NULL ++queue_ra_store_33425 queue_ra_store 3-0 33425 NULL ++f2fs_write_meta_page_33426 f2fs_write_meta_page 0 33426 NULL ++mxuport_send_ctrl_data_urb_33427 mxuport_send_ctrl_data_urb 0 33427 NULL ++fw_vendor_show_33428 fw_vendor_show 0 33428 NULL nohasharray ++iscsit_ta_prod_mode_write_protect_33428 iscsit_ta_prod_mode_write_protect 0 33428 &fw_vendor_show_33428 ++ubh_scanc_33436 ubh_scanc 0-3-4 33436 NULL ++map_service_to_pipe_33438 map_service_to_pipe 0 33438 NULL ++message_stats_list_33440 message_stats_list 5 33440 NULL nohasharray ++fuse_dev_do_write_33440 fuse_dev_do_write 0-3 33440 &message_stats_list_33440 ++nf_conntrack_confirm_33448 nf_conntrack_confirm 0 33448 NULL nohasharray ++ax88178_reset_33448 ax88178_reset 0 33448 &nf_conntrack_confirm_33448 ++ipvlan_addr4_event_33450 ipvlan_addr4_event 0 33450 NULL ++acpi_smbus_transaction_33454 acpi_smbus_transaction 0 33454 NULL ++ca0132_playback_pcm_prepare_33456 ca0132_playback_pcm_prepare 0 33456 NULL nohasharray ++rcar_thermal_get_trip_temp_33456 rcar_thermal_get_trip_temp 0 33456 &ca0132_playback_pcm_prepare_33456 ++da903x_enable_33458 da903x_enable 0 33458 NULL ++st_max_sg_segs_show_33461 st_max_sg_segs_show 0 33461 NULL ++__verify_length_33462 __verify_length 0 33462 NULL ++__mt9t112_reg_write_33468 __mt9t112_reg_write 0 33468 NULL nohasharray ++toshiba_kbd_illum_status_set_33468 toshiba_kbd_illum_status_set 0 33468 &__mt9t112_reg_write_33468 ++ovs_vport_alloc_33475 ovs_vport_alloc 1 33475 NULL ++create_entry_33479 create_entry 2 33479 NULL ++qla4xxx_get_ep_param_33483 qla4xxx_get_ep_param 0 33483 NULL ++ip_setsockopt_33487 ip_setsockopt 5-0 33487 NULL nohasharray ++elf_map_33487 elf_map 0 33487 &ip_setsockopt_33487 ++netxen_nic_hw_write_wx_128M_33488 netxen_nic_hw_write_wx_128M 2 33488 NULL ++ol_dqblk_chunk_off_33489 ol_dqblk_chunk_off 2 33489 NULL ++sock_set_timeout_33490 sock_set_timeout 0 33490 NULL ++pm80xx_get_fatal_dump_33498 pm80xx_get_fatal_dump 0 33498 NULL nohasharray ++patch_vt1708S_33498 patch_vt1708S 0 33498 &pm80xx_get_fatal_dump_33498 ++hash_netnet4_expire_33500 hash_netnet4_expire 4 33500 NULL nohasharray ++show_spd_33500 show_spd 0 33500 &hash_netnet4_expire_33500 nohasharray ++ipath_writev_33500 ipath_writev 0 33500 &show_spd_33500 ++wm831x_dcdc_get_status_33503 wm831x_dcdc_get_status 0 33503 NULL ++fb_read_33506 fb_read 3-0 33506 NULL nohasharray ++igb_sriov_reinit_33506 igb_sriov_reinit 0 33506 &fb_read_33506 ++cp2112_get_usb_config_33515 cp2112_get_usb_config 0 33515 NULL ++vbi_prepare_33516 vbi_prepare 0 33516 NULL ++musb_test_mode_write_33518 musb_test_mode_write 3-0 33518 NULL ++extcon_set_state_33519 extcon_set_state 0 33519 NULL ++lpfc_tgt_queue_depth_show_33520 lpfc_tgt_queue_depth_show 0 33520 NULL ++ahash_setkey_unaligned_33521 ahash_setkey_unaligned 0-3 33521 NULL ++nes_alloc_fast_reg_page_list_33523 nes_alloc_fast_reg_page_list 2 33523 NULL ++dbg_chk_lpt_sz_33525 dbg_chk_lpt_sz 0 33525 NULL ++aggr_size_rx_size_read_33526 aggr_size_rx_size_read 3-0 33526 NULL ++bitmap_print_to_pagebuf_33528 bitmap_print_to_pagebuf 0-4 33528 NULL ++part_inflight_show_33532 part_inflight_show 0 33532 NULL ++acpi_gsi_to_irq_33533 acpi_gsi_to_irq 1 33533 NULL ++show_temp_high_33534 show_temp_high 0 33534 NULL ++cgw_notifier_33537 cgw_notifier 0 33537 NULL ++qp_map_queue_headers_33538 qp_map_queue_headers 0 33538 NULL nohasharray ++netdev_store_33538 netdev_store 0-4 33538 &qp_map_queue_headers_33538 ++tomoyo_read_self_33539 tomoyo_read_self 3-0 33539 NULL nohasharray ++osc_max_rpcs_in_flight_seq_write_33539 osc_max_rpcs_in_flight_seq_write 3 33539 &tomoyo_read_self_33539 ++bnx2_request_firmware_33540 bnx2_request_firmware 0 33540 NULL ++get_fan_div_33546 get_fan_div 0 33546 NULL ++cx8802_buf_prepare_33547 cx8802_buf_prepare 0 33547 NULL ++compat_SyS_recv_33548 compat_SyS_recv 3 33548 NULL ++tpm_show_ppi_request_33550 tpm_show_ppi_request 0 33550 NULL nohasharray ++ahc_proc_write_seeprom_33550 ahc_proc_write_seeprom 0-3 33550 &tpm_show_ppi_request_33550 ++dup_array_33551 dup_array 3 33551 NULL ++in8_33552 in8 0 33552 NULL nohasharray ++iscsi_stat_logout_show_attr_indx_33552 iscsi_stat_logout_show_attr_indx 0 33552 &in8_33552 ++ima_parse_rule_33557 ima_parse_rule 0 33557 NULL ++gpiochip_to_irq_33561 gpiochip_to_irq 2 33561 NULL ++sst_byt_pcm_trigger_33563 sst_byt_pcm_trigger 0 33563 NULL ++__btrfs_set_prop_33568 __btrfs_set_prop 0 33568 NULL ++limit_write_33576 limit_write 0-3 33576 NULL ++cmtp_send_frame_33577 cmtp_send_frame 3 33577 NULL ++amd_gpio_request_33588 amd_gpio_request 0 33588 NULL ++xfs_attr3_leaf_getvalue_33590 xfs_attr3_leaf_getvalue 0 33590 NULL nohasharray ++iscsi_stat_sess_show_attr_indx_33590 iscsi_stat_sess_show_attr_indx 0 33590 &xfs_attr3_leaf_getvalue_33590 ++count_subheaders_33591 count_subheaders 0 33591 NULL nohasharray ++acpi_ps_push_scope_33591 acpi_ps_push_scope 0 33591 &count_subheaders_33591 ++scsi_execute_33596 scsi_execute 5 33596 NULL nohasharray ++xfs_itruncate_extents_33596 xfs_itruncate_extents 0 33596 &scsi_execute_33596 ++really_probe_33598 really_probe 0 33598 NULL ++rtl_open_33601 rtl_open 0 33601 NULL ++comedi_buf_write_n_allocated_33604 comedi_buf_write_n_allocated 0 33604 NULL ++temp_vga_33605 temp_vga 0 33605 NULL ++cifs_fsync_33606 cifs_fsync 0 33606 NULL ++target_core_alua_tg_pt_gp_store_attr_alua_access_status_33607 target_core_alua_tg_pt_gp_store_attr_alua_access_status 0-3 33607 NULL nohasharray ++bond_option_resend_igmp_set_33607 bond_option_resend_igmp_set 0 33607 &target_core_alua_tg_pt_gp_store_attr_alua_access_status_33607 ++xt_compat_target_offset_33608 xt_compat_target_offset 0 33608 NULL nohasharray ++ltc4245_show_gpio_33608 ltc4245_show_gpio 0 33608 &xt_compat_target_offset_33608 nohasharray ++ip6_find_1stfragopt_33608 ip6_find_1stfragopt 0 33608 <c4245_show_gpio_33608 ++wl12xx_pre_boot_33614 wl12xx_pre_boot 0 33614 NULL ++il_dbgfs_qos_read_33615 il_dbgfs_qos_read 3-0 33615 NULL nohasharray ++usb_gstrings_attach_33615 usb_gstrings_attach 3 33615 &il_dbgfs_qos_read_33615 ++show_rtap_iface_33618 show_rtap_iface 0 33618 NULL nohasharray ++xfs_btree_check_sblock_33618 xfs_btree_check_sblock 0 33618 &show_rtap_iface_33618 ++set_temp_auto_temp_max_33619 set_temp_auto_temp_max 0-4 33619 NULL ++nilfs_mdt_read_block_33622 nilfs_mdt_read_block 0 33622 NULL ++do_sync_write_33624 do_sync_write 0-3 33624 NULL nohasharray ++freeze_kernel_threads_33624 freeze_kernel_threads 0 33624 &do_sync_write_33624 ++hw_breakpoint_handler_33626 hw_breakpoint_handler 0 33626 NULL ++i40e_setup_tx_descriptors_33630 i40e_setup_tx_descriptors 0 33630 NULL nohasharray ++iio_buffer_write_length_33630 iio_buffer_write_length 0-4 33630 &i40e_setup_tx_descriptors_33630 ++swap_type_of_33634 swap_type_of 0 33634 NULL ++snd_card_asihpi_trigger_33639 snd_card_asihpi_trigger 0 33639 NULL ++c2_tx_ring_alloc_33640 c2_tx_ring_alloc 0 33640 NULL ++mt9v011_s_ctrl_33643 mt9v011_s_ctrl 0 33643 NULL nohasharray ++wlcore_cmd_wait_for_event_or_timeout_33643 wlcore_cmd_wait_for_event_or_timeout 0 33643 &mt9v011_s_ctrl_33643 ++read_battery_life_extender_33645 read_battery_life_extender 0 33645 NULL ++mwifiex_uap_prepare_cmd_33647 mwifiex_uap_prepare_cmd 0 33647 NULL ++ali_write_33649 ali_write 0-3 33649 NULL ++beiscsi_process_async_pdu_33650 beiscsi_process_async_pdu 6 33650 NULL ++create_endpoint_and_queue_control_33653 create_endpoint_and_queue_control 0 33653 NULL ++mt9m111_set_green_balance_33654 mt9m111_set_green_balance 0 33654 NULL ++sht15_update_status_33662 sht15_update_status 0 33662 NULL nohasharray ++mvs_task_prep_33662 mvs_task_prep 0 33662 &sht15_update_status_33662 ++vmw_gmr_bind_33663 vmw_gmr_bind 3 33663 NULL ++irq_blk_threshold_read_33666 irq_blk_threshold_read 3-0 33666 NULL nohasharray ++writepage_33666 writepage 0 33666 &irq_blk_threshold_read_33666 ++kernel_fw_from_file_33667 kernel_fw_from_file 0 33667 NULL ++arp_hdr_len_33671 arp_hdr_len 0 33671 NULL ++i2c_hid_alloc_buffers_33673 i2c_hid_alloc_buffers 2 33673 NULL ++pcm_playback_prepare_33674 pcm_playback_prepare 0 33674 NULL nohasharray ++ath6kl_wmi_startscan_cmd_33674 ath6kl_wmi_startscan_cmd 8 33674 &pcm_playback_prepare_33674 ++show_color_common_33677 show_color_common 0 33677 NULL ++submit_one_bio_33683 submit_one_bio 0 33683 NULL ++manage_start_stop_store_33684 manage_start_stop_store 0-4 33684 NULL ++policy_show_33685 policy_show 0 33685 NULL nohasharray ++i8259A_suspend_33685 i8259A_suspend 0 33685 &policy_show_33685 ++kempld_type_show_33688 kempld_type_show 0 33688 NULL nohasharray ++il4965_store_tx_power_33688 il4965_store_tx_power 0-4 33688 &kempld_type_show_33688 ++ceph_write_end_33694 ceph_write_end 0-5 33694 NULL nohasharray ++alc262_parse_auto_config_33694 alc262_parse_auto_config 0 33694 &ceph_write_end_33694 ++snd_seq_ioctl_query_next_client_33695 snd_seq_ioctl_query_next_client 0 33695 NULL ++nv50_disp_dmac_create__33696 nv50_disp_dmac_create_ 6 33696 NULL ++sys_keyctl_33708 sys_keyctl 4 33708 NULL nohasharray ++netlink_sendmsg_33708 netlink_sendmsg 4-0 33708 &sys_keyctl_33708 nohasharray ++xs_send_kvec_33708 xs_send_kvec 5 33708 &netlink_sendmsg_33708 ++cap_task_setnice_33709 cap_task_setnice 0 33709 NULL ++expand_corename_33710 expand_corename 2 33710 NULL ++enable_33715 enable 0 33715 NULL ++tipc_link_stats_33716 tipc_link_stats 3 33716 NULL ++__gfs2_readpage_33717 __gfs2_readpage 0 33717 NULL ++pvr2_stream_buffer_count_33719 pvr2_stream_buffer_count 2 33719 NULL ++write_file_spectral_count_33723 write_file_spectral_count 3-0 33723 NULL ++changeset_show_33726 changeset_show 0 33726 NULL ++read_file_node_recv_33729 read_file_node_recv 3-0 33729 NULL ++target_core_alua_tg_pt_gp_show_attr_nonop_delay_msecs_33732 target_core_alua_tg_pt_gp_show_attr_nonop_delay_msecs 0 33732 NULL ++__mutex_lock_interruptible_slowpath_33735 __mutex_lock_interruptible_slowpath 0 33735 NULL ++scm_check_creds_33739 scm_check_creds 0 33739 NULL ++__iscsi_disc_show_password_mutual_33745 __iscsi_disc_show_password_mutual 0 33745 NULL nohasharray ++nfs_idmap_instantiate_33745 nfs_idmap_instantiate 0 33745 &__iscsi_disc_show_password_mutual_33745 ++init_vif_33746 init_vif 0 33746 NULL ++xfrm_count_pfkey_enc_supported_33748 xfrm_count_pfkey_enc_supported 0 33748 NULL ++snd_rme96_playback_prepare_33751 snd_rme96_playback_prepare 0 33751 NULL ++mptscsih_version_nvdata_persistent_show_33753 mptscsih_version_nvdata_persistent_show 0 33753 NULL nohasharray ++dev_open_33753 dev_open 0 33753 &mptscsih_version_nvdata_persistent_show_33753 ++wusb_phy_rate_show_33754 wusb_phy_rate_show 0 33754 NULL ++ath10k_download_and_run_otp_33758 ath10k_download_and_run_otp 0 33758 NULL ++var_to_pll_33759 var_to_pll 0 33759 NULL ++pccard_show_voltage_33761 pccard_show_voltage 0 33761 NULL ++vifs_state_read_33762 vifs_state_read 3-0 33762 NULL ++ext2_xattr_user_list_33764 ext2_xattr_user_list 0-5 33764 NULL nohasharray ++ext3_mark_inode_dirty_33764 ext3_mark_inode_dirty 0 33764 &ext2_xattr_user_list_33764 ++hashtab_create_33769 hashtab_create 3 33769 NULL ++midibuf_message_length_33770 midibuf_message_length 0 33770 NULL ++rj54n1_s_ctrl_33771 rj54n1_s_ctrl 0 33771 NULL ++blkdev_read_iter_33773 blkdev_read_iter 0 33773 NULL ++____request_module_33775 ____request_module 0 33775 NULL ++offset_to_stripe_33778 offset_to_stripe 0-2 33778 NULL ++nfs4_proc_statfs_33780 nfs4_proc_statfs 0 33780 NULL ++__btrfs_free_reserved_extent_33782 __btrfs_free_reserved_extent 2 33782 NULL ++show_33785 show 0 33785 NULL nohasharray ++target_stat_scsi_tgt_port_show_attr_read_mbytes_33785 target_stat_scsi_tgt_port_show_attr_read_mbytes 0 33785 &show_33785 ++ezusb_write_ltv_33788 ezusb_write_ltv 0 33788 NULL ++kpageflags_read_33792 kpageflags_read 0-3 33792 NULL ++iwl_send_calib_cfg_33793 iwl_send_calib_cfg 0 33793 NULL nohasharray ++niu_ldn_irq_enable_33793 niu_ldn_irq_enable 0 33793 &iwl_send_calib_cfg_33793 ++check_qos_33797 check_qos 0 33797 NULL nohasharray ++ql_set_mac_addr_33797 ql_set_mac_addr 0 33797 &check_qos_33797 ++set_pwm_enable1_33798 set_pwm_enable1 0-4 33798 NULL ++if_sdio_read_rx_len_33800 if_sdio_read_rx_len 0 33800 NULL ++__uncore_iperf_cfg_show_33801 __uncore_iperf_cfg_show 0 33801 NULL ++find_next_offset_33804 find_next_offset 3-0 33804 NULL ++queue_control_on_old_endpoint_33811 queue_control_on_old_endpoint 0 33811 NULL ++show_fcstat_loss_of_signal_count_33814 show_fcstat_loss_of_signal_count 0 33814 NULL ++bfad_im_drv_name_show_33817 bfad_im_drv_name_show 0 33817 NULL ++kcs_size_33818 kcs_size 0 33818 NULL ++filter_write_33819 filter_write 3-0 33819 NULL nohasharray ++read_reg_33819 read_reg 0 33819 &filter_write_33819 ++acpi_ps_build_named_op_33827 acpi_ps_build_named_op 0 33827 NULL ++show_queue_type_field_33829 show_queue_type_field 0 33829 NULL ++scrub_setup_recheck_block_33831 scrub_setup_recheck_block 4-5 33831 NULL ++udplite_manip_pkt_33832 udplite_manip_pkt 4 33832 NULL ++hidp_get_raw_report_33837 hidp_get_raw_report 0-4 33837 NULL ++snd_ad1889_capture_prepare_33838 snd_ad1889_capture_prepare 0 33838 NULL ++exofs_file_fsync_33847 exofs_file_fsync 0 33847 NULL nohasharray ++store_als_channel_33847 store_als_channel 0-4 33847 &exofs_file_fsync_33847 ++calgary_alloc_coherent_33851 calgary_alloc_coherent 2 33851 NULL nohasharray ++usbatm_atm_send_33851 usbatm_atm_send 0 33851 &calgary_alloc_coherent_33851 ++oz_cdev_write_33852 oz_cdev_write 3 33852 NULL ++hamachi_open_33855 hamachi_open 0 33855 NULL ++mlx4_en_open_33856 mlx4_en_open 0 33856 NULL ++parse_capture_source_33859 parse_capture_source 0 33859 NULL ++hdcs_start_33860 hdcs_start 0 33860 NULL ++dev_register_33861 dev_register 0 33861 NULL ++ov6650_s_fmt_33866 ov6650_s_fmt 0 33866 NULL ++rt2x00usb_vendor_request_sw_33878 rt2x00usb_vendor_request_sw 0 33878 NULL ++pcxhr_read_rmh_status_33880 pcxhr_read_rmh_status 0 33880 NULL ++bin_string_33884 bin_string 5-3 33884 NULL ++get_fan1_div_33886 get_fan1_div 0 33886 NULL nohasharray ++mwifiex_cmd_802_11_snmp_mib_33886 mwifiex_cmd_802_11_snmp_mib 0 33886 &get_fan1_div_33886 ++twl_request_33892 twl_request 0 33892 NULL ++sis190_init_ring_33895 sis190_init_ring 0 33895 NULL nohasharray ++isl29003_set_resolution_33895 isl29003_set_resolution 0 33895 &sis190_init_ring_33895 ++node_read_cpulist_33898 node_read_cpulist 0 33898 NULL ++copy_gl_to_skb_pkt_33906 copy_gl_to_skb_pkt 3 33906 NULL ++musb_g_ep0_enable_33907 musb_g_ep0_enable 0 33907 NULL ++get_user_pages_33908 get_user_pages 0 33908 NULL nohasharray ++store_loopback_33908 store_loopback 0-3 33908 &get_user_pages_33908 ++sg_nents_33909 sg_nents 0 33909 NULL ++ath6kl_roam_mode_write_33912 ath6kl_roam_mode_write 3-0 33912 NULL ++whiteheat_open_33916 whiteheat_open 0 33916 NULL ++queue_logical_block_size_33918 queue_logical_block_size 0 33918 NULL ++beiscsi_get_macaddr_33920 beiscsi_get_macaddr 0 33920 NULL ++show_ata_port_port_no_33921 show_ata_port_port_no 0 33921 NULL ++dwc3_send_gadget_ep_cmd_33923 dwc3_send_gadget_ep_cmd 0 33923 NULL ++set_temp_auto_point_temp_33930 set_temp_auto_point_temp 0-4 33930 NULL nohasharray ++store_tabletExecute_33930 store_tabletExecute 0-4 33930 &set_temp_auto_point_temp_33930 ++palmas_bulk_read_33937 palmas_bulk_read 0 33937 NULL ++pyra_sysfs_write_settings_33939 pyra_sysfs_write_settings 0-6-5 33939 NULL ++sel_read_avc_cache_threshold_33942 sel_read_avc_cache_threshold 3-0 33942 NULL nohasharray ++edd_show_raw_data_33942 edd_show_raw_data 0 33942 &sel_read_avc_cache_threshold_33942 ++lpfc_idiag_ctlacc_read_33943 lpfc_idiag_ctlacc_read 3-0 33943 NULL ++read_file_tgt_rx_stats_33944 read_file_tgt_rx_stats 3-0 33944 NULL ++stv06xx_write_bridge_33945 stv06xx_write_bridge 0 33945 NULL nohasharray ++smsc95xx_ethtool_get_eeprom_len_33945 smsc95xx_ethtool_get_eeprom_len 0 33945 &stv06xx_write_bridge_33945 ++rs_sta_dbgfs_drv_tx_stats_read_33946 rs_sta_dbgfs_drv_tx_stats_read 3-0 33946 NULL nohasharray ++logfs_write_inode_33946 logfs_write_inode 0 33946 &rs_sta_dbgfs_drv_tx_stats_read_33946 ++metric_id_get_33947 metric_id_get 0 33947 NULL nohasharray ++__zd_usb_enable_rx_33947 __zd_usb_enable_rx 0 33947 &metric_id_get_33947 ++hfsplus_osx_setxattr_33952 hfsplus_osx_setxattr 0 33952 NULL ++__proc_dump_kernel_33954 __proc_dump_kernel 5 33954 NULL ++nilfs_direct_delete_and_convert_33957 nilfs_direct_delete_and_convert 0 33957 NULL ++iscsi_nacl_auth_show_userid_33958 iscsi_nacl_auth_show_userid 0 33958 NULL ++b44_register_phy_one_33962 b44_register_phy_one 0 33962 NULL ++btrfs_delalloc_reserve_metadata_33963 btrfs_delalloc_reserve_metadata 0 33963 NULL ++ieee802154_hdr_get_addrs_33964 ieee802154_hdr_get_addrs 0 33964 NULL ++nct7802_read_fan_33970 nct7802_read_fan 0 33970 NULL ++show_phys_height_33974 show_phys_height 0 33974 NULL nohasharray ++actual_brightness_show_33974 actual_brightness_show 0 33974 &show_phys_height_33974 ++store_33978 store 0 33978 NULL nohasharray ++bq2415x_set_termination_current_33978 bq2415x_set_termination_current 0 33978 &store_33978 ++brightness_show_33981 brightness_show 0 33981 NULL ++show_33983 show 0 33983 NULL nohasharray ++adfs_dir_find_entry_33983 adfs_dir_find_entry 0 33983 &show_33983 ++vga_switcheroo_debugfs_write_33984 vga_switcheroo_debugfs_write 3-0 33984 NULL ++snd_interval_refine_33987 snd_interval_refine 0 33987 NULL nohasharray ++hotkey_enable_store_33987 hotkey_enable_store 0-4 33987 &snd_interval_refine_33987 ++is_enabled_33989 is_enabled 0 33989 NULL ++igbvf_request_irq_33999 igbvf_request_irq 0 33999 NULL nohasharray ++dump_emit_33999 dump_emit 3 33999 &igbvf_request_irq_33999 ++acpi_device_hid_show_34000 acpi_device_hid_show 0 34000 NULL ++lpfc_nodev_tmo_show_34002 lpfc_nodev_tmo_show 0 34002 NULL ++__az6007_read_34011 __az6007_read 0 34011 NULL ++ath10k_pci_wake_34017 ath10k_pci_wake 0 34017 NULL ++state_show_34018 state_show 0 34018 NULL ++__ntfs_malloc_34022 __ntfs_malloc 1 34022 NULL ++lbs_lowrssi_write_34025 lbs_lowrssi_write 3-0 34025 NULL ++ct_pcm_playback_trigger_34027 ct_pcm_playback_trigger 0 34027 NULL nohasharray ++bh1780_show_power_state_34027 bh1780_show_power_state 0 34027 &ct_pcm_playback_trigger_34027 ++at803x_config_init_34029 at803x_config_init 0 34029 NULL ++ghash_update_34031 ghash_update 0 34031 NULL ++nilfs_snapshot_attr_store_34033 nilfs_snapshot_attr_store 0-4 34033 NULL ++ppp_write_34034 ppp_write 3-0 34034 NULL ++m88ts2022_set_params_34040 m88ts2022_set_params 0 34040 NULL ++tty_insert_flip_string_34042 tty_insert_flip_string 3-0 34042 NULL ++__domain_flush_pages_34045 __domain_flush_pages 3-2 34045 NULL nohasharray ++show_sas_expander_vendor_id_34045 show_sas_expander_vendor_id 0 34045 &__domain_flush_pages_34045 ++ncp_hash_dentry_34049 ncp_hash_dentry 0 34049 NULL nohasharray ++lpfc_restrict_login_store_34049 lpfc_restrict_login_store 0-4 34049 &ncp_hash_dentry_34049 ++bm_page_io_async_34050 bm_page_io_async 2 34050 NULL ++cdc_ncm_show_tx_timer_usecs_34052 cdc_ncm_show_tx_timer_usecs 0 34052 NULL ++ad7793_set_mode_34053 ad7793_set_mode 0 34053 NULL ++pcm_trigger_34060 pcm_trigger 0 34060 NULL ++memcg_update_all_caches_34068 memcg_update_all_caches 1-0 34068 NULL ++store_34070 store 0-3 34070 NULL ++efx_phc_enable_34071 efx_phc_enable 0 34071 NULL ++show_analog_out_34081 show_analog_out 0 34081 NULL ++show_risefalltime_34084 show_risefalltime 0 34084 NULL ++get_eeprom_len_34091 get_eeprom_len 0 34091 NULL ++set_component_locate_34094 set_component_locate 0-4 34094 NULL ++pipeline_pipeline_fifo_full_read_34095 pipeline_pipeline_fifo_full_read 3-0 34095 NULL nohasharray ++alc_alloc_spec_34095 alc_alloc_spec 0 34095 &pipeline_pipeline_fifo_full_read_34095 ++lp55xx_store_engine_select_34100 lp55xx_store_engine_select 0-4 34100 NULL ++__irq_domain_add_34101 __irq_domain_add 2 34101 NULL nohasharray ++timeout_store_34101 timeout_store 0-4 34101 &__irq_domain_add_34101 ++proc_scsi_host_write_34107 proc_scsi_host_write 3-0 34107 NULL nohasharray ++fjn_open_34107 fjn_open 0 34107 &proc_scsi_host_write_34107 ++ipath_map_page_34112 ipath_map_page 3 34112 NULL ++sxgbe_open_34127 sxgbe_open 0 34127 NULL ++asd_show_dev_pcba_sn_34128 asd_show_dev_pcba_sn 0 34128 NULL ++store_temp_max_34130 store_temp_max 0-4 34130 NULL ++islpci_mgt_transmit_34133 islpci_mgt_transmit 0-5 34133 NULL nohasharray ++typhoon_request_firmware_34133 typhoon_request_firmware 0 34133 &islpci_mgt_transmit_34133 ++cdc_mbim_process_dgram_34136 cdc_mbim_process_dgram 3 34136 NULL ++btrfs_csum_one_bio_34137 btrfs_csum_one_bio 0 34137 NULL ++mtu2blksize_34139 mtu2blksize 0 34139 NULL ++ixgbe_dbg_netdev_ops_write_34141 ixgbe_dbg_netdev_ops_write 3-0 34141 NULL nohasharray ++si476x_core_cmd_am_acf_status_34141 si476x_core_cmd_am_acf_status 0 34141 &ixgbe_dbg_netdev_ops_write_34141 ++usbhid_power_34146 usbhid_power 0 34146 NULL nohasharray ++veth_dev_init_34146 veth_dev_init 0 34146 &usbhid_power_34146 ++show_ipInDelivers_34148 show_ipInDelivers 0 34148 NULL ++mwifiex_cmd_11n_addba_rsp_gen_34149 mwifiex_cmd_11n_addba_rsp_gen 0 34149 NULL ++quirk_pcie_aspm_read_34150 quirk_pcie_aspm_read 0 34150 NULL ++rt61pci_load_firmware_34151 rt61pci_load_firmware 0 34151 NULL ++adt7x10_show_name_34153 adt7x10_show_name 0 34153 NULL nohasharray ++hung_up_tty_write_34153 hung_up_tty_write 0-3 34153 &adt7x10_show_name_34153 ++configure_endpoint_34156 configure_endpoint 0 34156 NULL nohasharray ++ixgbevf_read_posted_mbx_34156 ixgbevf_read_posted_mbx 0 34156 &configure_endpoint_34156 nohasharray ++elan_i2c_set_flash_key_34156 elan_i2c_set_flash_key 0 34156 &ixgbevf_read_posted_mbx_34156 ++osst_eod_frame_ppos_show_34157 osst_eod_frame_ppos_show 0 34157 NULL nohasharray ++host_control_on_shutdown_store_34157 host_control_on_shutdown_store 0-4 34157 &osst_eod_frame_ppos_show_34157 ++ext4_xattr_list_34162 ext4_xattr_list 0 34162 NULL nohasharray ++st_sensors_spi_read_multiple_byte_34162 st_sensors_spi_read_multiple_byte 4 34162 &ext4_xattr_list_34162 ++card_wait_for_ready_34163 card_wait_for_ready 0 34163 NULL ++ocfs2_xattr_list_entry_34165 ocfs2_xattr_list_entry 0 34165 NULL ++rt2x00debug_read_bbp_34167 rt2x00debug_read_bbp 0-3 34167 NULL ++ahci_show_port_cmd_34168 ahci_show_port_cmd 0 34168 NULL nohasharray ++show_rdac5_34168 show_rdac5 0 34168 &ahci_show_port_cmd_34168 ++show_pkey_34170 show_pkey 0 34170 NULL ++skb_to_sgvec_34171 skb_to_sgvec 0 34171 NULL ++xfs_attr_get_34174 xfs_attr_get 0 34174 NULL ++hdcs_s_ctrl_34177 hdcs_s_ctrl 0 34177 NULL ++qla2x00_fw_dump_size_show_34180 qla2x00_fw_dump_size_show 0 34180 NULL ++show_pci_clock_34182 show_pci_clock 0 34182 NULL ++mgsl_claim_resources_34183 mgsl_claim_resources 0 34183 NULL ++hidp_set_raw_report_34192 hidp_set_raw_report 0-4 34192 NULL ++comp_algorithm_show_34195 comp_algorithm_show 0 34195 NULL ++reiserfs_write_inode_34202 reiserfs_write_inode 0 34202 NULL nohasharray ++max_comp_streams_store_34202 max_comp_streams_store 0-4 34202 &reiserfs_write_inode_34202 ++netlbl_unlhsh_netdev_handler_34204 netlbl_unlhsh_netdev_handler 0 34204 NULL ++rsi_debug_zone_write_34206 rsi_debug_zone_write 3-0 34206 NULL nohasharray ++rbd_osd_req_create_34206 rbd_osd_req_create 3 34206 &rsi_debug_zone_write_34206 ++xfs_bmapi_write_34208 xfs_bmapi_write 0 34208 NULL ++snd_ice1712_capture_pro_prepare_34214 snd_ice1712_capture_pro_prepare 0 34214 NULL ++ext4_da_write_begin_34215 ext4_da_write_begin 3-4-0 34215 NULL ++__send_command_34218 __send_command 5-7 34218 NULL ++ext3_ordered_writepage_34221 ext3_ordered_writepage 0 34221 NULL nohasharray ++bnx2x_send_msg2pf_34221 bnx2x_send_msg2pf 0 34221 &ext3_ordered_writepage_34221 ++adt7x10_temp_ready_34222 adt7x10_temp_ready 0 34222 NULL ++ds2404_read_time_34225 ds2404_read_time 0 34225 NULL nohasharray ++sctp_setsockopt_auto_asconf_34225 sctp_setsockopt_auto_asconf 0 34225 &ds2404_read_time_34225 ++show_hdmi_cable_34236 show_hdmi_cable 0 34236 NULL ++store_34237 store 0-4 34237 NULL ++start_genius_cam_34238 start_genius_cam 0 34238 NULL ++dma_release_from_contiguous_34239 dma_release_from_contiguous 3 34239 NULL ++wm8350_isink_enable_34241 wm8350_isink_enable 0 34241 NULL nohasharray ++path_has_perm_34241 path_has_perm 0 34241 &wm8350_isink_enable_34241 ++bnx2x_nic_load_34243 bnx2x_nic_load 0 34243 NULL ++i2o_bus_probe_34244 i2o_bus_probe 0 34244 NULL ++cmpc_accel_sensitivity_show_34247 cmpc_accel_sensitivity_show 0 34247 NULL nohasharray ++xennet_open_34247 xennet_open 0 34247 &cmpc_accel_sensitivity_show_34247 ++setup_nodes_for_search_34248 setup_nodes_for_search 0 34248 NULL ++bcm_init_34250 bcm_init 0 34250 NULL nohasharray ++adp8870_bl_l5_dark_dim_store_34250 adp8870_bl_l5_dark_dim_store 4-0 34250 &bcm_init_34250 ++raid_disks_store_34258 raid_disks_store 0-3 34258 NULL ++xfs_bmbt_get_maxrecs_34259 xfs_bmbt_get_maxrecs 0 34259 NULL ++max_age_store_34262 max_age_store 4-0 34262 NULL ++show_bank2_mask_34263 show_bank2_mask 0 34263 NULL nohasharray ++squashfs_readpage_34263 squashfs_readpage 0 34263 &show_bank2_mask_34263 ++bl_pipe_downcall_34264 bl_pipe_downcall 3-0 34264 NULL nohasharray ++svc_listen_34264 svc_listen 0 34264 &bl_pipe_downcall_34264 ++ocfs2_dlm_lock_34265 ocfs2_dlm_lock 0 34265 NULL ++pcf857x_to_irq_34273 pcf857x_to_irq 2 34273 NULL ++kprobes_module_callback_34274 kprobes_module_callback 0 34274 NULL ++ib_dma_mapping_error_34277 ib_dma_mapping_error 2 34277 NULL ++device_private_init_34279 device_private_init 0 34279 NULL ++isoc_enable_34281 isoc_enable 0 34281 NULL ++get_boolean_34283 get_boolean 0 34283 NULL ++xgmac_reg_addr_write_34284 xgmac_reg_addr_write 3 34284 NULL ++stp_state_store_34285 stp_state_store 0-4 34285 NULL ++f_set_ib_loopback_34288 f_set_ib_loopback 0 34288 NULL ++show_cfg_34289 show_cfg 0 34289 NULL ++bd2802_store_reg0x0e_34291 bd2802_store_reg0x0e 0-4 34291 NULL ++cx18_start_capture_34296 cx18_start_capture 0 34296 NULL ++aac_show_max_id_34297 aac_show_max_id 0 34297 NULL ++rr_open_34298 rr_open 0 34298 NULL ++auxadc_read_34299 auxadc_read 0 34299 NULL ++acpi_ds_create_operand_34302 acpi_ds_create_operand 0 34302 NULL ++snd_p16v_pcm_trigger_capture_34307 snd_p16v_pcm_trigger_capture 0 34307 NULL ++ti_vread_sync_34311 ti_vread_sync 0 34311 NULL ++bfs_write_begin_34322 bfs_write_begin 0 34322 NULL ++iov_iter_single_seg_count_34326 iov_iter_single_seg_count 0 34326 NULL ++em28xx_start_analog_streaming_34335 em28xx_start_analog_streaming 0 34335 NULL ++efivar_attr_show_34341 efivar_attr_show 0 34341 NULL ++led_trigger_store_34354 led_trigger_store 0-4 34354 NULL ++radio_read_34356 radio_read 0-3 34356 NULL ++proc_thread_self_readlink_34357 proc_thread_self_readlink 3-0 34357 NULL nohasharray ++show_ap2_temp_34357 show_ap2_temp 0 34357 &proc_thread_self_readlink_34357 nohasharray ++ssb_bus_suspend_34357 ssb_bus_suspend 0 34357 &show_ap2_temp_34357 ++write_rss_34360 write_rss 0 34360 NULL nohasharray ++hugetlbfs_migrate_page_34360 hugetlbfs_migrate_page 0 34360 &write_rss_34360 ++show_session_param_ISCSI_PARAM_LU_RESET_TMO_34362 show_session_param_ISCSI_PARAM_LU_RESET_TMO 0 34362 NULL ++sync_page_io_34363 sync_page_io 3 34363 NULL nohasharray ++ipr_store_reset_adapter_34363 ipr_store_reset_adapter 0-4 34363 &sync_page_io_34363 ++tpm_show_ppi_vs_operations_34365 tpm_show_ppi_vs_operations 0 34365 NULL ++rngapi_reset_34366 rngapi_reset 3 34366 NULL nohasharray ++p54_alloc_skb_34366 p54_alloc_skb 3 34366 &rngapi_reset_34366 ++play_audio_cb_34367 play_audio_cb 2 34367 NULL ++batadv_hard_if_event_34371 batadv_hard_if_event 0 34371 NULL ++i2c_hid_get_raw_report_34376 i2c_hid_get_raw_report 0-4 34376 NULL ++reiserfs_resize_34377 reiserfs_resize 2 34377 NULL ++ea_read_34378 ea_read 0 34378 NULL nohasharray ++_iwl_dbgfs_low_latency_write_34378 _iwl_dbgfs_low_latency_write 3-0 34378 &ea_read_34378 ++regulator_mode_to_status_34382 regulator_mode_to_status 0 34382 NULL ++av7110_vbi_write_34384 av7110_vbi_write 3-0 34384 NULL ++hsc_probe_34385 hsc_probe 0 34385 NULL ++usbvision_v4l2_read_34386 usbvision_v4l2_read 3-0 34386 NULL ++read_rbu_image_type_34387 read_rbu_image_type 6-0-5 34387 NULL ++i2c_outb_34391 i2c_outb 0 34391 NULL ++saa7110_s_ctrl_34396 saa7110_s_ctrl 0 34396 NULL ++ivtv_read_pos_34400 ivtv_read_pos 3-0 34400 NULL nohasharray ++iwl_calib_set_34400 iwl_calib_set 3-0 34400 &ivtv_read_pos_34400 ++mei_cl_flow_ctrl_creds_34404 mei_cl_flow_ctrl_creds 0 34404 NULL ++ath5k_attr_show_ofdm_weak_signal_detection_34410 ath5k_attr_show_ofdm_weak_signal_detection 0 34410 NULL ++set_rdac4_34411 set_rdac4 4-0 34411 NULL nohasharray ++sctp_make_heartbeat_ack_34411 sctp_make_heartbeat_ack 4 34411 &set_rdac4_34411 ++snd_ali_prepare_34413 snd_ali_prepare 0 34413 NULL ++cfq_slice_async_show_34423 cfq_slice_async_show 0 34423 NULL nohasharray ++ipv4_conntrack_defrag_34423 ipv4_conntrack_defrag 0 34423 &cfq_slice_async_show_34423 ++duplex_show_34424 duplex_show 0 34424 NULL ++set_essid_34427 set_essid 0 34427 NULL ++affs_readpage_34433 affs_readpage 0 34433 NULL ++__extent_read_full_page_34437 __extent_read_full_page 0 34437 NULL ++target_stat_scsi_lu_show_attr_lun_34439 target_stat_scsi_lu_show_attr_lun 0 34439 NULL nohasharray ++security_socket_create_34439 security_socket_create 0 34439 &target_stat_scsi_lu_show_attr_lun_34439 ++store_state_field_34443 store_state_field 0-4 34443 NULL ++go7007_buf_prepare_34448 go7007_buf_prepare 0 34448 NULL ++_read_oob_34450 _read_oob 0 34450 NULL ++sisfb_set_par_34453 sisfb_set_par 0 34453 NULL ++bmg160_setup_new_data_interrupt_34455 bmg160_setup_new_data_interrupt 0 34455 NULL ++get_clusters_34459 get_clusters 0 34459 NULL nohasharray ++sctp_make_abort_34459 sctp_make_abort 3 34459 &get_clusters_34459 ++wl1251_cmd_data_path_rx_34460 wl1251_cmd_data_path_rx 0 34460 NULL ++bfad_im_serial_num_show_34463 bfad_im_serial_num_show 0 34463 NULL ++aty_dsp_gt_34465 aty_dsp_gt 0 34465 NULL ++ssb_hcd_probe_34466 ssb_hcd_probe 0 34466 NULL ++esas2r_read_fw_34468 esas2r_read_fw 0-3-4 34468 NULL ++monitor_id_show_34469 monitor_id_show 0 34469 NULL nohasharray ++lbs_cmd_802_11_sleep_params_34469 lbs_cmd_802_11_sleep_params 0 34469 &monitor_id_show_34469 nohasharray ++dev_start_34469 dev_start 0 34469 &lbs_cmd_802_11_sleep_params_34469 ++show_34470 show 0 34470 NULL ++mwifiex_regrdwr_read_34472 mwifiex_regrdwr_read 3-0 34472 NULL ++sha224_ssse3_init_34474 sha224_ssse3_init 0 34474 NULL ++fw_csr_string_34475 fw_csr_string 0 34475 NULL ++skcipher_sndbuf_34476 skcipher_sndbuf 0 34476 NULL ++i2o_parm_field_get_34477 i2o_parm_field_get 5 34477 NULL ++airspy_submit_urbs_34481 airspy_submit_urbs 0 34481 NULL ++show_iface_data_seq_in_order_34486 show_iface_data_seq_in_order 0 34486 NULL ++security_inode_permission_34488 security_inode_permission 0 34488 NULL nohasharray ++_ctl_device_sas_address_show_34488 _ctl_device_sas_address_show 0 34488 &security_inode_permission_34488 ++enable_store_34489 enable_store 0-4 34489 NULL nohasharray ++skein1024_final_34489 skein1024_final 0 34489 &enable_store_34489 ++rt2500pci_enable_radio_34490 rt2500pci_enable_radio 0 34490 NULL ++SyS_pwritev_34494 SyS_pwritev 3 34494 NULL ++qp_alloc_res_34496 qp_alloc_res 5 34496 NULL ++cgroup_release_agent_write_34497 cgroup_release_agent_write 0-3 34497 NULL ++acerhdf_get_temp_34504 acerhdf_get_temp 0 34504 NULL ++lb_tx_hash_to_port_mapping_init_34505 lb_tx_hash_to_port_mapping_init 0 34505 NULL nohasharray ++lu_buf_check_and_alloc_34505 lu_buf_check_and_alloc 2 34505 &lb_tx_hash_to_port_mapping_init_34505 ++features_show_34507 features_show 0 34507 NULL ++efivar_size_read_34508 efivar_size_read 0 34508 NULL nohasharray ++show_34508 show 0 34508 &efivar_size_read_34508 ++sdev_store_evt_lun_change_reported_34510 sdev_store_evt_lun_change_reported 0-4 34510 NULL ++show_temp_over_34512 show_temp_over 0 34512 NULL ++qmi_wwan_mac_addr_34513 qmi_wwan_mac_addr 0 34513 NULL ++ov9740_cropcap_34514 ov9740_cropcap 0 34514 NULL ++tda18271_init_regs_34515 tda18271_init_regs 0 34515 NULL ++bnad_rx_res_alloc_34516 bnad_rx_res_alloc 0 34516 NULL ++fusbh200_urb_enqueue_34521 fusbh200_urb_enqueue 0 34521 NULL ++hermes_write_wordrec_34522 hermes_write_wordrec 0 34522 NULL ++bh1780_show_lux_34523 bh1780_show_lux 0 34523 NULL nohasharray ++wl1251_acx_default_key_34523 wl1251_acx_default_key 0 34523 &bh1780_show_lux_34523 ++snd_pcm_hw_param_value_34525 snd_pcm_hw_param_value 0 34525 NULL ++pccard_store_irq_mask_34534 pccard_store_irq_mask 0-4 34534 NULL ++bMaxPower_show_34536 bMaxPower_show 0 34536 NULL ++tracing_stats_read_34537 tracing_stats_read 3 34537 NULL ++id_vendor_show_34538 id_vendor_show 0 34538 NULL ++ths7303_config_34542 ths7303_config 0 34542 NULL ++hugetlbfs_read_actor_34547 hugetlbfs_read_actor 0-4-5-2 34547 NULL nohasharray ++ext4_read_inline_page_34547 ext4_read_inline_page 0 34547 &hugetlbfs_read_actor_34547 ++hdmi_streamoff_34556 hdmi_streamoff 0 34556 NULL nohasharray ++asd_verify_flash_seg_34556 asd_verify_flash_seg 0 34556 &hdmi_streamoff_34556 ++dbBackSplit_34561 dbBackSplit 0 34561 NULL ++self_check_peb_ec_hdr_34564 self_check_peb_ec_hdr 0 34564 NULL nohasharray ++alloc_ieee80211_rsl_34564 alloc_ieee80211_rsl 1 34564 &self_check_peb_ec_hdr_34564 ++show_sas_expander_component_revision_id_34566 show_sas_expander_component_revision_id 0 34566 NULL ++vsock_bind_34572 vsock_bind 0 34572 NULL ++snd_ice1712_playback_pro_prepare_34573 snd_ice1712_playback_pro_prepare 0 34573 NULL ++ext4_ind_direct_IO_34574 ext4_ind_direct_IO 4-0 34574 NULL ++mwl8k_cmd_set_rf_channel_34578 mwl8k_cmd_set_rf_channel 0 34578 NULL nohasharray ++via_ircc_net_open_34578 via_ircc_net_open 0 34578 &mwl8k_cmd_set_rf_channel_34578 ++digi_open_34579 digi_open 0 34579 NULL ++lov_stripecount_seq_write_34582 lov_stripecount_seq_write 3 34582 NULL ++velocity_rx_copy_34583 velocity_rx_copy 2 34583 NULL ++s5p_mfc_alloc_priv_buf_34585 s5p_mfc_alloc_priv_buf 0 34585 NULL ++init_send_hfcd_34586 init_send_hfcd 1 34586 NULL ++ceph_msgpool_init_34599 ceph_msgpool_init 4 34599 NULL nohasharray ++cw1200_queue_init_34599 cw1200_queue_init 4 34599 &ceph_msgpool_init_34599 nohasharray ++ov2640_s_stream_34599 ov2640_s_stream 0 34599 &cw1200_queue_init_34599 ++behind_writes_used_show_34600 behind_writes_used_show 0 34600 NULL ++show_session_param_ISCSI_PARAM_DISCOVERY_PARENT_TYPE_34601 show_session_param_ISCSI_PARAM_DISCOVERY_PARENT_TYPE 0 34601 NULL ++bio_integrity_bytes_34602 bio_integrity_bytes 2 34602 NULL ++ctrl_xmit_34606 ctrl_xmit 0 34606 NULL ++__jffs2_ref_totlen_34609 __jffs2_ref_totlen 0 34609 NULL nohasharray ++mtd_write_34609 mtd_write 0 34609 &__jffs2_ref_totlen_34609 nohasharray ++ext2_write_begin_34609 ext2_write_begin 0 34609 &mtd_write_34609 ++ftdi_open_34618 ftdi_open 0 34618 NULL ++il_commit_rxon_34621 il_commit_rxon 0 34621 NULL ++pmbus_regulator_is_enabled_34623 pmbus_regulator_is_enabled 0 34623 NULL ++sdev_store_delete_34624 sdev_store_delete 0-4 34624 NULL ++scsi_debug_write_info_34626 scsi_debug_write_info 0-3 34626 NULL nohasharray ++set_point2_34626 set_point2 0-4 34626 &scsi_debug_write_info_34626 ++da9063_rtc_set_alarm_34628 da9063_rtc_set_alarm 0 34628 NULL ++ivtv_read_34631 ivtv_read 0 34631 NULL ++cnic_alloc_dma_34641 cnic_alloc_dma 3 34641 NULL ++pcipcwd_write_34644 pcipcwd_write 0-3 34644 NULL ++rt2x00usb_alloc_entries_34648 rt2x00usb_alloc_entries 0 34648 NULL ++iwl_mvm_power_set_ba_34655 iwl_mvm_power_set_ba 0 34655 NULL ++cifs_readpage_from_fscache_34659 cifs_readpage_from_fscache 0 34659 NULL ++nf_nat_mangle_udp_packet_34661 nf_nat_mangle_udp_packet 6-8 34661 NULL ++br_multicast_set_port_router_34667 br_multicast_set_port_router 0 34667 NULL ++snd_seq_do_ioctl_34668 snd_seq_do_ioctl 0 34668 NULL ++sleep_auth_write_34676 sleep_auth_write 3-0 34676 NULL ++pte_pfn_34678 pte_pfn 0 34678 NULL ++udp_v4_get_port_34680 udp_v4_get_port 0 34680 NULL ++ixgbevf_read_mbx_vf_34683 ixgbevf_read_mbx_vf 0 34683 NULL ++core_setup_alua_34684 core_setup_alua 0 34684 NULL ++f2fs_direct_IO_34685 f2fs_direct_IO 0-4 34685 NULL ++isr_fiqs_read_34687 isr_fiqs_read 3-0 34687 NULL ++batadv_tvlv_realloc_packet_buff_34688 batadv_tvlv_realloc_packet_buff 4-3 34688 NULL ++hptiop_adjust_disk_queue_depth_34698 hptiop_adjust_disk_queue_depth 0-2 34698 NULL ++__generic_file_write_iter_34699 __generic_file_write_iter 0 34699 NULL ++em2800_i2c_send_bytes_34700 em2800_i2c_send_bytes 0-4 34700 NULL ++wa_urb_enqueue_34701 wa_urb_enqueue 0 34701 NULL ++target_core_alua_tg_pt_gp_show_attr_alua_support_unavailable_34702 target_core_alua_tg_pt_gp_show_attr_alua_support_unavailable 0 34702 NULL ++wpf_s_ctrl_34705 wpf_s_ctrl 0 34705 NULL ++alloc_irq_and_cfg_at_34706 alloc_irq_and_cfg_at 1 34706 NULL ++ext4_listxattr_34712 ext4_listxattr 0-3 34712 NULL ++bb_show_34715 bb_show 0 34715 NULL nohasharray ++autofs4_write_34715 autofs4_write 4 34715 &bb_show_34715 ++ipath_f_get_ib_cfg_34717 ipath_f_get_ib_cfg 0 34717 NULL nohasharray ++osst_seek_logical_blk_34717 osst_seek_logical_blk 0 34717 &ipath_f_get_ib_cfg_34717 ++ieee80211_if_read_num_sta_ps_34722 ieee80211_if_read_num_sta_ps 3-0 34722 NULL ++store_34724 store 0-3 34724 NULL nohasharray ++max77686_rtc_start_alarm_34724 max77686_rtc_start_alarm 0 34724 &store_34724 ++composite_dev_prepare_34730 composite_dev_prepare 0 34730 NULL ++sch_transaction_34731 sch_transaction 0 34731 NULL ++platform_list_read_file_34734 platform_list_read_file 3-0 34734 NULL ++target_fabric_tpg_attrib_attr_show_34735 target_fabric_tpg_attrib_attr_show 0 34735 NULL ++reg_w_ixbuf_34736 reg_w_ixbuf 4 34736 NULL nohasharray ++fib_rule_nlmsg_size_34736 fib_rule_nlmsg_size 0 34736 ®_w_ixbuf_34736 ++sctp_make_datafrag_empty_34737 sctp_make_datafrag_empty 3 34737 NULL ++nilfs_dev_README_show_34738 nilfs_dev_README_show 0 34738 NULL ++ieee80211_check_combinations_34740 ieee80211_check_combinations 0 34740 NULL nohasharray ++o2hb_region_blocks_write_34740 o2hb_region_blocks_write 0-3 34740 &ieee80211_check_combinations_34740 ++diagc_attr_show_34742 diagc_attr_show 0 34742 NULL ++tps80031_rtc_read_time_34745 tps80031_rtc_read_time 0 34745 NULL nohasharray ++do_loop_readv_writev_34745 do_loop_readv_writev 0 34745 &tps80031_rtc_read_time_34745 ++pm8001_mpi_build_cmd_34746 pm8001_mpi_build_cmd 0 34746 NULL ++i9xx_pipe_crc_ctl_reg_34748 i9xx_pipe_crc_ctl_reg 0 34748 NULL ++ext4_sync_parent_34750 ext4_sync_parent 0 34750 NULL nohasharray ++store_nservers_34750 store_nservers 0-4 34750 &ext4_sync_parent_34750 ++solos_param_store_34755 solos_param_store 0-4 34755 NULL nohasharray ++lsm_alloc_plain_34755 lsm_alloc_plain 1 34755 &solos_param_store_34755 ++i2400m_change_mtu_34758 i2400m_change_mtu 0 34758 NULL ++bootmode_store_34762 bootmode_store 4-0 34762 NULL ++device_add_34766 device_add 0 34766 NULL ++__iio_device_attr_init_34767 __iio_device_attr_init 0 34767 NULL ++gsmld_read_34768 gsmld_read 0 34768 NULL ++pipe_read_34776 pipe_read 0 34776 NULL ++qib_cdev_init_34778 qib_cdev_init 1 34778 NULL ++vga16fb_check_var_34784 vga16fb_check_var 0 34784 NULL ++show_spd_enb_34787 show_spd_enb 0 34787 NULL ++iscsi_stat_instance_show_attr_version_34789 iscsi_stat_instance_show_attr_version 0 34789 NULL ++iwl_set_temperature_offset_calib_v2_34794 iwl_set_temperature_offset_calib_v2 0 34794 NULL ++ext3_direct_IO_34798 ext3_direct_IO 4-0 34798 NULL ++SYSC_keyctl_34800 SYSC_keyctl 4 34800 NULL ++can_nocow_extent_34801 can_nocow_extent 2 34801 NULL ++xadc_zynq_write_adc_reg_34803 xadc_zynq_write_adc_reg 0 34803 NULL ++drbd_get_max_capacity_34804 drbd_get_max_capacity 0 34804 NULL ++intel_sdvo_ddc_proxy_xfer_34805 intel_sdvo_ddc_proxy_xfer 0-3 34805 NULL ++ll_setxattr_34806 ll_setxattr 4 34806 NULL ++show_in5_34809 show_in5 0 34809 NULL ++tda18218_get_if_frequency_34810 tda18218_get_if_frequency 0 34810 NULL ++bh1770_get_lux_thresh_above_34814 bh1770_get_lux_thresh_above 0 34814 NULL nohasharray ++iwl_phy_db_send_all_channel_groups_34814 iwl_phy_db_send_all_channel_groups 0 34814 &bh1770_get_lux_thresh_above_34814 ++stream_drop_34819 stream_drop 0 34819 NULL ++ext3_force_commit_34823 ext3_force_commit 0 34823 NULL ++cdc_ncm_show_tx_max_34824 cdc_ncm_show_tx_max 0 34824 NULL ++anx9805_xfer_34828 anx9805_xfer 0-3 34828 NULL ++bio_segments_34832 bio_segments 0 34832 NULL ++i2c_dw_xfer_34833 i2c_dw_xfer 0-3 34833 NULL ++charger_get_property_34836 charger_get_property 0 34836 NULL ++b43_debugfs_write_34838 b43_debugfs_write 3-0 34838 NULL nohasharray ++show_fnode_is_boot_target_34838 show_fnode_is_boot_target 0 34838 &b43_debugfs_write_34838 ++check_bandwidth_34841 check_bandwidth 0 34841 NULL ++palmas_rtc_alarm_irq_enable_34842 palmas_rtc_alarm_irq_enable 0 34842 NULL ++show_weight_temp_34843 show_weight_temp 0 34843 NULL ++dev_set_allmulti_34844 dev_set_allmulti 0 34844 NULL nohasharray ++sb1000_open_34844 sb1000_open 0 34844 &dev_set_allmulti_34844 ++acpi_system_write_wakeup_device_34853 acpi_system_write_wakeup_device 3-0 34853 NULL ++zd_chip_unlock_phy_regs_34854 zd_chip_unlock_phy_regs 0 34854 NULL ++cafe_smbus_xfer_34855 cafe_smbus_xfer 0 34855 NULL ++usb_serial_generic_prepare_write_buffer_34857 usb_serial_generic_prepare_write_buffer 3 34857 NULL nohasharray ++netdev_notify_34857 netdev_notify 0 34857 &usb_serial_generic_prepare_write_buffer_34857 ++atl1c_open_34858 atl1c_open 0 34858 NULL nohasharray ++ad7266_postdisable_34858 ad7266_postdisable 0 34858 &atl1c_open_34858 ++pci_slot_attr_show_34863 pci_slot_attr_show 0 34863 NULL ++memcpy_count_show_34867 memcpy_count_show 0 34867 NULL ++ieee80211_if_read_txpower_34871 ieee80211_if_read_txpower 3-0 34871 NULL ++crypto_ahash_op_34874 crypto_ahash_op 0 34874 NULL ++__elan_update_firmware_34875 __elan_update_firmware 0 34875 NULL ++osst_first_data_ppos_show_34877 osst_first_data_ppos_show 0 34877 NULL ++dev_configure_alt_34879 dev_configure_alt 0 34879 NULL ++show_ata_dev_dma_mode_34880 show_ata_dev_dma_mode 0 34880 NULL ++radix_tree_preload_34882 radix_tree_preload 0 34882 NULL ++nfs4_get_acl_uncached_34883 nfs4_get_acl_uncached 0 34883 NULL ++atl2_get_regs_len_34886 atl2_get_regs_len 0 34886 NULL ++adfs_f_read_34887 adfs_f_read 0 34887 NULL nohasharray ++b43_chip_init_34887 b43_chip_init 0 34887 &adfs_f_read_34887 ++msg_print_text_34889 msg_print_text 0 34889 NULL nohasharray ++sw_activity_show_34889 sw_activity_show 0 34889 &msg_print_text_34889 ++irda_getname_34892 irda_getname 0 34892 NULL nohasharray ++nct7802_write_fan_min_34892 nct7802_write_fan_min 0 34892 &irda_getname_34892 ++ieee80211_if_write_34894 ieee80211_if_write 3-0 34894 NULL nohasharray ++write_orph_nodes_34894 write_orph_nodes 0 34894 &ieee80211_if_write_34894 ++__hfs_ext_write_extent_34897 __hfs_ext_write_extent 0 34897 NULL ++br_nf_pre_routing_34899 br_nf_pre_routing 0 34899 NULL nohasharray ++pci_user_read_config_byte_34899 pci_user_read_config_byte 0 34899 &br_nf_pre_routing_34899 ++rfcomm_sock_create_34901 rfcomm_sock_create 0 34901 NULL ++set_temp_max1_34902 set_temp_max1 0-4 34902 NULL ++show_ata_link_hw_sata_spd_limit_34903 show_ata_link_hw_sata_spd_limit 0 34903 NULL ++fore200e_open_34904 fore200e_open 0 34904 NULL nohasharray ++set_channel_34904 set_channel 0 34904 &fore200e_open_34904 ++fc0011_vcocal_read_34906 fc0011_vcocal_read 0 34906 NULL ++clear_wdm_read_flag_34910 clear_wdm_read_flag 0 34910 NULL nohasharray ++find_free_extent_34910 find_free_extent 0 34910 &clear_wdm_read_flag_34910 ++x25_create_34911 x25_create 0 34911 NULL nohasharray ++no_lun_0_store_34911 no_lun_0_store 0-3 34911 &x25_create_34911 ++gfs2_glock_wait_34913 gfs2_glock_wait 0 34913 NULL nohasharray ++mmc_ffu_capable_show_34913 mmc_ffu_capable_show 0 34913 &gfs2_glock_wait_34913 ++amd_ec_wait_write_34914 amd_ec_wait_write 0 34914 NULL ++si476x_radio_read_rsq_primary_blob_34916 si476x_radio_read_rsq_primary_blob 3-0 34916 NULL nohasharray ++hci_sock_getname_34916 hci_sock_getname 0 34916 &si476x_radio_read_rsq_primary_blob_34916 nohasharray ++niu_init_pcs_34916 niu_init_pcs 0 34916 &hci_sock_getname_34916 nohasharray ++arcmsr_adjust_disk_queue_depth_34916 arcmsr_adjust_disk_queue_depth 0-2 34916 &niu_init_pcs_34916 nohasharray ++write_msg_34916 write_msg 3 34916 &arcmsr_adjust_disk_queue_depth_34916 ++michael_setkey_34918 michael_setkey 0 34918 NULL ++ath10k_htc_connect_service_34924 ath10k_htc_connect_service 0 34924 NULL ++__inode_permission_34925 __inode_permission 0 34925 NULL nohasharray ++netevent_cb_34925 netevent_cb 0 34925 &__inode_permission_34925 ++hrz_proc_read_34935 hrz_proc_read 0 34935 NULL ++snd_info_entry_read_34938 snd_info_entry_read 3-0 34938 NULL ++i2c_dw_wait_bus_not_busy_34943 i2c_dw_wait_bus_not_busy 0 34943 NULL nohasharray ++rdev_size_store_34943 rdev_size_store 0-3 34943 &i2c_dw_wait_bus_not_busy_34943 ++wait_comp_34945 wait_comp 0 34945 NULL ++compat_SyS_kexec_load_34947 compat_SyS_kexec_load 2 34947 NULL ++show_max_uA_34951 show_max_uA 0 34951 NULL ++raid1_reshape_34957 raid1_reshape 0 34957 NULL ++i2c_transfer_34958 i2c_transfer 0-3 34958 NULL nohasharray ++skb_gro_header_slow_34958 skb_gro_header_slow 2 34958 &i2c_transfer_34958 ++wusb_dnts_store_34968 wusb_dnts_store 0-4 34968 NULL ++rawv6_init_sk_34969 rawv6_init_sk 0 34969 NULL ++qlcnic_sysfs_write_crb_34974 qlcnic_sysfs_write_crb 0-6-5 34974 NULL ++edge_show_34977 edge_show 0 34977 NULL ++vendor_command_34980 vendor_command 0 34980 NULL ++mce_cpu_callback_34983 mce_cpu_callback 0 34983 NULL ++get_icons_34984 get_icons 0 34984 NULL ++gadget_config_name_configuration_show_34991 gadget_config_name_configuration_show 0 34991 NULL ++uwb_rc_ie_rm_34993 uwb_rc_ie_rm 0 34993 NULL ++alb_handle_addr_collision_on_attach_34994 alb_handle_addr_collision_on_attach 0 34994 NULL ++_ctl_fw_queue_depth_show_34996 _ctl_fw_queue_depth_show 0 34996 NULL nohasharray ++schedule_erase_34996 schedule_erase 0 34996 &_ctl_fw_queue_depth_show_34996 nohasharray ++snd_ctl_dev_register_34996 snd_ctl_dev_register 0 34996 &schedule_erase_34996 ++print_message_35000 print_message 0 35000 NULL ++aac_store_reset_adapter_35001 aac_store_reset_adapter 0-4 35001 NULL ++rx_rx_hdr_overflow_read_35002 rx_rx_hdr_overflow_read 3-0 35002 NULL nohasharray ++wusb_oob_mic_35002 wusb_oob_mic 0 35002 &rx_rx_hdr_overflow_read_35002 ++l2cap_skbuff_fromiovec_35003 l2cap_skbuff_fromiovec 4-3 35003 NULL nohasharray ++mlx4_en_create_cq_35003 mlx4_en_create_cq 3 35003 &l2cap_skbuff_fromiovec_35003 ++apei_exec_write_register_35004 apei_exec_write_register 0 35004 NULL ++show_fnode_initial_r2t_35005 show_fnode_initial_r2t 0 35005 NULL ++apds990x_rate_show_35006 apds990x_rate_show 0 35006 NULL ++ark3116_open_35007 ark3116_open 0 35007 NULL ++sysfs_mbox_read_35008 sysfs_mbox_read 0-5-6 35008 NULL ++vlsi_create_hwif_35012 vlsi_create_hwif 0 35012 NULL ++htu21_update_measurements_35014 htu21_update_measurements 0 35014 NULL ++sisusb_copy_memory_35016 sisusb_copy_memory 4 35016 NULL ++tm_attr_store_35022 tm_attr_store 0-3 35022 NULL ++setup_sge_qsets_35026 setup_sge_qsets 0 35026 NULL ++osi_load_firmware_35027 osi_load_firmware 0 35027 NULL ++ivtv_yuv_prep_user_dma_35028 ivtv_yuv_prep_user_dma 0 35028 NULL ++coda_psdev_read_35029 coda_psdev_read 3-0 35029 NULL ++max8998_ldo_enable_35030 max8998_ldo_enable 0 35030 NULL ++iscsi_stat_login_show_attr_negotiate_fails_35033 iscsi_stat_login_show_attr_negotiate_fails 0 35033 NULL ++stmmac_open_35034 stmmac_open 0 35034 NULL ++ipath_f_early_init_35036 ipath_f_early_init 0 35036 NULL ++hwdep_read_locked_35037 hwdep_read_locked 3 35037 NULL ++tpm_tis_recv_35038 tpm_tis_recv 0-3 35038 NULL ++proc_setgroups_write_35039 proc_setgroups_write 3-0 35039 NULL ++bq24190_read_mask_35048 bq24190_read_mask 0 35048 NULL ++xfs_rtallocate_extent_35052 xfs_rtallocate_extent 0 35052 NULL ++s2mps11_clk_prepare_35058 s2mps11_clk_prepare 0 35058 NULL nohasharray ++wl1271_init_energy_detection_35058 wl1271_init_energy_detection 0 35058 &s2mps11_clk_prepare_35058 ++tpm_unseal_35060 tpm_unseal 0 35060 NULL ++pwr_connection_out_of_sync_read_35061 pwr_connection_out_of_sync_read 3-0 35061 NULL nohasharray ++ks_net_open_35061 ks_net_open 0 35061 &pwr_connection_out_of_sync_read_35061 ++mmc_prv_show_35065 mmc_prv_show 0 35065 NULL nohasharray ++show_auto_pwm_35065 show_auto_pwm 0 35065 &mmc_prv_show_35065 ++read_dsunc_35067 read_dsunc 0 35067 NULL ++fat_file_fsync_35072 fat_file_fsync 0 35072 NULL ++cgroup_subtree_control_write_35077 cgroup_subtree_control_write 0-3 35077 NULL ++input_dev_show_cap_ev_35082 input_dev_show_cap_ev 0 35082 NULL ++ntfs_attr_extend_initialized_35084 ntfs_attr_extend_initialized 0 35084 NULL ++show_sas_rphy_initiator_port_protocols_35090 show_sas_rphy_initiator_port_protocols 0 35090 NULL ++create_35091 create 0 35091 NULL ++power_35094 power 0 35094 NULL ++cifs_sign_rqst_35096 cifs_sign_rqst 0 35096 NULL ++transmit_35097 transmit 0 35097 NULL nohasharray ++adis_write_reg_35097 adis_write_reg 0 35097 &transmit_35097 ++capi_write_35104 capi_write 3-0 35104 NULL nohasharray ++tx_tx_done_template_read_35104 tx_tx_done_template_read 3-0 35104 &capi_write_35104 nohasharray ++hci_recv_frame_35104 hci_recv_frame 0 35104 &tx_tx_done_template_read_35104 nohasharray ++ds2780_set_control_register_35104 ds2780_set_control_register 0 35104 &hci_recv_frame_35104 ++ov7670_s_vflip_35106 ov7670_s_vflip 0 35106 NULL nohasharray ++store_bridge_parm_35106 store_bridge_parm 0-3 35106 &ov7670_s_vflip_35106 ++mt9m001_g_fmt_35107 mt9m001_g_fmt 0 35107 NULL ++ide_settings_proc_write_35110 ide_settings_proc_write 3-0 35110 NULL ++calibrate_35111 calibrate 0 35111 NULL ++pre_xfer_35114 pre_xfer 0 35114 NULL ++nla_alloc_flow_actions_35115 nla_alloc_flow_actions 1 35115 NULL ++show_alarms_temp_35119 show_alarms_temp 0 35119 NULL ++mantis_i2c_xfer_35131 mantis_i2c_xfer 0-3 35131 NULL nohasharray ++show_fw_ver_35131 show_fw_ver 0 35131 &mantis_i2c_xfer_35131 nohasharray ++mwifiex_cmd_tx_power_cfg_35131 mwifiex_cmd_tx_power_cfg 0 35131 &show_fw_ver_35131 ++tpm_tis_i2c_send_35141 tpm_tis_i2c_send 0-3 35141 NULL ++ceph_get_caps_35144 ceph_get_caps 0 35144 NULL ++gntdev_alloc_map_35145 gntdev_alloc_map 2 35145 NULL ++hdcs_set_gains_35149 hdcs_set_gains 0 35149 NULL nohasharray ++jfs_writepages_35149 jfs_writepages 0 35149 &hdcs_set_gains_35149 ++__iscsi_disc_show_userid_35151 __iscsi_disc_show_userid 0 35151 NULL ++async_store_35157 async_store 0-4 35157 NULL ++message_stats_print_35158 message_stats_print 6 35158 NULL nohasharray ++xhci_set_usb2_hardware_lpm_35158 xhci_set_usb2_hardware_lpm 0 35158 &message_stats_print_35158 ++iscsi_conn_setup_35159 iscsi_conn_setup 2 35159 NULL nohasharray ++vringh_iov_push_user_35159 vringh_iov_push_user 3 35159 &iscsi_conn_setup_35159 ++ieee80211_if_read_bssid_35161 ieee80211_if_read_bssid 3-0 35161 NULL ++input_dev_show_cap_key_35162 input_dev_show_cap_key 0 35162 NULL ++cpumask_parse_user_35173 cpumask_parse_user 0 35173 NULL ++solo_v4l2_init_35179 solo_v4l2_init 2 35179 NULL ++SyS_init_module_35180 SyS_init_module 2 35180 NULL ++show_counter_rx_p6_hdr_egr_ovfls_35186 show_counter_rx_p6_hdr_egr_ovfls 0 35186 NULL ++serial_show_35187 serial_show 0 35187 NULL ++vmci_send_datagram_35190 vmci_send_datagram 0 35190 NULL nohasharray ++il3945_mac_sta_add_35190 il3945_mac_sta_add 0 35190 &vmci_send_datagram_35190 ++ts2020_set_params_35192 ts2020_set_params 0 35192 NULL nohasharray ++rocker_group_l2_interface_35192 rocker_group_l2_interface 0 35192 &ts2020_set_params_35192 nohasharray ++atm_dev_event_35192 atm_dev_event 0 35192 &rocker_group_l2_interface_35192 ++netlbl_unlhsh_add_35198 netlbl_unlhsh_add 0 35198 NULL nohasharray ++iwl_nvm_read_chunk_35198 iwl_nvm_read_chunk 0 35198 &netlbl_unlhsh_add_35198 ++si470x_s_ctrl_35200 si470x_s_ctrl 0 35200 NULL nohasharray ++rtc_tm_to_time_35200 rtc_tm_to_time 0 35200 &si470x_s_ctrl_35200 ++qib_tid_update_35202 qib_tid_update 0 35202 NULL ++compat_SyS_pselect6_35203 compat_SyS_pselect6 1 35203 NULL ++unix_stream_recvmsg_35210 unix_stream_recvmsg 0-4 35210 NULL ++lpfc_oas_lun_state_store_35214 lpfc_oas_lun_state_store 0-4 35214 NULL ++_osd_req_alist_elem_size_35216 _osd_req_alist_elem_size 0-2 35216 NULL ++vmci_datagram_dispatch_35217 vmci_datagram_dispatch 0 35217 NULL ++security_key_getsecurity_35218 security_key_getsecurity 0 35218 NULL nohasharray ++striped_read_35218 striped_read 0-2 35218 &security_key_getsecurity_35218 ++video_register_device_no_warn_35226 video_register_device_no_warn 3 35226 NULL nohasharray ++rx_rx_cmplt_task_read_35226 rx_rx_cmplt_task_read 3-0 35226 &video_register_device_no_warn_35226 ++qt2_set_port_config_35231 qt2_set_port_config 0 35231 NULL ++kimage_file_prepare_segments_35232 kimage_file_prepare_segments 5 35232 NULL nohasharray ++snd_m3_pcm_start_35232 snd_m3_pcm_start 0 35232 &kimage_file_prepare_segments_35232 ++get_a_bus_drop_35233 get_a_bus_drop 0 35233 NULL ++sunrpc_cache_register_pipefs_35235 sunrpc_cache_register_pipefs 0 35235 NULL ++c2port_show_flash_block_size_35238 c2port_show_flash_block_size 0 35238 NULL nohasharray ++queue_store_nonrot_35238 queue_store_nonrot 3-0 35238 &c2port_show_flash_block_size_35238 ++show_localbus_info_35239 show_localbus_info 0 35239 NULL ++acpi_ns_get_node_35242 acpi_ns_get_node 0 35242 NULL nohasharray ++ds1343_update_alarm_35242 ds1343_update_alarm 0 35242 &acpi_ns_get_node_35242 ++can_led_notifier_35246 can_led_notifier 0 35246 NULL ++tpm_nsc_recv_35247 tpm_nsc_recv 0-3 35247 NULL ++set_fd_set_35249 set_fd_set 1 35249 NULL nohasharray ++bd2802_store_reg0x10_35249 bd2802_store_reg0x10 0-4 35249 &set_fd_set_35249 ++reiserfs_acl_chmod_35250 reiserfs_acl_chmod 0 35250 NULL ++ima_inode_setxattr_35255 ima_inode_setxattr 0 35255 NULL ++show_ipv4_iface_ipaddress_35257 show_ipv4_iface_ipaddress 0 35257 NULL ++show_iface_bidi_chap_35263 show_iface_bidi_chap 0 35263 NULL nohasharray ++jbd2_journal_get_write_access_35263 jbd2_journal_get_write_access 0 35263 &show_iface_bidi_chap_35263 ++dma_show_regs_35266 dma_show_regs 3-0 35266 NULL nohasharray ++ca0110_parse_auto_config_35266 ca0110_parse_auto_config 0 35266 &dma_show_regs_35266 ++choose_port_ctxt_35271 choose_port_ctxt 0 35271 NULL ++irda_recvmsg_stream_35280 irda_recvmsg_stream 0-4 35280 NULL ++gpio_active_low_show_35281 gpio_active_low_show 0 35281 NULL nohasharray ++ath10k_htt_setup_35281 ath10k_htt_setup 0 35281 &gpio_active_low_show_35281 ++inv_attr_show_35282 inv_attr_show 0 35282 NULL nohasharray ++i2o_block_end_request_35282 i2o_block_end_request 3 35282 &inv_attr_show_35282 nohasharray ++__stop_cpus_35282 __stop_cpus 0 35282 &i2o_block_end_request_35282 nohasharray ++set_in_max_35282 set_in_max 0-4 35282 &__stop_cpus_35282 ++nvkm_notify_init_35283 nvkm_notify_init 7 35283 NULL nohasharray ++isr_rx_rdys_read_35283 isr_rx_rdys_read 3-0 35283 &nvkm_notify_init_35283 ++shadow_rd16_35287 shadow_rd16 2 35287 NULL ++nvif_object_ioctl_35292 nvif_object_ioctl 0 35292 NULL ++qla2x00_sysfs_read_fw_dump_template_35296 qla2x00_sysfs_read_fw_dump_template 6-0-5 35296 NULL ++btrfs_map_bio_35300 btrfs_map_bio 0 35300 NULL ++fuse_dev_do_read_35308 fuse_dev_do_read 0 35308 NULL ++__btrfs_buffered_write_35311 __btrfs_buffered_write 3-0 35311 NULL nohasharray ++ieee80211_add_virtual_monitor_35311 ieee80211_add_virtual_monitor 0 35311 &__btrfs_buffered_write_35311 ++iscsi_tpg_param_show_DataPDUInOrder_35312 iscsi_tpg_param_show_DataPDUInOrder 0 35312 NULL nohasharray ++tracing_read_pipe_35312 tracing_read_pipe 3 35312 &iscsi_tpg_param_show_DataPDUInOrder_35312 ++show_35313 show 0 35313 NULL ++ifindex_show_35314 ifindex_show 0 35314 NULL ++vpd_use_hostno_show_35318 vpd_use_hostno_show 0 35318 NULL nohasharray ++show_pwm_auto_point_pwm_35318 show_pwm_auto_point_pwm 0 35318 &vpd_use_hostno_show_35318 ++sys_setsockopt_35320 sys_setsockopt 5 35320 NULL ++dmi_sysfs_entry_position_35322 dmi_sysfs_entry_position 0 35322 NULL ++sta_tx_latency_stat_write_35323 sta_tx_latency_stat_write 3-0 35323 NULL ++mt2060_set_params_35325 mt2060_set_params 0 35325 NULL ++show_comp_vector_35327 show_comp_vector 0 35327 NULL ++write_page_35331 write_page 0 35331 NULL ++fallback_on_nodma_alloc_35332 fallback_on_nodma_alloc 2 35332 NULL nohasharray ++cbus_i2c_smbus_xfer_35332 cbus_i2c_smbus_xfer 0 35332 &fallback_on_nodma_alloc_35332 nohasharray ++ivtv_s_audio_mode_35332 ivtv_s_audio_mode 0 35332 &cbus_i2c_smbus_xfer_35332 ++xfs_btree_check_lblock_35333 xfs_btree_check_lblock 0 35333 NULL nohasharray ++aa_set_current_onexec_35333 aa_set_current_onexec 0 35333 &xfs_btree_check_lblock_35333 ++pskb_network_may_pull_35336 pskb_network_may_pull 2 35336 NULL ++mlx4_alloc_hwq_res_35339 mlx4_alloc_hwq_res 3 35339 NULL ++nilfs_dev_volume_name_show_35340 nilfs_dev_volume_name_show 0 35340 NULL ++arvo_sysfs_set_actual_profile_35345 arvo_sysfs_set_actual_profile 0-4 35345 NULL ++__wlcore_cmd_send_35346 __wlcore_cmd_send 0 35346 NULL ++ieee80211_if_fmt_ap_power_level_35347 ieee80211_if_fmt_ap_power_level 3 35347 NULL nohasharray ++wl1271_cmd_send_35347 wl1271_cmd_send 0 35347 &ieee80211_if_fmt_ap_power_level_35347 ++nouveau_devinit_create__35348 nouveau_devinit_create_ 4 35348 NULL ++hpi_alloc_control_cache_35351 hpi_alloc_control_cache 1 35351 NULL nohasharray ++show_state_target_residency_35351 show_state_target_residency 0 35351 &hpi_alloc_control_cache_35351 ++enic_set_mac_address_35354 enic_set_mac_address 0 35354 NULL ++wacom_led1_select_show_35356 wacom_led1_select_show 0 35356 NULL ++ath10k_debug_fw_assert_35359 ath10k_debug_fw_assert 0 35359 NULL nohasharray ++power_restore_35359 power_restore 0 35359 &ath10k_debug_fw_assert_35359 ++snd_cs46xx_playback_trigger_35361 snd_cs46xx_playback_trigger 0 35361 NULL ++set_chglim_35363 set_chglim 0-4 35363 NULL ++show_priv_session_recovery_tmo_35371 show_priv_session_recovery_tmo 0 35371 NULL ++read_kmem_35372 read_kmem 3-0 35372 NULL nohasharray ++link_mode_show_35372 link_mode_show 0 35372 &read_kmem_35372 ++reserved_clusters_store_35375 reserved_clusters_store 0-4 35375 NULL ++queue_rq_affinity_store_35376 queue_rq_affinity_store 3-0 35376 NULL ++memcpy_from_msg_35380 memcpy_from_msg 3 35380 NULL nohasharray ++snd_pcm_do_start_35380 snd_pcm_do_start 0 35380 &memcpy_from_msg_35380 ++show_pwmenable_35381 show_pwmenable 0 35381 NULL ++iwlagn_mac_start_35383 iwlagn_mac_start 0 35383 NULL ++debug_cow_show_35384 debug_cow_show 0 35384 NULL ++init_35395 init 0 35395 NULL ++store_35397 store 0-4 35397 NULL ++xfs_da3_root_split_35398 xfs_da3_root_split 0 35398 NULL ++padlock_sha1_final_35403 padlock_sha1_final 0 35403 NULL ++btrfs_search_old_slot_35406 btrfs_search_old_slot 0 35406 NULL ++SyS_getxattr_35408 SyS_getxattr 4 35408 NULL ++pxa168_eth_open_35410 pxa168_eth_open 0 35410 NULL ++target_stat_scsi_tgt_port_attr_show_35416 target_stat_scsi_tgt_port_attr_show 0 35416 NULL ++show_fnode_tcp_timestamp_enable_35417 show_fnode_tcp_timestamp_enable 0 35417 NULL nohasharray ++show_fc_rport_dev_loss_tmo_35417 show_fc_rport_dev_loss_tmo 0 35417 &show_fnode_tcp_timestamp_enable_35417 ++nouveau_hwmon_set_pwm1_35421 nouveau_hwmon_set_pwm1 0-4 35421 NULL ++show_eeprom0_35422 show_eeprom0 0 35422 NULL ++show_fault_35423 show_fault 0 35423 NULL nohasharray ++bnad_change_mtu_35423 bnad_change_mtu 0 35423 &show_fault_35423 ++rawv6_send_hdrinc_35425 rawv6_send_hdrinc 3 35425 NULL ++xc2028_set_params_35426 xc2028_set_params 0 35426 NULL ++iwl_dbgfs_drv_rx_stats_read_35430 iwl_dbgfs_drv_rx_stats_read 3-0 35430 NULL ++firm_purge_35431 firm_purge 0 35431 NULL ++C_SYSC_sendfile_35432 C_SYSC_sendfile 4 35432 NULL nohasharray ++pep_init_35432 pep_init 0 35432 &C_SYSC_sendfile_35432 ++__set_test_and_free_35436 __set_test_and_free 2 35436 NULL ++dwc3_gadget_set_xfer_resource_35437 dwc3_gadget_set_xfer_resource 0 35437 NULL nohasharray ++set_num_temp_sensors_35437 set_num_temp_sensors 0-4 35437 &dwc3_gadget_set_xfer_resource_35437 ++buffer_to_user_35439 buffer_to_user 3 35439 NULL ++iscsi_tpg_param_store_HeaderDigest_35440 iscsi_tpg_param_store_HeaderDigest 0-3 35440 NULL ++adp8870_bl_l2_bright_max_show_35446 adp8870_bl_l2_bright_max_show 0 35446 NULL ++pci_siig_init_35448 pci_siig_init 0 35448 NULL ++bq24190_read_35453 bq24190_read 0 35453 NULL ++rdev_get_id_35454 rdev_get_id 0 35454 NULL ++asiliantfb_set_par_35455 asiliantfb_set_par 0 35455 NULL ++frame_ready_nolock_35459 frame_ready_nolock 0 35459 NULL ++efx_mcdi_rpc_async_quiet_35460 efx_mcdi_rpc_async_quiet 4-5 35460 NULL ++vmxnet3_change_mtu_35464 vmxnet3_change_mtu 0 35464 NULL ++rndis_filter_open_device_35471 rndis_filter_open_device 0 35471 NULL ++palmas_rtc_set_alarm_35472 palmas_rtc_set_alarm 0 35472 NULL ++ds2780_get_sense_resistor_value_35477 ds2780_get_sense_resistor_value 0 35477 NULL nohasharray ++mlog_mask_show_35477 mlog_mask_show 0 35477 &ds2780_get_sense_resistor_value_35477 ++dlm_user_purge_35479 dlm_user_purge 0 35479 NULL nohasharray ++attention_write_file_35479 attention_write_file 0-3 35479 &dlm_user_purge_35479 ++show_eeprom4_35483 show_eeprom4 0 35483 NULL ++store_comm_35484 store_comm 0-4 35484 NULL ++go7007_queue_setup_35485 go7007_queue_setup 0 35485 NULL ++sis630_access_35490 sis630_access 0 35490 NULL ++show_frontswap_hysteresis_35496 show_frontswap_hysteresis 0 35496 NULL nohasharray ++show_35496 show 0 35496 &show_frontswap_hysteresis_35496 nohasharray ++ft_wwn_store_35496 ft_wwn_store 0 35496 &show_35496 ++iwl_read_prph_35502 iwl_read_prph 0 35502 NULL ++ray_dev_init_35505 ray_dev_init 0 35505 NULL ++cs421x_init_35506 cs421x_init 0 35506 NULL ++ceph_vxattrcb_layout_35507 ceph_vxattrcb_layout 0 35507 NULL ++hints_store_35510 hints_store 0-4 35510 NULL ++irlan_eth_open_35511 irlan_eth_open 0 35511 NULL nohasharray ++mlx4_qp_alloc_icm_35511 mlx4_qp_alloc_icm 0 35511 &irlan_eth_open_35511 ++ath10k_wmi_peer_delete_35514 ath10k_wmi_peer_delete 0 35514 NULL ++show_tolerance3_35515 show_tolerance3 0 35515 NULL ++slave_enable_netpoll_35519 slave_enable_netpoll 0 35519 NULL ++async_setkey_35521 async_setkey 3 35521 NULL ++max8925_rtc_read_time_35525 max8925_rtc_read_time 0 35525 NULL ++__filemap_fdatawrite_range_35528 __filemap_fdatawrite_range 0 35528 NULL ++show_fan_max_output_35529 show_fan_max_output 0 35529 NULL ++nfs_readpage_async_35533 nfs_readpage_async 0 35533 NULL ++iwl_dbgfs_bt_traffic_read_35534 iwl_dbgfs_bt_traffic_read 3-0 35534 NULL ++pstore_mkfile_35536 pstore_mkfile 7 35536 NULL ++rxpipe_tx_xfr_host_int_trig_rx_data_read_35538 rxpipe_tx_xfr_host_int_trig_rx_data_read 3-0 35538 NULL nohasharray ++pin_pagetable_pfn_35538 pin_pagetable_pfn 2 35538 &rxpipe_tx_xfr_host_int_trig_rx_data_read_35538 ++store_channel_35540 store_channel 0-4 35540 NULL ++sony_nc_sysfs_store_35541 sony_nc_sysfs_store 0-4 35541 NULL ++ieee80211_if_write_smps_35550 ieee80211_if_write_smps 3-0 35550 NULL ++set_update_interval_35558 set_update_interval 0-4 35558 NULL ++vb2_dqbuf_35559 vb2_dqbuf 0 35559 NULL nohasharray ++bnx2i_cpu_callback_35559 bnx2i_cpu_callback 0 35559 &vb2_dqbuf_35559 ++rocker_dma_rx_ring_skb_alloc_35560 rocker_dma_rx_ring_skb_alloc 0 35560 NULL ++video_outputsw_get_35564 video_outputsw_get 0 35564 NULL ++C_SYSC_kexec_load_35565 C_SYSC_kexec_load 2 35565 NULL ++sq905c_command_35566 sq905c_command 0 35566 NULL ++dev_alloc_name_ns_35569 dev_alloc_name_ns 0 35569 NULL ++bpf_convert_filter_35571 bpf_convert_filter 2 35571 NULL ++update_size_35574 update_size 0 35574 NULL ++ext2_acl_from_disk_35580 ext2_acl_from_disk 2 35580 NULL ++store_selfballoon_min_usable_mb_35582 store_selfballoon_min_usable_mb 0-4 35582 NULL ++cw1200_setup_mac_35584 cw1200_setup_mac 0 35584 NULL ++get_wireless_state_ec_standard_35585 get_wireless_state_ec_standard 0 35585 NULL ++spk_msg_set_35586 spk_msg_set 3 35586 NULL ++qla2x00_sysfs_read_dcbx_tlv_35589 qla2x00_sysfs_read_dcbx_tlv 0-6-5 35589 NULL ++ext2_listxattr_35593 ext2_listxattr 0-3 35593 NULL ++new_rsb_count_read_35594 new_rsb_count_read 0 35594 NULL ++__uncore_match_opc_show_35599 __uncore_match_opc_show 0 35599 NULL ++usb_8dev_start_35601 usb_8dev_start 0 35601 NULL ++hrtimer_cpu_notify_35604 hrtimer_cpu_notify 0 35604 NULL nohasharray ++ReadZReg_35604 ReadZReg 0 35604 &hrtimer_cpu_notify_35604 ++keyspan_pda_open_35605 keyspan_pda_open 0 35605 NULL nohasharray ++show_lmc_35605 show_lmc 0 35605 &keyspan_pda_open_35605 ++ceph_writepage_35610 ceph_writepage 0 35610 NULL ++smack_socket_post_create_35616 smack_socket_post_create 0 35616 NULL ++kernel_readv_35617 kernel_readv 3-0 35617 NULL ++t4vf_enable_vi_35621 t4vf_enable_vi 0 35621 NULL ++nilfs_commit_super_35622 nilfs_commit_super 0 35622 NULL ++ixgbe_pci_sriov_configure_35624 ixgbe_pci_sriov_configure 0-2 35624 NULL ++reiserfs_readpages_35629 reiserfs_readpages 4 35629 NULL ++snd_hdspm_reset_35635 snd_hdspm_reset 0 35635 NULL ++elan_sysfs_read_fw_checksum_35636 elan_sysfs_read_fw_checksum 0 35636 NULL ++nv50_vm_create_35643 nv50_vm_create 2-3 35643 NULL ++nfs_dns_parse_35646 nfs_dns_parse 0 35646 NULL ++cfq_fifo_expire_async_store_35650 cfq_fifo_expire_async_store 3-0 35650 NULL ++spi_register_board_info_35651 spi_register_board_info 2 35651 NULL ++show_sched5_35655 show_sched5 0 35655 NULL ++regmap_update_bits_35668 regmap_update_bits 0 35668 NULL ++request_lock_35670 request_lock 0 35670 NULL ++bh1770_lux_calib_show_35671 bh1770_lux_calib_show 0 35671 NULL ++sysfs_drvr_stat_data_read_35672 sysfs_drvr_stat_data_read 0-5-6 35672 NULL ++compat_sys_kexec_load_35674 compat_sys_kexec_load 2 35674 NULL nohasharray ++DMAbuf_getwrbuffer_35674 DMAbuf_getwrbuffer 0 35674 &compat_sys_kexec_load_35674 ++vb2_vmalloc_get_userptr_35677 vb2_vmalloc_get_userptr 3-2 35677 NULL ++__bnx2x_vlan_mac_execute_step_35681 __bnx2x_vlan_mac_execute_step 0 35681 NULL ++dif_show_35685 dif_show 0 35685 NULL ++ext3_mark_iloc_dirty_35686 ext3_mark_iloc_dirty 0 35686 NULL ++dm_table_create_35687 dm_table_create 3 35687 NULL ++SYSC_pwritev_35690 SYSC_pwritev 3 35690 NULL nohasharray ++snd_sb16_capture_prepare_35690 snd_sb16_capture_prepare 0 35690 &SYSC_pwritev_35690 ++rds_page_copy_user_35691 rds_page_copy_user 4 35691 NULL nohasharray ++p54_start_35691 p54_start 0 35691 &rds_page_copy_user_35691 ++cx2341x_s_ctrl_35698 cx2341x_s_ctrl 0 35698 NULL ++md_super_write_35703 md_super_write 4 35703 NULL ++ath10k_wmi_vdev_start_restart_35708 ath10k_wmi_vdev_start_restart 0 35708 NULL ++sctp_listen_start_35709 sctp_listen_start 0 35709 NULL ++bnx2_change_mac_addr_35722 bnx2_change_mac_addr 0 35722 NULL ++i2c_smbus_write_block_data_35723 i2c_smbus_write_block_data 0 35723 NULL ++vfio_fops_read_35733 vfio_fops_read 0-3 35733 NULL ++ipr_copy_ucode_buffer_35736 ipr_copy_ucode_buffer 0 35736 NULL ++read_35737 read 0 35737 NULL nohasharray ++sd_start_ov361x_35737 sd_start_ov361x 0 35737 &read_35737 ++vmci_qpair_peek_35740 vmci_qpair_peek 3 35740 NULL ++ext4_getattr_35741 ext4_getattr 0 35741 NULL ++mt9t112_init_camera_35742 mt9t112_init_camera 0 35742 NULL ++pci_enable_sriov_35745 pci_enable_sriov 0 35745 NULL ++type_show_35748 type_show 0 35748 NULL nohasharray ++queue_discard_granularity_show_35748 queue_discard_granularity_show 0 35748 &type_show_35748 ++qib_setup_eagerbufs_35758 qib_setup_eagerbufs 0 35758 NULL ++gfs2_setattr_35760 gfs2_setattr 0 35760 NULL ++iwl_dbgfs_disable_ht40_read_35761 iwl_dbgfs_disable_ht40_read 3-0 35761 NULL ++fan_pwm1_enable_store_35767 fan_pwm1_enable_store 0-4 35767 NULL ++cifs_launder_page_35770 cifs_launder_page 0 35770 NULL nohasharray ++store_temp_tolerance_35770 store_temp_tolerance 0-4 35770 &cifs_launder_page_35770 ++qlcnic_sriov_async_issue_cmd_35775 qlcnic_sriov_async_issue_cmd 0 35775 NULL ++arch_copy_kprobe_35783 arch_copy_kprobe 0 35783 NULL ++udf_alloc_i_data_35786 udf_alloc_i_data 2 35786 NULL nohasharray ++show_temp_critical_35786 show_temp_critical 0 35786 &udf_alloc_i_data_35786 ++bond_set_mac_address_35789 bond_set_mac_address 0 35789 NULL ++padlock_sha_export_nano_35792 padlock_sha_export_nano 0 35792 NULL ++governor_show_35794 governor_show 0 35794 NULL ++da9052_reg_read_35800 da9052_reg_read 0 35800 NULL ++alloc_netdev_mqs_35806 alloc_netdev_mqs 1 35806 NULL ++command_setcompressionparams_35809 command_setcompressionparams 0 35809 NULL ++csio_vport_delete_35815 csio_vport_delete 0 35815 NULL ++show_session_param_ISCSI_PARAM_IMM_DATA_EN_35823 show_session_param_ISCSI_PARAM_IMM_DATA_EN 0 35823 NULL ++pvr2_hdw_cpufw_get_35824 pvr2_hdw_cpufw_get 0-2-4 35824 NULL nohasharray ++SyS_recvfrom_35824 SyS_recvfrom 3 35824 &pvr2_hdw_cpufw_get_35824 ++zd_op_add_interface_35825 zd_op_add_interface 0 35825 NULL ++vlan_filtering_store_35826 vlan_filtering_store 4-0 35826 NULL nohasharray ++i40evf_set_mac_35826 i40evf_set_mac 0 35826 &vlan_filtering_store_35826 ++of_irq_to_resource_35827 of_irq_to_resource 2 35827 NULL ++cgroup_file_write_35828 cgroup_file_write 0-3 35828 NULL ++proc_sys_revalidate_35842 proc_sys_revalidate 0 35842 NULL ++log_debug_write_35845 log_debug_write 3-0 35845 NULL ++mp_set_gsi_attr_35852 mp_set_gsi_attr 1 35852 NULL ++tx_tx_cmplt_read_35854 tx_tx_cmplt_read 3-0 35854 NULL ++wl3501_open_35855 wl3501_open 0 35855 NULL ++mthca_buf_alloc_35861 mthca_buf_alloc 2 35861 NULL ++broadsheet_store_waveform_to_spiflash_35867 broadsheet_store_waveform_to_spiflash 0 35867 NULL ++num_parts_show_35868 num_parts_show 0 35868 NULL ++iscsi_tpg_attrib_store_netif_timeout_35870 iscsi_tpg_attrib_store_netif_timeout 0-3 35870 NULL ++fan_get_cur_state_35871 fan_get_cur_state 0 35871 NULL ++__snd_hda_jack_add_kctl_35872 __snd_hda_jack_add_kctl 0 35872 NULL ++tun_show_group_35875 tun_show_group 0 35875 NULL ++show_fatal_error_35879 show_fatal_error 0 35879 NULL ++mwifiex_get_debug_info_35880 mwifiex_get_debug_info 0 35880 NULL ++generic_pipe_buf_confirm_35881 generic_pipe_buf_confirm 0 35881 NULL ++sha384_ssse3_init_35883 sha384_ssse3_init 0 35883 NULL ++fuse_notify_35888 fuse_notify 0 35888 NULL ++ieee80211_if_fmt_dot11MeshRetryTimeout_35890 ieee80211_if_fmt_dot11MeshRetryTimeout 3 35890 NULL ++uwb_rc_cmd_done_35892 uwb_rc_cmd_done 4 35892 NULL ++vlan_passthru_hard_header_35894 vlan_passthru_hard_header 0 35894 NULL ++tcp_mark_head_lost_35895 tcp_mark_head_lost 2 35895 NULL ++saa7191_write_block_35906 saa7191_write_block 2 35906 NULL ++rcar_vin_get_formats_35908 rcar_vin_get_formats 0 35908 NULL ++cow_file_range_async_35912 cow_file_range_async 0 35912 NULL nohasharray ++igmpv3_newpack_35912 igmpv3_newpack 2 35912 &cow_file_range_async_35912 ++kernel_setsockopt_35913 kernel_setsockopt 5-0 35913 NULL ++dccp_listen_start_35918 dccp_listen_start 0 35918 NULL ++balance_node_right_35920 balance_node_right 0 35920 NULL nohasharray ++rt2x00lib_start_35920 rt2x00lib_start 0 35920 &balance_node_right_35920 nohasharray ++ip175c_read_status_35920 ip175c_read_status 0 35920 &rt2x00lib_start_35920 ++ch_probe_35922 ch_probe 0 35922 NULL ++sctp_tsnmap_mark_35929 sctp_tsnmap_mark 2-0 35929 NULL ++set_pwm1_auto_point_pwm_35930 set_pwm1_auto_point_pwm 0-4 35930 NULL ++uhci_submit_isochronous_35935 uhci_submit_isochronous 0 35935 NULL nohasharray ++rx_defrag_init_called_read_35935 rx_defrag_init_called_read 3-0 35935 &uhci_submit_isochronous_35935 ++put_cmsg_compat_35937 put_cmsg_compat 4-0 35937 NULL ++max77802_rtc_tm_to_data_35939 max77802_rtc_tm_to_data 0 35939 NULL ++polling_interval_show_35940 polling_interval_show 0 35940 NULL nohasharray ++ipmi_version_show_35940 ipmi_version_show 0 35940 &polling_interval_show_35940 ++irqcontrol_35953 irqcontrol 0 35953 NULL ++nilfs_mdt_freeze_buffer_35954 nilfs_mdt_freeze_buffer 0 35954 NULL nohasharray ++f2fs_write_node_pages_35954 f2fs_write_node_pages 0 35954 &nilfs_mdt_freeze_buffer_35954 ++kernel_bind_35955 kernel_bind 0 35955 NULL ++mcp251x_setup_35960 mcp251x_setup 0 35960 NULL ++set_cur_state_35966 set_cur_state 0 35966 NULL ++cxgb_open_35970 cxgb_open 0 35970 NULL ++nfs_page_async_flush_35972 nfs_page_async_flush 0 35972 NULL nohasharray ++aa_replace_current_profile_35972 aa_replace_current_profile 0 35972 &nfs_page_async_flush_35972 ++ceph_buffer_new_35974 ceph_buffer_new 1 35974 NULL nohasharray ++platform_suspend_prepare_late_35974 platform_suspend_prepare_late 0 35974 &ceph_buffer_new_35974 nohasharray ++generic_ocp_read_35974 generic_ocp_read 3 35974 &platform_suspend_prepare_late_35974 ++_picolcd_flash_erase64_35975 _picolcd_flash_erase64 0 35975 NULL ++lprev_show_35978 lprev_show 0 35978 NULL ++acl_alloc_35979 acl_alloc 1 35979 NULL ++show_35981 show 0 35981 NULL ++lpfc_soft_wwpn_show_35985 lpfc_soft_wwpn_show 0 35985 NULL nohasharray ++device_add_class_symlinks_35985 device_add_class_symlinks 0 35985 &lpfc_soft_wwpn_show_35985 ++mtd_bitflip_threshold_store_35988 mtd_bitflip_threshold_store 0-4 35988 NULL ++raw_bind_35989 raw_bind 0 35989 NULL ++koneplus_sysfs_write_35993 koneplus_sysfs_write 0-6 35993 NULL ++alt_playback_pcm_prepare_35994 alt_playback_pcm_prepare 0 35994 NULL ++current_channel_show_35996 current_channel_show 0 35996 NULL ++write_file_antenna_35998 write_file_antenna 3-0 35998 NULL nohasharray ++kuc_alloc_35998 kuc_alloc 1 35998 &write_file_antenna_35998 ++locks_mandatory_area_35999 locks_mandatory_area 0 35999 NULL ++max16065_set_limit_36004 max16065_set_limit 0-4 36004 NULL ++apei_exec_read_register_value_36005 apei_exec_read_register_value 0 36005 NULL ++svga_check_timings_36006 svga_check_timings 0 36006 NULL ++console_store_36007 console_store 0-4 36007 NULL ++lov_mds_md_max_stripe_count_36008 lov_mds_md_max_stripe_count 0-1 36008 NULL ++gadget_dev_desc_UDC_store_36009 gadget_dev_desc_UDC_store 0-3 36009 NULL ++il3945_ucode_tx_stats_read_36016 il3945_ucode_tx_stats_read 3-0 36016 NULL ++uvesafb_helper_start_36018 uvesafb_helper_start 0 36018 NULL ++dev_mc_del_36019 dev_mc_del 0 36019 NULL ++vivid_radio_rx_s_ctrl_36023 vivid_radio_rx_s_ctrl 0 36023 NULL ++show_36024 show 0 36024 NULL ++big_key_preparse_36025 big_key_preparse 0 36025 NULL ++afs_getattr_36026 afs_getattr 0 36026 NULL ++qlcnic_fw_cmd_create_tx_ctx_36027 qlcnic_fw_cmd_create_tx_ctx 0 36027 NULL ++show_temp_auto_point2_temp_36028 show_temp_auto_point2_temp 0 36028 NULL nohasharray ++fat_ent_read_block_36028 fat_ent_read_block 0 36028 &show_temp_auto_point2_temp_36028 ++ubi_eba_write_leb_36029 ubi_eba_write_leb 6-5-0 36029 NULL ++__videobuf_alloc_36031 __videobuf_alloc 1 36031 NULL nohasharray ++cm_get_battery_temperature_by_psy_36031 cm_get_battery_temperature_by_psy 0 36031 &__videobuf_alloc_36031 ++gdm_lte_netif_rx_36036 gdm_lte_netif_rx 3 36036 NULL ++yam_set_mac_address_36037 yam_set_mac_address 0 36037 NULL ++show_forward_delay_timer_36038 show_forward_delay_timer 0 36038 NULL nohasharray ++iscsi_nacl_attrib_show_random_datain_pdu_offsets_36038 iscsi_nacl_attrib_show_random_datain_pdu_offsets 0 36038 &show_forward_delay_timer_36038 nohasharray ++page_action_36038 page_action 0 36038 &iscsi_nacl_attrib_show_random_datain_pdu_offsets_36038 ++num_arg_36039 num_arg 0 36039 NULL ++wm8739_s_ctrl_36040 wm8739_s_ctrl 0 36040 NULL ++sys_init_module_36047 sys_init_module 2 36047 NULL ++init_36051 init 0 36051 NULL ++at86rf230_set_promiscuous_mode_36052 at86rf230_set_promiscuous_mode 0 36052 NULL ++snd_usb_caiaq_set_audio_params_36057 snd_usb_caiaq_set_audio_params 0 36057 NULL nohasharray ++qlge_change_mtu_36057 qlge_change_mtu 0 36057 &snd_usb_caiaq_set_audio_params_36057 ++gpio_power_read_36059 gpio_power_read 3-0 36059 NULL ++nfs_file_read_36060 nfs_file_read 0 36060 NULL ++__bch_cache_set_show_36061 __bch_cache_set_show 0 36061 NULL nohasharray ++show_conn_param_ISCSI_PARAM_IS_FW_ASSIGNED_IPV6_36061 show_conn_param_ISCSI_PARAM_IS_FW_ASSIGNED_IPV6 0 36061 &__bch_cache_set_show_36061 ++show_power_crit_36062 show_power_crit 0 36062 NULL ++smk_bu_inode_36064 smk_bu_inode 0-3 36064 NULL nohasharray ++picolcd_fb_update_rate_store_36064 picolcd_fb_update_rate_store 0-4 36064 &smk_bu_inode_36064 ++dgram_dequeue_36067 dgram_dequeue 0 36067 NULL ++stack_max_size_write_36068 stack_max_size_write 3 36068 NULL ++show_conn_ep_param_ISCSI_PARAM_CONN_PORT_36069 show_conn_ep_param_ISCSI_PARAM_CONN_PORT 0 36069 NULL ++ieee80211_if_fmt_peer_36071 ieee80211_if_fmt_peer 3 36071 NULL nohasharray ++enable_36071 enable 0 36071 &ieee80211_if_fmt_peer_36071 ++ext3_new_blocks_36073 ext3_new_blocks 3-0 36073 NULL ++max77686_rtc_set_alarm_36076 max77686_rtc_set_alarm 0 36076 NULL ++ieee80211_if_write_tsf_36077 ieee80211_if_write_tsf 3-0 36077 NULL nohasharray ++rtl_show_state_36077 rtl_show_state 0 36077 &ieee80211_if_write_tsf_36077 ++snd_pcm_plug_read_transfer_36080 snd_pcm_plug_read_transfer 0-3 36080 NULL nohasharray ++ath10k_reg_addr_write_36080 ath10k_reg_addr_write 3-0 36080 &snd_pcm_plug_read_transfer_36080 ++mtip_hw_read_device_status_36082 mtip_hw_read_device_status 3-0 36082 NULL ++cifs_set_file_size_36085 cifs_set_file_size 0 36085 NULL ++nouveau_hwmon_get_pwm1_enable_36091 nouveau_hwmon_get_pwm1_enable 0 36091 NULL ++queue_max_segments_show_36092 queue_max_segments_show 0 36092 NULL ++show_yenta_registers_36093 show_yenta_registers 0 36093 NULL ++genlmsg_new_36094 genlmsg_new 1 36094 NULL ++arch_dynirq_lower_bound_36099 arch_dynirq_lower_bound 0-1 36099 NULL ++read_dsrate_36103 read_dsrate 0 36103 NULL ++vga_arb_write_36112 vga_arb_write 3-0 36112 NULL ++ext2_xattr_security_list_36113 ext2_xattr_security_list 0-5 36113 NULL ++ata_scsi_em_message_show_36114 ata_scsi_em_message_show 0 36114 NULL ++compile_date_show_36116 compile_date_show 0 36116 NULL ++simple_xattr_alloc_36118 simple_xattr_alloc 2 36118 NULL nohasharray ++show_36118 show 0 36118 &simple_xattr_alloc_36118 ++uvc_buffer_prepare_36119 uvc_buffer_prepare 0 36119 NULL ++intel_iommu_show_address_36120 intel_iommu_show_address 0 36120 NULL ++netxen_sysfs_read_crb_36122 netxen_sysfs_read_crb 0-6-5 36122 NULL nohasharray ++niu_init_rx_channels_36122 niu_init_rx_channels 0 36122 &netxen_sysfs_read_crb_36122 ++adis16400_update_scan_mode_36123 adis16400_update_scan_mode 0 36123 NULL ++tpm_atml_recv_36126 tpm_atml_recv 0-3 36126 NULL ++vmalloc_exec_36132 vmalloc_exec 1 36132 NULL nohasharray ++mcp251x_open_36132 mcp251x_open 0 36132 &vmalloc_exec_36132 ++authorized_store_36134 authorized_store 0-4 36134 NULL ++rbd_client_id_show_36135 rbd_client_id_show 0 36135 NULL nohasharray ++mdc800_device_write_36135 mdc800_device_write 0-3 36135 &rbd_client_id_show_36135 ++set_flexbg_block_bitmap_36136 set_flexbg_block_bitmap 5-4 36136 NULL ++ath10k_wmi_peer_create_36138 ath10k_wmi_peer_create 0 36138 NULL ++usb6fire_pcm_trigger_36144 usb6fire_pcm_trigger 0 36144 NULL nohasharray ++ext3_readpages_36144 ext3_readpages 4 36144 &usb6fire_pcm_trigger_36144 ++iwlagn_send_tx_power_36145 iwlagn_send_tx_power 0 36145 NULL nohasharray ++queue_var_store_36145 queue_var_store 0-3 36145 &iwlagn_send_tx_power_36145 ++show_remote_port_36146 show_remote_port 0 36146 NULL ++alloc_vm_area_36149 alloc_vm_area 1 36149 NULL nohasharray ++wp256_final_36149 wp256_final 0 36149 &alloc_vm_area_36149 ++power_off_acct_show_36150 power_off_acct_show 0 36150 NULL ++new_files_jdata_show_36152 new_files_jdata_show 0 36152 NULL ++twl_set_36154 twl_set 2 36154 NULL ++b1_alloc_card_36155 b1_alloc_card 1 36155 NULL nohasharray ++l2cap_add_psm_36155 l2cap_add_psm 0 36155 &b1_alloc_card_36155 ++sys_send_36161 sys_send 3 36161 NULL ++cxacru_sysfs_show_upstream_snr_margin_36167 cxacru_sysfs_show_upstream_snr_margin 0 36167 NULL ++snd_korg1212_copy_from_36169 snd_korg1212_copy_from 6 36169 NULL nohasharray ++store_attribute_36169 store_attribute 0 36169 &snd_korg1212_copy_from_36169 nohasharray ++mlx4_status_to_errno_36169 mlx4_status_to_errno 0 36169 &store_attribute_36169 ++snd_rme96_playback_trigger_36173 snd_rme96_playback_trigger 0 36173 NULL nohasharray ++v9fs_xattr_set_36173 v9fs_xattr_set 0 36173 &snd_rme96_playback_trigger_36173 ++xilly_get_dma_buffers_36174 xilly_get_dma_buffers 4 36174 NULL ++try_or_set_cluster_36176 try_or_set_cluster 0 36176 NULL nohasharray ++__sync_dirty_buffer_36176 __sync_dirty_buffer 0 36176 &try_or_set_cluster_36176 nohasharray ++SyS_kexec_load_36176 SyS_kexec_load 2 36176 &__sync_dirty_buffer_36176 ++mcp251x_hw_reset_36177 mcp251x_hw_reset 0 36177 NULL ++modify_device_36179 modify_device 0 36179 NULL ++dummy_validate_stream_36185 dummy_validate_stream 0 36185 NULL ++adt7x10_read_byte_36186 adt7x10_read_byte 0 36186 NULL ++phys_state_show_36187 phys_state_show 0 36187 NULL ++ramoops_init_przs_36199 ramoops_init_przs 4 36199 NULL ++ds1672_rtc_read_time_36200 ds1672_rtc_read_time 0 36200 NULL ++ovl_copy_up_last_36204 ovl_copy_up_last 0 36204 NULL ++SYSC_sched_getaffinity_36208 SYSC_sched_getaffinity 2 36208 NULL ++write_word_36211 write_word 0 36211 NULL ++nfs3_list_one_acl_36212 nfs3_list_one_acl 0 36212 NULL ++SYSC_process_vm_readv_36216 SYSC_process_vm_readv 3-5 36216 NULL nohasharray ++negotiate_36216 negotiate 0 36216 &SYSC_process_vm_readv_36216 ++nfqnl_mangle_36226 nfqnl_mangle 4-2 36226 NULL ++i2c_algo_dp_aux_xfer_36227 i2c_algo_dp_aux_xfer 0-3 36227 NULL nohasharray ++command_setformat_36227 command_setformat 0 36227 &i2c_algo_dp_aux_xfer_36227 ++atomic_stats_read_36228 atomic_stats_read 3-0 36228 NULL ++wl1273_fm_start_36229 wl1273_fm_start 0 36229 NULL ++__padata_remove_cpu_36235 __padata_remove_cpu 0 36235 NULL ++ping_bind_36236 ping_bind 0 36236 NULL ++viafb_iga1_odev_proc_write_36241 viafb_iga1_odev_proc_write 3-0 36241 NULL ++SYSC_getxattr_36242 SYSC_getxattr 4 36242 NULL ++acpi_ex_create_mutex_36244 acpi_ex_create_mutex 0 36244 NULL ++vmsplice_to_user_36245 vmsplice_to_user 3 36245 NULL nohasharray ++rproc_recovery_read_36245 rproc_recovery_read 3-0 36245 &vmsplice_to_user_36245 ++ceph_vxattrcb_layout_stripe_count_36247 ceph_vxattrcb_layout_stripe_count 0 36247 NULL ++scrub_stripe_36248 scrub_stripe 5 36248 NULL ++swap_writer_finish_36252 swap_writer_finish 0-3 36252 NULL ++setup_msi_irqs_36253 setup_msi_irqs 0 36253 NULL ++il_mac_add_interface_36254 il_mac_add_interface 0 36254 NULL ++compat_sys_mbind_36256 compat_sys_mbind 5 36256 NULL ++regulator_print_opmode_36257 regulator_print_opmode 0 36257 NULL ++nla_put_u32_36259 nla_put_u32 0 36259 NULL nohasharray ++store_sf2_level_36259 store_sf2_level 0-4 36259 &nla_put_u32_36259 ++nilfs_write_logs_36260 nilfs_write_logs 0 36260 NULL ++cfq_slice_sync_store_36272 cfq_slice_sync_store 3-0 36272 NULL ++bus_for_each_dev_36276 bus_for_each_dev 0 36276 NULL nohasharray ++cfs_hash_buckets_realloc_36276 cfs_hash_buckets_realloc 4 36276 &bus_for_each_dev_36276 ++lpfc_oas_lun_show_36279 lpfc_oas_lun_show 0 36279 NULL ++codec_reg_read_file_36280 codec_reg_read_file 3-0 36280 NULL ++lpfc_dss_show_36282 lpfc_dss_show 0 36282 NULL ++bind_mode_show_36286 bind_mode_show 0 36286 NULL ++aac_show_reset_adapter_36289 aac_show_reset_adapter 0 36289 NULL ++nf_nat_ipv6_out_36291 nf_nat_ipv6_out 0 36291 NULL ++asix_write_rx_ctl_36295 asix_write_rx_ctl 0 36295 NULL ++do_set_fan_div_36299 do_set_fan_div 0 36299 NULL ++lpfc_debugfs_dif_err_read_36303 lpfc_debugfs_dif_err_read 3-0 36303 NULL ++show_in_min3_36304 show_in_min3 0 36304 NULL ++l2cap_validate_le_psm_36306 l2cap_validate_le_psm 0 36306 NULL ++target_core_alua_tg_pt_gp_store_attr_alua_access_type_36308 target_core_alua_tg_pt_gp_store_attr_alua_access_type 0-3 36308 NULL ++ad7879_spi_xfer_36311 ad7879_spi_xfer 3 36311 NULL ++tipc_sk_rcv_36312 tipc_sk_rcv 0 36312 NULL ++qla2x00_vlan_id_show_36314 qla2x00_vlan_id_show 0 36314 NULL ++mwifiex_cmd_802_11_scan_36316 mwifiex_cmd_802_11_scan 0 36316 NULL ++iscsi_tpg_attrib_store_authentication_36323 iscsi_tpg_attrib_store_authentication 0-3 36323 NULL ++__compat_sys_pwritev64_36328 __compat_sys_pwritev64 3 36328 NULL ++lc_create_36332 lc_create 4 36332 NULL ++jbd2_journal_init_revoke_table_36336 jbd2_journal_init_revoke_table 1 36336 NULL ++t4_config_rss_range_36340 t4_config_rss_range 0 36340 NULL ++bEndpointAddress_show_36342 bEndpointAddress_show 0 36342 NULL ++isku_sysfs_read_key_mask_36343 isku_sysfs_read_key_mask 6-0-5 36343 NULL ++show_fnode_tcp_wsf_disable_36348 show_fnode_tcp_wsf_disable 0 36348 NULL nohasharray ++iscsi_disc_store_password_mutual_36348 iscsi_disc_store_password_mutual 0-3 36348 &show_fnode_tcp_wsf_disable_36348 ++ath6kl_regwrite_write_36351 ath6kl_regwrite_write 3-0 36351 NULL nohasharray ++async_writev_36351 async_writev 0 36351 &ath6kl_regwrite_write_36351 ++xz_dec_lzma2_create_36353 xz_dec_lzma2_create 2 36353 NULL nohasharray ++v9fs_file_readn_36353 v9fs_file_readn 4-0 36353 &xz_dec_lzma2_create_36353 nohasharray ++picolcd_operation_mode_show_36353 picolcd_operation_mode_show 0 36353 &v9fs_file_readn_36353 ++at91_sysfs_show_mb0_id_36364 at91_sysfs_show_mb0_id 0 36364 NULL ++ip6_mtu_36368 ip6_mtu 0 36368 NULL ++sxgbe_dma_init_36369 sxgbe_dma_init 0 36369 NULL ++roccat_common2_sysfs_read_keys_primary_36382 roccat_common2_sysfs_read_keys_primary 0-5-6 36382 NULL ++iio_request_update_kfifo_36383 iio_request_update_kfifo 0 36383 NULL ++tunables_read_36385 tunables_read 3-0 36385 NULL nohasharray ++bind_qsets_36385 bind_qsets 0 36385 &tunables_read_36385 ++brcmf_cfg80211_change_iface_36390 brcmf_cfg80211_change_iface 0 36390 NULL ++show_fnode_username_36398 show_fnode_username 0 36398 NULL ++afs_alloc_flat_call_36399 afs_alloc_flat_call 2-3 36399 NULL nohasharray ++__uncore_filter_link2_show_36399 __uncore_filter_link2_show 0 36399 &afs_alloc_flat_call_36399 nohasharray ++xennet_change_mtu_36399 xennet_change_mtu 0 36399 &__uncore_filter_link2_show_36399 ++sierra_write_36402 sierra_write 4-0 36402 NULL ++rx_over_errors_show_36403 rx_over_errors_show 0 36403 NULL nohasharray ++iwl_dbgfs_d3_sram_write_36403 iwl_dbgfs_d3_sram_write 0-3 36403 &rx_over_errors_show_36403 ++selinux_inode_listsecurity_36406 selinux_inode_listsecurity 0 36406 NULL ++qdsb_get_36409 qdsb_get 0 36409 NULL ++msb_update_block_36412 msb_update_block 2 36412 NULL nohasharray ++gadget_dev_desc_bcdUSB_show_36412 gadget_dev_desc_bcdUSB_show 0 36412 &msb_update_block_36412 ++teles_suspend_36416 teles_suspend 0 36416 NULL ++da9063_buck_get_status_36417 da9063_buck_get_status 0 36417 NULL nohasharray ++SyS_sethostname_36417 SyS_sethostname 2 36417 &da9063_buck_get_status_36417 ++rt2x00queue_alloc_entries_36429 rt2x00queue_alloc_entries 0 36429 NULL ++no_uld_show_36430 no_uld_show 0 36430 NULL ++show_configfs_dev_params_36432 show_configfs_dev_params 0 36432 NULL ++soc_pcm_codec_params_fixup_36434 soc_pcm_codec_params_fixup 2 36434 NULL ++show_bank1_alarm_36436 show_bank1_alarm 0 36436 NULL nohasharray ++rtnl_link_get_size_36436 rtnl_link_get_size 0 36436 &show_bank1_alarm_36436 ++intf_next_seq_36442 intf_next_seq 0 36442 NULL ++sctp_tsnmap_init_36446 sctp_tsnmap_init 2 36446 NULL ++bnx2x_reload_if_running_36448 bnx2x_reload_if_running 0 36448 NULL ++alloc_etherdev_mqs_36450 alloc_etherdev_mqs 1 36450 NULL ++smsc95xx_set_mac_address_36452 smsc95xx_set_mac_address 0 36452 NULL ++atkbd_show_extra_36453 atkbd_show_extra 0 36453 NULL ++CIFSSMBNegotiate_36455 CIFSSMBNegotiate 0 36455 NULL ++tcf_csum_ipv6_udp_36457 tcf_csum_ipv6_udp 3 36457 NULL ++__vxge_hw_pio_mem_write64_36458 __vxge_hw_pio_mem_write64 0 36458 NULL ++netvsc_change_mtu_36461 netvsc_change_mtu 0 36461 NULL ++carl9170_exec_cmd_36462 carl9170_exec_cmd 0 36462 NULL ++core_alua_show_secondary_status_36463 core_alua_show_secondary_status 0 36463 NULL ++ivtv_s_audio_sampling_freq_36468 ivtv_s_audio_sampling_freq 0 36468 NULL ++xfs_rtmodify_summary_int_36469 xfs_rtmodify_summary_int 0 36469 NULL nohasharray ++rio_request_inb_mbox_36469 rio_request_inb_mbox 0 36469 &xfs_rtmodify_summary_int_36469 ++iscsit_ta_default_erl_36470 iscsit_ta_default_erl 0 36470 NULL ++SyS_process_vm_writev_36476 SyS_process_vm_writev 3-5 36476 NULL ++__security_genfs_sid_36479 __security_genfs_sid 0 36479 NULL ++lock_and_cleanup_extent_if_need_36480 lock_and_cleanup_extent_if_need 0 36480 NULL ++b43_nphy_load_samples_36481 b43_nphy_load_samples 3 36481 NULL ++ath10k_recalc_rtscts_prot_36482 ath10k_recalc_rtscts_prot 0 36482 NULL ++hdaps_invert_show_36483 hdaps_invert_show 0 36483 NULL ++elan_i2c_iap_reset_36487 elan_i2c_iap_reset 0 36487 NULL ++vmci_route_36488 vmci_route 0 36488 NULL ++ds1343_nvram_write_36489 ds1343_nvram_write 5-6-0 36489 NULL ++tx_tx_checksum_result_read_36490 tx_tx_checksum_result_read 3-0 36490 NULL nohasharray ++devfreq_simple_ondemand_func_36490 devfreq_simple_ondemand_func 0 36490 &tx_tx_checksum_result_read_36490 nohasharray ++pm860x_rtc_set_alarm_36490 pm860x_rtc_set_alarm 0 36490 &devfreq_simple_ondemand_func_36490 nohasharray ++ip6_append_data_36490 ip6_append_data 4-5 36490 &pm860x_rtc_set_alarm_36490 ++store_fast_charge_timer_36494 store_fast_charge_timer 0-4 36494 NULL ++ufx_ops_set_par_36498 ufx_ops_set_par 0 36498 NULL ++lpfc_enable_da_id_show_36504 lpfc_enable_da_id_show 0 36504 NULL ++e4000_set_if_gain_36506 e4000_set_if_gain 0 36506 NULL ++__hwahc_op_set_ptk_36510 __hwahc_op_set_ptk 5 36510 NULL ++mcam_v4l_read_36513 mcam_v4l_read 3-0 36513 NULL ++_iwl_dbgfs_fw_nmi_write_36515 _iwl_dbgfs_fw_nmi_write 3-0 36515 NULL ++ieee80211_if_read_fwded_frames_36520 ieee80211_if_read_fwded_frames 3-0 36520 NULL ++virt_addr_show_36526 virt_addr_show 0 36526 NULL ++it8761e_gpio_direction_out_36528 it8761e_gpio_direction_out 0 36528 NULL ++lguest_setup_irq_36531 lguest_setup_irq 1 36531 NULL ++ath10k_setup_peer_smps_36533 ath10k_setup_peer_smps 0 36533 NULL ++mvs_task_prep_ssp_36534 mvs_task_prep_ssp 0 36534 NULL nohasharray ++rv3029c2_rtc_i2c_set_alarm_36534 rv3029c2_rtc_i2c_set_alarm 0 36534 &mvs_task_prep_ssp_36534 ++qla4_83xx_restart_36539 qla4_83xx_restart 0 36539 NULL ++cpu_type_read_36540 cpu_type_read 3-0 36540 NULL ++remote_node_defrag_ratio_store_36542 remote_node_defrag_ratio_store 0-3 36542 NULL ++de_init_hw_36543 de_init_hw 0 36543 NULL ++ixgbevf_setup_rx_resources_36545 ixgbevf_setup_rx_resources 0 36545 NULL ++ql_get_regs_len_36548 ql_get_regs_len 0 36548 NULL ++vm_commit_limit_36552 vm_commit_limit 0 36552 NULL ++bInterval_show_36553 bInterval_show 0 36553 NULL nohasharray ++show_fcstat_fc_no_free_exch_36553 show_fcstat_fc_no_free_exch 0 36553 &bInterval_show_36553 ++__kfifo_to_user_36555 __kfifo_to_user 3-0 36555 NULL ++skb_copy_and_csum_datagram_msg_36558 skb_copy_and_csum_datagram_msg 2 36558 NULL ++mfn_to_pfn_36560 mfn_to_pfn 0-1 36560 NULL ++mxt_bootloader_write_36561 mxt_bootloader_write 0 36561 NULL nohasharray ++__lock_page_killable_36561 __lock_page_killable 0 36561 &mxt_bootloader_write_36561 ++b44_wait_bit_36562 b44_wait_bit 0 36562 NULL ++patch_ad1981_36564 patch_ad1981 0 36564 NULL ++si476x_core_cmd_fm_rsq_status_36568 si476x_core_cmd_fm_rsq_status 0 36568 NULL ++do_rbd_add_36570 do_rbd_add 0 36570 NULL ++btrfs_get_token_64_36572 btrfs_get_token_64 0 36572 NULL ++pm8001_task_prep_ssp_tm_36574 pm8001_task_prep_ssp_tm 0 36574 NULL ++ssb_bus_scan_36578 ssb_bus_scan 2 36578 NULL ++__erst_read_36579 __erst_read 0 36579 NULL ++e100_exec_cmd_36583 e100_exec_cmd 0 36583 NULL ++show_36588 show 0 36588 NULL ++put_cmsg_36589 put_cmsg 4-0 36589 NULL ++st6422_start_36592 st6422_start 0 36592 NULL nohasharray ++sparse_init_one_section_36592 sparse_init_one_section 0 36592 &st6422_start_36592 ++pcnet32_realloc_rx_ring_36598 pcnet32_realloc_rx_ring 3 36598 NULL ++__da903x_write_36599 __da903x_write 0 36599 NULL nohasharray ++jfs_write_begin_36599 jfs_write_begin 0 36599 &__da903x_write_36599 nohasharray ++koneplus_sysfs_set_actual_profile_36599 koneplus_sysfs_set_actual_profile 0-4 36599 &jfs_write_begin_36599 ++init_36600 init 0 36600 NULL ++read_byte_36604 read_byte 0 36604 NULL ++ttm_object_device_init_36607 ttm_object_device_init 2 36607 NULL ++show_dev_name_36608 show_dev_name 0 36608 NULL ++beiscsi_log_enable_disp_36609 beiscsi_log_enable_disp 0 36609 NULL ++do_sendfile_36610 do_sendfile 4-5 36610 NULL ++selinux_ipv6_postroute_36611 selinux_ipv6_postroute 0 36611 NULL ++kstrtoll_36612 kstrtoll 0 36612 NULL ++sdev_show_vendor_36616 sdev_show_vendor 0 36616 NULL ++mtd_write_user_prot_reg_36625 mtd_write_user_prot_reg 0 36625 NULL ++mxl111sf_ctrl_program_regs_36626 mxl111sf_ctrl_program_regs 0 36626 NULL ++kvaser_usb_setup_rx_urbs_36629 kvaser_usb_setup_rx_urbs 0 36629 NULL ++proto_name_show_36630 proto_name_show 0 36630 NULL ++attribute_show_36633 attribute_show 0 36633 NULL ++power_save_36634 power_save 0 36634 NULL ++vxge_config_vpaths_36636 vxge_config_vpaths 0 36636 NULL ++show_conn_param_ISCSI_PARAM_TCP_TIMESTAMP_EN_36639 show_conn_param_ISCSI_PARAM_TCP_TIMESTAMP_EN 0 36639 NULL ++bond_option_slaves_set_36643 bond_option_slaves_set 0 36643 NULL ++ov2640_write_array_36644 ov2640_write_array 0 36644 NULL ++m66592_udc_start_36646 m66592_udc_start 0 36646 NULL ++mem_cgroup_do_precharge_36647 mem_cgroup_do_precharge 0 36647 NULL ++lpfc_idiag_extacc_alloc_get_36648 lpfc_idiag_extacc_alloc_get 0-3 36648 NULL ++add_dev_support_show_36650 add_dev_support_show 0 36650 NULL ++hfsplus_osx_listxattr_36654 hfsplus_osx_listxattr 0-5 36654 NULL nohasharray ++interface_show_36654 interface_show 0 36654 &hfsplus_osx_listxattr_36654 ++ktti_read_regr_36658 ktti_read_regr 0 36658 NULL ++pss_coproc_open_36662 pss_coproc_open 0 36662 NULL ++osd_req_list_collection_objects_36664 osd_req_list_collection_objects 5 36664 NULL nohasharray ++ip6_pkt_prohibit_out_36664 ip6_pkt_prohibit_out 0 36664 &osd_req_list_collection_objects_36664 ++snd_pcsp_trigger_36665 snd_pcsp_trigger 0 36665 NULL ++get_temp_input_36671 get_temp_input 0 36671 NULL nohasharray ++iscsi_host_alloc_36671 iscsi_host_alloc 2 36671 &get_temp_input_36671 ++o2nm_node_num_read_36673 o2nm_node_num_read 0 36673 NULL ++hackrf_queue_setup_36676 hackrf_queue_setup 0 36676 NULL ++xillybus_read_36678 xillybus_read 3-0 36678 NULL ++iscsi_stat_sess_show_attr_cmd_pdus_36680 iscsi_stat_sess_show_attr_cmd_pdus 0 36680 NULL ++iscsi_nacl_param_show_ImmediateData_36681 iscsi_nacl_param_show_ImmediateData 0 36681 NULL ++__follow_pte_36683 __follow_pte 0 36683 NULL ++ext4_mb_discard_group_preallocations_36685 ext4_mb_discard_group_preallocations 2 36685 NULL ++lbtf_op_start_36691 lbtf_op_start 0 36691 NULL ++xhci_check_args_36702 xhci_check_args 0 36702 NULL nohasharray ++gsmtty_write_36702 gsmtty_write 3 36702 &xhci_check_args_36702 ++cam_get_response16_36703 cam_get_response16 0 36703 NULL ++raid5_add_disk_36710 raid5_add_disk 0 36710 NULL nohasharray ++alc861_parse_auto_config_36710 alc861_parse_auto_config 0 36710 &raid5_add_disk_36710 nohasharray ++propagate_exception_36710 propagate_exception 0 36710 &alc861_parse_auto_config_36710 ++vfio_user_config_write_36712 vfio_user_config_write 0 36712 NULL ++tg3_phy_auxctl_write_36713 tg3_phy_auxctl_write 0 36713 NULL nohasharray ++netdev_set_mac_address_36713 netdev_set_mac_address 0 36713 &tg3_phy_auxctl_write_36713 ++snd_soc_update_bits_36714 snd_soc_update_bits 0 36714 NULL ++solo_p2m_dma_desc_36715 solo_p2m_dma_desc 0 36715 NULL ++path_getxattr_36717 path_getxattr 4 36717 NULL ++max77802_rtc_read_time_36718 max77802_rtc_read_time 0 36718 NULL ++kovaplus_sysfs_show_actual_sensitivity_x_36721 kovaplus_sysfs_show_actual_sensitivity_x 0 36721 NULL ++saa7134_i2c_eeprom_36729 saa7134_i2c_eeprom 3 36729 NULL ++cfq_slice_sync_show_36730 cfq_slice_sync_show 0 36730 NULL ++extract_icmp6_fields_36732 extract_icmp6_fields 2 36732 NULL ++multicast_show_36734 multicast_show 0 36734 NULL ++read_36735 read 0 36735 NULL ++snd_rawmidi_kernel_read1_36740 snd_rawmidi_kernel_read1 4-0 36740 NULL ++nfnetlink_alloc_skb_36741 nfnetlink_alloc_skb 2 36741 NULL ++sys_get_curr_temp_36743 sys_get_curr_temp 0 36743 NULL nohasharray ++rbd_pool_show_36743 rbd_pool_show 0 36743 &sys_get_curr_temp_36743 ++mwl8k_cmd_radio_disable_36745 mwl8k_cmd_radio_disable 0 36745 NULL ++cxgbi_device_register_36746 cxgbi_device_register 2-1 36746 NULL ++cifs_removexattr_36749 cifs_removexattr 0 36749 NULL ++fc_exch_mgr_alloc_36751 fc_exch_mgr_alloc 3-4 36751 NULL ++nilfs_bmap_prepare_alloc_ptr_36752 nilfs_bmap_prepare_alloc_ptr 0 36752 NULL nohasharray ++pmdown_time_set_36752 pmdown_time_set 0-4 36752 &nilfs_bmap_prepare_alloc_ptr_36752 ++ps_poll_upsd_timeouts_read_36755 ps_poll_upsd_timeouts_read 3-0 36755 NULL ++agc_status_36756 agc_status 0 36756 NULL ++xen_do_pin_36757 xen_do_pin 2 36757 NULL ++srp_parse_options_36759 srp_parse_options 0 36759 NULL ++bnx2x_exe_queue_step_36760 bnx2x_exe_queue_step 0 36760 NULL ++set_pwm_reg_36763 set_pwm_reg 0-4 36763 NULL ++get_ncm_36766 get_ncm 0 36766 NULL ++pcan_usb_send_cmd_36767 pcan_usb_send_cmd 0 36767 NULL ++ip4ip6_err_36772 ip4ip6_err 5 36772 NULL ++llc_mac_header_len_36776 llc_mac_header_len 0 36776 NULL ++show_eeprom1_36777 show_eeprom1 0 36777 NULL ++iscsi_tpg_param_store_ErrorRecoveryLevel_36779 iscsi_tpg_param_store_ErrorRecoveryLevel 0-3 36779 NULL ++viacam_ctlr_cbufs_36781 viacam_ctlr_cbufs 0 36781 NULL ++musb_schedule_36787 musb_schedule 0 36787 NULL ++pci_write_config_dword_36790 pci_write_config_dword 0 36790 NULL ++hrz_open_rx_36793 hrz_open_rx 0 36793 NULL nohasharray ++of_iomap_36793 of_iomap 2 36793 &hrz_open_rx_36793 ++ecm_opts_host_addr_show_36795 ecm_opts_host_addr_show 0 36795 NULL nohasharray ++bcm7xxx_eee_enable_36795 bcm7xxx_eee_enable 0 36795 &ecm_opts_host_addr_show_36795 ++i40e_init_lan_hmc_36796 i40e_init_lan_hmc 2-3-4-5 36796 NULL ++macvlan_vlan_rx_add_vid_36799 macvlan_vlan_rx_add_vid 0 36799 NULL ++proc_fault_inject_read_36802 proc_fault_inject_read 3-0 36802 NULL nohasharray ++store_sched0_36802 store_sched0 4-0 36802 &proc_fault_inject_read_36802 ++set_deactivate_slack_36803 set_deactivate_slack 0-4 36803 NULL ++flock_lock_file_wait_36808 flock_lock_file_wait 0 36808 NULL ++show_multicast_router_36814 show_multicast_router 0 36814 NULL ++show_out0_enable_36815 show_out0_enable 0 36815 NULL ++hiddev_ioctl_36816 hiddev_ioctl 2 36816 NULL ++edd_show_legacy_max_head_36821 edd_show_legacy_max_head 0 36821 NULL ++tcf_csum_ipv6_tcp_36822 tcf_csum_ipv6_tcp 3 36822 NULL ++adt7310_spi_read_byte_36823 adt7310_spi_read_byte 0 36823 NULL nohasharray ++ab3100_otp_tac_show_36823 ab3100_otp_tac_show 0 36823 &adt7310_spi_read_byte_36823 ++temp_cpu_local_36825 temp_cpu_local 0 36825 NULL ++ath10k_pci_chip_reset_36827 ath10k_pci_chip_reset 0 36827 NULL ++int_hardware_entry_36833 int_hardware_entry 3-0 36833 NULL ++ax88179_change_mtu_36836 ax88179_change_mtu 0 36836 NULL ++arvo_sysfs_show_actual_profile_36841 arvo_sysfs_show_actual_profile 0 36841 NULL ++power_limit_0_tmax_us_show_36847 power_limit_0_tmax_us_show 0 36847 NULL nohasharray ++ufx_ops_check_var_36847 ufx_ops_check_var 0 36847 &power_limit_0_tmax_us_show_36847 ++user_pin_configs_show_36848 user_pin_configs_show 0 36848 NULL ++ov7670_s_autoexp_36855 ov7670_s_autoexp 0 36855 NULL ++cm_write_36858 cm_write 3-0 36858 NULL nohasharray ++set_rate_36858 set_rate 0 36858 &cm_write_36858 ++thermal_get_trip_temp_36862 thermal_get_trip_temp 0 36862 NULL ++part_size_show_36865 part_size_show 0 36865 NULL nohasharray ++ntfs_statfs_36865 ntfs_statfs 0 36865 &part_size_show_36865 ++audit_tree_handle_event_36870 audit_tree_handle_event 0 36870 NULL ++tx_tx_data_programmed_read_36871 tx_tx_data_programmed_read 3-0 36871 NULL nohasharray ++f_eem_opts_attr_store_36871 f_eem_opts_attr_store 0-4 36871 &tx_tx_data_programmed_read_36871 ++stp_state_show_36872 stp_state_show 0 36872 NULL ++acpi_tb_find_table_36874 acpi_tb_find_table 0 36874 NULL ++afs_proc_rootcell_read_36875 afs_proc_rootcell_read 0-3 36875 NULL ++svc_setsockopt_36876 svc_setsockopt 5-0 36876 NULL nohasharray ++show_src_clock_sel_36876 show_src_clock_sel 0 36876 &svc_setsockopt_36876 ++raid56_parity_write_36877 raid56_parity_write 5-0 36877 NULL nohasharray ++reiserfs_listxattr_36877 reiserfs_listxattr 0-3 36877 &raid56_parity_write_36877 ++ppp_hard_header_36881 ppp_hard_header 0 36881 NULL ++__btrfs_map_block_36883 __btrfs_map_block 3-0 36883 NULL ++ib_ucm_alloc_data_36885 ib_ucm_alloc_data 3 36885 NULL ++snd_ice1712_playback_prepare_36888 snd_ice1712_playback_prepare 0 36888 NULL ++selinux_inode_notifysecctx_36896 selinux_inode_notifysecctx 3 36896 NULL ++gfs2_file_write_iter_36898 gfs2_file_write_iter 0 36898 NULL ++tas5086_register_size_36899 tas5086_register_size 0 36899 NULL nohasharray ++netlbl_af4list_add_36899 netlbl_af4list_add 0 36899 &tas5086_register_size_36899 ++pscsi_add_device_to_list_36901 pscsi_add_device_to_list 0 36901 NULL ++wm831x_auxadc_read_36904 wm831x_auxadc_read 0 36904 NULL nohasharray ++set_green_36904 set_green 0-4 36904 &wm831x_auxadc_read_36904 ++lm3533_als_get_target_36905 lm3533_als_get_target 0 36905 NULL ++show_fnode_chap_auth_36909 show_fnode_chap_auth 0 36909 NULL nohasharray ++send_next_seg_36909 send_next_seg 0 36909 &show_fnode_chap_auth_36909 ++zl10036_read_status_reg_36910 zl10036_read_status_reg 0 36910 NULL nohasharray ++set_mandatory_rates_36910 set_mandatory_rates 0 36910 &zl10036_read_status_reg_36910 ++cuse_read_36920 cuse_read 0-3 36920 NULL ++show_counter_rx_p2_hdr_egr_ovfls_36924 show_counter_rx_p2_hdr_egr_ovfls 0 36924 NULL nohasharray ++data_sock_getname_36924 data_sock_getname 0 36924 &show_counter_rx_p2_hdr_egr_ovfls_36924 ++store_lid_36925 store_lid 0-4 36925 NULL ++netxen_sysfs_read_dimm_36930 netxen_sysfs_read_dimm 0-5-6 36930 NULL ++queue_rq_affinity_show_36934 queue_rq_affinity_show 0 36934 NULL ++clock_name_show_36935 clock_name_show 0 36935 NULL nohasharray ++bnx2x_init_rss_36935 bnx2x_init_rss 0 36935 &clock_name_show_36935 ++ath5k_hw_write_initvals_36936 ath5k_hw_write_initvals 0 36936 NULL ++o2net_open_listening_sock_36944 o2net_open_listening_sock 0 36944 NULL ++kone_sysfs_write_profilex_36945 kone_sysfs_write_profilex 0-6-5 36945 NULL ++bonding_show_tlb_dynamic_lb_36946 bonding_show_tlb_dynamic_lb 0 36946 NULL nohasharray ++eem_opts_qmult_show_36946 eem_opts_qmult_show 0 36946 &bonding_show_tlb_dynamic_lb_36946 ++mptscsih_version_product_show_36948 mptscsih_version_product_show 0 36948 NULL ++bd2802_store_reg0x04_36949 bd2802_store_reg0x04 0-4 36949 NULL ++div_u64_36951 div_u64 0 36951 NULL ++write_leb_36957 write_leb 5-0 36957 NULL ++ntfs_external_attr_find_36963 ntfs_external_attr_find 0 36963 NULL ++ext4_da_write_end_36974 ext4_da_write_end 5-0 36974 NULL ++apei_exec_noop_36976 apei_exec_noop 0 36976 NULL ++il4965_rs_sta_dbgfs_scale_table_write_36979 il4965_rs_sta_dbgfs_scale_table_write 3-0 36979 NULL ++iscsi_tpg_attrib_store_generate_node_acls_36980 iscsi_tpg_attrib_store_generate_node_acls 0-3 36980 NULL ++afs_setattr_36981 afs_setattr 0 36981 NULL ++xfs_btree_check_sptr_36984 xfs_btree_check_sptr 0 36984 NULL ++usb_8dev_send_cmd_36987 usb_8dev_send_cmd 0 36987 NULL ++set_convrate_36989 set_convrate 0-4 36989 NULL ++wl1251_acx_feature_cfg_36990 wl1251_acx_feature_cfg 0 36990 NULL ++inv_mpu6050_set_power_itg_36994 inv_mpu6050_set_power_itg 0 36994 NULL ++v4l2_ctrl_s_ctrl_36995 v4l2_ctrl_s_ctrl 0 36995 NULL ++iscsi_tpg_param_store_OFMarker_36996 iscsi_tpg_param_store_OFMarker 0-3 36996 NULL ++mc13xxx_reg_rmw_36997 mc13xxx_reg_rmw 0 36997 NULL ++drbd_new_dev_size_36998 drbd_new_dev_size 0-3 36998 NULL nohasharray ++bcm_sendmsg_36998 bcm_sendmsg 0-4 36998 &drbd_new_dev_size_36998 ++auok190xfb_write_37001 auok190xfb_write 3 37001 NULL nohasharray ++jfs_ci_hash_37001 jfs_ci_hash 0 37001 &auok190xfb_write_37001 ++dmi_sysfs_attr_show_37003 dmi_sysfs_attr_show 0 37003 NULL ++setxattr_37006 setxattr 4 37006 NULL nohasharray ++ata_scsi_lpm_show_37006 ata_scsi_lpm_show 0 37006 &setxattr_37006 nohasharray ++md_set_readonly_37006 md_set_readonly 0 37006 &ata_scsi_lpm_show_37006 ++target_fabric_nacl_base_attr_store_37009 target_fabric_nacl_base_attr_store 0-4 37009 NULL ++make_nnode_dirty_37010 make_nnode_dirty 0 37010 NULL ++si4713_s_frequency_37011 si4713_s_frequency 0 37011 NULL ++force_lesc_support_write_37016 force_lesc_support_write 3-0 37016 NULL nohasharray ++cfq_fifo_expire_async_show_37016 cfq_fifo_expire_async_show 0 37016 &force_lesc_support_write_37016 ++dw2102_earda_i2c_transfer_37017 dw2102_earda_i2c_transfer 0-3 37017 NULL nohasharray ++manufacturer_id_show_37017 manufacturer_id_show 0 37017 &dw2102_earda_i2c_transfer_37017 ++__vsock_bind_37018 __vsock_bind 0 37018 NULL nohasharray ++write_byte_37018 write_byte 0 37018 &__vsock_bind_37018 ++pages_volatile_show_37019 pages_volatile_show 0 37019 NULL nohasharray ++gfs2_statfs_37019 gfs2_statfs 0 37019 &pages_volatile_show_37019 ++da9052_disable_vddout_channel_37021 da9052_disable_vddout_channel 0 37021 NULL ++smack_inode_getattr_37022 smack_inode_getattr 0 37022 NULL nohasharray ++lpfc_poll_tmo_store_37022 lpfc_poll_tmo_store 0-4 37022 &smack_inode_getattr_37022 ++fat_readpage_37025 fat_readpage 0 37025 NULL ++ec_i2c_xfer_37029 ec_i2c_xfer 3-0 37029 NULL ++ieee80211_chsw_switch_vifs_37030 ieee80211_chsw_switch_vifs 2 37030 NULL nohasharray ++wl1271_setup_37030 wl1271_setup 0 37030 &ieee80211_chsw_switch_vifs_37030 ++asd_poll_flash_37031 asd_poll_flash 0 37031 NULL ++af9005_usb_read_tuner_registers_37032 af9005_usb_read_tuner_registers 0 37032 NULL ++port_attr_show_37034 port_attr_show 0 37034 NULL nohasharray ++ndo_change_mtu_37034 ndo_change_mtu 0 37034 &port_attr_show_37034 ++ndo_netpoll_setup_37037 ndo_netpoll_setup 0 37037 NULL nohasharray ++be_get_eeprom_len_37037 be_get_eeprom_len 0 37037 &ndo_netpoll_setup_37037 ++command_file_read_37038 command_file_read 3-0 37038 NULL ++do_action_37040 do_action 0 37040 NULL nohasharray ++erst_write_37040 erst_write 0 37040 &do_action_37040 ++rcar_i2c_master_xfer_37044 rcar_i2c_master_xfer 0-3 37044 NULL ++raid5_store_stripe_cache_size_37050 raid5_store_stripe_cache_size 0-3 37050 NULL ++ieee80211_if_read_drop_unencrypted_37053 ieee80211_if_read_drop_unencrypted 3-0 37053 NULL nohasharray ++qp_broker_create_37053 qp_broker_create 5-6 37053 &ieee80211_if_read_drop_unencrypted_37053 ++pci_plx9050_init_37055 pci_plx9050_init 0 37055 NULL ++writebuf_skb_37060 writebuf_skb 0 37060 NULL ++fcoe_vport_destroy_37061 fcoe_vport_destroy 0 37061 NULL ++_iwl_dbgfs_bcast_filters_macs_write_37069 _iwl_dbgfs_bcast_filters_macs_write 3-0 37069 NULL ++logfs_write_rec_37072 logfs_write_rec 0 37072 NULL nohasharray ++vmci_transport_send_wrote_37072 vmci_transport_send_wrote 0 37072 &logfs_write_rec_37072 ++uhci_submit_bulk_37073 uhci_submit_bulk 0 37073 NULL ++ath10k_spectral_scan_config_37075 ath10k_spectral_scan_config 0 37075 NULL ++SYSC_setxattr_37078 SYSC_setxattr 4 37078 NULL ++parse_command_37079 parse_command 2-0 37079 NULL ++drm_mode_create_rotation_property_37082 drm_mode_create_rotation_property 2 37082 NULL ++resize_37084 resize 0 37084 NULL ++pipeline_cs_rx_packet_in_read_37089 pipeline_cs_rx_packet_in_read 3-0 37089 NULL nohasharray ++show_fcstat_loss_of_sync_count_37089 show_fcstat_loss_of_sync_count 0 37089 &pipeline_cs_rx_packet_in_read_37089 ++vbus_state_show_37099 vbus_state_show 0 37099 NULL ++cxgbi_get_ep_param_37101 cxgbi_get_ep_param 0 37101 NULL ++show_37102 show 0 37102 NULL ++store_bind_37104 store_bind 0-4 37104 NULL ++atkbd_do_show_force_release_37109 atkbd_do_show_force_release 0 37109 NULL nohasharray ++show_rxchan_per_port_37109 show_rxchan_per_port 0 37109 &atkbd_do_show_force_release_37109 nohasharray ++cpu_up_37109 cpu_up 0 37109 &show_rxchan_per_port_37109 ++radeon_hwmon_show_temp_thresh_37112 radeon_hwmon_show_temp_thresh 0 37112 NULL ++set_pwm_tmax_37113 set_pwm_tmax 0-4 37113 NULL ++xlog_grant_head_check_37116 xlog_grant_head_check 0 37116 NULL ++events_sysfs_show_37117 events_sysfs_show 0 37117 NULL ++modalias_show_37119 modalias_show 0 37119 NULL nohasharray ++ds1742_rtc_read_time_37119 ds1742_rtc_read_time 0 37119 &modalias_show_37119 ++show_nets_37127 show_nets 0 37127 NULL ++snd_pcm_plugin_build_io_37132 snd_pcm_plugin_build_io 0 37132 NULL nohasharray ++raid1_add_disk_37132 raid1_add_disk 0 37132 &snd_pcm_plugin_build_io_37132 nohasharray ++snd_hda_get_conn_list_37132 snd_hda_get_conn_list 0 37132 &raid1_add_disk_37132 ++iwl_mvm_config_scan_37134 iwl_mvm_config_scan 0 37134 NULL nohasharray ++bdx_rx_init_37134 bdx_rx_init 0 37134 &iwl_mvm_config_scan_37134 ++cp2112_write_read_req_37141 cp2112_write_read_req 0-6 37141 NULL ++chv_gpio_set_direction_37144 chv_gpio_set_direction 0 37144 NULL nohasharray ++o2nm_node_local_write_37144 o2nm_node_local_write 0-3 37144 &chv_gpio_set_direction_37144 ++bnx2x_nic_load_request_37147 bnx2x_nic_load_request 0 37147 NULL ++trusted_tpm_send_37151 trusted_tpm_send 0-3 37151 NULL ++handshake_37157 handshake 0 37157 NULL ++msg_word_37164 msg_word 0 37164 NULL ++alc_codec_rename_from_preset_37170 alc_codec_rename_from_preset 0 37170 NULL ++bop_last_key_37173 bop_last_key 0 37173 NULL ++boot_37174 boot 0 37174 NULL ++acpi_freeze_prepare_37175 acpi_freeze_prepare 0 37175 NULL ++intel_free_coherent_37179 intel_free_coherent 2 37179 NULL ++can_set_xattr_37182 can_set_xattr 0 37182 NULL ++tw68_buf_prepare_37186 tw68_buf_prepare 0 37186 NULL ++device_suspend_noirq_37187 device_suspend_noirq 0 37187 NULL ++alloc_page_ext_37189 alloc_page_ext 1 37189 NULL ++store_wimax_37196 store_wimax 4-0 37196 NULL ++vcc_recvmsg_37198 vcc_recvmsg 0-4 37198 NULL nohasharray ++smsc95xx_start_tx_path_37198 smsc95xx_start_tx_path 0 37198 &vcc_recvmsg_37198 ++efx_ethtool_get_rxfh_indir_size_37201 efx_ethtool_get_rxfh_indir_size 0 37201 NULL nohasharray ++ath10k_bmi_done_37201 ath10k_bmi_done 0 37201 &efx_ethtool_get_rxfh_indir_size_37201 ++team_vlan_rx_add_vid_37205 team_vlan_rx_add_vid 0 37205 NULL ++forced_ps_write_37209 forced_ps_write 3-0 37209 NULL nohasharray ++target_core_dev_pr_show_attr_res_pr_type_37209 target_core_dev_pr_show_attr_res_pr_type 0 37209 &forced_ps_write_37209 ++mwifiex_cmd_enh_power_mode_37210 mwifiex_cmd_enh_power_mode 0 37210 NULL nohasharray ++ipr_store_diagnostics_37210 ipr_store_diagnostics 0-4 37210 &mwifiex_cmd_enh_power_mode_37210 ++snd_dmaengine_pcm_trigger_37211 snd_dmaengine_pcm_trigger 0 37211 NULL ++snd_cx231xx_prepare_37213 snd_cx231xx_prepare 0 37213 NULL nohasharray ++fuse_notify_store_37213 fuse_notify_store 0 37213 &snd_cx231xx_prepare_37213 nohasharray ++bchannel_get_rxbuf_37213 bchannel_get_rxbuf 2 37213 &fuse_notify_store_37213 ++inv_show_37218 inv_show 0 37218 NULL ++regmap_access_read_file_37223 regmap_access_read_file 3-0 37223 NULL ++uwb_dev_IEs_show_37224 uwb_dev_IEs_show 0 37224 NULL nohasharray ++store_sas_phy_enable_37224 store_sas_phy_enable 0-4 37224 &uwb_dev_IEs_show_37224 ++__do_replace_37227 __do_replace 5 37227 NULL ++store_temp8_37228 store_temp8 0-4 37228 NULL ++st_sensors_set_enable_37232 st_sensors_set_enable 0 37232 NULL ++ctnetlink_secctx_size_37236 ctnetlink_secctx_size 0 37236 NULL ++iwl_dbgfs_d3_sram_read_37237 iwl_dbgfs_d3_sram_read 3-0 37237 NULL nohasharray ++connect_Bstack_37237 connect_Bstack 0 37237 &iwl_dbgfs_d3_sram_read_37237 ++rx_filter_dup_filter_read_37238 rx_filter_dup_filter_read 3-0 37238 NULL ++rapl_get_attr_cpumask_37239 rapl_get_attr_cpumask 0 37239 NULL ++nvkm_ioctl_path_37244 nvkm_ioctl_path 0 37244 NULL ++stac_auto_create_beep_ctls_37248 stac_auto_create_beep_ctls 0 37248 NULL ++prot_queue_del_37258 prot_queue_del 0 37258 NULL nohasharray ++misc_register_37258 misc_register 0 37258 &prot_queue_del_37258 ++ath6kl_wmi_set_ie_cmd_37260 ath6kl_wmi_set_ie_cmd 6 37260 NULL ++scsiback_tpg_show_nexus_37263 scsiback_tpg_show_nexus 0 37263 NULL nohasharray ++dwc3_gadget_start_config_37263 dwc3_gadget_start_config 0 37263 &scsiback_tpg_show_nexus_37263 ++ad7791_read_frequency_37264 ad7791_read_frequency 0 37264 NULL nohasharray ++ina209_set_interval_37264 ina209_set_interval 0-4 37264 &ad7791_read_frequency_37264 ++smsc9420_open_37268 smsc9420_open 0 37268 NULL nohasharray ++i40e_pf_rxq_wait_37268 i40e_pf_rxq_wait 0 37268 &smsc9420_open_37268 ++show_baud_rate_37269 show_baud_rate 0 37269 NULL ++_iwl_dbgfs_fw_restart_write_37270 _iwl_dbgfs_fw_restart_write 3-0 37270 NULL ++c101_run_37279 c101_run 2 37279 NULL ++xfs_vn_getattr_37281 xfs_vn_getattr 0 37281 NULL ++phy_reset_37283 phy_reset 0 37283 NULL ++contrast_show_37287 contrast_show 0 37287 NULL nohasharray ++typhoon_open_37287 typhoon_open 0 37287 &contrast_show_37287 ++command_37288 command 0 37288 NULL ++idt77252_send_37289 idt77252_send 0 37289 NULL nohasharray ++write_37289 write 0 37289 &idt77252_send_37289 ++isku_sysfs_write_talkfx_37298 isku_sysfs_write_talkfx 6-0-5 37298 NULL ++request_threaded_irq_37303 request_threaded_irq 0 37303 NULL ++governor_store_37304 governor_store 0-4 37304 NULL ++ieee80211_if_read_power_mode_37305 ieee80211_if_read_power_mode 3-0 37305 NULL nohasharray ++br_show_bridge_id_37305 br_show_bridge_id 0 37305 &ieee80211_if_read_power_mode_37305 nohasharray ++acpi_ds_init_callbacks_37305 acpi_ds_init_callbacks 0 37305 &br_show_bridge_id_37305 nohasharray ++rtl2832_sdr_set_tuner_37305 rtl2832_sdr_set_tuner 0 37305 &acpi_ds_init_callbacks_37305 ++tda998x_write_if_37306 tda998x_write_if 5 37306 NULL ++svga_compute_pll_37307 svga_compute_pll 0 37307 NULL ++jffs2_write_dirent_37311 jffs2_write_dirent 5 37311 NULL ++megasas_fw_crash_state_show_37312 megasas_fw_crash_state_show 0 37312 NULL ++composite_bind_37313 composite_bind 0 37313 NULL ++program_regs_37317 program_regs 0 37317 NULL ++sisusb_read_mem_bulk_37321 sisusb_read_mem_bulk 0 37321 NULL ++version_show_37322 version_show 0 37322 NULL ++power_mode_store_37324 power_mode_store 0-4 37324 NULL ++kern_path_37329 kern_path 0 37329 NULL ++scsi_mode_select_37330 scsi_mode_select 6 37330 NULL ++rxrpc_server_sendmsg_37331 rxrpc_server_sendmsg 4 37331 NULL ++xfs_iomap_write_allocate_37336 xfs_iomap_write_allocate 0 37336 NULL nohasharray ++__dev_set_promiscuity_37336 __dev_set_promiscuity 0 37336 &xfs_iomap_write_allocate_37336 ++get_any_page_37337 get_any_page 0 37337 NULL ++memory_read_from_buffer_37339 memory_read_from_buffer 0-5-2 37339 NULL ++show_fw_pages_37341 show_fw_pages 0 37341 NULL ++nfs_launder_page_37343 nfs_launder_page 0 37343 NULL nohasharray ++lbs_mesh_dev_open_37343 lbs_mesh_dev_open 0 37343 &nfs_launder_page_37343 ++fcoe_vport_disable_37346 fcoe_vport_disable 0 37346 NULL ++xfs_attr_fillstate_37349 xfs_attr_fillstate 0 37349 NULL ++pm8001_show_update_fw_37350 pm8001_show_update_fw 0 37350 NULL ++nf_bridge_pad_37351 nf_bridge_pad 0 37351 NULL ++security_inode_getsecurity_37354 security_inode_getsecurity 0 37354 NULL ++show_fc_vport_vport_type_37362 show_fc_vport_vport_type 0 37362 NULL ++toshiba_touchpad_store_37363 toshiba_touchpad_store 0-4 37363 NULL ++cpuset_write_u64_37367 cpuset_write_u64 0 37367 NULL ++isku_sysfs_set_actual_profile_37369 isku_sysfs_set_actual_profile 0-4 37369 NULL ++compat_SyS_fcntl_37376 compat_SyS_fcntl 3 37376 NULL ++xcan_open_37377 xcan_open 0 37377 NULL ++sched_domains_numa_masks_update_37380 sched_domains_numa_masks_update 0 37380 NULL ++queue_discard_zeroes_data_show_37381 queue_discard_zeroes_data_show 0 37381 NULL ++mmc_raw_rpmb_size_mult_show_37385 mmc_raw_rpmb_size_mult_show 0 37385 NULL nohasharray ++setup_bd_list_xfr_37385 setup_bd_list_xfr 0 37385 &mmc_raw_rpmb_size_mult_show_37385 ++iommu_num_pages_37391 iommu_num_pages 0-2-3-1 37391 NULL ++snd_seq_port_disconnect_37395 snd_seq_port_disconnect 0 37395 NULL ++cifs_ci_hash_37396 cifs_ci_hash 0 37396 NULL ++qla4xxx_get_iface_param_37398 qla4xxx_get_iface_param 0 37398 NULL nohasharray ++adp8870_store_37398 adp8870_store 0-3 37398 &qla4xxx_get_iface_param_37398 ++hidp_output_report_37401 hidp_output_report 0-3 37401 NULL ++channel_set_37410 channel_set 0-4 37410 NULL ++xfs_filestream_pick_ag_37411 xfs_filestream_pick_ag 0 37411 NULL ++sys_getxattr_37418 sys_getxattr 4 37418 NULL nohasharray ++max14577_set_fast_charge_timer_37418 max14577_set_fast_charge_timer 0 37418 &sys_getxattr_37418 ++hci_sock_sendmsg_37420 hci_sock_sendmsg 4-0 37420 NULL ++acpi_os_allocate_zeroed_37422 acpi_os_allocate_zeroed 1 37422 NULL nohasharray ++find_next_bit_37422 find_next_bit 0-3-2 37422 &acpi_os_allocate_zeroed_37422 ++tty_insert_flip_string_fixed_flag_37428 tty_insert_flip_string_fixed_flag 4-0 37428 NULL nohasharray ++it8712f_wdt_notify_37428 it8712f_wdt_notify 0 37428 &tty_insert_flip_string_fixed_flag_37428 ++iwl_print_last_event_logs_37433 iwl_print_last_event_logs 7-9-0 37433 NULL ++tty_audit_log_37440 tty_audit_log 5 37440 NULL ++fru_alloc_37442 fru_alloc 1 37442 NULL ++show_als_en_37445 show_als_en 0 37445 NULL ++epia_read_regr_37446 epia_read_regr 0 37446 NULL ++skein512_init_37449 skein512_init 0 37449 NULL ++tcp_established_options_37450 tcp_established_options 0 37450 NULL ++xfs_btree_dec_cursor_37452 xfs_btree_dec_cursor 0 37452 NULL ++snd_hdsp_reset_37453 snd_hdsp_reset 0 37453 NULL ++set_rdac5_37458 set_rdac5 0-4 37458 NULL ++snd_hda_codec_reset_37461 snd_hda_codec_reset 0 37461 NULL ++padlock_sha_update_37462 padlock_sha_update 0 37462 NULL ++ext4_write_end_37464 ext4_write_end 5-0 37464 NULL ++parport_mos7715_write_compat_37465 parport_mos7715_write_compat 0 37465 NULL ++dummy_systimer_stop_37470 dummy_systimer_stop 0 37470 NULL ++ufs_data_ptr_to_cpu_37475 ufs_data_ptr_to_cpu 0 37475 NULL ++prepare_header80_37479 prepare_header80 0 37479 NULL ++get_est_timing_37484 get_est_timing 0 37484 NULL ++store_temp_max_hyst_37485 store_temp_max_hyst 0-4 37485 NULL ++freerunning_timer_show_37486 freerunning_timer_show 0 37486 NULL nohasharray ++logi_dj_recv_forward_hidpp_37486 logi_dj_recv_forward_hidpp 3 37486 &freerunning_timer_show_37486 ++kmem_realloc_37489 kmem_realloc 2 37489 NULL nohasharray ++__hci_cmd_sync_ev_37489 __hci_cmd_sync_ev 3 37489 &kmem_realloc_37489 ++gro_flush_timeout_store_37491 gro_flush_timeout_store 0-4 37491 NULL ++ntfs_dir_fsync_37494 ntfs_dir_fsync 0 37494 NULL nohasharray ++security_validate_transition_37494 security_validate_transition 0 37494 &ntfs_dir_fsync_37494 ++show_counter_rx_max_min_len_errs_37497 show_counter_rx_max_min_len_errs 0 37497 NULL nohasharray ++packet_create_37497 packet_create 0 37497 &show_counter_rx_max_min_len_errs_37497 ++__hfsplus_setxattr_37499 __hfsplus_setxattr 0 37499 NULL nohasharray ++store_control_state_37499 store_control_state 0-4 37499 &__hfsplus_setxattr_37499 ++smk_bu_task_37506 smk_bu_task 0-3 37506 NULL ++r820t_set_params_37510 r820t_set_params 0 37510 NULL ++ipr_show_resource_type_37511 ipr_show_resource_type 0 37511 NULL ++osc_active_seq_write_37514 osc_active_seq_write 3 37514 NULL ++set_pwm_auto_point_pwm_37518 set_pwm_auto_point_pwm 0-4 37518 NULL ++vmalloc_32_user_37519 vmalloc_32_user 1 37519 NULL nohasharray ++bdev_writeseg_37519 bdev_writeseg 2-3 37519 &vmalloc_32_user_37519 ++__uncore_filter_state3_show_37525 __uncore_filter_state3_show 0 37525 NULL ++srp_create_ch_ib_37526 srp_create_ch_ib 0 37526 NULL ++xz_dec_test_write_37527 xz_dec_test_write 3-0 37527 NULL ++stv06xx_isoc_init_37530 stv06xx_isoc_init 0 37530 NULL ++security_get_bool_value_37532 security_get_bool_value 0 37532 NULL ++fault_inject_read_37534 fault_inject_read 3-0 37534 NULL ++ds2780_read16_37538 ds2780_read16 3-0 37538 NULL ++_nfs4_do_open_37544 _nfs4_do_open 0 37544 NULL ++extent_map_end_37550 extent_map_end 0 37550 NULL ++nf_nat_mangle_tcp_packet_37551 nf_nat_mangle_tcp_packet 6-8 37551 NULL ++fat_cont_expand_37552 fat_cont_expand 0 37552 NULL ++parport_ax88796_read_data_37553 parport_ax88796_read_data 0 37553 NULL ++vmci_transport_notify_recv_pre_dequeue_37555 vmci_transport_notify_recv_pre_dequeue 0 37555 NULL ++show_37574 show 0 37574 NULL ++afs_page_filler_37575 afs_page_filler 0 37575 NULL ++tda18271_channel_configuration_37577 tda18271_channel_configuration 0 37577 NULL ++block_show_37580 block_show 0 37580 NULL ++ceph_getxattr_37583 ceph_getxattr 0 37583 NULL ++xhci_alloc_streams_37586 xhci_alloc_streams 5 37586 NULL ++pyra_sysfs_show_actual_cpi_37592 pyra_sysfs_show_actual_cpi 0 37592 NULL nohasharray ++check_vb_with_fmt_37592 check_vb_with_fmt 0 37592 &pyra_sysfs_show_actual_cpi_37592 ++alloc_descs_37593 alloc_descs 0-1 37593 NULL ++qset_add_urb_37596 qset_add_urb 0 37596 NULL ++show_lid_state_37597 show_lid_state 0 37597 NULL ++bnx2x_sriov_configure_37600 bnx2x_sriov_configure 0-2 37600 NULL ++read_field_37603 read_field 0 37603 NULL ++vv6410_set_analog_gain_37606 vv6410_set_analog_gain 0 37606 NULL ++ext2_freeze_37607 ext2_freeze 0 37607 NULL nohasharray ++mlx4_get_mgm_entry_size_37607 mlx4_get_mgm_entry_size 0 37607 &ext2_freeze_37607 ++smsc95xx_write_reg_37608 smsc95xx_write_reg 0 37608 NULL ++kvm_read_guest_page_mmu_37611 kvm_read_guest_page_mmu 6 37611 NULL ++ssb_pcmcia_attr_sprom_store_37614 ssb_pcmcia_attr_sprom_store 0-4 37614 NULL nohasharray ++sysfs_get_uname_37614 sysfs_get_uname 0-3 37614 &ssb_pcmcia_attr_sprom_store_37614 ++sha1_export_37617 sha1_export 0 37617 NULL ++bonding_show_updelay_37620 bonding_show_updelay 0 37620 NULL nohasharray ++node_read_meminfo_37620 node_read_meminfo 0 37620 &bonding_show_updelay_37620 ++SYSC_mbind_37622 SYSC_mbind 5 37622 NULL ++cdc_ncm_show_dwNtbOutMaxSize_37627 cdc_ncm_show_dwNtbOutMaxSize 0 37627 NULL ++rd_byte_37632 rd_byte 0 37632 NULL ++os_desc_b_vendor_code_store_37633 os_desc_b_vendor_code_store 0-3 37633 NULL ++__hw_addr_add_37635 __hw_addr_add 0 37635 NULL ++alloc_fd_37637 alloc_fd 1 37637 NULL nohasharray ++show_iface_vlan_priority_37637 show_iface_vlan_priority 0 37637 &alloc_fd_37637 ++SyS_mbind_37638 SyS_mbind 5 37638 NULL ++show_tolerance0_37643 show_tolerance0 0 37643 NULL ++_ctl_fwfault_debug_store_37644 _ctl_fwfault_debug_store 0-4 37644 NULL ++po1030_set_auto_exposure_37656 po1030_set_auto_exposure 0 37656 NULL ++ageing_time_show_37657 ageing_time_show 0 37657 NULL nohasharray ++atkbd_do_show_softrepeat_37657 atkbd_do_show_softrepeat 0 37657 &ageing_time_show_37657 ++bio_copy_user_iov_37660 bio_copy_user_iov 4 37660 NULL ++vmw_framebuffer_dmabuf_dirty_37661 vmw_framebuffer_dmabuf_dirty 6 37661 NULL nohasharray ++rfcomm_sock_sendmsg_37661 rfcomm_sock_sendmsg 4-0 37661 &vmw_framebuffer_dmabuf_dirty_37661 ++atxp1_storegpio2_37663 atxp1_storegpio2 0-4 37663 NULL ++SYSC_get_mempolicy_37664 SYSC_get_mempolicy 3 37664 NULL nohasharray ++mwifiex_set_aes_key_v2_37664 mwifiex_set_aes_key_v2 0 37664 &SYSC_get_mempolicy_37664 ++mptscsih_version_nvdata_default_show_37665 mptscsih_version_nvdata_default_show 0 37665 NULL nohasharray ++nodename_show_37665 nodename_show 0 37665 &mptscsih_version_nvdata_default_show_37665 nohasharray ++pc300_open_37665 pc300_open 0 37665 &nodename_show_37665 ++tcp_mss_split_point_37668 tcp_mss_split_point 0-4-3 37668 NULL ++mlx4_INIT_PORT_37672 mlx4_INIT_PORT 0 37672 NULL nohasharray ++m_can_open_37672 m_can_open 0 37672 &mlx4_INIT_PORT_37672 nohasharray ++__wa_seg_calculate_isoc_frame_count_37672 __wa_seg_calculate_isoc_frame_count 0 37672 &m_can_open_37672 ++xfs_setattr_size_37673 xfs_setattr_size 0 37673 NULL ++ieee80211_if_read_rc_rateidx_mcs_mask_2ghz_37675 ieee80211_if_read_rc_rateidx_mcs_mask_2ghz 3-0 37675 NULL nohasharray ++batadv_get_vid_37675 batadv_get_vid 2 37675 &ieee80211_if_read_rc_rateidx_mcs_mask_2ghz_37675 ++i7300_idle_notifier_37681 i7300_idle_notifier 0 37681 NULL nohasharray ++__hw_addr_del_ex_37681 __hw_addr_del_ex 0 37681 &i7300_idle_notifier_37681 ++tracing_saved_cmdlines_size_write_37684 tracing_saved_cmdlines_size_write 3 37684 NULL ++regmap_map_read_file_37685 regmap_map_read_file 0-3 37685 NULL ++video_expand_toggle_37689 video_expand_toggle 0 37689 NULL ++show_bool_threeg_37690 show_bool_threeg 0 37690 NULL ++parse_arg_37696 parse_arg 0 37696 NULL ++smic_size_37697 smic_size 0 37697 NULL ++nametbl_header_37698 nametbl_header 0-2 37698 NULL ++show_srp_rport_dev_loss_tmo_37699 show_srp_rport_dev_loss_tmo 0 37699 NULL ++gadget_dev_desc_idVendor_show_37700 gadget_dev_desc_idVendor_show 0 37700 NULL ++brcmf_sdiod_recv_chain_37701 brcmf_sdiod_recv_chain 3 37701 NULL ++spmi_ext_register_read_37702 spmi_ext_register_read 0 37702 NULL nohasharray ++ata_scsi_change_queue_depth_37702 ata_scsi_change_queue_depth 0-2 37702 &spmi_ext_register_read_37702 ++smp_req_37703 smp_req 0 37703 NULL ++iscsi_stat_tgt_attr_show_attr_fail_intr_addr_37712 iscsi_stat_tgt_attr_show_attr_fail_intr_addr 0 37712 NULL ++dynamic_ps_timeout_write_37713 dynamic_ps_timeout_write 3-0 37713 NULL ++synthvid_send_situ_37714 synthvid_send_situ 0 37714 NULL ++nilfs_mdt_create_block_37716 nilfs_mdt_create_block 0 37716 NULL ++parport_ieee1284_epp_write_data_37717 parport_ieee1284_epp_write_data 0 37717 NULL nohasharray ++ds1343_show_glitchfilter_37717 ds1343_show_glitchfilter 0 37717 &parport_ieee1284_epp_write_data_37717 ++xen_swiotlb_map_sg_attrs_37718 xen_swiotlb_map_sg_attrs 0-3 37718 NULL ++ext2_fsync_37729 ext2_fsync 0 37729 NULL ++rsxx_creg_write_37733 rsxx_creg_write 0 37733 NULL ++snd_hda_create_spdif_share_sw_37734 snd_hda_create_spdif_share_sw 0 37734 NULL ++logfs_read_block_37735 logfs_read_block 0 37735 NULL ++show_rdac1_37741 show_rdac1 0 37741 NULL nohasharray ++pch_phub_bin_write_37741 pch_phub_bin_write 0-6-5 37741 &show_rdac1_37741 ++read_enabled_file_bool_37744 read_enabled_file_bool 3-0 37744 NULL ++wiphy_new_nm_37746 wiphy_new_nm 2 37746 NULL ++ql_set_routing_reg_37747 ql_set_routing_reg 0 37747 NULL ++xfs_read_agf_37749 xfs_read_agf 0 37749 NULL ++ocfs2_control_cfu_37750 ocfs2_control_cfu 2-0 37750 NULL ++ipath_cdev_init_37752 ipath_cdev_init 1 37752 NULL ++snd_cx25821_prepare_37765 snd_cx25821_prepare 0 37765 NULL nohasharray ++pre_action_37765 pre_action 0 37765 &snd_cx25821_prepare_37765 nohasharray ++osst_flush_write_buffer_37765 osst_flush_write_buffer 0 37765 &pre_action_37765 ++dccp_setsockopt_cscov_37766 dccp_setsockopt_cscov 2-0 37766 NULL ++filemap_flush_37767 filemap_flush 0 37767 NULL ++__uncore_storage_mode_show_37771 __uncore_storage_mode_show 0 37771 NULL ++ext4_commit_super_37775 ext4_commit_super 0 37775 NULL ++__il3945_up_37778 __il3945_up 0 37778 NULL ++elants_i2c_do_update_firmware_37779 elants_i2c_do_update_firmware 0 37779 NULL ++crkey_timeout_37781 crkey_timeout 0 37781 NULL ++mc13xxx_irq_free_37784 mc13xxx_irq_free 2 37784 NULL ++mxt_lookup_bootloader_address_37785 mxt_lookup_bootloader_address 0 37785 NULL ++il4965_rs_sta_dbgfs_rate_scale_data_read_37792 il4965_rs_sta_dbgfs_rate_scale_data_read 3-0 37792 NULL nohasharray ++orinoco_up_37792 orinoco_up 0 37792 &il4965_rs_sta_dbgfs_rate_scale_data_read_37792 ++nr_open_37793 nr_open 0 37793 NULL ++bnx2x_enable_sriov_37796 bnx2x_enable_sriov 0 37796 NULL ++read_posted_37797 read_posted 0 37797 NULL nohasharray ++caif_net_open_37797 caif_net_open 0 37797 &read_posted_37797 ++arcmsr_attr_host_fw_numbers_queue_37799 arcmsr_attr_host_fw_numbers_queue 0 37799 NULL ++no_lun_0_show_37800 no_lun_0_show 0 37800 NULL ++rapl_sysfs_show_37802 rapl_sysfs_show 0 37802 NULL ++smk_read_logging_37804 smk_read_logging 3-0 37804 NULL ++setup_irq_37809 setup_irq 0 37809 NULL ++carl9170_init_phy_37810 carl9170_init_phy 0 37810 NULL ++ocrdma_alloc_frmr_page_list_37815 ocrdma_alloc_frmr_page_list 2 37815 NULL nohasharray ++show_ipReasmTimeout_37815 show_ipReasmTimeout 0 37815 &ocrdma_alloc_frmr_page_list_37815 ++rx_decrypt_key_not_found_read_37820 rx_decrypt_key_not_found_read 3-0 37820 NULL nohasharray ++nouveau_hwmon_show_update_rate_37820 nouveau_hwmon_show_update_rate 0 37820 &rx_decrypt_key_not_found_read_37820 ++mlx4_cmd_post_37826 mlx4_cmd_post 0 37826 NULL ++bitmap_find_next_zero_area_37827 bitmap_find_next_zero_area 3-0-4-5-2 37827 NULL ++mwl8k_add_interface_37842 mwl8k_add_interface 0 37842 NULL ++store_sf2_point_37843 store_sf2_point 0-4 37843 NULL ++sr_write_medium_mode_37845 sr_write_medium_mode 0 37845 NULL ++kernfs_dop_revalidate_37848 kernfs_dop_revalidate 0 37848 NULL ++o2hb_debug_read_37851 o2hb_debug_read 3-0 37851 NULL ++iscsi_disc_store_enforce_discovery_auth_37853 iscsi_disc_store_enforce_discovery_auth 0-3 37853 NULL ++snd_hda_jack_add_kctl_37854 snd_hda_jack_add_kctl 0 37854 NULL ++reiserfs_insert_item_37860 reiserfs_insert_item 0 37860 NULL ++wm8350_gpio_direction_out_37862 wm8350_gpio_direction_out 0 37862 NULL nohasharray ++SYSC_pwrite64_37862 SYSC_pwrite64 3 37862 &wm8350_gpio_direction_out_37862 ++xfs_dir2_block_to_sf_37868 xfs_dir2_block_to_sf 3 37868 NULL nohasharray ++isku_sysfs_write_last_set_37868 isku_sysfs_write_last_set 6-0-5 37868 &xfs_dir2_block_to_sf_37868 ++arcmsr_sysfs_iop_message_read_37870 arcmsr_sysfs_iop_message_read 0-5-6 37870 NULL nohasharray ++i40e_dbg_netdev_ops_read_37870 i40e_dbg_netdev_ops_read 0-3 37870 &arcmsr_sysfs_iop_message_read_37870 ++sys_setxattr_37880 sys_setxattr 4 37880 NULL ++dev_port_show_37881 dev_port_show 0 37881 NULL ++set_registers_37883 set_registers 4 37883 NULL ++dvb_net_sec_37884 dvb_net_sec 3 37884 NULL ++s2250_s_mbus_fmt_37894 s2250_s_mbus_fmt 0 37894 NULL ++xirc2ps_suspend_37895 xirc2ps_suspend 0 37895 NULL ++compat_sys_rt_sigpending_37899 compat_sys_rt_sigpending 2 37899 NULL ++pubek_show_37903 pubek_show 0 37903 NULL ++compiler_show_37905 compiler_show 0 37905 NULL ++show_target_37913 show_target 0 37913 NULL ++skein256_export_37917 skein256_export 0 37917 NULL ++viacam_vb_buf_prepare_37918 viacam_vb_buf_prepare 0 37918 NULL ++elan_i2c_calibrate_result_37927 elan_i2c_calibrate_result 0 37927 NULL ++pkt_alloc_packet_data_37928 pkt_alloc_packet_data 1 37928 NULL nohasharray ++_rtw_malloc_37928 _rtw_malloc 1 37928 &pkt_alloc_packet_data_37928 ++set_pwmchan_37930 set_pwmchan 0-4 37930 NULL ++toshiba_accelerometer_get_37934 toshiba_accelerometer_get 0 37934 NULL ++ath5k_attr_store_spur_level_37935 ath5k_attr_store_spur_level 0-4 37935 NULL ++read_rbu_packet_size_37939 read_rbu_packet_size 6-0-5 37939 NULL nohasharray ++b43_dma_init_37939 b43_dma_init 0 37939 &read_rbu_packet_size_37939 ++show_iostat_iodone_cnt_37942 show_iostat_iodone_cnt 0 37942 NULL nohasharray ++adp8860_bl_l2_office_dim_store_37942 adp8860_bl_l2_office_dim_store 4-0 37942 &show_iostat_iodone_cnt_37942 ++show_counter_rx_data_pkts_37943 show_counter_rx_data_pkts 0 37943 NULL ++nilfs_writepages_37944 nilfs_writepages 0 37944 NULL ++tcm_qla2xxx_tpg_attrib_store_demo_mode_write_protect_37947 tcm_qla2xxx_tpg_attrib_store_demo_mode_write_protect 0-3 37947 NULL ++max8997_get_enable_register_37955 max8997_get_enable_register 0 37955 NULL nohasharray ++cdc_ncm_show_wNdpOutDivisor_37955 cdc_ncm_show_wNdpOutDivisor 0 37955 &max8997_get_enable_register_37955 ++netbios_ns_help_37956 netbios_ns_help 0 37956 NULL nohasharray ++permissive_add_37956 permissive_add 0-3 37956 &netbios_ns_help_37956 ++write_file_bool_37957 write_file_bool 3-0 37957 NULL nohasharray ++abx500_mask_and_set_register_interruptible_37957 abx500_mask_and_set_register_interruptible 0 37957 &write_file_bool_37957 ++fifo_alloc_37961 fifo_alloc 1 37961 NULL ++ad5398_is_enabled_37962 ad5398_is_enabled 0 37962 NULL ++show_constraint_min_time_window_us_37963 show_constraint_min_time_window_us 0 37963 NULL ++ext3_free_blocks_sb_37967 ext3_free_blocks_sb 4-3 37967 NULL nohasharray ++target_stat_scsi_transport_show_attr_indx_37967 target_stat_scsi_transport_show_attr_indx 0 37967 &ext3_free_blocks_sb_37967 ++fc0011_get_if_frequency_37970 fc0011_get_if_frequency 0 37970 NULL ++g2d_s_ctrl_37974 g2d_s_ctrl 0 37974 NULL ++show_tolerance1_37984 show_tolerance1 0 37984 NULL ++isl1208_sysfs_show_usr_37987 isl1208_sysfs_show_usr 0 37987 NULL ++rds_rdma_extra_size_37990 rds_rdma_extra_size 0 37990 NULL nohasharray ++netxen_nic_change_mtu_37990 netxen_nic_change_mtu 0 37990 &rds_rdma_extra_size_37990 ++of_regulator_match_37995 of_regulator_match 0 37995 NULL ++persistent_ram_old_size_37997 persistent_ram_old_size 0 37997 NULL nohasharray ++fm10k_update_vid_37997 fm10k_update_vid 0 37997 &persistent_ram_old_size_37997 ++tcm_qla2xxx_tpg_attrib_store_prod_mode_write_protect_37998 tcm_qla2xxx_tpg_attrib_store_prod_mode_write_protect 0-3 37998 NULL ++ma901radio_set_volume_38000 ma901radio_set_volume 0 38000 NULL nohasharray ++lio_target_nacl_store_cmdsn_depth_38000 lio_target_nacl_store_cmdsn_depth 0-3 38000 &ma901radio_set_volume_38000 ++cxacru_sysfs_show_upstream_fec_errors_38002 cxacru_sysfs_show_upstream_fec_errors 0 38002 NULL ++pm8001_task_exec_38005 pm8001_task_exec 0 38005 NULL ++set_fan_auto1_38006 set_fan_auto1 0-4 38006 NULL ++lpfc_fips_rev_show_38009 lpfc_fips_rev_show 0 38009 NULL ++store_mem_gpio_reg_38010 store_mem_gpio_reg 0-4 38010 NULL ++vfs_readv_38011 vfs_readv 3-0 38011 NULL ++edd_show_extensions_38013 edd_show_extensions 0 38013 NULL ++rndis_opts_qmult_show_38015 rndis_opts_qmult_show 0 38015 NULL ++init_dma_38018 init_dma 0 38018 NULL ++crc32_init_38021 crc32_init 0 38021 NULL ++show_beep_38022 show_beep 0 38022 NULL ++twl4030_pwm_enable_38032 twl4030_pwm_enable 0 38032 NULL ++ufs_commit_chunk_38036 ufs_commit_chunk 3 38036 NULL nohasharray ++wl1251_acx_rx_msdu_life_time_38036 wl1251_acx_rx_msdu_life_time 0 38036 &ufs_commit_chunk_38036 nohasharray ++md_integrity_register_38036 md_integrity_register 0 38036 &wl1251_acx_rx_msdu_life_time_38036 ++aggr_recv_addba_req_evt_38037 aggr_recv_addba_req_evt 4 38037 NULL ++store_wlan_38040 store_wlan 4-0 38040 NULL ++SyS_pwrite64_38041 SyS_pwrite64 3 38041 NULL ++acpi_ds_call_control_method_38042 acpi_ds_call_control_method 0 38042 NULL ++il_dbgfs_chain_noise_read_38044 il_dbgfs_chain_noise_read 3-0 38044 NULL nohasharray ++klsi_105_prepare_write_buffer_38044 klsi_105_prepare_write_buffer 3 38044 &il_dbgfs_chain_noise_read_38044 ++cpia2_send_command_38045 cpia2_send_command 0 38045 NULL ++parser_init_guts_38046 parser_init_guts 2 38046 NULL ++pmbus_set_page_38048 pmbus_set_page 0 38048 NULL nohasharray ++SyS_llistxattr_38048 SyS_llistxattr 3 38048 &pmbus_set_page_38048 ++sysfs_do_create_link_38051 sysfs_do_create_link 0 38051 NULL ++create_l2entity_38053 create_l2entity 0 38053 NULL ++crypto_shash_extsize_38055 crypto_shash_extsize 0 38055 NULL ++_xfs_buf_alloc_38058 _xfs_buf_alloc 3 38058 NULL ++usb_os_desc_ext_prop_attr_store_38059 usb_os_desc_ext_prop_attr_store 0-4 38059 NULL ++nsm_create_handle_38060 nsm_create_handle 4 38060 NULL ++patch_ca0110_38064 patch_ca0110 0 38064 NULL ++gether_set_host_addr_38065 gether_set_host_addr 0 38065 NULL ++alloc_ltalkdev_38071 alloc_ltalkdev 1 38071 NULL ++cifs_send_async_read_38077 cifs_send_async_read 2-0 38077 NULL ++plip_open_38078 plip_open 0 38078 NULL ++niu_tx_channel_stop_38080 niu_tx_channel_stop 0 38080 NULL ++xfs_buf_readahead_map_38081 xfs_buf_readahead_map 3 38081 NULL nohasharray ++wcn36xx_smd_rsp_process_38081 wcn36xx_smd_rsp_process 3 38081 &xfs_buf_readahead_map_38081 ++read_38082 read 0 38082 NULL ++s5p_mfc_queue_setup_38084 s5p_mfc_queue_setup 0 38084 NULL ++uwb_mac_addr_print_38085 uwb_mac_addr_print 2-0 38085 NULL ++rtl8821ae_hw_init_38087 rtl8821ae_hw_init 0 38087 NULL ++tcf_csum_ipv4_udp_38089 tcf_csum_ipv4_udp 3 38089 NULL ++request_key_auth_new_38092 request_key_auth_new 3 38092 NULL ++proc_self_readlink_38094 proc_self_readlink 3-0 38094 NULL nohasharray ++hdpvr_config_call_38094 hdpvr_config_call 0 38094 &proc_self_readlink_38094 nohasharray ++ib_query_gid_38094 ib_query_gid 0 38094 &hdpvr_config_call_38094 ++ep0_read_38095 ep0_read 3 38095 NULL ++osc_checksum_seq_write_38096 osc_checksum_seq_write 3 38096 NULL ++vport_delete_38098 vport_delete 0 38098 NULL ++ath10k_mem_value_read_38099 ath10k_mem_value_read 3-0 38099 NULL ++o2hb_read_slots_38105 o2hb_read_slots 2 38105 NULL ++snd_pcm_oss_write_38108 snd_pcm_oss_write 3-0 38108 NULL nohasharray ++temp_cpu_38108 temp_cpu 0 38108 &snd_pcm_oss_write_38108 ++input_dev_show_id_product_38109 input_dev_show_id_product 0 38109 NULL ++snd_hdsp_channel_info_38123 snd_hdsp_channel_info 0 38123 NULL ++vmw_kms_present_38130 vmw_kms_present 9 38130 NULL ++intervals_show_38131 intervals_show 0 38131 NULL ++show_ipv6_iface_ipaddr_autocfg_38132 show_ipv6_iface_ipaddr_autocfg 0 38132 NULL ++device_store_ulong_38134 device_store_ulong 0-4 38134 NULL ++create_hp_mic_jack_mode_38136 create_hp_mic_jack_mode 0 38136 NULL ++units_show_38139 units_show 0 38139 NULL ++posix_lock_file_wait_38140 posix_lock_file_wait 0 38140 NULL ++twl4030_madc_enable_irq_38141 twl4030_madc_enable_irq 0 38141 NULL nohasharray ++sm501_dbg_regs_38141 sm501_dbg_regs 0 38141 &twl4030_madc_enable_irq_38141 ++rtl8169_change_mtu_38142 rtl8169_change_mtu 0 38142 NULL ++jfs_readpage_38145 jfs_readpage 0 38145 NULL ++bonding_show_active_slave_38152 bonding_show_active_slave 0 38152 NULL ++__ntfs_copy_from_user_iovec_inatomic_38153 __ntfs_copy_from_user_iovec_inatomic 0-4-3 38153 NULL ++gss_import_sec_context_38154 gss_import_sec_context 0 38154 NULL ++fbcon_fb_unregistered_38168 fbcon_fb_unregistered 0 38168 NULL ++snd_ca0106_pcm_trigger_capture_38169 snd_ca0106_pcm_trigger_capture 0 38169 NULL nohasharray ++amb_open_38169 amb_open 0 38169 &snd_ca0106_pcm_trigger_capture_38169 ++diolan_usb_xfer_38173 diolan_usb_xfer 0-3 38173 NULL ++ds2781_store_eeprom_38175 ds2781_store_eeprom 0 38175 NULL ++cdev_add_38176 cdev_add 2-3-0 38176 NULL ++wil_write_file_reset_38180 wil_write_file_reset 0-3 38180 NULL nohasharray ++store_spi_transport_offset_38180 store_spi_transport_offset 0-4 38180 &wil_write_file_reset_38180 ++qlcnic_83xx_get_nic_info_38183 qlcnic_83xx_get_nic_info 0 38183 NULL ++max8925_rtc_set_alarm_38184 max8925_rtc_set_alarm 0 38184 NULL ++elsa_suspend_38189 elsa_suspend 0 38189 NULL ++do_path_lookup_38193 do_path_lookup 0 38193 NULL nohasharray ++readlink_38193 readlink 0 38193 &do_path_lookup_38193 ++rt2x00debug_write_rf_38195 rt2x00debug_write_rf 3-0 38195 NULL ++acerhdf_get_ec_temp_38197 acerhdf_get_ec_temp 0 38197 NULL ++deadline_var_store_38198 deadline_var_store 0-3 38198 NULL ++shark_write_reg_38200 shark_write_reg 0 38200 NULL ++get_ucode_user_38202 get_ucode_user 3 38202 NULL ++ext3_new_block_38208 ext3_new_block 3-0 38208 NULL ++i2400m_tx_stats_write_38211 i2400m_tx_stats_write 0-3 38211 NULL ++validate_unlock_args_38214 validate_unlock_args 0 38214 NULL ++vmxnet3_rq_create_all_38222 vmxnet3_rq_create_all 0 38222 NULL ++osd_req_list_partition_collections_38223 osd_req_list_partition_collections 5 38223 NULL nohasharray ++xfs_rtallocate_range_38223 xfs_rtallocate_range 0 38223 &osd_req_list_partition_collections_38223 ++tg3_chip_reset_38224 tg3_chip_reset 0 38224 NULL ++store_alert_led_38228 store_alert_led 0-4 38228 NULL ++target_core_dev_pr_show_attr_res_holder_38231 target_core_dev_pr_show_attr_res_holder 0 38231 NULL ++st_sensors_set_axis_enable_38232 st_sensors_set_axis_enable 0 38232 NULL ++inet_csk_listen_start_38233 inet_csk_listen_start 0 38233 NULL ++palmas_gpio_to_irq_38235 palmas_gpio_to_irq 2 38235 NULL ++m66592_queue_38237 m66592_queue 0 38237 NULL ++set_vfta_38239 set_vfta 0 38239 NULL nohasharray ++ceph_decode_16_38239 ceph_decode_16 0 38239 &set_vfta_38239 ++__volume_set_mute_ec_38242 __volume_set_mute_ec 0 38242 NULL ++__mlx4_cmd_38244 __mlx4_cmd 0 38244 NULL ++_ipw_read_reg32_38245 _ipw_read_reg32 0 38245 NULL nohasharray ++b43legacy_one_core_attach_38245 b43legacy_one_core_attach 0 38245 &_ipw_read_reg32_38245 ++vsc8221_config_init_38249 vsc8221_config_init 0 38249 NULL ++nvkm_dmaobj_create__38250 nvkm_dmaobj_create_ 6 38250 NULL ++async_xor_val_38254 async_xor_val 3 38254 NULL ++videobuf_dma_map_38255 videobuf_dma_map 0 38255 NULL nohasharray ++uwb_pal_register_38255 uwb_pal_register 0 38255 &videobuf_dma_map_38255 ++scan_secs_read_38261 scan_secs_read 0 38261 NULL nohasharray ++mce_chrdev_write_38261 mce_chrdev_write 0-3 38261 &scan_secs_read_38261 ++opticon_open_38262 opticon_open 0 38262 NULL nohasharray ++xfs_qm_dqrepair_38262 xfs_qm_dqrepair 0 38262 &opticon_open_38262 ++ramoops_read_kmsg_hdr_38263 ramoops_read_kmsg_hdr 0 38263 NULL nohasharray ++xiic_busy_38263 xiic_busy 0 38263 &ramoops_read_kmsg_hdr_38263 nohasharray ++iscsi_ping_comp_event_38263 iscsi_ping_comp_event 5 38263 &xiic_busy_38263 ++m88e1145_config_init_38265 m88e1145_config_init 0 38265 NULL ++broadsheet_setup_for_wfm_write_38267 broadsheet_setup_for_wfm_write 0 38267 NULL ++ieee80211_if_read_auto_open_plinks_38268 ieee80211_if_read_auto_open_plinks 3-0 38268 NULL nohasharray ++mthca_alloc_icm_table_38268 mthca_alloc_icm_table 3-4 38268 &ieee80211_if_read_auto_open_plinks_38268 nohasharray ++SYSC_msgrcv_38268 SYSC_msgrcv 3 38268 &mthca_alloc_icm_table_38268 nohasharray ++show_in3_input_38268 show_in3_input 0 38268 &SYSC_msgrcv_38268 ++usb2_lpm_l1_timeout_show_38271 usb2_lpm_l1_timeout_show 0 38271 NULL nohasharray ++dev_show_rev_38271 dev_show_rev 0 38271 &usb2_lpm_l1_timeout_show_38271 ++xfs_bmbt_to_bmdr_38275 xfs_bmbt_to_bmdr 3 38275 NULL nohasharray ++xfs_bmdr_to_bmbt_38275 xfs_bmdr_to_bmbt 5 38275 &xfs_bmbt_to_bmdr_38275 ++ov9650_set_gain_38276 ov9650_set_gain 0 38276 NULL ++ftdi_process_packet_38281 ftdi_process_packet 4 38281 NULL ++nouveau_hwmon_show_name_38288 nouveau_hwmon_show_name 0 38288 NULL ++show_channel_38289 show_channel 0 38289 NULL ++odev_write_38293 odev_write 0-3 38293 NULL ++myri10ge_set_mac_address_38295 myri10ge_set_mac_address 0 38295 NULL ++C_SYSC_pselect6_38296 C_SYSC_pselect6 1 38296 NULL nohasharray ++zd_mac_rx_38296 zd_mac_rx 3 38296 &C_SYSC_pselect6_38296 ++vxge_add_mac_addr_38297 vxge_add_mac_addr 0 38297 NULL ++ad7877_disable_show_38298 ad7877_disable_show 0 38298 NULL nohasharray ++pnp_assign_port_38298 pnp_assign_port 0 38298 &ad7877_disable_show_38298 ++crypto_ahash_digest_38300 crypto_ahash_digest 0 38300 NULL nohasharray ++iscsi_nacl_param_show_DataSequenceInOrder_38300 iscsi_nacl_param_show_DataSequenceInOrder 0 38300 &crypto_ahash_digest_38300 ++ucma_query_path_38305 ucma_query_path 3 38305 NULL ++ubifs_tnc_start_commit_38309 ubifs_tnc_start_commit 0 38309 NULL nohasharray ++store_freq_38309 store_freq 0-4 38309 &ubifs_tnc_start_commit_38309 ++rtl2830_tuner_i2c_xfer_38310 rtl2830_tuner_i2c_xfer 0-3 38310 NULL ++show_fnode_max_xmit_dlength_38317 show_fnode_max_xmit_dlength 0 38317 NULL ++mtd_name_show_38318 mtd_name_show 0 38318 NULL ++free_calls_show_38323 free_calls_show 0 38323 NULL ++isr_rx_headers_read_38325 isr_rx_headers_read 3-0 38325 NULL ++ida_simple_get_38326 ida_simple_get 0-2 38326 NULL nohasharray ++ip_mroute_setsockopt_38326 ip_mroute_setsockopt 0 38326 &ida_simple_get_38326 ++team_set_mac_address_38334 team_set_mac_address 0 38334 NULL ++cryptomgr_schedule_probe_38337 cryptomgr_schedule_probe 0 38337 NULL nohasharray ++kmemleak_alloc_recursive_38337 kmemleak_alloc_recursive 2 38337 &cryptomgr_schedule_probe_38337 ++ql_set_mac_addr_reg_38341 ql_set_mac_addr_reg 0 38341 NULL ++pm8001_ctl_mpi_interface_rev_show_38342 pm8001_ctl_mpi_interface_rev_show 0 38342 NULL ++sisusb_write_memio_byte_38343 sisusb_write_memio_byte 0 38343 NULL ++iscsi_stat_sess_show_attr_conn_timeout_errors_38346 iscsi_stat_sess_show_attr_conn_timeout_errors 0 38346 NULL ++af9005_write_tuner_registers_38347 af9005_write_tuner_registers 0 38347 NULL ++snd_hda_add_pincfg_38354 snd_hda_add_pincfg 0 38354 NULL ++sm501fb_crtsrc_store_38356 sm501fb_crtsrc_store 0-4 38356 NULL ++mgslpc_suspend_38357 mgslpc_suspend 0 38357 NULL ++target_core_show_dev_enable_38359 target_core_show_dev_enable 0 38359 NULL ++btrfs_file_extent_disk_num_bytes_38363 btrfs_file_extent_disk_num_bytes 0 38363 NULL ++tomoyo_write_control_38365 tomoyo_write_control 0-3 38365 NULL ++pyra_sysfs_write_38370 pyra_sysfs_write 0-6 38370 NULL ++set_auto_temp_max_38372 set_auto_temp_max 0-4 38372 NULL ++active_duration_show_38373 active_duration_show 0 38373 NULL ++smm665_show_min_38376 smm665_show_min 0 38376 NULL ++adp8860_bl_l2_office_dim_show_38377 adp8860_bl_l2_office_dim_show 0 38377 NULL ++pch_udc_pcd_ep_enable_38380 pch_udc_pcd_ep_enable 0 38380 NULL ++rtl2832_sdr_wr_reg_38383 rtl2832_sdr_wr_reg 0 38383 NULL ++dn_sendmsg_38390 dn_sendmsg 4-0 38390 NULL ++snd_sonicvibes_playback_trigger_38392 snd_sonicvibes_playback_trigger 0 38392 NULL ++_write_mirror_38398 _write_mirror 0 38398 NULL ++vxp_inb_38402 vxp_inb 0 38402 NULL ++m5602_read_bridge_38404 m5602_read_bridge 0 38404 NULL ++show_status_str_38406 show_status_str 0 38406 NULL ++send_packet_38408 send_packet 0 38408 NULL ++get_valid_node_allowed_38412 get_valid_node_allowed 0-1 38412 NULL ++ocfs2_which_cluster_group_38413 ocfs2_which_cluster_group 0-2 38413 NULL ++bonding_show_arp_targets_38418 bonding_show_arp_targets 0 38418 NULL ++ieee80211_if_read_dtim_count_38419 ieee80211_if_read_dtim_count 3-0 38419 NULL ++asix_write_cmd_async_38420 asix_write_cmd_async 5 38420 NULL ++mc13xxx_regulator_disable_38421 mc13xxx_regulator_disable 0 38421 NULL ++ip6_datagram_connect_38427 ip6_datagram_connect 0 38427 NULL ++pcnet32_realloc_tx_ring_38428 pcnet32_realloc_tx_ring 3 38428 NULL ++led_delay_on_store_38429 led_delay_on_store 0-4 38429 NULL ++netlink_send_38434 netlink_send 5 38434 NULL ++batadv_iv_ogm_aggregate_new_38437 batadv_iv_ogm_aggregate_new 2 38437 NULL ++ubifs_find_dirty_leb_38438 ubifs_find_dirty_leb 0 38438 NULL ++deinterlace_buf_prepare_38443 deinterlace_buf_prepare 0 38443 NULL ++iscsi_tpg_attrib_show_generate_node_acls_38445 iscsi_tpg_attrib_show_generate_node_acls 0 38445 NULL ++dev_set_mtu_38447 dev_set_mtu 0 38447 NULL nohasharray ++offline_38447 offline 0 38447 &dev_set_mtu_38447 ++idt77252_open_38452 idt77252_open 0 38452 NULL nohasharray ++rose_bind_38452 rose_bind 0 38452 &idt77252_open_38452 ++udc_ep_enable_38457 udc_ep_enable 0 38457 NULL ++mISDN_sock_create_38458 mISDN_sock_create 0 38458 NULL nohasharray ++wl1271_acx_frag_threshold_38458 wl1271_acx_frag_threshold 0 38458 &mISDN_sock_create_38458 ++saa7134_i2c_xfer_38459 saa7134_i2c_xfer 0-3 38459 NULL nohasharray ++videobuf_waiton_38459 videobuf_waiton 0 38459 &saa7134_i2c_xfer_38459 ++mt9m111_g_fmt_38460 mt9m111_g_fmt 0 38460 NULL ++show_wimax_38463 show_wimax 0 38463 NULL ++btrfs_next_old_leaf_38465 btrfs_next_old_leaf 0 38465 NULL ++zr364xx_s_ctrl_38466 zr364xx_s_ctrl 0 38466 NULL nohasharray ++pc87413_write_38466 pc87413_write 0-3 38466 &zr364xx_s_ctrl_38466 ++sctp_inet6addr_event_38468 sctp_inet6addr_event 0 38468 NULL nohasharray ++cxgb_change_mtu_38468 cxgb_change_mtu 0 38468 &sctp_inet6addr_event_38468 ++ghes_notify_sci_38471 ghes_notify_sci 0 38471 NULL ++get_fan_ooc_38476 get_fan_ooc 0 38476 NULL nohasharray ++enable_slot_38476 enable_slot 0 38476 &get_fan_ooc_38476 ++_iwl_dbgfs_scan_ant_rxchain_write_38479 _iwl_dbgfs_scan_ant_rxchain_write 3-0 38479 NULL ++blk_end_bidi_request_38482 blk_end_bidi_request 3-4 38482 NULL ++store_bpp_38484 store_bpp 0-4 38484 NULL ++gfs2_setattr_size_38485 gfs2_setattr_size 0 38485 NULL ++show_counter_tx_dropped_pkts_38486 show_counter_tx_dropped_pkts 0 38486 NULL ++sched_group_set_rt_runtime_38487 sched_group_set_rt_runtime 0 38487 NULL ++lm8323_show_disable_38491 lm8323_show_disable 0 38491 NULL ++init_pitch_v1_38493 init_pitch_v1 0 38493 NULL ++wait_for_free_credits_38497 wait_for_free_credits 0 38497 NULL ++test_irq_store_38501 test_irq_store 0-4 38501 NULL ++format_cam_size_38506 format_cam_size 0 38506 NULL ++dev_names_read_38509 dev_names_read 3-0 38509 NULL ++iscsi_create_iface_38510 iscsi_create_iface 5 38510 NULL ++mwl8k_cmd_set_wmm_mode_38513 mwl8k_cmd_set_wmm_mode 0 38513 NULL nohasharray ++optimize_38513 optimize 0 38513 &mwl8k_cmd_set_wmm_mode_38513 ++sk_stream_wait_connect_38516 sk_stream_wait_connect 0 38516 NULL ++event_rx_mismatch_read_38518 event_rx_mismatch_read 3-0 38518 NULL ++set_queue_count_38519 set_queue_count 0 38519 NULL ++m41t93_get_time_38520 m41t93_get_time 0 38520 NULL ++ent_bread_38523 ent_bread 0 38523 NULL nohasharray ++bond_option_fail_over_mac_set_38523 bond_option_fail_over_mac_set 0 38523 &ent_bread_38523 ++ste10Xp_config_init_38533 ste10Xp_config_init 0 38533 NULL ++pm_trace_store_38534 pm_trace_store 0-4 38534 NULL ++ath10k_wmi_10_2_cmd_init_38540 ath10k_wmi_10_2_cmd_init 0 38540 NULL nohasharray ++prepare_header95_38540 prepare_header95 0 38540 &ath10k_wmi_10_2_cmd_init_38540 ++jffs2_user_getxattr_38541 jffs2_user_getxattr 0 38541 NULL ++btrfs_discard_extent_38547 btrfs_discard_extent 2 38547 NULL ++xs_error_38560 xs_error 0 38560 NULL ++irda_sendmsg_dgram_38563 irda_sendmsg_dgram 4-0 38563 NULL ++il4965_rs_sta_dbgfs_scale_table_read_38564 il4965_rs_sta_dbgfs_scale_table_read 3-0 38564 NULL nohasharray ++iscsi_stat_login_show_attr_authorize_fails_38564 iscsi_stat_login_show_attr_authorize_fails 0 38564 &il4965_rs_sta_dbgfs_scale_table_read_38564 ++snd_nm256_playback_copy_38567 snd_nm256_playback_copy 5 38567 NULL nohasharray ++sr9700_get_eeprom_len_38567 sr9700_get_eeprom_len 0 38567 &snd_nm256_playback_copy_38567 ++zd_reg2alpha2_38572 zd_reg2alpha2 0 38572 NULL ++srp_create_target_38575 srp_create_target 0-4 38575 NULL ++copy_ctl_value_to_user_38587 copy_ctl_value_to_user 4 38587 NULL ++ahci_show_em_supported_38588 ahci_show_em_supported 0 38588 NULL ++__fat_write_inode_38591 __fat_write_inode 0 38591 NULL ++radeon_set_pm_profile_38593 radeon_set_pm_profile 0-4 38593 NULL ++cosa_net_setup_rx_38594 cosa_net_setup_rx 2 38594 NULL ++write_38599 write 0 38599 NULL ++smb_send_kvec_38602 smb_send_kvec 0 38602 NULL ++ieee80211_check_queues_38604 ieee80211_check_queues 0 38604 NULL ++rd_allocate_sgl_table_38607 rd_allocate_sgl_table 3-0 38607 NULL nohasharray ++__reiserfs_write_begin_38607 __reiserfs_write_begin 0 38607 &rd_allocate_sgl_table_38607 ++store_enable_clk3a_output_38608 store_enable_clk3a_output 0-4 38608 NULL ++pep_indicate_38611 pep_indicate 5 38611 NULL ++s5p_mfc_alloc_instance_buffer_v5_38613 s5p_mfc_alloc_instance_buffer_v5 0 38613 NULL ++set_temphyst_38616 set_temphyst 0-4 38616 NULL ++set_mode_densblk_38618 set_mode_densblk 0 38618 NULL nohasharray ++ip_ra_control_38618 ip_ra_control 0 38618 &set_mode_densblk_38618 ++atyfb_check_var_38619 atyfb_check_var 0 38619 NULL nohasharray ++nf_ct_sack_adjust_38619 nf_ct_sack_adjust 2 38619 &atyfb_check_var_38619 ++tps80031_reg_is_enabled_38622 tps80031_reg_is_enabled 0 38622 NULL ++show_fc_host_system_hostname_38624 show_fc_host_system_hostname 0 38624 NULL ++wl1271_ap_init_qos_null_template_38626 wl1271_ap_init_qos_null_template 0 38626 NULL ++icn_writecmd_38629 icn_writecmd 2 38629 NULL ++write_enabled_file_bool_38630 write_enabled_file_bool 3-0 38630 NULL ++i801_access_38631 i801_access 0 38631 NULL nohasharray ++pci_mmcfg_read_38631 pci_mmcfg_read 0 38631 &i801_access_38631 nohasharray ++csum_dirty_buffer_38631 csum_dirty_buffer 0 38631 &pci_mmcfg_read_38631 ++iio_sysfs_trig_add_38638 iio_sysfs_trig_add 0-4 38638 NULL ++ext2_readpages_38640 ext2_readpages 4 38640 NULL nohasharray ++set_in_min0_38640 set_in_min0 0-4 38640 &ext2_readpages_38640 ++uwb_dev_EUI_48_show_38642 uwb_dev_EUI_48_show 0 38642 NULL ++audit_init_entry_38644 audit_init_entry 1 38644 NULL ++em3027_get_time_38645 em3027_get_time 0 38645 NULL ++qp_broker_alloc_38646 qp_broker_alloc 5-6 38646 NULL ++i2cdev_notifier_call_38648 i2cdev_notifier_call 0 38648 NULL ++kernfs_node_setsecdata_38651 kernfs_node_setsecdata 0 38651 NULL ++ring_active_show_38652 ring_active_show 0 38652 NULL ++iwl_mvm_ref_sync_38654 iwl_mvm_ref_sync 0 38654 NULL nohasharray ++intel_opregion_video_event_38654 intel_opregion_video_event 0 38654 &iwl_mvm_ref_sync_38654 ++mxb_s_ctrl_38656 mxb_s_ctrl 0 38656 NULL ++hfsplus_ext_write_extent_locked_38662 hfsplus_ext_write_extent_locked 0 38662 NULL ++nouveau_instmem_create__38664 nouveau_instmem_create_ 4 38664 NULL ++xfs_da3_node_create_38666 xfs_da3_node_create 0 38666 NULL ++snd_emu10k1x_pcm_prepare_capture_38667 snd_emu10k1x_pcm_prepare_capture 0 38667 NULL ++fakelb_hw_start_38669 fakelb_hw_start 0 38669 NULL nohasharray ++skb_tnl_header_len_38669 skb_tnl_header_len 0 38669 &fakelb_hw_start_38669 ++nilfs_write_end_38674 nilfs_write_end 5-0 38674 NULL ++w7090p_tuner_write_serpar_38675 w7090p_tuner_write_serpar 0-3 38675 NULL ++ib_umem_start_38677 ib_umem_start 0 38677 NULL ++iscsit_dump_data_payload_38683 iscsit_dump_data_payload 2 38683 NULL ++lp8788_get_bl_ctl_mode_38684 lp8788_get_bl_ctl_mode 0 38684 NULL ++tracing_nsecs_read_38689 tracing_nsecs_read 3 38689 NULL ++arbitrary_virt_to_mfn_38693 arbitrary_virt_to_mfn 0 38693 NULL ++zd_rf_init_al2230_38694 zd_rf_init_al2230 0 38694 NULL ++ext4_wait_block_bitmap_38695 ext4_wait_block_bitmap 2 38695 NULL ++validate_vid_hdr_38699 validate_vid_hdr 0 38699 NULL nohasharray ++alc_parse_auto_config_38699 alc_parse_auto_config 0 38699 &validate_vid_hdr_38699 ++rbio_add_io_page_38700 rbio_add_io_page 6 38700 NULL ++kone_sysfs_show_actual_profile_38707 kone_sysfs_show_actual_profile 0 38707 NULL ++bnx2_change_ring_size_38711 bnx2_change_ring_size 0 38711 NULL ++mmc_scr_show_38713 mmc_scr_show 0 38713 NULL ++find_next_usable_block_38716 find_next_usable_block 0-1-3 38716 NULL nohasharray ++qlcnic_sysfs_write_esw_config_38716 qlcnic_sysfs_write_esw_config 0-6-5 38716 &find_next_usable_block_38716 ++gfs2_writepages_38717 gfs2_writepages 0 38717 NULL ++adp5520_bl_office_dim_show_38719 adp5520_bl_office_dim_show 0 38719 NULL ++zforce_send_wait_38720 zforce_send_wait 3 38720 NULL ++_nfs4_proc_remove_38721 _nfs4_proc_remove 0 38721 NULL nohasharray ++tun_show_owner_38721 tun_show_owner 0 38721 &_nfs4_proc_remove_38721 ++iwl_mvm_mac_ctxt_cmd_listener_38724 iwl_mvm_mac_ctxt_cmd_listener 0 38724 NULL ++bcm54xx_shadow_write_38726 bcm54xx_shadow_write 0 38726 NULL ++store_38729 store 0-3 38729 NULL ++auto_abort_store_38733 auto_abort_store 0-4 38733 NULL ++ath10k_pci_init_pipes_38735 ath10k_pci_init_pipes 0 38735 NULL nohasharray ++veth_open_38735 veth_open 0 38735 &ath10k_pci_init_pipes_38735 ++jfs_freeze_38736 jfs_freeze 0 38736 NULL ++si4713_s_ctrl_38743 si4713_s_ctrl 0 38743 NULL ++p9_mount_tag_show_38744 p9_mount_tag_show 0 38744 NULL nohasharray ++extlog_print_38744 extlog_print 0 38744 &p9_mount_tag_show_38744 ++clear_intrusion_38745 clear_intrusion 0-4 38745 NULL ++microcode_write_38754 microcode_write 0-3 38754 NULL ++netxen_nic_get_eeprom_len_38756 netxen_nic_get_eeprom_len 0 38756 NULL ++mic_map_single_38759 mic_map_single 0 38759 NULL ++get_fan_rpm_38760 get_fan_rpm 0 38760 NULL nohasharray ++creg_queue_cmd_38760 creg_queue_cmd 0 38760 &get_fan_rpm_38760 ++udf_readpages_38761 udf_readpages 4 38761 NULL ++store_beep_mask_38764 store_beep_mask 0-4 38764 NULL ++target_stat_scsi_tgt_dev_show_attr_inst_38765 target_stat_scsi_tgt_dev_show_attr_inst 0 38765 NULL nohasharray ++xfs_bmap_btalloc_filestreams_38765 xfs_bmap_btalloc_filestreams 0 38765 &target_stat_scsi_tgt_dev_show_attr_inst_38765 nohasharray ++pyra_sysfs_write_control_38765 pyra_sysfs_write_control 0-6-5 38765 &xfs_bmap_btalloc_filestreams_38765 ++nfs4_proc_setattr_38768 nfs4_proc_setattr 0 38768 NULL ++acpi_power_on_unlocked_38769 acpi_power_on_unlocked 0 38769 NULL ++squashfs_xattr_get_38771 squashfs_xattr_get 0 38771 NULL ++ixgbevf_vlan_rx_add_vid_38773 ixgbevf_vlan_rx_add_vid 0 38773 NULL ++mlx4_num_reserved_sqps_38775 mlx4_num_reserved_sqps 0 38775 NULL ++elan_smbus_set_flash_key_38776 elan_smbus_set_flash_key 0 38776 NULL ++si476x_core_i2c_xfer_38777 si476x_core_i2c_xfer 4-0 38777 NULL ++pwc_set_autogain_expo_38778 pwc_set_autogain_expo 0 38778 NULL ++iwl_dbgfs_thermal_throttling_read_38779 iwl_dbgfs_thermal_throttling_read 3-0 38779 NULL ++bcache_device_init_38781 bcache_device_init 3 38781 NULL ++snd_ivtv_pcm_ioctl_38783 snd_ivtv_pcm_ioctl 0 38783 NULL ++snd_gus_dram_write_38784 snd_gus_dram_write 4 38784 NULL ++p54_set_leds_38787 p54_set_leds 0 38787 NULL ++max_speed_read_file_38790 max_speed_read_file 0 38790 NULL ++dlm_search_rsb_tree_38795 dlm_search_rsb_tree 0 38795 NULL nohasharray ++sas_drain_work_38795 sas_drain_work 0 38795 &dlm_search_rsb_tree_38795 ++nfc_genl_rcv_nl_event_38797 nfc_genl_rcv_nl_event 0 38797 NULL ++nfs4_xattr_get_nfs4_acl_38800 nfs4_xattr_get_nfs4_acl 0 38800 NULL ++do_pci_enable_device_38802 do_pci_enable_device 0 38802 NULL ++err_decode_38804 err_decode 2 38804 NULL ++mousevsc_hid_raw_request_38811 mousevsc_hid_raw_request 0 38811 NULL ++ipv6_renew_option_38813 ipv6_renew_option 3 38813 NULL ++qla2x00_model_desc_show_38816 qla2x00_model_desc_show 0 38816 NULL ++sys_select_38827 sys_select 1 38827 NULL ++whc_urb_enqueue_38830 whc_urb_enqueue 0 38830 NULL ++tle62x0_status_show_38833 tle62x0_status_show 0 38833 NULL ++direct_entry_38836 direct_entry 3-0 38836 NULL nohasharray ++vnic_dev_notify_set_38836 vnic_dev_notify_set 0 38836 &direct_entry_38836 nohasharray ++map_page_38836 map_page 0-3 38836 &vnic_dev_notify_set_38836 ++compat_udp_setsockopt_38840 compat_udp_setsockopt 5 38840 NULL ++sst_create_ipc_msg_38841 sst_create_ipc_msg 0 38841 NULL ++ata_scsi_activity_store_38843 ata_scsi_activity_store 0-4 38843 NULL ++tpacpi_driver_interface_version_show_38848 tpacpi_driver_interface_version_show 0 38848 NULL ++pci_read_config_38854 pci_read_config 0-6-5 38854 NULL ++start_discovery_38858 start_discovery 4 38858 NULL ++interfaces_38859 interfaces 2-0 38859 NULL nohasharray ++__uncore_event_show_38859 __uncore_event_show 0 38859 &interfaces_38859 ++bch_cached_dev_attach_38861 bch_cached_dev_attach 0 38861 NULL ++atl1e_restart_autoneg_38868 atl1e_restart_autoneg 0 38868 NULL ++tipc_wait_for_rcvmsg_38874 tipc_wait_for_rcvmsg 0 38874 NULL ++image_size_store_38875 image_size_store 0-4 38875 NULL ++show_counter_rx_pkey_mismatches_38880 show_counter_rx_pkey_mismatches 0 38880 NULL ++show_conn_param_ISCSI_PARAM_LOCAL_IPADDR_38882 show_conn_param_ISCSI_PARAM_LOCAL_IPADDR 0 38882 NULL ++rbd_dev_v2_striping_info_38885 rbd_dev_v2_striping_info 0 38885 NULL ++iscsi_stat_login_show_attr_redirects_38890 iscsi_stat_login_show_attr_redirects 0 38890 NULL ++hdlc_open_38893 hdlc_open 0 38893 NULL ++dbgfs_state_38894 dbgfs_state 3-0 38894 NULL ++padlock_sha256_finup_38897 padlock_sha256_finup 0 38897 NULL ++__fswab16_38898 __fswab16 0 38898 NULL ++process_access_response_38899 process_access_response 0 38899 NULL ++afs_readpage_38902 afs_readpage 0 38902 NULL nohasharray ++writepage_delalloc_38902 writepage_delalloc 0 38902 &afs_readpage_38902 ++ei_open_38906 ei_open 0 38906 NULL ++ov5642_g_fmt_38908 ov5642_g_fmt 0 38908 NULL ++rsi_mgmt_pkt_to_core_38909 rsi_mgmt_pkt_to_core 3 38909 NULL ++show_iostat_iorequest_cnt_38913 show_iostat_iorequest_cnt 0 38913 NULL ++deadline_write_expire_store_38918 deadline_write_expire_store 3-0 38918 NULL ++ath10k_pci_wake_target_cpu_38920 ath10k_pci_wake_target_cpu 0 38920 NULL ++change_protocol_38922 change_protocol 0 38922 NULL ++port_destid_show_38923 port_destid_show 0 38923 NULL ++af_alg_wait_for_completion_38924 af_alg_wait_for_completion 0-1 38924 NULL ++mv88e6352_get_temp_38926 mv88e6352_get_temp 0 38926 NULL nohasharray ++dev_set_name_38926 dev_set_name 0 38926 &mv88e6352_get_temp_38926 ++ext3_trim_all_free_38929 ext3_trim_all_free 2-3-4 38929 NULL ++qib_user_sdma_queue_clean_38930 qib_user_sdma_queue_clean 0 38930 NULL ++pcap_regulator_enable_38934 pcap_regulator_enable 0 38934 NULL ++fc0013_writereg_38939 fc0013_writereg 0 38939 NULL ++tps65910_rtc_read_time_38941 tps65910_rtc_read_time 0 38941 NULL nohasharray ++ivtv_setup_v4l2_decode_stream_38941 ivtv_setup_v4l2_decode_stream 0 38941 &tps65910_rtc_read_time_38941 ++il_dbgfs_sram_write_38942 il_dbgfs_sram_write 3-0 38942 NULL ++sbp_count_se_tpg_luns_38943 sbp_count_se_tpg_luns 0 38943 NULL ++sdev_store_queue_ramp_up_period_38946 sdev_store_queue_ramp_up_period 0-4 38946 NULL nohasharray ++cpumask_parse_38946 cpumask_parse 0 38946 &sdev_store_queue_ramp_up_period_38946 ++select_subconnector_show_38953 select_subconnector_show 0 38953 NULL ++qlcnic_sriov_pf_config_vport_38955 qlcnic_sriov_pf_config_vport 0 38955 NULL ++__vsock_bind_stream_38957 __vsock_bind_stream 0 38957 NULL nohasharray ++map_single_38957 map_single 0 38957 &__vsock_bind_stream_38957 ++show_temp16_38958 show_temp16 0 38958 NULL ++macaddress_show_38969 macaddress_show 0 38969 NULL ++b43legacy_dma_init_38970 b43legacy_dma_init 0 38970 NULL ++__ath6kl_wmi_send_mgmt_cmd_38971 __ath6kl_wmi_send_mgmt_cmd 7 38971 NULL ++wp512_init_38975 wp512_init 0 38975 NULL ++usb_maxpacket_38977 usb_maxpacket 0 38977 NULL nohasharray ++adfs_fplus_read_38977 adfs_fplus_read 0 38977 &usb_maxpacket_38977 ++addr_assign_type_show_38978 addr_assign_type_show 0 38978 NULL ++_iommu_cpumask_show_38985 _iommu_cpumask_show 0 38985 NULL ++OSDSetBlock_38986 OSDSetBlock 2-4 38986 NULL ++submit_bio_wait_38991 submit_bio_wait 0 38991 NULL ++intel_nontranslate_map_sg_38992 intel_nontranslate_map_sg 0-3 38992 NULL ++bio_clone_range_38997 bio_clone_range 2 38997 NULL ++lpfc_idiag_extacc_write_38998 lpfc_idiag_extacc_write 3-0 38998 NULL ++udf_new_block_38999 udf_new_block 4 38999 NULL ++bh1770_set_lux_thresh_39000 bh1770_set_lux_thresh 0 39000 NULL ++mmio16write__write_file_39001 mmio16write__write_file 0 39001 NULL ++systemid_show_39002 systemid_show 0 39002 NULL ++t4vf_pktgl_to_skb_39005 t4vf_pktgl_to_skb 2 39005 NULL ++bt_6lowpan_connect_39006 bt_6lowpan_connect 0 39006 NULL ++i2c_hid_output_report_39007 i2c_hid_output_report 3-0 39007 NULL ++revision_id_store_39009 revision_id_store 0-4 39009 NULL ++zd1201_enable_39011 zd1201_enable 0 39011 NULL ++get_nodes_39012 get_nodes 3 39012 NULL nohasharray ++compat_SyS_move_pages_39012 compat_SyS_move_pages 2 39012 &get_nodes_39012 ++twl6030_interrupt_unmask_39013 twl6030_interrupt_unmask 2 39013 NULL ++force_sc_support_read_39014 force_sc_support_read 3-0 39014 NULL nohasharray ++show_39014 show 0 39014 &force_sc_support_read_39014 ++__blkdev_issue_zeroout_39020 __blkdev_issue_zeroout 3 39020 NULL ++snd_mask_refine_set_39027 snd_mask_refine_set 0 39027 NULL ++ftrace_modify_code_direct_39029 ftrace_modify_code_direct 1 39029 NULL ++ovl_copy_up_39031 ovl_copy_up 0 39031 NULL nohasharray ++acpi_install_gpe_block_39031 acpi_install_gpe_block 4 39031 &ovl_copy_up_39031 ++store_sf2_pwm_39032 store_sf2_pwm 0-4 39032 NULL ++_zd_iowrite32v_async_locked_39034 _zd_iowrite32v_async_locked 0-3 39034 NULL ++temp_deactivated_show_39037 temp_deactivated_show 0 39037 NULL ++phy_read_status_39042 phy_read_status 0 39042 NULL ++write_battery_life_extender_39045 write_battery_life_extender 0 39045 NULL ++wl18xx_trigger_cmd_39046 wl18xx_trigger_cmd 0 39046 NULL ++power_limit_1_tmax_us_show_39050 power_limit_1_tmax_us_show 0 39050 NULL ++do_write_kmem_39051 do_write_kmem 0-1-3 39051 NULL ++__wil_up_39052 __wil_up 0 39052 NULL ++get_component_status_39053 get_component_status 0 39053 NULL ++gen10g_read_status_39059 gen10g_read_status 0 39059 NULL ++mp_irqdomain_map_39061 mp_irqdomain_map 2-3 39061 NULL nohasharray ++netxen_store_diag_mode_39061 netxen_store_diag_mode 0-4 39061 &mp_irqdomain_map_39061 ++csio_hw_wait_op_done_val_39063 csio_hw_wait_op_done_val 0 39063 NULL ++roccat_common2_sysfs_write_profile_39064 roccat_common2_sysfs_write_profile 0-6-5 39064 NULL ++line6_midibuf_read_39067 line6_midibuf_read 0-3 39067 NULL ++lp8788_rtc_read_time_39070 lp8788_rtc_read_time 0 39070 NULL ++node_nodeid_read_39075 node_nodeid_read 0 39075 NULL ++qlcnic_83xx_issue_cmd_39076 qlcnic_83xx_issue_cmd 0 39076 NULL ++iscsi_tpg_param_store_DataSequenceInOrder_39079 iscsi_tpg_param_store_DataSequenceInOrder 0-3 39079 NULL ++regulator_disable_regmap_39084 regulator_disable_regmap 0 39084 NULL ++regcache_lzo_write_39088 regcache_lzo_write 0 39088 NULL ++target_fabric_tpg_attr_store_39100 target_fabric_tpg_attr_store 0-4 39100 NULL ++qt2_open_39101 qt2_open 0 39101 NULL ++tomoyo_truncate_39105 tomoyo_truncate 0 39105 NULL ++acpi_device_path_show_39111 acpi_device_path_show 0 39111 NULL nohasharray ++leb_write_lock_39111 leb_write_lock 0 39111 &acpi_device_path_show_39111 ++pause_transport_39115 pause_transport 0 39115 NULL ++phys_addr_show_39116 phys_addr_show 0 39116 NULL nohasharray ++serial_resume_39116 serial_resume 0 39116 &phys_addr_show_39116 ++avoid_reset_quirk_show_39119 avoid_reset_quirk_show 0 39119 NULL ++__kfifo_to_user_r_39123 __kfifo_to_user_r 3-5 39123 NULL ++saa711x_set_size_39124 saa711x_set_size 0 39124 NULL ++snd_vt1724_pcm_trigger_39131 snd_vt1724_pcm_trigger 0 39131 NULL ++ea_foreach_39133 ea_foreach 0 39133 NULL ++snd_pcm_plug_format_plugins_39136 snd_pcm_plug_format_plugins 0 39136 NULL ++request_key_auth_instantiate_39141 request_key_auth_instantiate 0 39141 NULL ++btree_submit_bio_hook_39142 btree_submit_bio_hook 0 39142 NULL nohasharray ++tcm_qla2xxx_npiv_tpg_show_enable_39142 tcm_qla2xxx_npiv_tpg_show_enable 0 39142 &btree_submit_bio_hook_39142 ++generic_permission_39150 generic_permission 0 39150 NULL ++alloc_ring_39151 alloc_ring 2-4 39151 NULL ++proc_coredump_filter_read_39153 proc_coredump_filter_read 3-0 39153 NULL ++objects_partial_show_39154 objects_partial_show 0 39154 NULL ++create_bounce_buffer_39155 create_bounce_buffer 3 39155 NULL ++ath9k_hw_ar9003_dump_eeprom_39156 ath9k_hw_ar9003_dump_eeprom 4-5-0 39156 NULL ++elevator_switch_39159 elevator_switch 0 39159 NULL ++iscsi_disc_store_userid_mutual_39161 iscsi_disc_store_userid_mutual 0-3 39161 NULL ++echo_client_kbrw_39170 echo_client_kbrw 6 39170 NULL ++ext3_xattr_check_names_39174 ext3_xattr_check_names 0 39174 NULL nohasharray ++go7007_usb_i2c_master_xfer_39174 go7007_usb_i2c_master_xfer 0-3 39174 &ext3_xattr_check_names_39174 ++msr_device_create_39175 msr_device_create 0 39175 NULL ++vpe_buf_prepare_39183 vpe_buf_prepare 0 39183 NULL ++wl1271_cmd_data_path_39185 wl1271_cmd_data_path 0 39185 NULL ++ubi_more_update_data_39189 ubi_more_update_data 4-0 39189 NULL ++soc_camera_platform_s_stream_39190 soc_camera_platform_s_stream 0 39190 NULL nohasharray ++quota_scale_store_39190 quota_scale_store 0-3 39190 &soc_camera_platform_s_stream_39190 ++i2c_recv_bytes_39196 i2c_recv_bytes 0 39196 NULL ++show_fcstat_fcp_input_requests_39199 show_fcstat_fcp_input_requests 0 39199 NULL ++ipath_diagpkt_write_39201 ipath_diagpkt_write 0-3 39201 NULL ++bd2802_store_reg0x05_39202 bd2802_store_reg0x05 0-4 39202 NULL ++location_show_39206 location_show 0 39206 NULL ++patch_ad1983_39207 patch_ad1983 0 39207 NULL ++qla4_82xx_pci_mem_read_direct_39208 qla4_82xx_pci_mem_read_direct 2 39208 NULL nohasharray ++noop_fsync_39208 noop_fsync 0 39208 &qla4_82xx_pci_mem_read_direct_39208 nohasharray ++gp2ap020a00f_set_operation_mode_39208 gp2ap020a00f_set_operation_mode 0 39208 &noop_fsync_39208 ++snd_seq_timer_set_skew_39214 snd_seq_timer_set_skew 0 39214 NULL ++v4l2_ctrl_handler_setup_39217 v4l2_ctrl_handler_setup 0 39217 NULL nohasharray ++rsi_mac80211_start_39217 rsi_mac80211_start 0 39217 &v4l2_ctrl_handler_setup_39217 ++fuse_access_39220 fuse_access 0 39220 NULL ++sst_stream_drop_39224 sst_stream_drop 0 39224 NULL nohasharray ++patch_cmi8888_39224 patch_cmi8888 0 39224 &sst_stream_drop_39224 ++ivtv_v4l2_write_39226 ivtv_v4l2_write 3-0 39226 NULL nohasharray ++pnfs_scan_commit_lists_39226 pnfs_scan_commit_lists 0 39226 &ivtv_v4l2_write_39226 ++target_core_alua_lu_gp_attr_store_39231 target_core_alua_lu_gp_attr_store 0-4 39231 NULL ++SyS_getrandom_39235 SyS_getrandom 2 39235 NULL ++sony_pic_wwanpower_show_39236 sony_pic_wwanpower_show 0 39236 NULL nohasharray ++wb_smsc_wdt_write_39236 wb_smsc_wdt_write 0-3 39236 &sony_pic_wwanpower_show_39236 ++posix_acl_to_xattr_39237 posix_acl_to_xattr 0 39237 NULL ++atkbd_do_show_scroll_39238 atkbd_do_show_scroll 0 39238 NULL ++odev_read_39239 odev_read 0-3 39239 NULL ++snd_emu10k1x_pcm_trigger_capture_39243 snd_emu10k1x_pcm_trigger_capture 0 39243 NULL ++ds2780_get_rsgain_register_39244 ds2780_get_rsgain_register 0 39244 NULL ++r128_compat_ioctl_39250 r128_compat_ioctl 2 39250 NULL nohasharray ++pwr_cont_miss_bcns_spread_read_39250 pwr_cont_miss_bcns_spread_read 3-0 39250 &r128_compat_ioctl_39250 ++sbp_tpg_show_directory_id_39253 sbp_tpg_show_directory_id 0 39253 NULL ++i915_error_state_read_39254 i915_error_state_read 3-0 39254 NULL nohasharray ++__skb_cow_39254 __skb_cow 2 39254 &i915_error_state_read_39254 ++aux_ring_buffer_write_39260 aux_ring_buffer_write 3 39260 NULL ++pci_oxsemi_tornado_init_39261 pci_oxsemi_tornado_init 0 39261 NULL ++mlx4_en_set_mac_39263 mlx4_en_set_mac 0 39263 NULL ++ath6kl_wmi_set_appie_cmd_39266 ath6kl_wmi_set_appie_cmd 5 39266 NULL ++lpfc_scan_down_show_39268 lpfc_scan_down_show 0 39268 NULL ++show_fan_fault_39271 show_fan_fault 0 39271 NULL ++rocker_port_vlan_39272 rocker_port_vlan 0 39272 NULL ++ubifs_tnc_remove_range_39280 ubifs_tnc_remove_range 0 39280 NULL ++picolcd_fb_check_var_39281 picolcd_fb_check_var 0 39281 NULL ++rx_filter_protection_filter_read_39282 rx_filter_protection_filter_read 3-0 39282 NULL ++show_lslvl_39283 show_lslvl 0 39283 NULL ++snd_pcm_pre_stop_39285 snd_pcm_pre_stop 0 39285 NULL ++bsg_read_39290 bsg_read 0-3 39290 NULL nohasharray ++iwl_add_station_common_39290 iwl_add_station_common 0 39290 &bsg_read_39290 ++sch56xx_write_virtual_reg_39294 sch56xx_write_virtual_reg 0 39294 NULL ++textual_leaf_to_string_39295 textual_leaf_to_string 0 39295 NULL ++blk_mq_hw_sysfs_dispatched_show_39296 blk_mq_hw_sysfs_dispatched_show 0 39296 NULL ++ceph_crypto_key_decode_39298 ceph_crypto_key_decode 0 39298 NULL ++cxacru_sysfs_show_link_status_39302 cxacru_sysfs_show_link_status 0 39302 NULL ++__vmalloc_node_39308 __vmalloc_node 1 39308 NULL nohasharray ++show_fnode_def_time2retain_39308 show_fnode_def_time2retain 0 39308 &__vmalloc_node_39308 ++hdpvr_transfer_39310 hdpvr_transfer 0-3 39310 NULL ++sync_force_parallel_show_39315 sync_force_parallel_show 0 39315 NULL ++cmd_xfer_39317 cmd_xfer 0 39317 NULL nohasharray ++snd_seq_kernel_client_enqueue_39317 snd_seq_kernel_client_enqueue 0 39317 &cmd_xfer_39317 ++core_alua_store_secondary_status_39322 core_alua_store_secondary_status 0-3 39322 NULL ++control_store_39323 control_store 0-4 39323 NULL ++cp_get_regs_len_39324 cp_get_regs_len 0 39324 NULL nohasharray ++hdaps_temp2_show_39324 hdaps_temp2_show 0 39324 &cp_get_regs_len_39324 ++_iwl_dbgfs_pm_params_write_39325 _iwl_dbgfs_pm_params_write 3-0 39325 NULL ++adp8860_store_39328 adp8860_store 0-3 39328 NULL ++target_core_dev_attrib_attr_show_39329 target_core_dev_attrib_attr_show 0 39329 NULL ++flex_array_prealloc_39330 flex_array_prealloc 0 39330 NULL ++gmbus_xfer_39341 gmbus_xfer 0-3 39341 NULL ++xen_hvm_setup_msi_irqs_39342 xen_hvm_setup_msi_irqs 2 39342 NULL ++wimax_msg_alloc_39343 wimax_msg_alloc 4 39343 NULL ++sha512_init_39345 sha512_init 0 39345 NULL ++wm8350_rtc_stop_alarm_39347 wm8350_rtc_stop_alarm 0 39347 NULL ++show_frame_align_39349 show_frame_align 0 39349 NULL ++__copy_from_user_nocache_39351 __copy_from_user_nocache 0-3 39351 NULL ++em28xx_s_ctrl_39353 em28xx_s_ctrl 0 39353 NULL ++ide_complete_rq_39354 ide_complete_rq 3 39354 NULL ++iscsi_session_get_param_39360 iscsi_session_get_param 0 39360 NULL ++store_39365 store 0-3 39365 NULL ++store_ctlr_mode_39366 store_ctlr_mode 0-4 39366 NULL ++elv_attr_show_39372 elv_attr_show 0 39372 NULL ++drv_set_short_addr_39373 drv_set_short_addr 0 39373 NULL ++regmap_name_read_file_39379 regmap_name_read_file 3-0 39379 NULL ++fnic_trace_debugfs_read_39380 fnic_trace_debugfs_read 3-0 39380 NULL nohasharray ++usercopy_show_39380 usercopy_show 0 39380 &fnic_trace_debugfs_read_39380 ++dev_queue_xmit_39382 dev_queue_xmit 0 39382 NULL ++ps_poll_ps_poll_utilization_read_39383 ps_poll_ps_poll_utilization_read 3-0 39383 NULL nohasharray ++rocker_cmd_set_port_settings_macaddr_39383 rocker_cmd_set_port_settings_macaddr 0 39383 &ps_poll_ps_poll_utilization_read_39383 ++wcn36xx_smd_load_nv_39385 wcn36xx_smd_load_nv 0 39385 NULL ++__send_to_port_39386 __send_to_port 0-4-3 39386 NULL ++dummy_pcm_trigger_39388 dummy_pcm_trigger 0 39388 NULL ++show_internals_39390 show_internals 0 39390 NULL ++acpi_ns_search_parent_tree_39391 acpi_ns_search_parent_tree 0 39391 NULL ++xfs_btree_dup_cursor_39394 xfs_btree_dup_cursor 0 39394 NULL ++show_fcstat_lip_count_39403 show_fcstat_lip_count 0 39403 NULL ++__vcc_connect_39404 __vcc_connect 0 39404 NULL ++smk_tskacc_39413 smk_tskacc 0 39413 NULL nohasharray ++show_pwm1_39413 show_pwm1 0 39413 &smk_tskacc_39413 nohasharray ++gfs2_internal_read_39413 gfs2_internal_read 0 39413 &show_pwm1_39413 ++user_power_read_39414 user_power_read 3-0 39414 NULL ++nilfs_segbuf_submit_bio_39416 nilfs_segbuf_submit_bio 0 39416 NULL nohasharray ++md5_parse_39416 md5_parse 0 39416 &nilfs_segbuf_submit_bio_39416 ++lpfc_sli4_log_fcf_record_info_39418 lpfc_sli4_log_fcf_record_info 4 39418 NULL ++hash_ipmark4_expire_39419 hash_ipmark4_expire 4 39419 NULL ++rj54n1_cropcap_39420 rj54n1_cropcap 0 39420 NULL ++ceph_readpage_39422 ceph_readpage 0 39422 NULL nohasharray ++__iwl_mvm_mac_start_39422 __iwl_mvm_mac_start 0 39422 &ceph_readpage_39422 ++alloc_agpphysmem_i8xx_39427 alloc_agpphysmem_i8xx 1 39427 NULL ++user_list_39432 user_list 0-5 39432 NULL ++s_mbus_fmt_39440 s_mbus_fmt 0 39440 NULL ++slab_memory_callback_39442 slab_memory_callback 0 39442 NULL ++host_show_hp_ssd_smart_path_enabled_39446 host_show_hp_ssd_smart_path_enabled 0 39446 NULL ++ddb_i2c_master_xfer_39448 ddb_i2c_master_xfer 0-3 39448 NULL nohasharray ++__vb2_get_done_vb_39448 __vb2_get_done_vb 0 39448 &ddb_i2c_master_xfer_39448 ++sys_semop_39457 sys_semop 3 39457 NULL ++iscsi_tpg_attrib_show_login_timeout_39472 iscsi_tpg_attrib_show_login_timeout 0 39472 NULL ++cma_bitmap_aligned_mask_39474 cma_bitmap_aligned_mask 0-2 39474 NULL nohasharray ++setkey_unaligned_39474 setkey_unaligned 3 39474 &cma_bitmap_aligned_mask_39474 ++send_set_imon_clock_39477 send_set_imon_clock 0 39477 NULL ++usif_ioctl_39481 usif_ioctl 3 39481 NULL nohasharray ++carl9170_set_mac_tpc_39481 carl9170_set_mac_tpc 0 39481 &usif_ioctl_39481 ++_request_lock_39482 _request_lock 0 39482 NULL ++ieee80211_if_fmt_dot11MeshHWMPmaxPREQretries_39499 ieee80211_if_fmt_dot11MeshHWMPmaxPREQretries 3 39499 NULL ++b43legacy_wireless_init_39508 b43legacy_wireless_init 0 39508 NULL ++lpfc_first_burst_size_show_39511 lpfc_first_burst_size_show 0 39511 NULL ++wm97xx_probe_39512 wm97xx_probe 0 39512 NULL ++airspy_alloc_urbs_39522 airspy_alloc_urbs 0 39522 NULL ++cl_req_alloc_39523 cl_req_alloc 4 39523 NULL ++acpi_ds_create_node_39526 acpi_ds_create_node 0 39526 NULL ++state_store_39532 state_store 0-3 39532 NULL ++ican3_new_send_msg_39533 ican3_new_send_msg 0 39533 NULL ++set_rpm_39535 set_rpm 0-4 39535 NULL ++show_flags_39540 show_flags 0 39540 NULL ++int_proc_write_39542 int_proc_write 3-0 39542 NULL ++s_dv_timings_39545 s_dv_timings 0 39545 NULL ++rtnl_port_size_39551 rtnl_port_size 0 39551 NULL ++pp_write_39554 pp_write 3-0 39554 NULL nohasharray ++sr_write_cmd_39554 sr_write_cmd 0-5 39554 &pp_write_39554 ++sis630_block_data_39556 sis630_block_data 0 39556 NULL ++ol_dqblk_block_39558 ol_dqblk_block 2 39558 NULL ++cpulistaffinity_show_39560 cpulistaffinity_show 0 39560 NULL nohasharray ++uhid_dev_input2_39560 uhid_dev_input2 0 39560 &cpulistaffinity_show_39560 nohasharray ++reset_firmware_39560 reset_firmware 0 39560 &uhid_dev_input2_39560 ++store_tabletStylusLower_39561 store_tabletStylusLower 0-4 39561 NULL nohasharray ++xen_swiotlb_sync_single_39561 xen_swiotlb_sync_single 2 39561 &store_tabletStylusLower_39561 ++datablob_format_39571 datablob_format 2 39571 NULL nohasharray ++ieee80211_if_read_fwded_mcast_39571 ieee80211_if_read_fwded_mcast 3-0 39571 &datablob_format_39571 ++__cgroup_procs_write_39573 __cgroup_procs_write 0-3 39573 NULL ++v9fs_vfs_setattr_dotl_39579 v9fs_vfs_setattr_dotl 0 39579 NULL nohasharray ++hex32_arg_39579 hex32_arg 0 39579 &v9fs_vfs_setattr_dotl_39579 ++iwl_mvm_update_beacon_abort_39586 iwl_mvm_update_beacon_abort 0 39586 NULL ++ifb_open_39587 ifb_open 0 39587 NULL ++igb_pci_enable_sriov_39592 igb_pci_enable_sriov 0-2 39592 NULL ++show_tabletModelCode_39594 show_tabletModelCode 0 39594 NULL ++memblock_virt_alloc_internal_39600 memblock_virt_alloc_internal 1 39600 NULL nohasharray ++show_tabletSize_39600 show_tabletSize 0 39600 &memblock_virt_alloc_internal_39600 ++bcache_reboot_39606 bcache_reboot 0 39606 NULL ++v9fs_file_write_internal_39611 v9fs_file_write_internal 0 39611 NULL ++nfs_idmap_get_key_39616 nfs_idmap_get_key 2 39616 NULL ++sdio_readb_39618 sdio_readb 0 39618 NULL ++i2c_master_send_39619 i2c_master_send 0-3 39619 NULL ++prepare_uptodate_page_39622 prepare_uptodate_page 0 39622 NULL ++surplus_hugepages_show_39625 surplus_hugepages_show 0 39625 NULL ++v9fs_cached_file_write_39627 v9fs_cached_file_write 0-3 39627 NULL ++pm8001_ctl_bios_version_show_39628 pm8001_ctl_bios_version_show 0 39628 NULL ++tua9001_set_params_39630 tua9001_set_params 0 39630 NULL ++devfreq_performance_func_39632 devfreq_performance_func 0 39632 NULL ++create_srq_kernel_39636 create_srq_kernel 4 39636 NULL ++pdacf_suspend_39638 pdacf_suspend 0 39638 NULL ++pin_2_irq_39639 pin_2_irq 3 39639 NULL nohasharray ++fm_send_cmd_39639 fm_send_cmd 0-5 39639 &pin_2_irq_39639 ++show_change_ack_39644 show_change_ack 0 39644 NULL ++dm_exception_table_init_39645 dm_exception_table_init 2 39645 NULL nohasharray ++set_dev_class_39645 set_dev_class 4 39645 &dm_exception_table_init_39645 ++adt7410_i2c_read_byte_39647 adt7410_i2c_read_byte 0 39647 NULL nohasharray ++jbd2_journal_file_inode_39647 jbd2_journal_file_inode 0 39647 &adt7410_i2c_read_byte_39647 ++afg_show_39651 afg_show 0 39651 NULL ++snd_rme32_capture_copy_39653 snd_rme32_capture_copy 5 39653 NULL ++prism2_info_hostscanresults_39657 prism2_info_hostscanresults 3 39657 NULL ++ext4_readpage_inline_39661 ext4_readpage_inline 0 39661 NULL nohasharray ++pfkey_sockaddr_size_39661 pfkey_sockaddr_size 0 39661 &ext4_readpage_inline_39661 ++function_show_39663 function_show 0 39663 NULL ++show_pma_counter_39665 show_pma_counter 0 39665 NULL ++kvm_read_guest_cached_39666 kvm_read_guest_cached 4 39666 NULL ++read_39668 read 0 39668 NULL ++__bch_cached_dev_show_39669 __bch_cached_dev_show 0 39669 NULL ++__dev_alloc_name_39670 __dev_alloc_name 0 39670 NULL ++v4l_stk_read_39672 v4l_stk_read 3-0 39672 NULL ++ocfs2_xattr_user_list_39673 ocfs2_xattr_user_list 0-5 39673 NULL ++do_surface_dirty_sou_39678 do_surface_dirty_sou 7 39678 NULL ++bonding_show_ad_num_ports_39680 bonding_show_ad_num_ports 0 39680 NULL ++d_protocols_show_39682 d_protocols_show 0 39682 NULL ++qlcnic_set_nic_info_39684 qlcnic_set_nic_info 0 39684 NULL ++pwm_export_store_39686 pwm_export_store 0-4 39686 NULL ++ixgbe_get_regs_len_39689 ixgbe_get_regs_len 0 39689 NULL nohasharray ++set_in_min1_39689 set_in_min1 0-4 39689 &ixgbe_get_regs_len_39689 ++elan_smbus_calibrate_result_39692 elan_smbus_calibrate_result 0 39692 NULL ++xenbus_write_watch_39700 xenbus_write_watch 0 39700 NULL ++sd_completed_bytes_39705 sd_completed_bytes 0 39705 NULL ++ftrace_pid_write_39710 ftrace_pid_write 3 39710 NULL ++hfs_write_inode_39715 hfs_write_inode 0 39715 NULL ++snd_rme9652_reset_39721 snd_rme9652_reset 0 39721 NULL ++nfqnl_rcv_nl_event_39732 nfqnl_rcv_nl_event 0 39732 NULL ++core_alua_store_trans_delay_msecs_39733 core_alua_store_trans_delay_msecs 0-3 39733 NULL ++dccp_feat_init_39735 dccp_feat_init 0 39735 NULL ++usb2_lpm_besl_show_39740 usb2_lpm_besl_show 0 39740 NULL ++srp_change_queue_depth_39742 srp_change_queue_depth 0-2 39742 NULL ++show_fan_start_output_39743 show_fan_start_output 0 39743 NULL ++snd_ad1889_playback_prepare_39752 snd_ad1889_playback_prepare 0 39752 NULL nohasharray ++bInterfaceNumber_show_39752 bInterfaceNumber_show 0 39752 &snd_ad1889_playback_prepare_39752 ++nfs_update_inode_39754 nfs_update_inode 0 39754 NULL ++amd64_inject_ecc_vector_store_39756 amd64_inject_ecc_vector_store 0-4 39756 NULL ++ncp_close_file_39761 ncp_close_file 0 39761 NULL ++show_input_39763 show_input 0 39763 NULL ++cp210x_set_config_single_39764 cp210x_set_config_single 0 39764 NULL ++adt7316_spi_multi_read_39765 adt7316_spi_multi_read 3 39765 NULL ++usb_hcd_map_urb_for_dma_39774 usb_hcd_map_urb_for_dma 0 39774 NULL nohasharray ++max8998_bulk_write_39774 max8998_bulk_write 0 39774 &usb_hcd_map_urb_for_dma_39774 ++persistent_ram_buffer_map_39776 persistent_ram_buffer_map 1-2 39776 NULL ++kone_sysfs_show_startup_profile_39780 kone_sysfs_show_startup_profile 0 39780 NULL ++mxt_fw_version_show_39788 mxt_fw_version_show 0 39788 NULL ++pm80xx_chip_smp_req_39789 pm80xx_chip_smp_req 0 39789 NULL nohasharray ++osap_39789 osap 0 39789 &pm80xx_chip_smp_req_39789 ++ocfs2_pages_per_cluster_39790 ocfs2_pages_per_cluster 0 39790 NULL ++patch_ad1988_39795 patch_ad1988 0 39795 NULL ++moxart_rtc_read_time_39802 moxart_rtc_read_time 0 39802 NULL nohasharray ++ath10k_station_assoc_39802 ath10k_station_assoc 0 39802 &moxart_rtc_read_time_39802 ++update_39807 update 0 39807 NULL ++efivar_data_read_39809 efivar_data_read 0 39809 NULL ++security_inode_listsecurity_39812 security_inode_listsecurity 0 39812 NULL ++iscsi_tpg_attrib_show_t10_pi_39814 iscsi_tpg_attrib_show_t10_pi 0 39814 NULL ++snd_pcm_oss_writev3_39818 snd_pcm_oss_writev3 3 39818 NULL nohasharray ++ft_wwn_show_39818 ft_wwn_show 0 39818 &snd_pcm_oss_writev3_39818 ++lb_hash_stats_init_39819 lb_hash_stats_init 0 39819 NULL ++snd_hda_gen_init_39820 snd_hda_gen_init 0 39820 NULL ++cpu_shares_write_u64_39823 cpu_shares_write_u64 0 39823 NULL ++sys_migrate_pages_39825 sys_migrate_pages 2 39825 NULL ++adxl34x_autosleep_store_39827 adxl34x_autosleep_store 0-4 39827 NULL ++get_priv_size_39828 get_priv_size 0-1 39828 NULL ++ch341_set_baudrate_39829 ch341_set_baudrate 0 39829 NULL ++delay_store_39831 delay_store 0-3 39831 NULL ++sched_write_39833 sched_write 0-3 39833 NULL ++show_iface_vlan_enabled_39834 show_iface_vlan_enabled 0 39834 NULL ++hfsplus_btree_write_39838 hfsplus_btree_write 0 39838 NULL ++f2fs_getattr_39841 f2fs_getattr 0 39841 NULL ++clear_show_39848 clear_show 0 39848 NULL ++iio_buffer_store_enable_39852 iio_buffer_store_enable 0-4 39852 NULL nohasharray ++sriov_numvfs_store_39852 sriov_numvfs_store 0-4 39852 &iio_buffer_store_enable_39852 ++hfs_hash_dentry_39854 hfs_hash_dentry 0 39854 NULL ++kempld_version_show_39859 kempld_version_show 0 39859 NULL ++e4000_get_if_frequency_39865 e4000_get_if_frequency 0 39865 NULL ++i7core_inject_show_dimm_39869 i7core_inject_show_dimm 0 39869 NULL ++isl1208_sysfs_show_dtrim_39870 isl1208_sysfs_show_dtrim 0 39870 NULL ++pyra_sysfs_read_settings_39871 pyra_sysfs_read_settings 0-5-6 39871 NULL ++search_by_key_39874 search_by_key 0 39874 NULL ++m920x_write_39879 m920x_write 0 39879 NULL ++netlbl_catmap_walkrng_39885 netlbl_catmap_walkrng 0-2 39885 NULL nohasharray ++smack_netlabel_send_39885 smack_netlabel_send 0 39885 &netlbl_catmap_walkrng_39885 ++iscsi_nacl_attrib_store_random_datain_pdu_offsets_39886 iscsi_nacl_attrib_store_random_datain_pdu_offsets 0-3 39886 NULL ++pkt_add_39897 pkt_add 3 39897 NULL nohasharray ++set_temp_low_39897 set_temp_low 0-4 39897 &pkt_add_39897 ++pb0100_set_autogain_39900 pb0100_set_autogain 0 39900 NULL ++selinux_set_mapping_39901 selinux_set_mapping 0 39901 NULL ++aic26_keyclick_show_39902 aic26_keyclick_show 0 39902 NULL ++store_jint_idle_ticks_39905 store_jint_idle_ticks 0-4 39905 NULL ++kernfs_iop_permission_39907 kernfs_iop_permission 0 39907 NULL ++read_file_modal_eeprom_39909 read_file_modal_eeprom 3-0 39909 NULL ++wil_rx_init_39912 wil_rx_init 0 39912 NULL ++gen_pool_add_virt_39913 gen_pool_add_virt 4 39913 NULL nohasharray ++ocfs2_control_do_setversion_msg_39913 ocfs2_control_do_setversion_msg 0 39913 &gen_pool_add_virt_39913 ++panic_event_39914 panic_event 0 39914 NULL ++dw210x_op_rw_39915 dw210x_op_rw 6 39915 NULL nohasharray ++target_fabric_port_show_attr_alua_tg_pt_status_39915 target_fabric_port_show_attr_alua_tg_pt_status 0 39915 &dw210x_op_rw_39915 ++ath9k_wmi_cmd_issue_39918 ath9k_wmi_cmd_issue 0 39918 NULL ++aes_encrypt_interrupt_read_39919 aes_encrypt_interrupt_read 3-0 39919 NULL ++oom_score_adj_read_39921 oom_score_adj_read 3-0 39921 NULL nohasharray ++exofs_read_kern_39921 exofs_read_kern 6 39921 &oom_score_adj_read_39921 ++store_sf4_temp_39924 store_sf4_temp 0-4 39924 NULL ++tse_reglen_39928 tse_reglen 0 39928 NULL nohasharray ++core_id_show_39928 core_id_show 0 39928 &tse_reglen_39928 ++_transport_phy_speed_39929 _transport_phy_speed 0 39929 NULL nohasharray ++set_dec_all_6db_39929 set_dec_all_6db 0-4 39929 &_transport_phy_speed_39929 ++errno_to_pcibios_err_39930 errno_to_pcibios_err 0-1 39930 NULL ++__spi_async_39932 __spi_async 0 39932 NULL ++__get_order_39935 __get_order 0 39935 NULL ++msr_class_cpu_callback_39936 msr_class_cpu_callback 0 39936 NULL ++tipc_msg_build_39939 tipc_msg_build 3-4-5-0 39939 NULL ++erst_exec_goto_39940 erst_exec_goto 0 39940 NULL ++core_siblings_list_show_39944 core_siblings_list_show 0 39944 NULL ++ov9640_s_ctrl_39945 ov9640_s_ctrl 0 39945 NULL ++error_error_frame_read_39947 error_error_frame_read 3-0 39947 NULL nohasharray ++fwnet_pd_new_39947 fwnet_pd_new 4 39947 &error_error_frame_read_39947 ++usb_get_device_descriptor_39951 usb_get_device_descriptor 0 39951 NULL ++tty_prepare_flip_string_39955 tty_prepare_flip_string 3 39955 NULL nohasharray ++lpfc_restrict_login_show_39955 lpfc_restrict_login_show 0 39955 &tty_prepare_flip_string_39955 ++lstcon_group_list_39958 lstcon_group_list 2 39958 NULL ++bh1770_set_lux_rate_39960 bh1770_set_lux_rate 0-4 39960 NULL ++bh1770_get_prox_rate_avail_39962 bh1770_get_prox_rate_avail 0 39962 NULL ++prepare_39963 prepare 0 39963 NULL ++bio_chain_clone_range_39967 bio_chain_clone_range 3 39967 NULL ++selinux_audit_rule_init_39969 selinux_audit_rule_init 0 39969 NULL ++fmvj18x_resume_39970 fmvj18x_resume 0 39970 NULL ++dma_push_rx_39973 dma_push_rx 2 39973 NULL ++vfio_pci_read_39975 vfio_pci_read 0-3 39975 NULL ++broadsheetfb_write_39976 broadsheetfb_write 3 39976 NULL ++inode_follow_link_39978 inode_follow_link 0 39978 NULL ++svc_create_39979 svc_create 0 39979 NULL ++aer_inject_39984 aer_inject 0 39984 NULL ++mthca_array_init_39987 mthca_array_init 2 39987 NULL ++fw_device_op_read_39990 fw_device_op_read 3-0 39990 NULL ++rtsx_transfer_sglist_adma_39993 rtsx_transfer_sglist_adma 4 39993 NULL ++con2fb_release_oldinfo_39994 con2fb_release_oldinfo 0 39994 NULL ++get_setup_data_total_num_39996 get_setup_data_total_num 1 39996 NULL nohasharray ++s5p_mfc_buf_prepare_39996 s5p_mfc_buf_prepare 0 39996 &get_setup_data_total_num_39996 ++rtl8139_set_mac_address_39998 rtl8139_set_mac_address 0 39998 NULL ++mtd_oobsize_show_40003 mtd_oobsize_show 0 40003 NULL ++selinux_socket_post_create_40007 selinux_socket_post_create 0 40007 NULL ++_nfs42_proc_fallocate_40009 _nfs42_proc_fallocate 0 40009 NULL ++debug_show_40011 debug_show 0 40011 NULL ++smb_send_40015 smb_send 0 40015 NULL ++ks8995_read_40016 ks8995_read 0-4 40016 NULL ++fm_rx_set_volume_40017 fm_rx_set_volume 0 40017 NULL ++_truncate_mirrors_40021 _truncate_mirrors 0 40021 NULL ++ivtvfb_write_40023 ivtvfb_write 3 40023 NULL nohasharray ++snd_intel8x0m_pcm_prepare_40023 snd_intel8x0m_pcm_prepare 0 40023 &ivtvfb_write_40023 nohasharray ++nf_nat_icmpv6_reply_translation_40023 nf_nat_icmpv6_reply_translation 5 40023 &snd_intel8x0m_pcm_prepare_40023 ++show_error_40026 show_error 0 40026 NULL ++ea_foreach_i_40028 ea_foreach_i 0 40028 NULL ++devcd_data_read_40029 devcd_data_read 0-5-6 40029 NULL ++datablob_hmac_append_40038 datablob_hmac_append 3 40038 NULL ++patch_vt1716S_40039 patch_vt1716S 0 40039 NULL ++cpuidle_show_40041 cpuidle_show 0 40041 NULL ++regmap_add_irq_chip_40042 regmap_add_irq_chip 4 40042 NULL ++drv_set_pan_id_40044 drv_set_pan_id 0 40044 NULL ++wl12xx_acx_set_ba_initiator_policy_40045 wl12xx_acx_set_ba_initiator_policy 0 40045 NULL ++cyber2000fb_decode_clock_40053 cyber2000fb_decode_clock 0 40053 NULL ++__bnx2x_get_preset_regs_len_40055 __bnx2x_get_preset_regs_len 0 40055 NULL nohasharray ++l2cap_create_iframe_pdu_40055 l2cap_create_iframe_pdu 3 40055 &__bnx2x_get_preset_regs_len_40055 nohasharray ++add_tty_40055 add_tty 1 40055 &l2cap_create_iframe_pdu_40055 ++multicast_snooping_show_40064 multicast_snooping_show 0 40064 NULL ++bootflag_set_40065 bootflag_set 0-4 40065 NULL ++wusb_retry_count_store_40066 wusb_retry_count_store 0-4 40066 NULL ++igb_request_msix_40067 igb_request_msix 0 40067 NULL ++bql_show_40074 bql_show 0 40074 NULL ++show_fan_auto_channel_40075 show_fan_auto_channel 0 40075 NULL nohasharray ++store_tabletToolMode_40075 store_tabletToolMode 0-4 40075 &show_fan_auto_channel_40075 ++wl1251_acx_beacon_filter_table_40079 wl1251_acx_beacon_filter_table 0 40079 NULL ++nmclan_resume_40081 nmclan_resume 0 40081 NULL ++iscsi_nacl_param_show_DefaultTime2Retain_40085 iscsi_nacl_param_show_DefaultTime2Retain 0 40085 NULL ++regcache_lzo_compress_cache_block_40091 regcache_lzo_compress_cache_block 0 40091 NULL ++uncore_get_attr_cpumask_40093 uncore_get_attr_cpumask 0 40093 NULL ++ncp_request2_40102 ncp_request2 0 40102 NULL ++netlink_broadcast_filtered_40105 netlink_broadcast_filtered 0 40105 NULL ++xfs_rtbuf_get_40107 xfs_rtbuf_get 0 40107 NULL ++gen_pool_first_fit_40110 gen_pool_first_fit 4-3-2 40110 NULL ++sctp_setsockopt_delayed_ack_40129 sctp_setsockopt_delayed_ack 3-0 40129 NULL nohasharray ++lp3971_i2c_read_40129 lp3971_i2c_read 0 40129 &sctp_setsockopt_delayed_ack_40129 nohasharray ++cachefiles_daemon_tag_40129 cachefiles_daemon_tag 0 40129 &lp3971_i2c_read_40129 ++reg_read_range_40132 reg_read_range 0-4 40132 NULL nohasharray ++dwc2_max_desc_num_40132 dwc2_max_desc_num 0 40132 ®_read_range_40132 ++try_assign_dacs_40135 try_assign_dacs 0 40135 NULL ++niu_set_flow_key_40136 niu_set_flow_key 0 40136 NULL nohasharray ++config_rss_40136 config_rss 0 40136 &niu_set_flow_key_40136 ++zd_switch_radio_on_40137 zd_switch_radio_on 0 40137 NULL nohasharray ++simple_playback_init_40137 simple_playback_init 0 40137 &zd_switch_radio_on_40137 ++rx_rx_frame_checksum_read_40140 rx_rx_frame_checksum_read 3-0 40140 NULL ++inode_killpriv_40142 inode_killpriv 0 40142 NULL ++ath10k_write_simulate_fw_crash_40143 ath10k_write_simulate_fw_crash 3-0 40143 NULL ++blk_mq_sysfs_show_40149 blk_mq_sysfs_show 0 40149 NULL nohasharray ++adp8870_bl_l1_daylight_dim_store_40149 adp8870_bl_l1_daylight_dim_store 0-4 40149 &blk_mq_sysfs_show_40149 ++netdev_queue_attr_store_40150 netdev_queue_attr_store 0-4 40150 NULL ++sysfs_unbind_clocksource_40152 sysfs_unbind_clocksource 4-0 40152 NULL ++iwch_alloc_fastreg_pbl_40153 iwch_alloc_fastreg_pbl 2 40153 NULL ++atl1c_up_40154 atl1c_up 0 40154 NULL ++store_beep_enable_40156 store_beep_enable 0-4 40156 NULL ++ocfs2_sync_file_40157 ocfs2_sync_file 0 40157 NULL ++pt_write_40159 pt_write 3-0 40159 NULL ++ad1988_add_spdif_mux_ctl_40164 ad1988_add_spdif_mux_ctl 0 40164 NULL ++target_core_dev_pr_attr_show_40169 target_core_dev_pr_attr_show 0 40169 NULL ++uac_clock_selector_get_val_40180 uac_clock_selector_get_val 0 40180 NULL ++target_stat_scsi_tgt_port_show_attr_port_index_40183 target_stat_scsi_tgt_port_show_attr_port_index 0 40183 NULL ++show_40187 show 0 40187 NULL ++set_fan_div_40190 set_fan_div 0-4 40190 NULL ++ab3100_otp_locked_show_40192 ab3100_otp_locked_show 0 40192 NULL ++ipr_alloc_ucode_buffer_40199 ipr_alloc_ucode_buffer 1 40199 NULL nohasharray ++devnode_find_40199 devnode_find 2-3 40199 &ipr_alloc_ucode_buffer_40199 ++allocate_probes_40204 allocate_probes 1 40204 NULL ++selinux_socket_recvmsg_40208 selinux_socket_recvmsg 0 40208 NULL ++ecryptfs_inode_newsize_ok_40210 ecryptfs_inode_newsize_ok 0 40210 NULL ++_nfs4_do_fsinfo_40215 _nfs4_do_fsinfo 0 40215 NULL ++sync_cached_firmware_buf_40217 sync_cached_firmware_buf 0 40217 NULL ++au0828_v4l2_read_40220 au0828_v4l2_read 3-0 40220 NULL ++max_energy_range_uj_show_40222 max_energy_range_uj_show 0 40222 NULL ++ocrdma_dbgfs_ops_read_40232 ocrdma_dbgfs_ops_read 3-0 40232 NULL ++tpacpi_brightness_set_ucmsstep_40234 tpacpi_brightness_set_ucmsstep 0 40234 NULL ++osst_read_40237 osst_read 3-0 40237 NULL nohasharray ++lpfc_max_vpi_show_40237 lpfc_max_vpi_show 0 40237 &osst_read_40237 nohasharray ++cx25821_buffer_prepare_40237 cx25821_buffer_prepare 0 40237 &lpfc_max_vpi_show_40237 ++adjust_io_40247 adjust_io 0 40247 NULL ++btrfs_unfreeze_40249 btrfs_unfreeze 0 40249 NULL ++fsl_edma_prep_dma_cyclic_40254 fsl_edma_prep_dma_cyclic 4-3 40254 NULL nohasharray ++of_get_child_count_40254 of_get_child_count 0 40254 &fsl_edma_prep_dma_cyclic_40254 ++bq2415x_sysfs_set_mode_40257 bq2415x_sysfs_set_mode 0-4 40257 NULL ++vlsi_open_40258 vlsi_open 0 40258 NULL ++store_led_override_40261 store_led_override 0-3 40261 NULL ++rs_sta_dbgfs_scale_table_read_40262 rs_sta_dbgfs_scale_table_read 3-0 40262 NULL nohasharray ++fuse_update_attributes_40262 fuse_update_attributes 0 40262 &rs_sta_dbgfs_scale_table_read_40262 ++persistent_ram_iomap_40264 persistent_ram_iomap 1-2 40264 NULL ++reiserfs_writepage_40266 reiserfs_writepage 0 40266 NULL ++mos7840_write_40267 mos7840_write 0-4 40267 NULL ++i2o_scsi_probe_40271 i2o_scsi_probe 0 40271 NULL ++reqsk_queue_alloc_40272 reqsk_queue_alloc 0 40272 NULL ++usbnet_read_cmd_40275 usbnet_read_cmd 0-7 40275 NULL ++ceph_write_begin_40279 ceph_write_begin 0 40279 NULL ++carmine_find_mode_40280 carmine_find_mode 0 40280 NULL ++rx_xfr_hint_trig_read_40283 rx_xfr_hint_trig_read 3-0 40283 NULL nohasharray ++pcnet_suspend_40283 pcnet_suspend 0 40283 &rx_xfr_hint_trig_read_40283 ++ad7877_dac_store_40285 ad7877_dac_store 0-4 40285 NULL ++il_dbgfs_ucode_rx_stats_read_40286 il_dbgfs_ucode_rx_stats_read 0-3 40286 NULL ++tracing_thresh_read_40295 tracing_thresh_read 3 40295 NULL ++aat2870_ldo_is_enabled_40296 aat2870_ldo_is_enabled 0 40296 NULL nohasharray ++dn_confirm_accept_40296 dn_confirm_accept 0 40296 &aat2870_ldo_is_enabled_40296 ++tcp_error_40298 tcp_error 0 40298 NULL nohasharray ++ncp_statfs_40298 ncp_statfs 0 40298 &tcp_error_40298 ++SyS_bind_40303 SyS_bind 3 40303 NULL ++ubi_io_write_data_40305 ubi_io_write_data 5-4-0 40305 NULL nohasharray ++device_online_40305 device_online 0 40305 &ubi_io_write_data_40305 ++wm8350_rtc_readtime_40313 wm8350_rtc_readtime 0 40313 NULL ++vlan_device_event_40315 vlan_device_event 0 40315 NULL ++prepare_40316 prepare 0 40316 NULL ++ieee80211_vif_use_channel_40318 ieee80211_vif_use_channel 0 40318 NULL ++store_40327 store 0-3 40327 NULL ++crypto_ahash_extsize_40328 crypto_ahash_extsize 0 40328 NULL ++splice_direct_to_actor_40333 splice_direct_to_actor 0 40333 NULL ++ufs_alloc_lastblock_40334 ufs_alloc_lastblock 0 40334 NULL ++ib_get_mad_data_offset_40336 ib_get_mad_data_offset 0 40336 NULL nohasharray ++set_auto_update_interval_40336 set_auto_update_interval 0-4 40336 &ib_get_mad_data_offset_40336 ++mousedev_write_40337 mousedev_write 0-3 40337 NULL ++ad9523_store_eeprom_40338 ad9523_store_eeprom 0 40338 NULL ++of_irq_parse_raw_40339 of_irq_parse_raw 0 40339 NULL nohasharray ++update_ftrace_func_40339 update_ftrace_func 1 40339 &of_irq_parse_raw_40339 ++fm10k_update_xc_addr_pf_40340 fm10k_update_xc_addr_pf 0 40340 NULL ++sis96x_transaction_40344 sis96x_transaction 0 40344 NULL ++sha1_ssse3_init_40345 sha1_ssse3_init 0 40345 NULL ++mantis_i2c_read_40346 mantis_i2c_read 0 40346 NULL nohasharray ++show_in5_min_40346 show_in5_min 0 40346 &mantis_i2c_read_40346 ++mmio_read_40348 mmio_read 4 40348 NULL ++n_tty_write_40353 n_tty_write 0-4 40353 NULL ++store_tabletProgrammableDelay_40354 store_tabletProgrammableDelay 0-4 40354 NULL ++ocfs2_release_clusters_40355 ocfs2_release_clusters 4 40355 NULL nohasharray ++ia_proc_read_40355 ia_proc_read 0 40355 &ocfs2_release_clusters_40355 ++store_green_40357 store_green 0-4 40357 NULL ++llc_ui_getname_40358 llc_ui_getname 0 40358 NULL ++cifs_stats_proc_write_40361 cifs_stats_proc_write 0-3 40361 NULL ++patch_stac92hd95_40362 patch_stac92hd95 0 40362 NULL ++event_rx_mem_empty_read_40363 event_rx_mem_empty_read 3-0 40363 NULL ++regulator_suspend_disk_mode_show_40365 regulator_suspend_disk_mode_show 0 40365 NULL nohasharray ++ocfs2_check_range_for_refcount_40365 ocfs2_check_range_for_refcount 0 40365 ®ulator_suspend_disk_mode_show_40365 ++single_flag_store_40367 single_flag_store 0-4 40367 NULL ++__vsock_bind_dgram_40372 __vsock_bind_dgram 0 40372 NULL ++get_chars_40373 get_chars 3 40373 NULL ++_vnic_dev_cmd_40377 _vnic_dev_cmd 0 40377 NULL ++fwnet_incoming_packet_40380 fwnet_incoming_packet 3 40380 NULL ++adt7x10_update_temp_40381 adt7x10_update_temp 0 40381 NULL nohasharray ++cmtp_sock_create_40381 cmtp_sock_create 0 40381 &adt7x10_update_temp_40381 ++iscsi_tpg_param_show_MaxRecvDataSegmentLength_40382 iscsi_tpg_param_show_MaxRecvDataSegmentLength 0 40382 NULL ++edac_device_ctl_poll_msec_show_40385 edac_device_ctl_poll_msec_show 0 40385 NULL ++mtd_bbtblocks_show_40388 mtd_bbtblocks_show 0 40388 NULL nohasharray ++rocker_port_ctrl_vlan_term_40388 rocker_port_ctrl_vlan_term 0 40388 &mtd_bbtblocks_show_40388 ++store_selfballoon_uphys_40395 store_selfballoon_uphys 0-4 40395 NULL ++wl128x_cmd_general_parms_40397 wl128x_cmd_general_parms 0 40397 NULL ++remote_node_defrag_ratio_show_40406 remote_node_defrag_ratio_show 0 40406 NULL ++pcan_usb_start_40408 pcan_usb_start 0 40408 NULL ++mc13783_gpo_regulator_enable_40414 mc13783_gpo_regulator_enable 0 40414 NULL nohasharray ++target_core_show_dev_lba_map_40414 target_core_show_dev_lba_map 0 40414 &mc13783_gpo_regulator_enable_40414 ++ecryptfs_read_lower_40419 ecryptfs_read_lower 0-3 40419 NULL ++qlcnic_alloc_mbx_args_40421 qlcnic_alloc_mbx_args 0 40421 NULL ++tcn_timer_show_40426 tcn_timer_show 0 40426 NULL ++jffs2_statfs_40427 jffs2_statfs 0 40427 NULL ++pinctrl_register_mappings_40428 pinctrl_register_mappings 2 40428 NULL ++add_jack_kctl_40429 add_jack_kctl 0 40429 NULL ++proc_write_driver_40432 proc_write_driver 3 40432 NULL ++megasas_sysfs_show_dbg_lvl_40435 megasas_sysfs_show_dbg_lvl 0 40435 NULL ++ipoib_set_dev_features_40437 ipoib_set_dev_features 0 40437 NULL ++goku_udc_start_40440 goku_udc_start 0 40440 NULL nohasharray ++__nr_hugepages_store_common_40440 __nr_hugepages_store_common 0-5 40440 &goku_udc_start_40440 ++rmd128_update_40445 rmd128_update 0 40445 NULL ++memcg_cpu_hotplug_callback_40446 memcg_cpu_hotplug_callback 0 40446 NULL ++i2cdev_attach_adapter_40447 i2cdev_attach_adapter 0 40447 NULL ++atmel_rmem16_40450 atmel_rmem16 0 40450 NULL ++repair_io_failure_40452 repair_io_failure 4-3 40452 NULL ++go7007_smbus_xfer_40453 go7007_smbus_xfer 0 40453 NULL nohasharray ++cx18_prepare_buffer_40453 cx18_prepare_buffer 0 40453 &go7007_smbus_xfer_40453 nohasharray ++smsc75xx_read_reg_40453 smsc75xx_read_reg 0 40453 &cx18_prepare_buffer_40453 ++wlcore_read32_40455 wlcore_read32 0 40455 NULL ++tomoyo_update_policy_40458 tomoyo_update_policy 2 40458 NULL ++zd_usb_scnprint_id_40459 zd_usb_scnprint_id 0-3 40459 NULL ++gp2ap020a00f_write_event_threshold_40461 gp2ap020a00f_write_event_threshold 2-0 40461 NULL ++ext4_xattr_trusted_list_40463 ext4_xattr_trusted_list 0-5 40463 NULL ++SyS_writev_40467 SyS_writev 3 40467 NULL ++__i915_add_request_40469 __i915_add_request 0 40469 NULL ++visor_open_40470 visor_open 0 40470 NULL ++SyS_select_40473 SyS_select 1 40473 NULL ++postdisable_40478 postdisable 0 40478 NULL ++show_ipv6_iface_flow_label_40483 show_ipv6_iface_flow_label 0 40483 NULL ++read_usmargin_40485 read_usmargin 0 40485 NULL ++batadv_hash_new_40491 batadv_hash_new 1 40491 NULL ++devcgroup_inode_permission_40492 devcgroup_inode_permission 0 40492 NULL nohasharray ++show_spread_40492 show_spread 0 40492 &devcgroup_inode_permission_40492 ++__cpufreq_stats_create_table_40494 __cpufreq_stats_create_table 0 40494 NULL ++tty_write_room_40495 tty_write_room 0 40495 NULL ++show_dock_40500 show_dock 0 40500 NULL nohasharray ++mtu_store_40500 mtu_store 4-0 40500 &show_dock_40500 nohasharray ++bond_option_use_carrier_set_40500 bond_option_use_carrier_set 0 40500 &mtu_store_40500 ++qlcnic_83xx_get_pci_info_40503 qlcnic_83xx_get_pci_info 0 40503 NULL ++epp_write_data_40504 epp_write_data 0 40504 NULL nohasharray ++pcistub_device_id_add_40504 pcistub_device_id_add 0 40504 &epp_write_data_40504 ++shash_final_unaligned_40506 shash_final_unaligned 0 40506 NULL ++pcxhr_send_msg_40507 pcxhr_send_msg 0 40507 NULL nohasharray ++sg_phys_40507 sg_phys 0 40507 &pcxhr_send_msg_40507 ++xfs_iread_extents_40510 xfs_iread_extents 0 40510 NULL ++__ethtool_get_sset_count_40511 __ethtool_get_sset_count 0 40511 NULL ++pasid_show_40513 pasid_show 0 40513 NULL nohasharray ++show_remote_mac_40513 show_remote_mac 0 40513 &pasid_show_40513 ++hdaps_readb_one_40514 hdaps_readb_one 0 40514 NULL ++host_show_transport_mode_40515 host_show_transport_mode 0 40515 NULL ++phy_ethtool_sset_40518 phy_ethtool_sset 0 40518 NULL ++serial8250_get_attr_rx_trig_bytes_40520 serial8250_get_attr_rx_trig_bytes 0 40520 NULL nohasharray ++TSS_checkhmac2_40520 TSS_checkhmac2 0 40520 &serial8250_get_attr_rx_trig_bytes_40520 nohasharray ++genlmsg_multicast_netns_40520 genlmsg_multicast_netns 0 40520 &TSS_checkhmac2_40520 ++__phys_addr_symbol_40523 __phys_addr_symbol 0-1 40523 NULL ++temp1_input_show_40525 temp1_input_show 0 40525 NULL nohasharray ++slab_mem_going_offline_callback_40525 slab_mem_going_offline_callback 0 40525 &temp1_input_show_40525 ++ad7923_update_scan_mode_40529 ad7923_update_scan_mode 0 40529 NULL ++ims_pcu_reset_device_40532 ims_pcu_reset_device 0-4 40532 NULL ++ubifs_listxattr_40536 ubifs_listxattr 0-3 40536 NULL ++ixgbe_dbg_reg_ops_read_40540 ixgbe_dbg_reg_ops_read 3-0 40540 NULL ++gfs2_write_inode_40541 gfs2_write_inode 0 40541 NULL ++clk_gpio_gate_enable_40543 clk_gpio_gate_enable 0 40543 NULL ++uwb_get_status_40546 uwb_get_status 0 40546 NULL ++ima_write_policy_40548 ima_write_policy 3-0 40548 NULL ++qlcnic_sysfs_clear_port_stats_40549 qlcnic_sysfs_clear_port_stats 0-6-5 40549 NULL ++store_private_fcoe_ctlr_fcf_dev_loss_tmo_40550 store_private_fcoe_ctlr_fcf_dev_loss_tmo 0-4 40550 NULL ++pnp_assign_mem_40555 pnp_assign_mem 0 40555 NULL ++solo_dma_vin_region_40556 solo_dma_vin_region 0 40556 NULL nohasharray ++nouveau_hwmon_set_pwm1_min_40556 nouveau_hwmon_set_pwm1_min 0-4 40556 &solo_dma_vin_region_40556 ++cachefiles_daemon_dir_40557 cachefiles_daemon_dir 0 40557 NULL ++esp_alloc_tmp_40558 esp_alloc_tmp 2-3 40558 NULL nohasharray ++mt9t031_s_fmt_40558 mt9t031_s_fmt 0 40558 &esp_alloc_tmp_40558 ++ufs_inode_getfrag_40560 ufs_inode_getfrag 2-4 40560 NULL nohasharray ++dev_pm_qos_update_request_40560 dev_pm_qos_update_request 0 40560 &ufs_inode_getfrag_40560 ++pio_read_40561 pio_read 6-0-5 40561 NULL ++rocker_flow_tbl_bridge_40563 rocker_flow_tbl_bridge 0 40563 NULL ++queue_io_opt_show_40565 queue_io_opt_show 0 40565 NULL ++ufx_reg_read_40567 ufx_reg_read 0 40567 NULL ++bl_alloc_init_bio_40569 bl_alloc_init_bio 1 40569 NULL ++eurwdt_notify_sys_40577 eurwdt_notify_sys 0 40577 NULL ++lba_to_map_index_40580 lba_to_map_index 0-1 40580 NULL ++ssb_pci_xtal_40581 ssb_pci_xtal 0 40581 NULL ++nilfs_segctor_current_seg_sequence_show_40582 nilfs_segctor_current_seg_sequence_show 0 40582 NULL ++tps6105x_regulator_disable_40589 tps6105x_regulator_disable 0 40589 NULL ++b1_get_byte_40597 b1_get_byte 0 40597 NULL ++skge_rx_get_40598 skge_rx_get 3 40598 NULL ++reshape_position_show_40599 reshape_position_show 0 40599 NULL ++irda_usb_net_open_40605 irda_usb_net_open 0 40605 NULL ++vpe_s_ctrl_40610 vpe_s_ctrl 0 40610 NULL ++get_priv_descr_and_size_40612 get_priv_descr_and_size 0 40612 NULL nohasharray ++store_user_show_40612 store_user_show 0 40612 &get_priv_descr_and_size_40612 ++ixgbe_setup_tx_resources_40613 ixgbe_setup_tx_resources 0 40613 NULL ++max8998_read_reg_40615 max8998_read_reg 0 40615 NULL ++nfs_wb_page_40622 nfs_wb_page 0 40622 NULL ++cdc_mbim_manage_power_40625 cdc_mbim_manage_power 0 40625 NULL ++show_class_attr_string_40632 show_class_attr_string 0 40632 NULL ++da9052_adc_read_temp_40635 da9052_adc_read_temp 0 40635 NULL ++sctp_cmd_process_init_40637 sctp_cmd_process_init 0 40637 NULL nohasharray ++rsbtbl_size_write_40637 rsbtbl_size_write 3-0 40637 &sctp_cmd_process_init_40637 ++attr_release_to_select_store_tpkbd_40642 attr_release_to_select_store_tpkbd 0-4 40642 NULL ++read_40652 read 0 40652 NULL ++show_counter_rx_bad_formats_40653 show_counter_rx_bad_formats 0 40653 NULL ++pid_nr_ns_40654 pid_nr_ns 0 40654 NULL ++get_rss_table_size_40660 get_rss_table_size 0 40660 NULL nohasharray ++i2cdev_detach_adapter_40660 i2cdev_detach_adapter 0 40660 &get_rss_table_size_40660 ++twl4030_kpwrite_u8_40665 twl4030_kpwrite_u8 3 40665 NULL ++get_a_bus_req_40666 get_a_bus_req 0 40666 NULL ++usb_set_interface_40669 usb_set_interface 0 40669 NULL ++sco_sock_listen_40670 sco_sock_listen 0 40670 NULL ++pipeline_rx_complete_stat_fifo_int_read_40671 pipeline_rx_complete_stat_fifo_int_read 3-0 40671 NULL ++fops_read_40672 fops_read 3-0 40672 NULL ++snd_rme9652_channel_info_40673 snd_rme9652_channel_info 0 40673 NULL nohasharray ++ext4_mark_inode_dirty_40673 ext4_mark_inode_dirty 0 40673 &snd_rme9652_channel_info_40673 ++idr_get_empty_slot_40674 idr_get_empty_slot 0 40674 NULL ++alloc_rbio_40676 alloc_rbio 4 40676 NULL ++tps80031_write_40678 tps80031_write 0 40678 NULL nohasharray ++videobuf_dma_init_user_locked_40678 videobuf_dma_init_user_locked 0-4-3 40678 &tps80031_write_40678 ++affs_writepage_40679 affs_writepage 0 40679 NULL ++pci_enable_resources_40680 pci_enable_resources 0 40680 NULL ++tc589_suspend_40684 tc589_suspend 0 40684 NULL ++goldfish_pipe_write_40686 goldfish_pipe_write 0-3 40686 NULL ++regulator_enable_40689 regulator_enable 0 40689 NULL ++nfc_hci_set_param_40697 nfc_hci_set_param 5 40697 NULL ++vfio_pci_config_rw_40698 vfio_pci_config_rw 0 40698 NULL ++__seq_open_private_40715 __seq_open_private 3 40715 NULL ++create_image_40716 create_image 0 40716 NULL ++tg3_test_interrupt_40717 tg3_test_interrupt 0 40717 NULL ++ip_skb_dst_mtu_40718 ip_skb_dst_mtu 0 40718 NULL ++set_extent_bit_40719 set_extent_bit 0 40719 NULL nohasharray ++uri_store_40719 uri_store 0 40719 &set_extent_bit_40719 ++nilfs_bmap_lookup_at_level_40724 nilfs_bmap_lookup_at_level 0 40724 NULL ++raw_disconnect_40726 raw_disconnect 0 40726 NULL ++adt7410_i2c_write_word_40731 adt7410_i2c_write_word 0 40731 NULL ++of_pdt_build_one_prop_40735 of_pdt_build_one_prop 5 40735 NULL ++fuse_readpages_40737 fuse_readpages 4 40737 NULL ++iscsi_host_get_param_40741 iscsi_host_get_param 0 40741 NULL ++radeon_ttm_vram_read_40743 radeon_ttm_vram_read 0-3 40743 NULL ++xfs_iext_remove_direct_40744 xfs_iext_remove_direct 3 40744 NULL ++acpi_ps_get_next_arg_40745 acpi_ps_get_next_arg 0 40745 NULL nohasharray ++fm_rx_set_rds_mode_40745 fm_rx_set_rds_mode 0 40745 &acpi_ps_get_next_arg_40745 nohasharray ++gadget_config_desc_MaxPower_store_40745 gadget_config_desc_MaxPower_store 0-3 40745 &fm_rx_set_rds_mode_40745 ++sysfs_list_show_40747 sysfs_list_show 0 40747 NULL ++write_behind_check_40749 write_behind_check 0 40749 NULL ++security_inode_listxattr_40752 security_inode_listxattr 0 40752 NULL ++drv_add_interface_40758 drv_add_interface 0 40758 NULL ++get_temp_alarm_40761 get_temp_alarm 0 40761 NULL ++pg_write_40766 pg_write 3-0 40766 NULL ++__elevator_change_40769 __elevator_change 0 40769 NULL ++kernfs_fop_read_40770 kernfs_fop_read 3-0 40770 NULL ++fcoe_ctlr_create_store_40772 fcoe_ctlr_create_store 0-3 40772 NULL ++show_bitmask_40774 show_bitmask 0 40774 NULL ++show_list_40775 show_list 3-0 40775 NULL ++acpi_ps_next_parse_state_40776 acpi_ps_next_parse_state 0-3 40776 NULL ++ipv4_helper_40780 ipv4_helper 0 40780 NULL nohasharray ++roccat_common2_sysfs_write_keys_extra_40780 roccat_common2_sysfs_write_keys_extra 0-6-5 40780 &ipv4_helper_40780 ++tps65217_pmic_disable_40783 tps65217_pmic_disable 0 40783 NULL ++gfs2_recover_journal_40784 gfs2_recover_journal 0 40784 NULL ++qlcnic_sriov_pf_cfg_eswitch_40785 qlcnic_sriov_pf_cfg_eswitch 0 40785 NULL ++iscsi_tpg_auth_store_password_40788 iscsi_tpg_auth_store_password 0-3 40788 NULL ++show_nfreectxts_40789 show_nfreectxts 0 40789 NULL nohasharray ++mxt_wait_for_completion_40789 mxt_wait_for_completion 0 40789 &show_nfreectxts_40789 ++bitmap_weight_40791 bitmap_weight 0 40791 NULL ++mls_range_set_40792 mls_range_set 0 40792 NULL ++bonding_show_ad_actor_key_40793 bonding_show_ad_actor_key 0 40793 NULL ++pyra_sysfs_read_40795 pyra_sysfs_read 0-6 40795 NULL ++wusb_dev_update_address_40797 wusb_dev_update_address 0 40797 NULL ++amradio_send_cmd_40800 amradio_send_cmd 0 40800 NULL ++hci_sock_create_40801 hci_sock_create 0 40801 NULL nohasharray ++rtw_add_beacon_40801 rtw_add_beacon 5-3 40801 &hci_sock_create_40801 ++arcmsr_attr_host_driver_abort_40803 arcmsr_attr_host_driver_abort 0 40803 NULL nohasharray ++cifs_sign_smbv_40803 cifs_sign_smbv 0 40803 &arcmsr_attr_host_driver_abort_40803 ++bonding_show_ad_aggregator_40805 bonding_show_ad_aggregator 0 40805 NULL ++smk_fill_rule_40808 smk_fill_rule 0 40808 NULL ++assign_out_path_ctls_40810 assign_out_path_ctls 0 40810 NULL ++netdev_alloc_skb_ip_align_40811 netdev_alloc_skb_ip_align 2 40811 NULL ++set_therm_crit_40813 set_therm_crit 0-4 40813 NULL ++nr_device_event_40814 nr_device_event 0 40814 NULL ++target_stat_scsi_auth_intr_show_attr_indx_40815 target_stat_scsi_auth_intr_show_attr_indx 0 40815 NULL ++show_tcpActiveOpens_40825 show_tcpActiveOpens 0 40825 NULL ++parport_ieee1284_ecp_write_addr_40826 parport_ieee1284_ecp_write_addr 0 40826 NULL nohasharray ++perf_read_40826 perf_read 0-3 40826 &parport_ieee1284_ecp_write_addr_40826 nohasharray ++core_alua_store_access_type_40826 core_alua_store_access_type 0-3 40826 &perf_read_40826 ++lp3971_dcdc_is_enabled_40836 lp3971_dcdc_is_enabled 0 40836 NULL ++p2m_timeout_show_40837 p2m_timeout_show 0 40837 NULL ++show_in_status_40844 show_in_status 0 40844 NULL nohasharray ++can_rx_register_40844 can_rx_register 0 40844 &show_in_status_40844 ++nilfs_mdt_init_40849 nilfs_mdt_init 3 40849 NULL ++udp_lib_setsockopt_40851 udp_lib_setsockopt 0 40851 NULL nohasharray ++rndis_opts_qmult_store_40851 rndis_opts_qmult_store 0-3 40851 &udp_lib_setsockopt_40851 nohasharray ++isku_sysfs_write_keys_thumbster_40851 isku_sysfs_write_keys_thumbster 6-0-5 40851 &rndis_opts_qmult_store_40851 ++cxacru_sysfs_show_downstream_fec_errors_40853 cxacru_sysfs_show_downstream_fec_errors 0 40853 NULL ++validate_negotiate_40854 validate_negotiate 0 40854 NULL ++cx25840_audio_s_ctrl_40855 cx25840_audio_s_ctrl 0 40855 NULL nohasharray ++store_match_busid_40855 store_match_busid 0-3 40855 &cx25840_audio_s_ctrl_40855 ++v9fs_file_read_40858 v9fs_file_read 3-0 40858 NULL ++substream_alloc_pages_40859 substream_alloc_pages 3 40859 NULL ++__bch_flash_dev_store_40861 __bch_flash_dev_store 0-4 40861 NULL ++wil_up_40863 wil_up 0 40863 NULL ++qla2x00_sysfs_write_optrom_ctl_40864 qla2x00_sysfs_write_optrom_ctl 0-6-5 40864 NULL nohasharray ++xen_set_identity_and_remap_chunk_40864 xen_set_identity_and_remap_chunk 5-4-3 40864 &qla2x00_sysfs_write_optrom_ctl_40864 ++show_priv_session_creator_40866 show_priv_session_creator 0 40866 NULL ++i7core_inject_eccmask_show_40872 i7core_inject_eccmask_show 0 40872 NULL ++atomic_add_unless_40873 atomic_add_unless 0 40873 NULL ++snd_cx88_card_trigger_40885 snd_cx88_card_trigger 0 40885 NULL ++wl12xx_cmd_build_probe_req_40888 wl12xx_cmd_build_probe_req 6-10-8 40888 NULL ++init_vbus_channel_40889 init_vbus_channel 1-2 40889 NULL ++store_global_beep_40893 store_global_beep 0-4 40893 NULL ++read_file_queue_40895 read_file_queue 3-0 40895 NULL ++ide_park_show_40896 ide_park_show 0 40896 NULL ++show_boardversion_40901 show_boardversion 0 40901 NULL ++waiters_read_40902 waiters_read 3-0 40902 NULL ++isdn_add_channels_40905 isdn_add_channels 3 40905 NULL ++snd_seq_ioctl_get_client_pool_40907 snd_seq_ioctl_get_client_pool 0 40907 NULL ++acpi_ex_system_wait_mutex_40911 acpi_ex_system_wait_mutex 0 40911 NULL nohasharray ++store_40911 store 0-3 40911 &acpi_ex_system_wait_mutex_40911 ++su3000_i2c_transfer_40912 su3000_i2c_transfer 0-3 40912 NULL ++gfs2_ea_find_40913 gfs2_ea_find 0 40913 NULL ++vol_cdev_write_40915 vol_cdev_write 3-0 40915 NULL ++ath10k_pci_init_config_40916 ath10k_pci_init_config 0 40916 NULL ++store_pwm_auto_point_temp_40918 store_pwm_auto_point_temp 0-4 40918 NULL ++get_40920 get 0 40920 NULL ++store_indirect_dword_40924 store_indirect_dword 0-4 40924 NULL ++uwb_rc_cmd_async_40929 uwb_rc_cmd_async 0 40929 NULL ++gpiod_get_raw_value_40930 gpiod_get_raw_value 0 40930 NULL nohasharray ++show_hrtbt_enb_40930 show_hrtbt_enb 0 40930 &gpiod_get_raw_value_40930 ++wl1273_fm_set_rx_freq_40931 wl1273_fm_set_rx_freq 0 40931 NULL nohasharray ++store_vrm_40931 store_vrm 0-4 40931 &wl1273_fm_set_rx_freq_40931 nohasharray ++pccard_store_resource_40931 pccard_store_resource 0-4 40931 &store_vrm_40931 ++gx1fb_check_var_40935 gx1fb_check_var 0 40935 NULL ++il4965_alloc_dma_ptr_40937 il4965_alloc_dma_ptr 0 40937 NULL ++adt7x10_set_t_hyst_40939 adt7x10_set_t_hyst 0-4 40939 NULL ++acpi_ut_copy_ipackage_to_ipackage_40941 acpi_ut_copy_ipackage_to_ipackage 0 40941 NULL ++snd_vx_create_40948 snd_vx_create 4 40948 NULL ++path_listxattr_40949 path_listxattr 3 40949 NULL ++wm8994_free_irq_40951 wm8994_free_irq 2 40951 NULL ++pf_show_40958 pf_show 0 40958 NULL ++rs5c_set_alarm_40963 rs5c_set_alarm 0 40963 NULL ++show_40964 show 0 40964 NULL ++i7core_show_counter_0_40966 i7core_show_counter_0 0 40966 NULL ++iscsi_nacl_param_show_DefaultTime2Wait_40974 iscsi_nacl_param_show_DefaultTime2Wait 0 40974 NULL ++rds_sendmsg_40976 rds_sendmsg 4-0 40976 NULL ++wl1271_cmd_test_40977 wl1271_cmd_test 0 40977 NULL ++ima_appraise_measurement_40978 ima_appraise_measurement 6 40978 NULL ++intel_rng_data_read_40983 intel_rng_data_read 0 40983 NULL ++store_fan_min_40986 store_fan_min 0-4 40986 NULL ++page_symlink_40989 page_symlink 3 40989 NULL ++show_status_40990 show_status 0 40990 NULL ++ixgbe_fcoe_ddp_target_40992 ixgbe_fcoe_ddp_target 4 40992 NULL ++il_dbgfs_fh_reg_read_40993 il_dbgfs_fh_reg_read 3-0 40993 NULL ++show_temp_st_40996 show_temp_st 0 40996 NULL ++store_unicast_flood_40997 store_unicast_flood 0 40997 NULL ++dp83640_config_init_40998 dp83640_config_init 0 40998 NULL ++iwl_dbgfs_scan_ant_rxchain_read_40999 iwl_dbgfs_scan_ant_rxchain_read 3-0 40999 NULL ++c2port_poll_in_busy_41001 c2port_poll_in_busy 0 41001 NULL ++mac80211_format_buffer_41010 mac80211_format_buffer 2-0 41010 NULL ++fm10k_get_reta_size_41014 fm10k_get_reta_size 0 41014 NULL ++mtd_block_isbad_41015 mtd_block_isbad 0 41015 NULL ++wl1251_acx_mem_cfg_41018 wl1251_acx_mem_cfg 0 41018 NULL nohasharray ++ns83820_setup_rx_41018 ns83820_setup_rx 0 41018 &wl1251_acx_mem_cfg_41018 ++queue_id_show_41020 queue_id_show 0 41020 NULL nohasharray ++mlx4_en_set_cq_moder_41020 mlx4_en_set_cq_moder 0 41020 &queue_id_show_41020 ++brcmf_net_p2p_open_41022 brcmf_net_p2p_open 0 41022 NULL ++snd_emux_load_patch_seq_oss_41024 snd_emux_load_patch_seq_oss 0-5 41024 NULL ++dbg_read_41026 dbg_read 0-3 41026 NULL ++__proc_dobitmasks_41029 __proc_dobitmasks 5 41029 NULL ++mt9m111_reg_mask_41030 mt9m111_reg_mask 0 41030 NULL ++_req_append_segment_41031 _req_append_segment 2-0 41031 NULL ++netlink_unicast_41033 netlink_unicast 0 41033 NULL ++get_protocol_stats_41034 get_protocol_stats 0 41034 NULL ++mISDN_sock_sendmsg_41035 mISDN_sock_sendmsg 4-0 41035 NULL ++fbcon_event_notify_41037 fbcon_event_notify 0 41037 NULL ++usb488_interface_capabilities_show_41038 usb488_interface_capabilities_show 0 41038 NULL nohasharray ++target_stat_scsi_dev_show_attr_ports_41038 target_stat_scsi_dev_show_attr_ports 0 41038 &usb488_interface_capabilities_show_41038 ++ocfs2_xattr_index_block_find_41040 ocfs2_xattr_index_block_find 0 41040 NULL ++show_touchpad_41043 show_touchpad 0 41043 NULL ++sk_detach_filter_41050 sk_detach_filter 0 41050 NULL nohasharray ++lprocfs_write_frac_helper_41050 lprocfs_write_frac_helper 2 41050 &sk_detach_filter_41050 ++mmc_enhanced_area_size_show_41051 mmc_enhanced_area_size_show 0 41051 NULL nohasharray ++qce_countsg_41051 qce_countsg 0 41051 &mmc_enhanced_area_size_show_41051 ++_send_41053 _send 3 41053 NULL ++smsc75xx_change_mtu_41054 smsc75xx_change_mtu 0 41054 NULL ++do_s2io_prog_unicast_41056 do_s2io_prog_unicast 0 41056 NULL ++show_41059 show 0 41059 NULL ++snd_pcm_hw_param_max_41060 snd_pcm_hw_param_max 0 41060 NULL ++vfs_listxattr_41062 vfs_listxattr 0-3 41062 NULL nohasharray ++beacon_filtering_write_41062 beacon_filtering_write 3-0 41062 &vfs_listxattr_41062 ++qib_manage_rcvq_41064 qib_manage_rcvq 0 41064 NULL ++ks8995_write_41066 ks8995_write 0-4 41066 NULL ++recovery_start_show_41070 recovery_start_show 0 41070 NULL nohasharray ++ims_pcu_ofn_bit_show_41070 ims_pcu_ofn_bit_show 0 41070 &recovery_start_show_41070 ++sc_only_mode_read_41076 sc_only_mode_read 3-0 41076 NULL nohasharray ++usbvision_write_reg_41076 usbvision_write_reg 0 41076 &sc_only_mode_read_41076 ++cfg80211_inform_bss_frame_41078 cfg80211_inform_bss_frame 4 41078 NULL ++adfs_write_begin_41079 adfs_write_begin 0-3 41079 NULL ++b43_aphy_op_switch_channel_41083 b43_aphy_op_switch_channel 0 41083 NULL ++rpm_callback_41084 rpm_callback 0 41084 NULL ++uart_get_attr_flags_41090 uart_get_attr_flags 0 41090 NULL ++nvme_map_user_pages_41093 nvme_map_user_pages 4-3 41093 NULL nohasharray ++roccat_read_41093 roccat_read 3-0 41093 &nvme_map_user_pages_41093 nohasharray ++sctp_setsockopt_recvnxtinfo_41093 sctp_setsockopt_recvnxtinfo 0 41093 &roccat_read_41093 ++dma_attach_41094 dma_attach 5-6 41094 NULL ++rcar_vin_videobuf_setup_41096 rcar_vin_videobuf_setup 0 41096 NULL nohasharray ++target_core_store_dev_control_41096 target_core_store_dev_control 0-3 41096 &rcar_vin_videobuf_setup_41096 ++velocity_vlan_rx_add_vid_41103 velocity_vlan_rx_add_vid 0 41103 NULL ++provide_user_output_41105 provide_user_output 3-0 41105 NULL ++show_in_0_41107 show_in_0 0 41107 NULL nohasharray ++bnx2x_set_pf_tx_switching_41107 bnx2x_set_pf_tx_switching 0 41107 &show_in_0_41107 ++f_audio_buffer_alloc_41110 f_audio_buffer_alloc 1 41110 NULL ++get_modalias_41111 get_modalias 0 41111 NULL ++ath10k_read_wmi_services_41112 ath10k_read_wmi_services 3-0 41112 NULL ++xpc_system_die_41115 xpc_system_die 0 41115 NULL ++pte_mfn_to_pfn_41116 pte_mfn_to_pfn 1 41116 NULL ++f_set_ib_cfg_41118 f_set_ib_cfg 0 41118 NULL ++show_fc_vport_node_name_41119 show_fc_vport_node_name 0 41119 NULL ++max77686_rtc_update_41127 max77686_rtc_update 0 41127 NULL ++cpu_prepare_41128 cpu_prepare 0 41128 NULL ++thermal_cooling_device_max_state_show_41132 thermal_cooling_device_max_state_show 0 41132 NULL ++lpfc_issue_reset_41139 lpfc_issue_reset 0-4 41139 NULL ++qla2x00_optrom_gold_fw_version_show_41144 qla2x00_optrom_gold_fw_version_show 0 41144 NULL ++read_default_nvram_41149 read_default_nvram 0-5-6 41149 NULL ++vmci_transport_send_read_notification_41152 vmci_transport_send_read_notification 0 41152 NULL ++uvc_v4l2_read_41156 uvc_v4l2_read 0-3 41156 NULL ++qib_do_user_init_41158 qib_do_user_init 0 41158 NULL ++f_late_initreg_41160 f_late_initreg 0 41160 NULL ++tx_frag_mpdu_alloc_failed_read_41167 tx_frag_mpdu_alloc_failed_read 3-0 41167 NULL ++ad7314_spi_read_41170 ad7314_spi_read 0 41170 NULL ++dvb_ca_write_41171 dvb_ca_write 3-0 41171 NULL ++ol_quota_chunk_block_41177 ol_quota_chunk_block 0-2 41177 NULL nohasharray ++da9063_rtc_start_alarm_41177 da9063_rtc_start_alarm 0 41177 &ol_quota_chunk_block_41177 ++nilfs_btree_insert_41181 nilfs_btree_insert 0 41181 NULL ++bonding_show_lacp_41183 bonding_show_lacp 0 41183 NULL ++zd_write_bssid_41184 zd_write_bssid 0 41184 NULL ++netif_get_num_default_rss_queues_41187 netif_get_num_default_rss_queues 0 41187 NULL ++request_irq_41192 request_irq 0 41192 NULL ++st_sensors_spi_write_byte_41193 st_sensors_spi_write_byte 0 41193 NULL ++compat_sys_process_vm_writev_41194 compat_sys_process_vm_writev 3-5 41194 NULL ++dfs_file_write_41196 dfs_file_write 3-0 41196 NULL ++print_page_owner_41199 print_page_owner 0-2 41199 NULL ++store_pwm_weight_temp_sel_41204 store_pwm_weight_temp_sel 0-4 41204 NULL ++xfs_vm_writepages_41205 xfs_vm_writepages 0 41205 NULL ++koneplus_send_control_41207 koneplus_send_control 0 41207 NULL ++pfn_to_mfn_41213 pfn_to_mfn 0-1 41213 NULL ++tun_alloc_skb_41216 tun_alloc_skb 3-4-2 41216 NULL ++show_bank1_mask_41217 show_bank1_mask 0 41217 NULL ++udf_pc_to_char_41219 udf_pc_to_char 0 41219 NULL ++gether_get_dev_addr_41220 gether_get_dev_addr 0 41220 NULL nohasharray ++gp2ap020a00f_alter_opmode_41220 gp2ap020a00f_alter_opmode 0 41220 &gether_get_dev_addr_41220 ++setup_rss_41225 setup_rss 0 41225 NULL ++osd_probe_41226 osd_probe 0 41226 NULL ++create_loopback_mixing_ctl_41229 create_loopback_mixing_ctl 0 41229 NULL ++CIFSSMBRead_41230 CIFSSMBRead 0 41230 NULL nohasharray ++kvaser_usb_start_chip_41230 kvaser_usb_start_chip 0 41230 &CIFSSMBRead_41230 ++skein512_final_41232 skein512_final 0 41232 NULL ++interf_grp_compatible_id_store_41235 interf_grp_compatible_id_store 0-3 41235 NULL ++lx_stream_set_format_41241 lx_stream_set_format 0 41241 NULL ++mcp3422_show_scales_41246 mcp3422_show_scales 0 41246 NULL nohasharray ++vid_to_reg_41246 vid_to_reg 0-1 41246 &mcp3422_show_scales_41246 ++show_dts_mode_41247 show_dts_mode 0 41247 NULL ++ext3_journalled_write_end_41248 ext3_journalled_write_end 0-5 41248 NULL ++send_41249 send 0 41249 NULL ++degraded_show_41251 degraded_show 0 41251 NULL nohasharray ++xfs_zero_last_block_41251 xfs_zero_last_block 3-2-0 41251 °raded_show_41251 ++wakeup_abort_count_show_41252 wakeup_abort_count_show 0 41252 NULL ++hiddev_compat_ioctl_41255 hiddev_compat_ioctl 2 41255 NULL ++carmine_check_var_41256 carmine_check_var 0 41256 NULL ++show_fnode_password_41259 show_fnode_password 0 41259 NULL ++erst_read_41260 erst_read 0 41260 NULL ++he_send_41261 he_send 0 41261 NULL ++__fprog_create_41263 __fprog_create 2 41263 NULL ++udf_readpage_41264 udf_readpage 0 41264 NULL ++qnx4_readpage_41267 qnx4_readpage 0 41267 NULL ++dm9601_set_mac_address_41274 dm9601_set_mac_address 0 41274 NULL ++dvb_ca_en50221_io_read_condition_41276 dvb_ca_en50221_io_read_condition 0 41276 NULL ++show_dump_regs_41277 show_dump_regs 0 41277 NULL ++alloc_context_41283 alloc_context 1 41283 NULL ++i2c_algo_dp_aux_put_byte_41286 i2c_algo_dp_aux_put_byte 0 41286 NULL nohasharray ++acpi_suspend_begin_old_41286 acpi_suspend_begin_old 0 41286 &i2c_algo_dp_aux_put_byte_41286 ++of_count_phandle_with_args_41291 of_count_phandle_with_args 0 41291 NULL ++name_show_41292 name_show 0 41292 NULL nohasharray ++xudc_ep0_queue_41292 xudc_ep0_queue 0 41292 &name_show_41292 ++ivtv_s_stream_vbi_fmt_41294 ivtv_s_stream_vbi_fmt 0 41294 NULL ++configuration_show_41311 configuration_show 0 41311 NULL ++dvbsky_i2c_xfer_41318 dvbsky_i2c_xfer 0-3 41318 NULL ++open_41320 open 0 41320 NULL ++pcan_usb_set_ext_vcc_41324 pcan_usb_set_ext_vcc 0 41324 NULL ++show_temp_min_hyst_41333 show_temp_min_hyst 0 41333 NULL ++o2hb_setup_one_bio_41341 o2hb_setup_one_bio 4 41341 NULL ++virtblk_cache_type_store_41345 virtblk_cache_type_store 0-4 41345 NULL ++acpi_ec_read_41347 acpi_ec_read 0 41347 NULL ++roccat_common2_sysfs_write_light_macro_41348 roccat_common2_sysfs_write_light_macro 0-6-5 41348 NULL ++cnic_init_id_tbl_41354 cnic_init_id_tbl 2 41354 NULL nohasharray ++show_temp_low_41354 show_temp_low 0 41354 &cnic_init_id_tbl_41354 nohasharray ++hsit_s_stream_41354 hsit_s_stream 0 41354 &show_temp_low_41354 ++jbd2_alloc_41359 jbd2_alloc 1 41359 NULL ++kovaplus_sysfs_show_actual_cpi_41367 kovaplus_sysfs_show_actual_cpi 0 41367 NULL ++max16065_show_alarm_41372 max16065_show_alarm 0 41372 NULL nohasharray ++add_sw_ctl_41372 add_sw_ctl 0 41372 &max16065_show_alarm_41372 nohasharray ++level_store_41372 level_store 0-4 41372 &add_sw_ctl_41372 ++kmp_init_41373 kmp_init 2 41373 NULL nohasharray ++__dwc3_gadget_ep_queue_41373 __dwc3_gadget_ep_queue 0 41373 &kmp_init_41373 ++netlink_alloc_large_skb_41375 netlink_alloc_large_skb 1 41375 NULL nohasharray ++ds1305_get_time_41375 ds1305_get_time 0 41375 &netlink_alloc_large_skb_41375 ++cc2520_start_41387 cc2520_start 0 41387 NULL ++netdev_switch_parent_id_get_41389 netdev_switch_parent_id_get 0 41389 NULL ++oiap_41392 oiap 0 41392 NULL nohasharray ++store_mode_select_41392 store_mode_select 0-4 41392 &oiap_41392 ++via_cputemp_cpu_callback_41395 via_cputemp_cpu_callback 0 41395 NULL ++audit_rule_init_41396 audit_rule_init 0 41396 NULL ++pcf8563_get_datetime_41397 pcf8563_get_datetime 0 41397 NULL ++isr_commands_read_41398 isr_commands_read 3-0 41398 NULL nohasharray ++fotg210_ep_enable_41398 fotg210_ep_enable 0 41398 &isr_commands_read_41398 ++x1205_rtc_read_time_41400 x1205_rtc_read_time 0 41400 NULL ++vhci_write_41405 vhci_write 0 41405 NULL ++sys_flistxattr_41407 sys_flistxattr 3 41407 NULL ++kernel_client_enqueue_41410 kernel_client_enqueue 0 41410 NULL ++rx_defrag_decrypt_failed_read_41411 rx_defrag_decrypt_failed_read 3-0 41411 NULL ++tgr192_update_41412 tgr192_update 0 41412 NULL ++wm831x_gp_ldo_get_mode_41413 wm831x_gp_ldo_get_mode 0 41413 NULL nohasharray ++intel_pmu_cpu_prepare_41413 intel_pmu_cpu_prepare 0 41413 &wm831x_gp_ldo_get_mode_41413 ++therm_throt_device_show_core_power_limit_count_41415 therm_throt_device_show_core_power_limit_count 0 41415 NULL ++nilfs_bmap_lookup_41420 nilfs_bmap_lookup 0 41420 NULL ++xfs_iext_add_41422 xfs_iext_add 3 41422 NULL ++anatop_regmap_is_enabled_41425 anatop_regmap_is_enabled 0 41425 NULL nohasharray ++hostap_cs_resume_41425 hostap_cs_resume 0 41425 &anatop_regmap_is_enabled_41425 ++isdn_ppp_fill_rq_41428 isdn_ppp_fill_rq 2 41428 NULL ++ato_show_41430 ato_show 0 41430 NULL nohasharray ++show_41430 show 0 41430 &ato_show_41430 ++lbs_rdrf_read_41431 lbs_rdrf_read 3-0 41431 NULL nohasharray ++uli526x_open_41431 uli526x_open 0 41431 &lbs_rdrf_read_41431 ++__uncore_filter_tid2_show_41433 __uncore_filter_tid2_show 0 41433 NULL ++netxen_show_bridged_mode_41436 netxen_show_bridged_mode 0 41436 NULL ++vivid_radio_tx_s_ctrl_41437 vivid_radio_tx_s_ctrl 0 41437 NULL ++_ctl_diag_trigger_scsi_store_41438 _ctl_diag_trigger_scsi_store 0-4 41438 NULL ++iio_device_alloc_41440 iio_device_alloc 1 41440 NULL ++ntfs_file_buffered_write_41442 ntfs_file_buffered_write 0-6-4 41442 NULL ++pcpu_build_alloc_info_41443 pcpu_build_alloc_info 3-2-1 41443 NULL nohasharray ++idtoname_parse_41443 idtoname_parse 0 41443 &pcpu_build_alloc_info_41443 ++CalcNTLMv2_response_41449 CalcNTLMv2_response 0 41449 NULL ++nct7802_write_voltage_41451 nct7802_write_voltage 0 41451 NULL ++CIFSTCon_41455 CIFSTCon 0 41455 NULL ++layout_leb_in_gaps_41470 layout_leb_in_gaps 0 41470 NULL ++get_swap_writer_41471 get_swap_writer 0 41471 NULL ++rt2x00debug_write_rfcsr_41473 rt2x00debug_write_rfcsr 3-0 41473 NULL ++sha384_final_41475 sha384_final 0 41475 NULL nohasharray ++run_41475 run 0 41475 &sha384_final_41475 ++show_in16_max_41478 show_in16_max 0 41478 NULL ++roccat_common2_sysfs_write_actual_profile_41480 roccat_common2_sysfs_write_actual_profile 0-6-5 41480 NULL ++dev_rescan_store_41481 dev_rescan_store 0-4 41481 NULL ++rndis_proc_write_41483 rndis_proc_write 0-3 41483 NULL nohasharray ++udc_bind_to_driver_41483 udc_bind_to_driver 0 41483 &rndis_proc_write_41483 ++ip1001_config_init_41490 ip1001_config_init 0 41490 NULL ++wep_interrupt_read_41492 wep_interrupt_read 3-0 41492 NULL ++btrfs_setsize_41495 btrfs_setsize 0 41495 NULL ++wdack_store_41496 wdack_store 0-3 41496 NULL ++hpfs_translate_name_41497 hpfs_translate_name 3 41497 NULL ++intel_iommu_memory_notifier_41501 intel_iommu_memory_notifier 0 41501 NULL ++mwifiex_set_keyparamset_wep_41502 mwifiex_set_keyparamset_wep 0 41502 NULL ++ab3100_otp_svn_show_41503 ab3100_otp_svn_show 0 41503 NULL ++ath10k_wmi_start_scan_tlvs_len_41504 ath10k_wmi_start_scan_tlvs_len 0 41504 NULL ++usb_device_dump_41505 usb_device_dump 0 41505 NULL nohasharray ++set_pwm_freq_41505 set_pwm_freq 0-4 41505 &usb_device_dump_41505 ++ltc4261_show_bool_41508 ltc4261_show_bool 0 41508 NULL ++map_type_show_41511 map_type_show 0 41511 NULL ++sha512_final_41515 sha512_final 0 41515 NULL ++ldisc_receive_41516 ldisc_receive 4 41516 NULL ++ab3100_rtc_set_alarm_41519 ab3100_rtc_set_alarm 0 41519 NULL ++snd_ensoniq_playback1_prepare_41523 snd_ensoniq_playback1_prepare 0 41523 NULL nohasharray ++SyS_preadv_41523 SyS_preadv 3 41523 &snd_ensoniq_playback1_prepare_41523 ++em28xx_is_ac97_ready_41524 em28xx_is_ac97_ready 0 41524 NULL nohasharray ++target_fabric_nacl_attrib_attr_show_41524 target_fabric_nacl_attrib_attr_show 0 41524 &em28xx_is_ac97_ready_41524 ++dm_get_reserved_rq_based_ios_41529 dm_get_reserved_rq_based_ios 0 41529 NULL ++o2cb_dlm_lock_41530 o2cb_dlm_lock 0 41530 NULL ++do_commit_41533 do_commit 0 41533 NULL ++brcmf_flowring_attach_41534 brcmf_flowring_attach 2 41534 NULL ++tpacpi_rfk_sysfs_enable_show_41535 tpacpi_rfk_sysfs_enable_show 0 41535 NULL ++kovaplus_set_actual_profile_41541 kovaplus_set_actual_profile 0 41541 NULL ++pcistub_device_id_remove_41544 pcistub_device_id_remove 0 41544 NULL ++_write_41548 _write 0 41548 NULL ++attr_press_to_select_show_tpkbd_41551 attr_press_to_select_show_tpkbd 0 41551 NULL ++tx_tx_frame_checksum_read_41553 tx_tx_frame_checksum_read 3-0 41553 NULL nohasharray ++build_header_41553 build_header 0 41553 &tx_tx_frame_checksum_read_41553 ++ath6kl_endpoint_stats_read_41554 ath6kl_endpoint_stats_read 3-0 41554 NULL nohasharray ++mwl8k_conf_tx_41554 mwl8k_conf_tx 0 41554 &ath6kl_endpoint_stats_read_41554 ++edd_show_version_41558 edd_show_version 0 41558 NULL ++si476x_radio_fops_read_41559 si476x_radio_fops_read 3-0 41559 NULL ++show_wlan_41563 show_wlan 0 41563 NULL nohasharray ++show_auto_temp_41563 show_auto_temp 0 41563 &show_wlan_41563 ++patch_cs4210_41565 patch_cs4210 0 41565 NULL ++mv88e6xxx_get_temp_41568 mv88e6xxx_get_temp 0 41568 NULL nohasharray ++via_init_41568 via_init 0 41568 &mv88e6xxx_get_temp_41568 ++blinkm_transfer_hw_41571 blinkm_transfer_hw 0 41571 NULL ++wl1271_acx_rx_msdu_life_time_41573 wl1271_acx_rx_msdu_life_time 0 41573 NULL nohasharray ++digital_in_send_atr_req_41573 digital_in_send_atr_req 5 41573 &wl1271_acx_rx_msdu_life_time_41573 ++pxa168_init_phy_41575 pxa168_init_phy 0 41575 NULL ++t1_sge_configure_41576 t1_sge_configure 0 41576 NULL ++ecryptfs_getattr_link_41577 ecryptfs_getattr_link 0 41577 NULL ++host_show_firmware_revision_41578 host_show_firmware_revision 0 41578 NULL ++kovaplus_sysfs_write_profile_settings_41580 kovaplus_sysfs_write_profile_settings 0-6-5 41580 NULL ++rng_dev_read_41581 rng_dev_read 3-0 41581 NULL nohasharray ++wl12xx_sdio_raw_write_41581 wl12xx_sdio_raw_write 0 41581 &rng_dev_read_41581 ++bnx2x_vfpf_init_41583 bnx2x_vfpf_init 0 41583 NULL ++security_task_setnice_41584 security_task_setnice 0 41584 NULL ++nfsd_readv_41585 nfsd_readv 4 41585 NULL ++drbd_send_command_41586 drbd_send_command 4-6 41586 NULL ++batadv_tvlv_container_ogm_append_41588 batadv_tvlv_container_ogm_append 4 41588 NULL ++qlcnic_sysfs_read_pm_config_41590 qlcnic_sysfs_read_pm_config 0-6-5 41590 NULL nohasharray ++__snd_device_register_41590 __snd_device_register 0 41590 &qlcnic_sysfs_read_pm_config_41590 ++wdt_read_41601 wdt_read 0-3 41601 NULL ++tps80031_read_41603 tps80031_read 0 41603 NULL nohasharray ++show_name_41603 show_name 0 41603 &tps80031_read_41603 ++write_port_41612 write_port 0-3 41612 NULL ++lbs_bcnmiss_write_41613 lbs_bcnmiss_write 3-0 41613 NULL ++disable_supply_41614 disable_supply 0 41614 NULL ++a2mp_send_41615 a2mp_send 4 41615 NULL nohasharray ++twl_rtc_write_u8_41615 twl_rtc_write_u8 0 41615 &a2mp_send_41615 nohasharray ++arcmsr_attr_host_fw_hd_channels_41615 arcmsr_attr_host_fw_hd_channels 0 41615 &twl_rtc_write_u8_41615 nohasharray ++iscsi_tpg_auth_store_password_mutual_41615 iscsi_tpg_auth_store_password_mutual 0-3 41615 &arcmsr_attr_host_fw_hd_channels_41615 ++__napi_alloc_skb_41618 __napi_alloc_skb 2 41618 NULL ++b43_op_add_interface_41619 b43_op_add_interface 0 41619 NULL ++lstcon_batch_list_41627 lstcon_batch_list 2 41627 NULL ++ipr_show_adapter_state_41629 ipr_show_adapter_state 0 41629 NULL nohasharray ++ecm_opts_qmult_store_41629 ecm_opts_qmult_store 0-3 41629 &ipr_show_adapter_state_41629 ++max14577_reg_is_enabled_41633 max14577_reg_is_enabled 0 41633 NULL ++lpss_ltr_show_41634 lpss_ltr_show 0 41634 NULL ++setkey_41635 setkey 0 41635 NULL ++ath10k_wmi_pdev_pktlog_disable_41636 ath10k_wmi_pdev_pktlog_disable 0 41636 NULL ++lm3533_als_get_int_mode_41638 lm3533_als_get_int_mode 0 41638 NULL ++lbs_anycast_get_41639 lbs_anycast_get 0 41639 NULL ++snd_ymfpci_playback_prepare_41641 snd_ymfpci_playback_prepare 0 41641 NULL ++smsc75xx_set_rx_max_frame_length_41643 smsc75xx_set_rx_max_frame_length 0 41643 NULL ++show_tabletODMCode_41644 show_tabletODMCode 0 41644 NULL ++dev_id_show_41648 dev_id_show 0 41648 NULL nohasharray ++kempld_specification_show_41648 kempld_specification_show 0 41648 &dev_id_show_41648 ++mempool_create_kmalloc_pool_41650 mempool_create_kmalloc_pool 1 41650 NULL ++lp3972_ldo_disable_41651 lp3972_ldo_disable 0 41651 NULL ++rx_rx_pre_complt_read_41653 rx_rx_pre_complt_read 3-0 41653 NULL ++get_std_timing_41654 get_std_timing 0 41654 NULL ++squashfs_cache_init_41656 squashfs_cache_init 2 41656 NULL nohasharray ++b_protocols_show_41656 b_protocols_show 0 41656 &squashfs_cache_init_41656 ++kxcjk1013_chip_update_thresholds_41659 kxcjk1013_chip_update_thresholds 0 41659 NULL nohasharray ++store_in_41659 store_in 0-4 41659 &kxcjk1013_chip_update_thresholds_41659 ++__gpio_get_value_41660 __gpio_get_value 0 41660 NULL ++isl1208_i2c_get_dtr_41663 isl1208_i2c_get_dtr 0 41663 NULL ++dimmdev_size_show_41666 dimmdev_size_show 0 41666 NULL ++init_subports_41674 init_subports 0 41674 NULL ++set_attr_text_41676 set_attr_text 0-4 41676 NULL ++ieee80211_if_fmt_bssid_41677 ieee80211_if_fmt_bssid 3 41677 NULL ++raw_notifier_call_chain_41679 raw_notifier_call_chain 0 41679 NULL ++cpufv_show_41681 cpufv_show 0 41681 NULL nohasharray ++ad7887_ring_postdisable_41681 ad7887_ring_postdisable 0 41681 &cpufv_show_41681 ++crc32_pclmul_final_41682 crc32_pclmul_final 0 41682 NULL ++params_period_bytes_41683 params_period_bytes 0 41683 NULL ++iad_bFirstInterface_show_41684 iad_bFirstInterface_show 0 41684 NULL ++aac_src_ioremap_41688 aac_src_ioremap 2 41688 NULL ++lpfc_sg_seg_cnt_show_41690 lpfc_sg_seg_cnt_show 0 41690 NULL ++lx_pcm_prepare_41692 lx_pcm_prepare 0 41692 NULL ++resync_start_store_41693 resync_start_store 0-3 41693 NULL ++ttusb2_i2c_xfer_41694 ttusb2_i2c_xfer 0-3 41694 NULL ++spdif_passthru_playback_prepare_41696 spdif_passthru_playback_prepare 0 41696 NULL ++cpu_cfs_quota_write_s64_41698 cpu_cfs_quota_write_s64 0 41698 NULL ++_recv_41701 _recv 0-3 41701 NULL nohasharray ++fill_read_buffer_41701 fill_read_buffer 0 41701 &_recv_41701 nohasharray ++lov_unpackmd_41701 lov_unpackmd 4 41701 &fill_read_buffer_41701 ++target_stat_scsi_auth_intr_show_attr_intr_name_41703 target_stat_scsi_auth_intr_show_attr_intr_name 0 41703 NULL ++tree_insert_41704 tree_insert 0 41704 NULL ++rocker_port_open_41705 rocker_port_open 0 41705 NULL nohasharray ++__ext3_journal_get_write_access_41705 __ext3_journal_get_write_access 0 41705 &rocker_port_open_41705 ++connector_write_41709 connector_write 3-0 41709 NULL ++read_block_41711 read_block 0 41711 NULL ++allow_restart_show_41712 allow_restart_show 0 41712 NULL ++lowpan_header_create_41717 lowpan_header_create 0 41717 NULL ++bdx_tx_db_init_41719 bdx_tx_db_init 2 41719 NULL nohasharray ++store_41719 store 0-4 41719 &bdx_tx_db_init_41719 ++st_fixed_buffer_size_show_41720 st_fixed_buffer_size_show 0 41720 NULL ++sys_pwritev_41722 sys_pwritev 3 41722 NULL ++esas2r_read_fs_41732 esas2r_read_fs 0-3-4 41732 NULL ++lpphy_b2062_tune_41742 lpphy_b2062_tune 0 41742 NULL ++arch_add_memory_41743 arch_add_memory 0 41743 NULL ++snd_seq_ioctl_get_queue_timer_41745 snd_seq_ioctl_get_queue_timer 0 41745 NULL ++ubiblock_notify_41747 ubiblock_notify 0 41747 NULL ++show_transport_caps_41753 show_transport_caps 0 41753 NULL ++show_pwm_freq_41754 show_pwm_freq 0 41754 NULL nohasharray ++macb_alloc_consistent_41754 macb_alloc_consistent 0 41754 &show_pwm_freq_41754 ++bitmap_load_41755 bitmap_load 0 41755 NULL ++wcn36xx_dxe_alloc_ctl_blks_41756 wcn36xx_dxe_alloc_ctl_blks 0 41756 NULL ++uart_get_attr_iomem_reg_shift_41761 uart_get_attr_iomem_reg_shift 0 41761 NULL ++mvs_task_prep_smp_41766 mvs_task_prep_smp 0 41766 NULL nohasharray ++zd_rf_init_hw_41766 zd_rf_init_hw 0 41766 &mvs_task_prep_smp_41766 ++nilfs_segctor_next_full_seg_show_41767 nilfs_segctor_next_full_seg_show 0 41767 NULL ++do_pci_op_41770 do_pci_op 0 41770 NULL nohasharray ++blk_mq_hw_sysfs_run_show_41770 blk_mq_hw_sysfs_run_show 0 41770 &do_pci_op_41770 nohasharray ++SyS_bpf_41770 SyS_bpf 3 41770 &blk_mq_hw_sysfs_run_show_41770 ++mmc_sdio_power_restore_41772 mmc_sdio_power_restore 0 41772 NULL ++brcmf_cfg80211_vndr_cmds_dcmd_handler_41776 brcmf_cfg80211_vndr_cmds_dcmd_handler 4 41776 NULL ++show_slab_objects_41782 show_slab_objects 0 41782 NULL ++iwl_dbgfs_bt_notif_read_41794 iwl_dbgfs_bt_notif_read 3-0 41794 NULL ++flash_dev_run_41795 flash_dev_run 0 41795 NULL ++nilfs_sufile_alloc_41798 nilfs_sufile_alloc 0 41798 NULL ++hsi_alloc_controller_41802 hsi_alloc_controller 1 41802 NULL nohasharray ++crypto_shash_update_41802 crypto_shash_update 0 41802 &hsi_alloc_controller_41802 ++show_contrast_41806 show_contrast 0 41806 NULL ++fat_write_end_41812 fat_write_end 5-0 41812 NULL nohasharray ++rtw_android_get_macaddr_41812 rtw_android_get_macaddr 0 41812 &fat_write_end_41812 ++da9052_enable_irq_41814 da9052_enable_irq 2 41814 NULL nohasharray ++input_dev_show_name_41814 input_dev_show_name 0 41814 &da9052_enable_irq_41814 ++sco_send_frame_41815 sco_send_frame 3-0 41815 NULL nohasharray ++validate_device_41815 validate_device 0 41815 &sco_send_frame_41815 ++ecryptfs_write_begin_41816 ecryptfs_write_begin 0 41816 NULL ++ov7670_write_i2c_41817 ov7670_write_i2c 0 41817 NULL ++ocfs2_write_end_41820 ocfs2_write_end 0-5 41820 NULL ++max77686_enable_41821 max77686_enable 0 41821 NULL ++_ctl_io_delay_show_41822 _ctl_io_delay_show 0 41822 NULL ++ieee802154_hdr_push_41823 ieee802154_hdr_push 0 41823 NULL ++show_ipFragFails_41824 show_ipFragFails 0 41824 NULL ++acpi_device_set_power_41826 acpi_device_set_power 0 41826 NULL ++kimage_file_alloc_init_41827 kimage_file_alloc_init 5 41827 NULL ++test_irq_show_41838 test_irq_show 0 41838 NULL ++ixgbe_dbg_netdev_ops_read_41839 ixgbe_dbg_netdev_ops_read 3-0 41839 NULL nohasharray ++__bio_copy_iov_41839 __bio_copy_iov 0 41839 &ixgbe_dbg_netdev_ops_read_41839 ++em28xx_read_reg_req_41842 em28xx_read_reg_req 0 41842 NULL nohasharray ++i40evf_setup_all_rx_resources_41842 i40evf_setup_all_rx_resources 0 41842 &em28xx_read_reg_req_41842 ++do_ip_setsockopt_41852 do_ip_setsockopt 5-0 41852 NULL ++tcp_packets_in_flight_41853 tcp_packets_in_flight 0 41853 NULL ++keyctl_instantiate_key_41855 keyctl_instantiate_key 3 41855 NULL nohasharray ++unexport_store_41855 unexport_store 0-4 41855 &keyctl_instantiate_key_41855 ++xfs_rtget_summary_41864 xfs_rtget_summary 0 41864 NULL nohasharray ++hid_sensor_data_rdy_trigger_set_state_41864 hid_sensor_data_rdy_trigger_set_state 0 41864 &xfs_rtget_summary_41864 ++amd_uncore_attr_show_cpumask_41867 amd_uncore_attr_show_cpumask 0 41867 NULL ++pci_map_single_41869 pci_map_single 0 41869 NULL ++tg3_init_rings_41872 tg3_init_rings 0 41872 NULL ++cachefiles_daemon_fstop_41874 cachefiles_daemon_fstop 0 41874 NULL ++acpi_ut_acquire_mutex_41878 acpi_ut_acquire_mutex 0 41878 NULL nohasharray ++btrfs_file_write_iter_41878 btrfs_file_write_iter 0 41878 &acpi_ut_acquire_mutex_41878 ++store_nfilters_41883 store_nfilters 4-0 41883 NULL ++__dev_queue_xmit_41888 __dev_queue_xmit 0 41888 NULL ++nf_nat_ipv4_out_41891 nf_nat_ipv4_out 0 41891 NULL ++target_stat_scsi_dev_show_attr_indx_41895 target_stat_scsi_dev_show_attr_indx 0 41895 NULL ++qla2x00_beacon_store_41899 qla2x00_beacon_store 0-4 41899 NULL ++snd_cx25821_card_trigger_41908 snd_cx25821_card_trigger 0 41908 NULL ++mantis_i2c_write_41910 mantis_i2c_write 0 41910 NULL ++pem_show_bool_41911 pem_show_bool 0 41911 NULL nohasharray ++bch_cache_store_41911 bch_cache_store 0-4 41911 &pem_show_bool_41911 ++C_SYSC_mq_timedsend_41914 C_SYSC_mq_timedsend 3 41914 NULL nohasharray ++mem_show_41914 mem_show 0 41914 &C_SYSC_mq_timedsend_41914 nohasharray ++get_packet_41914 get_packet 3 41914 &mem_show_41914 ++get_fdb_entries_41916 get_fdb_entries 3 41916 NULL ++find_ge_pid_41918 find_ge_pid 1 41918 NULL ++build_inv_iotlb_pages_41922 build_inv_iotlb_pages 5-4 41922 NULL ++show_use_blk_mq_41924 show_use_blk_mq 0 41924 NULL nohasharray ++ecryptfs_setxattr_41924 ecryptfs_setxattr 0 41924 &show_use_blk_mq_41924 nohasharray ++mtrr_del_page_41924 mtrr_del_page 0-1 41924 &ecryptfs_setxattr_41924 ++isl1208_rtc_toggle_alarm_41925 isl1208_rtc_toggle_alarm 0 41925 NULL ++pci_dev_show_local_cpu_41927 pci_dev_show_local_cpu 0 41927 NULL nohasharray ++qmi_wwan_manage_power_41927 qmi_wwan_manage_power 0 41927 &pci_dev_show_local_cpu_41927 ++em2800_i2c_recv_bytes_41929 em2800_i2c_recv_bytes 0 41929 NULL nohasharray ++dbg_old_index_check_init_41929 dbg_old_index_check_init 0 41929 &em2800_i2c_recv_bytes_41929 ++txq_init_41933 txq_init 0 41933 NULL ++vhci_create_device_41934 vhci_create_device 0 41934 NULL ++ext4_da_write_inline_data_begin_41935 ext4_da_write_inline_data_begin 4-3 41935 NULL ++i40evf_change_mtu_41943 i40evf_change_mtu 0 41943 NULL ++sci_rxfill_41945 sci_rxfill 0 41945 NULL ++vfat_hash_41946 vfat_hash 0 41946 NULL ++read_gssp_41947 read_gssp 3-0 41947 NULL ++iscsi_iser_recv_41948 iscsi_iser_recv 4 41948 NULL ++ocfs2_xattr_bucket_get_name_value_41949 ocfs2_xattr_bucket_get_name_value 0 41949 NULL nohasharray ++smack_inode_permission_41949 smack_inode_permission 0 41949 &ocfs2_xattr_bucket_get_name_value_41949 ++skcipher_alloc_sgl_41956 skcipher_alloc_sgl 0 41956 NULL ++show_fc_host_fabric_name_41957 show_fc_host_fabric_name 0 41957 NULL ++portnames_read_41958 portnames_read 3-0 41958 NULL ++ubi_self_check_all_ff_41959 ubi_self_check_all_ff 4-0 41959 NULL nohasharray ++pyra_sysfs_read_profilex_buttons_41959 pyra_sysfs_read_profilex_buttons 0-5-6 41959 &ubi_self_check_all_ff_41959 ++show_sched6_41960 show_sched6 0 41960 NULL ++show_als_41966 show_als 0 41966 NULL nohasharray ++adis_debugfs_reg_access_41966 adis_debugfs_reg_access 0 41966 &show_als_41966 ++dst_mtu_41969 dst_mtu 0 41969 NULL ++cx24116_writeregN_41975 cx24116_writeregN 4 41975 NULL ++write_acpi_int_ret_41977 write_acpi_int_ret 0 41977 NULL ++ubi_io_is_bad_41983 ubi_io_is_bad 0 41983 NULL ++xfs_qm_dqalloc_41985 xfs_qm_dqalloc 0 41985 NULL ++_get_slice_41991 _get_slice 0 41991 NULL ++set_temp11_41995 set_temp11 0-4 41995 NULL ++em28xx_write_regs_41996 em28xx_write_regs 0 41996 NULL ++xfs_da3_root_join_41997 xfs_da3_root_join 0 41997 NULL ++be_process_mcc_42002 be_process_mcc 0 42002 NULL ++keyring_preparse_42005 keyring_preparse 0 42005 NULL ++wl12xx_acx_mem_cfg_42006 wl12xx_acx_mem_cfg 0 42006 NULL ++input_print_bitmap_42008 input_print_bitmap 0 42008 NULL nohasharray ++lguest_map_42008 lguest_map 1-2 42008 &input_print_bitmap_42008 ++pool_allocate_42012 pool_allocate 3 42012 NULL nohasharray ++af9035_i2c_master_xfer_42012 af9035_i2c_master_xfer 0-3 42012 &pool_allocate_42012 nohasharray ++fan_set_cur_state_42012 fan_set_cur_state 0 42012 &af9035_i2c_master_xfer_42012 ++spidev_sync_read_42014 spidev_sync_read 0 42014 NULL ++rs_sta_dbgfs_scale_table_write_42017 rs_sta_dbgfs_scale_table_write 3-0 42017 NULL ++vfat_revalidate_ci_42018 vfat_revalidate_ci 0 42018 NULL ++sony_pic_fanspeed_show_42021 sony_pic_fanspeed_show 0 42021 NULL ++create_port0_egr_42027 create_port0_egr 0 42027 NULL ++acpi_ut_create_buffer_object_42030 acpi_ut_create_buffer_object 1 42030 NULL ++ql_cam_route_initialize_42031 ql_cam_route_initialize 0 42031 NULL ++device_get_child_node_count_42032 device_get_child_node_count 0 42032 NULL ++__hwahc_op_set_gtk_42038 __hwahc_op_set_gtk 4 42038 NULL ++alloc_trace_kprobe_42041 alloc_trace_kprobe 6 42041 NULL ++acpi_power_on_42044 acpi_power_on 0 42044 NULL ++xfs_allocbt_free_block_42045 xfs_allocbt_free_block 0 42045 NULL ++irda_sendmsg_ultra_42047 irda_sendmsg_ultra 4-0 42047 NULL nohasharray ++qlcnic_sriov_func_to_index_42047 qlcnic_sriov_func_to_index 0 42047 &irda_sendmsg_ultra_42047 ++jffs2_do_link_42048 jffs2_do_link 6 42048 NULL nohasharray ++dma_generic_alloc_coherent_42048 dma_generic_alloc_coherent 2 42048 &jffs2_do_link_42048 ++ps_poll_upsd_max_ap_turn_read_42050 ps_poll_upsd_max_ap_turn_read 3-0 42050 NULL nohasharray ++__uncore_match0_show_42050 __uncore_match0_show 0 42050 &ps_poll_upsd_max_ap_turn_read_42050 ++get_xstats_size_42051 get_xstats_size 0 42051 NULL ++compat_sys_sendfile_42055 compat_sys_sendfile 4 42055 NULL ++v9fs_vfs_writepage_42056 v9fs_vfs_writepage 0 42056 NULL ++iwl_mvm_scan_size_42057 iwl_mvm_scan_size 0 42057 NULL ++rpipe_aim_42059 rpipe_aim 0 42059 NULL ++show_tcpAttemptFails_42066 show_tcpAttemptFails 0 42066 NULL nohasharray ++asix_set_mac_address_42066 asix_set_mac_address 0 42066 &show_tcpAttemptFails_42066 ++bh1770_get_lux_rate_avail_42067 bh1770_get_lux_rate_avail 0 42067 NULL ++ceph_readpage_from_fscache_42073 ceph_readpage_from_fscache 0 42073 NULL nohasharray ++store_target_speed_42073 store_target_speed 0-4 42073 &ceph_readpage_from_fscache_42073 ++ql_write_cfg_42074 ql_write_cfg 0 42074 NULL ++show_conn_param_ISCSI_PARAM_PERSISTENT_PORT_42076 show_conn_param_ISCSI_PARAM_PERSISTENT_PORT 0 42076 NULL ++si4713_powerdown_42078 si4713_powerdown 0 42078 NULL ++ath10k_ce_init_src_ring_42080 ath10k_ce_init_src_ring 0 42080 NULL ++SMB2_read_42082 SMB2_read 0 42082 NULL ++bat1_show_42084 bat1_show 0 42084 NULL ++alloc_bitset_42085 alloc_bitset 1 42085 NULL ++scsi_execute_req_42088 scsi_execute_req 5 42088 NULL ++store_rotate_all_42089 store_rotate_all 0-4 42089 NULL ++dfx_open_42091 dfx_open 0 42091 NULL ++sh_eth_reset_42097 sh_eth_reset 0 42097 NULL ++dlm_release_lockspace_42098 dlm_release_lockspace 0 42098 NULL ++ext4_sync_file_42100 ext4_sync_file 0 42100 NULL ++rtc_sysfs_show_wakealarm_42102 rtc_sysfs_show_wakealarm 0 42102 NULL ++show_bank2_alarm_42104 show_bank2_alarm 0 42104 NULL ++bcmgenet_init_dma_42105 bcmgenet_init_dma 0 42105 NULL ++submit_inquiry_42108 submit_inquiry 3 42108 NULL nohasharray ++brport_store_42108 brport_store 0-4 42108 &submit_inquiry_42108 ++dw_dma_cyclic_prep_42113 dw_dma_cyclic_prep 4-3 42113 NULL ++store_gps_42118 store_gps 4-0 42118 NULL ++ubifs_tnc_read_node_42119 ubifs_tnc_read_node 0 42119 NULL ++ext4_do_update_inode_42127 ext4_do_update_inode 0 42127 NULL ++notify_send_init_42129 notify_send_init 0 42129 NULL ++Read_hfc16_stable_42131 Read_hfc16_stable 0 42131 NULL ++si476x_core_parse_and_nag_about_error_42136 si476x_core_parse_and_nag_about_error 0 42136 NULL ++bb_buf_prepare_42137 bb_buf_prepare 0 42137 NULL ++threads_start_42139 threads_start 0 42139 NULL ++bq24190_sysfs_show_42146 bq24190_sysfs_show 0 42146 NULL ++lapb_register_42149 lapb_register 0 42149 NULL nohasharray ++efx_change_mtu_42149 efx_change_mtu 0 42149 &lapb_register_42149 ++ubifs_lookup_level0_42156 ubifs_lookup_level0 0 42156 NULL ++iwl_mvm_mac_ctxt_init_42158 iwl_mvm_mac_ctxt_init 0 42158 NULL ++blk_ioctl_zeroout_42160 blk_ioctl_zeroout 3 42160 NULL ++af9015_i2c_xfer_42161 af9015_i2c_xfer 0-3 42161 NULL nohasharray ++mmc_align_data_size_42161 mmc_align_data_size 0-2 42161 &af9015_i2c_xfer_42161 ++mv_u3d_ep_queue_42164 mv_u3d_ep_queue 0 42164 NULL ++gadget_strings_serialnumber_store_42166 gadget_strings_serialnumber_store 0-3 42166 NULL ++ceph_vxattrcb_layout_pool_42167 ceph_vxattrcb_layout_pool 0 42167 NULL nohasharray ++pps_enable_store_42167 pps_enable_store 0-4 42167 &ceph_vxattrcb_layout_pool_42167 nohasharray ++store_host_reset_42167 store_host_reset 0-4 42167 &pps_enable_store_42167 ++read_file_base_eeprom_42168 read_file_base_eeprom 3-0 42168 NULL ++gfs2_statfs_slow_42170 gfs2_statfs_slow 0 42170 NULL ++max8998_ldo_disable_42173 max8998_ldo_disable 0 42173 NULL nohasharray ++iwl_mvm_send_cmd_42173 iwl_mvm_send_cmd 0 42173 &max8998_ldo_disable_42173 ++power_restore_42174 power_restore 0 42174 NULL ++at86rf230_set_lbt_42175 at86rf230_set_lbt 0 42175 NULL ++shash_finup_unaligned_42176 shash_finup_unaligned 0 42176 NULL ++oprofilefs_str_to_user_42182 oprofilefs_str_to_user 3-0 42182 NULL ++dn_dev_bind_default_42183 dn_dev_bind_default 0 42183 NULL ++show_rc6_mask_42184 show_rc6_mask 0 42184 NULL ++write_file_beacon_42185 write_file_beacon 3-0 42185 NULL ++mwifiex_cmd_amsdu_aggr_ctrl_42192 mwifiex_cmd_amsdu_aggr_ctrl 0 42192 NULL ++reset_slot_42194 reset_slot 0 42194 NULL ++crc32_pclmul_finup_42200 crc32_pclmul_finup 0 42200 NULL ++get_znodes_to_commit_42201 get_znodes_to_commit 0 42201 NULL ++hdlcdrv_open_42202 hdlcdrv_open 0 42202 NULL ++sprom2hex_42204 sprom2hex 0 42204 NULL ++v9fs_write_begin_42211 v9fs_write_begin 0 42211 NULL ++ixgbe_add_mac_filter_42218 ixgbe_add_mac_filter 0 42218 NULL ++cifs_listxattr_42223 cifs_listxattr 0-3 42223 NULL ++s35390a_rtc_set_alarm_42224 s35390a_rtc_set_alarm 0 42224 NULL ++qlge_set_mac_address_42227 qlge_set_mac_address 0 42227 NULL ++blockdev_direct_IO_42235 blockdev_direct_IO 0-5 42235 NULL nohasharray ++pla_ocp_read_42235 pla_ocp_read 3 42235 &blockdev_direct_IO_42235 ++toshiba_kbd_bl_mode_show_42236 toshiba_kbd_bl_mode_show 0 42236 NULL ++nilfs_segments_blocks_per_segment_show_42237 nilfs_segments_blocks_per_segment_show 0 42237 NULL ++pci_user_read_config_word_42240 pci_user_read_config_word 0 42240 NULL nohasharray ++i915_l3_write_42240 i915_l3_write 0-6-5 42240 &pci_user_read_config_word_42240 ++snd_pcm_pre_suspend_42241 snd_pcm_pre_suspend 0 42241 NULL ++xfs_rtfree_range_42244 xfs_rtfree_range 0 42244 NULL ++pch_gbe_up_42245 pch_gbe_up 0 42245 NULL ++store_mlid_42247 store_mlid 0-4 42247 NULL ++islpci_reset_if_42249 islpci_reset_if 0 42249 NULL ++usbtv_start_42251 usbtv_start 0 42251 NULL ++v9fs_vfs_setattr_42252 v9fs_vfs_setattr 0 42252 NULL ++rx_defrag_need_decrypt_read_42253 rx_defrag_need_decrypt_read 3-0 42253 NULL ++resources_store_42255 resources_store 0-4 42255 NULL ++netxen_nic_map_indirect_address_128M_42257 netxen_nic_map_indirect_address_128M 2 42257 NULL nohasharray ++amd5536_udc_start_42257 amd5536_udc_start 0 42257 &netxen_nic_map_indirect_address_128M_42257 ++find_last_bit_42260 find_last_bit 0-2 42260 NULL ++show_fc_host_port_name_42264 show_fc_host_port_name 0 42264 NULL ++ctnetlink_proto_size_42270 ctnetlink_proto_size 0 42270 NULL ++__pcpu_size_to_slot_42271 __pcpu_size_to_slot 0 42271 NULL ++__tty_buffer_request_room_42276 __tty_buffer_request_room 2-0 42276 NULL ++snd_pcm_hw_param_value_max_42280 snd_pcm_hw_param_value_max 0 42280 NULL nohasharray ++pinctrl_gpio_direction_output_42280 pinctrl_gpio_direction_output 0 42280 &snd_pcm_hw_param_value_max_42280 ++rtnl_link_get_af_size_42296 rtnl_link_get_af_size 0 42296 NULL ++xadc_preenable_42298 xadc_preenable 0 42298 NULL ++__cpus_weight_42299 __cpus_weight 0 42299 NULL ++sel_read_perm_42302 sel_read_perm 3-0 42302 NULL ++xfs_attr3_leaf_add_work_42303 xfs_attr3_leaf_add_work 0 42303 NULL ++ulong_read_file_42304 ulong_read_file 3-0 42304 NULL nohasharray ++sctp_setsockopt_del_key_42304 sctp_setsockopt_del_key 3-0 42304 &ulong_read_file_42304 ++key_payload_reserve_42307 key_payload_reserve 0 42307 NULL ++xfs_vm_readpages_42308 xfs_vm_readpages 4 42308 NULL ++sco_sock_getname_42312 sco_sock_getname 0 42312 NULL ++bnep_sock_create_42314 bnep_sock_create 0 42314 NULL ++qlcnic_sriov_pf_set_vport_info_42316 qlcnic_sriov_pf_set_vport_info 0 42316 NULL ++osdname_show_42317 osdname_show 0 42317 NULL ++max_luns_show_42319 max_luns_show 0 42319 NULL ++axxia_i2c_xfer_42322 axxia_i2c_xfer 0-3 42322 NULL nohasharray ++bcm_tx_send_42322 bcm_tx_send 0 42322 &axxia_i2c_xfer_42322 ++hysdn_conf_read_42324 hysdn_conf_read 3 42324 NULL ++ov772x_g_crop_42326 ov772x_g_crop 0 42326 NULL ++tcp_sync_mss_42330 tcp_sync_mss 2-0 42330 NULL ++bh1770_get_lux_thresh_below_42336 bh1770_get_lux_thresh_below 0 42336 NULL ++snd_pcm_plug_alloc_42339 snd_pcm_plug_alloc 2-0 42339 NULL ++regulator_state_show_42345 regulator_state_show 0 42345 NULL nohasharray ++store_42345 store 0-3 42345 ®ulator_state_show_42345 ++rtl2832_sdr_rd_42346 rtl2832_sdr_rd 0 42346 NULL ++ipr_store_log_level_42353 ipr_store_log_level 0-4 42353 NULL ++cit_get_packet_size_42354 cit_get_packet_size 0 42354 NULL ++ide_raw_taskfile_42355 ide_raw_taskfile 4 42355 NULL ++mxl5007t_write_regs_42356 mxl5007t_write_regs 0 42356 NULL ++fuse_file_read_iter_42364 fuse_file_read_iter 0 42364 NULL ++adp5520_bl_daylight_dim_store_42370 adp5520_bl_daylight_dim_store 0-4 42370 NULL ++xhci_queue_bulk_tx_42377 xhci_queue_bulk_tx 0 42377 NULL ++drbd_md_last_sector_42378 drbd_md_last_sector 0 42378 NULL ++read_time_42381 read_time 0 42381 NULL nohasharray ++ip_mc_msfilter_42381 ip_mc_msfilter 0 42381 &read_time_42381 ++unregister_gadget_42382 unregister_gadget 0 42382 NULL ++test_power_get_battery_property_42384 test_power_get_battery_property 0 42384 NULL ++show_conn_param_ISCSI_PARAM_TCP_TIMER_SCALE_42385 show_conn_param_ISCSI_PARAM_TCP_TIMER_SCALE 0 42385 NULL ++il_dbgfs_disable_ht40_read_42386 il_dbgfs_disable_ht40_read 3-0 42386 NULL ++change_queue_depth_42393 change_queue_depth 0 42393 NULL ++r9701_get_datetime_42402 r9701_get_datetime 0 42402 NULL ++brcms_ops_add_interface_42403 brcms_ops_add_interface 0 42403 NULL ++msnd_fifo_read_42406 msnd_fifo_read 0-3 42406 NULL ++pci_resource_alignment_store_42407 pci_resource_alignment_store 0-3 42407 NULL ++SYSC_recv_42413 SYSC_recv 3 42413 NULL ++store_spi_transport_period_helper_42414 store_spi_transport_period_helper 0-3 42414 NULL ++qlcnic_sriov_prepare_bc_hdr_42416 qlcnic_sriov_prepare_bc_hdr 0 42416 NULL ++krng_get_random_42420 krng_get_random 3 42420 NULL ++i2o_event_register_42424 i2o_event_register 0 42424 NULL ++wm831x_clkout_prepare_42426 wm831x_clkout_prepare 0 42426 NULL ++ixgbevf_write_posted_mbx_42428 ixgbevf_write_posted_mbx 0 42428 NULL ++device_read_42432 device_read 0-3 42432 NULL ++__iio_add_chan_devattr_42434 __iio_add_chan_devattr 0 42434 NULL nohasharray ++ixgbevf_poll_for_msg_42434 ixgbevf_poll_for_msg 0 42434 &__iio_add_chan_devattr_42434 ++btrfs_nodesize_show_42436 btrfs_nodesize_show 0 42436 NULL ++gsm_data_alloc_42437 gsm_data_alloc 3 42437 NULL nohasharray ++cfq_back_seek_penalty_store_42437 cfq_back_seek_penalty_store 3-0 42437 &gsm_data_alloc_42437 ++tusb_musb_set_mode_42439 tusb_musb_set_mode 0 42439 NULL ++spr_wm_latency_write_42441 spr_wm_latency_write 3-0 42441 NULL ++do_qib_user_sdma_queue_create_42442 do_qib_user_sdma_queue_create 0 42442 NULL ++key_conf_keyidx_read_42443 key_conf_keyidx_read 3-0 42443 NULL ++gpio_direction_input_42445 gpio_direction_input 0 42445 NULL ++store_42448 store 0 42448 NULL ++_nfs4_proc_setlk_42449 _nfs4_proc_setlk 0 42449 NULL nohasharray ++nfs_writepage_setup_42449 nfs_writepage_setup 0 42449 &_nfs4_proc_setlk_42449 ++snd_pcm_action_group_42452 snd_pcm_action_group 0 42452 NULL nohasharray ++sysfs_compact_node_42452 sysfs_compact_node 0-4 42452 &snd_pcm_action_group_42452 ++__clk_enable_42456 __clk_enable 0 42456 NULL ++nfc_sock_create_42457 nfc_sock_create 0 42457 NULL ++ext3_valid_block_bitmap_42459 ext3_valid_block_bitmap 3 42459 NULL ++show_lcdtype_42462 show_lcdtype 0 42462 NULL ++show_lid_resume_42464 show_lid_resume 0 42464 NULL ++__simple_xattr_set_42474 __simple_xattr_set 4-0 42474 NULL ++sta_state_42478 sta_state 0 42478 NULL ++show_coresize_42479 show_coresize 0 42479 NULL ++ocfs2_xattr_ibody_list_42480 ocfs2_xattr_ibody_list 0 42480 NULL ++kernel_recvmsg_42482 kernel_recvmsg 0-5 42482 NULL ++set_zone_42484 set_zone 0-4 42484 NULL ++omfs_readpages_42490 omfs_readpages 4 42490 NULL nohasharray ++nfulnl_rcv_nl_event_42490 nfulnl_rcv_nl_event 0 42490 &omfs_readpages_42490 nohasharray ++store_spi_transport_hold_mcs_42490 store_spi_transport_hold_mcs 0-4 42490 &nfulnl_rcv_nl_event_42490 ++parport_mos7715_read_data_42492 parport_mos7715_read_data 0 42492 NULL nohasharray ++wl1251_acx_sleep_auth_42492 wl1251_acx_sleep_auth 0 42492 &parport_mos7715_read_data_42492 ++callback_42494 callback 0 42494 NULL ++target_stat_scsi_auth_intr_show_attr_creation_time_42496 target_stat_scsi_auth_intr_show_attr_creation_time 0 42496 NULL ++iscsi_nacl_attrib_show_dataout_timeout_42499 iscsi_nacl_attrib_show_dataout_timeout 0 42499 NULL ++ibm_read_apci_table_42504 ibm_read_apci_table 0-5-6 42504 NULL ++SyS_mincore_42511 SyS_mincore 1-2 42511 NULL ++sctp_init_sock_42514 sctp_init_sock 0 42514 NULL ++ath9k_sta_add_42517 ath9k_sta_add 0 42517 NULL ++fanotify_read_42518 fanotify_read 0-3 42518 NULL ++jbd2_log_wait_commit_42519 jbd2_log_wait_commit 0 42519 NULL ++kvm_write_wall_clock_42520 kvm_write_wall_clock 2 42520 NULL nohasharray ++pch_phub_write_serial_rom_val_42520 pch_phub_write_serial_rom_val 0 42520 &kvm_write_wall_clock_42520 ++proc_notify_change_42521 proc_notify_change 0 42521 NULL ++dio_bio_complete_42524 dio_bio_complete 0 42524 NULL ++smk_write_netlbladdr_42525 smk_write_netlbladdr 3-0 42525 NULL ++self_check_ec_hdr_42528 self_check_ec_hdr 0 42528 NULL ++sys_vmsplice_42533 sys_vmsplice 3 42533 NULL nohasharray ++snd_emux_create_port_42533 snd_emux_create_port 3 42533 &sys_vmsplice_42533 ++sdev_store_evt_capacity_change_reported_42538 sdev_store_evt_capacity_change_reported 0-4 42538 NULL ++mtip_hw_submit_io_42539 mtip_hw_submit_io 4 42539 NULL ++mt9m111_set_hvflip_42542 mt9m111_set_hvflip 0 42542 NULL ++__wa_xfer_setup_42543 __wa_xfer_setup 0 42543 NULL ++dbAllocNear_42546 dbAllocNear 0 42546 NULL ++mvs_task_exec_42547 mvs_task_exec 0 42547 NULL ++ath6kl_wmi_proc_events_vif_42549 ath6kl_wmi_proc_events_vif 5 42549 NULL nohasharray ++path_lookupat_42549 path_lookupat 0 42549 &ath6kl_wmi_proc_events_vif_42549 ++request_firmware_42553 request_firmware 0 42553 NULL ++ip_vs_out_icmp_v6_42557 ip_vs_out_icmp_v6 0 42557 NULL ++udp_recvmsg_42558 udp_recvmsg 4-0 42558 NULL nohasharray ++iscsit_ta_cache_dynamic_acls_42558 iscsit_ta_cache_dynamic_acls 0 42558 &udp_recvmsg_42558 ++portio_type_show_42562 portio_type_show 0 42562 NULL ++target_stat_scsi_lu_show_attr_creation_time_42563 target_stat_scsi_lu_show_attr_creation_time 0 42563 NULL ++br_set_mac_address_42565 br_set_mac_address 0 42565 NULL ++iwl_print_event_log_42566 iwl_print_event_log 5-0-7 42566 NULL ++get_in_min_42567 get_in_min 0 42567 NULL ++read_or_alloc_page_42578 read_or_alloc_page 0 42578 NULL ++wusb_disconnect_store_42581 wusb_disconnect_store 0-4 42581 NULL ++rj54n1_s_stream_42582 rj54n1_s_stream 0 42582 NULL ++memory_failure_42590 memory_failure 0 42590 NULL ++oom_score_adj_write_42594 oom_score_adj_write 3-0 42594 NULL ++video_outputsw_set_42595 video_outputsw_set 0 42595 NULL ++get_enable_42601 get_enable 0 42601 NULL ++map_state_42602 map_state 1 42602 NULL nohasharray ++snd_pcsp_playback_prepare_42602 snd_pcsp_playback_prepare 0 42602 &map_state_42602 nohasharray ++npwm_show_42602 npwm_show 0 42602 &snd_pcsp_playback_prepare_42602 nohasharray ++__pskb_pull_42602 __pskb_pull 2 42602 &npwm_show_42602 ++sctp_outq_flush_42605 sctp_outq_flush 0 42605 NULL ++get_div_42612 get_div 0 42612 NULL ++__uncore_mask_mc_show_42614 __uncore_mask_mc_show 0 42614 NULL ++logfs_truncate_42615 logfs_truncate 0 42615 NULL ++dbg_check_ltab_lnum_42617 dbg_check_ltab_lnum 0 42617 NULL ++release_lockspace_42618 release_lockspace 0 42618 NULL nohasharray ++read_42618 read 0 42618 &release_lockspace_42618 ++rt2500pci_set_device_state_42620 rt2500pci_set_device_state 0 42620 NULL nohasharray ++vlan_dev_open_42620 vlan_dev_open 0 42620 &rt2500pci_set_device_state_42620 ++secinfo_parse_42624 secinfo_parse 0 42624 NULL ++mv88e6xxx_phy_read_42625 mv88e6xxx_phy_read 0 42625 NULL ++sys_move_pages_42626 sys_move_pages 2 42626 NULL nohasharray ++map_show_42626 map_show 0 42626 &sys_move_pages_42626 ++xfs_attr_leaf_removename_42629 xfs_attr_leaf_removename 0 42629 NULL ++crypto_ahash_walk_first_42630 crypto_ahash_walk_first 0 42630 NULL ++snd_hwdep_dev_register_42632 snd_hwdep_dev_register 0 42632 NULL ++ieee80211_if_fmt_dot11MeshHWMPactivePathTimeout_42635 ieee80211_if_fmt_dot11MeshHWMPactivePathTimeout 3 42635 NULL ++b43legacy_wireless_core_init_42640 b43legacy_wireless_core_init 0 42640 NULL ++br_mdb_rehash_42643 br_mdb_rehash 2 42643 NULL ++num_controllers_42644 num_controllers 0 42644 NULL ++mc13783_adc_read_bp_42646 mc13783_adc_read_bp 0 42646 NULL nohasharray ++process_output_block_42646 process_output_block 0 42646 &mc13783_adc_read_bp_42646 ++sis190_get_regs_len_42647 sis190_get_regs_len 0 42647 NULL nohasharray ++gpio_request_enable_42647 gpio_request_enable 0 42647 &sis190_get_regs_len_42647 ++i7core_mce_check_error_42651 i7core_mce_check_error 0 42651 NULL ++_regmap_raw_write_42652 _regmap_raw_write 2-4-0 42652 NULL ++page_counter_memparse_42653 page_counter_memparse 0 42653 NULL ++i40e_setup_rx_descriptors_42655 i40e_setup_rx_descriptors 0 42655 NULL ++ess_audio_prepare_for_input_42659 ess_audio_prepare_for_input 0 42659 NULL ++print_nodes_state_42664 print_nodes_state 0 42664 NULL ++s5p_mfc_start_streaming_42666 s5p_mfc_start_streaming 0 42666 NULL ++pinctrl_gpio_direction_input_42668 pinctrl_gpio_direction_input 0 42668 NULL ++acpi_power_get_inferred_state_42669 acpi_power_get_inferred_state 0 42669 NULL nohasharray ++ipx_setsockopt_42669 ipx_setsockopt 0 42669 &acpi_power_get_inferred_state_42669 ++show_cidmode_42671 show_cidmode 0 42671 NULL ++l2tp_xmit_skb_42672 l2tp_xmit_skb 3 42672 NULL ++btrfs_label_store_42678 btrfs_label_store 0-4 42678 NULL ++rocker_group_tbl_do_42683 rocker_group_tbl_do 0 42683 NULL ++at91_sysfs_set_mb0_id_42685 at91_sysfs_set_mb0_id 0-4 42685 NULL ++cifs_spnego_key_instantiate_42686 cifs_spnego_key_instantiate 0 42686 NULL nohasharray ++store_spi_transport_wr_flow_42686 store_spi_transport_wr_flow 0-4 42686 &cifs_spnego_key_instantiate_42686 ++wiimod_pro_calib_store_42692 wiimod_pro_calib_store 0-4 42692 NULL ++request_key_and_link_42693 request_key_and_link 4 42693 NULL nohasharray ++rsi_send_internal_mgmt_frame_42693 rsi_send_internal_mgmt_frame 0 42693 &request_key_and_link_42693 ++acpi_dev_get_irqresource_42694 acpi_dev_get_irqresource 2 42694 NULL nohasharray ++iio_trigger_attach_poll_func_42694 iio_trigger_attach_poll_func 0 42694 &acpi_dev_get_irqresource_42694 ++ipoib_vlan_delete_42696 ipoib_vlan_delete 0 42696 NULL ++nilfs_btnode_submit_block_42698 nilfs_btnode_submit_block 0 42698 NULL ++bnx2fc_ctlr_enabled_42700 bnx2fc_ctlr_enabled 0 42700 NULL ++vb2_read_42703 vb2_read 3-0 42703 NULL ++store_sas_link_reset_42705 store_sas_link_reset 4-0 42705 NULL ++hard_show_42708 hard_show 0 42708 NULL nohasharray ++sierra_net_send_cmd_42708 sierra_net_send_cmd 3 42708 &hard_show_42708 ++pm8001_ctl_max_sg_list_show_42710 pm8001_ctl_max_sg_list_show 0 42710 NULL ++taos_smbus_xfer_42714 taos_smbus_xfer 0 42714 NULL ++regulator_print_state_42718 regulator_print_state 0 42718 NULL ++adxl34x_calibrate_show_42719 adxl34x_calibrate_show 0 42719 NULL ++read_status_42722 read_status 0 42722 NULL ++selinux_ip_postroute_42725 selinux_ip_postroute 0 42725 NULL ++setup_ntlmv2_rsp_42726 setup_ntlmv2_rsp 0 42726 NULL ++iwl_mvm_coex_dump_mbox_old_42727 iwl_mvm_coex_dump_mbox_old 0-3-4 42727 NULL ++bmg160_data_rdy_trigger_set_state_42728 bmg160_data_rdy_trigger_set_state 0 42728 NULL ++dvb_demux_ioctl_42733 dvb_demux_ioctl 2 42733 NULL nohasharray ++target_stat_scsi_auth_intr_show_attr_hs_num_cmds_42733 target_stat_scsi_auth_intr_show_attr_hs_num_cmds 0 42733 &dvb_demux_ioctl_42733 nohasharray ++fw_get_filesystem_firmware_42733 fw_get_filesystem_firmware 0 42733 &target_stat_scsi_auth_intr_show_attr_hs_num_cmds_42733 ++xen_release_pmd_42734 xen_release_pmd 1 42734 NULL ++set_aoe_iflist_42737 set_aoe_iflist 2 42737 NULL nohasharray ++igbvf_get_regs_len_42737 igbvf_get_regs_len 0 42737 &set_aoe_iflist_42737 ++ax25_setsockopt_42740 ax25_setsockopt 5-0 42740 NULL ++SendReceive2_42742 SendReceive2 0 42742 NULL ++sdev_show_modalias_42746 sdev_show_modalias 0 42746 NULL nohasharray ++write_42746 write 0 42746 &sdev_show_modalias_42746 ++xen_bind_pirq_gsi_to_irq_42750 xen_bind_pirq_gsi_to_irq 1 42750 NULL nohasharray ++lbs_mesh_set_42750 lbs_mesh_set 0-4 42750 &xen_bind_pirq_gsi_to_irq_42750 ++dpm_sysfs_add_42756 dpm_sysfs_add 0 42756 NULL nohasharray ++s2io_open_42756 s2io_open 0 42756 &dpm_sysfs_add_42756 ++sysfs_set_active_low_42759 sysfs_set_active_low 0 42759 NULL ++usblp_rtest_42761 usblp_rtest 0 42761 NULL ++sysfs_show_available_clocksources_42763 sysfs_show_available_clocksources 0 42763 NULL ++vmxnet3_rq_create_42771 vmxnet3_rq_create 0 42771 NULL ++ath10k_htt_verify_version_42776 ath10k_htt_verify_version 0 42776 NULL ++x25_recvmsg_42777 x25_recvmsg 0-4 42777 NULL ++lp3943_gpio_direction_output_42778 lp3943_gpio_direction_output 0 42778 NULL ++snd_midi_event_decode_42780 snd_midi_event_decode 0 42780 NULL ++isku_sysfs_read_info_42781 isku_sysfs_read_info 0-6-5 42781 NULL nohasharray ++cryptd_hash_setkey_42781 cryptd_hash_setkey 3 42781 &isku_sysfs_read_info_42781 ++show_fnode_chap_out_idx_42784 show_fnode_chap_out_idx 0 42784 NULL ++store_fan_beep_42785 store_fan_beep 0-4 42785 NULL ++elfcorehdr_read_notes_42786 elfcorehdr_read_notes 2 42786 NULL ++hackrf_set_if_gain_42788 hackrf_set_if_gain 0 42788 NULL ++koneplus_sysfs_read_42792 koneplus_sysfs_read 0-6 42792 NULL ++cgroup_migrate_prepare_dst_42793 cgroup_migrate_prepare_dst 0 42793 NULL ++show_chglim_42794 show_chglim 0 42794 NULL ++ntfs_attr_extend_allocation_42796 ntfs_attr_extend_allocation 0-2 42796 NULL ++fw_device_op_compat_ioctl_42804 fw_device_op_compat_ioctl 2 42804 NULL ++show_line1_42806 show_line1 0 42806 NULL ++esd_usb2_open_42809 esd_usb2_open 0 42809 NULL ++pcf2127_get_datetime_42811 pcf2127_get_datetime 0 42811 NULL nohasharray ++smk_bu_current_42811 smk_bu_current 0-4 42811 &pcf2127_get_datetime_42811 ++drm_ioctl_42813 drm_ioctl 2 42813 NULL ++__bch_cache_set_store_42815 __bch_cache_set_store 0-4 42815 NULL ++iwl_dbgfs_ucode_bt_stats_read_42820 iwl_dbgfs_ucode_bt_stats_read 3-0 42820 NULL ++set_arg_42824 set_arg 3 42824 NULL ++si476x_radio_read_rsq_blob_42827 si476x_radio_read_rsq_blob 3-0 42827 NULL ++bnad_mtu_set_42833 bnad_mtu_set 0 42833 NULL ++dnotify_handle_event_42835 dnotify_handle_event 0 42835 NULL ++f2fs_unfreeze_42836 f2fs_unfreeze 0 42836 NULL ++show_sas_rphy_target_port_protocols_42840 show_sas_rphy_target_port_protocols 0 42840 NULL ++prop_compression_validate_42847 prop_compression_validate 0 42847 NULL ++show_ata_dev_xfer_mode_42848 show_ata_dev_xfer_mode 0 42848 NULL ++btmrvl_fwdump_write_42850 btmrvl_fwdump_write 3-0 42850 NULL ++prandom_u32_42853 prandom_u32 0 42853 NULL nohasharray ++ath6kl_wmi_config_debug_module_cmd_42853 ath6kl_wmi_config_debug_module_cmd 0 42853 &prandom_u32_42853 ++wl12xx_init_vif_data_42855 wl12xx_init_vif_data 0 42855 NULL ++return_gap_lebs_42862 return_gap_lebs 0 42862 NULL ++gen_pool_first_fit_order_align_42863 gen_pool_first_fit_order_align 4-3-2 42863 NULL nohasharray ++destroy_42863 destroy 0 42863 &gen_pool_first_fit_order_align_42863 nohasharray ++of_property_count_strings_42863 of_property_count_strings 0 42863 &destroy_42863 ++ad7877_read_adc_42867 ad7877_read_adc 0 42867 NULL ++nouveau_vm_create_42869 nouveau_vm_create 3-2 42869 NULL nohasharray ++_ctl_host_trace_buffer_show_42869 _ctl_host_trace_buffer_show 0 42869 &nouveau_vm_create_42869 ++parse_user_pin_configs_42870 parse_user_pin_configs 0 42870 NULL ++t4_sge_alloc_rxq_42871 t4_sge_alloc_rxq 0 42871 NULL nohasharray ++snd_device_register_all_42871 snd_device_register_all 0 42871 &t4_sge_alloc_rxq_42871 ++iscsi_stat_instance_show_attr_description_42874 iscsi_stat_instance_show_attr_description 0 42874 NULL ++mt9v022_s_ctrl_42875 mt9v022_s_ctrl 0 42875 NULL nohasharray ++media_read_42875 media_read 0-3 42875 &mt9v022_s_ctrl_42875 ++nvme_trans_unit_serial_page_42879 nvme_trans_unit_serial_page 4 42879 NULL ++tw68_video_init2_42880 tw68_video_init2 2 42880 NULL ++pskb_expand_head_42881 pskb_expand_head 0-3-2 42881 NULL ++rt5677_gpio_direction_in_42886 rt5677_gpio_direction_in 0 42886 NULL nohasharray ++pcistub_irq_handler_switch_42886 pcistub_irq_handler_switch 0-3 42886 &rt5677_gpio_direction_in_42886 ++lm3530_mode_get_42888 lm3530_mode_get 0 42888 NULL ++c2_up_42890 c2_up 0 42890 NULL ++pci_write_42893 pci_write 0 42893 NULL ++xpc_kmalloc_cacheline_aligned_42895 xpc_kmalloc_cacheline_aligned 1 42895 NULL nohasharray ++twl4030_madc_conversion_42895 twl4030_madc_conversion 0 42895 &xpc_kmalloc_cacheline_aligned_42895 nohasharray ++amb_send_42895 amb_send 0 42895 &twl4030_madc_conversion_42895 ++SendTxCommandPacket_42901 SendTxCommandPacket 3 42901 NULL ++hd_end_request_42904 hd_end_request 2 42904 NULL ++ieee80211_tdls_mgmt_teardown_42905 ieee80211_tdls_mgmt_teardown 10 42905 NULL ++alx_change_mtu_42906 alx_change_mtu 0 42906 NULL ++rds_create_42907 rds_create 0 42907 NULL ++sta_last_rx_rate_read_42909 sta_last_rx_rate_read 3-0 42909 NULL ++g_mbus_fmt_42910 g_mbus_fmt 0 42910 NULL ++snd_jack_new_42914 snd_jack_new 0 42914 NULL ++hfsplus_user_getxattr_42915 hfsplus_user_getxattr 0 42915 NULL ++device_show_int_42919 device_show_int 0 42919 NULL ++simple_playback_pcm_prepare_42920 simple_playback_pcm_prepare 0 42920 NULL ++pcxhr_set_clock_42923 pcxhr_set_clock 0 42923 NULL nohasharray ++show_42923 show 0 42923 &pcxhr_set_clock_42923 ++drbd_header_size_42928 drbd_header_size 0 42928 NULL ++lis3lv02d_rate_set_42933 lis3lv02d_rate_set 0-4 42933 NULL ++set_analog_out_42935 set_analog_out 0-4 42935 NULL ++bnx2_open_42936 bnx2_open 0 42936 NULL ++xfs_bmapi_allocate_42938 xfs_bmapi_allocate 0 42938 NULL ++sctp_getsockopt_maxburst_42941 sctp_getsockopt_maxburst 2 42941 NULL nohasharray ++slot_store_42941 slot_store 0-3 42941 &sctp_getsockopt_maxburst_42941 ++handle_response_42945 handle_response 0 42945 NULL ++vx_reset_chk_42946 vx_reset_chk 0 42946 NULL nohasharray ++ds1682_store_42946 ds1682_store 0-4 42946 &vx_reset_chk_42946 ++hashtab_map_42947 hashtab_map 0 42947 NULL ++w1_ds2760_write_42955 w1_ds2760_write 3-4 42955 NULL ++sys_sethostname_42962 sys_sethostname 2 42962 NULL nohasharray ++set_temp0_min_42962 set_temp0_min 0-4 42962 &sys_sethostname_42962 ++fcoe_reset_42963 fcoe_reset 0 42963 NULL ++snd_korg1212_trigger_42966 snd_korg1212_trigger 0 42966 NULL nohasharray ++kone_check_write_42966 kone_check_write 0 42966 &snd_korg1212_trigger_42966 ++ntb_setup_snb_msix_42971 ntb_setup_snb_msix 2 42971 NULL ++n_pins_show_42973 n_pins_show 0 42973 NULL ++show_temp62_42975 show_temp62 0 42975 NULL ++show_rx_polinv_enb_42977 show_rx_polinv_enb 0 42977 NULL nohasharray ++sysv_readpage_42977 sysv_readpage 0 42977 &show_rx_polinv_enb_42977 ++acpi_get_device_data_42978 acpi_get_device_data 0 42978 NULL ++compat_udpv6_setsockopt_42981 compat_udpv6_setsockopt 5 42981 NULL nohasharray ++store_enable_clka1_output_42981 store_enable_clka1_output 0-4 42981 &compat_udpv6_setsockopt_42981 nohasharray ++pfkey_xfrm_policy2sec_ctx_size_42981 pfkey_xfrm_policy2sec_ctx_size 0 42981 &store_enable_clka1_output_42981 ++it8712f_wdt_write_42982 it8712f_wdt_write 0-3 42982 NULL ++pci_bus_read_config_word_42987 pci_bus_read_config_word 0 42987 NULL ++hwrng_attr_current_store_42989 hwrng_attr_current_store 0-4 42989 NULL ++nfs_idmap_get_desc_42990 nfs_idmap_get_desc 2-4 42990 NULL nohasharray ++rtw_os_xmit_resource_alloc_42990 rtw_os_xmit_resource_alloc 3 42990 &nfs_idmap_get_desc_42990 ++image_size_show_42992 image_size_show 0 42992 NULL ++mem_cgroup_force_empty_write_42994 mem_cgroup_force_empty_write 0-3 42994 NULL ++il4965_show_debug_level_42996 il4965_show_debug_level 0 42996 NULL ++xfs_da_read_buf_43008 xfs_da_read_buf 0 43008 NULL ++nct6683_create_attr_group_43010 nct6683_create_attr_group 3 43010 NULL ++vfio_fill_vconfig_bytes_43016 vfio_fill_vconfig_bytes 0 43016 NULL nohasharray ++gadget_dev_desc_bDeviceProtocol_show_43016 gadget_dev_desc_bDeviceProtocol_show 0 43016 &vfio_fill_vconfig_bytes_43016 ++rxrpc_preparse_xdr_rxk5_43019 rxrpc_preparse_xdr_rxk5 0 43019 NULL ++snd_pcm_pre_start_43020 snd_pcm_pre_start 0 43020 NULL nohasharray ++export_store_43020 export_store 0-4 43020 &snd_pcm_pre_start_43020 ++p54_add_interface_43022 p54_add_interface 0 43022 NULL ++isr_rx_mem_overflow_read_43025 isr_rx_mem_overflow_read 3-0 43025 NULL ++b43_write_initvals_43028 b43_write_initvals 0 43028 NULL ++ab3100_otp_paf_show_43029 ab3100_otp_paf_show 0 43029 NULL ++check_subscription_permission_43032 check_subscription_permission 0 43032 NULL ++wep_default_key_count_read_43035 wep_default_key_count_read 3-0 43035 NULL nohasharray ++jffs2_write_begin_43035 jffs2_write_begin 0 43035 &wep_default_key_count_read_43035 nohasharray ++store_lssw_43035 store_lssw 4-0 43035 &jffs2_write_begin_43035 ++max_queue_show_43036 max_queue_show 0 43036 NULL ++set_icon_43037 set_icon 0-3 43037 NULL ++cp2112_read_req_43041 cp2112_read_req 0 43041 NULL nohasharray ++goldfish_fb_set_par_43041 goldfish_fb_set_par 0 43041 &cp2112_read_req_43041 ++write_s64_43043 write_s64 0 43043 NULL ++show_port_name_43051 show_port_name 0 43051 NULL ++ssb_pcmcia_cfg_read_43056 ssb_pcmcia_cfg_read 0 43056 NULL ++fb_add_videomode_43057 fb_add_videomode 0 43057 NULL ++pcap_rtc_set_alarm_43058 pcap_rtc_set_alarm 0 43058 NULL nohasharray ++dfx_ctl_set_mac_address_43058 dfx_ctl_set_mac_address 0 43058 &pcap_rtc_set_alarm_43058 ++__bioset_create_43059 __bioset_create 1 43059 NULL nohasharray ++ocfs2_get_clusters_43059 ocfs2_get_clusters 0 43059 &__bioset_create_43059 ++t3_sge_alloc_qset_43061 t3_sge_alloc_qset 0 43061 NULL nohasharray ++store_enable_clka0_output_43061 store_enable_clka0_output 0-4 43061 &t3_sge_alloc_qset_43061 ++lme2510_i2c_xfer_43062 lme2510_i2c_xfer 0-3 43062 NULL ++cap_netlink_send_43063 cap_netlink_send 0 43063 NULL ++show_conn_param_ISCSI_PARAM_TCP_TIMESTAMP_STAT_43069 show_conn_param_ISCSI_PARAM_TCP_TIMESTAMP_STAT 0 43069 NULL ++nouveau_gpuobj_create__43072 nouveau_gpuobj_create_ 9 43072 NULL ++get_attention_status_43073 get_attention_status 0 43073 NULL ++sst_drop_stream_43076 sst_drop_stream 0 43076 NULL nohasharray ++target_stat_scsi_transport_show_attr_device_43076 target_stat_scsi_transport_show_attr_device 0 43076 &sst_drop_stream_43076 ++show_fc_host_active_fc4s_43078 show_fc_host_active_fc4s 0 43078 NULL ++get_slave_size_43081 get_slave_size 0 43081 NULL ++nfs_map_group_to_gid_43082 nfs_map_group_to_gid 3 43082 NULL ++set_lock_args_43085 set_lock_args 0 43085 NULL nohasharray ++deadline_write_expire_show_43085 deadline_write_expire_show 0 43085 &set_lock_args_43085 nohasharray ++ql_start_rx_ring_43085 ql_start_rx_ring 0 43085 &deadline_write_expire_show_43085 ++_xfer_secondary_pool_43089 _xfer_secondary_pool 2 43089 NULL nohasharray ++tomoyo_read_43089 tomoyo_read 0-3 43089 &_xfer_secondary_pool_43089 ++regmap_spmi_base_write_43095 regmap_spmi_base_write 0 43095 NULL nohasharray ++mt2131_writeregs_43095 mt2131_writeregs 0 43095 ®map_spmi_base_write_43095 ++dev_set_promiscuity_43096 dev_set_promiscuity 0 43096 NULL ++store_srp_rport_fast_io_fail_tmo_43097 store_srp_rport_fast_io_fail_tmo 0-4 43097 NULL ++dump_skip_43098 dump_skip 2 43098 NULL ++mwifiex_cmd_11n_cfg_43102 mwifiex_cmd_11n_cfg 0 43102 NULL ++sysfs_create_file_ns_43103 sysfs_create_file_ns 0 43103 NULL ++stmmac_init_dma_engine_43104 stmmac_init_dma_engine 0 43104 NULL ++fuse_statfs_43106 fuse_statfs 0 43106 NULL ++ieee80211_if_fmt_drop_unencrypted_43107 ieee80211_if_fmt_drop_unencrypted 3 43107 NULL ++gfs2_journaled_truncate_43108 gfs2_journaled_truncate 0 43108 NULL ++svc_change_qos_43111 svc_change_qos 0 43111 NULL ++store_43112 store 0 43112 NULL ++ix2505v_write_43115 ix2505v_write 0 43115 NULL ++open_43117 open 0 43117 NULL ++calculate_node_totalpages_43118 calculate_node_totalpages 2-3 43118 NULL ++parport_ieee1284_write_compat_43125 parport_ieee1284_write_compat 0 43125 NULL ++show_rpm_min_43129 show_rpm_min 0 43129 NULL ++reserved_size_show_43130 reserved_size_show 0 43130 NULL nohasharray ++lock_page_killable_43130 lock_page_killable 0 43130 &reserved_size_show_43130 ++e1000_request_msix_43134 e1000_request_msix 0 43134 NULL ++dmfe_open_43139 dmfe_open 0 43139 NULL ++ab3100_otp_imeich_show_43143 ab3100_otp_imeich_show 0 43143 NULL ++read_file_dfs_43145 read_file_dfs 3-0 43145 NULL nohasharray ++i2c_hid_get_report_43145 i2c_hid_get_report 0 43145 &read_file_dfs_43145 ++relay_file_read_subbufs_43147 relay_file_read_subbufs 0 43147 NULL ++show_enabled_43152 show_enabled 0 43152 NULL ++qlcnic_sysfs_clear_esw_stats_43153 qlcnic_sysfs_clear_esw_stats 0-6-5 43153 NULL ++ipath_get_slave_info_43154 ipath_get_slave_info 0 43154 NULL ++f2fs_statfs_43158 f2fs_statfs 0 43158 NULL ++cfs_cpt_table_alloc_43159 cfs_cpt_table_alloc 1 43159 NULL ++usb_string_sub_43164 usb_string_sub 0 43164 NULL ++il_dbgfs_power_save_status_read_43165 il_dbgfs_power_save_status_read 3-0 43165 NULL ++s5k4aa_set_noise_43172 s5k4aa_set_noise 0 43172 NULL ++__iscsi_nacl_auth_store_userid_mutual_43181 __iscsi_nacl_auth_store_userid_mutual 0-3 43181 NULL ++ath6kl_set_assoc_req_ies_43185 ath6kl_set_assoc_req_ies 3 43185 NULL ++_read_43194 _read 0 43194 NULL ++ext4_xattr_ibody_get_43200 ext4_xattr_ibody_get 0 43200 NULL ++teiup_create_43201 teiup_create 3 43201 NULL ++uio_write_43202 uio_write 3-0 43202 NULL ++iso_callback_43208 iso_callback 3 43208 NULL ++ath10k_p2p_calc_noa_ie_len_43209 ath10k_p2p_calc_noa_ie_len 0 43209 NULL ++f2fs_acl_from_disk_43210 f2fs_acl_from_disk 2 43210 NULL ++isl29003_set_range_43211 isl29003_set_range 0 43211 NULL ++link_failure_count_show_43216 link_failure_count_show 0 43216 NULL nohasharray ++nes_show_flash_data_43216 nes_show_flash_data 0 43216 &link_failure_count_show_43216 ++gfs2_direct_IO_43220 gfs2_direct_IO 4-0 43220 NULL ++elf_core_extra_phdrs_43222 elf_core_extra_phdrs 0 43222 NULL nohasharray ++get_status_43222 get_status 0 43222 &elf_core_extra_phdrs_43222 nohasharray ++attr_store_43222 attr_store 0-3 43222 &get_status_43222 ++ivtv_xfer_43223 ivtv_xfer 0-3 43223 NULL ++sock_no_recvmsg_43228 sock_no_recvmsg 0-4 43228 NULL ++wdog_reboot_handler_43234 wdog_reboot_handler 0 43234 NULL ++show_fcoe_fcf_device_selected_43236 show_fcoe_fcf_device_selected 0 43236 NULL ++read_status_43238 read_status 0 43238 NULL ++batadv_tt_tvlv_unicast_handler_v1_43239 batadv_tt_tvlv_unicast_handler_v1 5 43239 NULL nohasharray ++pstr_show_43239 pstr_show 0 43239 &batadv_tt_tvlv_unicast_handler_v1_43239 nohasharray ++__logfs_write_buf_43239 __logfs_write_buf 0 43239 &pstr_show_43239 ++vmemmap_alloc_block_43245 vmemmap_alloc_block 1 43245 NULL ++ax88178_change_mtu_43248 ax88178_change_mtu 0 43248 NULL ++fixup_leb_43256 fixup_leb 3 43256 NULL ++hfsplus_setattr_43257 hfsplus_setattr 0 43257 NULL ++store_pwm_auto_spinup_min_43260 store_pwm_auto_spinup_min 0-4 43260 NULL ++store_wwan_43264 store_wwan 4-0 43264 NULL ++rocker_port_ctrl_vlan_bridge_43266 rocker_port_ctrl_vlan_bridge 0 43266 NULL ++ide_end_rq_43269 ide_end_rq 4 43269 NULL ++omfs_readpage_43270 omfs_readpage 0 43270 NULL ++mxl5007t_get_if_frequency_43271 mxl5007t_get_if_frequency 0 43271 NULL ++uvc_commit_video_43272 uvc_commit_video 0 43272 NULL ++do_journal_begin_r_43273 do_journal_begin_r 0 43273 NULL ++lpfc_oas_lun_status_show_43274 lpfc_oas_lun_status_show 0 43274 NULL ++evtchn_write_43278 evtchn_write 3-0 43278 NULL ++filemap_write_and_wait_range_43279 filemap_write_and_wait_range 0 43279 NULL nohasharray ++bitmap_parselist_user_43279 bitmap_parselist_user 0 43279 &filemap_write_and_wait_range_43279 ++ds1511_rtc_read_time_43280 ds1511_rtc_read_time 0 43280 NULL ++src_frames_43281 src_frames 0 43281 NULL nohasharray ++show_temp_crit_hyst_43281 show_temp_crit_hyst 0 43281 &src_frames_43281 ++adp8870_bl_l1_daylight_max_store_43287 adp8870_bl_l1_daylight_max_store 4-0 43287 NULL ++lookup_fast_43292 lookup_fast 0 43292 NULL ++show_pwm_auto_pwm_min_43293 show_pwm_auto_pwm_min 0 43293 NULL ++show_num_ports_43296 show_num_ports 0 43296 NULL ++mpage_alloc_43299 mpage_alloc 3 43299 NULL ++lm3533_read_43309 lm3533_read 0 43309 NULL ++fm10k_update_uc_addr_pf_43310 fm10k_update_uc_addr_pf 0 43310 NULL nohasharray ++store_cpumask_43310 store_cpumask 0-4 43310 &fm10k_update_uc_addr_pf_43310 ++em28xx_audio_analog_set_43312 em28xx_audio_analog_set 0 43312 NULL nohasharray ++store_ledd_43312 store_ledd 4-0 43312 &em28xx_audio_analog_set_43312 ++acpi_ex_convert_to_buffer_43314 acpi_ex_convert_to_buffer 0 43314 NULL ++try_charge_43315 try_charge 0 43315 NULL ++padlock_sha1_init_nano_43316 padlock_sha1_init_nano 0 43316 NULL ++temp1_max_alarm_show_43317 temp1_max_alarm_show 0 43317 NULL nohasharray ++nilfs_direct_lookup_contig_43317 nilfs_direct_lookup_contig 0 43317 &temp1_max_alarm_show_43317 nohasharray ++sctp_auth_ep_add_chunkid_43317 sctp_auth_ep_add_chunkid 0 43317 &nilfs_direct_lookup_contig_43317 nohasharray ++iwl_mvm_mac_start_43317 iwl_mvm_mac_start 0 43317 &sctp_auth_ep_add_chunkid_43317 ++target_core_dev_wwn_store_attr_vpd_unit_serial_43322 target_core_dev_wwn_store_attr_vpd_unit_serial 0-3 43322 NULL ++sja1000_open_43326 sja1000_open 0 43326 NULL ++show_sas_phy_initiator_port_protocols_43327 show_sas_phy_initiator_port_protocols 0 43327 NULL ++__ext4_get_inode_loc_43332 __ext4_get_inode_loc 0 43332 NULL nohasharray ++thermal_set_mode_43332 thermal_set_mode 0 43332 &__ext4_get_inode_loc_43332 ++__uncore_event5_show_43333 __uncore_event5_show 0 43333 NULL ++patch_stac9200_43348 patch_stac9200 0 43348 NULL ++drm_dp_mst_wait_tx_reply_43349 drm_dp_mst_wait_tx_reply 0 43349 NULL ++xfs_log_regrant_43350 xfs_log_regrant 0 43350 NULL ++set_peripheral_43353 set_peripheral 0 43353 NULL ++gart_free_coherent_43362 gart_free_coherent 2-4 43362 NULL nohasharray ++xen_swiotlb_sync_single_for_device_43362 xen_swiotlb_sync_single_for_device 2 43362 &gart_free_coherent_43362 ++may_create_key_43363 may_create_key 0 43363 NULL ++pm_print_times_show_43364 pm_print_times_show 0 43364 NULL ++pn_init_43370 pn_init 0 43370 NULL ++proc_sys_permission_43371 proc_sys_permission 0 43371 NULL nohasharray ++bnad_tx_msix_register_43371 bnad_tx_msix_register 0 43371 &proc_sys_permission_43371 ++wl1271_acx_group_address_tbl_43372 wl1271_acx_group_address_tbl 0 43372 NULL ++mmc_sd_init_card_43374 mmc_sd_init_card 0 43374 NULL ++gfs2_rgrp_bh_get_43375 gfs2_rgrp_bh_get 0 43375 NULL nohasharray ++ath10k_htt_tx_alloc_43375 ath10k_htt_tx_alloc 0 43375 &gfs2_rgrp_bh_get_43375 ++lx_framebuffer_size_43377 lx_framebuffer_size 0 43377 NULL ++show_fcstat_fc_non_bls_resp_43383 show_fcstat_fc_non_bls_resp 0 43383 NULL ++svc_pool_map_get_43386 svc_pool_map_get 0 43386 NULL ++tpm_inf_send_43388 tpm_inf_send 0-3 43388 NULL ++scsiback_make_nexus_43391 scsiback_make_nexus 0 43391 NULL ++xfs_btree_new_iroot_43392 xfs_btree_new_iroot 0 43392 NULL ++fsp_attr_show_getreg_43397 fsp_attr_show_getreg 0 43397 NULL nohasharray ++tcm_qla2xxx_tpg_attrib_show_prod_mode_write_protect_43397 tcm_qla2xxx_tpg_attrib_show_prod_mode_write_protect 0 43397 &fsp_attr_show_getreg_43397 ++iscsi_sw_tcp_conn_get_param_43398 iscsi_sw_tcp_conn_get_param 0 43398 NULL ++o2hb_read_block_input_43402 o2hb_read_block_input 0 43402 NULL ++wl1251_acx_data_path_params_43404 wl1251_acx_data_path_params 0 43404 NULL ++xenfb_write_43412 xenfb_write 3 43412 NULL ++show_linear_43414 show_linear 0 43414 NULL nohasharray ++serio_set_bind_mode_43414 serio_set_bind_mode 0-4 43414 &show_linear_43414 ++romfs_statfs_43416 romfs_statfs 0 43416 NULL nohasharray ++load_firmware_43416 load_firmware 0 43416 &romfs_statfs_43416 ++ext4_xattr_check_names_43422 ext4_xattr_check_names 0 43422 NULL nohasharray ++offset_store_43422 offset_store 0-3 43422 &ext4_xattr_check_names_43422 nohasharray ++nfs_lookup_revalidate_43422 nfs_lookup_revalidate 0 43422 &offset_store_43422 ++__alloc_bootmem_low_43423 __alloc_bootmem_low 1 43423 NULL nohasharray ++sendctrl_hook_43423 sendctrl_hook 0 43423 &__alloc_bootmem_low_43423 nohasharray ++gdm_wimax_netif_rx_43423 gdm_wimax_netif_rx 3 43423 &sendctrl_hook_43423 ++acpi_ds_create_method_mutex_43430 acpi_ds_create_method_mutex 0 43430 NULL ++isku_sysfs_write_keys_capslock_43432 isku_sysfs_write_keys_capslock 6-0-5 43432 NULL ++usb_alloc_urb_43436 usb_alloc_urb 1 43436 NULL ++w1_master_attribute_show_name_43439 w1_master_attribute_show_name 0 43439 NULL ++store_received_ref_clk3b_43440 store_received_ref_clk3b 0-4 43440 NULL nohasharray ++ath6kl_wmi_roam_tbl_event_rx_43440 ath6kl_wmi_roam_tbl_event_rx 3 43440 &store_received_ref_clk3b_43440 ++send_pre_block_43442 send_pre_block 0 43442 NULL ++usemap_size_43443 usemap_size 0-1-2 43443 NULL nohasharray ++usb_string_43443 usb_string 0 43443 &usemap_size_43443 ++dm_attr_name_show_43444 dm_attr_name_show 0 43444 NULL ++nilfs_palloc_get_bitmap_block_43448 nilfs_palloc_get_bitmap_block 0 43448 NULL ++decode_ntlmssp_challenge_43450 decode_ntlmssp_challenge 0 43450 NULL ++store_temp_beep_43452 store_temp_beep 0-4 43452 NULL ++fs_path_prepare_for_add_43453 fs_path_prepare_for_add 2 43453 NULL ++wil_change_mtu_43455 wil_change_mtu 0 43455 NULL ++lirc_dev_fop_read_43459 lirc_dev_fop_read 0-3 43459 NULL ++nvme_trans_device_id_page_43466 nvme_trans_device_id_page 4 43466 NULL ++target_core_dev_pr_show_attr_res_aptpl_active_43467 target_core_dev_pr_show_attr_res_aptpl_active 0 43467 NULL ++il3945_send_rxon_assoc_43469 il3945_send_rxon_assoc 0 43469 NULL ++xen_alloc_pte_43470 xen_alloc_pte 2 43470 NULL ++btrfs_freeze_43471 btrfs_freeze 0 43471 NULL ++write_43473 write 0 43473 NULL ++hook_43475 hook 0 43475 NULL ++current_uuid_store_43478 current_uuid_store 0-4 43478 NULL ++dtv5100_i2c_xfer_43479 dtv5100_i2c_xfer 0-3 43479 NULL ++calculate_discard_block_size_43480 calculate_discard_block_size 0-1 43480 NULL nohasharray ++alloc_new_reservation_43480 alloc_new_reservation 0-4 43480 &calculate_discard_block_size_43480 ++vga_get_43488 vga_get 0 43488 NULL ++vmemdup_43489 vmemdup 2 43489 NULL ++f_rndis_opts_attr_store_43493 f_rndis_opts_attr_store 0-4 43493 NULL ++tx_tx_data_prepared_read_43497 tx_tx_data_prepared_read 3-0 43497 NULL nohasharray ++f2fs_freeze_43497 f2fs_freeze 0 43497 &tx_tx_data_prepared_read_43497 ++show_lid_43498 show_lid 0 43498 NULL ++init_43500 init 0 43500 NULL nohasharray ++wusb_trust_timeout_store_43500 wusb_trust_timeout_store 0-4 43500 &init_43500 ++spmi_read_cmd_43502 spmi_read_cmd 0 43502 NULL ++ieee80211_if_fmt_dot11MeshHWMPnetDiameterTraversalTime_43505 ieee80211_if_fmt_dot11MeshHWMPnetDiameterTraversalTime 3 43505 NULL ++__unmap_and_move_43513 __unmap_and_move 0 43513 NULL ++i8k_get_temp_43516 i8k_get_temp 0 43516 NULL ++lpfc_fcp_io_channel_show_43518 lpfc_fcp_io_channel_show 0 43518 NULL nohasharray ++et131x_init_recv_43518 et131x_init_recv 0 43518 &lpfc_fcp_io_channel_show_43518 ++alloc_instance_buffer_43530 alloc_instance_buffer 0 43530 NULL nohasharray ++ll_direct_IO_26_43530 ll_direct_IO_26 4 43530 &alloc_instance_buffer_43530 ++dvb_ca_en50221_io_write_43533 dvb_ca_en50221_io_write 3-0 43533 NULL nohasharray ++core_scsi3_alloc_aptpl_registration_43533 core_scsi3_alloc_aptpl_registration 0 43533 &dvb_ca_en50221_io_write_43533 ++read_events_43534 read_events 3 43534 NULL ++cachefiles_daemon_write_43535 cachefiles_daemon_write 3-0 43535 NULL ++xfs_qm_vop_chown_reserve_43536 xfs_qm_vop_chown_reserve 0 43536 NULL ++store_43537 store 0-3 43537 NULL ++store_43539 store 0 43539 NULL ++ufs_alloccg_block_43540 ufs_alloccg_block 3-0 43540 NULL nohasharray ++tx_frag_failed_read_43540 tx_frag_failed_read 3-0 43540 &ufs_alloccg_block_43540 ++mv88e6352_get_temp_alarm_43545 mv88e6352_get_temp_alarm 0 43545 NULL ++broadsheet_spiflash_read_byte_43547 broadsheet_spiflash_read_byte 0 43547 NULL ++request_resource_43548 request_resource 0 43548 NULL ++store_43549 store 0-4 43549 NULL ++sys_get_trip_temp_43550 sys_get_trip_temp 0 43550 NULL ++pmdown_time_show_43552 pmdown_time_show 0 43552 NULL ++amd756_access_43553 amd756_access 0 43553 NULL ++lpfc_aer_cleanup_state_43554 lpfc_aer_cleanup_state 0-4 43554 NULL ++ath_rx_init_43564 ath_rx_init 2 43564 NULL ++o2nm_node_ipv4_address_write_43567 o2nm_node_ipv4_address_write 0-3 43567 NULL ++bfad_im_model_desc_show_43568 bfad_im_model_desc_show 0 43568 NULL nohasharray ++_fc_frame_alloc_43568 _fc_frame_alloc 1 43568 &bfad_im_model_desc_show_43568 ++cx231xx_i2c_recv_bytes_43571 cx231xx_i2c_recv_bytes 0 43571 NULL ++rpc_malloc_43573 rpc_malloc 2 43573 NULL ++ecryptfs_read_update_atime_43579 ecryptfs_read_update_atime 0 43579 NULL ++passive_store_43589 passive_store 0-4 43589 NULL ++show_pwm_43593 show_pwm 0 43593 NULL nohasharray ++__uncore_filter_nid2_show_43593 __uncore_filter_nid2_show 0 43593 &show_pwm_43593 ++ath9k_htc_add_interface_43602 ath9k_htc_add_interface 0 43602 NULL ++smack_inode_listsecurity_43603 smack_inode_listsecurity 0 43603 NULL ++lpfc_idiag_drbacc_read_reg_43606 lpfc_idiag_drbacc_read_reg 0-3 43606 NULL ++proc_read_43614 proc_read 3-0 43614 NULL ++xfs_map_blocks_43615 xfs_map_blocks 0 43615 NULL ++p54_set_edcf_43622 p54_set_edcf 0 43622 NULL nohasharray ++set_polarity_43622 set_polarity 0 43622 &p54_set_edcf_43622 ++alloc_thread_groups_43625 alloc_thread_groups 2-0 43625 NULL ++elan_smbus_get_baseline_data_43629 elan_smbus_get_baseline_data 0 43629 NULL ++cm4000_suspend_43630 cm4000_suspend 0 43630 NULL ++dlm_nodir_store_43636 dlm_nodir_store 0-3 43636 NULL ++padlock_sha_export_43640 padlock_sha_export 0 43640 NULL nohasharray ++ia_cbr_setup_43640 ia_cbr_setup 0 43640 &padlock_sha_export_43640 ++tps6105x_get_43643 tps6105x_get 0 43643 NULL nohasharray ++setup_sdma_43643 setup_sdma 0 43643 &tps6105x_get_43643 ++si4713_wait_stc_43644 si4713_wait_stc 0 43644 NULL ++generic_get_free_region_43646 generic_get_free_region 0-3 43646 NULL ++kmalloc_large_node_hook_43651 kmalloc_large_node_hook 2 43651 NULL ++__orinoco_hw_set_bitrate_43655 __orinoco_hw_set_bitrate 0 43655 NULL ++random_write_43656 random_write 3-0 43656 NULL ++acpi_ds_exec_begin_control_op_43657 acpi_ds_exec_begin_control_op 0 43657 NULL ++ext4_acl_count_43659 ext4_acl_count 0-1 43659 NULL nohasharray ++tps65217_set_bits_43659 tps65217_set_bits 0 43659 &ext4_acl_count_43659 ++show_fc_host_manufacturer_43662 show_fc_host_manufacturer 0 43662 NULL ++write_file_tx99_power_43670 write_file_tx99_power 3-0 43670 NULL ++snd_seq_pool_init_43673 snd_seq_pool_init 0 43673 NULL ++start_ms350_cam_43679 start_ms350_cam 0 43679 NULL nohasharray ++dmam_declare_coherent_memory_43679 dmam_declare_coherent_memory 2-4 43679 &start_ms350_cam_43679 ++acpi_ut_strtoul64_43681 acpi_ut_strtoul64 0 43681 NULL ++_drbd_no_send_page_43682 _drbd_no_send_page 4 43682 NULL ++calgary_map_page_43686 calgary_map_page 4-0-3 43686 NULL nohasharray ++cluster_set_43686 cluster_set 0-6 43686 &calgary_map_page_43686 ++port_attr_store_43688 port_attr_store 0-4 43688 NULL nohasharray ++rbd_header_from_disk_43688 rbd_header_from_disk 0 43688 &port_attr_store_43688 ++start_43697 start 0 43697 NULL ++show_43699 show 0 43699 NULL ++hidp_send_ctrl_message_43702 hidp_send_ctrl_message 0-4 43702 NULL nohasharray ++mwifiex_cmd_cfg_data_43702 mwifiex_cmd_cfg_data 0 43702 &hidp_send_ctrl_message_43702 ++ncp_modify_file_or_subdir_dos_info_43705 ncp_modify_file_or_subdir_dos_info 0 43705 NULL ++set_rdac2_43707 set_rdac2 4-0 43707 NULL ++cpuidle_switch_governor_43709 cpuidle_switch_governor 0 43709 NULL ++acerhdf_set_cur_state_43710 acerhdf_set_cur_state 0 43710 NULL ++nvkm_connector_create__43711 nvkm_connector_create_ 6 43711 NULL nohasharray ++ext3_xattr_trusted_set_43711 ext3_xattr_trusted_set 0 43711 &nvkm_connector_create__43711 ++memory_subsys_offline_43716 memory_subsys_offline 0 43716 NULL ++show_hyst_43718 show_hyst 0 43718 NULL ++cpia2_do_command_43719 cpia2_do_command 0 43719 NULL nohasharray ++adis_read_reg_43719 adis_read_reg 0 43719 &cpia2_do_command_43719 ++xfs_bmap_del_extent_43720 xfs_bmap_del_extent 0 43720 NULL ++module_flags_taint_43722 module_flags_taint 0 43722 NULL ++wait_for_completion_interruptible_43723 wait_for_completion_interruptible 0 43723 NULL ++fuse_send_read_43725 fuse_send_read 4 43725 NULL ++imm_write_info_43727 imm_write_info 0-3 43727 NULL ++pm8001_chip_set_nvmd_req_43728 pm8001_chip_set_nvmd_req 0 43728 NULL ++drbd_md_first_sector_43729 drbd_md_first_sector 0 43729 NULL ++lbs_dev_open_43731 lbs_dev_open 0 43731 NULL nohasharray ++pcistub_quirk_add_43731 pcistub_quirk_add 0-3 43731 &lbs_dev_open_43731 ++snd_rme32_playback_copy_43732 snd_rme32_playback_copy 5 43732 NULL nohasharray ++fuse_notify_delete_43732 fuse_notify_delete 0 43732 &snd_rme32_playback_copy_43732 ++__alloc_alien_cache_43734 __alloc_alien_cache 2 43734 NULL nohasharray ++brcmf_sdio_download_firmware_43734 brcmf_sdio_download_firmware 4 43734 &__alloc_alien_cache_43734 ++fuse_conn_congestion_threshold_write_43736 fuse_conn_congestion_threshold_write 3-0 43736 NULL ++interf_grp_sub_compatible_id_show_43740 interf_grp_sub_compatible_id_show 0 43740 NULL ++cifs_writepages_43741 cifs_writepages 0 43741 NULL ++bql_set_limit_max_43745 bql_set_limit_max 4-0 43745 NULL ++__bm_find_next_43748 __bm_find_next 2 43748 NULL ++gigaset_initcs_43753 gigaset_initcs 2 43753 NULL ++sctp_setsockopt_active_key_43755 sctp_setsockopt_active_key 3-0 43755 NULL ++panic_happened_43756 panic_happened 0 43756 NULL ++dev_size_mb_show_43758 dev_size_mb_show 0 43758 NULL ++lola_set_stream_config_43764 lola_set_stream_config 0 43764 NULL ++b43legacy_pio_init_43765 b43legacy_pio_init 0 43765 NULL nohasharray ++wusbhc_pal_register_43765 wusbhc_pal_register 0 43765 &b43legacy_pio_init_43765 ++nilfs_btree_propagate_gc_43767 nilfs_btree_propagate_gc 0 43767 NULL ++vid_cap_buf_prepare_43770 vid_cap_buf_prepare 0 43770 NULL ++l2cap_validate_bredr_psm_43772 l2cap_validate_bredr_psm 0 43772 NULL ++__lbs_mesh_config_send_43775 __lbs_mesh_config_send 0 43775 NULL nohasharray ++dimmdev_label_store_43775 dimmdev_label_store 0-4 43775 &__lbs_mesh_config_send_43775 ++i2c_smbus_write_word_data_43778 i2c_smbus_write_word_data 0 43778 NULL ++bnx2x_setup_tx_only_43781 bnx2x_setup_tx_only 0 43781 NULL ++tcp_v4_connect_43786 tcp_v4_connect 0 43786 NULL ++ocfs2_xattr_get_value_outside_43787 ocfs2_xattr_get_value_outside 0 43787 NULL nohasharray ++pci_user_write_config_byte_43787 pci_user_write_config_byte 0 43787 &ocfs2_xattr_get_value_outside_43787 ++failed_reads_show_43791 failed_reads_show 0 43791 NULL ++xfs_trans_reserve_quota_bydquots_43797 xfs_trans_reserve_quota_bydquots 0 43797 NULL ++__uncore_filter_band1_show_43798 __uncore_filter_band1_show 0 43798 NULL ++em28xx_write_regs_43804 em28xx_write_regs 0 43804 NULL nohasharray ++integrity_kernel_read_43804 integrity_kernel_read 4 43804 &em28xx_write_regs_43804 ++suspend_lo_store_43805 suspend_lo_store 0-3 43805 NULL ++btrfs_copy_from_user_43806 btrfs_copy_from_user 1-0-3 43806 NULL ++il3945_read_ucode_43807 il3945_read_ucode 0 43807 NULL ++hci_send_cmd_43810 hci_send_cmd 3 43810 NULL ++ps_set_cur_charge_cntl_limit_43812 ps_set_cur_charge_cntl_limit 0 43812 NULL ++show_fcoe_fcf_device_switch_name_43813 show_fcoe_fcf_device_switch_name 0 43813 NULL ++ext4_read_block_bitmap_43814 ext4_read_block_bitmap 2 43814 NULL ++alloc_irq_from_domain_43815 alloc_irq_from_domain 0-3-2 43815 NULL nohasharray ++div64_u64_safe_43815 div64_u64_safe 0 43815 &alloc_irq_from_domain_43815 ++read_pwr_int_values_43824 read_pwr_int_values 0 43824 NULL ++ieee80211_if_fmt_element_ttl_43825 ieee80211_if_fmt_element_ttl 3 43825 NULL ++get_rsb_struct_43829 get_rsb_struct 0 43829 NULL nohasharray ++ieee80211_alloc_hw_43829 ieee80211_alloc_hw 1 43829 &get_rsb_struct_43829 ++ovl_setxattr_43838 ovl_setxattr 0 43838 NULL ++ltc4151_show_value_43839 ltc4151_show_value 0 43839 NULL ++max_channels_43840 max_channels 0 43840 NULL ++snd_seq_fifo_event_in_43842 snd_seq_fifo_event_in 0 43842 NULL nohasharray ++p54_download_eeprom_43842 p54_download_eeprom 4 43842 &snd_seq_fifo_event_in_43842 ++read_flush_43851 read_flush 3-0 43851 NULL ++bdx_hw_start_43856 bdx_hw_start 0 43856 NULL nohasharray ++sdev_store_evt_media_change_43856 sdev_store_evt_media_change 0-4 43856 &bdx_hw_start_43856 ++resume_43864 resume 0 43864 NULL nohasharray ++atl1c_change_mtu_43864 atl1c_change_mtu 0 43864 &resume_43864 ++port_number_show_43866 port_number_show 0 43866 NULL ++lbtf_setup_firmware_43867 lbtf_setup_firmware 0 43867 NULL ++beiscsi_free_session_disp_43868 beiscsi_free_session_disp 0 43868 NULL ++ocfs2_block_group_find_clear_bits_43874 ocfs2_block_group_find_clear_bits 4 43874 NULL ++pm860x_bulk_write_43875 pm860x_bulk_write 2-3 43875 NULL ++rtl8150_set_mac_address_43881 rtl8150_set_mac_address 0 43881 NULL ++nfc_hci_execute_cmd_43882 nfc_hci_execute_cmd 5 43882 NULL ++ib_modify_device_43883 ib_modify_device 0 43883 NULL ++pn_socket_listen_43885 pn_socket_listen 0 43885 NULL ++hpfs_setattr_43889 hpfs_setattr 0 43889 NULL ++tps6105x_mask_and_set_43891 tps6105x_mask_and_set 0 43891 NULL ++cx231xx_s_audio_sampling_freq_43893 cx231xx_s_audio_sampling_freq 0 43893 NULL ++write_43894 write 0-3 43894 NULL ++ec_dbgfs_cmd_write_43895 ec_dbgfs_cmd_write 3 43895 NULL ++gadget_strings_attr_store_43898 gadget_strings_attr_store 0-4 43898 NULL ++ubifs_decompress_43909 ubifs_decompress 0 43909 NULL nohasharray ++xillybus_myflush_43909 xillybus_myflush 0 43909 &ubifs_decompress_43909 ++v9fs_direct_IO_43911 v9fs_direct_IO 0 43911 NULL ++snd_ymfpci_playback_trigger_43914 snd_ymfpci_playback_trigger 0 43914 NULL ++set_temp8_43915 set_temp8 0-4 43915 NULL ++wl1271_acx_conn_monit_params_43916 wl1271_acx_conn_monit_params 0 43916 NULL nohasharray ++prism2_sta_send_mgmt_43916 prism2_sta_send_mgmt 5 43916 &wl1271_acx_conn_monit_params_43916 ++usb_autoresume_device_43919 usb_autoresume_device 0 43919 NULL ++udf_file_write_iter_43922 udf_file_write_iter 0 43922 NULL nohasharray ++velocity_netdev_event_43922 velocity_netdev_event 0 43922 &udf_file_write_iter_43922 ++rd_set_configfs_dev_params_43923 rd_set_configfs_dev_params 0-3 43923 NULL ++ov7670_s_contrast_43924 ov7670_s_contrast 0 43924 NULL ++wlcore_allocate_hw_queue_base_43928 wlcore_allocate_hw_queue_base 0 43928 NULL ++tsl2550_show_lux1_input_43931 tsl2550_show_lux1_input 0 43931 NULL ++snd_cs5535audio_capture_prepare_43934 snd_cs5535audio_capture_prepare 0 43934 NULL nohasharray ++store_engine_mode_43934 store_engine_mode 0-4 43934 &snd_cs5535audio_capture_prepare_43934 ++st_press_buffer_postenable_43943 st_press_buffer_postenable 0 43943 NULL ++xen_register_gsi_43946 xen_register_gsi 2-1 43946 NULL ++stats_dot11RTSFailureCount_read_43948 stats_dot11RTSFailureCount_read 3-0 43948 NULL ++multicast_startup_query_count_show_43949 multicast_startup_query_count_show 0 43949 NULL ++vmci_transport_notify_send_post_enqueue_43957 vmci_transport_notify_send_post_enqueue 0 43957 NULL ++xfs_trans_dqresv_43960 xfs_trans_dqresv 0 43960 NULL ++bma180_show_filter_freq_avail_43961 bma180_show_filter_freq_avail 0 43961 NULL ++show_unit_43962 show_unit 0 43962 NULL ++emc6w201_write16_43963 emc6w201_write16 0 43963 NULL ++yellowfin_open_43965 yellowfin_open 0 43965 NULL ++cache_request_43968 cache_request 0 43968 NULL nohasharray ++lm3642_strobe_pin_store_43968 lm3642_strobe_pin_store 0-4 43968 &cache_request_43968 ++iflink_show_43970 iflink_show 0 43970 NULL ++cont_write_begin_43971 cont_write_begin 0-3 43971 NULL ++rt2400pci_set_device_state_43974 rt2400pci_set_device_state 0 43974 NULL ++set_auto_temp_43976 set_auto_temp 0-4 43976 NULL ++__get_required_blob_size_43980 __get_required_blob_size 0-3-2 43980 NULL ++__clkdev_alloc_43990 __clkdev_alloc 1 43990 NULL ++netdev_init_43991 netdev_init 0 43991 NULL ++kvm_read_guest_virt_43992 kvm_read_guest_virt 4-2 43992 NULL nohasharray ++scsi_command_size_43992 scsi_command_size 0 43992 &kvm_read_guest_virt_43992 nohasharray ++bcm_recvmsg_43992 bcm_recvmsg 0-4 43992 &scsi_command_size_43992 nohasharray ++batadv_softif_init_late_43992 batadv_softif_init_late 0 43992 &bcm_recvmsg_43992 ++ulist_add_43994 ulist_add 0 43994 NULL ++_rtl92d_fw_init_44000 _rtl92d_fw_init 0 44000 NULL ++gpio_trig_brightness_store_44001 gpio_trig_brightness_store 0-4 44001 NULL ++emit_flags_44006 emit_flags 3-4 44006 NULL ++write_flush_procfs_44011 write_flush_procfs 3-0 44011 NULL nohasharray ++mem_cgroup_move_charge_write_44011 mem_cgroup_move_charge_write 0 44011 &write_flush_procfs_44011 ++bd2802_store_reg0x03_44013 bd2802_store_reg0x03 0-4 44013 NULL ++raid_show_resync_44017 raid_show_resync 0 44017 NULL ++apds990x_rate_avail_44025 apds990x_rate_avail 0 44025 NULL ++vxge_ethtool_get_regs_len_44026 vxge_ethtool_get_regs_len 0 44026 NULL nohasharray ++ds1374_wdt_notify_sys_44026 ds1374_wdt_notify_sys 0 44026 &vxge_ethtool_get_regs_len_44026 nohasharray ++store_fcoe_fcf_dev_loss_tmo_44026 store_fcoe_fcf_dev_loss_tmo 0-4 44026 &ds1374_wdt_notify_sys_44026 ++address_mask_show_44028 address_mask_show 0 44028 NULL ++oxygen_trigger_44030 oxygen_trigger 0 44030 NULL ++ax25_getname_44035 ax25_getname 0 44035 NULL nohasharray ++pipe_write_44035 pipe_write 0 44035 &ax25_getname_44035 ++hdmi_s_stream_44039 hdmi_s_stream 0 44039 NULL ++zd_usb_init_hw_44041 zd_usb_init_hw 0 44041 NULL ++btrfs_account_dev_extents_size_44045 btrfs_account_dev_extents_size 0 44045 NULL ++kempld_i2c_process_44047 kempld_i2c_process 0 44047 NULL ++set_pwm_at_crit_44049 set_pwm_at_crit 0-4 44049 NULL ++snd_fw_transaction_44050 snd_fw_transaction 0 44050 NULL ++show_44058 show 0 44058 NULL ++sprint_frac_44059 sprint_frac 0 44059 NULL ++bch_cache_set_store_44062 bch_cache_set_store 0-4 44062 NULL ++b43_aphy_op_init_44065 b43_aphy_op_init 0 44065 NULL ++wmi_call_44066 wmi_call 0 44066 NULL ++vx2_inb_44069 vx2_inb 0 44069 NULL ++drbd_recv_short_44071 drbd_recv_short 3-0 44071 NULL ++socket_sockcreate_sid_44074 socket_sockcreate_sid 0 44074 NULL ++il3945_show_filter_flags_44077 il3945_show_filter_flags 0 44077 NULL ++ath9k_def_dump_modal_eeprom_44078 ath9k_def_dump_modal_eeprom 0-2-3 44078 NULL nohasharray ++mwifiex_cmd_pcie_host_spec_44078 mwifiex_cmd_pcie_host_spec 0 44078 &ath9k_def_dump_modal_eeprom_44078 ++SYSC_add_key_44079 SYSC_add_key 4 44079 NULL ++vmci_transport_notify_recv_pre_block_44080 vmci_transport_notify_recv_pre_block 0 44080 NULL ++btrfs_prev_leaf_44083 btrfs_prev_leaf 0 44083 NULL ++target_stat_scsi_auth_intr_show_attr_port_44089 target_stat_scsi_auth_intr_show_attr_port 0 44089 NULL ++x25_listen_44090 x25_listen 0 44090 NULL ++nfs_invalidate_mapping_44091 nfs_invalidate_mapping 0 44091 NULL nohasharray ++iscsi_tpg_param_show_FirstBurstLength_44091 iscsi_tpg_param_show_FirstBurstLength 0 44091 &nfs_invalidate_mapping_44091 ++ath10k_hif_tx_sg_44092 ath10k_hif_tx_sg 0 44092 NULL ++pci_msix_vec_count_44093 pci_msix_vec_count 0 44093 NULL ++elantech_set_int_attr_44096 elantech_set_int_attr 0-4 44096 NULL ++bql_show_hold_time_44100 bql_show_hold_time 0 44100 NULL ++xlog_recover_add_to_cont_trans_44102 xlog_recover_add_to_cont_trans 4 44102 NULL ++nouveau_hwmon_set_critical_temp_hyst_44103 nouveau_hwmon_set_critical_temp_hyst 0-4 44103 NULL ++ipath_assign_port_44104 ipath_assign_port 0 44104 NULL ++snd_trident_playback_prepare_44105 snd_trident_playback_prepare 0 44105 NULL ++zl10036_set_bandwidth_44107 zl10036_set_bandwidth 0 44107 NULL nohasharray ++show_fan_pulses_44107 show_fan_pulses 0 44107 &zl10036_set_bandwidth_44107 ++raid_level_show_44108 raid_level_show 0 44108 NULL ++add_update_code_44109 add_update_code 1 44109 NULL ++skb_frag_dma_map_44112 skb_frag_dma_map 0-3 44112 NULL ++check_idq_44117 check_idq 0 44117 NULL ++do_readpage_44120 do_readpage 0 44120 NULL ++file_remove_suid_44122 file_remove_suid 0 44122 NULL nohasharray ++tracing_set_trace_read_44122 tracing_set_trace_read 3 44122 &file_remove_suid_44122 ++SyS_process_vm_writev_44129 SyS_process_vm_writev 3-5 44129 NULL ++em28xx_read_reg_req_44130 em28xx_read_reg_req 0 44130 NULL ++do_sock_read_44132 do_sock_read 0 44132 NULL ++rndis_opts_dev_addr_show_44133 rndis_opts_dev_addr_show 0 44133 NULL ++lpfc_soft_wwpn_store_44135 lpfc_soft_wwpn_store 0-4 44135 NULL ++dev_uc_del_44137 dev_uc_del 0 44137 NULL ++capture_pcm_trigger_44138 capture_pcm_trigger 0 44138 NULL ++tracing_resize_saved_cmdlines_44140 tracing_resize_saved_cmdlines 1 44140 NULL ++ttm_get_pages_44142 ttm_get_pages 2 44142 NULL nohasharray ++setprocattr_44142 setprocattr 0-4 44142 &ttm_get_pages_44142 ++mcp4725_store_eeprom_44143 mcp4725_store_eeprom 0-4 44143 NULL ++direct_access_44144 direct_access 0 44144 NULL ++queue_attr_show_44146 queue_attr_show 0 44146 NULL ++s3c_hsotg_udc_start_44148 s3c_hsotg_udc_start 0 44148 NULL ++create_strip_zones_44150 create_strip_zones 0 44150 NULL ++vv6410_set_vflip_44154 vv6410_set_vflip 0 44154 NULL ++nlmsg_multicast_44156 nlmsg_multicast 0 44156 NULL ++coda_permission_44158 coda_permission 0 44158 NULL ++summary_show_44161 summary_show 0 44161 NULL nohasharray ++part_discard_alignment_show_44161 part_discard_alignment_show 0 44161 &summary_show_44161 ++snd_emu10k1x_pcm_trigger_44162 snd_emu10k1x_pcm_trigger 0 44162 NULL ++da9052_group_read_44164 da9052_group_read 0 44164 NULL ++sm501fb_debug_show_crt_44169 sm501fb_debug_show_crt 0 44169 NULL ++atl1_up_44170 atl1_up 0 44170 NULL ++ocfs2_xattr_bucket_find_44174 ocfs2_xattr_bucket_find 0 44174 NULL ++SYSC_set_mempolicy_44176 SYSC_set_mempolicy 3 44176 NULL ++target_stat_scsi_att_intr_port_show_attr_indx_44178 target_stat_scsi_att_intr_port_show_attr_indx 0 44178 NULL ++i8k_hwmon_show_fan_44179 i8k_hwmon_show_fan 0 44179 NULL ++tty_line_name_44181 tty_line_name 0 44181 NULL ++regulator_uA_show_44185 regulator_uA_show 0 44185 NULL ++ath10k_wmi_cmd_send_nowait_44190 ath10k_wmi_cmd_send_nowait 0 44190 NULL ++handle_eviocgbit_44193 handle_eviocgbit 3 44193 NULL ++nfs4_file_fsync_44195 nfs4_file_fsync 0 44195 NULL ++queue_int_on_old_endpoint_44196 queue_int_on_old_endpoint 0 44196 NULL nohasharray ++mptscsih_change_queue_depth_44196 mptscsih_change_queue_depth 0-2 44196 &queue_int_on_old_endpoint_44196 ++pvclock_gtod_notify_44200 pvclock_gtod_notify 0 44200 NULL ++iwl_init_alive_start_44203 iwl_init_alive_start 0 44203 NULL ++core_alua_show_access_type_44204 core_alua_show_access_type 0 44204 NULL ++roccat_common2_sysfs_read_info_44206 roccat_common2_sysfs_read_info 0-5-6 44206 NULL ++wl1271_acx_mem_map_44208 wl1271_acx_mem_map 0 44208 NULL ++__set_free_44211 __set_free 2 44211 NULL ++claim_ptd_buffers_44213 claim_ptd_buffers 3 44213 NULL nohasharray ++write_44213 write 0 44213 &claim_ptd_buffers_44213 ++qib_assign_ctxt_44217 qib_assign_ctxt 0 44217 NULL ++bttv_i2c_xfer_44219 bttv_i2c_xfer 0-3 44219 NULL ++btrfs_item_offset_nr_44220 btrfs_item_offset_nr 0 44220 NULL nohasharray ++generic_setxattr_44220 generic_setxattr 0 44220 &btrfs_item_offset_nr_44220 ++symbol_open_44224 symbol_open 0 44224 NULL nohasharray ++failslab_show_44224 failslab_show 0 44224 &symbol_open_44224 nohasharray ++device_user_unlock_44224 device_user_unlock 0 44224 &failslab_show_44224 ++srp_alloc_iu_44227 srp_alloc_iu 2 44227 NULL ++show_adc_44229 show_adc 0 44229 NULL ++aty_var_to_pll_8398_44232 aty_var_to_pll_8398 0 44232 NULL ++lpfc_fcp2_no_tgt_reset_store_44235 lpfc_fcp2_no_tgt_reset_store 0-4 44235 NULL ++iwl_send_bt_prio_tbl_44236 iwl_send_bt_prio_tbl 0 44236 NULL ++target_stat_scsi_lu_show_attr_state_bit_44237 target_stat_scsi_lu_show_attr_state_bit 0 44237 NULL nohasharray ++set_otp3en_44237 set_otp3en 4-0 44237 &target_stat_scsi_lu_show_attr_state_bit_44237 ++write_44238 write 0-4 44238 NULL nohasharray ++show_fc_host_model_description_44238 show_fc_host_model_description 0 44238 &write_44238 ++scsi_track_queue_full_44239 scsi_track_queue_full 2 44239 NULL ++snprint_line_44241 snprint_line 0 44241 NULL nohasharray ++lldd_execute_task_44241 lldd_execute_task 0 44241 &snprint_line_44241 ++calibrate_store_44244 calibrate_store 0-4 44244 NULL ++extra_show_44247 extra_show 0 44247 NULL nohasharray ++vp_find_vqs_44247 vp_find_vqs 2 44247 &extra_show_44247 ++enlarge_skb_44248 enlarge_skb 2 44248 NULL ++ecryptfs_init_lower_file_44249 ecryptfs_init_lower_file 0 44249 NULL ++rbd_parent_show_44252 rbd_parent_show 0 44252 NULL ++tm6000_i2c_xfer_44260 tm6000_i2c_xfer 0-3 44260 NULL ++mgt_commit_44264 mgt_commit 0 44264 NULL nohasharray ++ec_bhf_open_44264 ec_bhf_open 0 44264 &mgt_commit_44264 ++minix_getattr_44267 minix_getattr 0 44267 NULL ++vlan_vid_add_44269 vlan_vid_add 0 44269 NULL ++gpiod_direction_output_raw_44276 gpiod_direction_output_raw 0 44276 NULL ++start_usb_playback_44284 start_usb_playback 0 44284 NULL ++device_create_file_44285 device_create_file 0 44285 NULL ++initstate_show_44288 initstate_show 0 44288 NULL ++xgene_enet_register_irq_44289 xgene_enet_register_irq 0 44289 NULL ++nft_hash_privsize_44290 nft_hash_privsize 0 44290 NULL ++_request_firmware_prepare_44291 _request_firmware_prepare 0 44291 NULL ++store_eeprom_delay_44292 store_eeprom_delay 0-4 44292 NULL ++ufs_clusteracct_44293 ufs_clusteracct 3 44293 NULL nohasharray ++gfs2_jdata_writepages_44293 gfs2_jdata_writepages 0 44293 &ufs_clusteracct_44293 ++store_companion_44297 store_companion 0-4 44297 NULL ++crc32c_intel_init_44298 crc32c_intel_init 0 44298 NULL ++xfs_dir2_sf_to_block_44301 xfs_dir2_sf_to_block 0 44301 NULL ++ath6kl_keepalive_read_44303 ath6kl_keepalive_read 3-0 44303 NULL ++max8997_rtc_set_update_reg_44308 max8997_rtc_set_update_reg 0 44308 NULL ++snd_pcm_lib_alloc_vmalloc_buffer_44309 snd_pcm_lib_alloc_vmalloc_buffer 2 44309 NULL ++target_core_dev_wwn_store_attr_vpd_assoc_target_port_44310 target_core_dev_wwn_store_attr_vpd_assoc_target_port 0-3 44310 NULL ++bitmap_scnprintf_44318 bitmap_scnprintf 0-2 44318 NULL nohasharray ++da9055_disable_auto_mode_44318 da9055_disable_auto_mode 0 44318 &bitmap_scnprintf_44318 nohasharray ++set_temp_hyst_44318 set_temp_hyst 0-4 44318 &da9055_disable_auto_mode_44318 ++store_bank1_setting_44319 store_bank1_setting 0-4 44319 NULL ++dispatch_proc_write_44320 dispatch_proc_write 3-0 44320 NULL nohasharray ++generic_file_read_iter_44320 generic_file_read_iter 0 44320 &dispatch_proc_write_44320 ++ccp_init_data_44324 ccp_init_data 5 44324 NULL ++shmem_setattr_44325 shmem_setattr 0 44325 NULL nohasharray ++pwm1_enable_store_44325 pwm1_enable_store 0-4 44325 &shmem_setattr_44325 ++rs_init_44327 rs_init 1 44327 NULL ++__uncore_filter_band2_show_44332 __uncore_filter_band2_show 0 44332 NULL ++count_ah_combs_44334 count_ah_combs 0 44334 NULL ++gadget_info_attr_show_44335 gadget_info_attr_show 0 44335 NULL ++pyra_sysfs_read_profile_settings_44337 pyra_sysfs_read_profile_settings 0-5-6 44337 NULL ++rc5t583_rtc_alarm_irq_enable_44338 rc5t583_rtc_alarm_irq_enable 0 44338 NULL ++ubi_eba_write_leb_st_44343 ubi_eba_write_leb_st 5-0 44343 NULL ++logfs_write_i0_44346 logfs_write_i0 0 44346 NULL nohasharray ++radix_tree_maybe_preload_44346 radix_tree_maybe_preload 0 44346 &logfs_write_i0_44346 ++bcm87xx_config_init_44347 bcm87xx_config_init 0 44347 NULL ++nfs_fscache_get_super_cookie_44355 nfs_fscache_get_super_cookie 3 44355 NULL nohasharray ++blk_queue_init_tags_44355 blk_queue_init_tags 2 44355 &nfs_fscache_get_super_cookie_44355 ++set_format_44357 set_format 0 44357 NULL nohasharray ++sys_write_44357 sys_write 3-0 44357 &set_format_44357 ++fm_v4l2_s_ctrl_44358 fm_v4l2_s_ctrl 0 44358 NULL ++ipx_recvmsg_44366 ipx_recvmsg 0-4 44366 NULL ++llcp_sock_bind_44367 llcp_sock_bind 0 44367 NULL nohasharray ++atkbd_show_softraw_44367 atkbd_show_softraw 0 44367 &llcp_sock_bind_44367 ++topology_cpu_callback_44372 topology_cpu_callback 0 44372 NULL ++rts_threshold_read_44384 rts_threshold_read 3-0 44384 NULL ++ubi_sync_44391 ubi_sync 0 44391 NULL ++t4_change_mac_44392 t4_change_mac 0 44392 NULL ++mtip_hw_read_flags_44396 mtip_hw_read_flags 3-0 44396 NULL nohasharray ++show_44396 show 0 44396 &mtip_hw_read_flags_44396 nohasharray ++mwl8k_cmd_set_edca_params_44396 mwl8k_cmd_set_edca_params 0 44396 &show_44396 ++pcibios_err_to_errno_44397 pcibios_err_to_errno 0-1 44397 NULL ++aoedev_flush_44398 aoedev_flush 2-0 44398 NULL nohasharray ++snd_atiixp_playback_prepare_44398 snd_atiixp_playback_prepare 0 44398 &aoedev_flush_44398 ++drm_buffer_alloc_44405 drm_buffer_alloc 2 44405 NULL ++ceph_vxattrcb_dir_rfiles_44407 ceph_vxattrcb_dir_rfiles 0 44407 NULL ++store_tabletPointerMode_44408 store_tabletPointerMode 0-4 44408 NULL ++coda_symlink_filler_44409 coda_symlink_filler 0 44409 NULL ++osst_do_scsi_44410 osst_do_scsi 4 44410 NULL ++link_layer_show_44412 link_layer_show 0 44412 NULL nohasharray ++save_ioapic_entries_44412 save_ioapic_entries 0 44412 &link_layer_show_44412 ++qt1010_writereg_44415 qt1010_writereg 0 44415 NULL ++dvbsky_usb_generic_rw_44417 dvbsky_usb_generic_rw 0 44417 NULL ++ieee80211_if_read_rc_rateidx_mcs_mask_5ghz_44423 ieee80211_if_read_rc_rateidx_mcs_mask_5ghz 3-0 44423 NULL ++__hci_cmd_sync_44429 __hci_cmd_sync 3 44429 NULL ++broadsheet_spiflash_op_on_address_44431 broadsheet_spiflash_op_on_address 0 44431 NULL ++_nfs4_server_capabilities_44435 _nfs4_server_capabilities 0 44435 NULL nohasharray ++fs16_to_cpu_44435 fs16_to_cpu 0-2 44435 &_nfs4_server_capabilities_44435 nohasharray ++rt61pci_enable_radio_44435 rt61pci_enable_radio 0 44435 &fs16_to_cpu_44435 ++nilfs_dat_prepare_entry_44436 nilfs_dat_prepare_entry 0 44436 NULL ++temp_SKIN_44437 temp_SKIN 0 44437 NULL ++tpm_nsc_send_44438 tpm_nsc_send 0-3 44438 NULL ++mwl8k_request_fw_44446 mwl8k_request_fw 0 44446 NULL ++w83977af_net_open_44449 w83977af_net_open 0 44449 NULL ++iwl_dbgfs_bf_params_write_44450 iwl_dbgfs_bf_params_write 0-3 44450 NULL nohasharray ++eth_change_mtu_44450 eth_change_mtu 0 44450 &iwl_dbgfs_bf_params_write_44450 ++koneplus_sysfs_read_profilex_buttons_44454 koneplus_sysfs_read_profilex_buttons 0-5-6 44454 NULL ++dma_mask_bits_show_44456 dma_mask_bits_show 0 44456 NULL ++snd_pcm_do_suspend_44460 snd_pcm_do_suspend 0 44460 NULL ++___alloc_bootmem_node_nopanic_44461 ___alloc_bootmem_node_nopanic 2 44461 NULL ++cpuid_class_cpu_callback_44464 cpuid_class_cpu_callback 0 44464 NULL ++mic_virtio_copy_to_user_44472 mic_virtio_copy_to_user 4-3 44472 NULL nohasharray ++slave_show_44472 slave_show 0 44472 &mic_virtio_copy_to_user_44472 ++write_file_debug_44476 write_file_debug 3-0 44476 NULL ++btrfs_chunk_item_size_44478 btrfs_chunk_item_size 0-1 44478 NULL ++allocate_mid_44479 allocate_mid 0 44479 NULL ++iwl_send_bt_env_44481 iwl_send_bt_env 0 44481 NULL ++atxp1_showgpio1_44484 atxp1_showgpio1 0 44484 NULL nohasharray ++iscsi_nacl_attrib_show_nopin_response_timeout_44484 iscsi_nacl_attrib_show_nopin_response_timeout 0 44484 &atxp1_showgpio1_44484 ++security_socket_sendmsg_44485 security_socket_sendmsg 0 44485 NULL ++ext4_write_inode_44486 ext4_write_inode 0 44486 NULL ++card_id_show_attr_44487 card_id_show_attr 0 44487 NULL nohasharray ++size_store_44487 size_store 0-3 44487 &card_id_show_attr_44487 ++cond_read_node_44488 cond_read_node 0 44488 NULL ++sdio_align_size_44489 sdio_align_size 0-2 44489 NULL ++amd756_transaction_44492 amd756_transaction 0 44492 NULL ++ixgbevf_open_44493 ixgbevf_open 0 44493 NULL ++st_accel_trig_set_state_44495 st_accel_trig_set_state 0 44495 NULL ++bio_advance_44496 bio_advance 2 44496 NULL nohasharray ++MT2063_SoftwareShutdown_44496 MT2063_SoftwareShutdown 0 44496 &bio_advance_44496 ++vpx3220_s_stream_44498 vpx3220_s_stream 0 44498 NULL ++ieee80211_if_read_dropped_frames_ttl_44500 ieee80211_if_read_dropped_frames_ttl 3-0 44500 NULL ++show_sas_end_dev_tlr_supported_44501 show_sas_end_dev_tlr_supported 0 44501 NULL ++xfrm_sa_len_44502 xfrm_sa_len 0 44502 NULL ++security_getprocattr_44505 security_getprocattr 0 44505 NULL nohasharray ++iwl_dbgfs_sram_read_44505 iwl_dbgfs_sram_read 3-0 44505 &security_getprocattr_44505 ++reserved_size_store_44508 reserved_size_store 0-4 44508 NULL ++btrfs_space_info_show_total_bytes_44509 btrfs_space_info_show_total_bytes 0 44509 NULL ++spidev_write_44510 spidev_write 3-0 44510 NULL ++alc269_parse_auto_config_44518 alc269_parse_auto_config 0 44518 NULL ++SyS_io_getevents_44519 SyS_io_getevents 3 44519 NULL ++i7core_inject_type_show_44520 i7core_inject_type_show 0 44520 NULL nohasharray ++tc3589x_gpio_direction_output_44520 tc3589x_gpio_direction_output 0 44520 &i7core_inject_type_show_44520 ++ivtv_ack_44524 ivtv_ack 0 44524 NULL ++gxfb_check_var_44525 gxfb_check_var 0 44525 NULL ++roccat_common2_sysfs_write_profile_buttons_44527 roccat_common2_sysfs_write_profile_buttons 0-6-5 44527 NULL ++b_hnp_enable_show_44529 b_hnp_enable_show 0 44529 NULL nohasharray ++vivid_fb_set_par_44529 vivid_fb_set_par 0 44529 &b_hnp_enable_show_44529 ++ath9k_hw_reset_44536 ath9k_hw_reset 0 44536 NULL ++comm_write_44537 comm_write 3-0 44537 NULL nohasharray ++sys_msgsnd_44537 sys_msgsnd 3 44537 &comm_write_44537 ++shmem_getpage_gfp_44556 shmem_getpage_gfp 0 44556 NULL ++picolcd_set_par_44559 picolcd_set_par 0 44559 NULL ++sctp_gen_sack_44565 sctp_gen_sack 0 44565 NULL ++default_pvid_store_44566 default_pvid_store 0-4 44566 NULL ++show_registers_44567 show_registers 0 44567 NULL nohasharray ++show_iface_first_burst_len_44567 show_iface_first_burst_len 0 44567 &show_registers_44567 ++pch_gbe_request_irq_44570 pch_gbe_request_irq 0 44570 NULL ++kobj_attr_store_44573 kobj_attr_store 0-4 44573 NULL ++isl1208_sysfs_show_atrim_44574 isl1208_sysfs_show_atrim 0 44574 NULL ++gfs2_write_cache_jdata_44575 gfs2_write_cache_jdata 0 44575 NULL ++i7core_inject_store_channel_44576 i7core_inject_store_channel 0-4 44576 NULL ++nilfs_unfreeze_44578 nilfs_unfreeze 0 44578 NULL ++be_get_rxfh_indir_size_44582 be_get_rxfh_indir_size 0 44582 NULL ++get_fc_port_speed_names_44585 get_fc_port_speed_names 0 44585 NULL ++btrfs_set_extent_delalloc_44587 btrfs_set_extent_delalloc 0 44587 NULL ++bdc_config_ep_44588 bdc_config_ep 0 44588 NULL ++show_44594 show 0 44594 NULL nohasharray ++set_usblim_44594 set_usblim 0-4 44594 &show_44594 ++snd_pcm_alloc_vmalloc_buffer_44595 snd_pcm_alloc_vmalloc_buffer 2 44595 NULL ++get_fan_min_44596 get_fan_min 0 44596 NULL ++popen_44599 popen 0 44599 NULL ++thermal_temp_input_show_44600 thermal_temp_input_show 0 44600 NULL ++nouveau_perfmon_create__44602 nouveau_perfmon_create_ 4 44602 NULL ++show_ipOutDiscards_44605 show_ipOutDiscards 0 44605 NULL ++buffer_size_read_44609 buffer_size_read 0 44609 NULL ++pm_async_store_44619 pm_async_store 0-4 44619 NULL ++ecryptfs_copy_up_encrypted_with_header_44622 ecryptfs_copy_up_encrypted_with_header 0 44622 NULL ++niu_rx_channel_reset_44627 niu_rx_channel_reset 0 44627 NULL ++cfpkt_add_body_44630 cfpkt_add_body 3 44630 NULL ++msb_get_free_block_44633 msb_get_free_block 2 44633 NULL nohasharray ++xpcs_mmd_write_44633 xpcs_mmd_write 3 44633 &msb_get_free_block_44633 ++write_all_xattrs_44634 write_all_xattrs 0 44634 NULL ++ltc2945_reset_history_44639 ltc2945_reset_history 0-4 44639 NULL ++ezusb_docmd_wait_44641 ezusb_docmd_wait 0 44641 NULL ++target_core_store_dev_enable_44642 target_core_store_dev_enable 0-3 44642 NULL ++ext2_new_block_44645 ext2_new_block 2-0 44645 NULL nohasharray ++show_fc_vport_symbolic_name_44645 show_fc_vport_symbolic_name 0 44645 &ext2_new_block_44645 ++show_match_busid_44647 show_match_busid 0 44647 NULL ++show_fc_vport_port_name_44656 show_fc_vport_port_name 0 44656 NULL ++store_44659 store 0-3 44659 NULL ++alloc_ctrl_packet_44667 alloc_ctrl_packet 1 44667 NULL ++show_ctrl_44671 show_ctrl 0 44671 NULL ++mpi_resize_44674 mpi_resize 2 44674 NULL ++auxch_init_44675 auxch_init 0 44675 NULL ++ipheth_rx_submit_44679 ipheth_rx_submit 0 44679 NULL nohasharray ++velocity_open_44679 velocity_open 0 44679 &ipheth_rx_submit_44679 ++fm10k_iov_alloc_data_44682 fm10k_iov_alloc_data 0 44682 NULL ++st_try_direct_io_show_44683 st_try_direct_io_show 0 44683 NULL ++cifs_setattr_nounix_44685 cifs_setattr_nounix 0 44685 NULL nohasharray ++sysfs_create_link_44685 sysfs_create_link 0 44685 &cifs_setattr_nounix_44685 ++ts_read_44687 ts_read 3-0 44687 NULL ++qib_get_user_pages_44689 qib_get_user_pages 0 44689 NULL nohasharray ++hsr_dev_open_44689 hsr_dev_open 0 44689 &qib_get_user_pages_44689 ++selinux_sb_statfs_44691 selinux_sb_statfs 0 44691 NULL ++show_host_busy_44693 show_host_busy 0 44693 NULL ++os_desc_attr_store_44695 os_desc_attr_store 0-4 44695 NULL nohasharray ++ieee80211_get_sset_count_44695 ieee80211_get_sset_count 0 44695 &os_desc_attr_store_44695 ++write_file_spectral_bins_44696 write_file_spectral_bins 3-0 44696 NULL ++lov_emerg_alloc_44698 lov_emerg_alloc 1 44698 NULL ++C_SYSC_select_44701 C_SYSC_select 1 44701 NULL ++mlx4_flow_attach_44702 mlx4_flow_attach 0 44702 NULL ++hotkey_bios_mask_show_44708 hotkey_bios_mask_show 0 44708 NULL ++xfer_to_user_44713 xfer_to_user 3 44713 NULL ++mt9t112_s_stream_44716 mt9t112_s_stream 0 44716 NULL ++__iscsi_disc_show_password_44722 __iscsi_disc_show_password 0 44722 NULL ++C_SYSC_semtimedop_44725 C_SYSC_semtimedop 3 44725 NULL nohasharray ++_zd_iowrite32v_locked_44725 _zd_iowrite32v_locked 0-3 44725 &C_SYSC_semtimedop_44725 ++do_fbcon_takeover_44726 do_fbcon_takeover 0 44726 NULL ++clusterip_proc_write_44729 clusterip_proc_write 3-0 44729 NULL ++fib_count_nexthops_44730 fib_count_nexthops 0 44730 NULL nohasharray ++get_dev_desc_store_44730 get_dev_desc_store 0-4 44730 &fib_count_nexthops_44730 ++efx_wanted_parallelism_44732 efx_wanted_parallelism 0 44732 NULL nohasharray ++SyS_read_44732 SyS_read 3 44732 &efx_wanted_parallelism_44732 ++qlcnic_83xx_create_tx_ctx_44733 qlcnic_83xx_create_tx_ctx 0 44733 NULL ++key_tx_rx_count_read_44742 key_tx_rx_count_read 3-0 44742 NULL nohasharray ++il3945_show_temperature_44742 il3945_show_temperature 0 44742 &key_tx_rx_count_read_44742 ++WIL_GET_BITS_44747 WIL_GET_BITS 0-3-2-1 44747 NULL ++phy_poll_reset_44752 phy_poll_reset 0 44752 NULL ++bch_bio_max_sectors_44755 bch_bio_max_sectors 0 44755 NULL ++tnode_new_44757 tnode_new 3 44757 NULL nohasharray ++pty_write_44757 pty_write 3-0 44757 &tnode_new_44757 ++bop_assign_44765 bop_assign 0 44765 NULL ++_nfs4_do_setattr_44767 _nfs4_do_setattr 0 44767 NULL nohasharray ++write_44767 write 0-3 44767 &_nfs4_do_setattr_44767 ++snd_usX2Y_pcm_prepare_44768 snd_usX2Y_pcm_prepare 0 44768 NULL ++__videobuf_copy_stream_44769 __videobuf_copy_stream 4-0 44769 NULL ++show_44772 show 0 44772 NULL nohasharray ++ath5k_setup_channel_powertable_44772 ath5k_setup_channel_powertable 0 44772 &show_44772 ++handsfree_ramp_44777 handsfree_ramp 2 44777 NULL ++readstat_44780 readstat 0 44780 NULL ++irq_domain_add_legacy_44781 irq_domain_add_legacy 2-4 44781 NULL ++sctp_setsockopt_44788 sctp_setsockopt 5-0 44788 NULL ++proc_read_44793 proc_read 0 44793 NULL nohasharray ++target_core_alua_tg_pt_gp_store_attr_preferred_44793 target_core_alua_tg_pt_gp_store_attr_preferred 0-3 44793 &proc_read_44793 ++posix_clock_read_44794 posix_clock_read 0-3 44794 NULL ++rx_dropped_read_44799 rx_dropped_read 3-0 44799 NULL ++cas_open_44801 cas_open 0 44801 NULL ++iscsit_na_random_datain_seq_offsets_44804 iscsit_na_random_datain_seq_offsets 0 44804 NULL ++x25_pacsize_to_bytes_44812 x25_pacsize_to_bytes 0 44812 NULL ++qla4xxx_alloc_work_44813 qla4xxx_alloc_work 2 44813 NULL ++sbs_init_44817 sbs_init 0 44817 NULL ++fsp_attr_set_vscroll_44818 fsp_attr_set_vscroll 0-4 44818 NULL ++force_static_address_write_44819 force_static_address_write 3-0 44819 NULL ++ipv6_conntrack_local_44820 ipv6_conntrack_local 0 44820 NULL ++wa_urb_enqueue_b_44822 wa_urb_enqueue_b 0 44822 NULL ++mei_cl_read_start_44824 mei_cl_read_start 2-0 44824 NULL ++xfs_da3_swap_lastblock_44825 xfs_da3_swap_lastblock 0 44825 NULL ++at86rf230_set_csma_params_44826 at86rf230_set_csma_params 0 44826 NULL ++ocfs2_control_do_setnode_msg_44828 ocfs2_control_do_setnode_msg 0 44828 NULL ++xen_hvm_cpu_notify_44831 xen_hvm_cpu_notify 0 44831 NULL ++units_sprintf_44833 units_sprintf 0 44833 NULL ++sisusb_write_44834 sisusb_write 3-0 44834 NULL ++rtl8180_add_interface_44835 rtl8180_add_interface 0 44835 NULL ++node_show_44836 node_show 0 44836 NULL ++_nfs4_proc_symlink_44843 _nfs4_proc_symlink 0 44843 NULL ++kvm_read_hva_44847 kvm_read_hva 3 44847 NULL nohasharray ++f2fs_sync_fs_44847 f2fs_sync_fs 0 44847 &kvm_read_hva_44847 ++cross_eof_44848 cross_eof 0 44848 NULL ++bfad_im_num_of_discovered_ports_show_44849 bfad_im_num_of_discovered_ports_show 0 44849 NULL nohasharray ++dbg_check_lprops_44849 dbg_check_lprops 0 44849 &bfad_im_num_of_discovered_ports_show_44849 ++cis820x_config_init_44850 cis820x_config_init 0 44850 NULL nohasharray ++qib_verbs_send_dma_44850 qib_verbs_send_dma 6 44850 &cis820x_config_init_44850 ++packet_do_bind_44851 packet_do_bind 0 44851 NULL ++create_hp_mic_44854 create_hp_mic 0 44854 NULL ++copydesc_user_44855 copydesc_user 3 44855 NULL ++adp8870_bl_ambient_light_zone_show_44856 adp8870_bl_ambient_light_zone_show 0 44856 NULL ++picolcd_debug_flash_write_44858 picolcd_debug_flash_write 0-3 44858 NULL nohasharray ++bch_stats_store_44858 bch_stats_store 0-4 44858 &picolcd_debug_flash_write_44858 ++perm_hwaddr_show_44859 perm_hwaddr_show 0 44859 NULL nohasharray ++mark_swapfiles_44859 mark_swapfiles 0 44859 &perm_hwaddr_show_44859 ++iwl_send_wimax_coex_44861 iwl_send_wimax_coex 0 44861 NULL ++disk_removable_show_44864 disk_removable_show 0 44864 NULL ++set_advertising_44870 set_advertising 4 44870 NULL ++init_rs_44873 init_rs 1 44873 NULL nohasharray ++inode_readahead_blks_store_44873 inode_readahead_blks_store 0-4 44873 &init_rs_44873 ++show_fcoe_ctlr_device_link_fail_44874 show_fcoe_ctlr_device_link_fail 0 44874 NULL ++radeon_get_dpm_forced_performance_level_44881 radeon_get_dpm_forced_performance_level 0 44881 NULL nohasharray ++omfs_statfs_44881 omfs_statfs 0 44881 &radeon_get_dpm_forced_performance_level_44881 ++skb_availroom_44883 skb_availroom 0 44883 NULL ++isl1208_i2c_get_usr_44885 isl1208_i2c_get_usr 0 44885 NULL ++usb_os_desc_attr_show_44887 usb_os_desc_attr_show 0 44887 NULL nohasharray ++patch_ad1882_44887 patch_ad1882 0 44887 &usb_os_desc_attr_show_44887 ++cfq_set_weight_44888 cfq_set_weight 0 44888 NULL ++kaweth_open_44889 kaweth_open 0 44889 NULL ++nf_bridge_encap_header_len_44890 nf_bridge_encap_header_len 0 44890 NULL ++show_fcoe_fcf_device_priority_44893 show_fcoe_fcf_device_priority 0 44893 NULL nohasharray ++ocfs2_wait_for_mask_44893 ocfs2_wait_for_mask 0 44893 &show_fcoe_fcf_device_priority_44893 ++nct7802_read_temp_44895 nct7802_read_temp 0 44895 NULL ++do_tty_write_44896 do_tty_write 5-0 44896 NULL nohasharray ++show_local_mac_44896 show_local_mac 0 44896 &do_tty_write_44896 ++async_readv_44898 async_readv 0 44898 NULL ++_scsih_change_queue_depth_44902 _scsih_change_queue_depth 0-2 44902 NULL ++elsa_resume_44904 elsa_resume 0 44904 NULL nohasharray ++ip_vs_send_async_44904 ip_vs_send_async 3 44904 &elsa_resume_44904 ++iwl_mvm_drain_sta_44909 iwl_mvm_drain_sta 0 44909 NULL ++ext4_attr_show_44910 ext4_attr_show 0 44910 NULL ++ptype_show_44913 ptype_show 0 44913 NULL ++regmap_spi_read_44921 regmap_spi_read 0-3-5 44921 NULL ++inode_setsecurity_44924 inode_setsecurity 0 44924 NULL nohasharray ++ath5k_hw_write_ofdm_timings_44924 ath5k_hw_write_ofdm_timings 0 44924 &inode_setsecurity_44924 ++lp855x_get_bl_ctl_mode_44927 lp855x_get_bl_ctl_mode 0 44927 NULL ++get_cpu_vid_44938 get_cpu_vid 0 44938 NULL nohasharray ++store_rxbuf_44938 store_rxbuf 0-4 44938 &get_cpu_vid_44938 ++loop_attr_do_show_backing_file_44940 loop_attr_do_show_backing_file 0 44940 NULL ++show_port_id_44946 show_port_id 0 44946 NULL nohasharray ++read_report_descriptor_44946 read_report_descriptor 0-5-6 44946 &show_port_id_44946 ++_snd_pcm_hw_param_last_44947 _snd_pcm_hw_param_last 0 44947 NULL nohasharray ++create_44947 create 0 44947 &_snd_pcm_hw_param_last_44947 ++cache_shared_cpu_map_setup_44949 cache_shared_cpu_map_setup 0 44949 NULL ++ieee80211_build_probe_req_44951 ieee80211_build_probe_req 7-9 44951 NULL ++m88ts2022_get_if_frequency_44956 m88ts2022_get_if_frequency 0 44956 NULL ++sr_probe_44958 sr_probe 0 44958 NULL nohasharray ++target_fabric_mappedlun_attr_store_44958 target_fabric_mappedlun_attr_store 0-4 44958 &sr_probe_44958 ++target_core_dev_pr_store_attr_res_aptpl_metadata_44965 target_core_dev_pr_store_attr_res_aptpl_metadata 0-3 44965 NULL ++mwl8k_config_44968 mwl8k_config 0 44968 NULL ++tx_queue_status_read_44978 tx_queue_status_read 3-0 44978 NULL ++dsa_slave_open_44990 dsa_slave_open 0 44990 NULL ++map_index_to_lba_44993 map_index_to_lba 0-1 44993 NULL nohasharray ++bond_option_mode_set_44993 bond_option_mode_set 0 44993 &map_index_to_lba_44993 ++log_debug_read_44994 log_debug_read 0 44994 NULL ++selinux_inode_follow_link_44995 selinux_inode_follow_link 0 44995 NULL ++intel_mapping_error_45000 intel_mapping_error 0-2 45000 NULL ++iscsi_stat_logout_show_attr_inst_45003 iscsi_stat_logout_show_attr_inst 0 45003 NULL ++mc13xxx_rtc_irq_enable_unlocked_45005 mc13xxx_rtc_irq_enable_unlocked 3-0 45005 NULL nohasharray ++bh1770_lux_range_show_45005 bh1770_lux_range_show 0 45005 &mc13xxx_rtc_irq_enable_unlocked_45005 ++iscsi_tpg_param_store_IFMarkInt_45007 iscsi_tpg_param_store_IFMarkInt 0-3 45007 NULL ++drbd_recv_all_warn_45011 drbd_recv_all_warn 3 45011 NULL ++ecryptfs_setattr_45013 ecryptfs_setattr 0 45013 NULL ++xfs_da3_join_45014 xfs_da3_join 0 45014 NULL ++ptrace_writedata_45021 ptrace_writedata 4 45021 NULL nohasharray ++read_block_bitmap_45021 read_block_bitmap 2 45021 &ptrace_writedata_45021 nohasharray ++iscsi_tpg_param_store_FirstBurstLength_45021 iscsi_tpg_param_store_FirstBurstLength 0-3 45021 &read_block_bitmap_45021 ++ath10k_htt_connect_45022 ath10k_htt_connect 0 45022 NULL ++show_state_power_usage_45023 show_state_power_usage 0 45023 NULL nohasharray ++zd1211b_hw_init_hmac_45023 zd1211b_hw_init_hmac 0 45023 &show_state_power_usage_45023 ++dm_kvzalloc_45025 dm_kvzalloc 1 45025 NULL ++hotplug_cfd_45029 hotplug_cfd 0 45029 NULL ++snd_seq_kernel_client_ctl_45032 snd_seq_kernel_client_ctl 0 45032 NULL ++vfio_ecap_init_45033 vfio_ecap_init 0 45033 NULL ++packet_mc_add_45035 packet_mc_add 0 45035 NULL ++iwl_dbgfs_fw_restart_write_45036 iwl_dbgfs_fw_restart_write 0-3 45036 NULL ++store_drivers_autoprobe_45037 store_drivers_autoprobe 0-3 45037 NULL ++show_in_label_45039 show_in_label 0 45039 NULL ++show_fcstat_rx_words_45041 show_fcstat_rx_words 0 45041 NULL ++reiserfs_for_each_xattr_45046 reiserfs_for_each_xattr 0 45046 NULL ++igb_change_mtu_45054 igb_change_mtu 0 45054 NULL ++il_send_rxon_assoc_45055 il_send_rxon_assoc 0 45055 NULL nohasharray ++gpio_keys_store_disabled_keys_45055 gpio_keys_store_disabled_keys 0-4 45055 &il_send_rxon_assoc_45055 nohasharray ++qlcnic_sriov_pf_cfg_vlan_filtering_45055 qlcnic_sriov_pf_cfg_vlan_filtering 0 45055 &gpio_keys_store_disabled_keys_45055 ++adt7x10_show_temp_45056 adt7x10_show_temp 0 45056 NULL nohasharray ++range_straddles_page_boundary_45056 range_straddles_page_boundary 1 45056 &adt7x10_show_temp_45056 ++sysfs_do_create_link_sd_45057 sysfs_do_create_link_sd 0 45057 NULL ++sel_write_user_45060 sel_write_user 3 45060 NULL ++qla4xxx_fw_version_show_45062 qla4xxx_fw_version_show 0 45062 NULL ++show_45064 show 0 45064 NULL ++ubifs_fsync_45067 ubifs_fsync 0 45067 NULL ++o2nm_node_ipv4_port_write_45068 o2nm_node_ipv4_port_write 0-3 45068 NULL ++snd_mixart_BA0_read_45069 snd_mixart_BA0_read 5-0 45069 NULL ++removable_show_45071 removable_show 0 45071 NULL nohasharray ++set_offset_45071 set_offset 0-4 45071 &removable_show_45071 ++gxfb_set_par_45080 gxfb_set_par 0 45080 NULL ++show_ata_port_idle_irq_45087 show_ata_port_idle_irq 0 45087 NULL ++wl1271_boot_set_ecpu_ctrl_45088 wl1271_boot_set_ecpu_ctrl 0 45088 NULL nohasharray ++target_core_dev_wwn_store_attr_vpd_assoc_scsi_target_device_45088 target_core_dev_wwn_store_attr_vpd_assoc_scsi_target_device 0-3 45088 &wl1271_boot_set_ecpu_ctrl_45088 ++__device_suspend_45089 __device_suspend 0 45089 NULL ++getattr_45091 getattr 0 45091 NULL ++c2_pseudo_change_mtu_45101 c2_pseudo_change_mtu 0 45101 NULL ++ahci_activity_store_45103 ahci_activity_store 0 45103 NULL ++snd_card_new_45104 snd_card_new 5 45104 NULL ++write_iter_45109 write_iter 0 45109 NULL ++set_auto_temp_min_45111 set_auto_temp_min 0-4 45111 NULL ++pwr_missing_bcns_cnt_read_45113 pwr_missing_bcns_cnt_read 3-0 45113 NULL ++usbdev_read_45114 usbdev_read 3-0 45114 NULL ++v9fs_xattr_user_set_45117 v9fs_xattr_user_set 0 45117 NULL ++edd_show_legacy_max_cylinder_45119 edd_show_legacy_max_cylinder 0 45119 NULL ++in_write_bytes_avail_show_45133 in_write_bytes_avail_show 0 45133 NULL nohasharray ++isku_sysfs_write_reset_45133 isku_sysfs_write_reset 0-6-5 45133 &in_write_bytes_avail_show_45133 ++send_to_tty_45141 send_to_tty 3 45141 NULL ++lp3971_ldo_disable_45142 lp3971_ldo_disable 0 45142 NULL ++command_setapcor_45143 command_setapcor 0 45143 NULL ++write_file_reset_45145 write_file_reset 0-3 45145 NULL ++cfs_trace_daemon_command_usrstr_45147 cfs_trace_daemon_command_usrstr 2 45147 NULL ++gen_bitmask_string_45149 gen_bitmask_string 6 45149 NULL ++ixgbe_poll_for_msg_45150 ixgbe_poll_for_msg 0 45150 NULL nohasharray ++store_spi_transport_rti_45150 store_spi_transport_rti 0-4 45150 &ixgbe_poll_for_msg_45150 ++tcp_setsockopt_45152 tcp_setsockopt 0 45152 NULL nohasharray ++st_probe_45152 st_probe 0 45152 &tcp_setsockopt_45152 ++device_write_45156 device_write 3-0 45156 NULL ++usX2Y_urbs_start_45159 usX2Y_urbs_start 0 45159 NULL nohasharray ++ocfs2_dq_frozen_trigger_45159 ocfs2_dq_frozen_trigger 4 45159 &usX2Y_urbs_start_45159 ++SYSC_write_45160 SYSC_write 3-0 45160 NULL ++tomoyo_write_self_45161 tomoyo_write_self 3-0 45161 NULL ++xennet_create_queues_45162 xennet_create_queues 2 45162 NULL ++cxacru_sysfs_show_mac_address_45163 cxacru_sysfs_show_mac_address 0 45163 NULL ++sta_agg_status_write_45164 sta_agg_status_write 3-0 45164 NULL nohasharray ++max8925_reg_write_45164 max8925_reg_write 0 45164 &sta_agg_status_write_45164 ++mce_write_45187 mce_write 0 45187 NULL ++snd_sb_csp_load_user_45190 snd_sb_csp_load_user 3 45190 NULL nohasharray ++sctp_pack_cookie_45190 sctp_pack_cookie 6 45190 &snd_sb_csp_load_user_45190 ++create_hp_out_ctls_45193 create_hp_out_ctls 0 45193 NULL ++num_clusters_in_group_45194 num_clusters_in_group 2 45194 NULL ++__radix_tree_preload_45197 __radix_tree_preload 0 45197 NULL ++kstrtou16_45199 kstrtou16 0 45199 NULL ++ims_pcu_set_info_45200 ims_pcu_set_info 0 45200 NULL nohasharray ++smk_curacc_on_task_45200 smk_curacc_on_task 0 45200 &ims_pcu_set_info_45200 ++dvb_dvr_write_45201 dvb_dvr_write 0-3 45201 NULL nohasharray ++add_child_45201 add_child 4 45201 &dvb_dvr_write_45201 ++mpt_lan_change_mtu_45205 mpt_lan_change_mtu 0 45205 NULL ++iso_alloc_urb_45206 iso_alloc_urb 5-4 45206 NULL ++ati_remote2_show_channel_mask_45207 ati_remote2_show_channel_mask 0 45207 NULL ++rtl_show_version_45211 rtl_show_version 0 45211 NULL nohasharray ++scsi_dh_notifier_45211 scsi_dh_notifier 0 45211 &rtl_show_version_45211 ++toss_secs_read_45212 toss_secs_read 0 45212 NULL ++wl12xx_init_sta_role_45218 wl12xx_init_sta_role 0 45218 NULL ++pcxhr_sub_set_clock_45222 pcxhr_sub_set_clock 0 45222 NULL ++spi_alloc_master_45223 spi_alloc_master 2 45223 NULL ++qla4xxx_set_acb_45224 qla4xxx_set_acb 0 45224 NULL ++rocker_port_vlan_l2_groups_45230 rocker_port_vlan_l2_groups 0 45230 NULL ++ieee80211_if_read_peer_45233 ieee80211_if_read_peer 3-0 45233 NULL nohasharray ++lpfc_iocb_cnt_show_45233 lpfc_iocb_cnt_show 0 45233 &ieee80211_if_read_peer_45233 ++roccat_common2_sysfs_read_profile_45234 roccat_common2_sysfs_read_profile 0-5-6 45234 NULL ++tw9910_set_hsync_45237 tw9910_set_hsync 0 45237 NULL ++event_enable_write_45238 event_enable_write 3 45238 NULL ++mgt_set_request_45244 mgt_set_request 0 45244 NULL ++prism2_pda_proc_read_45246 prism2_pda_proc_read 3-0 45246 NULL ++show_45247 show 0 45247 NULL ++write_ltv_45250 write_ltv 0 45250 NULL ++s5k4aa_set_gain_45254 s5k4aa_set_gain 0 45254 NULL ++nobh_write_begin_45262 nobh_write_begin 0 45262 NULL ++bq2415x_sysfs_show_mode_45270 bq2415x_sysfs_show_mode 0 45270 NULL ++__smsc75xx_phy_wait_not_busy_45277 __smsc75xx_phy_wait_not_busy 0 45277 NULL ++input_mt_init_slots_45279 input_mt_init_slots 2 45279 NULL ++max3421_urb_enqueue_45282 max3421_urb_enqueue 0 45282 NULL ++store_45285 store 0 45285 NULL ++wl1251_acx_rts_threshold_45287 wl1251_acx_rts_threshold 0 45287 NULL ++__acpi_processor_start_45289 __acpi_processor_start 0 45289 NULL ++btmrvl_send_sync_cmd_45296 btmrvl_send_sync_cmd 4 45296 NULL ++snd_pcm_oss_sync1_45298 snd_pcm_oss_sync1 2 45298 NULL nohasharray ++sn9c2028_short_command_45298 sn9c2028_short_command 0 45298 &snd_pcm_oss_sync1_45298 ++category_show_45304 category_show 0 45304 NULL nohasharray ++xfs_alert_fsblock_zero_45304 xfs_alert_fsblock_zero 0 45304 &category_show_45304 ++disk_capability_show_45306 disk_capability_show 0 45306 NULL ++e1000_tx_map_45309 e1000_tx_map 5 45309 NULL ++hippi_header_45313 hippi_header 0 45313 NULL ++__i2c_hid_command_45321 __i2c_hid_command 0 45321 NULL ++compass_command_45324 compass_command 0 45324 NULL ++label_cpu_DTS_45336 label_cpu_DTS 0 45336 NULL nohasharray ++bnx2x_vfpf_config_mac_45336 bnx2x_vfpf_config_mac 0 45336 &label_cpu_DTS_45336 ++copy_vm86_regs_from_user_45340 copy_vm86_regs_from_user 3 45340 NULL ++tomoyo_audit_net_log_45342 tomoyo_audit_net_log 0 45342 NULL ++bpf_jit_binary_alloc_45348 bpf_jit_binary_alloc 1 45348 NULL nohasharray ++policydb_init_45348 policydb_init 0 45348 &bpf_jit_binary_alloc_45348 ++pci_inteli960ni_init_45349 pci_inteli960ni_init 0 45349 NULL ++posix_lock_file_45352 posix_lock_file 0 45352 NULL ++isl1208_rtc_read_time_45356 isl1208_rtc_read_time 0 45356 NULL nohasharray ++mic_dma_map_page_45356 mic_dma_map_page 0-3 45356 &isl1208_rtc_read_time_45356 ++wl12xx_acx_set_rate_mgmt_params_45357 wl12xx_acx_set_rate_mgmt_params 0 45357 NULL ++hotkey_poll_freq_store_45373 hotkey_poll_freq_store 0-4 45373 NULL ++null_alloc_repbuf_45375 null_alloc_repbuf 3 45375 NULL ++wmi_set_channel_45380 wmi_set_channel 0 45380 NULL ++goldfish_mmc_show_cover_switch_45382 goldfish_mmc_show_cover_switch 0 45382 NULL ++snd_pcm_lib_ioctl_45383 snd_pcm_lib_ioctl 0 45383 NULL ++snd_ctl_add_45389 snd_ctl_add 0 45389 NULL nohasharray ++write_rbu_image_type_45389 write_rbu_image_type 0-6-5 45389 &snd_ctl_add_45389 ++wlcore_write_45391 wlcore_write 0 45391 NULL ++count_skb_frag_slots_45395 count_skb_frag_slots 0 45395 NULL ++lane2_associate_req_45398 lane2_associate_req 4 45398 NULL ++keymap_store_45406 keymap_store 4 45406 NULL ++cont_expand_zero_45408 cont_expand_zero 0-3 45408 NULL ++show_45409 show 0 45409 NULL ++b44_change_mtu_45411 b44_change_mtu 0 45411 NULL ++sock_recv_errqueue_45412 sock_recv_errqueue 0-3 45412 NULL ++rs5c372_get_trim_45415 rs5c372_get_trim 0 45415 NULL nohasharray ++do_register_con_driver_45415 do_register_con_driver 0 45415 &rs5c372_get_trim_45415 ++acpi_pad_idlecpus_show_45416 acpi_pad_idlecpus_show 0 45416 NULL ++sht15_wait_for_response_45419 sht15_wait_for_response 0 45419 NULL nohasharray ++show_45419 show 0 45419 &sht15_wait_for_response_45419 ++ieee80211_if_fmt_dot11MeshHWMProotInterval_45421 ieee80211_if_fmt_dot11MeshHWMProotInterval 3 45421 NULL nohasharray ++snd_sonicvibes_playback_prepare_45421 snd_sonicvibes_playback_prepare 0 45421 &ieee80211_if_fmt_dot11MeshHWMProotInterval_45421 ++gfs2_xattr_set_45424 gfs2_xattr_set 0 45424 NULL ++tiadc_channel_init_45425 tiadc_channel_init 2 45425 NULL ++rt2x00lib_load_firmware_45427 rt2x00lib_load_firmware 0 45427 NULL ++__do_generic_request_45428 __do_generic_request 0 45428 NULL ++uncore_cpu_notifier_45429 uncore_cpu_notifier 0 45429 NULL ++ll_iocontrol_register_45430 ll_iocontrol_register 2 45430 NULL ++saa7146_i2c_writeout_45431 saa7146_i2c_writeout 0 45431 NULL ++nouveau_hwmon_set_temp1_auto_point1_temp_45434 nouveau_hwmon_set_temp1_auto_point1_temp 0-4 45434 NULL ++tty_buffer_alloc_45437 tty_buffer_alloc 2 45437 NULL nohasharray ++xfs_attr3_leaf_flipflags_45437 xfs_attr3_leaf_flipflags 0 45437 &tty_buffer_alloc_45437 ++pm_state_show_45438 pm_state_show 0 45438 NULL ++blkdev_direct_IO_45440 blkdev_direct_IO 4-0 45440 NULL ++prepare_layoutcommit_45441 prepare_layoutcommit 0 45441 NULL nohasharray ++store_fc_vport_symbolic_name_45441 store_fc_vport_symbolic_name 0-4 45441 &prepare_layoutcommit_45441 ++btrfs_show_u64_45443 btrfs_show_u64 0 45443 NULL ++b44_phy_reset_45447 b44_phy_reset 0 45447 NULL nohasharray ++store_spi_transport_iu_45447 store_spi_transport_iu 0-4 45447 &b44_phy_reset_45447 ++lpfc_bg_reftag_err_show_45448 lpfc_bg_reftag_err_show 0 45448 NULL ++catc_open_45451 catc_open 0 45451 NULL ++bq2415x_set_weak_battery_voltage_45454 bq2415x_set_weak_battery_voltage 0 45454 NULL ++netxen_nic_get_regs_len_45456 netxen_nic_get_regs_len 0 45456 NULL nohasharray ++mmc_power_save_host_45456 mmc_power_save_host 0 45456 &netxen_nic_get_regs_len_45456 ++mic_card_map_45457 mic_card_map 2-3 45457 NULL ++__node_remap_45458 __node_remap 4 45458 NULL ++nas_led_blink_show_45465 nas_led_blink_show 0 45465 NULL nohasharray ++rpm_idle_45465 rpm_idle 0 45465 &nas_led_blink_show_45465 ++orig_data_size_show_45467 orig_data_size_show 0 45467 NULL nohasharray ++udp_manip_pkt_45467 udp_manip_pkt 4 45467 &orig_data_size_show_45467 ++register_netdev_45468 register_netdev 0 45468 NULL nohasharray ++tracing_read_dyn_info_45468 tracing_read_dyn_info 3 45468 ®ister_netdev_45468 ++ext3_xattr_trusted_list_45471 ext3_xattr_trusted_list 0-5 45471 NULL ++__fuse_direct_write_45474 __fuse_direct_write 0 45474 NULL ++slab_attr_store_45475 slab_attr_store 0-4 45475 NULL ++show_indirect_dword_45476 show_indirect_dword 0 45476 NULL ++workqueue_cpu_up_callback_45481 workqueue_cpu_up_callback 0 45481 NULL ++ec_read_45485 ec_read 0 45485 NULL ++__xfs_btree_split_45491 __xfs_btree_split 0 45491 NULL ++lock_request_45495 lock_request 0 45495 NULL nohasharray ++gether_opts_dev_addr_store_45495 gether_opts_dev_addr_store 0-3 45495 &lock_request_45495 ++qib_read_umem32_45497 qib_read_umem32 0 45497 NULL ++show_counter_tx_dwords_45501 show_counter_tx_dwords 0 45501 NULL ++show_ata_dev_spdn_cnt_45502 show_ata_dev_spdn_cnt 0 45502 NULL nohasharray ++ip_mc_add_src_45502 ip_mc_add_src 0 45502 &show_ata_dev_spdn_cnt_45502 ++arizona_init_fll_45503 arizona_init_fll 5 45503 NULL ++get_stats_45508 get_stats 0 45508 NULL ++i40e_alloc_vfs_45511 i40e_alloc_vfs 2-0 45511 NULL ++snd_rme32_playback_prepare_45514 snd_rme32_playback_prepare 0 45514 NULL ++epx_c3_write_45515 epx_c3_write 0-3 45515 NULL ++wl12xx_top_reg_write_45521 wl12xx_top_reg_write 0 45521 NULL ++power_state_show_45525 power_state_show 0 45525 NULL nohasharray ++store_45525 store 0-3 45525 &power_state_show_45525 ++fuse_ref_page_45526 fuse_ref_page 0 45526 NULL ++broadsheet_setup_spiflash_45527 broadsheet_setup_spiflash 0 45527 NULL ++solo_set_motion_block_45529 solo_set_motion_block 0 45529 NULL ++sys_lgetxattr_45531 sys_lgetxattr 4 45531 NULL ++copy_macs_45534 copy_macs 4 45534 NULL ++w1_ds2760_read_45535 w1_ds2760_read 3-4-0 45535 NULL ++pdacf_pcm_trigger_45539 pdacf_pcm_trigger 0 45539 NULL ++iwl_mvm_binding_update_45542 iwl_mvm_binding_update 0 45542 NULL ++isofs_hashi_ms_45544 isofs_hashi_ms 0 45544 NULL ++usbvision_i2c_write_max4_45545 usbvision_i2c_write_max4 0-4 45545 NULL ++v9fs_direct_read_45546 v9fs_direct_read 3-0 45546 NULL ++cx18_copy_mdl_to_user_45549 cx18_copy_mdl_to_user 4 45549 NULL nohasharray ++patch_vt1708B_45549 patch_vt1708B 0 45549 &cx18_copy_mdl_to_user_45549 ++saa7127_set_video_enable_45550 saa7127_set_video_enable 0 45550 NULL ++ext3_group_first_block_no_45555 ext3_group_first_block_no 0-2 45555 NULL nohasharray ++lec_open_45555 lec_open 0 45555 &ext3_group_first_block_no_45555 ++__verify_memory_type_45556 __verify_memory_type 0 45556 NULL ++stats_dot11ACKFailureCount_read_45558 stats_dot11ACKFailureCount_read 3-0 45558 NULL nohasharray ++part_partition_show_45558 part_partition_show 0 45558 &stats_dot11ACKFailureCount_read_45558 nohasharray ++skge_device_event_45558 skge_device_event 0 45558 &part_partition_show_45558 ++_regmap_bus_raw_write_45559 _regmap_bus_raw_write 2 45559 NULL ++iwl_send_calib_results_45560 iwl_send_calib_results 0 45560 NULL ++venus_rmdir_45564 venus_rmdir 4 45564 NULL nohasharray ++create_endpoint_and_queue_int_45564 create_endpoint_and_queue_int 0 45564 &venus_rmdir_45564 ++uwb_rc_addr_get_45566 uwb_rc_addr_get 0 45566 NULL nohasharray ++nouveau_hwmon_get_pwm1_min_45566 nouveau_hwmon_get_pwm1_min 0 45566 &uwb_rc_addr_get_45566 ++request_fw_file_45567 request_fw_file 0 45567 NULL ++snd_emu10k1_capture_prepare_45569 snd_emu10k1_capture_prepare 0 45569 NULL nohasharray ++xgene_rtc_set_alarm_45569 xgene_rtc_set_alarm 0 45569 &snd_emu10k1_capture_prepare_45569 ++power_read_file_45573 power_read_file 0 45573 NULL nohasharray ++pm8001_set_nvmd_45573 pm8001_set_nvmd 0 45573 &power_read_file_45573 ++dvb_usb_v2_generic_io_45576 dvb_usb_v2_generic_io 0 45576 NULL ++zd_usb_iowrite16v_async_end_45580 zd_usb_iowrite16v_async_end 0 45580 NULL ++sched_group_set_rt_period_45581 sched_group_set_rt_period 0 45581 NULL ++wdata_fill_from_iovec_45585 wdata_fill_from_iovec 0 45585 NULL ++ipath_create_cq_45586 ipath_create_cq 2 45586 NULL ++pm8001_ctl_ob_queue_log_show_45590 pm8001_ctl_ob_queue_log_show 0 45590 NULL ++rdma_set_ib_paths_45592 rdma_set_ib_paths 3 45592 NULL ++sensor_get_auxtrip_45593 sensor_get_auxtrip 0 45593 NULL ++apds990x_chip_id_show_45594 apds990x_chip_id_show 0 45594 NULL ++ipmi_heartbeat_45597 ipmi_heartbeat 0 45597 NULL ++ath6kl_keepalive_write_45600 ath6kl_keepalive_write 3-0 45600 NULL ++snd_seq_oss_write_45603 snd_seq_oss_write 0 45603 NULL ++recv_post_dequeue_45607 recv_post_dequeue 0 45607 NULL ++hidraw_get_report_45609 hidraw_get_report 3 45609 NULL nohasharray ++ov9640_reg_rmw_45609 ov9640_reg_rmw 0 45609 &hidraw_get_report_45609 ++drm_dp_i2c_do_msg_45610 drm_dp_i2c_do_msg 0 45610 NULL ++snd_solo_pcm_prepare_45611 snd_solo_pcm_prepare 0 45611 NULL nohasharray ++bat2_show_45611 bat2_show 0 45611 &snd_solo_pcm_prepare_45611 ++bch_cache_set_show_45612 bch_cache_set_show 0 45612 NULL ++audit_log_n_hex_45617 audit_log_n_hex 3 45617 NULL ++xgene_enet_open_45619 xgene_enet_open 0 45619 NULL ++register_chrdev_region_45620 register_chrdev_region 0 45620 NULL ++ipv4_synproxy_hook_45624 ipv4_synproxy_hook 0 45624 NULL ++pn533_alloc_skb_45625 pn533_alloc_skb 2 45625 NULL ++ip_dst_mtu_maybe_forward_45627 ip_dst_mtu_maybe_forward 0 45627 NULL ++ecryptfs_getxattr_45631 ecryptfs_getxattr 0 45631 NULL ++bad_file_aio_write_45633 bad_file_aio_write 0 45633 NULL ++rdma_read_chunk_lcl_45638 rdma_read_chunk_lcl 7 45638 NULL ++fake_rw_store_45641 fake_rw_store 0-3 45641 NULL ++wl1273_fm_set_preemphasis_45645 wl1273_fm_set_preemphasis 0 45645 NULL ++wusb_cdid_show_45647 wusb_cdid_show 0 45647 NULL ++rj54n1_s_fmt_45650 rj54n1_s_fmt 0 45650 NULL ++ebitmap_next_positive_45651 ebitmap_next_positive 3-0 45651 NULL ++ext4_reserve_inode_write_45654 ext4_reserve_inode_write 0 45654 NULL ++wq_numa_show_45656 wq_numa_show 0 45656 NULL ++modelname_store_45663 modelname_store 0-4 45663 NULL ++dma_map_cont_45668 dma_map_cont 5 45668 NULL ++sysfs_kf_write_45670 sysfs_kf_write 0-3 45670 NULL ++compat_mpctl_ioctl_45671 compat_mpctl_ioctl 2 45671 NULL ++sd_probe_45675 sd_probe 0 45675 NULL ++dgram_sendmsg_45679 dgram_sendmsg 4-0 45679 NULL nohasharray ++set_pwm1_enable_45679 set_pwm1_enable 0-4 45679 &dgram_sendmsg_45679 ++snd_hda_ctl_add_45680 snd_hda_ctl_add 0 45680 NULL ++il3945_alloc_bcast_station_45681 il3945_alloc_bcast_station 0 45681 NULL ++set_params_45684 set_params 0 45684 NULL nohasharray ++elan_i2c_set_mode_45684 elan_i2c_set_mode 0 45684 &set_params_45684 ++show_proxyarp_45689 show_proxyarp 0 45689 NULL ++smk_write_ambient_45691 smk_write_ambient 3-0 45691 NULL ++sr9700_link_reset_45697 sr9700_link_reset 0 45697 NULL ++iscsi_nacl_attrib_store_nopin_timeout_45698 iscsi_nacl_attrib_store_nopin_timeout 0-3 45698 NULL ++bscnl_emit_45699 bscnl_emit 5-0-2 45699 NULL nohasharray ++unix_dgram_sendmsg_45699 unix_dgram_sendmsg 0-4 45699 &bscnl_emit_45699 nohasharray ++sta_add_45699 sta_add 0 45699 &unix_dgram_sendmsg_45699 ++cachefiles_daemon_brun_45703 cachefiles_daemon_brun 0 45703 NULL nohasharray ++sm501fb_set_par_crt_45703 sm501fb_set_par_crt 0 45703 &cachefiles_daemon_brun_45703 ++sg_proc_write_adio_45704 sg_proc_write_adio 3-0 45704 NULL nohasharray ++ubifs_tnc_lookup_45704 ubifs_tnc_lookup 0 45704 &sg_proc_write_adio_45704 ++lm95234_update_device_45711 lm95234_update_device 0 45711 NULL ++wlcore_smart_config_decode_event_45714 wlcore_smart_config_decode_event 4-2 45714 NULL ++adp8860_bl_ambient_light_level_show_45717 adp8860_bl_ambient_light_level_show 0 45717 NULL ++dvb_ca_en50221_init_45718 dvb_ca_en50221_init 4 45718 NULL nohasharray ++bounce_error_event_45718 bounce_error_event 0 45718 &dvb_ca_en50221_init_45718 nohasharray ++nilfs_btree_node_get_key_45718 nilfs_btree_node_get_key 0 45718 &bounce_error_event_45718 ++get_iface_param_45719 get_iface_param 0 45719 NULL ++show_high_kb_45721 show_high_kb 0 45721 NULL ++wm8350_reg_read_45729 wm8350_reg_read 0 45729 NULL nohasharray ++rcu_cpu_notify_45729 rcu_cpu_notify 0 45729 &wm8350_reg_read_45729 ++show_chip_temp_45731 show_chip_temp 0 45731 NULL ++handle_response_icmp_45733 handle_response_icmp 0-7 45733 NULL ++snd_cs46xx_io_read_45734 snd_cs46xx_io_read 5-0 45734 NULL ++sync_dirty_buffer_45736 sync_dirty_buffer 0 45736 NULL ++skge_set_mac_address_45743 skge_set_mac_address 0 45743 NULL ++m41t80_sysfs_set_sqwfreq_45746 m41t80_sysfs_set_sqwfreq 0-4 45746 NULL ++rw_copy_check_uvector_45748 rw_copy_check_uvector 3-0 45748 NULL nohasharray ++v4l2_ctrl_new_std_45748 v4l2_ctrl_new_std 5 45748 &rw_copy_check_uvector_45748 ++lkdtm_debugfs_read_45752 lkdtm_debugfs_read 3-0 45752 NULL nohasharray ++afs_vnode_cache_get_key_45752 afs_vnode_cache_get_key 0 45752 &lkdtm_debugfs_read_45752 ++show_tabletWheel_45754 show_tabletWheel 0 45754 NULL ++regulator_suspend_mem_state_show_45760 regulator_suspend_mem_state_show 0 45760 NULL ++iwl_dbgfs_low_latency_write_45764 iwl_dbgfs_low_latency_write 0-3 45764 NULL ++store_int_with_restart_45770 store_int_with_restart 4-0 45770 NULL ++edd_show_default_heads_45773 edd_show_default_heads 0 45773 NULL ++gadget_dev_desc_idVendor_store_45774 gadget_dev_desc_idVendor_store 0-3 45774 NULL ++alloc_ts_config_45775 alloc_ts_config 1 45775 NULL ++FUA_show_45776 FUA_show 0 45776 NULL ++snd_ice1712_playback_trigger_45777 snd_ice1712_playback_trigger 0 45777 NULL ++parport_ieee1284_epp_read_addr_45781 parport_ieee1284_epp_read_addr 0 45781 NULL ++osc_checksum_type_seq_write_45785 osc_checksum_type_seq_write 3 45785 NULL ++ip6gre_tunnel_change_mtu_45786 ip6gre_tunnel_change_mtu 0 45786 NULL ++ath5k_get_stats_45788 ath5k_get_stats 0 45788 NULL ++st_gyro_buffer_predisable_45791 st_gyro_buffer_predisable 0 45791 NULL ++cma_release_45795 cma_release 3 45795 NULL ++cbaf_cc_upload_45799 cbaf_cc_upload 0 45799 NULL nohasharray ++b43_pcmcia_resume_45799 b43_pcmcia_resume 0 45799 &cbaf_cc_upload_45799 ++raw_setsockopt_45800 raw_setsockopt 5-0 45800 NULL ++adp5520_bl_dark_dim_show_45802 adp5520_bl_dark_dim_show 0 45802 NULL nohasharray ++michael_update_45802 michael_update 0 45802 &adp5520_bl_dark_dim_show_45802 ++kvmclock_cpufreq_notifier_45803 kvmclock_cpufreq_notifier 0 45803 NULL ++nct7802_read_fan_min_45804 nct7802_read_fan_min 0 45804 NULL ++lbs_rdbbp_read_45805 lbs_rdbbp_read 3-0 45805 NULL ++w1_ds2781_io_45806 w1_ds2781_io 0-4-3 45806 NULL nohasharray ++NCR_700_change_queue_depth_45806 NCR_700_change_queue_depth 2 45806 &w1_ds2781_io_45806 ++af9005_i2c_write_45809 af9005_i2c_write 0 45809 NULL nohasharray ++fc0011_readreg_45809 fc0011_readreg 0 45809 &af9005_i2c_write_45809 nohasharray ++vif_add_45809 vif_add 0 45809 &fc0011_readreg_45809 ++store_hardware_switching_45810 store_hardware_switching 0-4 45810 NULL ++pcpu_alloc_alloc_info_45813 pcpu_alloc_alloc_info 2-1 45813 NULL nohasharray ++disk_events_poll_msecs_show_45813 disk_events_poll_msecs_show 0 45813 &pcpu_alloc_alloc_info_45813 ++ll_max_readahead_mb_seq_write_45815 ll_max_readahead_mb_seq_write 3 45815 NULL ++show_dock_uid_45816 show_dock_uid 0 45816 NULL ++hif_usb_send_tx_45818 hif_usb_send_tx 0 45818 NULL ++fm_v4l2_init_video_device_45821 fm_v4l2_init_video_device 2 45821 NULL ++show_counter_ib_status_changes_45822 show_counter_ib_status_changes 0 45822 NULL ++start_endpoints_45825 start_endpoints 0 45825 NULL ++ipv6_recv_rxpmtu_45830 ipv6_recv_rxpmtu 0-3 45830 NULL ++mc13xxx_regulator_is_enabled_45832 mc13xxx_regulator_is_enabled 0 45832 NULL nohasharray ++hash_walk_next_45832 hash_walk_next 0 45832 &mc13xxx_regulator_is_enabled_45832 ++audit_make_reply_45835 audit_make_reply 7 45835 NULL ++perf_event_mux_interval_ms_store_45836 perf_event_mux_interval_ms_store 0-4 45836 NULL ++ath10k_reg_value_read_45837 ath10k_reg_value_read 3-0 45837 NULL nohasharray ++mtd_ecc_strength_show_45837 mtd_ecc_strength_show 0 45837 &ath10k_reg_value_read_45837 ++vti6_dev_init_gen_45840 vti6_dev_init_gen 0 45840 NULL ++store_learning_45844 store_learning 0 45844 NULL ++insert_state_45848 insert_state 0 45848 NULL ++activity_read_45850 activity_read 0-5-6 45850 NULL ++x509_process_extension_45854 x509_process_extension 5 45854 NULL ++bus_attr_store_45856 bus_attr_store 0-4 45856 NULL ++context_read_and_validate_45858 context_read_and_validate 0 45858 NULL ++mmc_send_io_op_cond_45861 mmc_send_io_op_cond 0 45861 NULL ++target_core_alua_tg_pt_gp_store_attr_alua_support_transitioning_45862 target_core_alua_tg_pt_gp_store_attr_alua_support_transitioning 0-3 45862 NULL ++isdn_write_45863 isdn_write 3-0 45863 NULL ++align_show_45871 align_show 0 45871 NULL ++hung_up_tty_read_45873 hung_up_tty_read 0-3 45873 NULL ++bluetooth_write_45874 bluetooth_write 0 45874 NULL ++acpi_power_on_list_45877 acpi_power_on_list 0 45877 NULL nohasharray ++m48t86_rtc_read_time_45877 m48t86_rtc_read_time 0 45877 &acpi_power_on_list_45877 ++shared_cpu_map_show_45879 shared_cpu_map_show 0 45879 NULL ++_transport_get_expander_phy_error_log_45882 _transport_get_expander_phy_error_log 0 45882 NULL nohasharray ++get_rdac_req_45882 get_rdac_req 3 45882 &_transport_get_expander_phy_error_log_45882 ++cbaf_wusb_device_band_groups_show_45884 cbaf_wusb_device_band_groups_show 0 45884 NULL nohasharray ++xgmac_open_45884 xgmac_open 0 45884 &cbaf_wusb_device_band_groups_show_45884 ++ocfs2_xattr_block_find_45891 ocfs2_xattr_block_find 0 45891 NULL ++saa7134_ts_queue_setup_45892 saa7134_ts_queue_setup 0 45892 NULL ++jfs_getxattr_45893 jfs_getxattr 0 45893 NULL ++siena_mem_map_size_45901 siena_mem_map_size 0 45901 NULL nohasharray ++flat_cpu_mask_to_apicid_and_45901 flat_cpu_mask_to_apicid_and 0 45901 &siena_mem_map_size_45901 ++__svc_create_45903 __svc_create 3 45903 NULL nohasharray ++cfs_cpt_weight_45903 cfs_cpt_weight 0 45903 &__svc_create_45903 ++rtl8152_change_mtu_45911 rtl8152_change_mtu 0 45911 NULL ++wm_adsp_region_to_reg_45915 wm_adsp_region_to_reg 0-2 45915 NULL ++dbgfs_frame_45917 dbgfs_frame 3-0 45917 NULL ++lcd_read_45922 lcd_read 0-3 45922 NULL ++tda827xa_set_params_45923 tda827xa_set_params 0 45923 NULL ++hotplug_enabled_show_45924 hotplug_enabled_show 0 45924 NULL ++nf_nat_ftp_fmt_cmd_45926 nf_nat_ftp_fmt_cmd 0 45926 NULL ++host_store_raid_offload_debug_45928 host_store_raid_offload_debug 0-4 45928 NULL ++_dln2_transfer_45930 _dln2_transfer 0 45930 NULL nohasharray ++ext2_xattr_security_get_45930 ext2_xattr_security_get 0 45930 &_dln2_transfer_45930 ++request_ihex_firmware_45931 request_ihex_firmware 0 45931 NULL ++bttv_s_ctrl_45933 bttv_s_ctrl 0 45933 NULL ++alloc_mr_45935 alloc_mr 1 45935 NULL nohasharray ++dlm_id_show_45935 dlm_id_show 0 45935 &alloc_mr_45935 ++show_fan_value_45938 show_fan_value 0 45938 NULL ++wl12xx_hw_init_45944 wl12xx_hw_init 0 45944 NULL ++brcmf_netdev_open_45945 brcmf_netdev_open 0 45945 NULL ++show_sas_end_dev_I_T_nexus_loss_timeout_45946 show_sas_end_dev_I_T_nexus_loss_timeout 0 45946 NULL ++cx231xx_gpio_i2c_write_45947 cx231xx_gpio_i2c_write 0 45947 NULL ++pch_i2c_readbytes_45948 pch_i2c_readbytes 0 45948 NULL ++acpi_ns_search_one_scope_45951 acpi_ns_search_one_scope 0 45951 NULL ++show_in_reg_45952 show_in_reg 0 45952 NULL nohasharray ++show_ata_dev_gscr_45952 show_ata_dev_gscr 0 45952 &show_in_reg_45952 nohasharray ++store_sched1_45952 store_sched1 4-0 45952 &show_ata_dev_gscr_45952 ++ndisc_opt_addr_space_45959 ndisc_opt_addr_space 0 45959 NULL ++set_45961 set 0 45961 NULL ++target_fabric_nacl_base_attr_show_45966 target_fabric_nacl_base_attr_show 0 45966 NULL ++sdo_streamon_45968 sdo_streamon 0 45968 NULL ++copy_to_45969 copy_to 3 45969 NULL nohasharray ++isl29125_buffer_predisable_45969 isl29125_buffer_predisable 0 45969 ©_to_45969 ++rb_simple_read_45972 rb_simple_read 3 45972 NULL ++crypto_hash_walk_done_45974 crypto_hash_walk_done 0-2 45974 NULL ++ezusb_writememory_45976 ezusb_writememory 4 45976 NULL ++ioat2_dca_count_dca_slots_45984 ioat2_dca_count_dca_slots 0 45984 NULL ++imsttfb_check_var_45988 imsttfb_check_var 0 45988 NULL ++vv6410_s_ctrl_45992 vv6410_s_ctrl 0 45992 NULL ++gether_opts_ifname_show_45993 gether_opts_ifname_show 0 45993 NULL ++ezx_pcap_putget_46000 ezx_pcap_putget 0 46000 NULL ++kobject_init_and_add_46003 kobject_init_and_add 0 46003 NULL ++dn_device_event_46004 dn_device_event 0 46004 NULL ++ci_ll_read_46006 ci_ll_read 0 46006 NULL ++rt2800pci_set_device_state_46015 rt2800pci_set_device_state 0 46015 NULL ++rt2800mmio_enable_radio_46016 rt2800mmio_enable_radio 0 46016 NULL ++snd_cx231xx_capture_trigger_46017 snd_cx231xx_capture_trigger 0 46017 NULL ++acpi_ds_method_data_set_value_46018 acpi_ds_method_data_set_value 0 46018 NULL ++lpfc_board_mode_store_46023 lpfc_board_mode_store 0-4 46023 NULL ++show_iface_header_digest_46027 show_iface_header_digest 0 46027 NULL ++sierra_setup_urb_46029 sierra_setup_urb 5 46029 NULL ++fnic_reset_stats_read_46030 fnic_reset_stats_read 3-0 46030 NULL nohasharray ++get_free_entries_46030 get_free_entries 1 46030 &fnic_reset_stats_read_46030 ++__access_remote_vm_46031 __access_remote_vm 0 46031 NULL ++nilfs_bmap_do_delete_46035 nilfs_bmap_do_delete 0 46035 NULL ++arkfb_check_var_46041 arkfb_check_var 0 46041 NULL ++ipvlan_init_46044 ipvlan_init 0 46044 NULL ++rtl2832_sdr_buf_prepare_46045 rtl2832_sdr_buf_prepare 0 46045 NULL ++lpfc_enable_bg_show_46046 lpfc_enable_bg_show 0 46046 NULL ++socket_create_46047 socket_create 0 46047 NULL ++lg4ff_range_show_46048 lg4ff_range_show 0 46048 NULL ++da9052_bat_read_capacity_46049 da9052_bat_read_capacity 0 46049 NULL ++acpi_register_gsi_xen_hvm_46052 acpi_register_gsi_xen_hvm 2 46052 NULL nohasharray ++acpi_subsys_prepare_46052 acpi_subsys_prepare 0 46052 &acpi_register_gsi_xen_hvm_46052 ++i2c_smbus_read_i2c_block_data_46059 i2c_smbus_read_i2c_block_data 0 46059 NULL nohasharray ++line6_midibuf_bytes_used_46059 line6_midibuf_bytes_used 0 46059 &i2c_smbus_read_i2c_block_data_46059 ++dma_tx_errors_read_46060 dma_tx_errors_read 3-0 46060 NULL ++apds990x_rate_store_46062 apds990x_rate_store 0-4 46062 NULL ++slhc_toss_46066 slhc_toss 0 46066 NULL ++in_use_show_46075 in_use_show 0 46075 NULL ++sel_commit_bools_write_46077 sel_commit_bools_write 3-0 46077 NULL ++mgmt_remote_name_46080 mgmt_remote_name 7 46080 NULL ++__kmem_cache_shrink_46083 __kmem_cache_shrink 0 46083 NULL ++ncp_add_request_46084 ncp_add_request 0 46084 NULL ++unlock_lock_46087 unlock_lock 0 46087 NULL ++vfio_config_do_rw_46091 vfio_config_do_rw 0 46091 NULL ++ata_host_alloc_46094 ata_host_alloc 2 46094 NULL ++store_46095 store 0 46095 NULL ++ppp_asynctty_write_46098 ppp_asynctty_write 0 46098 NULL ++gsmi_reboot_callback_46099 gsmi_reboot_callback 0 46099 NULL ++niu_enable_interrupts_46100 niu_enable_interrupts 0 46100 NULL ++arizona_set_irq_wake_46101 arizona_set_irq_wake 2 46101 NULL ++il3945_ucode_general_stats_read_46111 il3945_ucode_general_stats_read 3-0 46111 NULL ++nilfs_segctor_do_construct_46112 nilfs_segctor_do_construct 0 46112 NULL ++C_SYSC_writev_46113 C_SYSC_writev 3 46113 NULL ++b43legacy_op_start_46114 b43legacy_op_start 0 46114 NULL ++sysfs_rename_link_46118 sysfs_rename_link 0 46118 NULL ++mlx4_ib_alloc_fast_reg_page_list_46119 mlx4_ib_alloc_fast_reg_page_list 2 46119 NULL ++pci_netmos_9900_numports_46121 pci_netmos_9900_numports 0 46121 NULL ++device_remove_lockspace_46124 device_remove_lockspace 0 46124 NULL ++ds2781_read_param_eeprom_bin_46126 ds2781_read_param_eeprom_bin 6-5-0 46126 NULL ++r820t_set_tv_standard_46138 r820t_set_tv_standard 0 46138 NULL nohasharray ++rtw_buf_update_46138 rtw_buf_update 4 46138 &r820t_set_tv_standard_46138 ++twl6030_pwm_enable_46139 twl6030_pwm_enable 0 46139 NULL nohasharray ++gpio_keys_store_disabled_switches_46139 gpio_keys_store_disabled_switches 0-4 46139 &twl6030_pwm_enable_46139 ++nilfs_btree_assign_p_46142 nilfs_btree_assign_p 0 46142 NULL ++elan_i2c_get_checksum_46148 elan_i2c_get_checksum 0 46148 NULL ++set_temp_auto_temp_min_46149 set_temp_auto_temp_min 0-4 46149 NULL ++ddp_clear_map_46152 ddp_clear_map 4 46152 NULL ++dgram_bind_46155 dgram_bind 0 46155 NULL ++__netlink_change_ngroups_46156 __netlink_change_ngroups 2 46156 NULL ++si470x_set_register_46160 si470x_set_register 0 46160 NULL ++ov9740_reg_write_array_46162 ov9740_reg_write_array 0 46162 NULL ++qla2x00_sysfs_write_nvram_46166 qla2x00_sysfs_write_nvram 0-6-5 46166 NULL ++pcf8583_rtc_read_time_46169 pcf8583_rtc_read_time 0 46169 NULL ++write_index_46171 write_index 0 46171 NULL ++open_46177 open 0 46177 NULL ++bh1770_chip_id_show_46179 bh1770_chip_id_show 0 46179 NULL ++mlx4_bitmap_alloc_46180 mlx4_bitmap_alloc 0 46180 NULL ++snd_opl3_load_patch_46181 snd_opl3_load_patch 0 46181 NULL ++twl_direction_out_46182 twl_direction_out 0-2 46182 NULL nohasharray ++sync_inode_metadata_46182 sync_inode_metadata 0 46182 &twl_direction_out_46182 ++vxge_os_dma_malloc_46184 vxge_os_dma_malloc 2 46184 NULL ++kszphy_config_init_46188 kszphy_config_init 0 46188 NULL ++ax25_device_event_46189 ax25_device_event 0 46189 NULL ++atmel_set_mac_address_46192 atmel_set_mac_address 0 46192 NULL ++fq_resize_46195 fq_resize 2 46195 NULL ++qlcnic_82xx_mq_intrpt_46196 qlcnic_82xx_mq_intrpt 0 46196 NULL ++show_fc_host_driver_version_46197 show_fc_host_driver_version 0 46197 NULL nohasharray ++show_current_ref_46197 show_current_ref 0 46197 &show_fc_host_driver_version_46197 nohasharray ++set_tr_backlight_status_46197 set_tr_backlight_status 0 46197 &show_current_ref_46197 nohasharray ++add_conn_list_46197 add_conn_list 3-0 46197 &set_tr_backlight_status_46197 ++appid_show_46198 appid_show 0 46198 NULL ++diolan_i2c_repeated_start_46200 diolan_i2c_repeated_start 0 46200 NULL ++ebt_do_table_46203 ebt_do_table 0 46203 NULL ++typhoon_issue_command_46204 typhoon_issue_command 0 46204 NULL ++compat_SyS_recvfrom_46205 compat_SyS_recvfrom 3 46205 NULL ++i2400m_op_msg_from_user_46213 i2400m_op_msg_from_user 4 46213 NULL ++tm6000_i2c_recv_regs_46215 tm6000_i2c_recv_regs 5-0 46215 NULL ++buffer_prepare_46216 buffer_prepare 0 46216 NULL ++acpi_ex_create_event_46218 acpi_ex_create_event 0 46218 NULL nohasharray ++o2hb_region_start_block_write_46218 o2hb_region_start_block_write 0-3 46218 &acpi_ex_create_event_46218 nohasharray ++dsp_write_46218 dsp_write 0-2 46218 &o2hb_region_start_block_write_46218 ++vcan_change_mtu_46220 vcan_change_mtu 0 46220 NULL ++hib_wait_on_bio_chain_46221 hib_wait_on_bio_chain 0 46221 NULL ++hash_netiface4_expire_46226 hash_netiface4_expire 4 46226 NULL ++tipc_msg_create_46227 tipc_msg_create 4-3 46227 NULL ++__get_any_page_46230 __get_any_page 0 46230 NULL ++qla2x00_issue_lip_46231 qla2x00_issue_lip 0 46231 NULL ++roccat_common2_sysfs_read_profile_buttons_46234 roccat_common2_sysfs_read_profile_buttons 0-5-6 46234 NULL nohasharray ++ovl_copy_up_one_46234 ovl_copy_up_one 0 46234 &roccat_common2_sysfs_read_profile_buttons_46234 ++ns_ack_interrupt_46236 ns_ack_interrupt 0 46236 NULL ++show_in_min_46238 show_in_min 0 46238 NULL ++mlx4_buf_alloc_46239 mlx4_buf_alloc 2 46239 NULL ++xen_setup_msi_irqs_46245 xen_setup_msi_irqs 2 46245 NULL ++mpi_read_raw_data_46248 mpi_read_raw_data 2 46248 NULL ++nf_hook_46249 nf_hook 0 46249 NULL nohasharray ++ufx_config_pix_clk_46249 ufx_config_pix_clk 0 46249 &nf_hook_46249 ++arvo_sysfs_read_info_46251 arvo_sysfs_read_info 0-5-6 46251 NULL ++gfs2_block_truncate_page_46252 gfs2_block_truncate_page 0 46252 NULL ++acpi_ds_begin_method_execution_46255 acpi_ds_begin_method_execution 0 46255 NULL ++usbatm_atm_open_46260 usbatm_atm_open 0 46260 NULL ++wafwdt_write_46262 wafwdt_write 0-3 46262 NULL ++acpi_device_get_power_46263 acpi_device_get_power 0 46263 NULL ++nf_nat_ftp_46265 nf_nat_ftp 6 46265 NULL ++drm_dp_mst_i2c_xfer_46266 drm_dp_mst_i2c_xfer 0-3 46266 NULL ++nilfs_segctor_begin_construction_46268 nilfs_segctor_begin_construction 0 46268 NULL ++netvsc_set_mac_addr_46269 netvsc_set_mac_addr 0 46269 NULL ++__qlcnic_sriov_issue_cmd_46273 __qlcnic_sriov_issue_cmd 0 46273 NULL ++pem_show_input_46277 pem_show_input 0 46277 NULL nohasharray ++ReadReg_46277 ReadReg 0 46277 &pem_show_input_46277 ++show_constraint_name_46285 show_constraint_name 0 46285 NULL ++tcp_sendmsg_fastopen_46288 tcp_sendmsg_fastopen 0 46288 NULL ++set_temp_auto_point1_temp_46289 set_temp_auto_point1_temp 0-4 46289 NULL ++zs_cpu_notifier_46295 zs_cpu_notifier 0 46295 NULL ++netdev_get_eeprom_len_46297 netdev_get_eeprom_len 0 46297 NULL ++urb_enqueue_46301 urb_enqueue 0 46301 NULL ++pep_alloc_skb_46303 pep_alloc_skb 3 46303 NULL ++atmtcp_c_send_46305 atmtcp_c_send 0 46305 NULL ++store_led_46310 store_led 0-4 46310 NULL ++sg_proc_write_dressz_46316 sg_proc_write_dressz 3-0 46316 NULL ++mos7720_write_46318 mos7720_write 0-4 46318 NULL nohasharray ++lpfc_debugfs_dumpDataDif_write_46318 lpfc_debugfs_dumpDataDif_write 0-3 46318 &mos7720_write_46318 ++C_SYSC_ppoll_46319 C_SYSC_ppoll 2 46319 NULL ++qlcnic_83xx_sysfs_flash_bulk_write_46320 qlcnic_83xx_sysfs_flash_bulk_write 4 46320 NULL ++fm_tx_set_preemph_filter_46323 fm_tx_set_preemph_filter 0 46323 NULL ++__dquot_alloc_space_46324 __dquot_alloc_space 0 46324 NULL ++__hwahc_dev_set_key_46328 __hwahc_dev_set_key 5 46328 NULL nohasharray ++compat_SyS_readv_46328 compat_SyS_readv 3 46328 &__hwahc_dev_set_key_46328 ++netlbl_sock_setattr_46330 netlbl_sock_setattr 0 46330 NULL ++gs_can_open_46335 gs_can_open 0 46335 NULL ++ds2780_get_control_register_46338 ds2780_get_control_register 0 46338 NULL ++get_ata_xfer_names_46339 get_ata_xfer_names 0 46339 NULL nohasharray ++show_ipv4_iface_tos_en_46339 show_ipv4_iface_tos_en 0 46339 &get_ata_xfer_names_46339 ++snd_seq_ioctl_get_client_info_46340 snd_seq_ioctl_get_client_info 0 46340 NULL nohasharray ++store_spi_transport_qas_46340 store_spi_transport_qas 0-4 46340 &snd_seq_ioctl_get_client_info_46340 ++netlbl_cfg_unlbl_static_add_46342 netlbl_cfg_unlbl_static_add 0 46342 NULL nohasharray ++rtc_set_alarm_46342 rtc_set_alarm 0 46342 &netlbl_cfg_unlbl_static_add_46342 ++mpt_config_46343 mpt_config 0 46343 NULL ++netxen_sysfs_validate_mem_46345 netxen_sysfs_validate_mem 0 46345 NULL ++show_wr_sect_46346 show_wr_sect 0 46346 NULL ++xen_alloc_pmd_46347 xen_alloc_pmd 2 46347 NULL ++show_fnode_targetname_46350 show_fnode_targetname 0 46350 NULL ++iwl_dbgfs_chain_noise_read_46355 iwl_dbgfs_chain_noise_read 3-0 46355 NULL ++batadv_iv_ogm_queue_add_46357 batadv_iv_ogm_queue_add 3 46357 NULL ++show_icon_46360 show_icon 4-0 46360 NULL ++smk_write_direct_46363 smk_write_direct 3-0 46363 NULL nohasharray ++qlcnic_get_eswitch_stats_46363 qlcnic_get_eswitch_stats 0 46363 &smk_write_direct_46363 ++vid_cap_start_streaming_46365 vid_cap_start_streaming 0 46365 NULL ++btrfs_lookup_bio_sums_46367 btrfs_lookup_bio_sums 0 46367 NULL nohasharray ++flow_cache_cpu_prepare_46367 flow_cache_cpu_prepare 0 46367 &btrfs_lookup_bio_sums_46367 nohasharray ++store_pwm_sensor_46367 store_pwm_sensor 0-4 46367 &flow_cache_cpu_prepare_46367 ++csio_disable_port_46375 csio_disable_port 0-4 46375 NULL ++via_build_controls_46378 via_build_controls 0 46378 NULL ++ubi_dump_flash_46381 ubi_dump_flash 4 46381 NULL ++rng_get_data_46382 rng_get_data 0 46382 NULL ++fib_nlmsg_size_46383 fib_nlmsg_size 0 46383 NULL ++ext2_xattr_user_set_46390 ext2_xattr_user_set 0 46390 NULL ++sfi_table_show_46392 sfi_table_show 6 46392 NULL ++zatm_change_qos_46395 zatm_change_qos 0 46395 NULL ++thermal_cooling_device_type_show_46399 thermal_cooling_device_type_show 0 46399 NULL ++led_invert_show_46400 led_invert_show 0 46400 NULL nohasharray ++b43_op_start_46400 b43_op_start 0 46400 &led_invert_show_46400 ++apds990x_prox_threshold_store_46402 apds990x_prox_threshold_store 0-4 46402 NULL ++hotkey_get_wlsw_46403 hotkey_get_wlsw 0 46403 NULL ++c2port_show_dev_id_46410 c2port_show_dev_id 0 46410 NULL ++i2c_hid_output_raw_report_46413 i2c_hid_output_raw_report 0-3 46413 NULL nohasharray ++w1_master_attribute_show_slave_count_46413 w1_master_attribute_show_slave_count 0 46413 &i2c_hid_output_raw_report_46413 ++addr_to_user_46418 addr_to_user 0 46418 NULL ++vmbus_sendpacket_pagebuffer_46420 vmbus_sendpacket_pagebuffer 0 46420 NULL ++iscsi_tpg_param_show_ErrorRecoveryLevel_46422 iscsi_tpg_param_show_ErrorRecoveryLevel 0 46422 NULL ++bcm54xx_exp_read_46423 bcm54xx_exp_read 0 46423 NULL ++proto_show_46426 proto_show 0 46426 NULL nohasharray ++wl18xx_acx_host_if_cfg_bitmap_46426 wl18xx_acx_host_if_cfg_bitmap 0 46426 &proto_show_46426 ++ttm_page_pool_get_pages_46431 ttm_page_pool_get_pages 0-5 46431 NULL ++cfs_power2_roundup_46433 cfs_power2_roundup 0-1 46433 NULL ++srpt_tpg_attrib_show_srp_max_rsp_size_46434 srpt_tpg_attrib_show_srp_max_rsp_size 0 46434 NULL ++wdata_alloc_and_fillpages_46437 wdata_alloc_and_fillpages 1 46437 NULL ++ds2780_battery_io_46439 ds2780_battery_io 3-4 46439 NULL ++sctp_send_asconf_add_ip_46442 sctp_send_asconf_add_ip 0 46442 NULL ++roccat_common2_sysfs_write_reset_46444 roccat_common2_sysfs_write_reset 0-6-5 46444 NULL ++nilfs_commit_chunk_46445 nilfs_commit_chunk 3-4 46445 NULL ++cp210x_set_config_46447 cp210x_set_config 0-4 46447 NULL ++em2800_i2c_check_for_device_46448 em2800_i2c_check_for_device 0 46448 NULL ++show_temp_pwm_enable_46454 show_temp_pwm_enable 0 46454 NULL ++af_alg_cmsg_send_46457 af_alg_cmsg_send 0 46457 NULL ++il_dbgfs_clear_traffic_stats_write_46458 il_dbgfs_clear_traffic_stats_write 3-0 46458 NULL ++show_zero_req_lim_46462 show_zero_req_lim 0 46462 NULL ++add_to_waiters_46464 add_to_waiters 0 46464 NULL ++v9fs_cache_inode_get_key_46471 v9fs_cache_inode_get_key 0 46471 NULL ++gether_opts_dev_addr_show_46477 gether_opts_dev_addr_show 0 46477 NULL ++ipath_sdma_get_complete_46485 ipath_sdma_get_complete 0 46485 NULL ++asm_vid_show_46489 asm_vid_show 0 46489 NULL ++bfad_im_drv_version_show_46493 bfad_im_drv_version_show 0 46493 NULL nohasharray ++store_multicast_fast_leave_46493 store_multicast_fast_leave 0 46493 &bfad_im_drv_version_show_46493 ++llcp_sock_listen_46495 llcp_sock_listen 0 46495 NULL ++security_preserve_bools_46496 security_preserve_bools 0 46496 NULL ++fill_in_write_vector_46498 fill_in_write_vector 0 46498 NULL nohasharray ++vringh_complete_multi_user_46498 vringh_complete_multi_user 3 46498 &fill_in_write_vector_46498 ++_bond_option_arp_ip_target_add_46499 _bond_option_arp_ip_target_add 0 46499 NULL ++iwl_dvm_send_cmd_46505 iwl_dvm_send_cmd 0 46505 NULL ++qib_dma_map_page_46507 qib_dma_map_page 0-3 46507 NULL ++show_pwm_auto_pwm_minctl_46509 show_pwm_auto_pwm_minctl 0 46509 NULL nohasharray ++ds2780_set_pio_pin_46509 ds2780_set_pio_pin 0-4 46509 &show_pwm_auto_pwm_minctl_46509 ++iscsi_nacl_attrib_store_random_datain_seq_offsets_46510 iscsi_nacl_attrib_store_random_datain_seq_offsets 0-3 46510 NULL nohasharray ++pin_code_reply_46510 pin_code_reply 4 46510 &iscsi_nacl_attrib_store_random_datain_seq_offsets_46510 ++set_temp0_max_46511 set_temp0_max 0-4 46511 NULL ++mthca_alloc_cq_buf_46512 mthca_alloc_cq_buf 3 46512 NULL ++kmsg_read_46514 kmsg_read 3-0 46514 NULL nohasharray ++nouveau_drm_ioctl_46514 nouveau_drm_ioctl 2 46514 &kmsg_read_46514 ++mlx4_SET_PORT_VXLAN_46515 mlx4_SET_PORT_VXLAN 0 46515 NULL ++nlm_end_grace_write_46517 nlm_end_grace_write 3-0 46517 NULL nohasharray ++quota_quantum_store_46517 quota_quantum_store 3-0 46517 &nlm_end_grace_write_46517 ++pptp_bind_46520 pptp_bind 0 46520 NULL ++isoc_init_46521 isoc_init 0 46521 NULL ++bdx_rxdb_create_46525 bdx_rxdb_create 1 46525 NULL ++show_iface_data_digest_46528 show_iface_data_digest 0 46528 NULL ++snd_hda_gen_parse_auto_config_46535 snd_hda_gen_parse_auto_config 0 46535 NULL nohasharray ++socket_recvmsg_46535 socket_recvmsg 0 46535 &snd_hda_gen_parse_auto_config_46535 ++check_connect_46536 check_connect 0 46536 NULL ++nes_show_wqm_quanta_46540 nes_show_wqm_quanta 0 46540 NULL nohasharray ++rt2x00lib_initialize_46540 rt2x00lib_initialize 0 46540 &nes_show_wqm_quanta_46540 ++b43_dma_mapping_error_46543 b43_dma_mapping_error 2 46543 NULL ++raid_show_state_46545 raid_show_state 0 46545 NULL ++snd_trident_trigger_46546 snd_trident_trigger 0 46546 NULL nohasharray ++vfs_statfs_46546 vfs_statfs 0 46546 &snd_trident_trigger_46546 ++target_core_store_alua_lu_gp_46548 target_core_store_alua_lu_gp 0-3 46548 NULL ++assign_firmware_buf_46554 assign_firmware_buf 0 46554 NULL ++vfs_setxattr_46556 vfs_setxattr 0 46556 NULL ++cpuidle_state_show_46561 cpuidle_state_show 0 46561 NULL ++o2hb_region_block_bytes_write_46568 o2hb_region_block_bytes_write 0-3 46568 NULL ++check_syslog_permissions_46572 check_syslog_permissions 0 46572 NULL ++check_auto_mic_availability_46573 check_auto_mic_availability 0 46573 NULL ++dn_current_mss_46574 dn_current_mss 0 46574 NULL ++nr_header_46575 nr_header 0 46575 NULL ++store_46576 store 0-3 46576 NULL ++serverworks_create_gatt_pages_46582 serverworks_create_gatt_pages 1 46582 NULL ++set_min_uA_46584 set_min_uA 0-4 46584 NULL ++__iwl_up_46589 __iwl_up 0 46589 NULL ++snd_compr_write_data_46592 snd_compr_write_data 3-0 46592 NULL ++show_mute_46600 show_mute 0 46600 NULL nohasharray ++mode_store_46600 mode_store 0-4 46600 &show_mute_46600 ++multicast_querier_show_46605 multicast_querier_show 0 46605 NULL ++il3945_stats_flag_46606 il3945_stats_flag 3-0 46606 NULL nohasharray ++sxgbe_get_regs_len_46606 sxgbe_get_regs_len 0 46606 &il3945_stats_flag_46606 ++snd_intel8x0_pcm_prepare_46609 snd_intel8x0_pcm_prepare 0 46609 NULL nohasharray ++brcmf_fil_iovar_int_set_46609 brcmf_fil_iovar_int_set 0 46609 &snd_intel8x0_pcm_prepare_46609 ++dead_write_46612 dead_write 0 46612 NULL nohasharray ++tg3_phy_reset_5703_4_5_46612 tg3_phy_reset_5703_4_5 0 46612 &dead_write_46612 ++stream_start_46613 stream_start 0 46613 NULL nohasharray ++nilfs_segctor_feed_segment_46613 nilfs_segctor_feed_segment 0 46613 &stream_start_46613 ++f_bringup_serdes_46614 f_bringup_serdes 0 46614 NULL ++vscnprintf_46617 vscnprintf 0-2 46617 NULL ++acpi_ec_write_46618 acpi_ec_write 0 46618 NULL ++acpi_parse_entries_46621 acpi_parse_entries 0 46621 NULL ++delayed_allocation_blocks_show_46622 delayed_allocation_blocks_show 0 46622 NULL ++get_mode_46623 get_mode 0 46623 NULL ++request_key_async_with_auxdata_46624 request_key_async_with_auxdata 4 46624 NULL ++dsense_show_46626 dsense_show 0 46626 NULL ++il_set_mode_46630 il_set_mode 0 46630 NULL ++show_fcoe_fcf_device_vlan_id_46631 show_fcoe_fcf_device_vlan_id 0 46631 NULL ++regmap_read_46634 regmap_read 0 46634 NULL ++bh1770_prox_enable_store_46639 bh1770_prox_enable_store 0-4 46639 NULL ++__c2port_store_flash_access_46641 __c2port_store_flash_access 0 46641 NULL ++pci_enable_device_46642 pci_enable_device 0 46642 NULL ++show_session_param_ISCSI_PARAM_MAX_BURST_46644 show_session_param_ISCSI_PARAM_MAX_BURST 0 46644 NULL ++__sock_sendmsg_46647 __sock_sendmsg 0-4 46647 NULL ++vfs_getxattr_alloc_46649 vfs_getxattr_alloc 0 46649 NULL ++av7110_ipack_init_46655 av7110_ipack_init 2 46655 NULL nohasharray ++powr1220_read_adc_46655 powr1220_read_adc 0 46655 &av7110_ipack_init_46655 ++fanout_add_46656 fanout_add 0 46656 NULL ++queue_max_sectors_store_46658 queue_max_sectors_store 3-0 46658 NULL ++read_short_reg_46669 read_short_reg 0 46669 NULL ++e1000_tx_map_46672 e1000_tx_map 4 46672 NULL ++stream_pause_46673 stream_pause 0 46673 NULL ++ubifs_writepage_46678 ubifs_writepage 0 46678 NULL ++msr_read_46679 msr_read 0-3 46679 NULL ++__uncore_mask_rnid4_show_46681 __uncore_mask_rnid4_show 0 46681 NULL ++l2cap_create_le_flowctl_pdu_46682 l2cap_create_le_flowctl_pdu 3 46682 NULL ++l2cap_parse_conf_rsp_46683 l2cap_parse_conf_rsp 0 46683 NULL ++tx_compressed_show_46696 tx_compressed_show 0 46696 NULL ++alloc_data_packet_46698 alloc_data_packet 1 46698 NULL nohasharray ++eni_change_qos_46698 eni_change_qos 0 46698 &alloc_data_packet_46698 ++tomoyo_audit_unix_log_46699 tomoyo_audit_unix_log 0 46699 NULL ++acpi_ns_evaluate_46701 acpi_ns_evaluate 0 46701 NULL ++saa7185_init_46704 saa7185_init 0 46704 NULL ++xenvif_change_mtu_46705 xenvif_change_mtu 0 46705 NULL ++__ilog2_u32_46706 __ilog2_u32 0 46706 NULL ++blk_mq_alloc_tag_set_46707 blk_mq_alloc_tag_set 0 46707 NULL ++iwl_send_phy_db_cmd_46708 iwl_send_phy_db_cmd 0 46708 NULL ++erst_dbg_write_46715 erst_dbg_write 3-0 46715 NULL ++sctp_side_effects_46716 sctp_side_effects 0 46716 NULL ++macvlan_dev_netpoll_setup_46717 macvlan_dev_netpoll_setup 0 46717 NULL ++wl1271_rx_filter_alloc_field_46721 wl1271_rx_filter_alloc_field 5 46721 NULL ++bcmgenet_set_mac_addr_46722 bcmgenet_set_mac_addr 0 46722 NULL ++ov6650_cropcap_46726 ov6650_cropcap 0 46726 NULL ++pinctrl_register_map_46730 pinctrl_register_map 2 46730 NULL ++irq_domain_add_simple_46734 irq_domain_add_simple 2-3 46734 NULL ++ctnetlink_nlmsg_size_46736 ctnetlink_nlmsg_size 0 46736 NULL ++pctv452e_i2c_xfer_46737 pctv452e_i2c_xfer 0-3 46737 NULL nohasharray ++__ata_change_queue_depth_46737 __ata_change_queue_depth 0-3 46737 &pctv452e_i2c_xfer_46737 ++iwlagn_mac_add_interface_46739 iwlagn_mac_add_interface 0 46739 NULL ++read_file_tx99_46741 read_file_tx99 3-0 46741 NULL ++autofs4_wait_46750 autofs4_wait 0 46750 NULL ++bh1770_set_prox_thres_46751 bh1770_set_prox_thres 0-4 46751 NULL ++sdev_show_queue_ramp_up_period_46755 sdev_show_queue_ramp_up_period 0 46755 NULL ++rj54n1_set_clock_46757 rj54n1_set_clock 0 46757 NULL ++store_engine1_leds_46758 store_engine1_leds 4-0 46758 NULL ++show_fan_status_46761 show_fan_status 0 46761 NULL ++mwl8k_init_firmware_46764 mwl8k_init_firmware 0 46764 NULL ++hest_ghes_dev_register_46766 hest_ghes_dev_register 1 46766 NULL ++inet6_create_46770 inet6_create 0 46770 NULL ++fc0013_set_vhf_track_46773 fc0013_set_vhf_track 0 46773 NULL ++int_hw_irq_en_46776 int_hw_irq_en 3-0 46776 NULL ++regcache_lzo_sync_46777 regcache_lzo_sync 2 46777 NULL ++ov2640_s_ctrl_46785 ov2640_s_ctrl 0 46785 NULL ++__hdaps_read_pair_46792 __hdaps_read_pair 0 46792 NULL ++host_show_commands_outstanding_46795 host_show_commands_outstanding 0 46795 NULL ++show_max_min_46796 show_max_min 0 46796 NULL ++show_fc_host_supported_speeds_46800 show_fc_host_supported_speeds 0 46800 NULL ++ixgbe_read_mbx_pf_46802 ixgbe_read_mbx_pf 0 46802 NULL ++proc_tgid_net_getattr_46803 proc_tgid_net_getattr 0 46803 NULL ++niu_tx_cs_sng_poll_46804 niu_tx_cs_sng_poll 0 46804 NULL ++show_session_param_ISCSI_PARAM_ERL_46813 show_session_param_ISCSI_PARAM_ERL 0 46813 NULL ++ath6kl_wmi_set_roam_mode_cmd_46817 ath6kl_wmi_set_roam_mode_cmd 0 46817 NULL ++writefn_46819 writefn 0-3 46819 NULL ++show_ata_port_nr_pmp_links_46824 show_ata_port_nr_pmp_links 0 46824 NULL ++xfs_iroot_realloc_46826 xfs_iroot_realloc 2 46826 NULL ++snd_sonicvibes_capture_trigger_46827 snd_sonicvibes_capture_trigger 0 46827 NULL ++fib_netdev_event_46830 fib_netdev_event 0 46830 NULL ++ks959_net_open_46833 ks959_net_open 0 46833 NULL ++iwl_run_init_mvm_ucode_46835 iwl_run_init_mvm_ucode 0 46835 NULL ++show_pcm_class_46836 show_pcm_class 0 46836 NULL ++security_validtrans_handle_fail_46843 security_validtrans_handle_fail 0 46843 NULL ++kexec_crash_size_show_46847 kexec_crash_size_show 0 46847 NULL ++mxt_update_fw_store_46849 mxt_update_fw_store 0-4 46849 NULL ++lola_set_clock_index_46850 lola_set_clock_index 0 46850 NULL ++show_conn_param_ISCSI_PARAM_MAX_RECV_DLENGTH_46851 show_conn_param_ISCSI_PARAM_MAX_RECV_DLENGTH 0 46851 NULL ++spi_async_46857 spi_async 0 46857 NULL ++scan_commit_lists_46860 scan_commit_lists 0 46860 NULL ++edac_device_ctl_log_ce_show_46861 edac_device_ctl_log_ce_show 0 46861 NULL ++vsnprintf_46863 vsnprintf 0 46863 NULL ++ican3_send_inquiry_46865 ican3_send_inquiry 0 46865 NULL nohasharray ++__uncore_filter_opc_show_46865 __uncore_filter_opc_show 0 46865 &ican3_send_inquiry_46865 nohasharray ++store_spi_revalidate_46865 store_spi_revalidate 0-4 46865 &__uncore_filter_opc_show_46865 ++restart_array_46866 restart_array 0 46866 NULL ++regulatory_hint_46868 regulatory_hint 0 46868 NULL ++nouveau_hwmon_emergency_temp_46870 nouveau_hwmon_emergency_temp 0 46870 NULL nohasharray ++swiotlb_map_sg_46870 swiotlb_map_sg 3 46870 &nouveau_hwmon_emergency_temp_46870 ++sip_sprintf_addr_46872 sip_sprintf_addr 0 46872 NULL ++rvmalloc_46873 rvmalloc 1 46873 NULL ++show_telclock_version_46874 show_telclock_version 0 46874 NULL nohasharray ++qp_memcpy_from_queue_iov_46874 qp_memcpy_from_queue_iov 5-4 46874 &show_telclock_version_46874 ++lov_iocontrol_46876 lov_iocontrol 3 46876 NULL ++loop_attr_do_show_sizelimit_46878 loop_attr_do_show_sizelimit 0 46878 NULL ++hpi_read_word_nolock_46881 hpi_read_word_nolock 0 46881 NULL ++show_thresh_46884 show_thresh 0 46884 NULL nohasharray ++lp8788_read_multi_bytes_46884 lp8788_read_multi_bytes 0 46884 &show_thresh_46884 ++lpfc_sli4_protocol_show_46888 lpfc_sli4_protocol_show 0 46888 NULL ++show_conn_param_ISCSI_PARAM_LOCAL_PORT_46890 show_conn_param_ISCSI_PARAM_LOCAL_PORT 0 46890 NULL ++fcoe_str_to_dev_loss_46893 fcoe_str_to_dev_loss 0 46893 NULL ++ixgbe_dbg_reg_ops_write_46895 ixgbe_dbg_reg_ops_write 3-0 46895 NULL nohasharray ++crypto_ablkcipher_decrypt_46895 crypto_ablkcipher_decrypt 0 46895 &ixgbe_dbg_reg_ops_write_46895 ++nfs4_delay_46897 nfs4_delay 0 46897 NULL nohasharray ++__bch_btree_map_nodes_46897 __bch_btree_map_nodes 0 46897 &nfs4_delay_46897 ++ol_dqblk_off_46904 ol_dqblk_off 2 46904 NULL ++ieee80211_if_fmt_power_mode_46906 ieee80211_if_fmt_power_mode 3 46906 NULL ++crc32c_intel_setkey_46907 crc32c_intel_setkey 0 46907 NULL ++dgram_bind_46908 dgram_bind 0 46908 NULL ++store_prochot_override_46909 store_prochot_override 0-4 46909 NULL ++store_46910 store 0-2 46910 NULL ++sis630_transaction_46913 sis630_transaction 0 46913 NULL ++digital_skb_alloc_46914 digital_skb_alloc 2 46914 NULL ++affs_write_begin_ofs_46916 affs_write_begin_ofs 0 46916 NULL ++wlcore_alloc_hw_46917 wlcore_alloc_hw 3-1 46917 NULL ++igbvf_open_46920 igbvf_open 0 46920 NULL ++vortex_up_46921 vortex_up 0 46921 NULL nohasharray ++cx_auto_build_controls_46921 cx_auto_build_controls 0 46921 &vortex_up_46921 ++fb_write_46924 fb_write 3-0 46924 NULL ++i915_gem_check_olr_46925 i915_gem_check_olr 0 46925 NULL ++il_dbgfs_ucode_general_stats_read_46936 il_dbgfs_ucode_general_stats_read 0-3 46936 NULL ++vprbrd_i2c_xfer_46943 vprbrd_i2c_xfer 0-3 46943 NULL ++fuse_direct_io_46949 fuse_direct_io 0 46949 NULL nohasharray ++__sctp_setsockopt_connectx_46949 __sctp_setsockopt_connectx 0-3 46949 &fuse_direct_io_46949 ++qla4xxx_post_aen_work_46953 qla4xxx_post_aen_work 3 46953 NULL nohasharray ++ntfs_truncate_46953 ntfs_truncate 0 46953 &qla4xxx_post_aen_work_46953 ++coda_fsync_46958 coda_fsync 0 46958 NULL ++store_spi_transport_max_width_46960 store_spi_transport_max_width 0-4 46960 NULL ++lp_wait_ready_46962 lp_wait_ready 0 46962 NULL ++SYSC_poll_46965 SYSC_poll 2 46965 NULL nohasharray ++snd_rme32_capture_prepare_46965 snd_rme32_capture_prepare 0 46965 &SYSC_poll_46965 ++lbs_start_iface_46973 lbs_start_iface 0 46973 NULL ++enc28j60_net_open_46974 enc28j60_net_open 0 46974 NULL ++mgmt_pending_add_46976 mgmt_pending_add 5 46976 NULL ++srp_alloc_req_data_46981 srp_alloc_req_data 0 46981 NULL ++lec_atm_send_46990 lec_atm_send 0 46990 NULL ++user_set_46991 user_set 0 46991 NULL ++sel_write_bool_46996 sel_write_bool 3-0 46996 NULL nohasharray ++rj54n1_sensor_scale_46996 rj54n1_sensor_scale 0 46996 &sel_write_bool_46996 nohasharray ++ds2780_write_user_eeprom_bin_46996 ds2780_write_user_eeprom_bin 6-5-0 46996 &rj54n1_sensor_scale_46996 nohasharray ++enabled_store_46996 enabled_store 0-4 46996 &ds2780_write_user_eeprom_bin_46996 ++megasas_fw_crash_buffer_size_show_46998 megasas_fw_crash_buffer_size_show 0 46998 NULL nohasharray ++usb_pcwd_write_46998 usb_pcwd_write 0-3 46998 &megasas_fw_crash_buffer_size_show_46998 ++blk_rq_map_kern_47004 blk_rq_map_kern 4-0 47004 NULL ++x25_device_event_47006 x25_device_event 0 47006 NULL ++send_post_enqueue_47008 send_post_enqueue 0 47008 NULL ++rx_bytes_show_47011 rx_bytes_show 0 47011 NULL ++bpf_prog_realloc_47015 bpf_prog_realloc 2 47015 NULL ++ip_mc_source_47018 ip_mc_source 0 47018 NULL ++__map_single_47020 __map_single 4-3-7 47020 NULL ++usbpn_open_47021 usbpn_open 0 47021 NULL ++bonding_show_arp_all_targets_47022 bonding_show_arp_all_targets 0 47022 NULL ++cx231xx_init_bulk_47024 cx231xx_init_bulk 3-4-2-0 47024 NULL nohasharray ++ucb1400_core_probe_47024 ucb1400_core_probe 0 47024 &cx231xx_init_bulk_47024 ++show_spi_transport_max_qas_47025 show_spi_transport_max_qas 0 47025 NULL nohasharray ++__rt_schedulable_47025 __rt_schedulable 0 47025 &show_spi_transport_max_qas_47025 ++store_fan_pulses_47028 store_fan_pulses 0-4 47028 NULL ++drv_set_max_frame_retries_47029 drv_set_max_frame_retries 0 47029 NULL ++integrity_device_show_47034 integrity_device_show 0 47034 NULL ++show_v86d_47041 show_v86d 0 47041 NULL ++dib7090_tuner_xfer_47045 dib7090_tuner_xfer 0-3 47045 NULL ++isl29003_show_resolution_47047 isl29003_show_resolution 0 47047 NULL ++set_in_max0_47049 set_in_max0 0-4 47049 NULL ++wm8994_set_bits_47052 wm8994_set_bits 0 47052 NULL nohasharray ++acerhdf_get_fanstate_47052 acerhdf_get_fanstate 0 47052 &wm8994_set_bits_47052 ++final_47055 final 0 47055 NULL ++open_rx_47057 open_rx 0 47057 NULL ++dg_dispatch_as_guest_47063 dg_dispatch_as_guest 0 47063 NULL ++ltc2945_show_value_47064 ltc2945_show_value 0 47064 NULL nohasharray ++read_pod_47064 read_pod 0 47064 <c2945_show_value_47064 ++power_on_acct_show_47066 power_on_acct_show 0 47066 NULL nohasharray ++nfcmrvl_nci_recv_frame_47066 nfcmrvl_nci_recv_frame 3 47066 &power_on_acct_show_47066 ++event_trigger_regex_write_47067 event_trigger_regex_write 3 47067 NULL ++metrics_bytes_sent_show_47068 metrics_bytes_sent_show 0 47068 NULL ++mwifiex_set_mac_address_47069 mwifiex_set_mac_address 0 47069 NULL ++ufs_new_fragments_47070 ufs_new_fragments 4-5-3 47070 NULL nohasharray ++ext4_xattr_list_entries_47070 ext4_xattr_list_entries 0 47070 &ufs_new_fragments_47070 ++iscsi_stat_sess_err_attr_store_47075 iscsi_stat_sess_err_attr_store 0 47075 NULL ++pipeline_dec_packet_in_read_47076 pipeline_dec_packet_in_read 3-0 47076 NULL ++export_47078 export 0 47078 NULL ++skb_checksum_setup_ip_47081 skb_checksum_setup_ip 3 47081 NULL ++iwl_mvm_d3_test_read_47088 iwl_mvm_d3_test_read 0-3 47088 NULL ++iwl_dump_nic_event_log_47089 iwl_dump_nic_event_log 0 47089 NULL ++azx_setup_periods_47101 azx_setup_periods 0 47101 NULL nohasharray ++ipr_show_adapter_handle_47101 ipr_show_adapter_handle 0 47101 &azx_setup_periods_47101 ++pcmcia_dev_suspend_47104 pcmcia_dev_suspend 0 47104 NULL nohasharray ++ptlrpc_lprocfs_threads_max_seq_write_47104 ptlrpc_lprocfs_threads_max_seq_write 3 47104 &pcmcia_dev_suspend_47104 ++map_sg_47108 map_sg 0-3 47108 NULL nohasharray ++hih6130_update_measurements_47108 hih6130_update_measurements 0 47108 &map_sg_47108 ++ion_heap_clear_pages_47109 ion_heap_clear_pages 2 47109 NULL ++tboot_log_read_47110 tboot_log_read 3-0 47110 NULL ++carrier_show_47115 carrier_show 0 47115 NULL ++__erst_write_to_storage_47120 __erst_write_to_storage 0 47120 NULL ++ds2781_get_rsgain_register_47121 ds2781_get_rsgain_register 0 47121 NULL ++mousedev_read_47123 mousedev_read 3-0 47123 NULL ++tcm_loop_drop_nexus_47124 tcm_loop_drop_nexus 0 47124 NULL ++upcall_msg_size_47141 upcall_msg_size 0-2 47141 NULL ++acpi_ut_initialize_buffer_47143 acpi_ut_initialize_buffer 2-0 47143 NULL nohasharray ++ses_recv_diag_47143 ses_recv_diag 4 47143 &acpi_ut_initialize_buffer_47143 ++store_target_kb_47150 store_target_kb 0-4 47150 NULL ++sctp_get_port_47151 sctp_get_port 0 47151 NULL ++get_attr_rdpmc_47155 get_attr_rdpmc 0 47155 NULL ++il4965_mac_start_47159 il4965_mac_start 0 47159 NULL ++show_streaming_47160 show_streaming 0 47160 NULL ++mxms_headerlen_47161 mxms_headerlen 0 47161 NULL ++rs_sta_dbgfs_rate_scale_data_read_47165 rs_sta_dbgfs_rate_scale_data_read 3-0 47165 NULL ++sched_ilb_notifier_47166 sched_ilb_notifier 0 47166 NULL nohasharray ++dps1_insert_key_47166 dps1_insert_key 0-4 47166 &sched_ilb_notifier_47166 ++max8660_dcdc_is_enabled_47167 max8660_dcdc_is_enabled 0 47167 NULL ++part_fail_show_47168 part_fail_show 0 47168 NULL ++set_temp_47169 set_temp 0-4 47169 NULL ++reg_show_name_47170 reg_show_name 0 47170 NULL ++lvs_rh_set_port_feature_47175 lvs_rh_set_port_feature 0 47175 NULL ++svc_pool_map_alloc_arrays_47181 svc_pool_map_alloc_arrays 2 47181 NULL ++ioremap_cache_47189 ioremap_cache 2-1 47189 NULL ++xfs_btree_get_buf_block_47197 xfs_btree_get_buf_block 0 47197 NULL ++niu_pci_map_page_47198 niu_pci_map_page 3 47198 NULL ++__set_signal_47207 __set_signal 0-4 47207 NULL ++__rds_create_47212 __rds_create 0 47212 NULL ++wm8903_gpio_direction_in_47213 wm8903_gpio_direction_in 0 47213 NULL ++nobh_write_end_47214 nobh_write_end 5-0 47214 NULL ++tg3_phy_auxctl_read_47216 tg3_phy_auxctl_read 0 47216 NULL ++__mt9t112_mcu_mask_set_47221 __mt9t112_mcu_mask_set 0 47221 NULL ++nilfs_dat_prepare_start_47222 nilfs_dat_prepare_start 0 47222 NULL ++xc_set_signal_source_47230 xc_set_signal_source 0 47230 NULL ++chip_edc_read_47233 chip_edc_read 0 47233 NULL ++x1205_get_dtrim_47236 x1205_get_dtrim 0 47236 NULL nohasharray ++rpc_pipe_write_47236 rpc_pipe_write 0-3 47236 &x1205_get_dtrim_47236 ++l2headersize_47238 l2headersize 0 47238 NULL ++options_write_47243 options_write 3-0 47243 NULL ++__uncore_filter_band3_show_47248 __uncore_filter_band3_show 0 47248 NULL ++__uncore_match_mc_show_47250 __uncore_match_mc_show 0 47250 NULL nohasharray ++iwl_mvm_power_set_ps_47250 iwl_mvm_power_set_ps 0 47250 &__uncore_match_mc_show_47250 nohasharray ++ftrace_modify_code_47250 ftrace_modify_code 1 47250 &iwl_mvm_power_set_ps_47250 ++efx_reconfigure_port_47251 efx_reconfigure_port 0 47251 NULL ++portcntrs_1_read_47253 portcntrs_1_read 3-0 47253 NULL nohasharray ++skb_copy_datagram_from_iter_47253 skb_copy_datagram_from_iter 4-2 47253 &portcntrs_1_read_47253 ++rtl2832_sdr_s_ctrl_47254 rtl2832_sdr_s_ctrl 0 47254 NULL nohasharray ++target_stat_scsi_lu_show_attr_prod_47254 target_stat_scsi_lu_show_attr_prod 0 47254 &rtl2832_sdr_s_ctrl_47254 ++da9052_disable_irq_nosync_47260 da9052_disable_irq_nosync 2 47260 NULL ++nq_m_sync_47264 nq_m_sync 0 47264 NULL ++exofs_write_inode_47271 exofs_write_inode 0 47271 NULL ++ablkcipher_next_slow_47274 ablkcipher_next_slow 3-4 47274 NULL ++show_fnode_exp_statsn_47277 show_fnode_exp_statsn 0 47277 NULL ++perf_ibs_cpu_notifier_47281 perf_ibs_cpu_notifier 0 47281 NULL ++gfs2_readpages_47285 gfs2_readpages 4 47285 NULL ++blkdev_issue_flush_47287 blkdev_issue_flush 0 47287 NULL ++reg_write_47288 reg_write 0 47288 NULL ++setattr_47289 setattr 0 47289 NULL ++target_stat_scsi_att_intr_port_show_attr_port_47290 target_stat_scsi_att_intr_port_show_attr_port 0 47290 NULL ++vsnprintf_47291 vsnprintf 0 47291 NULL ++SYSC_semop_47292 SYSC_semop 3 47292 NULL ++show_47293 show 0 47293 NULL ++uvc_video_enable_47296 uvc_video_enable 0 47296 NULL ++tx_internal_desc_overflow_read_47300 tx_internal_desc_overflow_read 3-0 47300 NULL ++virtqueue_add_47306 virtqueue_add 3 47306 NULL ++il4965_fill_txpower_tbl_47307 il4965_fill_txpower_tbl 0 47307 NULL ++mm_compute_batch_notifier_47309 mm_compute_batch_notifier 0 47309 NULL ++nfs_idmap_read_and_verify_message_47312 nfs_idmap_read_and_verify_message 0 47312 NULL ++xfs_trans_reserve_quota_nblks_47313 xfs_trans_reserve_quota_nblks 0 47313 NULL ++nouveau_fb_create__47316 nouveau_fb_create_ 4 47316 NULL ++ipvlan_device_event_47317 ipvlan_device_event 0 47317 NULL ++get_l4proto_47318 get_l4proto 0 47318 NULL ++usX2Y_usbpcm_urbs_start_47323 usX2Y_usbpcm_urbs_start 0 47323 NULL ++skein1024_export_47324 skein1024_export 0 47324 NULL ++snd_sb16_playback_trigger_47332 snd_sb16_playback_trigger 0 47332 NULL ++sctp_auth_set_active_key_47334 sctp_auth_set_active_key 0 47334 NULL nohasharray ++fd_configure_device_47334 fd_configure_device 0 47334 &sctp_auth_set_active_key_47334 ++next_bitstream_store_47342 next_bitstream_store 0-4 47342 NULL ++tune_set_47343 tune_set 0-5 47343 NULL ++cdc_ncm_show_min_tx_pkt_47346 cdc_ncm_show_min_tx_pkt 0 47346 NULL ++pstr_store_47352 pstr_store 0-4 47352 NULL nohasharray ++parse_exthdrs_47352 parse_exthdrs 0 47352 &pstr_store_47352 ++md_allow_write_47353 md_allow_write 0 47353 NULL ++ieee80211_if_read_dot11MeshHoldingTimeout_47356 ieee80211_if_read_dot11MeshHoldingTimeout 3-0 47356 NULL nohasharray ++validate_47356 validate 0 47356 &ieee80211_if_read_dot11MeshHoldingTimeout_47356 ++nvme_submit_admin_cmd_47357 nvme_submit_admin_cmd 0 47357 NULL ++avc_get_hash_stats_47359 avc_get_hash_stats 0 47359 NULL ++kvm_arch_create_memslot_47364 kvm_arch_create_memslot 3 47364 NULL nohasharray ++__output_copy_user_47364 __output_copy_user 3 47364 &kvm_arch_create_memslot_47364 ++vmci_transport_dgram_bind_47371 vmci_transport_dgram_bind 0 47371 NULL ++hci_prepare_cmd_47372 hci_prepare_cmd 3 47372 NULL ++show_ipv4_iface_bootproto_47376 show_ipv4_iface_bootproto 0 47376 NULL ++stmmac_enable_47377 stmmac_enable 0 47377 NULL ++__bio_map_kern_47379 __bio_map_kern 3 47379 NULL ++shmem_getpage_47382 shmem_getpage 0 47382 NULL ++nv_rd32_47390 nv_rd32 0 47390 NULL nohasharray ++trace_options_core_read_47390 trace_options_core_read 3 47390 &nv_rd32_47390 ++nametbl_list_47391 nametbl_list 2 47391 NULL ++pfkey_sendmsg_47394 pfkey_sendmsg 4-0 47394 NULL ++wdtpci_write_47395 wdtpci_write 0-3 47395 NULL ++store_spi_transport_rd_strm_47397 store_spi_transport_rd_strm 0-4 47397 NULL ++lbs_wrmac_write_47400 lbs_wrmac_write 3-0 47400 NULL ++efi_pstore_read_func_47401 efi_pstore_read_func 0 47401 NULL ++store_bitmask_47403 store_bitmask 0-4 47403 NULL ++store_select_amcb1_transmit_clock_47406 store_select_amcb1_transmit_clock 0-4 47406 NULL ++ocfs2_resv_end_47408 ocfs2_resv_end 0 47408 NULL nohasharray ++SyS_recv_47408 SyS_recv 3 47408 &ocfs2_resv_end_47408 ++sta_vht_capa_read_47409 sta_vht_capa_read 3-0 47409 NULL nohasharray ++bcm7xxx_28nm_e0_plus_afe_config_init_47409 bcm7xxx_28nm_e0_plus_afe_config_init 0 47409 &sta_vht_capa_read_47409 ++isl29003_set_power_state_47411 isl29003_set_power_state 0 47411 NULL ++show_spi_transport_width_47413 show_spi_transport_width 0 47413 NULL ++write_cmd_47414 write_cmd 0 47414 NULL ++lbs_wrrf_write_47418 lbs_wrrf_write 3-0 47418 NULL ++__iscsi_disc_store_userid_mutual_47420 __iscsi_disc_store_userid_mutual 0-3 47420 NULL ++vzalloc_47421 vzalloc 1 47421 NULL nohasharray ++array_size_store_47421 array_size_store 0-3 47421 &vzalloc_47421 ++mvs_task_prep_ata_47424 mvs_task_prep_ata 0 47424 NULL ++bLength_show_47432 bLength_show 0 47432 NULL ++fop_write_47433 fop_write 0-3 47433 NULL ++dibx000_i2c_gated_tuner_xfer_47436 dibx000_i2c_gated_tuner_xfer 0-3 47436 NULL ++wl128x_configure_mcs_pll_47437 wl128x_configure_mcs_pll 0 47437 NULL ++niu_reset_tx_bmac_47440 niu_reset_tx_bmac 0 47440 NULL ++cxacru_sysfs_show_modulation_47441 cxacru_sysfs_show_modulation 0 47441 NULL ++mrf24j40_filter_47445 mrf24j40_filter 0 47445 NULL ++hifn_setup_dst_desc_47448 hifn_setup_dst_desc 3 47448 NULL ++usb_wwan_open_47449 usb_wwan_open 0 47449 NULL ++environ_read_47451 environ_read 0-3 47451 NULL ++C_SYSC_set_mempolicy_47466 C_SYSC_set_mempolicy 3 47466 NULL ++__affs_hash_dentry_47469 __affs_hash_dentry 0 47469 NULL ++lprocfs_fid_write_common_47471 lprocfs_fid_write_common 2 47471 NULL ++igb_get_eeprom_len_47473 igb_get_eeprom_len 0 47473 NULL ++usermodehelper_read_trylock_47478 usermodehelper_read_trylock 0 47478 NULL ++nvme_trans_send_fw_cmd_47479 nvme_trans_send_fw_cmd 4 47479 NULL nohasharray ++o2hb_region_store_47479 o2hb_region_store 0-4 47479 &nvme_trans_send_fw_cmd_47479 ++acpi_smbus_read_47480 acpi_smbus_read 0 47480 NULL ++packet_mc_drop_47484 packet_mc_drop 0 47484 NULL ++newpart_47485 newpart 6-4 47485 NULL ++read_47490 read 0-3 47490 NULL ++mcp23s17_read_regs_47491 mcp23s17_read_regs 4 47491 NULL ++core_sys_select_47494 core_sys_select 1 47494 NULL ++__feat_register_nn_47497 __feat_register_nn 0 47497 NULL ++jid_store_47498 jid_store 0-3 47498 NULL ++read_block_for_search_47502 read_block_for_search 0 47502 NULL ++txstat_read_file_47503 txstat_read_file 0 47503 NULL nohasharray ++as3722_block_write_47503 as3722_block_write 2-3 47503 &txstat_read_file_47503 ++i801_block_transaction_by_block_47504 i801_block_transaction_by_block 0 47504 NULL ++show_temp_crit_int_47505 show_temp_crit_int 0 47505 NULL nohasharray ++alloc_arraycache_47505 alloc_arraycache 2 47505 &show_temp_crit_int_47505 ++unlink_simple_47506 unlink_simple 3 47506 NULL ++f2fs_write_meta_pages_47507 f2fs_write_meta_pages 0 47507 NULL ++saa7146_i2c_xfer_47508 saa7146_i2c_xfer 0-3 47508 NULL ++pstore_decompress_47510 pstore_decompress 0 47510 NULL ++ufs_inode_getblock_47512 ufs_inode_getblock 4 47512 NULL ++inet_bind_47514 inet_bind 0 47514 NULL ++nilfs_segbuf_extend_segsum_47517 nilfs_segbuf_extend_segsum 0 47517 NULL ++ec_i2c_count_response_47518 ec_i2c_count_response 0 47518 NULL ++eth_open_47519 eth_open 0 47519 NULL ++usb_hcd_alloc_bandwidth_47525 usb_hcd_alloc_bandwidth 0 47525 NULL nohasharray ++jfs_loglevel_proc_write_47525 jfs_loglevel_proc_write 0-3 47525 &usb_hcd_alloc_bandwidth_47525 ++wl128x_cmd_radio_parms_47528 wl128x_cmd_radio_parms 0 47528 NULL ++__proc_lnet_portal_rotor_47529 __proc_lnet_portal_rotor 5 47529 NULL ++process_vm_rw_47533 process_vm_rw 3-5 47533 NULL nohasharray ++vscnprintf_47533 vscnprintf 0-2 47533 &process_vm_rw_47533 ++get_port_47534 get_port 0 47534 NULL ++ieee80211_if_fmt_min_discovery_timeout_47539 ieee80211_if_fmt_min_discovery_timeout 3 47539 NULL ++il_send_cmd_sync_47541 il_send_cmd_sync 0 47541 NULL ++_lm3533_als_get_zone_47546 _lm3533_als_get_zone 0 47546 NULL ++atl1_open_47550 atl1_open 0 47550 NULL ++drbg_statelen_47551 drbg_statelen 0 47551 NULL ++pci_endrun_init_47554 pci_endrun_init 0 47554 NULL ++_ctl_diag_trigger_scsi_show_47558 _ctl_diag_trigger_scsi_show 0 47558 NULL ++send_cmd_47563 send_cmd 0 47563 NULL ++xfs_inobt_alloc_block_47565 xfs_inobt_alloc_block 0 47565 NULL ++send_command_47567 send_command 0 47567 NULL nohasharray ++i2c_nuvoton_write_status_47567 i2c_nuvoton_write_status 0 47567 &send_command_47567 ++read_ldt_47570 read_ldt 2 47570 NULL ++isku_sysfs_read_last_set_47572 isku_sysfs_read_last_set 6-0-5 47572 NULL ++mlx4_qp_to_ready_47574 mlx4_qp_to_ready 0 47574 NULL ++pci_iomap_47575 pci_iomap 3 47575 NULL ++mptscsih_version_bios_show_47578 mptscsih_version_bios_show 0 47578 NULL ++rpipe_get_idx_47579 rpipe_get_idx 2-0 47579 NULL nohasharray ++cpufreq_cpu_callback_47579 cpufreq_cpu_callback 0 47579 &rpipe_get_idx_47579 nohasharray ++dgram_init_47579 dgram_init 0 47579 &cpufreq_cpu_callback_47579 ++SYSC_fcntl64_47581 SYSC_fcntl64 3 47581 NULL ++id_format_show_47585 id_format_show 0 47585 NULL ++phy_read_47590 phy_read 0 47590 NULL ++wusb_ck_store_47591 wusb_ck_store 0-4 47591 NULL ++wlcore_read_reg_47598 wlcore_read_reg 0 47598 NULL ++get_nic_info_47601 get_nic_info 0 47601 NULL ++sd_isoc_init_47602 sd_isoc_init 0 47602 NULL ++ext4_kvzalloc_47605 ext4_kvzalloc 1 47605 NULL ++msdos_hash_47606 msdos_hash 0 47606 NULL ++wm831x_gpio_direction_out_47607 wm831x_gpio_direction_out 0 47607 NULL ++sctp_ssnmap_new_47608 sctp_ssnmap_new 2-1 47608 NULL nohasharray ++unbind_store_47608 unbind_store 0-3 47608 &sctp_ssnmap_new_47608 ++roccat_common2_sysfs_write_general_47610 roccat_common2_sysfs_write_general 0-6-5 47610 NULL nohasharray ++cgroup_clone_children_write_47610 cgroup_clone_children_write 0 47610 &roccat_common2_sysfs_write_general_47610 ++a_hnp_support_show_47611 a_hnp_support_show 0 47611 NULL ++uea_request_47613 uea_request 4 47613 NULL ++cache_read_pipefs_47615 cache_read_pipefs 3-0 47615 NULL ++ocfs2_xattr_security_list_47616 ocfs2_xattr_security_list 0-5 47616 NULL ++mwifiex_cmd_host_cmd_47617 mwifiex_cmd_host_cmd 0 47617 NULL ++tps65217_clear_bits_47619 tps65217_clear_bits 0 47619 NULL nohasharray ++__apei_exec_read_register_47619 __apei_exec_read_register 0 47619 &tps65217_clear_bits_47619 ++twl4030_clear_set_47624 twl4030_clear_set 4 47624 NULL ++nouveau_hwmon_temp1_auto_point1_temp_47625 nouveau_hwmon_temp1_auto_point1_temp 0 47625 NULL ++SYSC_send_47629 SYSC_send 3 47629 NULL ++store_pwm_auto_point_temp_hyst_47630 store_pwm_auto_point_temp_hyst 0-4 47630 NULL ++iwl_mvm_update_sta_47642 iwl_mvm_update_sta 0 47642 NULL ++ds1682_eeprom_read_47644 ds1682_eeprom_read 0-5-6 47644 NULL nohasharray ++ubifs_find_free_space_47644 ubifs_find_free_space 0 47644 &ds1682_eeprom_read_47644 ++compute_sid_handle_invalid_context_47647 compute_sid_handle_invalid_context 0 47647 NULL ++isl12022_read_regs_47653 isl12022_read_regs 0 47653 NULL ++auok190xfb_check_var_47654 auok190xfb_check_var 0 47654 NULL ++gfs2_jdata_writepage_47660 gfs2_jdata_writepage 0 47660 NULL ++fan_show_47664 fan_show 0 47664 NULL ++pyra_sysfs_show_firmware_version_47670 pyra_sysfs_show_firmware_version 0 47670 NULL ++acpi_ds_get_region_arguments_47671 acpi_ds_get_region_arguments 0 47671 NULL nohasharray ++user_scan_47671 user_scan 0 47671 &acpi_ds_get_region_arguments_47671 ++regmap_mmio_write_47679 regmap_mmio_write 0 47679 NULL ++queue_attr_store_47683 queue_attr_store 0-4 47683 NULL ++mbus_show_47685 mbus_show 0 47685 NULL nohasharray ++gprs_set_mtu_47685 gprs_set_mtu 0 47685 &mbus_show_47685 ++ce6230_ctrl_msg_47692 ce6230_ctrl_msg 0 47692 NULL ++target_stat_scsi_lu_show_attr_num_cmds_47693 target_stat_scsi_lu_show_attr_num_cmds 0 47693 NULL nohasharray ++niu_reset_rx_bmac_47693 niu_reset_rx_bmac 0 47693 &target_stat_scsi_lu_show_attr_num_cmds_47693 ++qlcnic_show_bridged_mode_47696 qlcnic_show_bridged_mode 0 47696 NULL ++create_tx_ctx_47698 create_tx_ctx 0 47698 NULL nohasharray ++ds2781_battery_io_47698 ds2781_battery_io 3-4 47698 &create_tx_ctx_47698 ++packet_recvmsg_47700 packet_recvmsg 0-4 47700 NULL ++inet_sendmsg_47705 inet_sendmsg 4-0 47705 NULL ++max8907_rtc_set_alarm_47711 max8907_rtc_set_alarm 0 47711 NULL ++save_microcode_47717 save_microcode 3 47717 NULL ++show_prochot_avg_47718 show_prochot_avg 0 47718 NULL ++wl1251_fetch_firmware_47724 wl1251_fetch_firmware 0 47724 NULL ++__sock_sendmsg_nosec_47729 __sock_sendmsg_nosec 0-4 47729 NULL ++bits_to_user_47733 bits_to_user 3-2 47733 NULL ++ov9740_s_fmt_47735 ov9740_s_fmt 0 47735 NULL nohasharray ++sockfs_listxattr_47735 sockfs_listxattr 0-3 47735 &ov9740_s_fmt_47735 ++notify_send_pre_block_47736 notify_send_pre_block 0 47736 NULL ++hdaps_read_pair_47737 hdaps_read_pair 0 47737 NULL ++carl9170_debugfs_read_47738 carl9170_debugfs_read 3-0 47738 NULL ++qla2x00_drvr_version_show_47742 qla2x00_drvr_version_show 0 47742 NULL ++use_zero_page_show_47747 use_zero_page_show 0 47747 NULL nohasharray ++ir_prepare_write_buffer_47747 ir_prepare_write_buffer 3 47747 &use_zero_page_show_47747 ++hpfs_write_end_47748 hpfs_write_end 5-0 47748 NULL nohasharray ++rose_add_loopback_node_47748 rose_add_loopback_node 0 47748 &hpfs_write_end_47748 nohasharray ++usb2_hardware_lpm_store_47748 usb2_hardware_lpm_store 0-4 47748 &rose_add_loopback_node_47748 ++mvumi_alloc_mem_resource_47750 mvumi_alloc_mem_resource 3 47750 NULL ++ext3_find_near_47752 ext3_find_near 0 47752 NULL ++mwl8k_feed_fw_image_47753 mwl8k_feed_fw_image 0 47753 NULL ++alloc_sched_domains_47756 alloc_sched_domains 1 47756 NULL ++csio_show_hw_state_47767 csio_show_hw_state 0 47767 NULL nohasharray ++wl1251_fetch_nvs_47767 wl1251_fetch_nvs 0 47767 &csio_show_hw_state_47767 ++broken_parity_status_show_47772 broken_parity_status_show 0 47772 NULL ++uwb_ie_dump_hex_47774 uwb_ie_dump_hex 4-0 47774 NULL ++i8k_get_fan_speed_47779 i8k_get_fan_speed 0 47779 NULL ++carl9170_set_mac_reg_47780 carl9170_set_mac_reg 0 47780 NULL nohasharray ++SyS_setgroups16_47780 SyS_setgroups16 1 47780 &carl9170_set_mac_reg_47780 ++error_error_numll_frame_cts_start_read_47781 error_error_numll_frame_cts_start_read 3-0 47781 NULL ++vfio_device_fops_read_47786 vfio_device_fops_read 0-3 47786 NULL ++posix_acl_fix_xattr_from_user_47793 posix_acl_fix_xattr_from_user 2 47793 NULL nohasharray ++o2hb_region_show_47793 o2hb_region_show 0 47793 &posix_acl_fix_xattr_from_user_47793 ++show_id_47795 show_id 0 47795 NULL ++sl_open_47801 sl_open 0 47801 NULL ++hello_timer_show_47803 hello_timer_show 0 47803 NULL ++store_fc_vport_disable_47804 store_fc_vport_disable 0-4 47804 NULL nohasharray ++W6692_empty_Bfifo_47804 W6692_empty_Bfifo 2 47804 &store_fc_vport_disable_47804 ++lov_packmd_47810 lov_packmd 0 47810 NULL ++show_counter_tx_flow_pkts_47812 show_counter_tx_flow_pkts 0 47812 NULL ++show_fan_full_speed_47818 show_fan_full_speed 0 47818 NULL ++cifs_iovec_write_47822 cifs_iovec_write 0 47822 NULL ++tree_mod_log_insert_move_47823 tree_mod_log_insert_move 5 47823 NULL nohasharray ++nilfs_segctor_last_seg_write_time_show_47823 nilfs_segctor_last_seg_write_time_show 0 47823 &tree_mod_log_insert_move_47823 nohasharray ++koneplus_sysfs_write_sensor_47823 koneplus_sysfs_write_sensor 0-6-5 47823 &nilfs_segctor_last_seg_write_time_show_47823 ++show_temp_max10_47828 show_temp_max10 0 47828 NULL ++read_file_spectral_bins_47829 read_file_spectral_bins 3-0 47829 NULL ++mb862xx_xfer_47831 mb862xx_xfer 0-3 47831 NULL nohasharray ++regulator_suspend_mem_uV_show_47831 regulator_suspend_mem_uV_show 0 47831 &mb862xx_xfer_47831 ++target_fabric_port_store_attr_alua_tg_pt_write_md_47833 target_fabric_port_store_attr_alua_tg_pt_write_md 0-3 47833 NULL ++rtl_store_debug_level_47834 rtl_store_debug_level 0-4 47834 NULL ++pinconf_dbg_config_write_47835 pinconf_dbg_config_write 3-0 47835 NULL nohasharray ++lanai_send_47835 lanai_send 0 47835 &pinconf_dbg_config_write_47835 ++cmos_nvram_write_47839 cmos_nvram_write 0-6-5 47839 NULL ++did_show_47843 did_show 0 47843 NULL nohasharray ++alloc_ringdesc_47843 alloc_ringdesc 0 47843 &did_show_47843 ++gfs2_aspace_writepage_47845 gfs2_aspace_writepage 0 47845 NULL ++wil_request_firmware_47846 wil_request_firmware 0 47846 NULL nohasharray ++qla4_82xx_start_firmware_47846 qla4_82xx_start_firmware 0 47846 &wil_request_firmware_47846 ++ecryptfs_write_inode_size_to_xattr_47848 ecryptfs_write_inode_size_to_xattr 0 47848 NULL ++reg_clear_47849 reg_clear 0 47849 NULL ++ath10k_pci_diag_write32_47850 ath10k_pci_diag_write32 0 47850 NULL ++__iscsi_nacl_auth_store_password_mutual_47853 __iscsi_nacl_auth_store_password_mutual 0-3 47853 NULL ++ixgbe_change_mtu_47865 ixgbe_change_mtu 0 47865 NULL ++copy_47869 copy 0 47869 NULL ++v9fs_file_fsync_47873 v9fs_file_fsync 0 47873 NULL nohasharray ++psmouse_attr_set_resolution_47873 psmouse_attr_set_resolution 0-4 47873 &v9fs_file_fsync_47873 ++add_lease_context_47876 add_lease_context 0 47876 NULL ++vhci_read_47878 vhci_read 3-0 47878 NULL ++e100_load_ucode_wait_47882 e100_load_ucode_wait 0 47882 NULL ++array_size_show_47883 array_size_show 0 47883 NULL ++ubi_wl_put_peb_47886 ubi_wl_put_peb 0 47886 NULL ++ds1374_wdt_write_47888 ds1374_wdt_write 0-3 47888 NULL ++keyctl_instantiate_key_common_47889 keyctl_instantiate_key_common 4 47889 NULL ++read_prph_47892 read_prph 0 47892 NULL ++erst_exec_skip_next_instruction_if_true_47893 erst_exec_skip_next_instruction_if_true 0 47893 NULL ++read_regr_47902 read_regr 0 47902 NULL nohasharray ++read_dsmargin_47902 read_dsmargin 0 47902 &read_regr_47902 ++osd_req_read_sg_47905 osd_req_read_sg 5 47905 NULL ++xc5000_get_if_frequency_47906 xc5000_get_if_frequency 0 47906 NULL ++ca0132_init_47907 ca0132_init 0 47907 NULL nohasharray ++ib_send_mad_47907 ib_send_mad 0 47907 &ca0132_init_47907 ++wl1273_fm_fops_read_47910 wl1273_fm_fops_read 0-3 47910 NULL nohasharray ++iwl_mvm_tdls_sta_init_47910 iwl_mvm_tdls_sta_init 0 47910 &wl1273_fm_fops_read_47910 ++elants_version_attribute_show_47912 elants_version_attribute_show 0 47912 NULL nohasharray ++radeon_get_pm_method_47912 radeon_get_pm_method 0 47912 &elants_version_attribute_show_47912 nohasharray ++chip_label_show_47912 chip_label_show 0 47912 &radeon_get_pm_method_47912 ++timeout_read_47915 timeout_read 0-3 47915 NULL nohasharray ++sp_header_47915 sp_header 0 47915 &timeout_read_47915 ++cfs_percpt_alloc_47918 cfs_percpt_alloc 2 47918 NULL ++bond_option_queue_id_set_47919 bond_option_queue_id_set 0 47919 NULL ++device_show_ulong_47926 device_show_ulong 0 47926 NULL nohasharray ++comedi_write_47926 comedi_write 3 47926 &device_show_ulong_47926 ++show_mlid_47928 show_mlid 0 47928 NULL ++max77686_rtc_read_time_47944 max77686_rtc_read_time 0 47944 NULL ++efivar_entry_get_47945 efivar_entry_get 0 47945 NULL ++b44_open_47950 b44_open 0 47950 NULL ++psmouse_attr_set_rate_47953 psmouse_attr_set_rate 0-4 47953 NULL ++arch_setup_msi_irq_47959 arch_setup_msi_irq 0 47959 NULL ++pci_read_47962 pci_read 0 47962 NULL ++cfg80211_testmode_alloc_reply_skb_47966 cfg80211_testmode_alloc_reply_skb 2 47966 NULL ++of_property_count_u32_elems_47967 of_property_count_u32_elems 0 47967 NULL ++roccat_common2_sysfs_read_light_47968 roccat_common2_sysfs_read_light 0-5-6 47968 NULL ++isl1208_sysfs_store_usr_47970 isl1208_sysfs_store_usr 0-4 47970 NULL ++show_stride_47971 show_stride 0 47971 NULL ++gether_get_ifname_47972 gether_get_ifname 0 47972 NULL ++nfs4_proc_get_acl_47973 nfs4_proc_get_acl 0 47973 NULL nohasharray ++pcmciamtd_resume_47973 pcmciamtd_resume 0 47973 &nfs4_proc_get_acl_47973 ++node_weight_read_47974 node_weight_read 0 47974 NULL ++show_srp_rport_id_47975 show_srp_rport_id 0 47975 NULL ++flush_store_47978 flush_store 0-4 47978 NULL ++mempool_resize_47983 mempool_resize 2 47983 NULL nohasharray ++iwl_dbgfs_ucode_tracing_read_47983 iwl_dbgfs_ucode_tracing_read 3-0 47983 &mempool_resize_47983 ++logfs_read_direct_47986 logfs_read_direct 0 47986 NULL nohasharray ++carl9170_debugfs_erp_write_47986 carl9170_debugfs_erp_write 0-3 47986 &logfs_read_direct_47986 ++tm6000_s_ctrl_47987 tm6000_s_ctrl 0 47987 NULL ++dbg_port_buf_47990 dbg_port_buf 2 47990 NULL nohasharray ++enter_47990 enter 0 47990 &dbg_port_buf_47990 ++lpfc_topology_store_47992 lpfc_topology_store 0-4 47992 NULL ++ib_umad_write_47993 ib_umad_write 3-0 47993 NULL ++objects_show_47995 objects_show 0 47995 NULL ++show_session_param_ISCSI_PARAM_AUTO_SND_TGT_DISABLE_47997 show_session_param_ISCSI_PARAM_AUTO_SND_TGT_DISABLE 0 47997 NULL nohasharray ++l2cap_sock_alloc_skb_cb_47997 l2cap_sock_alloc_skb_cb 3-2 47997 &show_session_param_ISCSI_PARAM_AUTO_SND_TGT_DISABLE_47997 ++__tda18271_write_regs_47998 __tda18271_write_regs 0 47998 NULL ++lustre_cfg_len_48002 lustre_cfg_len 0 48002 NULL ++aa_file_perm_48010 aa_file_perm 0 48010 NULL ++koneplus_sysfs_show_actual_profile_48011 koneplus_sysfs_show_actual_profile 0 48011 NULL nohasharray ++ipx_create_48011 ipx_create 0 48011 &koneplus_sysfs_show_actual_profile_48011 nohasharray ++gdm_tty_recv_complete_48011 gdm_tty_recv_complete 2 48011 &ipx_create_48011 ++munmap_notify_48013 munmap_notify 0 48013 NULL nohasharray ++iscsit_ta_netif_timeout_48013 iscsit_ta_netif_timeout 0 48013 &munmap_notify_48013 ++coda_statfs_48015 coda_statfs 0 48015 NULL ++rtl92se_hw_init_48027 rtl92se_hw_init 0 48027 NULL ++trace_show_48031 trace_show 0 48031 NULL ++id_mode_to_cifs_acl_48036 id_mode_to_cifs_acl 0 48036 NULL nohasharray ++cs_parse_auto_config_48036 cs_parse_auto_config 0 48036 &id_mode_to_cifs_acl_48036 ++sys32_pread_48037 sys32_pread 3 48037 NULL ++pppoe_sendmsg_48039 pppoe_sendmsg 4-0 48039 NULL ++SYSC_writev_48040 SYSC_writev 3 48040 NULL ++show_vrm_48041 show_vrm 0 48041 NULL ++niu_alloc_tx_ring_info_48045 niu_alloc_tx_ring_info 0 48045 NULL ++tps6507x_i2c_write_device_48046 tps6507x_i2c_write_device 3 48046 NULL ++uhid_dev_create_48047 uhid_dev_create 0 48047 NULL ++rate_show_48049 rate_show 0 48049 NULL ++bnx2x_config_rss_48050 bnx2x_config_rss 0 48050 NULL ++t3_wait_op_done_val_48061 t3_wait_op_done_val 0 48061 NULL ++protection_level_show_48062 protection_level_show 0 48062 NULL nohasharray ++kovaplus_sysfs_write_profile_buttons_48062 kovaplus_sysfs_write_profile_buttons 0-6-5 48062 &protection_level_show_48062 ++posix_acl_alloc_48063 posix_acl_alloc 1 48063 NULL ++palmas_bulk_write_48068 palmas_bulk_write 3-2-5-0 48068 NULL ++pcap_regulator_disable_48070 pcap_regulator_disable 0 48070 NULL nohasharray ++ubifs_read_node_48070 ubifs_read_node 0 48070 &pcap_regulator_disable_48070 ++wdtpci_temp_read_48072 wdtpci_temp_read 0-3 48072 NULL ++read_rbu_mono_data_48078 read_rbu_mono_data 3-0 48078 NULL ++xen_mce_chrdev_read_48087 xen_mce_chrdev_read 0-3 48087 NULL ++cp2112_hid_output_48094 cp2112_hid_output 0-3 48094 NULL ++mmc_alloc_host_48097 mmc_alloc_host 1 48097 NULL nohasharray ++topology_change_timer_show_48097 topology_change_timer_show 0 48097 &mmc_alloc_host_48097 ++i7core_inject_enable_show_48107 i7core_inject_enable_show 0 48107 NULL nohasharray ++radio_isa_common_probe_48107 radio_isa_common_probe 3 48107 &i7core_inject_enable_show_48107 ++pmcraid_show_adapter_id_48108 pmcraid_show_adapter_id 0 48108 NULL nohasharray ++skcipher_setkey_48108 skcipher_setkey 0 48108 &pmcraid_show_adapter_id_48108 ++rmd256_final_48110 rmd256_final 0 48110 NULL ++tpacpi_rfk_procfs_write_48111 tpacpi_rfk_procfs_write 0 48111 NULL ++cx23885_initialize_codec_48114 cx23885_initialize_codec 0 48114 NULL ++selinux_inode_permission_48116 selinux_inode_permission 0 48116 NULL nohasharray ++get_48116 get 0 48116 &selinux_inode_permission_48116 ++coretemp_cpu_callback_48123 coretemp_cpu_callback 0 48123 NULL ++wm_latency_write_48125 wm_latency_write 3-0 48125 NULL nohasharray ++ipw_open_48125 ipw_open 0 48125 &wm_latency_write_48125 nohasharray ++qla4xxx_initialize_adapter_48125 qla4xxx_initialize_adapter 0 48125 &ipw_open_48125 ++metrousb_send_unidirectional_cmd_48129 metrousb_send_unidirectional_cmd 0 48129 NULL ++vmw_framebuffer_surface_dirty_48132 vmw_framebuffer_surface_dirty 6 48132 NULL ++bdc_submit_cmd_48137 bdc_submit_cmd 0 48137 NULL ++rtsx_read_cfg_seq_48139 rtsx_read_cfg_seq 3-5 48139 NULL ++statistics_write_48141 statistics_write 0-3 48141 NULL nohasharray ++bd2802_store_reg0x01_48141 bd2802_store_reg0x01 0-4 48141 &statistics_write_48141 nohasharray ++store_fan_smart_tach_48141 store_fan_smart_tach 0-4 48141 &bd2802_store_reg0x01_48141 nohasharray ++set_discoverable_48141 set_discoverable 4 48141 &store_fan_smart_tach_48141 ++hdmi_streamon_48144 hdmi_streamon 0 48144 NULL ++dn_fib_count_nhs_48145 dn_fib_count_nhs 0 48145 NULL ++__tcp_push_pending_frames_48148 __tcp_push_pending_frames 2 48148 NULL ++SyS_vmsplice_48150 SyS_vmsplice 3 48150 NULL ++_add_to_r4w_48152 _add_to_r4w 4 48152 NULL nohasharray ++bitmap_onto_48152 bitmap_onto 4 48152 &_add_to_r4w_48152 ++bnx2i_host_get_param_48156 bnx2i_host_get_param 0 48156 NULL ++isr_dma1_done_read_48159 isr_dma1_done_read 3-0 48159 NULL nohasharray ++rx4581_get_datetime_48159 rx4581_get_datetime 0 48159 &isr_dma1_done_read_48159 ++c4iw_id_table_alloc_48163 c4iw_id_table_alloc 3 48163 NULL ++macvlan_open_48169 macvlan_open 0 48169 NULL ++rbd_obj_method_sync_48170 rbd_obj_method_sync 8-0 48170 NULL nohasharray ++bnx2x_get_regs_len_48170 bnx2x_get_regs_len 0 48170 &rbd_obj_method_sync_48170 nohasharray ++ocfs2_find_next_zero_bit_unaligned_48170 ocfs2_find_next_zero_bit_unaligned 3-2 48170 &bnx2x_get_regs_len_48170 ++minix_setattr_48171 minix_setattr 0 48171 NULL ++__netxen_nic_up_48175 __netxen_nic_up 0 48175 NULL ++rocker_port_set_mac_address_48176 rocker_port_set_mac_address 0 48176 NULL ++netif_set_real_num_tx_queues_48178 netif_set_real_num_tx_queues 0 48178 NULL ++ltc2945_reg_to_val_48179 ltc2945_reg_to_val 0 48179 NULL nohasharray ++store_48179 store 0-3 48179 <c2945_reg_to_val_48179 ++snd_nm256_pcm_prepare_48180 snd_nm256_pcm_prepare 0 48180 NULL ++__orinoco_commit_48184 __orinoco_commit 0 48184 NULL ++alloc_cc770dev_48186 alloc_cc770dev 1 48186 NULL ++init_ipath_48187 init_ipath 1 48187 NULL nohasharray ++pvpanic_panic_notify_48187 pvpanic_panic_notify 0 48187 &init_ipath_48187 ++eni_send_48189 eni_send 0 48189 NULL nohasharray ++integrity_attr_store_48189 integrity_attr_store 0-4 48189 &eni_send_48189 ++uhid_dev_create2_48191 uhid_dev_create2 0 48191 NULL ++mwl8k_cmd_enable_sniffer_48197 mwl8k_cmd_enable_sniffer 0 48197 NULL ++startup_48205 startup 0 48205 NULL ++show_48207 show 0 48207 NULL ++snd_seq_dump_var_event_48209 snd_seq_dump_var_event 0 48209 NULL ++ath10k_download_cal_data_48215 ath10k_download_cal_data 0 48215 NULL ++il3945_hw_nic_init_48216 il3945_hw_nic_init 0 48216 NULL nohasharray ++cifs_read_data_offset_48216 cifs_read_data_offset 0 48216 &il3945_hw_nic_init_48216 ++is_block_in_journal_48223 is_block_in_journal 3 48223 NULL ++iwl_mvm_beacon_filter_send_cmd_48226 iwl_mvm_beacon_filter_send_cmd 0 48226 NULL nohasharray ++uv_blade_nr_possible_cpus_48226 uv_blade_nr_possible_cpus 0 48226 &iwl_mvm_beacon_filter_send_cmd_48226 ++nilfs_readpages_48229 nilfs_readpages 4 48229 NULL ++read_file_recv_48232 read_file_recv 3-0 48232 NULL ++s_video_encoding_48233 s_video_encoding 0 48233 NULL ++collisions_show_48236 collisions_show 0 48236 NULL ++fake_rw_show_48237 fake_rw_show 0 48237 NULL ++nouveau_i2c_port_create__48240 nouveau_i2c_port_create_ 7 48240 NULL nohasharray ++show_priv_session_state_48240 show_priv_session_state 0 48240 &nouveau_i2c_port_create__48240 ++snd_fm801_playback_prepare_48242 snd_fm801_playback_prepare 0 48242 NULL nohasharray ++i7core_show_counter_1_48242 i7core_show_counter_1 0 48242 &snd_fm801_playback_prepare_48242 ++nfsctl_transaction_read_48250 nfsctl_transaction_read 3-0 48250 NULL ++vport_disable_48252 vport_disable 0 48252 NULL ++usb_hcd_submit_urb_48256 usb_hcd_submit_urb 0 48256 NULL ++batadv_socket_read_48257 batadv_socket_read 3-0 48257 NULL ++__videobuf_free_48260 __videobuf_free 0 48260 NULL ++raid10_check_reshape_48267 raid10_check_reshape 0 48267 NULL ++ath10k_pci_diag_write_mem_48268 ath10k_pci_diag_write_mem 0 48268 NULL ++cache_write_pipefs_48270 cache_write_pipefs 3-0 48270 NULL ++pcistub_slot_show_48272 pcistub_slot_show 0 48272 NULL nohasharray ++store_48272 store 0-3 48272 &pcistub_slot_show_48272 ++rbd_name_show_48274 rbd_name_show 0 48274 NULL nohasharray ++__modver_version_show_48274 __modver_version_show 0 48274 &rbd_name_show_48274 ++qlcnic_83xx_get_regs_len_48275 qlcnic_83xx_get_regs_len 0 48275 NULL nohasharray ++xgene_rtc_read_time_48275 xgene_rtc_read_time 0 48275 &qlcnic_83xx_get_regs_len_48275 nohasharray ++trace_options_write_48275 trace_options_write 3 48275 &xgene_rtc_read_time_48275 ++ath5k_hw_reset_tx_queue_48279 ath5k_hw_reset_tx_queue 0 48279 NULL ++compat_sys_io_getevents_48283 compat_sys_io_getevents 3 48283 NULL ++send_set_info_48288 send_set_info 7 48288 NULL ++nf_nat_ipv4_in_48293 nf_nat_ipv4_in 0 48293 NULL ++ac_write_48295 ac_write 0-3 48295 NULL ++twa_show_stats_48297 twa_show_stats 0 48297 NULL ++lpfc_idiag_extacc_read_48301 lpfc_idiag_extacc_read 3-0 48301 NULL nohasharray ++dimmdev_mem_type_show_48301 dimmdev_mem_type_show 0 48301 &lpfc_idiag_extacc_read_48301 ++kernel_sendmsg_48304 kernel_sendmsg 0-5 48304 NULL ++timblogiw_read_48305 timblogiw_read 3-0 48305 NULL ++ubifs_save_dirty_idx_lnums_48309 ubifs_save_dirty_idx_lnums 0 48309 NULL nohasharray ++opts_store_48309 opts_store 0-3 48309 &ubifs_save_dirty_idx_lnums_48309 ++hash_setkey_48310 hash_setkey 0-3 48310 NULL ++patch_alc262_48312 patch_alc262 0 48312 NULL ++crb_read_48313 crb_read 0 48313 NULL ++iso_stream_schedule_48324 iso_stream_schedule 0 48324 NULL ++resize_kernel_48326 resize_kernel 4-3 48326 NULL ++__mv88e6352_phy_write_48335 __mv88e6352_phy_write 0 48335 NULL nohasharray ++pn_socket_getname_48335 pn_socket_getname 0 48335 &__mv88e6352_phy_write_48335 nohasharray ++ceph_statfs_48335 ceph_statfs 0 48335 &pn_socket_getname_48335 ++store_fc_host_vport_create_48336 store_fc_host_vport_create 0-4 48336 NULL ++show_version_48337 show_version 0 48337 NULL ++dev_set_bus_48339 dev_set_bus 0 48339 NULL ++blinkm_test_run_48343 blinkm_test_run 0 48343 NULL ++attr_select_right_show_tpkbd_48344 attr_select_right_show_tpkbd 0 48344 NULL nohasharray ++read_exec_48344 read_exec 0 48344 &attr_select_right_show_tpkbd_48344 ++hci_req_run_48347 hci_req_run 0 48347 NULL nohasharray ++__tg3_readphy_48347 __tg3_readphy 0 48347 &hci_req_run_48347 ++suspend_nvs_save_48355 suspend_nvs_save 0 48355 NULL ++__alloc_fd_48356 __alloc_fd 2 48356 NULL ++afs_volume_cache_get_key_48357 afs_volume_cache_get_key 0 48357 NULL ++follow_pte_48359 follow_pte 0 48359 NULL ++snd_cmipci_playback_spdif_prepare_48360 snd_cmipci_playback_spdif_prepare 0 48360 NULL ++lpfc_hdw_show_48361 lpfc_hdw_show 0 48361 NULL ++queue_physical_block_size_show_48362 queue_physical_block_size_show 0 48362 NULL ++skb_add_data_48363 skb_add_data 3 48363 NULL ++store_temp23_48364 store_temp23 0-4 48364 NULL ++iscsi_complete_pdu_48372 iscsi_complete_pdu 4 48372 NULL ++ath10k_wait_for_peer_deleted_48374 ath10k_wait_for_peer_deleted 0 48374 NULL ++tx_frag_init_called_read_48377 tx_frag_init_called_read 3-0 48377 NULL ++store_bl_curve_48380 store_bl_curve 0-4 48380 NULL ++node_read_cpumask_48384 node_read_cpumask 0 48384 NULL nohasharray ++snd_jack_dev_register_48384 snd_jack_dev_register 0 48384 &node_read_cpumask_48384 ++wl1271_acx_tx_config_options_48385 wl1271_acx_tx_config_options 0 48385 NULL ++do_sock_sendmsg_48388 do_sock_sendmsg 0-3 48388 NULL ++jffs2_do_readpage_unlock_48397 jffs2_do_readpage_unlock 0 48397 NULL ++mos7840_set_reg_sync_48398 mos7840_set_reg_sync 0 48398 NULL ++ath10k_read_htt_max_amsdu_ampdu_48401 ath10k_read_htt_max_amsdu_ampdu 3-0 48401 NULL ++sctp_getname_48405 sctp_getname 0 48405 NULL ++il3945_store_measurement_48410 il3945_store_measurement 0-4 48410 NULL nohasharray ++ixgbe_pci_sriov_enable_48410 ixgbe_pci_sriov_enable 0-2 48410 &il3945_store_measurement_48410 ++bql_set_48412 bql_set 0-2 48412 NULL ++lbs_debugfs_write_48413 lbs_debugfs_write 3-0 48413 NULL ++uhid_event_from_user_48417 uhid_event_from_user 2-0 48417 NULL ++wl1271_ap_init_null_template_48418 wl1271_ap_init_null_template 0 48418 NULL nohasharray ++div64_u64_rem_48418 div64_u64_rem 0 48418 &wl1271_ap_init_null_template_48418 ++kfd_ioctl_48422 kfd_ioctl 2 48422 NULL nohasharray ++iscsi_stat_instance_show_attr_disc_time_48422 iscsi_stat_instance_show_attr_disc_time 0 48422 &kfd_ioctl_48422 ++pwr_tx_without_ps_read_48423 pwr_tx_without_ps_read 3-0 48423 NULL nohasharray ++configure_sync_endpoint_48423 configure_sync_endpoint 0 48423 &pwr_tx_without_ps_read_48423 ++nfs4_alloc_pages_48426 nfs4_alloc_pages 1 48426 NULL ++bch_flash_dev_store_48429 bch_flash_dev_store 0-4 48429 NULL ++__hw_addr_del_entry_48430 __hw_addr_del_entry 0 48430 NULL nohasharray ++store_vgapass_48430 store_vgapass 0-4 48430 &__hw_addr_del_entry_48430 ++nfs_weak_revalidate_48432 nfs_weak_revalidate 0 48432 NULL ++b43legacy_chip_init_48439 b43legacy_chip_init 0 48439 NULL ++print_filtered_48442 print_filtered 0-2 48442 NULL ++vlv_pipe_crc_ctl_reg_48447 vlv_pipe_crc_ctl_reg 0 48447 NULL ++rtl2830_rd_48451 rtl2830_rd 0 48451 NULL nohasharray ++shmem_add_to_page_cache_48451 shmem_add_to_page_cache 0 48451 &rtl2830_rd_48451 ++fan_get_48455 fan_get 0 48455 NULL ++stac_beep_switch_ctl_48456 stac_beep_switch_ctl 0 48456 NULL nohasharray ++dlfb_ops_set_par_48456 dlfb_ops_set_par 0 48456 &stac_beep_switch_ctl_48456 ++alb_set_slave_mac_addr_48460 alb_set_slave_mac_addr 0 48460 NULL ++hotkey_status_get_48462 hotkey_status_get 0 48462 NULL ++tun_recvmsg_48463 tun_recvmsg 0-4 48463 NULL ++toshiba_kbd_bl_mode_store_48465 toshiba_kbd_bl_mode_store 0-4 48465 NULL ++getname_48466 getname 0 48466 NULL nohasharray ++copy_page_from_iter_iovec_48466 copy_page_from_iter_iovec 0-3 48466 &getname_48466 ++adis16136_write_frequency_48469 adis16136_write_frequency 0-4 48469 NULL nohasharray ++compat_SyS_preadv64_48469 compat_SyS_preadv64 3 48469 &adis16136_write_frequency_48469 ++_iwl_dbgfs_bt_tx_prio_write_48473 _iwl_dbgfs_bt_tx_prio_write 3-0 48473 NULL ++afs_write_back_from_locked_page_48477 afs_write_back_from_locked_page 0 48477 NULL ++set_in16_max_48479 set_in16_max 0-4 48479 NULL nohasharray ++pid_revalidate_48479 pid_revalidate 0 48479 &set_in16_max_48479 ++bh1770_get_prox_rate_below_48483 bh1770_get_prox_rate_below 0 48483 NULL nohasharray ++bd2802_store_reg0x12_48483 bd2802_store_reg0x12 0-4 48483 &bh1770_get_prox_rate_below_48483 ++security_inode_getsecctx_48485 security_inode_getsecctx 0 48485 NULL ++r8712_usbctrl_vendorreq_48489 r8712_usbctrl_vendorreq 6 48489 NULL ++tuner_transfer_48491 tuner_transfer 3-0 48491 NULL ++tpacpi_brightness_set_ec_48492 tpacpi_brightness_set_ec 0 48492 NULL ++nilfs_mounted_snapshots_README_show_48493 nilfs_mounted_snapshots_README_show 0 48493 NULL ++ocfs2_refcount_cow_48495 ocfs2_refcount_cow 0 48495 NULL nohasharray ++rocker_port_vlan_rx_add_vid_48495 rocker_port_vlan_rx_add_vid 0 48495 &ocfs2_refcount_cow_48495 ++store_48497 store 0-3 48497 NULL nohasharray ++store_temp_auto_offset_hyst_48497 store_temp_auto_offset_hyst 0-4 48497 &store_48497 ++send_control_msg_48498 send_control_msg 0-6 48498 NULL ++show_temp_type_48500 show_temp_type 0 48500 NULL ++convert_tail_for_hole_48503 convert_tail_for_hole 0 48503 NULL ++serio_show_description_48505 serio_show_description 0 48505 NULL ++diva_os_copy_to_user_48508 diva_os_copy_to_user 4 48508 NULL nohasharray ++size_show_48508 size_show 0 48508 &diva_os_copy_to_user_48508 ++dln2_i2c_read_48511 dln2_i2c_read 0-4 48511 NULL ++phantom_get_free_48514 phantom_get_free 0 48514 NULL ++lm3530_get_mode_from_str_48515 lm3530_get_mode_from_str 0 48515 NULL ++ieee80211_open_48520 ieee80211_open 0 48520 NULL ++fcoe_disable_48527 fcoe_disable 0 48527 NULL ++wiimote_hid_send_48528 wiimote_hid_send 3 48528 NULL ++vmci_q_header_free_space_48529 vmci_q_header_free_space 0-3 48529 NULL ++ext3_splice_branch_48531 ext3_splice_branch 6 48531 NULL ++ds1307_get_time_48534 ds1307_get_time 0 48534 NULL ++brcmf_sdio_glom_len_48536 brcmf_sdio_glom_len 0 48536 NULL ++ths7303_write_48540 ths7303_write 0 48540 NULL ++udp_lib_get_port_48545 udp_lib_get_port 0 48545 NULL nohasharray ++l2tp_ip6_open_48545 l2tp_ip6_open 0 48545 &udp_lib_get_port_48545 ++nvbios_extend_48550 nvbios_extend 2 48550 NULL ++b43_upload_initvals_48559 b43_upload_initvals 0 48559 NULL ++m88e1116r_config_init_48560 m88e1116r_config_init 0 48560 NULL ++ath10k_fw_stats_read_48561 ath10k_fw_stats_read 3-0 48561 NULL ++picolcd_debug_flash_read_48564 picolcd_debug_flash_read 0-3 48564 NULL ++command_resume_48565 command_resume 0 48565 NULL ++erst_get_record_id_begin_48566 erst_get_record_id_begin 0 48566 NULL ++fuse_flush_times_48569 fuse_flush_times 0 48569 NULL ++raid10_size_48571 raid10_size 0-3-2 48571 NULL ++__c2port_read_flash_data_48572 __c2port_read_flash_data 0-4-3 48572 NULL nohasharray ++realloc_lpt_leb_48572 realloc_lpt_leb 0 48572 &__c2port_read_flash_data_48572 ++team_init_48574 team_init 0 48574 NULL ++nvif_notify_init_48578 nvif_notify_init 7 48578 NULL ++show_fnode_data_digest_48582 show_fnode_data_digest 0 48582 NULL ++set_mode_48583 set_mode 0 48583 NULL ++ixgbe_set_mac_48584 ixgbe_set_mac 0 48584 NULL ++set_a_clr_err_48585 set_a_clr_err 0-4 48585 NULL ++set_channels_48590 set_channels 0 48590 NULL ++get_register_interruptible_48598 get_register_interruptible 0 48598 NULL ++label_SKIN_48603 label_SKIN 0 48603 NULL ++il3945_show_channels_48609 il3945_show_channels 0 48609 NULL ++ctrl_48612 ctrl 0 48612 NULL ++ufs_dtogd_48616 ufs_dtogd 0-2 48616 NULL ++nilfs_direct_assign_48620 nilfs_direct_assign 0 48620 NULL ++uni2char_48631 uni2char 0 48631 NULL ++mt9m001_g_crop_48632 mt9m001_g_crop 0 48632 NULL ++ov9740_s_ctrl_48637 ov9740_s_ctrl 0 48637 NULL ++acpi_ns_build_external_path_48638 acpi_ns_build_external_path 0 48638 NULL ++xhci_add_endpoint_48639 xhci_add_endpoint 0 48639 NULL ++lpfc_modeldesc_show_48640 lpfc_modeldesc_show 0 48640 NULL ++do_ip_vs_set_ctl_48641 do_ip_vs_set_ctl 4 48641 NULL ++uwb_radio_force_channel_48645 uwb_radio_force_channel 0 48645 NULL ++isl29003_set_mode_48650 isl29003_set_mode 0 48650 NULL ++ll_rw_extents_stats_pp_seq_write_48651 ll_rw_extents_stats_pp_seq_write 3 48651 NULL ++__efx_reconfigure_port_48652 __efx_reconfigure_port 0 48652 NULL ++mtd_read_48655 mtd_read 0 48655 NULL ++show_vrm_reg_48661 show_vrm_reg 0 48661 NULL nohasharray ++tg3_phy_toggle_auxctl_smdsp_48661 tg3_phy_toggle_auxctl_smdsp 0 48661 &show_vrm_reg_48661 ++aes_encrypt_packets_read_48666 aes_encrypt_packets_read 3-0 48666 NULL ++ore_get_rw_state_48667 ore_get_rw_state 0 48667 NULL ++sys_setgroups_48668 sys_setgroups 1 48668 NULL nohasharray ++sm501_create_subdev_48668 sm501_create_subdev 4-3 48668 &sys_setgroups_48668 ++bnx2_init_cpus_48669 bnx2_init_cpus 0 48669 NULL ++ubi_eba_unmap_leb_48671 ubi_eba_unmap_leb 0 48671 NULL ++read_48672 read 0 48672 NULL ++order_show_48676 order_show 0 48676 NULL nohasharray ++l2cap_build_cmd_48676 l2cap_build_cmd 4 48676 &order_show_48676 ++carl9170_set_operating_mode_48683 carl9170_set_operating_mode 0 48683 NULL ++ceph_setattr_48686 ceph_setattr 0 48686 NULL ++ecm_opts_ifname_show_48687 ecm_opts_ifname_show 0 48687 NULL nohasharray ++iscsi_nacl_param_show_FirstBurstLength_48687 iscsi_nacl_param_show_FirstBurstLength 0 48687 &ecm_opts_ifname_show_48687 ++security_inode_setattr_48689 security_inode_setattr 0 48689 NULL ++xen_feature_show_48691 xen_feature_show 0 48691 NULL ++create_css_48692 create_css 0 48692 NULL ++hysdn_log_write_48694 hysdn_log_write 3 48694 NULL ++adp5520_bl_dark_max_show_48697 adp5520_bl_dark_max_show 0 48697 NULL ++altera_drscan_48698 altera_drscan 2 48698 NULL ++wlcore_boot_upload_firmware_48701 wlcore_boot_upload_firmware 0 48701 NULL ++cpu_partial_store_48703 cpu_partial_store 0-3 48703 NULL ++kvm_set_irq_routing_48704 kvm_set_irq_routing 3 48704 NULL ++mwl8k_start_48706 mwl8k_start 0 48706 NULL nohasharray ++mwl8k_cmd_update_mac_addr_48706 mwl8k_cmd_update_mac_addr 0 48706 &mwl8k_start_48706 nohasharray ++rr_init1_48706 rr_init1 0 48706 &mwl8k_cmd_update_mac_addr_48706 ++qib_user_event_ack_48707 qib_user_event_ack 0 48707 NULL nohasharray ++patch_vt1718S_48707 patch_vt1718S 0 48707 &qib_user_event_ack_48707 ++__mt9t112_reg_mask_set_48708 __mt9t112_reg_mask_set 0 48708 NULL ++lpfc_idiag_drbacc_write_48712 lpfc_idiag_drbacc_write 3-0 48712 NULL ++SyS_lgetxattr_48719 SyS_lgetxattr 4 48719 NULL ++show_therm_status_48723 show_therm_status 0 48723 NULL ++sht15_soft_reset_48724 sht15_soft_reset 0 48724 NULL nohasharray ++sd_bytes_number_48724 sd_bytes_number 0-2 48724 &sht15_soft_reset_48724 ++show_trace_dev_match_48726 show_trace_dev_match 0-2 48726 NULL ++authorized_default_store_48729 authorized_default_store 0-4 48729 NULL ++reserved_clusters_show_48735 reserved_clusters_show 0 48735 NULL ++xfs_attr_set_48738 xfs_attr_set 0 48738 NULL ++balloon_page_migrate_48740 balloon_page_migrate 0 48740 NULL ++ubifs_jnl_write_data_48742 ubifs_jnl_write_data 0 48742 NULL ++ath6kl_usb_bmi_read_48745 ath6kl_usb_bmi_read 3 48745 NULL ++ath6kl_regwrite_read_48747 ath6kl_regwrite_read 3-0 48747 NULL ++uart_get_attr_type_48750 uart_get_attr_type 0 48750 NULL ++cifs_check_receive_48751 cifs_check_receive 0 48751 NULL ++xc4000_set_params_48754 xc4000_set_params 0 48754 NULL ++patch_alc269_48756 patch_alc269 0 48756 NULL ++xfs_dir3_sf_entsize_48758 xfs_dir3_sf_entsize 0-2 48758 NULL ++qla4xxx_fw_uptime_show_48759 qla4xxx_fw_uptime_show 0 48759 NULL ++apds990x_lux_thresh_below_show_48763 apds990x_lux_thresh_below_show 0 48763 NULL ++event_buffer_read_48772 event_buffer_read 0-3 48772 NULL nohasharray ++l2cap_segment_sdu_48772 l2cap_segment_sdu 4 48772 &event_buffer_read_48772 ++rds_set_bool_option_48773 rds_set_bool_option 0 48773 NULL ++boottime_set_48781 boottime_set 0-4 48781 NULL ++lm3533_ctrlbank_set_pwm_48784 lm3533_ctrlbank_set_pwm 0 48784 NULL ++transfer_48788 transfer 0 48788 NULL ++nfc_llcp_send_snl_sdreq_48793 nfc_llcp_send_snl_sdreq 3 48793 NULL ++gadget_dev_desc_bMaxPacketSize0_show_48795 gadget_dev_desc_bMaxPacketSize0_show 0 48795 NULL nohasharray ++led_invert_store_48795 led_invert_store 0-4 48795 &gadget_dev_desc_bMaxPacketSize0_show_48795 ++lua_sysfs_write_48797 lua_sysfs_write 0-6 48797 NULL ++lock_extent_buffer_for_io_48800 lock_extent_buffer_for_io 0 48800 NULL nohasharray ++rbd_add_single_major_48800 rbd_add_single_major 0-3 48800 &lock_extent_buffer_for_io_48800 ++il3945_sta_dbgfs_stats_table_read_48802 il3945_sta_dbgfs_stats_table_read 3-0 48802 NULL ++bio_uncopy_user_48803 bio_uncopy_user 0 48803 NULL ++ufx_unblank_48804 ufx_unblank 0 48804 NULL ++show_48809 show 0 48809 NULL ++store_sched4_48815 store_sched4 4-0 48815 NULL ++tcp_push_one_48816 tcp_push_one 2 48816 NULL ++smb2_flush_file_48822 smb2_flush_file 0 48822 NULL nohasharray ++journal_end_sync_48822 journal_end_sync 0 48822 &smb2_flush_file_48822 ++mci_ue_noinfo_show_48824 mci_ue_noinfo_show 0 48824 NULL ++atomic_counters_read_48827 atomic_counters_read 3-0 48827 NULL ++exchange_bmi_msg_48829 exchange_bmi_msg 0 48829 NULL ++vmci_transport_notify_recv_post_dequeue_48831 vmci_transport_notify_recv_post_dequeue 0 48831 NULL ++vbi_queue_setup_48842 vbi_queue_setup 0 48842 NULL nohasharray ++vc_do_resize_48842 vc_do_resize 3-4 48842 &vbi_queue_setup_48842 ++ds1511_rtc_set_alarm_48843 ds1511_rtc_set_alarm 0 48843 NULL ++show_host_param_ISCSI_HOST_PARAM_INITIATOR_NAME_48845 show_host_param_ISCSI_HOST_PARAM_INITIATOR_NAME 0 48845 NULL ++il_dbgfs_force_reset_write_48846 il_dbgfs_force_reset_write 0-3 48846 NULL ++insert_queue_48849 insert_queue 0 48849 NULL ++pcnet32_open_48852 pcnet32_open 0 48852 NULL ++rpf_s_ctrl_48853 rpf_s_ctrl 0 48853 NULL ++suspend_dtim_interval_write_48854 suspend_dtim_interval_write 3-0 48854 NULL nohasharray ++ath10k_wait_for_peer_common_48854 ath10k_wait_for_peer_common 0 48854 &suspend_dtim_interval_write_48854 ++ext2_get_xip_mem_48858 ext2_get_xip_mem 0 48858 NULL ++mwl8k_cmd_rf_tx_power_48860 mwl8k_cmd_rf_tx_power 0 48860 NULL ++seq_buf_buffer_left_48863 seq_buf_buffer_left 0 48863 NULL ++viafb_dvp1_proc_write_48864 viafb_dvp1_proc_write 3-0 48864 NULL ++submit_async_48869 submit_async 0 48869 NULL ++xgmac_change_mtu_48870 xgmac_change_mtu 0 48870 NULL ++_nfs4_proc_fs_locations_48874 _nfs4_proc_fs_locations 0 48874 NULL ++sys_setgroups16_48882 sys_setgroups16 1 48882 NULL ++chksum_final_48884 chksum_final 0 48884 NULL nohasharray ++carl9170_write_reg_48884 carl9170_write_reg 0 48884 &chksum_final_48884 ++get_xip_mem_48886 get_xip_mem 0 48886 NULL ++nlmon_change_mtu_48887 nlmon_change_mtu 0 48887 NULL ++ext2_alloc_branch_48889 ext2_alloc_branch 4 48889 NULL ++rt2x00mac_sta_add_48891 rt2x00mac_sta_add 0 48891 NULL nohasharray ++s2io_change_mtu_48891 s2io_change_mtu 0 48891 &rt2x00mac_sta_add_48891 ++adummy_open_48895 adummy_open 0 48895 NULL ++nouveau_hwmon_set_max_temp_hyst_48896 nouveau_hwmon_set_max_temp_hyst 0-4 48896 NULL ++joydev_handle_JSIOCSAXMAP_48898 joydev_handle_JSIOCSAXMAP 3 48898 NULL nohasharray ++MT2063_Tune_48898 MT2063_Tune 0 48898 &joydev_handle_JSIOCSAXMAP_48898 nohasharray ++mac_drv_rx_init_48898 mac_drv_rx_init 2 48898 &MT2063_Tune_48898 ++xdi_copy_to_user_48900 xdi_copy_to_user 4 48900 NULL nohasharray ++store_online_48900 store_online 0-4 48900 &xdi_copy_to_user_48900 ++set_in_max2_48905 set_in_max2 0-4 48905 NULL ++msg_hdr_sz_48908 msg_hdr_sz 0 48908 NULL ++ad5360_write_dac_powerdown_48909 ad5360_write_dac_powerdown 0-4 48909 NULL ++iptable_nat_ipv4_in_48914 iptable_nat_ipv4_in 0 48914 NULL ++rbd_pool_id_show_48916 rbd_pool_id_show 0 48916 NULL ++broadsheet_spiflash_write_page_48917 broadsheet_spiflash_write_page 0 48917 NULL ++gdth_isa_probe_one_48925 gdth_isa_probe_one 1 48925 NULL ++send_cmd_48933 send_cmd 0 48933 NULL ++tua9001_get_if_frequency_48934 tua9001_get_if_frequency 0 48934 NULL ++si5351_write_parameters_48940 si5351_write_parameters 2 48940 NULL ++gadget_strings_serialnumber_show_48944 gadget_strings_serialnumber_show 0 48944 NULL ++command_setecptiming_48948 command_setecptiming 0 48948 NULL ++cpu_cgroup_can_attach_48952 cpu_cgroup_can_attach 0 48952 NULL ++waitwarn_us_read_48954 waitwarn_us_read 0 48954 NULL ++br_dev_init_48956 br_dev_init 0 48956 NULL ++lio_target_np_show_sctp_48958 lio_target_np_show_sctp 0 48958 NULL ++register_new_memory_48959 register_new_memory 0 48959 NULL ++iscsi_tpg_param_store_IFMarker_48960 iscsi_tpg_param_store_IFMarker 0-3 48960 NULL ++event_heart_beat_read_48961 event_heart_beat_read 3-0 48961 NULL ++venus_fsync_48962 venus_fsync 0 48962 NULL ++pyra_sysfs_write_profile_settings_48963 pyra_sysfs_write_profile_settings 0-6-5 48963 NULL ++nand_ecc_test_run_48966 nand_ecc_test_run 1 48966 NULL ++stb6000_set_params_48968 stb6000_set_params 0 48968 NULL ++info_proc_write_48969 info_proc_write 0-3 48969 NULL ++lbmIOWait_48970 lbmIOWait 0 48970 NULL ++vmci_handle_arr_create_48971 vmci_handle_arr_create 1 48971 NULL ++ipr_free_dump_48976 ipr_free_dump 0 48976 NULL nohasharray ++devm_kmemdup_48976 devm_kmemdup 3 48976 &ipr_free_dump_48976 ++sha256_ssse3_final_48980 sha256_ssse3_final 0 48980 NULL nohasharray ++myri10ge_send_cmd_48980 myri10ge_send_cmd 0 48980 &sha256_ssse3_final_48980 ++nilfs_direct_IO_48981 nilfs_direct_IO 4-0 48981 NULL ++xfs_trans_commit_48982 xfs_trans_commit 0 48982 NULL ++get_target_48984 get_target 0 48984 NULL nohasharray ++bonding_show_primary_reselect_48984 bonding_show_primary_reselect 0 48984 &get_target_48984 ++ntb_transport_rx_enqueue_48986 ntb_transport_rx_enqueue 0 48986 NULL ++show_48988 show 0 48988 NULL ++_alloc_set_attr_list_48991 _alloc_set_attr_list 4 48991 NULL ++nes_store_nonidx_data_48992 nes_store_nonidx_data 0-3 48992 NULL ++xen_memory_notifier_48993 xen_memory_notifier 0 48993 NULL ++rds_rm_size_48996 rds_rm_size 0-2 48996 NULL nohasharray ++rionet_open_48996 rionet_open 0 48996 &rds_rm_size_48996 ++sel_write_enforce_48998 sel_write_enforce 3-0 48998 NULL ++tle62x0_gpio_show_48999 tle62x0_gpio_show 0 48999 NULL ++hib_bio_write_page_49000 hib_bio_write_page 0 49000 NULL ++dwmac1000_dma_init_49005 dwmac1000_dma_init 0 49005 NULL ++snd_card_saa7134_capture_prepare_49012 snd_card_saa7134_capture_prepare 0 49012 NULL ++ili210x_calibrate_49014 ili210x_calibrate 0-4 49014 NULL ++i915_error_state_to_str_49017 i915_error_state_to_str 0 49017 NULL ++ov9640_s_fmt_49018 ov9640_s_fmt 0 49018 NULL ++multicast_startup_query_interval_store_49019 multicast_startup_query_interval_store 4-0 49019 NULL nohasharray ++null_alloc_rs_49019 null_alloc_rs 2 49019 &multicast_startup_query_interval_store_49019 ++filemap_check_errors_49022 filemap_check_errors 0 49022 NULL ++cipso_v4_sock_setattr_49024 cipso_v4_sock_setattr 0 49024 NULL ++transient_status_49027 transient_status 4 49027 NULL ++ath5k_attr_store_ani_mode_49029 ath5k_attr_store_ani_mode 0-4 49029 NULL ++ll_xattr_cache_add_49032 ll_xattr_cache_add 4-0 49032 NULL ++ahci_show_host_version_49034 ahci_show_host_version 0 49034 NULL ++target_fabric_port_show_attr_alua_tg_pt_gp_49037 target_fabric_port_show_attr_alua_tg_pt_gp 0 49037 NULL nohasharray ++pvscsi_change_queue_depth_49037 pvscsi_change_queue_depth 0-2 49037 &target_fabric_port_show_attr_alua_tg_pt_gp_49037 ++pm_qos_resume_latency_store_49038 pm_qos_resume_latency_store 0-4 49038 NULL ++show_sas_expander_product_id_49046 show_sas_expander_product_id 0 49046 NULL ++bnad_rx_msix_register_49047 bnad_rx_msix_register 0 49047 NULL ++kovaplus_send_control_49052 kovaplus_send_control 0 49052 NULL nohasharray ++security_kernel_module_request_49052 security_kernel_module_request 0 49052 &kovaplus_send_control_49052 nohasharray ++setup_msi_irq_49052 setup_msi_irq 0 49052 &security_kernel_module_request_49052 ++ubi_read_49061 ubi_read 0 49061 NULL ++net2280_queue_49065 net2280_queue 0 49065 NULL nohasharray ++l2cap_bredr_sig_cmd_49065 l2cap_bredr_sig_cmd 3 49065 &net2280_queue_49065 ++rx_stats_read_49066 rx_stats_read 0 49066 NULL ++avoid_reset_quirk_store_49067 avoid_reset_quirk_store 0-4 49067 NULL ++read_regs_49068 read_regs 0 49068 NULL ++chv_gpio_request_49071 chv_gpio_request 0 49071 NULL ++ov7670_s_exp_49073 ov7670_s_exp 0 49073 NULL ++md_attr_store_49074 md_attr_store 0-4 49074 NULL ++dstr_read_regr_49075 dstr_read_regr 0 49075 NULL ++rj54n1_reg_init_49076 rj54n1_reg_init 0 49076 NULL nohasharray ++show_fan_49076 show_fan 0 49076 &rj54n1_reg_init_49076 ++show_crash_notes_49079 show_crash_notes 0 49079 NULL nohasharray ++atl2_change_mtu_49079 atl2_change_mtu 0 49079 &show_crash_notes_49079 ++cpia2_set_flicker_mode_49086 cpia2_set_flicker_mode 0 49086 NULL ++da9052_set_alarm_49087 da9052_set_alarm 0 49087 NULL ++wl12xx_sta_add_49093 wl12xx_sta_add 0 49093 NULL ++scsi_register_49094 scsi_register 2 49094 NULL ++compat_do_readv_writev_49102 compat_do_readv_writev 4 49102 NULL ++enic_dev_del_station_addr_49105 enic_dev_del_station_addr 0 49105 NULL ++reiserfs_statfs_49109 reiserfs_statfs 0 49109 NULL ++show_lanerev_enb_49114 show_lanerev_enb 0 49114 NULL nohasharray ++sanity_check_49114 sanity_check 0 49114 &show_lanerev_enb_49114 ++memcg_write_event_control_49119 memcg_write_event_control 0-3 49119 NULL ++ll_max_cached_mb_seq_write_49122 ll_max_cached_mb_seq_write 3 49122 NULL ++dn_check_state_49133 dn_check_state 0 49133 NULL ++pt_read_49136 pt_read 3-0 49136 NULL nohasharray ++qib_user_sdma_pin_pages_49136 qib_user_sdma_pin_pages 0-5-4 49136 &pt_read_49136 nohasharray ++netxen_setup_msi_interrupts_49136 netxen_setup_msi_interrupts 2 49136 &qib_user_sdma_pin_pages_49136 ++read_file_49137 read_file 4 49137 NULL ++affs_write_begin_49139 affs_write_begin 0-3 49139 NULL ++apds990x_prox_reporting_avail_show_49143 apds990x_prox_reporting_avail_show 0 49143 NULL ++wl1271_ps_elp_wakeup_49149 wl1271_ps_elp_wakeup 0 49149 NULL nohasharray ++bd2802_store_reg0x15_49149 bd2802_store_reg0x15 0-4 49149 &wl1271_ps_elp_wakeup_49149 ++target_core_dev_pr_show_attr_res_pr_all_tgt_pts_49150 target_core_dev_pr_show_attr_res_pr_all_tgt_pts 0 49150 NULL ++atyfb_setup_generic_49151 atyfb_setup_generic 3 49151 NULL nohasharray ++divas_read_49151 divas_read 0-3 49151 &atyfb_setup_generic_49151 nohasharray ++patch_vt1812_49151 patch_vt1812 0 49151 &divas_read_49151 ++bq24190_write_mask_49153 bq24190_write_mask 0 49153 NULL ++ipwireless_tty_received_49154 ipwireless_tty_received 3 49154 NULL ++f2fs_acl_count_49155 f2fs_acl_count 0-1 49155 NULL ++da903x_clr_bits_49158 da903x_clr_bits 0 49158 NULL ++gr_queue_49159 gr_queue 0 49159 NULL ++falcon_a1_mem_map_size_49160 falcon_a1_mem_map_size 0 49160 NULL nohasharray ++fm10k_update_uc_addr_vf_49160 fm10k_update_uc_addr_vf 0 49160 &falcon_a1_mem_map_size_49160 ++ipw_queue_tx_init_49161 ipw_queue_tx_init 3 49161 NULL ++xfs_file_buffered_aio_write_49162 xfs_file_buffered_aio_write 0 49162 NULL ++gpio_setup_irq_49163 gpio_setup_irq 0 49163 NULL ++lpfc_enable_fip_show_49166 lpfc_enable_fip_show 0 49166 NULL nohasharray ++fuse_notify_poll_49166 fuse_notify_poll 0 49166 &lpfc_enable_fip_show_49166 ++ext4_free_clusters_after_init_49174 ext4_free_clusters_after_init 2 49174 NULL ++__jfs_setxattr_49175 __jfs_setxattr 0-5 49175 NULL ++w1_master_probe_49176 w1_master_probe 0 49176 NULL ++ath6kl_bgscan_int_write_49178 ath6kl_bgscan_int_write 3-0 49178 NULL ++dvb_dvr_ioctl_49182 dvb_dvr_ioctl 2 49182 NULL ++phy_device_create_49190 phy_device_create 3 49190 NULL ++vmlfb_set_par_49191 vmlfb_set_par 0 49191 NULL ++xfs_da_grow_inode_49192 xfs_da_grow_inode 0 49192 NULL ++adv7180_mbus_fmt_49194 adv7180_mbus_fmt 0 49194 NULL ++sm501fb_debug_show_pnl_49195 sm501fb_debug_show_pnl 0 49195 NULL ++_iwl_dbgfs_netdetect_write_49196 _iwl_dbgfs_netdetect_write 3-0 49196 NULL ++iwl_dbgfs_ucode_general_stats_read_49199 iwl_dbgfs_ucode_general_stats_read 3-0 49199 NULL nohasharray ++i2c_nuvoton_recv_49199 i2c_nuvoton_recv 0-3 49199 &iwl_dbgfs_ucode_general_stats_read_49199 ++aio_read_null_49202 aio_read_null 0 49202 NULL ++il4965_rs_sta_dbgfs_stats_table_read_49206 il4965_rs_sta_dbgfs_stats_table_read 3-0 49206 NULL ++prepare_for_input_49207 prepare_for_input 0 49207 NULL ++do_jffs2_getxattr_49210 do_jffs2_getxattr 0 49210 NULL ++show_ipInUnknownProtos_49211 show_ipInUnknownProtos 0 49211 NULL ++show_local_ib_port_49215 show_local_ib_port 0 49215 NULL ++ceph_vxattrcb_dir_rbytes_49217 ceph_vxattrcb_dir_rbytes 0 49217 NULL ++target_stat_scsi_auth_intr_show_attr_read_mbytes_49221 target_stat_scsi_auth_intr_show_attr_read_mbytes 0 49221 NULL ++tpm_store_ppi_request_49225 tpm_store_ppi_request 0-4 49225 NULL ++nouveau_therm_create__49228 nouveau_therm_create_ 4 49228 NULL ++roccat_common2_sysfs_write_profile_settings_49229 roccat_common2_sysfs_write_profile_settings 0-6-5 49229 NULL nohasharray ++bad_file_splice_read_49229 bad_file_splice_read 0 49229 &roccat_common2_sysfs_write_profile_settings_49229 ++p2m_timeouts_show_49231 p2m_timeouts_show 0 49231 NULL ++smm665_show_crit_alarm_49232 smm665_show_crit_alarm 0 49232 NULL ++show_dh_state_49233 show_dh_state 0 49233 NULL nohasharray ++class_attr_store_49233 class_attr_store 0-4 49233 &show_dh_state_49233 ++stop_discovery_49237 stop_discovery 4 49237 NULL ++atxp1_showvcore_49238 atxp1_showvcore 0 49238 NULL ++v9fs_vfs_getattr_49240 v9fs_vfs_getattr 0 49240 NULL ++lpfc_fcp_class_show_49242 lpfc_fcp_class_show 0 49242 NULL nohasharray ++store_49242 store 0 49242 &lpfc_fcp_class_show_49242 ++ks8851_net_open_49243 ks8851_net_open 0 49243 NULL ++iio_buffer_read_length_49246 iio_buffer_read_length 0 49246 NULL ++get_write_access_49253 get_write_access 0 49253 NULL ++pmbus_regulator_disable_49257 pmbus_regulator_disable 0 49257 NULL nohasharray ++rtl2832_sdr_submit_urbs_49257 rtl2832_sdr_submit_urbs 0 49257 &pmbus_regulator_disable_49257 ++selinux_netlink_send_49259 selinux_netlink_send 0 49259 NULL nohasharray ++max8997_rtc_stop_alarm_49259 max8997_rtc_stop_alarm 0 49259 &selinux_netlink_send_49259 ++ieee80211_if_read_rssi_threshold_49260 ieee80211_if_read_rssi_threshold 3-0 49260 NULL ++__smsc75xx_read_reg_49264 __smsc75xx_read_reg 0 49264 NULL ++capture_pcm_prepare_49266 capture_pcm_prepare 0 49266 NULL ++isku_sysfs_read_keys_media_49268 isku_sysfs_read_keys_media 6-0-5 49268 NULL ++osd_req_add_get_attr_list_49278 osd_req_add_get_attr_list 3 49278 NULL nohasharray ++show_conn_param_ISCSI_PARAM_DATADGST_EN_49278 show_conn_param_ISCSI_PARAM_DATADGST_EN 0 49278 &osd_req_add_get_attr_list_49278 ++rx_filter_beacon_filter_read_49279 rx_filter_beacon_filter_read 3-0 49279 NULL ++nilfs_bmap_assign_49282 nilfs_bmap_assign 0 49282 NULL ++store_49284 store 0 49284 NULL ++bcache_dev_stripe_dirty_49286 bcache_dev_stripe_dirty 2 49286 NULL ++ext4_xattr_ibody_list_49287 ext4_xattr_ibody_list 0 49287 NULL nohasharray ++node_read_distance_49287 node_read_distance 0 49287 &ext4_xattr_ibody_list_49287 ++viafb_dfph_proc_write_49288 viafb_dfph_proc_write 3-0 49288 NULL ++store_49298 store 0-3 49298 NULL ++__niu_set_and_wait_clear_49299 __niu_set_and_wait_clear 0 49299 NULL ++uio_read_49300 uio_read 3-0 49300 NULL ++ocfs2_resmap_find_free_bits_49301 ocfs2_resmap_find_free_bits 3 49301 NULL ++bch_bset_print_stats_49303 bch_bset_print_stats 0 49303 NULL ++isku_sysfs_read_keys_macro_49312 isku_sysfs_read_keys_macro 6-0-5 49312 NULL ++request_locality_49318 request_locality 0 49318 NULL ++SYSC_mincore_49319 SYSC_mincore 2-1 49319 NULL ++stream_enqueue_49324 stream_enqueue 0 49324 NULL ++fwtty_port_handler_49327 fwtty_port_handler 9 49327 NULL ++show_freq_49329 show_freq 0 49329 NULL ++srpt_alloc_ioctx_ring_49330 srpt_alloc_ioctx_ring 3-4-2 49330 NULL ++__intel_map_single_49338 __intel_map_single 0-2 49338 NULL ++statfs_slow_fill_49342 statfs_slow_fill 0 49342 NULL ++cfpkt_setlen_49343 cfpkt_setlen 2 49343 NULL ++ipath_set_rx_pol_inv_49344 ipath_set_rx_pol_inv 0 49344 NULL ++_nfs4_do_setlk_49351 _nfs4_do_setlk 0 49351 NULL ++i40e_vsi_configure_49352 i40e_vsi_configure 0 49352 NULL ++inet6_getname_49353 inet6_getname 0 49353 NULL nohasharray ++pch_can_open_49353 pch_can_open 0 49353 &inet6_getname_49353 ++show_ipv6_iface_traffic_class_49355 show_ipv6_iface_traffic_class 0 49355 NULL nohasharray ++execute_49355 execute 0 49355 &show_ipv6_iface_traffic_class_49355 ++joydev_ioctl_common_49359 joydev_ioctl_common 2 49359 NULL ++input_dev_show_cap_snd_49368 input_dev_show_cap_snd 0 49368 NULL ++avtab_init_49369 avtab_init 0 49369 NULL ++px_raw_event_49371 px_raw_event 4 49371 NULL ++resync_start_show_49372 resync_start_show 0 49372 NULL ++da9052_bat_get_property_49379 da9052_bat_get_property 0 49379 NULL ++show_rpm_max_49388 show_rpm_max 0 49388 NULL ++iscsi_alloc_session_49390 iscsi_alloc_session 3 49390 NULL ++__ioremap_caller_49392 __ioremap_caller 2-1 49392 NULL nohasharray ++applesmc_create_nodes_49392 applesmc_create_nodes 2 49392 &__ioremap_caller_49392 ++show_sas_spec_support_status_49396 show_sas_spec_support_status 0 49396 NULL nohasharray ++rtsx_transfer_sglist_adma_partial_49396 rtsx_transfer_sglist_adma_partial 4 49396 &show_sas_spec_support_status_49396 ++bh1770_lux_calib_store_49400 bh1770_lux_calib_store 0-4 49400 NULL ++rx_streaming_always_read_49401 rx_streaming_always_read 3-0 49401 NULL ++acpi_ds_execute_arguments_49406 acpi_ds_execute_arguments 0 49406 NULL ++tnode_alloc_49407 tnode_alloc 1 49407 NULL ++rivafb_set_par_49411 rivafb_set_par 0 49411 NULL ++be_cmd_vlan_config_49413 be_cmd_vlan_config 0 49413 NULL ++tdfxfb_set_par_49414 tdfxfb_set_par 0 49414 NULL ++__mce_read_apei_49415 __mce_read_apei 0 49415 NULL ++quirk_pcie_aspm_write_49416 quirk_pcie_aspm_write 0 49416 NULL ++iscsi_nacl_attrib_show_random_r2t_offsets_49422 iscsi_nacl_attrib_show_random_r2t_offsets 0 49422 NULL ++hdmiphy_s_stream_49426 hdmiphy_s_stream 0 49426 NULL ++et131x_get_regs_len_49430 et131x_get_regs_len 0 49430 NULL ++md_domain_init_49432 md_domain_init 2 49432 NULL ++probe_kernel_read_49437 probe_kernel_read 0 49437 NULL ++compat_do_msg_fill_49440 compat_do_msg_fill 3 49440 NULL ++sctp_auth_asoc_init_active_key_49442 sctp_auth_asoc_init_active_key 0 49442 NULL ++i915_gem_object_set_to_gtt_domain_49450 i915_gem_object_set_to_gtt_domain 0 49450 NULL ++set_pwm_en_49451 set_pwm_en 0-4 49451 NULL ++__hfsplus_getxattr_49460 __hfsplus_getxattr 0 49460 NULL ++be_mcc_compl_process_49462 be_mcc_compl_process 0 49462 NULL ++agp_3_5_isochronous_node_enable_49465 agp_3_5_isochronous_node_enable 3 49465 NULL ++snd_ymfpci_capture_trigger_49466 snd_ymfpci_capture_trigger 0 49466 NULL ++mmc_name_show_49467 mmc_name_show 0 49467 NULL ++xfs_iformat_local_49472 xfs_iformat_local 4 49472 NULL ++dn_nsp_do_disc_49474 dn_nsp_do_disc 6 49474 NULL ++buf_prepare_49476 buf_prepare 0 49476 NULL ++fan_fan2_input_show_49478 fan_fan2_input_show 0 49478 NULL ++rhine_vlan_rx_add_vid_49482 rhine_vlan_rx_add_vid 0 49482 NULL ++tipc_bclink_get_mtu_49483 tipc_bclink_get_mtu 0 49483 NULL nohasharray ++b43legacy_validate_chipaccess_49483 b43legacy_validate_chipaccess 0 49483 &tipc_bclink_get_mtu_49483 nohasharray ++esp4_get_mtu_49483 esp4_get_mtu 0-2 49483 &b43legacy_validate_chipaccess_49483 ++ath10k_wmi_set_sta_ps_param_49484 ath10k_wmi_set_sta_ps_param 0 49484 NULL ++isr_decrypt_done_read_49490 isr_decrypt_done_read 3-0 49490 NULL ++r820t_read_49492 r820t_read 0-4 49492 NULL ++tpacpi_driver_wwan_emulstate_show_49494 tpacpi_driver_wwan_emulstate_show 0 49494 NULL ++ismt_access_49498 ismt_access 0 49498 NULL ++ql3xxx_open_49499 ql3xxx_open 0 49499 NULL ++show_fnode_tsid_49500 show_fnode_tsid 0 49500 NULL ++show_dts_ext_49503 show_dts_ext 0 49503 NULL ++acpi_ex_write_with_update_rule_49505 acpi_ex_write_with_update_rule 0 49505 NULL ++wake_lock_show_49508 wake_lock_show 0 49508 NULL ++show_offset_49516 show_offset 0 49516 NULL ++iwl_dbgfs_disable_power_off_read_49517 iwl_dbgfs_disable_power_off_read 3-0 49517 NULL nohasharray ++smp_execute_task_49517 smp_execute_task 0 49517 &iwl_dbgfs_disable_power_off_read_49517 ++pch_gbe_open_49518 pch_gbe_open 0 49518 NULL ++SyS_listxattr_49519 SyS_listxattr 3 49519 NULL ++__sock_recvmsg_nosec_49520 __sock_recvmsg_nosec 0-4 49520 NULL nohasharray ++logical_ring_flush_all_caches_49520 logical_ring_flush_all_caches 0 49520 &__sock_recvmsg_nosec_49520 ++show_tcpOutSegs_49528 show_tcpOutSegs 0 49528 NULL nohasharray ++light_write_49528 light_write 0 49528 &show_tcpOutSegs_49528 nohasharray ++read_partial_49528 read_partial 2 49528 &light_write_49528 ++tda18271_write_regs_49537 tda18271_write_regs 0 49537 NULL ++netxen_issue_cmd_49538 netxen_issue_cmd 0 49538 NULL ++squashfs_trusted_list_49541 squashfs_trusted_list 0-5 49541 NULL ++s6e63m0_sysfs_show_gamma_table_49544 s6e63m0_sysfs_show_gamma_table 0 49544 NULL ++ntc_show_type_49546 ntc_show_type 0 49546 NULL ++show_attr_textmode_49550 show_attr_textmode 0 49550 NULL ++MIDIbuf_read_49551 MIDIbuf_read 0 49551 NULL ++__brcmf_cfg80211_up_49557 __brcmf_cfg80211_up 0 49557 NULL ++rx_queue_add_kobject_49559 rx_queue_add_kobject 0 49559 NULL ++smk_write_access_49561 smk_write_access 3-0 49561 NULL ++read_status_49562 read_status 0 49562 NULL ++proc_dev_atm_read_49563 proc_dev_atm_read 0-3 49563 NULL ++nilfs_btree_delete_49566 nilfs_btree_delete 0 49566 NULL ++show_taint_49568 show_taint 0 49568 NULL nohasharray ++hsr_netdev_notify_49568 hsr_netdev_notify 0 49568 &show_taint_49568 ++major_show_49571 major_show 0 49571 NULL ++ntfs_malloc_nofs_49572 ntfs_malloc_nofs 1 49572 NULL ++alloc_chunk_49575 alloc_chunk 1 49575 NULL ++sctp_setsockopt_default_send_param_49578 sctp_setsockopt_default_send_param 3-0 49578 NULL ++show_in_alarm_49582 show_in_alarm 0 49582 NULL ++readfifo_49583 readfifo 1 49583 NULL ++gfs2_quota_lock_49587 gfs2_quota_lock 0 49587 NULL ++aty_valid_pll_ct_49589 aty_valid_pll_ct 0 49589 NULL nohasharray ++cpu_mask_to_apicid_and_49589 cpu_mask_to_apicid_and 0 49589 &aty_valid_pll_ct_49589 ++usbhid_get_power_49590 usbhid_get_power 0 49590 NULL ++frag_rx_path_49593 frag_rx_path 3 49593 NULL ++evm_inode_setattr_49594 evm_inode_setattr 0 49594 NULL nohasharray ++tpacpi_rfk_sysfs_enable_store_49594 tpacpi_rfk_sysfs_enable_store 0-4 49594 &evm_inode_setattr_49594 ++elants_i2c_fw_update_49595 elants_i2c_fw_update 0 49595 NULL ++snd_emu10k1_efx_playback_prepare_49597 snd_emu10k1_efx_playback_prepare 0 49597 NULL ++ceph_key_preparse_49602 ceph_key_preparse 0 49602 NULL ++usbtv_select_input_49603 usbtv_select_input 0 49603 NULL ++ocfs2_xattr_trusted_list_49606 ocfs2_xattr_trusted_list 0-5 49606 NULL nohasharray ++mcs7830_hif_set_mac_address_49606 mcs7830_hif_set_mac_address 0 49606 &ocfs2_xattr_trusted_list_49606 nohasharray ++pch_phub_write_gbe_mac_addr_49606 pch_phub_write_gbe_mac_addr 0 49606 &mcs7830_hif_set_mac_address_49606 ++isr_wakeups_read_49607 isr_wakeups_read 3-0 49607 NULL ++f_get_base_info_49609 f_get_base_info 0 49609 NULL ++show_therm_crit_alarm_49611 show_therm_crit_alarm 0 49611 NULL ++cfq_group_idle_show_49612 cfq_group_idle_show 0 49612 NULL ++compat_SyS_fcntl64_49613 compat_SyS_fcntl64 3 49613 NULL ++qla4_83xx_set_idc_ver_49615 qla4_83xx_set_idc_ver 0 49615 NULL ++btrfs_mksubvol_49616 btrfs_mksubvol 3 49616 NULL nohasharray ++mt2060_get_if_frequency_49616 mt2060_get_if_frequency 0 49616 &btrfs_mksubvol_49616 nohasharray ++complete_walk_49616 complete_walk 0 49616 &mt2060_get_if_frequency_49616 ++xfs_attr3_leaf_add_49617 xfs_attr3_leaf_add 0 49617 NULL ++vt596_transaction_49618 vt596_transaction 0 49618 NULL ++smk_write_doi_49621 smk_write_doi 3-0 49621 NULL nohasharray ++ath10k_htc_init_49621 ath10k_htc_init 0 49621 &smk_write_doi_49621 ++port_fops_read_49626 port_fops_read 3-0 49626 NULL ++v4l2_m2m_qbuf_49627 v4l2_m2m_qbuf 0 49627 NULL ++btrfsic_cmp_log_and_dev_bytenr_49628 btrfsic_cmp_log_and_dev_bytenr 2 49628 NULL ++ecryptfs_permission_49634 ecryptfs_permission 0 49634 NULL nohasharray ++cbaf_cdid_get_49634 cbaf_cdid_get 0 49634 &ecryptfs_permission_49634 ++v9fs_lookup_revalidate_49638 v9fs_lookup_revalidate 0 49638 NULL ++raw_enable_allfilters_49639 raw_enable_allfilters 0 49639 NULL ++max_user_freq_show_49643 max_user_freq_show 0 49643 NULL ++pyra_sysfs_read_info_49669 pyra_sysfs_read_info 0-5-6 49669 NULL ++match_int_49672 match_int 0 49672 NULL ++__hci_req_sync_49680 __hci_req_sync 0 49680 NULL ++ubi_wl_flush_49682 ubi_wl_flush 0 49682 NULL ++aa_simple_write_to_buffer_49683 aa_simple_write_to_buffer 4-3 49683 NULL nohasharray ++lp5562_run_predef_led_pattern_49683 lp5562_run_predef_led_pattern 0 49683 &aa_simple_write_to_buffer_49683 ++SyS_pwritev_49688 SyS_pwritev 3 49688 NULL ++fw_status_49690 fw_status 0 49690 NULL ++__setup_irq_49696 __setup_irq 0 49696 NULL ++sys_gethostname_49698 sys_gethostname 2 49698 NULL ++snd_usb_endpoint_set_params_49703 snd_usb_endpoint_set_params 0 49703 NULL nohasharray ++tcp_sacktag_walk_49703 tcp_sacktag_walk 5-6 49703 &snd_usb_endpoint_set_params_49703 ++picolcd_operation_mode_delay_show_49709 picolcd_operation_mode_delay_show 0 49709 NULL ++vnic_dev_add_addr_49710 vnic_dev_add_addr 0 49710 NULL nohasharray ++do_iter_readv_writev_49710 do_iter_readv_writev 0 49710 &vnic_dev_add_addr_49710 ++show_online_49713 show_online 0 49713 NULL ++do_splice_to_49714 do_splice_to 0-4 49714 NULL ++write_pool_49718 write_pool 3-0 49718 NULL ++create_modalias_49720 create_modalias 0 49720 NULL ++alloc_kmem_cache_node_49725 alloc_kmem_cache_node 0 49725 NULL ++pcnet_open_49729 pcnet_open 0 49729 NULL ++dev_pm_qos_constraints_allocate_49731 dev_pm_qos_constraints_allocate 0 49731 NULL ++sys_fsetxattr_49736 sys_fsetxattr 4 49736 NULL ++write_exec_49737 write_exec 0 49737 NULL nohasharray ++cbaf_send_host_info_49737 cbaf_send_host_info 0 49737 &write_exec_49737 ++check_frame_49741 check_frame 0 49741 NULL ++ixgbe_vlan_rx_add_vid_49743 ixgbe_vlan_rx_add_vid 0 49743 NULL ++iio_show_dev_name_49744 iio_show_dev_name 0 49744 NULL nohasharray ++zd_usb_iowrite16v_49744 zd_usb_iowrite16v 3 49744 &iio_show_dev_name_49744 ++show_usblim_49746 show_usblim 0 49746 NULL nohasharray ++uvc_init_video_49746 uvc_init_video 0 49746 &show_usblim_49746 ++firmware_loading_show_49748 firmware_loading_show 0 49748 NULL ++__niu_wait_bits_clear_ipp_49750 __niu_wait_bits_clear_ipp 0 49750 NULL ++btrfs_chunk_num_stripes_49751 btrfs_chunk_num_stripes 0 49751 NULL ++fuse_wr_pages_49753 fuse_wr_pages 0-2-1 49753 NULL ++lifetime_write_kbytes_show_49754 lifetime_write_kbytes_show 0 49754 NULL ++pb0100_set_red_balance_49756 pb0100_set_red_balance 0 49756 NULL ++nci_skb_alloc_49757 nci_skb_alloc 2 49757 NULL ++key_conf_keylen_read_49758 key_conf_keylen_read 3-0 49758 NULL nohasharray ++zr364xx_prepare_49758 zr364xx_prepare 0 49758 &key_conf_keylen_read_49758 nohasharray ++cfg80211_vendor_event_alloc_49758 cfg80211_vendor_event_alloc 2 49758 &zr364xx_prepare_49758 ++acpi_ps_get_next_namepath_49760 acpi_ps_get_next_namepath 0 49760 NULL ++ceph_uninline_data_49761 ceph_uninline_data 0 49761 NULL ++fuse_conn_waiting_read_49762 fuse_conn_waiting_read 3-0 49762 NULL ++mx2_camera_get_formats_49765 mx2_camera_get_formats 0 49765 NULL nohasharray ++show_ipv4_iface_gateway_49765 show_ipv4_iface_gateway 0 49765 &mx2_camera_get_formats_49765 nohasharray ++nmi_suspend_49765 nmi_suspend 0 49765 &show_ipv4_iface_gateway_49765 ++isku_sysfs_write_49767 isku_sysfs_write 0-5 49767 NULL ++ivtvfb_set_var_49771 ivtvfb_set_var 0 49771 NULL ++dev_show_49780 dev_show 0 49780 NULL ++set_port0_handler_49783 set_port0_handler 4-0 49783 NULL nohasharray ++be_mac_addr_set_49783 be_mac_addr_set 0 49783 &set_port0_handler_49783 nohasharray ++apds990x_set_lux_thresh_49783 apds990x_set_lux_thresh 0 49783 &be_mac_addr_set_49783 ++C_SYSC_recv_49784 C_SYSC_recv 3 49784 NULL ++toshiba_touchpad_set_49788 toshiba_touchpad_set 0 49788 NULL ++ceph_osdc_readpages_49789 ceph_osdc_readpages 0 49789 NULL nohasharray ++qla4_83xx_check_cmd_peg_status_49789 qla4_83xx_check_cmd_peg_status 0 49789 &ceph_osdc_readpages_49789 ++i40e_sync_vsi_filters_49791 i40e_sync_vsi_filters 0 49791 NULL ++nfs_file_fsync_49792 nfs_file_fsync 0 49792 NULL ++store_ideapad_cam_49794 store_ideapad_cam 0-4 49794 NULL ++nilfs_segctor_README_show_49796 nilfs_segctor_README_show 0 49796 NULL ++asiliantfb_check_var_49807 asiliantfb_check_var 0 49807 NULL nohasharray ++__of_parse_phandle_with_args_49807 __of_parse_phandle_with_args 0 49807 &asiliantfb_check_var_49807 ++xfs_buf_submit_wait_49810 xfs_buf_submit_wait 0 49810 NULL ++po1030_set_hvflip_49811 po1030_set_hvflip 0 49811 NULL ++show_config_pending_49814 show_config_pending 0 49814 NULL ++v9fs_file_fsync_dotl_49822 v9fs_file_fsync_dotl 0 49822 NULL ++nilfs_dev_revision_show_49827 nilfs_dev_revision_show 0 49827 NULL ++ntfs_copy_from_user_iovec_49829 ntfs_copy_from_user_iovec 0-6-3 49829 NULL ++add_uuid_49831 add_uuid 4 49831 NULL nohasharray ++ns_get_name_49831 ns_get_name 0 49831 &add_uuid_49831 ++tcf_csum_ipv4_tcp_49834 tcf_csum_ipv4_tcp 3 49834 NULL ++ath6kl_fwlog_block_read_49836 ath6kl_fwlog_block_read 3-0 49836 NULL ++snd_azf3328_pcm_prepare_49838 snd_azf3328_pcm_prepare 0 49838 NULL nohasharray ++pci_add_dynid_49838 pci_add_dynid 0 49838 &snd_azf3328_pcm_prepare_49838 ++twl4030_write_49846 twl4030_write 2 49846 NULL ++show_lut_temp_49847 show_lut_temp 0 49847 NULL ++scsi_dispatch_cmd_entry_49848 scsi_dispatch_cmd_entry 3-0 49848 NULL ++timeradd_entry_49850 timeradd_entry 3-0 49850 NULL ++ecryptfs_statfs_49853 ecryptfs_statfs 0 49853 NULL ++udplite_sk_init_49856 udplite_sk_init 0 49856 NULL ++uart_write_49863 uart_write 0-3 49863 NULL ++store_modes_49864 store_modes 0-4 49864 NULL ++e1000_setup_tx_resources_49867 e1000_setup_tx_resources 0 49867 NULL ++____request_module_49868 ____request_module 0 49868 NULL ++sctp_setsockopt_bindx_49870 sctp_setsockopt_bindx 0-3 49870 NULL ++carl9170_op_get_stats_49871 carl9170_op_get_stats 0 49871 NULL ++wm831x_rtc_stop_alarm_49875 wm831x_rtc_stop_alarm 0 49875 NULL ++s_filter_49877 s_filter 0 49877 NULL ++show_volt_max_49881 show_volt_max 0 49881 NULL ++kovaplus_sysfs_read_profile_settings_49882 kovaplus_sysfs_read_profile_settings 0-5-6 49882 NULL ++il_send_cmd_pdu_async_49891 il_send_cmd_pdu_async 0 49891 NULL ++tgr192_init_49892 tgr192_init 0 49892 NULL ++ovs_key_attr_size_49898 ovs_key_attr_size 0 49898 NULL ++bnx2x_open_49905 bnx2x_open 0 49905 NULL ++ea_put_49907 ea_put 0 49907 NULL ++qnx4_statfs_49911 qnx4_statfs 0 49911 NULL ++available_governors_show_49912 available_governors_show 0 49912 NULL nohasharray ++ecryptfs_filldir_49912 ecryptfs_filldir 3 49912 &available_governors_show_49912 ++fuse_send_write_49915 fuse_send_write 0-4 49915 NULL ++bsp_pm_callback_49917 bsp_pm_callback 0 49917 NULL ++show_voltage_label_49923 show_voltage_label 0 49923 NULL nohasharray ++megasas_fw_crash_state_store_49923 megasas_fw_crash_state_store 0-4 49923 &show_voltage_label_49923 ++_cpu_up_49927 _cpu_up 0 49927 NULL ++beacon_timeout_ms_store_49935 beacon_timeout_ms_store 0-4 49935 NULL ++mxl301rf_set_params_49936 mxl301rf_set_params 0 49936 NULL ++gnttab_setup_auto_xlat_frames_49940 gnttab_setup_auto_xlat_frames 1 49940 NULL ++tpm_get_random_49950 tpm_get_random 0 49950 NULL ++iscsi_nacl_attrib_show_default_erl_49955 iscsi_nacl_attrib_show_default_erl 0 49955 NULL ++saa7706h_i2c_transfer_49957 saa7706h_i2c_transfer 3 49957 NULL ++snd_soundfont_load_49964 snd_soundfont_load 0-3 49964 NULL ++store_temp_auto_boost_49966 store_temp_auto_boost 0-4 49966 NULL ++bDeviceSubClass_show_49970 bDeviceSubClass_show 0 49970 NULL ++volume_write_49971 volume_write 0 49971 NULL ++set_a_bus_drop_49973 set_a_bus_drop 0-4 49973 NULL ++wl1251_boot_upload_firmware_49975 wl1251_boot_upload_firmware 0 49975 NULL nohasharray ++store_49975 store 0 49975 &wl1251_boot_upload_firmware_49975 ++qla4xxx_hw_reset_49976 qla4xxx_hw_reset 0 49976 NULL ++b43legacy_pio_read_49978 b43legacy_pio_read 0 49978 NULL ++set_attr_textmode_49984 set_attr_textmode 0-4 49984 NULL ++ct_pcm_playback_prepare_49985 ct_pcm_playback_prepare 0 49985 NULL ++ieee80211_if_fmt_dtim_count_49987 ieee80211_if_fmt_dtim_count 3 49987 NULL nohasharray ++hdcs_reg_write_seq_49987 hdcs_reg_write_seq 0 49987 &ieee80211_if_fmt_dtim_count_49987 ++rcu_expedited_show_49988 rcu_expedited_show 0 49988 NULL ++drm_buffer_copy_from_user_49990 drm_buffer_copy_from_user 3 49990 NULL ++wm831x_isink_disable_49991 wm831x_isink_disable 0 49991 NULL ++__mlx4_replace_mac_49992 __mlx4_replace_mac 0 49992 NULL ++sta2x11_swiotlb_alloc_coherent_49994 sta2x11_swiotlb_alloc_coherent 2 49994 NULL ++run_49996 run 0 49996 NULL ++write_49997 write 0 49997 NULL ++__module_alloc_50004 __module_alloc 1 50004 NULL ++cx231xx_i2c_send_bytes_50007 cx231xx_i2c_send_bytes 0 50007 NULL nohasharray ++group_addr_store_50007 group_addr_store 0-4 50007 &cx231xx_i2c_send_bytes_50007 ++dn_mss_from_pmtu_50011 dn_mss_from_pmtu 0-2 50011 NULL ++security_context_to_sid_50019 security_context_to_sid 2-0 50019 NULL nohasharray ++ASIE_show_50019 ASIE_show 0 50019 &security_context_to_sid_50019 ++isdn_read_50021 isdn_read 3-0 50021 NULL ++move_to_new_page_50023 move_to_new_page 0 50023 NULL ++rose_device_event_50026 rose_device_event 0 50026 NULL ++xlog_recovery_process_trans_50028 xlog_recovery_process_trans 4 50028 NULL nohasharray ++qp_alloc_queue_50028 qp_alloc_queue 1 50028 &xlog_recovery_process_trans_50028 ++set_mtu_50032 set_mtu 0 50032 NULL ++ath10k_wmi_pdev_pktlog_enable_50033 ath10k_wmi_pdev_pktlog_enable 0 50033 NULL ++sky2_open_50034 sky2_open 0 50034 NULL ++do_set_pwm_mode_50035 do_set_pwm_mode 0 50035 NULL ++read_partial_message_section_50036 read_partial_message_section 3 50036 NULL ++acpi_ut_copy_ipackage_to_epackage_50038 acpi_ut_copy_ipackage_to_epackage 0 50038 NULL ++dbg_chk_lpt_free_spc_50040 dbg_chk_lpt_free_spc 0 50040 NULL nohasharray ++nf_sockopt_50040 nf_sockopt 0 50040 &dbg_chk_lpt_free_spc_50040 nohasharray ++wait_for_free_request_50040 wait_for_free_request 0 50040 &nf_sockopt_50040 ++target_stat_scsi_tgt_dev_show_attr_resets_50044 target_stat_scsi_tgt_dev_show_attr_resets 0 50044 NULL ++wl1251_hw_init_mem_config_50045 wl1251_hw_init_mem_config 0 50045 NULL nohasharray ++iscsi_tpg_attrib_store_t10_pi_50045 iscsi_tpg_attrib_store_t10_pi 0-3 50045 &wl1251_hw_init_mem_config_50045 ++alloc_ebda_hpc_50046 alloc_ebda_hpc 1-2 50046 NULL ++ioread8_50049 ioread8 0 50049 NULL ++sctp_copy_local_addr_list_50054 sctp_copy_local_addr_list 0 50054 NULL nohasharray ++target_stat_scsi_auth_intr_show_attr_num_cmds_50054 target_stat_scsi_auth_intr_show_attr_num_cmds 0 50054 &sctp_copy_local_addr_list_50054 ++fuse_conn_max_background_write_50061 fuse_conn_max_background_write 3-0 50061 NULL ++reserve_grant_head_show_50063 reserve_grant_head_show 0 50063 NULL ++max8660_ldo67_enable_50073 max8660_ldo67_enable 0 50073 NULL ++lx_pipe_state_50076 lx_pipe_state 0 50076 NULL ++multicast_last_member_count_store_50078 multicast_last_member_count_store 4-0 50078 NULL ++dev_set_alias_50084 dev_set_alias 3-0 50084 NULL ++pcpu_get_vm_areas_50085 pcpu_get_vm_areas 3 50085 NULL ++libcfs_ioctl_popdata_50087 libcfs_ioctl_popdata 3 50087 NULL ++sock_setsockopt_50088 sock_setsockopt 5-0 50088 NULL ++altera_swap_dr_50090 altera_swap_dr 2 50090 NULL ++afs_writepages_50092 afs_writepages 0 50092 NULL ++card_type_show_50095 card_type_show 0 50095 NULL ++il4965_restore_default_wep_keys_50096 il4965_restore_default_wep_keys 0 50096 NULL ++android_set_cntry_50100 android_set_cntry 0 50100 NULL ++uwb_rc_beacon_50102 uwb_rc_beacon 0 50102 NULL ++epp_write_addr_50103 epp_write_addr 0 50103 NULL ++xc5000_set_digital_params_50105 xc5000_set_digital_params 0 50105 NULL ++read_file_slot_50111 read_file_slot 3-0 50111 NULL ++tw9910_cropcap_50113 tw9910_cropcap 0 50113 NULL ++mon_text_read_t_50115 mon_text_read_t 0-3 50115 NULL ++show_chassis_clear_50119 show_chassis_clear 0 50119 NULL ++rx_streaming_interval_write_50120 rx_streaming_interval_write 3-0 50120 NULL nohasharray ++show_counter_ib_symbol_errs_50120 show_counter_ib_symbol_errs 0 50120 &rx_streaming_interval_write_50120 ++roccat_common2_sysfs_write_light_50130 roccat_common2_sysfs_write_light 0-6-5 50130 NULL ++wake_up_wlan_store_50132 wake_up_wlan_store 0-4 50132 NULL nohasharray ++elan_i2c_finish_fw_update_50132 elan_i2c_finish_fw_update 0 50132 &wake_up_wlan_store_50132 ++SYSC_preadv_50134 SYSC_preadv 3 50134 NULL nohasharray ++udf_adinicb_writepage_50134 udf_adinicb_writepage 0 50134 &SYSC_preadv_50134 ++dimmdev_label_show_50135 dimmdev_label_show 0 50135 NULL ++mei_cl_flow_ctrl_reduce_50137 mei_cl_flow_ctrl_reduce 0 50137 NULL ++suspend_devices_and_enter_50139 suspend_devices_and_enter 0 50139 NULL ++rbd_dev_refresh_50142 rbd_dev_refresh 0 50142 NULL ++store_fan_full_speed_50143 store_fan_full_speed 0-4 50143 NULL ++xenbus_write_transaction_50146 xenbus_write_transaction 0 50146 NULL ++ata_scsi_activity_show_50149 ata_scsi_activity_show 0 50149 NULL ++__uncore_xbr_mask_show_50150 __uncore_xbr_mask_show 0 50150 NULL ++csrow_mem_type_show_50152 csrow_mem_type_show 0 50152 NULL ++tx_frag_need_fragmentation_read_50153 tx_frag_need_fragmentation_read 3-0 50153 NULL nohasharray ++show_min_uA_50153 show_min_uA 0 50153 &tx_frag_need_fragmentation_read_50153 ++xfs_bwrite_50154 xfs_bwrite 0 50154 NULL ++show_fc_rport_port_name_50155 show_fc_rport_port_name 0 50155 NULL ++reiserfs_bmap_count_50160 reiserfs_bmap_count 0 50160 NULL ++aac_nark_ioremap_50163 aac_nark_ioremap 2 50163 NULL nohasharray ++kmalloc_node_50163 kmalloc_node 1 50163 &aac_nark_ioremap_50163 ++arch_check_ftrace_location_50164 arch_check_ftrace_location 0 50164 NULL ++rx_refill_50166 rx_refill 0 50166 NULL ++rx_filter_ibss_filter_read_50167 rx_filter_ibss_filter_read 3-0 50167 NULL ++ahd_probe_stack_size_50168 ahd_probe_stack_size 0 50168 NULL ++odev_update_50169 odev_update 2-0 50169 NULL ++ieee80211_if_fmt_dot11MeshHWMPRannInterval_50172 ieee80211_if_fmt_dot11MeshHWMPRannInterval 3 50172 NULL nohasharray ++ubi_resize_volume_50172 ubi_resize_volume 2 50172 &ieee80211_if_fmt_dot11MeshHWMPRannInterval_50172 ++bInterfaceSubClass_show_50176 bInterfaceSubClass_show 0 50176 NULL ++xfs_dbg_store_50177 xfs_dbg_store 0-4 50177 NULL ++ext3_do_update_inode_50178 ext3_do_update_inode 0 50178 NULL ++mxl111sf_tuner_program_regs_50179 mxl111sf_tuner_program_regs 0 50179 NULL ++udc_create_dma_chain_50185 udc_create_dma_chain 0 50185 NULL ++ib_send_cm_drep_50186 ib_send_cm_drep 3 50186 NULL ++store_beep_50196 store_beep 0-4 50196 NULL ++max_medium_access_timeouts_show_50197 max_medium_access_timeouts_show 0 50197 NULL ++cfg80211_roamed_bss_50198 cfg80211_roamed_bss 6-4 50198 NULL ++cyttsp4_probe_50201 cyttsp4_probe 4 50201 NULL ++ahci_show_host_caps_50203 ahci_show_host_caps 0 50203 NULL ++rx_rx_timeout_wa_read_50204 rx_rx_timeout_wa_read 3-0 50204 NULL nohasharray ++store_falltime_50204 store_falltime 4-0 50204 &rx_rx_timeout_wa_read_50204 ++mthca_buddy_init_50206 mthca_buddy_init 2 50206 NULL nohasharray ++compat_SyS_sendfile_50206 compat_SyS_sendfile 4 50206 &mthca_buddy_init_50206 ++l2cap_sock_setsockopt_50207 l2cap_sock_setsockopt 5-0 50207 NULL ++ieee80211_skb_resize_50211 ieee80211_skb_resize 3 50211 NULL ++seq_buf_to_user_50213 seq_buf_to_user 3 50213 NULL ++acm_submit_read_urbs_50216 acm_submit_read_urbs 0 50216 NULL ++loadtime_init_50221 loadtime_init 0 50221 NULL ++igbvf_set_mac_50224 igbvf_set_mac 0 50224 NULL ++mon_bin_compat_ioctl_50234 mon_bin_compat_ioctl 3 50234 NULL ++sg_kmalloc_50240 sg_kmalloc 1 50240 NULL nohasharray ++nilfs_cpfile_get_stat_50240 nilfs_cpfile_get_stat 0 50240 &sg_kmalloc_50240 ++adp8870_bl_l5_dark_max_store_50252 adp8870_bl_l5_dark_max_store 4-0 50252 NULL ++cx25821_s_ctrl_50261 cx25821_s_ctrl 0 50261 NULL nohasharray ++gadget_config_desc_MaxPower_show_50261 gadget_config_desc_MaxPower_show 0 50261 &cx25821_s_ctrl_50261 nohasharray ++afs_extract_data_50261 afs_extract_data 5 50261 &gadget_config_desc_MaxPower_show_50261 ++igb_init_interrupt_scheme_50262 igb_init_interrupt_scheme 0 50262 NULL ++vlan_dev_hard_header_50263 vlan_dev_hard_header 0 50263 NULL ++isci_phy_control_50264 isci_phy_control 0 50264 NULL ++vlan_dev_init_50267 vlan_dev_init 0 50267 NULL nohasharray ++pwm1_store_50267 pwm1_store 4-0 50267 &vlan_dev_init_50267 ++cifs_setattr_unix_50275 cifs_setattr_unix 0 50275 NULL ++con2fb_acquire_newinfo_50278 con2fb_acquire_newinfo 0 50278 NULL ++ahci_led_show_50279 ahci_led_show 0 50279 NULL ++netlink_send_50281 netlink_send 0 50281 NULL ++input_bits_to_string_50285 input_bits_to_string 0 50285 NULL ++rxrpc_setsockopt_50286 rxrpc_setsockopt 5-0 50286 NULL ++store_50289 store 0-3 50289 NULL ++show_in10_50295 show_in10 0 50295 NULL ++vidioc_streamon_50299 vidioc_streamon 0 50299 NULL nohasharray ++iscsi_tpg_param_store_ImmediateData_50299 iscsi_tpg_param_store_ImmediateData 0-3 50299 &vidioc_streamon_50299 ++soc_codec_reg_show_50302 soc_codec_reg_show 0-3 50302 NULL ++ath10k_mac_set_kickout_50303 ath10k_mac_set_kickout 0 50303 NULL ++SYSC_flistxattr_50307 SYSC_flistxattr 3 50307 NULL ++SYSC_sched_setaffinity_50310 SYSC_sched_setaffinity 2 50310 NULL nohasharray ++pch_gbe_alloc_rx_buffers_pool_50310 pch_gbe_alloc_rx_buffers_pool 0 50310 &SYSC_sched_setaffinity_50310 ++snd_fm801_playback_trigger_50312 snd_fm801_playback_trigger 0 50312 NULL ++tps65912_gpio_output_50313 tps65912_gpio_output 0 50313 NULL ++cond_init_bool_indexes_50314 cond_init_bool_indexes 0 50314 NULL ++soc_camera_read_50319 soc_camera_read 3-0 50319 NULL ++b43_phy_ht_op_init_50321 b43_phy_ht_op_init 0 50321 NULL ++sdr_cap_start_streaming_50324 sdr_cap_start_streaming 0 50324 NULL nohasharray ++batadv_mesh_init_50324 batadv_mesh_init 0 50324 &sdr_cap_start_streaming_50324 ++ds2781_recall_eeprom_50328 ds2781_recall_eeprom 0 50328 NULL ++do_launder_page_50329 do_launder_page 0 50329 NULL ++nouveau_engine_create__50331 nouveau_engine_create_ 7 50331 NULL ++picolcd_fb_update_rate_show_50333 picolcd_fb_update_rate_show 0 50333 NULL ++lpfc_idiag_pcicfg_read_50334 lpfc_idiag_pcicfg_read 3-0 50334 NULL ++snd_pcm_lib_writev_50337 snd_pcm_lib_writev 3-0 50337 NULL nohasharray ++ocfs2_block_to_cluster_group_50337 ocfs2_block_to_cluster_group 2 50337 &snd_pcm_lib_writev_50337 ++roccat_common2_send_with_status_50343 roccat_common2_send_with_status 0-4 50343 NULL ++tpm_read_50344 tpm_read 3-0 50344 NULL ++set_auto_brightness_50345 set_auto_brightness 0 50345 NULL ++__orinoco_up_50349 __orinoco_up 0 50349 NULL ++nr_overcommit_hugepages_show_50351 nr_overcommit_hugepages_show 0 50351 NULL ++efx_nic_update_stats_50352 efx_nic_update_stats 2 50352 NULL ++selinux_file_permission_50354 selinux_file_permission 0 50354 NULL ++isdn_ppp_read_50356 isdn_ppp_read 4-0 50356 NULL ++unpack_u16_chunk_50357 unpack_u16_chunk 0 50357 NULL ++iwl_dbgfs_echo_test_write_50362 iwl_dbgfs_echo_test_write 3-0 50362 NULL nohasharray ++solo_enc_on_50362 solo_enc_on 0 50362 &iwl_dbgfs_echo_test_write_50362 nohasharray ++ds2781_set_rsgain_setting_50362 ds2781_set_rsgain_setting 0-4 50362 &solo_enc_on_50362 ++setbrightness_50365 setbrightness 0 50365 NULL nohasharray ++xfrm_send_migrate_50365 xfrm_send_migrate 5 50365 &setbrightness_50365 ++toshiba_available_kbd_modes_show_50369 toshiba_available_kbd_modes_show 0 50369 NULL nohasharray ++roccat_common2_receive_50369 roccat_common2_receive 0-4 50369 &toshiba_available_kbd_modes_show_50369 ++store_pwm_temp_sel_50371 store_pwm_temp_sel 0-4 50371 NULL ++set_ctrl_50374 set_ctrl 0 50374 NULL ++sl_alloc_bufs_50380 sl_alloc_bufs 2 50380 NULL ++tg3_reset_hw_50381 tg3_reset_hw 0 50381 NULL ++store_temp62_50383 store_temp62 0-4 50383 NULL ++may_change_ptraced_domain_50385 may_change_ptraced_domain 0 50385 NULL ++acpi_ds_scope_stack_pop_50387 acpi_ds_scope_stack_pop 0 50387 NULL ++flags_show_50391 flags_show 0 50391 NULL ++ad7877_gpio3_show_50397 ad7877_gpio3_show 0 50397 NULL ++base_sock_create_50400 base_sock_create 0 50400 NULL ++slab_size_show_50405 slab_size_show 0 50405 NULL ++snd_mask_refine_last_50406 snd_mask_refine_last 0 50406 NULL ++inode_getsecctx_50410 inode_getsecctx 0 50410 NULL ++l2tp_ip_sendmsg_50411 l2tp_ip_sendmsg 4-0 50411 NULL ++recomp_data_node_50412 recomp_data_node 0 50412 NULL ++tg_set_rt_bandwidth_50413 tg_set_rt_bandwidth 0 50413 NULL ++acpi_ds_result_stack_pop_50414 acpi_ds_result_stack_pop 0 50414 NULL ++fc0012_writereg_50421 fc0012_writereg 0 50421 NULL nohasharray ++store_select_ref_frequency_50421 store_select_ref_frequency 0-4 50421 &fc0012_writereg_50421 ++iscsi_create_conn_50425 iscsi_create_conn 2 50425 NULL ++validate_acl_mac_addrs_50429 validate_acl_mac_addrs 0 50429 NULL ++event_input_50432 event_input 0 50432 NULL ++show_bluetooth_50436 show_bluetooth 0 50436 NULL ++xfs_alloc_update_counters_50441 xfs_alloc_update_counters 0 50441 NULL ++snd_cmipci_playback_trigger_50442 snd_cmipci_playback_trigger 0 50442 NULL ++ecryptfs_write_lower_page_segment_50444 ecryptfs_write_lower_page_segment 4-0 50444 NULL ++crypt_scatterlist_50445 crypt_scatterlist 0 50445 NULL nohasharray ++wanxl_open_50445 wanxl_open 0 50445 &crypt_scatterlist_50445 ++patch_vt1702_50446 patch_vt1702 0 50446 NULL ++btrfs_space_info_show_flags_50448 btrfs_space_info_show_flags 0 50448 NULL ++udf_writepages_50451 udf_writepages 0 50451 NULL ++pgctrl_write_50453 pgctrl_write 3-0 50453 NULL ++device_create_sys_dev_entry_50458 device_create_sys_dev_entry 0 50458 NULL ++available_frequencies_show_50462 available_frequencies_show 0 50462 NULL nohasharray ++xircom_open_50462 xircom_open 0 50462 &available_frequencies_show_50462 ++s5p_jpeg_adjust_subs_ctrl_50466 s5p_jpeg_adjust_subs_ctrl 0 50466 NULL ++i2o_dma_map_sg_50468 i2o_dma_map_sg 3 50468 NULL ++store_spi_transport_pcomp_en_50471 store_spi_transport_pcomp_en 0-4 50471 NULL ++tps65217_update_bits_50472 tps65217_update_bits 0 50472 NULL ++show_pwm_auto_50473 show_pwm_auto 0 50473 NULL ++viafb_set_par_50475 viafb_set_par 0 50475 NULL ++selinux_ipv4_forward_50476 selinux_ipv4_forward 0 50476 NULL ++__iscsi_tpg_auth_show_password_50477 __iscsi_tpg_auth_show_password 0 50477 NULL ++cdrom_read_cdda_50478 cdrom_read_cdda 4 50478 NULL nohasharray ++snd_atiixp_spdif_prepare_50478 snd_atiixp_spdif_prepare 0 50478 &cdrom_read_cdda_50478 ++t3_mgmt_tx_50484 t3_mgmt_tx 0 50484 NULL ++__iio_update_buffers_50487 __iio_update_buffers 0 50487 NULL ++freeze_show_50489 freeze_show 0 50489 NULL ++gfs2_block_map_50492 gfs2_block_map 0 50492 NULL ++mei_io_cb_alloc_req_buf_50493 mei_io_cb_alloc_req_buf 2-0 50493 NULL ++of_irq_parse_one_50494 of_irq_parse_one 0 50494 NULL ++pm8001_get_gsm_dump_50495 pm8001_get_gsm_dump 0 50495 NULL ++validate_50497 validate 0 50497 NULL ++_pmbus_regulator_on_off_50498 _pmbus_regulator_on_off 0 50498 NULL ++rxrpc_preparse_xdr_rxkad_50503 rxrpc_preparse_xdr_rxkad 0 50503 NULL ++numa_node_show_50504 numa_node_show 0 50504 NULL ++pwr_rcvd_awake_beacons_read_50505 pwr_rcvd_awake_beacons_read 3-0 50505 NULL ++show_ep_handle_50508 show_ep_handle 0 50508 NULL ++isofs_readpage_50512 isofs_readpage 0 50512 NULL ++protection_type_store_50516 protection_type_store 0-4 50516 NULL ++ath10k_wmi_10x_cmd_init_50518 ath10k_wmi_10x_cmd_init 0 50518 NULL ++ext3_freeze_50523 ext3_freeze 0 50523 NULL ++b43_op_get_stats_50524 b43_op_get_stats 0 50524 NULL nohasharray ++hsc_read_50524 hsc_read 0-3 50524 &b43_op_get_stats_50524 ++nr_hugepages_store_50532 nr_hugepages_store 4-0 50532 NULL ++inet6_netconf_msgsize_devconf_50534 inet6_netconf_msgsize_devconf 0 50534 NULL ++show_eeprom3_50535 show_eeprom3 0 50535 NULL nohasharray ++dlfb_submit_urb_50535 dlfb_submit_urb 0 50535 &show_eeprom3_50535 ++fwnet_receive_packet_50537 fwnet_receive_packet 9 50537 NULL ++wlcore_set_partition_50538 wlcore_set_partition 0 50538 NULL nohasharray ++velocity_init_rings_50538 velocity_init_rings 0 50538 &wlcore_set_partition_50538 ++ip_local_out_sk_50539 ip_local_out_sk 0 50539 NULL nohasharray ++vendor_id_store_50539 vendor_id_store 0-4 50539 &ip_local_out_sk_50539 nohasharray ++ath6kl_set_ap_probe_resp_ies_50539 ath6kl_set_ap_probe_resp_ies 3 50539 &vendor_id_store_50539 ++show_fan_div_50540 show_fan_div 0 50540 NULL nohasharray ++iwl_mvm_add_sta_50540 iwl_mvm_add_sta 0 50540 &show_fan_div_50540 ++set_fcoe_ctlr_enabled_50542 set_fcoe_ctlr_enabled 0 50542 NULL ++bh_get_50543 bh_get 0 50543 NULL ++gfs2_meta_inode_buffer_50544 gfs2_meta_inode_buffer 0 50544 NULL ++attr_fn_lock_store_cptkbd_50545 attr_fn_lock_store_cptkbd 0-4 50545 NULL ++airspy_set_lna_gain_50547 airspy_set_lna_gain 0 50547 NULL ++trigger_request_store_50548 trigger_request_store 4 50548 NULL ++wl127x_boot_clk_50551 wl127x_boot_clk 0 50551 NULL ++blkdev_readpage_50552 blkdev_readpage 0 50552 NULL ++usbat_flash_write_data_50553 usbat_flash_write_data 4 50553 NULL ++__uncore_match_dnid_show_50561 __uncore_match_dnid_show 0 50561 NULL ++ncp_fsync_50562 ncp_fsync 0 50562 NULL ++self_check_peb_vid_hdr_50563 self_check_peb_vid_hdr 0 50563 NULL ++cmpc_accel_g_select_store_v4_50566 cmpc_accel_g_select_store_v4 0-4 50566 NULL ++_transport_phy_reset_50570 _transport_phy_reset 0 50570 NULL ++mwave_write_50571 mwave_write 0-3 50571 NULL ++hpet_cpuhp_notify_50573 hpet_cpuhp_notify 0 50573 NULL ++target_fabric_tpg_auth_attr_store_50574 target_fabric_tpg_auth_attr_store 0 50574 NULL ++mwifiex_cmd_802_11_bg_scan_query_50580 mwifiex_cmd_802_11_bg_scan_query 0 50580 NULL ++fat_readpages_50582 fat_readpages 4 50582 NULL nohasharray ++pep_reply_50582 pep_reply 5 50582 &fat_readpages_50582 ++iwl_dbgfs_missed_beacon_read_50584 iwl_dbgfs_missed_beacon_read 3-0 50584 NULL nohasharray ++pcsp_start_playing_50584 pcsp_start_playing 0 50584 &iwl_dbgfs_missed_beacon_read_50584 ++rfcomm_sock_bind_50585 rfcomm_sock_bind 0 50585 NULL ++show_srp_rport_roles_50588 show_srp_rport_roles 0 50588 NULL ++build_inv_iommu_pages_50589 build_inv_iommu_pages 3-2 50589 NULL ++load_map_50592 load_map 0 50592 NULL ++sge_rx_50594 sge_rx 3 50594 NULL ++per_cpu_show_50601 per_cpu_show 0 50601 NULL ++__ext4_journalled_writepage_50603 __ext4_journalled_writepage 0 50603 NULL ++wl1251_hw_init_pta_50604 wl1251_hw_init_pta 0 50604 NULL nohasharray ++loop_attr_offset_show_50604 loop_attr_offset_show 0 50604 &wl1251_hw_init_pta_50604 ++xillybus_write_50605 xillybus_write 3-0 50605 NULL ++marvell_of_reg_init_50608 marvell_of_reg_init 0 50608 NULL ++lx_hardware_stop_50609 lx_hardware_stop 0 50609 NULL nohasharray ++show_pwm_ac_50609 show_pwm_ac 0 50609 &lx_hardware_stop_50609 ++ipr_halt_50616 ipr_halt 0 50616 NULL ++rx_rx_checksum_result_read_50617 rx_rx_checksum_result_read 3-0 50617 NULL ++show_session_param_ISCSI_PARAM_MAX_R2T_50618 show_session_param_ISCSI_PARAM_MAX_R2T 0 50618 NULL ++sparse_early_usemaps_alloc_node_50623 sparse_early_usemaps_alloc_node 4 50623 NULL ++regcache_rbtree_write_50629 regcache_rbtree_write 2-0 50629 NULL nohasharray ++ip_vs_local_request6_50629 ip_vs_local_request6 0 50629 ®cache_rbtree_write_50629 nohasharray ++macvtap_alloc_skb_50629 macvtap_alloc_skb 3-4-2 50629 &ip_vs_local_request6_50629 ++enic_dev_add_station_addr_50630 enic_dev_add_station_addr 0 50630 NULL ++simple_transaction_get_50633 simple_transaction_get 3 50633 NULL ++__vm_enough_memory_50634 __vm_enough_memory 0 50634 NULL nohasharray ++protocol_id_set_50634 protocol_id_set 0-4 50634 &__vm_enough_memory_50634 ++show_auto_pwm_max_50637 show_auto_pwm_max 0 50637 NULL nohasharray ++fsp_attr_set_setreg_50637 fsp_attr_set_setreg 0-4 50637 &show_auto_pwm_max_50637 ++bt_sock_create_50641 bt_sock_create 0 50641 NULL ++gfs2_unstuff_dinode_50644 gfs2_unstuff_dinode 0 50644 NULL ++mt2063_setreg_50645 mt2063_setreg 0 50645 NULL ++show_50648 show 0 50648 NULL ++ext3_readpage_50653 ext3_readpage 0 50653 NULL ++show_fc_rport_node_name_50655 show_fc_rport_node_name 0 50655 NULL ++snd_seq_ioctl_set_queue_info_50657 snd_seq_ioctl_set_queue_info 0 50657 NULL ++__sha1_ssse3_update_50659 __sha1_ssse3_update 0 50659 NULL ++adcxx_show_min_50663 adcxx_show_min 0 50663 NULL nohasharray ++iscsi_tpg_param_show_DefaultTime2Wait_50663 iscsi_tpg_param_show_DefaultTime2Wait 0 50663 &adcxx_show_min_50663 ++sys_readv_50664 sys_readv 3 50664 NULL nohasharray ++ath6kl_tm_rx_event_50664 ath6kl_tm_rx_event 3 50664 &sys_readv_50664 ++bnad_debugfs_read_50665 bnad_debugfs_read 3-0 50665 NULL ++show_ipv6_iface_ipaddress_50667 show_ipv6_iface_ipaddress 0 50667 NULL ++ext2_try_to_allocate_with_rsv_50669 ext2_try_to_allocate_with_rsv 2-0-4 50669 NULL ++addr_len_show_50673 addr_len_show 0 50673 NULL ++cifsFYI_proc_write_50682 cifsFYI_proc_write 0-3 50682 NULL ++nvidiafb_check_var_50683 nvidiafb_check_var 0 50683 NULL ++cca_mode_show_50688 cca_mode_show 0 50688 NULL ++i2c_smbus_read_byte_data_50689 i2c_smbus_read_byte_data 0 50689 NULL nohasharray ++target_50689 target 0 50689 &i2c_smbus_read_byte_data_50689 ++store_50690 store 0-3 50690 NULL ++_ep_queue_50692 _ep_queue 0 50692 NULL ++xfs_growfs_get_hdr_buf_50697 xfs_growfs_get_hdr_buf 3 50697 NULL nohasharray ++xen_release_pte_50697 xen_release_pte 1 50697 &xfs_growfs_get_hdr_buf_50697 ++dev_mem_read_50706 dev_mem_read 3-0 50706 NULL ++discover_50707 discover 0 50707 NULL ++regulator_total_uA_show_50713 regulator_total_uA_show 0 50713 NULL ++mic_panic_event_50714 mic_panic_event 0 50714 NULL ++pm_qos_update_target_50721 pm_qos_update_target 0 50721 NULL ++epool_init_50723 epool_init 2 50723 NULL ++max8660_ldo67_is_enabled_50729 max8660_ldo67_is_enabled 0 50729 NULL ++device_attach_50730 device_attach 0 50730 NULL nohasharray ++xfs_fs_unfreeze_50730 xfs_fs_unfreeze 0 50730 &device_attach_50730 ++mc13xxx_rtc_read_time_50733 mc13xxx_rtc_read_time 0 50733 NULL ++stripe_cache_active_show_50735 stripe_cache_active_show 0 50735 NULL ++blk_check_plugged_50736 blk_check_plugged 3 50736 NULL ++xen_initdom_setup_msi_irqs_50737 xen_initdom_setup_msi_irqs 2 50737 NULL ++store_fc_private_host_issue_lip_50738 store_fc_private_host_issue_lip 0-4 50738 NULL ++lcd_power_show_50740 lcd_power_show 0 50740 NULL ++__ext3_get_inode_loc_50744 __ext3_get_inode_loc 0 50744 NULL ++e1000_change_mtu_50745 e1000_change_mtu 0 50745 NULL ++skein_256_init_50748 skein_256_init 0 50748 NULL ++ab3100_set_register_interruptible_50756 ab3100_set_register_interruptible 0 50756 NULL ++iscsi_sw_tcp_host_get_param_50757 iscsi_sw_tcp_host_get_param 0 50757 NULL ++skb_padto_50759 skb_padto 2 50759 NULL ++max8925_set_bits_50760 max8925_set_bits 0 50760 NULL ++adfs_writepage_50762 adfs_writepage 0 50762 NULL nohasharray ++policydb_read_50762 policydb_read 0 50762 &adfs_writepage_50762 ++isight_trigger_50765 isight_trigger 0 50765 NULL ++w1_f1C_write_50766 w1_f1C_write 3 50766 NULL ++dlm_recover_status_show_50769 dlm_recover_status_show 0 50769 NULL ++ocfs2_xattr_block_get_50773 ocfs2_xattr_block_get 0 50773 NULL nohasharray ++g_crop_50773 g_crop 0 50773 &ocfs2_xattr_block_get_50773 ++tm6000_read_write_usb_50774 tm6000_read_write_usb 7-0 50774 NULL nohasharray ++pipe_handler_request_50774 pipe_handler_request 0-5 50774 &tm6000_read_write_usb_50774 ++sr_set_mac_address_50778 sr_set_mac_address 0 50778 NULL ++target_core_show_dev_udev_path_50780 target_core_show_dev_udev_path 0 50780 NULL nohasharray ++finish_fw_update_50780 finish_fw_update 0 50780 &target_core_show_dev_udev_path_50780 ++m2v_50781 m2v 1 50781 NULL ++dev_pm_qos_update_flags_50782 dev_pm_qos_update_flags 0 50782 NULL ++cpuidle_state_store_50783 cpuidle_state_store 0-4 50783 NULL ++digital_dep_link_up_50786 digital_dep_link_up 5 50786 NULL ++ping_v4_sendmsg_50787 ping_v4_sendmsg 0-4 50787 NULL ++cap_vm_enough_memory_50788 cap_vm_enough_memory 0 50788 NULL ++store_50792 store 0 50792 NULL ++tpm_write_50798 tpm_write 3-0 50798 NULL ++write_flush_50803 write_flush 3-0 50803 NULL ++_nfs4_proc_delegreturn_50805 _nfs4_proc_delegreturn 0 50805 NULL ++show_ipv6_iface_link_local_autocfg_50807 show_ipv6_iface_link_local_autocfg 0 50807 NULL ++write_sync_reg_50811 write_sync_reg 0 50811 NULL ++dvb_play_50814 dvb_play 3-0 50814 NULL ++ttm_pool_show_50817 ttm_pool_show 0 50817 NULL ++dpcm_show_state_50827 dpcm_show_state 0 50827 NULL nohasharray ++init_rx_ring_50827 init_rx_ring 4 50827 &dpcm_show_state_50827 nohasharray ++wl1251_cmd_data_path_tx_50827 wl1251_cmd_data_path_tx 0 50827 &init_rx_ring_50827 ++recvmsg_50829 recvmsg 0-4 50829 NULL nohasharray ++cfusbl_device_notify_50829 cfusbl_device_notify 0 50829 &recvmsg_50829 nohasharray ++acpi_ev_install_gpe_block_50829 acpi_ev_install_gpe_block 2 50829 &cfusbl_device_notify_50829 ++ecryptfs_write_inode_size_to_metadata_50833 ecryptfs_write_inode_size_to_metadata 0 50833 NULL ++nft_trans_alloc_50836 nft_trans_alloc 3 50836 NULL ++inet_getname_50838 inet_getname 0 50838 NULL nohasharray ++cw1200_sta_add_50838 cw1200_sta_add 0 50838 &inet_getname_50838 ++videobuf_dma_init_user_50839 videobuf_dma_init_user 0-4-3 50839 NULL ++btrfs_map_sblock_50840 btrfs_map_sblock 3 50840 NULL nohasharray ++nilfs_superblock_attr_store_50840 nilfs_superblock_attr_store 0-4 50840 &btrfs_map_sblock_50840 ++self_check_write_50856 self_check_write 5-0 50856 NULL nohasharray ++frontend_probe_and_watch_50856 frontend_probe_and_watch 0 50856 &self_check_write_50856 ++carl9170_debugfs_write_50857 carl9170_debugfs_write 3-0 50857 NULL ++fat_write_begin_50858 fat_write_begin 0-3 50858 NULL ++matroxfb_dh_set_par_50867 matroxfb_dh_set_par 0 50867 NULL ++geneve_xmit_skb_50871 geneve_xmit_skb 13 50871 NULL ++lx_pipe_toggle_state_50874 lx_pipe_toggle_state 0 50874 NULL ++unmap_and_move_50876 unmap_and_move 0 50876 NULL ++vmci_transport_notify_send_init_50880 vmci_transport_notify_send_init 0 50880 NULL ++nla_put_string_50887 nla_put_string 0 50887 NULL ++SyS_lgetxattr_50889 SyS_lgetxattr 4 50889 NULL ++mlx5_cmd_status_to_err_50891 mlx5_cmd_status_to_err 0 50891 NULL ++multicast_querier_store_50895 multicast_querier_store 4-0 50895 NULL ++migrate_huge_page_move_mapping_50896 migrate_huge_page_move_mapping 0 50896 NULL ++erst_dbg_read_50897 erst_dbg_read 0-3 50897 NULL ++subconnector_show_50902 subconnector_show 0 50902 NULL ++__bdev_writeseg_50903 __bdev_writeseg 4 50903 NULL ++idr_alloc_cyclic_50904 idr_alloc_cyclic 0 50904 NULL ++xfs_alloc_get_freelist_50906 xfs_alloc_get_freelist 0 50906 NULL ++store_tabletYtilt_50907 store_tabletYtilt 0-4 50907 NULL ++osd_req_write_sg_50908 osd_req_write_sg 5 50908 NULL nohasharray ++thermal_zone_get_temp_50908 thermal_zone_get_temp 0 50908 &osd_req_write_sg_50908 ++xfs_iext_remove_50909 xfs_iext_remove 3 50909 NULL nohasharray ++cxacru_sysfs_show_upstream_hec_errors_50909 cxacru_sysfs_show_upstream_hec_errors 0 50909 &xfs_iext_remove_50909 ++blk_rq_cur_sectors_50910 blk_rq_cur_sectors 0 50910 NULL ++btrfs_bio_wq_end_io_50911 btrfs_bio_wq_end_io 0 50911 NULL ++wl1271_sysfs_show_hw_pg_ver_50912 wl1271_sysfs_show_hw_pg_ver 0 50912 NULL ++snd_timer_user_read_50916 snd_timer_user_read 0-3 50916 NULL ++nilfs_dat_move_50917 nilfs_dat_move 0 50917 NULL ++hash_recvmsg_50924 hash_recvmsg 4-0 50924 NULL ++busnum_show_50927 busnum_show 0 50927 NULL ++fotg210_urb_enqueue_50931 fotg210_urb_enqueue 0 50931 NULL ++_ctl_host_sas_address_show_50932 _ctl_host_sas_address_show 0 50932 NULL ++bond_option_miimon_set_50935 bond_option_miimon_set 0 50935 NULL ++inet6_bind_50945 inet6_bind 0 50945 NULL nohasharray ++store_auto_temp_50945 store_auto_temp 0-4 50945 &inet6_bind_50945 ++show_device_status_50947 show_device_status 0 50947 NULL ++nes_show_ee_data_50948 nes_show_ee_data 0 50948 NULL nohasharray ++show_port0_50948 show_port0 0 50948 &nes_show_ee_data_50948 ++set_50949 set 0 50949 NULL nohasharray ++wl1271_op_add_interface_50949 wl1271_op_add_interface 0 50949 &set_50949 ++irq_timeout_write_50950 irq_timeout_write 3-0 50950 NULL nohasharray ++mld_newpack_50950 mld_newpack 2 50950 &irq_timeout_write_50950 ++virtio_cread16_50951 virtio_cread16 0 50951 NULL ++zl10036_write_50952 zl10036_write 0 50952 NULL ++uwb_rc_mac_addr_set_50953 uwb_rc_mac_addr_set 0 50953 NULL ++sdio_uart_write_50954 sdio_uart_write 3-0 50954 NULL nohasharray ++__uncore_thresh5_show_50954 __uncore_thresh5_show 0 50954 &sdio_uart_write_50954 ++log_head_lsn_show_50956 log_head_lsn_show 0 50956 NULL ++SyS_setxattr_50957 SyS_setxattr 4 50957 NULL ++__ntfs_write_inode_50961 __ntfs_write_inode 0 50961 NULL ++show_temp_offset_50962 show_temp_offset 0 50962 NULL nohasharray ++rbd_dev_header_info_50962 rbd_dev_header_info 0 50962 &show_temp_offset_50962 ++aty128_var_to_crtc_50963 aty128_var_to_crtc 0 50963 NULL ++null_final_50967 null_final 0 50967 NULL ++wusb_chid_store_50968 wusb_chid_store 0-4 50968 NULL ++set_temp_over_50973 set_temp_over 0-4 50973 NULL ++typhoon_start_runtime_50974 typhoon_start_runtime 0 50974 NULL ++skein1024_update_50977 skein1024_update 0 50977 NULL ++iwl_statistics_flag_50981 iwl_statistics_flag 3-0 50981 NULL ++pm_qos_no_power_off_store_50987 pm_qos_no_power_off_store 0-4 50987 NULL ++timeout_write_50991 timeout_write 3-0 50991 NULL ++interval_show_50993 interval_show 0 50993 NULL ++wm8903_gpio_direction_out_50995 wm8903_gpio_direction_out 0 50995 NULL nohasharray ++bnx2_request_irq_50995 bnx2_request_irq 0 50995 &wm8903_gpio_direction_out_50995 ++xc5000_tune_digital_50996 xc5000_tune_digital 0 50996 NULL ++security_load_policy_50997 security_load_policy 0 50997 NULL ++show_counter_lb_ints_50999 show_counter_lb_ints 0 50999 NULL nohasharray ++show_host_param_ISCSI_HOST_PARAM_PORT_SPEED_50999 show_host_param_ISCSI_HOST_PARAM_PORT_SPEED 0 50999 &show_counter_lb_ints_50999 nohasharray ++csio_device_reset_50999 csio_device_reset 0-4 50999 &show_host_param_ISCSI_HOST_PARAM_PORT_SPEED_50999 ++zd_chip_enable_rxtx_51001 zd_chip_enable_rxtx 0 51001 NULL ++proc_write_51003 proc_write 3-0 51003 NULL nohasharray ++channel_ce_count_show_51003 channel_ce_count_show 0 51003 &proc_write_51003 ++ppp_read_51017 ppp_read 0-3 51017 NULL ++lbs_dev_info_51023 lbs_dev_info 3-0 51023 NULL nohasharray ++il4965_get_tx_atten_grp_51023 il4965_get_tx_atten_grp 0 51023 &lbs_dev_info_51023 ++qla2x00_sysfs_write_fw_dump_51025 qla2x00_sysfs_write_fw_dump 0-6-5 51025 NULL ++brcm_phy_setbits_51027 brcm_phy_setbits 0 51027 NULL ++fuse_conn_congestion_threshold_read_51028 fuse_conn_congestion_threshold_read 3-0 51028 NULL nohasharray ++ntfs_attr_find_51028 ntfs_attr_find 0 51028 &fuse_conn_congestion_threshold_read_51028 ++xfs_dir2_grow_inode_51030 xfs_dir2_grow_inode 0 51030 NULL ++dump_midi_51040 dump_midi 3 51040 NULL ++usb_get_descriptor_51041 usb_get_descriptor 0 51041 NULL ++srpt_alloc_ioctx_51042 srpt_alloc_ioctx 2-3 51042 NULL ++store_detach_51045 store_detach 0-4 51045 NULL ++show_51050 show 0 51050 NULL nohasharray ++carl9170_mac_reset_51050 carl9170_mac_reset 0 51050 &show_51050 ++xc5000_readreg_51051 xc5000_readreg 0 51051 NULL ++do_arpt_set_ctl_51053 do_arpt_set_ctl 4 51053 NULL ++afs_launder_page_51055 afs_launder_page 0 51055 NULL ++_ctl_version_fw_show_51059 _ctl_version_fw_show 0 51059 NULL nohasharray ++bnep_net_set_mac_addr_51059 bnep_net_set_mac_addr 0 51059 &_ctl_version_fw_show_51059 ++wusb_prf_64_51065 wusb_prf_64 7-0 51065 NULL ++rsc_mgr_init_51067 rsc_mgr_init 3 51067 NULL nohasharray ++bd2802_store_reg0x08_51067 bd2802_store_reg0x08 0-4 51067 &rsc_mgr_init_51067 nohasharray ++rtc_sysfs_set_wakealarm_51067 rtc_sysfs_set_wakealarm 0-4 51067 &bd2802_store_reg0x08_51067 ++zatm_open_51077 zatm_open 0 51077 NULL nohasharray ++store_drivers_probe_51077 store_drivers_probe 0-3 51077 &zatm_open_51077 ++sys32_pwrite_51079 sys32_pwrite 3 51079 NULL ++removable_show_51080 removable_show 0 51080 NULL ++sock_no_sendmsg_51082 sock_no_sendmsg 0-4 51082 NULL ++register_jprobes_51086 register_jprobes 0 51086 NULL ++bond_vlan_rx_add_vid_51087 bond_vlan_rx_add_vid 0 51087 NULL ++jbd2_journal_init_revoke_51088 jbd2_journal_init_revoke 2 51088 NULL ++nilfs_checkpoints_next_checkpoint_show_51093 nilfs_checkpoints_next_checkpoint_show 0 51093 NULL ++solo_enc_v4l2_init_51094 solo_enc_v4l2_init 2 51094 NULL ++__ocfs2_find_path_51096 __ocfs2_find_path 0 51096 NULL ++ath10k_vdev_start_51101 ath10k_vdev_start 0 51101 NULL ++target_stat_scsi_auth_intr_show_attr_att_count_51106 target_stat_scsi_auth_intr_show_attr_att_count 0 51106 NULL ++w1_ds2781_do_io_51110 w1_ds2781_do_io 0-4-3 51110 NULL nohasharray ++ti_recv_51110 ti_recv 3 51110 &w1_ds2781_do_io_51110 ++iwl_set_Xtal_calib_51112 iwl_set_Xtal_calib 0 51112 NULL ++of_clk_get_parent_count_51114 of_clk_get_parent_count 0 51114 NULL ++gpio_keys_attr_show_helper_51117 gpio_keys_attr_show_helper 0 51117 NULL nohasharray ++iscsi_nop_out_rsp_51117 iscsi_nop_out_rsp 4 51117 &gpio_keys_attr_show_helper_51117 ++xfs_file_splice_read_51121 xfs_file_splice_read 0 51121 NULL ++do_vfs_lock_51127 do_vfs_lock 0 51127 NULL ++ips_write_info_51128 ips_write_info 0-3 51128 NULL ++sym_user_command_51129 sym_user_command 0-3 51129 NULL ++__atomic_notifier_call_chain_51130 __atomic_notifier_call_chain 0 51130 NULL nohasharray ++cluster_cluster_name_write_51130 cluster_cluster_name_write 0-3 51130 &__atomic_notifier_call_chain_51130 ++amanda_help_51133 amanda_help 0 51133 NULL ++ltc4260_show_value_51135 ltc4260_show_value 0 51135 NULL nohasharray ++unfreeze_fs_51135 unfreeze_fs 0 51135 <c4260_show_value_51135 ++platform_pre_snapshot_51136 platform_pre_snapshot 0 51136 NULL nohasharray ++alloc_rtllib_51136 alloc_rtllib 1 51136 &platform_pre_snapshot_51136 ++ath10k_bmi_write_memory_51137 ath10k_bmi_write_memory 0 51137 NULL ++show_in_input_51138 show_in_input 0 51138 NULL ++simple_xattr_set_51140 simple_xattr_set 4-0 51140 NULL ++saa7134_alsa_dma_init_51143 saa7134_alsa_dma_init 2 51143 NULL nohasharray ++elan_smbus_iap_get_mode_51143 elan_smbus_iap_get_mode 0 51143 &saa7134_alsa_dma_init_51143 ++acpi_ps_get_aml_opcode_51145 acpi_ps_get_aml_opcode 0 51145 NULL ++xfs_trans_get_efd_51148 xfs_trans_get_efd 3 51148 NULL ++compat_sys_pwritev64_51151 compat_sys_pwritev64 3 51151 NULL ++show_temp_max_alarm_51154 show_temp_max_alarm 0 51154 NULL ++driver_attach_51156 driver_attach 0 51156 NULL ++device_rev_show_51157 device_rev_show 0 51157 NULL ++walk_page_buffers_51170 walk_page_buffers 0 51170 NULL ++cap_task_setscheduler_51171 cap_task_setscheduler 0 51171 NULL ++xen_release_pte_init_51173 xen_release_pte_init 1 51173 NULL ++online_store_51175 online_store 0-4 51175 NULL ++show_counter_rx_tid_valid_errs_51183 show_counter_rx_tid_valid_errs 0 51183 NULL ++cbaf_wusb_device_name_show_51184 cbaf_wusb_device_name_show 0 51184 NULL ++read_dsattenuation_51185 read_dsattenuation 0 51185 NULL ++v9fs_listxattr_51189 v9fs_listxattr 0-3 51189 NULL ++nfs4_call_sync_sequence_51190 nfs4_call_sync_sequence 0 51190 NULL nohasharray ++i40evf_acquire_msix_vectors_51190 i40evf_acquire_msix_vectors 2 51190 &nfs4_call_sync_sequence_51190 ++dpms_show_51191 dpms_show 0 51191 NULL ++get_uint_51193 get_uint 0 51193 NULL ++queue_requests_store_51194 queue_requests_store 3-0 51194 NULL ++skb_copy_datagram_iter_51197 skb_copy_datagram_iter 0-4-2 51197 NULL ++nilfs_dev_attr_show_51198 nilfs_dev_attr_show 0 51198 NULL ++atl1e_write_phy_reg_51200 atl1e_write_phy_reg 0 51200 NULL ++metrics_reset_store_51203 metrics_reset_store 0-4 51203 NULL ++rx8025_write_reg_51207 rx8025_write_reg 0 51207 NULL ++m48t59_nvram_read_51209 m48t59_nvram_read 0-5-6 51209 NULL ++sr_done_51211 sr_done 0 51211 NULL ++solo_enc_queue_setup_51213 solo_enc_queue_setup 0 51213 NULL ++rw_checks_51214 rw_checks 0 51214 NULL nohasharray ++handle_static_data_51214 handle_static_data 0 51214 &rw_checks_51214 ++lpfc_oas_vpt_store_51216 lpfc_oas_vpt_store 0-4 51216 NULL ++ext4_init_block_bitmap_51217 ext4_init_block_bitmap 3 51217 NULL ++kgdb_panic_event_51226 kgdb_panic_event 0 51226 NULL ++iwl_dbgfs_bcast_filters_macs_read_51231 iwl_dbgfs_bcast_filters_macs_read 3-0 51231 NULL nohasharray ++__gfs2_jdata_writepage_51231 __gfs2_jdata_writepage 0 51231 &iwl_dbgfs_bcast_filters_macs_read_51231 ++nf_ct_ext_create_51232 nf_ct_ext_create 3 51232 NULL ++snd_pcm_write_51235 snd_pcm_write 3-0 51235 NULL nohasharray ++bnx2x_rss_51235 bnx2x_rss 0 51235 &snd_pcm_write_51235 ++goto_high_power_51237 goto_high_power 0 51237 NULL ++drm_property_create_51239 drm_property_create 4 51239 NULL ++ath10k_bmi_fast_download_51242 ath10k_bmi_fast_download 0 51242 NULL ++show_sas_end_dev_tlr_enabled_51243 show_sas_end_dev_tlr_enabled 0 51243 NULL ++isofs_hash_common_51247 isofs_hash_common 0 51247 NULL ++show_constraint_min_power_uw_51248 show_constraint_min_power_uw 0 51248 NULL ++__mxt_read_reg_51249 __mxt_read_reg 0 51249 NULL ++st_read_51251 st_read 3-0 51251 NULL nohasharray ++nfs_instantiate_51251 nfs_instantiate 0 51251 &st_read_51251 ++uds_s_stream_51259 uds_s_stream 0 51259 NULL ++b43legacy_radio_set_interference_mitigation_51260 b43legacy_radio_set_interference_mitigation 0 51260 NULL ++nr_hugepages_show_common_51261 nr_hugepages_show_common 0 51261 NULL ++compat_dccp_setsockopt_51263 compat_dccp_setsockopt 5 51263 NULL nohasharray ++ipv4_blackhole_mtu_51263 ipv4_blackhole_mtu 0 51263 &compat_dccp_setsockopt_51263 ++target_alloc_sgl_51264 target_alloc_sgl 3 51264 NULL nohasharray ++channelmap_show_51264 channelmap_show 0 51264 &target_alloc_sgl_51264 ++target_stat_scsi_port_show_attr_indx_51265 target_stat_scsi_port_show_attr_indx 0 51265 NULL ++e100_up_51268 e100_up 0 51268 NULL ++pm8001_tag_alloc_51273 pm8001_tag_alloc 0 51273 NULL nohasharray ++v9fs_statfs_51273 v9fs_statfs 0 51273 &pm8001_tag_alloc_51273 nohasharray ++softing_reset_chip_51273 softing_reset_chip 0 51273 &v9fs_statfs_51273 ++dvb_audio_write_51275 dvb_audio_write 3-0 51275 NULL ++ipwireless_network_packet_received_51277 ipwireless_network_packet_received 4 51277 NULL ++send_51279 send 0 51279 NULL nohasharray ++store_scan_age_51279 store_scan_age 0-4 51279 &send_51279 ++mma8452_show_scale_avail_51281 mma8452_show_scale_avail 0 51281 NULL ++snd_usX2Y_pcm_trigger_51287 snd_usX2Y_pcm_trigger 0 51287 NULL ++pvr2_std_id_to_str_51288 pvr2_std_id_to_str 2 51288 NULL nohasharray ++sample_new_51288 sample_new 0 51288 &pvr2_std_id_to_str_51288 ++dmi_sysfs_entry_handle_51291 dmi_sysfs_entry_handle 0 51291 NULL ++asl_urb_enqueue_51292 asl_urb_enqueue 0 51292 NULL ++disable_51293 disable 0 51293 NULL ++chip_name_show_51296 chip_name_show 0 51296 NULL ++f_ecm_opts_attr_store_51297 f_ecm_opts_attr_store 0-4 51297 NULL ++ov7660_set_gain_51299 ov7660_set_gain 0 51299 NULL nohasharray ++store_fc_host_vport_delete_51299 store_fc_host_vport_delete 0-4 51299 &ov7660_set_gain_51299 ++nv_open_51300 nv_open 0 51300 NULL ++niu_init_one_tx_channel_51302 niu_init_one_tx_channel 0 51302 NULL ++bnad_debugfs_read_regrd_51308 bnad_debugfs_read_regrd 3-0 51308 NULL nohasharray ++bd2802_store_reg0x0c_51308 bd2802_store_reg0x0c 0-4 51308 &bnad_debugfs_read_regrd_51308 nohasharray ++statfs_quantum_store_51308 statfs_quantum_store 3-0 51308 &bd2802_store_reg0x0c_51308 ++ad7877_gpio4_store_51311 ad7877_gpio4_store 0-4 51311 NULL ++snd_seq_port_connect_51312 snd_seq_port_connect 0 51312 NULL ++init_map_ipmac_51317 init_map_ipmac 5 51317 NULL ++ad9523_sync_51318 ad9523_sync 0 51318 NULL ++ocfs2_read_inode_block_51319 ocfs2_read_inode_block 0 51319 NULL ++alloc_hippi_dev_51320 alloc_hippi_dev 1 51320 NULL ++get_baseline_data_51321 get_baseline_data 0 51321 NULL ++ext2_xattr_get_51327 ext2_xattr_get 0 51327 NULL ++smk_write_ptrace_51333 smk_write_ptrace 3-0 51333 NULL ++alloc_smp_req_51337 alloc_smp_req 1 51337 NULL ++pscsi_set_configfs_dev_params_51339 pscsi_set_configfs_dev_params 0-3 51339 NULL ++device_user_purge_51340 device_user_purge 0 51340 NULL ++ipw_get_event_log_len_51341 ipw_get_event_log_len 0 51341 NULL ++max197_show_name_51344 max197_show_name 0 51344 NULL nohasharray ++prepare_header100_51344 prepare_header100 0 51344 &max197_show_name_51344 ++wm8903_gpio_request_51347 wm8903_gpio_request 0 51347 NULL ++beiscsi_fw_ver_disp_51349 beiscsi_fw_ver_disp 0 51349 NULL ++st_sensors_set_dataready_irq_51350 st_sensors_set_dataready_irq 0 51350 NULL ++icmp_error_message_51353 icmp_error_message 0 51353 NULL ++ft_format_wwn_51355 ft_format_wwn 0 51355 NULL ++snd_p16v_pcm_prepare_playback_51359 snd_p16v_pcm_prepare_playback 0 51359 NULL ++wl1251_acx_bcn_dtim_options_51362 wl1251_acx_bcn_dtim_options 0 51362 NULL ++show_hue_51369 show_hue 0 51369 NULL ++ieee80211_if_fmt_estab_plinks_51370 ieee80211_if_fmt_estab_plinks 3 51370 NULL ++radeon_kms_compat_ioctl_51371 radeon_kms_compat_ioctl 2 51371 NULL ++try_to_freeze_tasks_51375 try_to_freeze_tasks 0 51375 NULL ++qla2x00_allow_cna_fw_dump_show_51376 qla2x00_allow_cna_fw_dump_show 0 51376 NULL ++__uncore_qlx_cfg_show_51377 __uncore_qlx_cfg_show 0 51377 NULL ++btrfs_wq_submit_bio_51381 btrfs_wq_submit_bio 0 51381 NULL ++bmAttributes_show_51384 bmAttributes_show 0 51384 NULL ++ocfs2_file_read_iter_51386 ocfs2_file_read_iter 0 51386 NULL ++sru_s_ctrl_51389 sru_s_ctrl 0 51389 NULL ++compass_power_mode_store_51391 compass_power_mode_store 0-4 51391 NULL ++ds1343_show_alarmmode_51397 ds1343_show_alarmmode 0 51397 NULL ++rmw_protect_51409 rmw_protect 0 51409 NULL nohasharray ++rtl8180_init_hw_51409 rtl8180_init_hw 0 51409 &rmw_protect_51409 nohasharray ++iwl_mvm_mac_ctxt_cmd_p2p_device_51409 iwl_mvm_mac_ctxt_cmd_p2p_device 0 51409 &rtl8180_init_hw_51409 ++cma_bitmap_aligned_offset_51412 cma_bitmap_aligned_offset 0-2 51412 NULL ++cifs_readdata_to_iov_51417 cifs_readdata_to_iov 0 51417 NULL ++x86_swiotlb_free_coherent_51421 x86_swiotlb_free_coherent 2 51421 NULL ++blk_register_region_51424 blk_register_region 1-2 51424 NULL ++x1205_set_datetime_51428 x1205_set_datetime 0 51428 NULL ++mwifiex_rdeeprom_read_51429 mwifiex_rdeeprom_read 3-0 51429 NULL ++part_start_show_51431 part_start_show 0 51431 NULL nohasharray ++mwifiex_cmd_802_11_key_material_51431 mwifiex_cmd_802_11_key_material 0 51431 &part_start_show_51431 nohasharray ++isofs_hash_ms_51431 isofs_hash_ms 0 51431 &mwifiex_cmd_802_11_key_material_51431 ++uvc_video_clock_init_51432 uvc_video_clock_init 0 51432 NULL ++hfsplus_brec_read_51436 hfsplus_brec_read 0 51436 NULL ++xfs_mod_incore_sb_unlocked_51439 xfs_mod_incore_sb_unlocked 0 51439 NULL ++ieee80211_if_read_dot11MeshHWMPRootMode_51441 ieee80211_if_read_dot11MeshHWMPRootMode 3-0 51441 NULL nohasharray ++power_limit_0_min_uw_show_51441 power_limit_0_min_uw_show 0 51441 &ieee80211_if_read_dot11MeshHWMPRootMode_51441 ++print_devstats_dot11ACKFailureCount_51443 print_devstats_dot11ACKFailureCount 3 51443 NULL ++ipath_tid_update_51445 ipath_tid_update 0 51445 NULL ++yam_open_51447 yam_open 0 51447 NULL ++roccat_common2_sysfs_read_light_macro_51451 roccat_common2_sysfs_read_light_macro 0-5-6 51451 NULL ++axnet_open_51453 axnet_open 0 51453 NULL ++ip_vs_local_request4_51455 ip_vs_local_request4 0 51455 NULL ++gdth_halt_51460 gdth_halt 0 51460 NULL ++ov9640_g_crop_51461 ov9640_g_crop 0 51461 NULL nohasharray ++get_cur_state_51461 get_cur_state 0 51461 &ov9640_g_crop_51461 ++vmxnet3_acquire_msix_vectors_51462 vmxnet3_acquire_msix_vectors 2 51462 NULL ++__gsc_s_ctrl_51470 __gsc_s_ctrl 0 51470 NULL ++count_trail_chars_51471 count_trail_chars 0 51471 NULL ++____alloc_ei_netdev_51475 ____alloc_ei_netdev 1 51475 NULL nohasharray ++arcmsr_attr_host_fw_sdram_size_51475 arcmsr_attr_host_fw_sdram_size 0 51475 &____alloc_ei_netdev_51475 nohasharray ++__vlan_vid_add_51475 __vlan_vid_add 0 51475 &arcmsr_attr_host_fw_sdram_size_51475 ++xfs_buf_get_uncached_51477 xfs_buf_get_uncached 2 51477 NULL ++calc_send_wqe_51480 calc_send_wqe 0 51480 NULL nohasharray ++logi_dj_hidpp_event_51480 logi_dj_hidpp_event 4 51480 &calc_send_wqe_51480 ++geodewdt_write_51486 geodewdt_write 0-3 51486 NULL ++wl18xx_enable_interrupts_51490 wl18xx_enable_interrupts 0 51490 NULL ++show_temp_tolerance_51491 show_temp_tolerance 0 51491 NULL ++kvm_fetch_guest_virt_51493 kvm_fetch_guest_virt 2-4 51493 NULL ++delay_show_51497 delay_show 0 51497 NULL ++fuse_read_batch_forget_51501 fuse_read_batch_forget 0 51501 NULL ++get_dev_status_51505 get_dev_status 0 51505 NULL ++udf_write_inode_51511 udf_write_inode 0 51511 NULL nohasharray ++irda_open_tsap_51511 irda_open_tsap 0 51511 &udf_write_inode_51511 ++il3945_show_measurement_51513 il3945_show_measurement 0 51513 NULL ++__isl29003_write_reg_51515 __isl29003_write_reg 0 51515 NULL ++tw9910_set_frame_51517 tw9910_set_frame 0 51517 NULL ++store_51519 store 0-3 51519 NULL ++show_dts_51521 show_dts 0 51521 NULL nohasharray ++xen_tmem_put_page_51521 xen_tmem_put_page 4 51521 &show_dts_51521 ++ieee80211_if_write_uapsd_queues_51526 ieee80211_if_write_uapsd_queues 3-0 51526 NULL ++atkbd_show_force_release_51527 atkbd_show_force_release 0 51527 NULL ++upload_code_51528 upload_code 0 51528 NULL ++key_search_51533 key_search 0 51533 NULL ++vid_show_51538 vid_show 0 51538 NULL ++iio_read_const_attr_51541 iio_read_const_attr 0 51541 NULL nohasharray ++carl9170_read_reg_51541 carl9170_read_reg 0 51541 &iio_read_const_attr_51541 ++pci_quatech_init_51542 pci_quatech_init 0 51542 NULL ++new_offset_show_51546 new_offset_show 0 51546 NULL ++store_hairpin_mode_51547 store_hairpin_mode 0 51547 NULL ++pyra_sysfs_read_profile_buttons_51549 pyra_sysfs_read_profile_buttons 0-5-6 51549 NULL nohasharray ++__alloc_eip_netdev_51549 __alloc_eip_netdev 1 51549 &pyra_sysfs_read_profile_buttons_51549 ++security_kernel_fw_from_file_51553 security_kernel_fw_from_file 0 51553 NULL ++broadsheet_verify_spiflash_51559 broadsheet_verify_spiflash 0 51559 NULL ++padlock_sha256_final_nano_51560 padlock_sha256_final_nano 0 51560 NULL nohasharray ++icmp_manip_pkt_51560 icmp_manip_pkt 4 51560 &padlock_sha256_final_nano_51560 ++write_u64_51561 write_u64 0 51561 NULL ++read_fw_51564 read_fw 0-5-6 51564 NULL ++tx_sg_51567 tx_sg 0 51567 NULL ++batadv_tt_prepare_tvlv_local_data_51568 batadv_tt_prepare_tvlv_local_data 0 51568 NULL ++netlink_broadcast_51573 netlink_broadcast 0 51573 NULL ++mlx4_en_vlan_rx_add_vid_51584 mlx4_en_vlan_rx_add_vid 0 51584 NULL ++eeprom_93xx46_store_erase_51585 eeprom_93xx46_store_erase 0-4 51585 NULL ++ixgb_get_eeprom_len_51586 ixgb_get_eeprom_len 0 51586 NULL ++hdaps_invert_store_51587 hdaps_invert_store 0-4 51587 NULL ++snd_interval_refine_first_51589 snd_interval_refine_first 0 51589 NULL nohasharray ++atkbd_do_set_extra_51589 atkbd_do_set_extra 0-4 51589 &snd_interval_refine_first_51589 ++ip6_tnl_change_mtu_51594 ip6_tnl_change_mtu 0 51594 NULL ++show_sas_phy_maximum_linkrate_51597 show_sas_phy_maximum_linkrate 0 51597 NULL ++aac_convert_sgraw2_51598 aac_convert_sgraw2 4 51598 NULL ++ecryptfs_privileged_open_51600 ecryptfs_privileged_open 0 51600 NULL ++lpfc_hba_init_link_51601 lpfc_hba_init_link 0 51601 NULL ++affs_check_name_51603 affs_check_name 0 51603 NULL nohasharray ++bch_strtouint_h_51603 bch_strtouint_h 0 51603 &affs_check_name_51603 nohasharray ++rfcomm_tty_write_51603 rfcomm_tty_write 0-3 51603 &bch_strtouint_h_51603 ++_nfs4_proc_link_51608 _nfs4_proc_link 0 51608 NULL ++wait_for_completion_timeout_51629 wait_for_completion_timeout 0 51629 NULL nohasharray ++cmd_complete_51629 cmd_complete 6 51629 &wait_for_completion_timeout_51629 ++int3402_thermal_get_trip_type_51635 int3402_thermal_get_trip_type 0 51635 NULL ++sctp_auth_create_key_51641 sctp_auth_create_key 1 51641 NULL ++isl_upload_firmware_51646 isl_upload_firmware 0 51646 NULL ++iscsi_create_session_51647 iscsi_create_session 3 51647 NULL ++si4713_set_mute_51651 si4713_set_mute 0 51651 NULL ++show_wwan_51655 show_wwan 0 51655 NULL ++snd_vt1724_playback_spdif_prepare_51661 snd_vt1724_playback_spdif_prepare 0 51661 NULL ++emmaprp_queue_setup_51666 emmaprp_queue_setup 0 51666 NULL ++async_xor_51668 async_xor 3 51668 NULL ++ps_upsd_utilization_read_51669 ps_upsd_utilization_read 3-0 51669 NULL ++net1080_check_connect_51673 net1080_check_connect 0 51673 NULL ++ixgbe_read_posted_mbx_51676 ixgbe_read_posted_mbx 0 51676 NULL ++mma8452_show_int_plus_micros_51679 mma8452_show_int_plus_micros 0 51679 NULL nohasharray ++host_store_hp_ssd_smart_path_status_51679 host_store_hp_ssd_smart_path_status 0-4 51679 &mma8452_show_int_plus_micros_51679 ++acpi_ut_walk_package_tree_51681 acpi_ut_walk_package_tree 0 51681 NULL nohasharray ++padlock_sha1_final_nano_51681 padlock_sha1_final_nano 0 51681 &acpi_ut_walk_package_tree_51681 ++sctp_setsockopt_associnfo_51684 sctp_setsockopt_associnfo 3-0 51684 NULL ++xfs_attr_rmtval_remove_51686 xfs_attr_rmtval_remove 0 51686 NULL nohasharray ++ad9523_io_update_51686 ad9523_io_update 0 51686 &xfs_attr_rmtval_remove_51686 ++sfi_sysfs_install_table_51688 sfi_sysfs_install_table 1 51688 NULL nohasharray ++igbvf_get_eeprom_len_51688 igbvf_get_eeprom_len 0 51688 &sfi_sysfs_install_table_51688 ++request_key_auth_preparse_51690 request_key_auth_preparse 0 51690 NULL ++isi_camera_get_formats_51692 isi_camera_get_formats 0 51692 NULL ++rtw_os_xmit_resource_alloc23a_51693 rtw_os_xmit_resource_alloc23a 3 51693 NULL ++ocfs2_readpage_51699 ocfs2_readpage 0 51699 NULL ++md5_update_51700 md5_update 0 51700 NULL ++qla2x00_zio_timer_store_51701 qla2x00_zio_timer_store 0-4 51701 NULL ++bmp085_get_temperature_51702 bmp085_get_temperature 0 51702 NULL ++fat_clusters_flush_51703 fat_clusters_flush 0 51703 NULL ++sel_write_access_51704 sel_write_access 3 51704 NULL ++cx25840_s_mbus_fmt_51707 cx25840_s_mbus_fmt 0 51707 NULL ++irq_alloc_hwirqs_51714 irq_alloc_hwirqs 1 51714 NULL nohasharray ++tty_cdev_add_51714 tty_cdev_add 2-4 51714 &irq_alloc_hwirqs_51714 ++gem_alloc_skb_51715 gem_alloc_skb 2 51715 NULL ++v9fs_alloc_rdir_buf_51716 v9fs_alloc_rdir_buf 2 51716 NULL ++drm_compat_ioctl_51717 drm_compat_ioctl 2 51717 NULL ++ocfs2_xattr_user_get_51723 ocfs2_xattr_user_get 0 51723 NULL ++sg_read_oxfer_51724 sg_read_oxfer 3 51724 NULL ++str_read_51731 str_read 0-4 51731 NULL ++cm4040_read_51732 cm4040_read 3-0 51732 NULL ++tvp5150_mbus_fmt_51737 tvp5150_mbus_fmt 0 51737 NULL nohasharray ++hid_parse_report_51737 hid_parse_report 3 51737 &tvp5150_mbus_fmt_51737 ++qt1010_readreg_51740 qt1010_readreg 0 51740 NULL ++mt2063_get_dnc_output_enable_51744 mt2063_get_dnc_output_enable 0 51744 NULL ++get_user_pages_fast_51751 get_user_pages_fast 0 51751 NULL ++set_alarm_mask_51752 set_alarm_mask 0-4 51752 NULL nohasharray ++ifx_spi_insert_flip_string_51752 ifx_spi_insert_flip_string 3 51752 &set_alarm_mask_51752 ++aac_change_queue_depth_51753 aac_change_queue_depth 0-2 51753 NULL ++if_write_51756 if_write 3 51756 NULL ++ioremap_prot_51764 ioremap_prot 2-1 51764 NULL ++iio_buffer_add_channel_sysfs_51766 iio_buffer_add_channel_sysfs 0 51766 NULL ++ican3_set_termination_51769 ican3_set_termination 0 51769 NULL ++transmit_led_message_51782 transmit_led_message 0-3 51782 NULL ++out_of_line_wait_on_bit_51783 out_of_line_wait_on_bit 0 51783 NULL ++expkey_parse_51787 expkey_parse 0 51787 NULL ++ssd1307fb_alloc_array_51788 ssd1307fb_alloc_array 1 51788 NULL ++xen_alloc_pud_51791 xen_alloc_pud 2 51791 NULL ++dev_init_pre_alt_51793 dev_init_pre_alt 0 51793 NULL ++pccard_store_insert_51794 pccard_store_insert 0-4 51794 NULL ++every_nth_store_51795 every_nth_store 0-3 51795 NULL ++hfsplus_listxattr_51796 hfsplus_listxattr 0-3 51796 NULL ++c2port_write_flash_data_51797 c2port_write_flash_data 0-5-6 51797 NULL ++pm_qos_resume_latency_show_51798 pm_qos_resume_latency_show 0 51798 NULL ++acpi_table_parse_entries_51801 acpi_table_parse_entries 0 51801 NULL ++fc0013_set_params_51810 fc0013_set_params 0 51810 NULL ++qlcnic_82xx_get_pci_info_51814 qlcnic_82xx_get_pci_info 0 51814 NULL nohasharray ++store_51814 store 0-3 51814 &qlcnic_82xx_get_pci_info_51814 ++edd_show_default_cylinders_51815 edd_show_default_cylinders 0 51815 NULL ++qib_alloc_devdata_51819 qib_alloc_devdata 2 51819 NULL ++buffer_from_user_51826 buffer_from_user 3 51826 NULL ++topology_add_dev_51831 topology_add_dev 0 51831 NULL ++_write_user_prot_reg_51832 _write_user_prot_reg 0 51832 NULL ++rbd_dev_v1_header_info_51837 rbd_dev_v1_header_info 0 51837 NULL ++write_packet_51838 write_packet 0 51838 NULL ++wl1251_acx_sg_enable_51840 wl1251_acx_sg_enable 0 51840 NULL nohasharray ++store_filter_select_51840 store_filter_select 0-4 51840 &wl1251_acx_sg_enable_51840 ++uinput_setup_device_51841 uinput_setup_device 0 51841 NULL ++zd_set_encryption_type_51842 zd_set_encryption_type 0 51842 NULL ++raw6_getfrag_51846 raw6_getfrag 3-4 51846 NULL ++ioread32_51847 ioread32 0 51847 NULL nohasharray ++read_file_tgt_tx_stats_51847 read_file_tgt_tx_stats 3-0 51847 &ioread32_51847 ++do_readv_writev_51849 do_readv_writev 4-0 51849 NULL ++vti6_dev_init_51851 vti6_dev_init 0 51851 NULL nohasharray ++set_interval_51851 set_interval 0-4 51851 &vti6_dev_init_51851 ++SYSC_sendto_51852 SYSC_sendto 6-3 51852 NULL nohasharray ++set_frame_retries_51852 set_frame_retries 0 51852 &SYSC_sendto_51852 ++show_hairpin_mode_51853 show_hairpin_mode 0 51853 NULL ++pointer_size_read_51863 pointer_size_read 3-0 51863 NULL ++cfhsi_up_51866 cfhsi_up 0 51866 NULL ++qla2x00_mpi_version_show_51867 qla2x00_mpi_version_show 0 51867 NULL ++get_indirect_ea_51869 get_indirect_ea 4 51869 NULL nohasharray ++create_beep_ctls_51869 create_beep_ctls 0 51869 &get_indirect_ea_51869 ++reg_write_multiple_51871 reg_write_multiple 0 51871 NULL ++rx_fifo_errors_show_51874 rx_fifo_errors_show 0 51874 NULL ++user_read_51881 user_read 3 51881 NULL ++dbAdjCtl_51888 dbAdjCtl 0 51888 NULL ++b44_readphy_51890 b44_readphy 0 51890 NULL ++nilfs_cleanup_super_51892 nilfs_cleanup_super 0 51892 NULL ++fcoe_destroy_51895 fcoe_destroy 0 51895 NULL ++virt_to_phys_51896 virt_to_phys 0 51896 NULL nohasharray ++SyS_mq_timedsend_51896 SyS_mq_timedsend 3 51896 &virt_to_phys_51896 ++qla2x00_isp_name_show_51897 qla2x00_isp_name_show 0 51897 NULL ++query_gid_51901 query_gid 0 51901 NULL ++snd_trident_spdif_prepare_51903 snd_trident_spdif_prepare 0 51903 NULL nohasharray ++solo_p2m_dma_51903 solo_p2m_dma 0 51903 &snd_trident_spdif_prepare_51903 ++host_lock_store_51904 host_lock_store 0-3 51904 NULL ++read_live_nvram_51907 read_live_nvram 0-5-6 51907 NULL ++btrfs_label_show_51918 btrfs_label_show 0 51918 NULL ++wmi_set_ie_51919 wmi_set_ie 3 51919 NULL ++of_property_read_u8_array_51921 of_property_read_u8_array 0 51921 NULL ++dvb_usbv2_generic_rw_51922 dvb_usbv2_generic_rw 0 51922 NULL nohasharray ++logfs_fsync_51922 logfs_fsync 0 51922 &dvb_usbv2_generic_rw_51922 ++write_grant_head_show_51927 write_grant_head_show 0 51927 NULL nohasharray ++unix_set_peek_off_51927 unix_set_peek_off 0 51927 &write_grant_head_show_51927 ++dbg_status_buf_51930 dbg_status_buf 2 51930 NULL ++task_has_system_51936 task_has_system 0 51936 NULL ++__tcp_mtu_to_mss_51938 __tcp_mtu_to_mss 0-2 51938 NULL ++direct_IO_51941 direct_IO 0 51941 NULL ++show_test_51942 show_test 0 51942 NULL ++pm_test_show_51946 pm_test_show 0 51946 NULL ++scsi_get_vpd_page_51951 scsi_get_vpd_page 4 51951 NULL ++get_clock_info_51952 get_clock_info 4 51952 NULL ++target_stat_scsi_lu_show_attr_hs_num_cmds_51954 target_stat_scsi_lu_show_attr_hs_num_cmds 0 51954 NULL ++pwm_period_show_51962 pwm_period_show 0 51962 NULL ++size_show_51963 size_show 0 51963 NULL ++ieee80211_verify_mac_51966 ieee80211_verify_mac 0 51966 NULL ++snd_mask_min_51969 snd_mask_min 0 51969 NULL nohasharray ++arizona_free_irq_51969 arizona_free_irq 2 51969 &snd_mask_min_51969 ++device_create_lockspace_51970 device_create_lockspace 0 51970 NULL nohasharray ++hotkey_mask_store_51970 hotkey_mask_store 0-4 51970 &device_create_lockspace_51970 ++read_page_51972 read_page 2 51972 NULL ++cpufv_disabled_show_51976 cpufv_disabled_show 0 51976 NULL ++pipe_crc_set_source_51980 pipe_crc_set_source 0 51980 NULL nohasharray ++fcoe_validate_vport_create_51980 fcoe_validate_vport_create 0 51980 &pipe_crc_set_source_51980 ++lpfc_nport_evt_cnt_show_51984 lpfc_nport_evt_cnt_show 0 51984 NULL ++ath6kl_sdio_alloc_prep_scat_req_51986 ath6kl_sdio_alloc_prep_scat_req 2 51986 NULL ++idt77252_proc_read_51988 idt77252_proc_read 0 51988 NULL nohasharray ++store_prochot_short_51988 store_prochot_short 0-4 51988 &idt77252_proc_read_51988 ++_c4iw_write_mem_dma_51991 _c4iw_write_mem_dma 3 51991 NULL ++__detect_osd_51993 __detect_osd 0 51993 NULL ++ntfs_attr_size_51994 ntfs_attr_size 0 51994 NULL ++dwc3_mode_write_51997 dwc3_mode_write 3-0 51997 NULL ++ubifs_write_begin_52000 ubifs_write_begin 0 52000 NULL ++queue_nomerges_store_52001 queue_nomerges_store 3-0 52001 NULL ++store_received_ref_clk3a_52006 store_received_ref_clk3a 0-4 52006 NULL ++xpnet_dev_open_52009 xpnet_dev_open 0 52009 NULL ++log_buf_addr_show_52010 log_buf_addr_show 0 52010 NULL nohasharray ++scsi_sysfs_add_host_52010 scsi_sysfs_add_host 0 52010 &log_buf_addr_show_52010 ++wacom_led_control_52014 wacom_led_control 0 52014 NULL ++dummy_enable_52019 dummy_enable 0 52019 NULL ++lp55xx_show_engine_select_52020 lp55xx_show_engine_select 0 52020 NULL ++apds990x_write_byte_52022 apds990x_write_byte 0 52022 NULL ++r820t_write_52023 r820t_write 0-4 52023 NULL ++vxge_rx_alloc_52024 vxge_rx_alloc 3 52024 NULL ++show_current_driver_52027 show_current_driver 0 52027 NULL ++lp3943_pwm_config_52030 lp3943_pwm_config 0 52030 NULL ++override_release_52032 override_release 2 52032 NULL ++snd_ac97_set_rate_52041 snd_ac97_set_rate 0 52041 NULL nohasharray ++unique_id_show_52041 unique_id_show 0 52041 &snd_ac97_set_rate_52041 ++irda_create_52042 irda_create 0 52042 NULL ++netdev_show_52044 netdev_show 0 52044 NULL ++dma_rx_errors_read_52045 dma_rx_errors_read 3-0 52045 NULL ++show_fcf_state_52047 show_fcf_state 0 52047 NULL ++msnd_fifo_write_52052 msnd_fifo_write 0-3 52052 NULL ++show_version_52054 show_version 0 52054 NULL ++dvb_ringbuffer_avail_52057 dvb_ringbuffer_avail 0 52057 NULL ++regulator_disable_52058 regulator_disable 0 52058 NULL nohasharray ++show_ipFragOKs_52058 show_ipFragOKs 0 52058 ®ulator_disable_52058 ++__fuse_request_alloc_52060 __fuse_request_alloc 1 52060 NULL ++ieee80211_change_mac_52065 ieee80211_change_mac 0 52065 NULL ++isofs_readpages_52067 isofs_readpages 4 52067 NULL ++show_conn_param_ISCSI_PARAM_IPV4_TOS_52071 show_conn_param_ISCSI_PARAM_IPV4_TOS 0 52071 NULL ++sh_irda_crc_init_52072 sh_irda_crc_init 0 52072 NULL nohasharray ++mxuport_process_read_urb_data_52072 mxuport_process_read_urb_data 3 52072 &sh_irda_crc_init_52072 ++mt2063_get_if_frequency_52079 mt2063_get_if_frequency 0 52079 NULL ++wil_wait_for_fw_ready_52081 wil_wait_for_fw_ready 0 52081 NULL nohasharray ++lm3533_set_lvled_config_52081 lm3533_set_lvled_config 0 52081 &wil_wait_for_fw_ready_52081 ++ath10k_pci_hif_diag_read_52084 ath10k_pci_hif_diag_read 0 52084 NULL nohasharray ++ft_lport_notify_52084 ft_lport_notify 0 52084 &ath10k_pci_hif_diag_read_52084 ++amd_ec_read_52087 amd_ec_read 0 52087 NULL nohasharray ++iscsi_stat_logout_attr_show_52087 iscsi_stat_logout_attr_show 0 52087 &amd_ec_read_52087 ++nsm_get_handle_52089 nsm_get_handle 4 52089 NULL nohasharray ++rt2x00debug_read_rf_52089 rt2x00debug_read_rf 0-3 52089 &nsm_get_handle_52089 ++affs_do_readpage_ofs_52095 affs_do_readpage_ofs 0 52095 NULL ++ulist_add_merge_52096 ulist_add_merge 0 52096 NULL ++mtrr_save_52097 mtrr_save 0 52097 NULL ++ft_wwn_show_attr_version_52102 ft_wwn_show_attr_version 0 52102 NULL ++o2net_debug_read_52105 o2net_debug_read 3-0 52105 NULL ++qla4xxx_sysfs_ddb_get_param_52106 qla4xxx_sysfs_ddb_get_param 0 52106 NULL ++smsdvb_stats_read_52114 smsdvb_stats_read 3-0 52114 NULL ++ov9740_set_res_52118 ov9740_set_res 0 52118 NULL ++show_spi_transport_max_offset_52125 show_spi_transport_max_offset 0 52125 NULL ++split_scan_timeout_write_52128 split_scan_timeout_write 3-0 52128 NULL nohasharray ++ring_size_show_52128 ring_size_show 0 52128 &split_scan_timeout_write_52128 ++retry_count_read_52129 retry_count_read 3-0 52129 NULL ++scan_sleep_millisecs_store_52134 scan_sleep_millisecs_store 0-4 52134 NULL ++gdm_usb_hci_send_52138 gdm_usb_hci_send 3 52138 NULL ++zram_meta_alloc_52140 zram_meta_alloc 1 52140 NULL nohasharray ++sub_alloc_52140 sub_alloc 0 52140 &zram_meta_alloc_52140 ++netdev_open_52143 netdev_open 0 52143 NULL ++mmc_sd_power_restore_52144 mmc_sd_power_restore 0 52144 NULL ++hysdn_conf_write_52145 hysdn_conf_write 3 52145 NULL nohasharray ++ext2_alloc_blocks_52145 ext2_alloc_blocks 2-0 52145 &hysdn_conf_write_52145 ++ov772x_g_fmt_52146 ov772x_g_fmt 0 52146 NULL ++htable_size_52148 htable_size 0-1 52148 NULL nohasharray ++snd_intel8x0_pcm_trigger_52148 snd_intel8x0_pcm_trigger 0 52148 &htable_size_52148 ++fcopy_read_52149 fcopy_read 0-3 52149 NULL ++set_rdac0_52150 set_rdac0 4-0 52150 NULL ++gfs2_rs_alloc_52152 gfs2_rs_alloc 0 52152 NULL ++smk_write_load2_52155 smk_write_load2 3-0 52155 NULL ++tipc_node_get_mtu_52157 tipc_node_get_mtu 0 52157 NULL nohasharray ++sp_open_dev_52157 sp_open_dev 0 52157 &tipc_node_get_mtu_52157 ++ieee80211_if_read_dot11MeshRetryTimeout_52168 ieee80211_if_read_dot11MeshRetryTimeout 3-0 52168 NULL nohasharray ++s5k83a_set_flip_real_52168 s5k83a_set_flip_real 0 52168 &ieee80211_if_read_dot11MeshRetryTimeout_52168 ++mga_compat_ioctl_52170 mga_compat_ioctl 2 52170 NULL ++pm2fb_check_var_52172 pm2fb_check_var 0 52172 NULL ++mxuport_open_52173 mxuport_open 0 52173 NULL ++acquire_52175 acquire 0 52175 NULL nohasharray ++__acpi_power_on_52175 __acpi_power_on 0 52175 &acquire_52175 nohasharray ++mtd_writesize_show_52175 mtd_writesize_show 0 52175 &__acpi_power_on_52175 ++print_prefix_52176 print_prefix 0 52176 NULL ++ib_dma_map_page_52177 ib_dma_map_page 0-3 52177 NULL ++proc_pid_readlink_52186 proc_pid_readlink 3-0 52186 NULL nohasharray ++hptiop_show_version_52186 hptiop_show_version 0 52186 &proc_pid_readlink_52186 ++show_tabletStylusUpper_52190 show_tabletStylusUpper 0 52190 NULL nohasharray ++hermes_bap_seek_52190 hermes_bap_seek 0 52190 &show_tabletStylusUpper_52190 ++reiserfs_posix_acl_from_disk_52191 reiserfs_posix_acl_from_disk 2 52191 NULL ++rt2800pci_enable_radio_52192 rt2800pci_enable_radio 0 52192 NULL ++ssp_tm_req_52193 ssp_tm_req 0 52193 NULL ++show_session_param_ISCSI_PARAM_INITIAL_R2T_EN_52194 show_session_param_ISCSI_PARAM_INITIAL_R2T_EN 0 52194 NULL ++atl2_get_eeprom_len_52196 atl2_get_eeprom_len 0 52196 NULL ++iio_buffer_show_enable_52202 iio_buffer_show_enable 0 52202 NULL ++prepare_ring_52203 prepare_ring 0 52203 NULL nohasharray ++find_lkb_52203 find_lkb 0 52203 &prepare_ring_52203 ++iad_bFunctionProtocol_show_52207 iad_bFunctionProtocol_show 0 52207 NULL ++bad_inode_readlink_52210 bad_inode_readlink 0 52210 NULL ++ipmr_mfc_delete_52211 ipmr_mfc_delete 0 52211 NULL ++mcp3021_read16_52212 mcp3021_read16 0 52212 NULL ++adt7411_show_bit_52213 adt7411_show_bit 0 52213 NULL ++ib_sa_path_rec_get_52214 ib_sa_path_rec_get 0 52214 NULL ++vmci_qp_broker_alloc_52216 vmci_qp_broker_alloc 5-6 52216 NULL nohasharray ++xen_find_pfn_range_52216 xen_find_pfn_range 0 52216 &vmci_qp_broker_alloc_52216 ++iscsi_if_send_reply_52219 iscsi_if_send_reply 7 52219 NULL ++_nfs4_open_and_get_state_52221 _nfs4_open_and_get_state 0 52221 NULL ++de_init_rings_52222 de_init_rings 0 52222 NULL ++show_session_param_ISCSI_PARAM_INITIATOR_NAME_52224 show_session_param_ISCSI_PARAM_INITIATOR_NAME 0 52224 NULL nohasharray ++arcmsr_sysfs_iop_message_write_52224 arcmsr_sysfs_iop_message_write 0-6-5 52224 &show_session_param_ISCSI_PARAM_INITIATOR_NAME_52224 ++show_chgmode_52225 show_chgmode 0 52225 NULL ++ptype_store_52226 ptype_store 0-3 52226 NULL ++ufx_set_vid_mode_52227 ufx_set_vid_mode 0 52227 NULL ++wdata_send_pages_52229 wdata_send_pages 0 52229 NULL ++max1111_read_52230 max1111_read 0 52230 NULL ++nvram_read_52231 nvram_read 0-3 52231 NULL ++snd_ensoniq_capture_prepare_52232 snd_ensoniq_capture_prepare 0 52232 NULL nohasharray ++_alloc_mISDN_skb_52232 _alloc_mISDN_skb 3 52232 &snd_ensoniq_capture_prepare_52232 ++o2nm_cluster_attr_fence_method_read_52233 o2nm_cluster_attr_fence_method_read 0 52233 NULL ++arizona_micsupp_disable_52236 arizona_micsupp_disable 0 52236 NULL ++do_dmabuf_dirty_ldu_52241 do_dmabuf_dirty_ldu 6 52241 NULL nohasharray ++minix_write_inode_52241 minix_write_inode 0 52241 &do_dmabuf_dirty_ldu_52241 ++fuse_request_alloc_52243 fuse_request_alloc 1 52243 NULL nohasharray ++fnic_show_state_52243 fnic_show_state 0 52243 &fuse_request_alloc_52243 ++genlmsg_end_52244 genlmsg_end 0 52244 NULL ++nfs_updatepage_52248 nfs_updatepage 0 52248 NULL ++pm80x_request_irq_52250 pm80x_request_irq 2 52250 NULL ++nvkm_client_ioctl_52251 nvkm_client_ioctl 0 52251 NULL ++rd_build_device_space_52253 rd_build_device_space 0 52253 NULL nohasharray ++w1_ds2781_eeprom_cmd_52253 w1_ds2781_eeprom_cmd 0 52253 &rd_build_device_space_52253 ++_init_blk_request_52256 _init_blk_request 0 52256 NULL ++physical_line_partition_show_52257 physical_line_partition_show 0 52257 NULL ++mdiobus_alloc_size_52259 mdiobus_alloc_size 1 52259 NULL ++flush_52261 flush 0 52261 NULL ++read_52268 read 0 52268 NULL ++set_temp_limit_52269 set_temp_limit 0 52269 NULL nohasharray ++w1_master_attribute_store_search_52269 w1_master_attribute_store_search 0-4 52269 &set_temp_limit_52269 nohasharray ++cap_safe_nice_52269 cap_safe_nice 0 52269 &w1_master_attribute_store_search_52269 ++ext2_direct_IO_52270 ext2_direct_IO 4-0 52270 NULL ++sisusbcon_do_font_op_52271 sisusbcon_do_font_op 9 52271 NULL ++jbd2_journal_flush_52280 jbd2_journal_flush 0 52280 NULL ++snd_pcm_pre_reset_52282 snd_pcm_pre_reset 0 52282 NULL ++snd_sonicvibes_capture_prepare_52293 snd_sonicvibes_capture_prepare 0 52293 NULL ++nl80211_netlink_notify_52297 nl80211_netlink_notify 0 52297 NULL nohasharray ++afs_cell_cache_get_key_52297 afs_cell_cache_get_key 0 52297 &nl80211_netlink_notify_52297 ++rw_read_52299 rw_read 6-0-5 52299 NULL ++fd_set_configfs_dev_params_52304 fd_set_configfs_dev_params 0-3 52304 NULL nohasharray ++ath6kl_wmi_get_new_buf_52304 ath6kl_wmi_get_new_buf 1 52304 &fd_set_configfs_dev_params_52304 ++sis5595_access_52305 sis5595_access 0 52305 NULL ++of_address_to_resource_52308 of_address_to_resource 2 52308 NULL ++kobject_set_name_vargs_52309 kobject_set_name_vargs 0 52309 NULL ++qlcnic_82xx_set_nic_info_52311 qlcnic_82xx_set_nic_info 0 52311 NULL ++ssd1307fb_write_52315 ssd1307fb_write 3 52315 NULL ++request_asymmetric_key_52317 request_asymmetric_key 4-2 52317 NULL nohasharray ++show_phy_flash_cfg_52317 show_phy_flash_cfg 0 52317 &request_asymmetric_key_52317 nohasharray ++store_vrm_reg_52317 store_vrm_reg 0-4 52317 &show_phy_flash_cfg_52317 ++hwflags_read_52318 hwflags_read 3-0 52318 NULL ++t3_sge_init_rspcntxt_52321 t3_sge_init_rspcntxt 0 52321 NULL ++cryptomgr_notify_52323 cryptomgr_notify 0 52323 NULL ++erst_exec_move_data_52324 erst_exec_move_data 0 52324 NULL ++grp_opt_proc_write_52327 grp_opt_proc_write 0-3 52327 NULL ++ntfs_rl_split_52328 ntfs_rl_split 4-2 52328 NULL ++erst_exec_load_var1_52330 erst_exec_load_var1 0 52330 NULL nohasharray ++parse_protocol_change_52330 parse_protocol_change 0 52330 &erst_exec_load_var1_52330 ++ipv4_conntrack_in_52331 ipv4_conntrack_in 0 52331 NULL ++qh_schedule_52332 qh_schedule 0 52332 NULL nohasharray ++show_ipv6_iface_link_local_state_52332 show_ipv6_iface_link_local_state 0 52332 &qh_schedule_52332 ++test_unaligned_bulk_52333 test_unaligned_bulk 3 52333 NULL nohasharray ++snd_em28xx_capture_trigger_52333 snd_em28xx_capture_trigger 0 52333 &test_unaligned_bulk_52333 ++target_fabric_discovery_attr_show_52336 target_fabric_discovery_attr_show 0 52336 NULL nohasharray ++carl9170_usb_open_52336 carl9170_usb_open 0 52336 &target_fabric_discovery_attr_show_52336 nohasharray ++enable_vport_52336 enable_vport 0 52336 &carl9170_usb_open_52336 ++hur_len_52339 hur_len 0 52339 NULL ++ad7877_gpio3_store_52340 ad7877_gpio3_store 0-4 52340 NULL ++fc2580_get_if_frequency_52341 fc2580_get_if_frequency 0 52341 NULL ++store_52342 store 0-3 52342 NULL ++dccp_v4_connect_52343 dccp_v4_connect 0 52343 NULL ++tcs3414_buffer_predisable_52350 tcs3414_buffer_predisable 0 52350 NULL nohasharray ++d_revalidate_52350 d_revalidate 0 52350 &tcs3414_buffer_predisable_52350 ++pscsi_configure_device_52352 pscsi_configure_device 0 52352 NULL ++ds1672_get_control_52353 ds1672_get_control 0 52353 NULL ++ina209_show_interval_52354 ina209_show_interval 0 52354 NULL ++i40e_vsi_control_rings_52357 i40e_vsi_control_rings 0 52357 NULL ++ieee80211_rx_radiotap_hdrlen_52359 ieee80211_rx_radiotap_hdrlen 0 52359 NULL ++show_iostat_counterbits_52360 show_iostat_counterbits 0 52360 NULL ++tx_bytes_show_52361 tx_bytes_show 0 52361 NULL nohasharray ++label_vga_52361 label_vga 0 52361 &tx_bytes_show_52361 ++show_counter_rx_p8_hdr_egr_ovfls_52362 show_counter_rx_p8_hdr_egr_ovfls 0 52362 NULL nohasharray ++cap_inode_killpriv_52362 cap_inode_killpriv 0 52362 &show_counter_rx_p8_hdr_egr_ovfls_52362 ++copy_entries_to_user_52367 copy_entries_to_user 1 52367 NULL nohasharray ++ssb_attr_sprom_show_52367 ssb_attr_sprom_show 0 52367 ©_entries_to_user_52367 ++nilfs_segctor_last_nongc_write_time_secs_show_52369 nilfs_segctor_last_nongc_write_time_secs_show 0 52369 NULL ++ipath_set_part_key_52370 ipath_set_part_key 0 52370 NULL ++iwl_dump_fh_52371 iwl_dump_fh 0 52371 NULL ++show_sched3_52373 show_sched3 0 52373 NULL nohasharray ++__uncore_map_show_52373 __uncore_map_show 0 52373 &show_sched3_52373 ++hfsplus_find_attr_52374 hfsplus_find_attr 0 52374 NULL ++ixgbevf_setup_tx_resources_52376 ixgbevf_setup_tx_resources 0 52376 NULL ++mq_emit_config_values_52378 mq_emit_config_values 3 52378 NULL nohasharray ++quota_warn_period_show_52378 quota_warn_period_show 0 52378 &mq_emit_config_values_52378 nohasharray ++pfkey_sockaddr_pair_size_52378 pfkey_sockaddr_pair_size 0 52378 "a_warn_period_show_52378 ++snd_rme96_capture_prepare_52380 snd_rme96_capture_prepare 0 52380 NULL ++iwl_nvm_init_52382 iwl_nvm_init 0 52382 NULL ++isdn_writebuf_stub_52383 isdn_writebuf_stub 4-0 52383 NULL ++task_has_security_52386 task_has_security 0 52386 NULL ++jfs_setxattr_52389 jfs_setxattr 0-4 52389 NULL ++input_print_modalias_bits_52395 input_print_modalias_bits 0 52395 NULL ++svc_partial_recvfrom_52396 svc_partial_recvfrom 4 52396 NULL ++aer_inject_write_52399 aer_inject_write 3-0 52399 NULL ++selinux_inode_setattr_52401 selinux_inode_setattr 0 52401 NULL ++pm_suspend_52403 pm_suspend 0 52403 NULL ++do_ncp_rpc_call_52406 do_ncp_rpc_call 0 52406 NULL ++show_counter_rx_p5_hdr_egr_ovfls_52407 show_counter_rx_p5_hdr_egr_ovfls 0 52407 NULL ++aac_rx_ioremap_52410 aac_rx_ioremap 2 52410 NULL ++nilfs_segctor_collect_dirty_files_52413 nilfs_segctor_collect_dirty_files 0 52413 NULL ++clariion_activate_52414 clariion_activate 0 52414 NULL ++do_md_run_52416 do_md_run 0 52416 NULL ++safe_delay_store_52417 safe_delay_store 0-3 52417 NULL ++mmc_csd_show_52423 mmc_csd_show 0 52423 NULL ++show_alarms_in_52425 show_alarms_in 0 52425 NULL nohasharray ++line6_midibuf_init_52425 line6_midibuf_init 2 52425 &show_alarms_in_52425 ++pwc_set_autogain_52427 pwc_set_autogain 0 52427 NULL ++hso_serial_common_create_52428 hso_serial_common_create 4 52428 NULL ++delay_status_52431 delay_status 5 52431 NULL nohasharray ++gfs2_getattr_52431 gfs2_getattr 0 52431 &delay_status_52431 ++show_ipInDiscards_52432 show_ipInDiscards 0 52432 NULL ++ath6kl_delete_qos_write_52435 ath6kl_delete_qos_write 3-0 52435 NULL ++iwl_remove_station_52436 iwl_remove_station 0 52436 NULL ++ieee80211_if_fmt_num_sta_ps_52438 ieee80211_if_fmt_num_sta_ps 3 52438 NULL ++sst_prepare_and_post_msg_52443 sst_prepare_and_post_msg 0 52443 NULL ++show_radios_state_52445 show_radios_state 0 52445 NULL ++store_uframe_periodic_max_52448 store_uframe_periodic_max 0-4 52448 NULL ++keene_s_ctrl_52451 keene_s_ctrl 0 52451 NULL nohasharray ++nilfs_btree_lookup_contig_52451 nilfs_btree_lookup_contig 0 52451 &keene_s_ctrl_52451 ++alauda_read_data_52452 alauda_read_data 3 52452 NULL ++get_pci_info_52455 get_pci_info 0 52455 NULL nohasharray ++gsm_change_mtu_52455 gsm_change_mtu 0 52455 &get_pci_info_52455 ++bt_alloc_52457 bt_alloc 2 52457 NULL nohasharray ++ip6_skb_dst_mtu_52457 ip6_skb_dst_mtu 0 52457 &bt_alloc_52457 ++iwl_restore_default_wep_keys_52463 iwl_restore_default_wep_keys 0 52463 NULL ++con_write_52466 con_write 0-3 52466 NULL ++sctp_packet_transmit_52467 sctp_packet_transmit 0 52467 NULL ++ffs_epfile_aio_read_52471 ffs_epfile_aio_read 3 52471 NULL ++show_id_ext_52472 show_id_ext 0 52472 NULL ++cifs_readpage_worker_52477 cifs_readpage_worker 0 52477 NULL nohasharray ++ieee80211_alloc_txb_52477 ieee80211_alloc_txb 2-1 52477 &cifs_readpage_worker_52477 ++pch_i2c_wait_for_check_xfer_52485 pch_i2c_wait_for_check_xfer 0 52485 NULL nohasharray ++snd_hda_gen_build_controls_52485 snd_hda_gen_build_controls 0 52485 &pch_i2c_wait_for_check_xfer_52485 ++bru_s_ctrl_52486 bru_s_ctrl 0 52486 NULL ++roccat_common2_sysfs_read_keys_function_52491 roccat_common2_sysfs_read_keys_function 0-5-6 52491 NULL ++sh_mobile_i2c_xfer_52492 sh_mobile_i2c_xfer 0-3 52492 NULL nohasharray ++iscsi_tpg_auth_show_password_mutual_52492 iscsi_tpg_auth_show_password_mutual 0 52492 &sh_mobile_i2c_xfer_52492 ++fd_do_rw_52495 fd_do_rw 3 52495 NULL nohasharray ++skb_cow_head_52495 skb_cow_head 2 52495 &fd_do_rw_52495 ++sysfs_create_link_nowarn_52496 sysfs_create_link_nowarn 0 52496 NULL ++int_tasklet_entry_52500 int_tasklet_entry 3-0 52500 NULL ++xfs_alloc_get_rec_52502 xfs_alloc_get_rec 0 52502 NULL ++ems_usb_control_cmd_52504 ems_usb_control_cmd 0 52504 NULL ++smb2_async_readv_52505 smb2_async_readv 0 52505 NULL ++netlbl_unlabel_init_52506 netlbl_unlabel_init 1 52506 NULL ++qlcnic_83xx_sysfs_flash_write_52507 qlcnic_83xx_sysfs_flash_write 4 52507 NULL nohasharray ++show_rdac3_52507 show_rdac3 0 52507 &qlcnic_83xx_sysfs_flash_write_52507 ++gr_queue_ext_52511 gr_queue_ext 0 52511 NULL ++disable_slot_52512 disable_slot 0 52512 NULL ++pm_qos_power_write_52513 pm_qos_power_write 3-0 52513 NULL nohasharray ++isl29003_show_lux_52513 isl29003_show_lux 0 52513 &pm_qos_power_write_52513 ++read_fw_regs_offset_52515 read_fw_regs_offset 0 52515 NULL ++soft_offline_huge_page_52517 soft_offline_huge_page 0 52517 NULL ++bt_sock_stream_recvmsg_52518 bt_sock_stream_recvmsg 0-4 52518 NULL ++get_session_param_52521 get_session_param 0 52521 NULL ++dup_variable_bug_52525 dup_variable_bug 3 52525 NULL ++sc1200wdt_write_52527 sc1200wdt_write 0-3 52527 NULL ++raw_recvmsg_52529 raw_recvmsg 0-4 52529 NULL ++ip6table_nat_in_52536 ip6table_nat_in 0 52536 NULL ++input_dev_show_properties_52537 input_dev_show_properties 0 52537 NULL nohasharray ++gt_cur_freq_mhz_show_52537 gt_cur_freq_mhz_show 0 52537 &input_dev_show_properties_52537 ++show_caseopen_52539 show_caseopen 0 52539 NULL ++fan_fan1_input_show_52540 fan_fan1_input_show 0 52540 NULL nohasharray ++SyS_vmsplice_52540 SyS_vmsplice 3 52540 &fan_fan1_input_show_52540 ++zd_iowrite32a_locked_52542 zd_iowrite32a_locked 0 52542 NULL ++set_fan_52544 set_fan 0-4 52544 NULL ++snd_pcm_pre_prepare_52548 snd_pcm_pre_prepare 0 52548 NULL ++dccpprobe_read_52549 dccpprobe_read 3-0 52549 NULL nohasharray ++hsw_pcm_prepare_52549 hsw_pcm_prepare 0 52549 &dccpprobe_read_52549 ++force_lesc_support_read_52554 force_lesc_support_read 3-0 52554 NULL ++s35390a_get_datetime_52556 s35390a_get_datetime 0 52556 NULL nohasharray ++ntfs_prepare_pages_for_non_resident_write_52556 ntfs_prepare_pages_for_non_resident_write 0 52556 &s35390a_get_datetime_52556 ++cropcap_52561 cropcap 0 52561 NULL ++atalk_create_52562 atalk_create 0 52562 NULL ++xfs_attr_shortform_to_leaf_52564 xfs_attr_shortform_to_leaf 0 52564 NULL ++cbaf_wusb_chid_store_52566 cbaf_wusb_chid_store 0-4 52566 NULL ++debug_level_proc_write_52572 debug_level_proc_write 3-0 52572 NULL nohasharray ++show_otp1en_52572 show_otp1en 0 52572 &debug_level_proc_write_52572 nohasharray ++nfs_getattr_52572 nfs_getattr 0 52572 &show_otp1en_52572 nohasharray ++b43legacy_probe_52572 b43legacy_probe 0 52572 &nfs_getattr_52572 ++ds2780_set_sense_resistor_value_52573 ds2780_set_sense_resistor_value 0-4 52573 NULL ++target_stat_scsi_port_show_attr_dev_52577 target_stat_scsi_port_show_attr_dev 0 52577 NULL ++acpi_processor_start_52582 acpi_processor_start 0 52582 NULL ++wl12xx_init_fwlog_52585 wl12xx_init_fwlog 0 52585 NULL ++roccat_common2_sysfs_read_keys_thumbster_52586 roccat_common2_sysfs_read_keys_thumbster 0-5-6 52586 NULL ++twl_rtc_read_u8_52587 twl_rtc_read_u8 0 52587 NULL nohasharray ++isku_sysfs_read_macro_52587 isku_sysfs_read_macro 6-0-5 52587 &twl_rtc_read_u8_52587 ++uvesafb_store_nocrtc_52589 uvesafb_store_nocrtc 0-4 52589 NULL ++show_ipReasmFails_52591 show_ipReasmFails 0 52591 NULL ++ath10k_start_52596 ath10k_start 0 52596 NULL ++store_dh_state_52601 store_dh_state 0-4 52601 NULL nohasharray ++test_write_file_52601 test_write_file 0-3 52601 &store_dh_state_52601 ++show_session_param_ISCSI_PARAM_BOOT_TARGET_52603 show_session_param_ISCSI_PARAM_BOOT_TARGET 0 52603 NULL ++SyS_setsockopt_52610 SyS_setsockopt 5 52610 NULL ++ll_sa_entry_alloc_52611 ll_sa_entry_alloc 4 52611 NULL ++apei_check_gar_52626 apei_check_gar 0 52626 NULL ++sbp_tpg_store_directory_id_52629 sbp_tpg_store_directory_id 0-3 52629 NULL ++roccat_common2_sysfs_read_keys_easyzone_52632 roccat_common2_sysfs_read_keys_easyzone 0-5-6 52632 NULL ++f2fs_setattr_52633 f2fs_setattr 0 52633 NULL ++ov7660_set_auto_exposure_52634 ov7660_set_auto_exposure 0 52634 NULL ++tps80031_writes_52638 tps80031_writes 3-4-0 52638 NULL nohasharray ++min_ratio_store_52638 min_ratio_store 0-4 52638 &tps80031_writes_52638 ++set_temp_high_52640 set_temp_high 0-4 52640 NULL ++rt2500usb_set_state_52644 rt2500usb_set_state 0 52644 NULL nohasharray ++timeout_store_52644 timeout_store 0-3 52644 &rt2500usb_set_state_52644 ++_rbd_dev_v2_snap_size_52651 _rbd_dev_v2_snap_size 0 52651 NULL ++show_temp2_crit_hyst_52656 show_temp2_crit_hyst 0 52656 NULL ++xen_swiotlb_unmap_page_52660 xen_swiotlb_unmap_page 2 52660 NULL ++cachefiles_daemon_add_cache_52668 cachefiles_daemon_add_cache 0 52668 NULL ++target_stat_scsi_port_show_attr_role_52670 target_stat_scsi_port_show_attr_role 0 52670 NULL ++SYSC_gethostname_52677 SYSC_gethostname 2 52677 NULL ++__rpc_clnt_handle_event_52679 __rpc_clnt_handle_event 0 52679 NULL ++u2_timeout_store_52681 u2_timeout_store 0-4 52681 NULL ++genphy_update_link_52684 genphy_update_link 0 52684 NULL ++reg_write_range_52690 reg_write_range 4 52690 NULL ++xen_phys_to_bus_52693 xen_phys_to_bus 0-1 52693 NULL ++sdev_store_evt_inquiry_change_reported_52694 sdev_store_evt_inquiry_change_reported 0-4 52694 NULL ++store_52696 store 0-3 52696 NULL ++b44_set_mac_addr_52700 b44_set_mac_addr 0 52700 NULL ++bonding_show_queue_id_52702 bonding_show_queue_id 0 52702 NULL ++ms_transfer_data_52705 ms_transfer_data 7 52705 NULL ++acpi_freeze_begin_52707 acpi_freeze_begin 0 52707 NULL ++atl1c_setup_ring_resources_52708 atl1c_setup_ring_resources 0 52708 NULL ++action_show_52711 action_show 0 52711 NULL ++usbip_debug_show_52712 usbip_debug_show 0 52712 NULL ++tmp102_show_temp_52713 tmp102_show_temp 0 52713 NULL ++nouveau_client_create__52715 nouveau_client_create_ 5 52715 NULL ++pm_wake_unlock_52721 pm_wake_unlock 0 52721 NULL ++iscsi_stat_instance_attr_show_52723 iscsi_stat_instance_attr_show 0 52723 NULL nohasharray ++blk_iopoll_cpu_notify_52723 blk_iopoll_cpu_notify 0 52723 &iscsi_stat_instance_attr_show_52723 ++cx25840_ir_rx_read_52724 cx25840_ir_rx_read 3 52724 NULL ++sendbytes_52726 sendbytes 0 52726 NULL ++set_capture_52728 set_capture 0 52728 NULL ++lx_pcm_trigger_52731 lx_pcm_trigger 0 52731 NULL ++blkcipher_next_slow_52733 blkcipher_next_slow 4-3 52733 NULL ++relay_alloc_page_array_52735 relay_alloc_page_array 1 52735 NULL ++v9fs_xattr_user_get_52737 v9fs_xattr_user_get 0 52737 NULL ++st_sensors_sysfs_sampling_frequency_avail_52745 st_sensors_sysfs_sampling_frequency_avail 0 52745 NULL nohasharray ++hfcsusb_rx_frame_52745 hfcsusb_rx_frame 3 52745 &st_sensors_sysfs_sampling_frequency_avail_52745 ++carl9170_debugfs_vif_dump_read_52755 carl9170_debugfs_vif_dump_read 3 52755 NULL nohasharray ++netlink_add_tap_52755 netlink_add_tap 0 52755 &carl9170_debugfs_vif_dump_read_52755 ++ieee80211_if_read_beacon_timeout_52756 ieee80211_if_read_beacon_timeout 3-0 52756 NULL nohasharray ++show_session_param_ISCSI_PARAM_DEF_TASKMGMT_TMO_52756 show_session_param_ISCSI_PARAM_DEF_TASKMGMT_TMO 0 52756 &ieee80211_if_read_beacon_timeout_52756 ++target_stat_scsi_tgt_port_show_attr_indx_52759 target_stat_scsi_tgt_port_show_attr_indx 0 52759 NULL ++set_pwm_hyst_52760 set_pwm_hyst 0-4 52760 NULL ++copy_ctr_args_52761 copy_ctr_args 2 52761 NULL ++ds1374_read_time_52763 ds1374_read_time 0 52763 NULL ++acpi_ps_execute_method_52767 acpi_ps_execute_method 0 52767 NULL ++store_52770 store 0 52770 NULL ++lpfc_poll_store_52774 lpfc_poll_store 0-4 52774 NULL ++nvme_trans_ext_inq_page_52776 nvme_trans_ext_inq_page 3 52776 NULL ++show_pec_52779 show_pec 0 52779 NULL ++set_target_52783 set_target 0-4 52783 NULL ++vim2m_buf_prepare_52786 vim2m_buf_prepare 0 52786 NULL nohasharray ++igb_pci_disable_sriov_52786 igb_pci_disable_sriov 0 52786 &vim2m_buf_prepare_52786 ++drv_get_stats_52789 drv_get_stats 0 52789 NULL ++show_52793 show 0 52793 NULL ++edac_pci_int_store_52795 edac_pci_int_store 0-3 52795 NULL ++snd_seq_ioctl_subscribe_port_52796 snd_seq_ioctl_subscribe_port 0 52796 NULL ++xenvif_write_io_ring_52802 xenvif_write_io_ring 3-0 52802 NULL nohasharray ++enabled_show_52802 enabled_show 0 52802 &xenvif_write_io_ring_52802 ++layout_cnodes_52805 layout_cnodes 0 52805 NULL ++lio_target_nacl_store_tag_52806 lio_target_nacl_store_tag 0-3 52806 NULL ++run_start_commands_52808 run_start_commands 0 52808 NULL ++b43legacy_attr_interfmode_store_52810 b43legacy_attr_interfmode_store 0-4 52810 NULL ++osst_adr_rev_show_52811 osst_adr_rev_show 0 52811 NULL ++ds2780_get_rsgain_setting_52816 ds2780_get_rsgain_setting 0 52816 NULL ++ath6kl_wmi_meta_add_52817 ath6kl_wmi_meta_add 0 52817 NULL ++show_eco_52820 show_eco 0 52820 NULL ++sctp_send_asconf_52823 sctp_send_asconf 0 52823 NULL ++roccat_common2_sysfs_write_tcu_52828 roccat_common2_sysfs_write_tcu 0-6-5 52828 NULL ++tomoyo_path_perm_52831 tomoyo_path_perm 0 52831 NULL ++amd64_top_mem_show_52832 amd64_top_mem_show 0 52832 NULL nohasharray ++qib_read_umem64_52832 qib_read_umem64 0 52832 &amd64_top_mem_show_52832 ++pwr_rcvd_beacons_read_52836 pwr_rcvd_beacons_read 3-0 52836 NULL ++il3945_show_retry_rate_52837 il3945_show_retry_rate 0 52837 NULL nohasharray ++lb_alloc_ep_req_52837 lb_alloc_ep_req 2 52837 &il3945_show_retry_rate_52837 ++apei_read_52843 apei_read 0 52843 NULL ++tpm_tis_i2c_recv_52850 tpm_tis_i2c_recv 0-3 52850 NULL ++modelname_show_52855 modelname_show 0 52855 NULL ++get_beep_mask_52859 get_beep_mask 0 52859 NULL ++hiface_pcm_stream_start_52861 hiface_pcm_stream_start 0 52861 NULL ++mon_bin_get_event_52863 mon_bin_get_event 4-6 52863 NULL ++target_stat_scsi_lu_show_attr_resets_52866 target_stat_scsi_lu_show_attr_resets 0 52866 NULL ++media_write_52867 media_write 0-3 52867 NULL nohasharray ++twl6030_gpadc_write_52867 twl6030_gpadc_write 1 52867 &media_write_52867 ++send_request_dev_dep_msg_in_52868 send_request_dev_dep_msg_in 0 52868 NULL ++cccr_show_52879 cccr_show 0 52879 NULL ++twlreg_write_52880 twlreg_write 0-3 52880 NULL ++pvr2_ctrl_value_to_sym_internal_52881 pvr2_ctrl_value_to_sym_internal 5 52881 NULL ++cache_read_procfs_52882 cache_read_procfs 3-0 52882 NULL ++default_blksize_show_52888 default_blksize_show 0 52888 NULL ++lio_target_np_store_iser_52890 lio_target_np_store_iser 0-3 52890 NULL ++kvm_kvzalloc_52894 kvm_kvzalloc 1 52894 NULL ++nommu_map_sg_52896 nommu_map_sg 0-3 52896 NULL ++wm831x_status_src_show_52897 wm831x_status_src_show 0 52897 NULL ++vxfs_immed_readpage_52899 vxfs_immed_readpage 0 52899 NULL ++multicast_last_member_count_show_52901 multicast_last_member_count_show 0 52901 NULL ++read_cam_control_52903 read_cam_control 0 52903 NULL ++parse_52905 parse 0 52905 NULL ++show_pwmchan_52907 show_pwmchan 0 52907 NULL ++arizona_request_irq_52908 arizona_request_irq 2 52908 NULL ++dio_bio_reap_52913 dio_bio_reap 0 52913 NULL ++lpfc_selective_reset_52919 lpfc_selective_reset 0 52919 NULL ++mt9t031_cropcap_52933 mt9t031_cropcap 0 52933 NULL ++iblock_get_bio_52936 iblock_get_bio 3 52936 NULL nohasharray ++serio_bind_driver_52936 serio_bind_driver 0 52936 &iblock_get_bio_52936 ++hfsplus_write_inode_52941 hfsplus_write_inode 0 52941 NULL ++snd_als4000_capture_prepare_52942 snd_als4000_capture_prepare 0 52942 NULL ++queue_show_random_52946 queue_show_random 0 52946 NULL ++log_buf_len_store_52950 log_buf_len_store 0-4 52950 NULL ++__nodes_remap_52951 __nodes_remap 5 52951 NULL ++twl4030_madc_set_irq_52952 twl4030_madc_set_irq 0 52952 NULL nohasharray ++set_reset_mode_52952 set_reset_mode 0 52952 &twl4030_madc_set_irq_52952 nohasharray ++store_disp_52952 store_disp 4-0 52952 &set_reset_mode_52952 ++dev_bus_rescan_store_52953 dev_bus_rescan_store 0-4 52953 NULL ++adv7170_write_52956 adv7170_write 0 52956 NULL ++tpacpi_driver_wwan_emulstate_store_52960 tpacpi_driver_wwan_emulstate_store 0-3 52960 NULL ++ieee80211_if_fmt_fwded_mcast_52961 ieee80211_if_fmt_fwded_mcast 3 52961 NULL ++hx8357_spi_write_then_read_52964 hx8357_spi_write_then_read 3 52964 NULL ++mic_smpt_op_52965 mic_smpt_op 0-3 52965 NULL ++pb0100_set_blue_balance_52969 pb0100_set_blue_balance 0 52969 NULL ++pm_state_store_52970 pm_state_store 0-4 52970 NULL ++lbs_set_mac_address_52977 lbs_set_mac_address 0 52977 NULL ++lx_message_send_atomic_52981 lx_message_send_atomic 0 52981 NULL ++xfs_attr_leaf_get_52983 xfs_attr_leaf_get 0 52983 NULL nohasharray ++nouveau_hwmon_set_pwm1_enable_52983 nouveau_hwmon_set_pwm1_enable 0-4 52983 &xfs_attr_leaf_get_52983 ++ssb_pci_attr_sprom_store_52984 ssb_pci_attr_sprom_store 4-0 52984 NULL nohasharray ++b44_writephy_52984 b44_writephy 0 52984 &ssb_pci_attr_sprom_store_52984 ++tx_tx_exch_read_52986 tx_tx_exch_read 3-0 52986 NULL ++num_node_state_52989 num_node_state 0 52989 NULL ++store_current_governor_52990 store_current_governor 0-4 52990 NULL ++batadv_check_management_packet_52993 batadv_check_management_packet 3 52993 NULL ++amd8111e_set_mac_address_52994 amd8111e_set_mac_address 0 52994 NULL ++hyp_sysfs_show_52996 hyp_sysfs_show 0 52996 NULL ++ican3_open_52999 ican3_open 0 52999 NULL ++efivarfs_file_write_53000 efivarfs_file_write 0-3 53000 NULL ++node_read_numastat_53003 node_read_numastat 0 53003 NULL ++show_session_param_ISCSI_PARAM_CHAP_IN_IDX_53012 show_session_param_ISCSI_PARAM_CHAP_IN_IDX 0 53012 NULL ++btrfs_free_and_pin_reserved_extent_53016 btrfs_free_and_pin_reserved_extent 2 53016 NULL ++tx_tx_exch_pending_read_53018 tx_tx_exch_pending_read 3-0 53018 NULL ++show_fan_input_53019 show_fan_input 0 53019 NULL nohasharray ++i2c_smbus_read_block_data_53019 i2c_smbus_read_block_data 0 53019 &show_fan_input_53019 ++edac_dev_ctl_info_show_53023 edac_dev_ctl_info_show 0 53023 NULL ++xfs_rtfree_extent_53024 xfs_rtfree_extent 0 53024 NULL ++rx8025_sysfs_store_clock_adjust_53025 rx8025_sysfs_store_clock_adjust 0-4 53025 NULL ++ltc4260_get_value_53028 ltc4260_get_value 0 53028 NULL ++maximum_speed_show_53029 maximum_speed_show 0 53029 NULL nohasharray ++i40e_configure_tx_ring_53029 i40e_configure_tx_ring 0 53029 &maximum_speed_show_53029 ++show_rpm_53030 show_rpm 0 53030 NULL nohasharray ++wl1251_hw_init_txq_fill_53030 wl1251_hw_init_txq_fill 0 53030 &show_rpm_53030 ++ndelay_show_53032 ndelay_show 0 53032 NULL ++bio_cur_bytes_53037 bio_cur_bytes 0 53037 NULL ++nv50_chan_create_53039 nv50_chan_create 5 53039 NULL ++show_link_type_53045 show_link_type 0 53045 NULL ++lx_pipe_wait_for_idle_53051 lx_pipe_wait_for_idle 0 53051 NULL ++nfs_key_timeout_notify_53052 nfs_key_timeout_notify 0 53052 NULL ++fimc_get_alpha_mask_53057 fimc_get_alpha_mask 0 53057 NULL ++dsa_slave_get_eeprom_len_53058 dsa_slave_get_eeprom_len 0 53058 NULL ++wacom_led_select_store_53059 wacom_led_select_store 0-4 53059 NULL ++store_rx_polinv_enb_53065 store_rx_polinv_enb 0-4 53065 NULL ++cfi_read_query_53066 cfi_read_query 0 53066 NULL nohasharray ++beiscsi_drvr_ver_disp_53066 beiscsi_drvr_ver_disp 0 53066 &cfi_read_query_53066 nohasharray ++attr_dragging_store_tpkbd_53066 attr_dragging_store_tpkbd 0-4 53066 &beiscsi_drvr_ver_disp_53066 ++iwl_dbgfs_interrupt_write_53069 iwl_dbgfs_interrupt_write 3-0 53069 NULL ++mwifiex_debug_read_53074 mwifiex_debug_read 3-0 53074 NULL ++mlx4_comm_cmd_53076 mlx4_comm_cmd 0 53076 NULL nohasharray ++cyber2000fb_check_var_53076 cyber2000fb_check_var 0 53076 &mlx4_comm_cmd_53076 nohasharray ++create_cq_kernel_53076 create_cq_kernel 4-3 53076 &cyber2000fb_check_var_53076 ++wq_pool_ids_show_53079 wq_pool_ids_show 0 53079 NULL ++pcbit_readw_53084 pcbit_readw 0 53084 NULL ++mci_ctl_name_show_53087 mci_ctl_name_show 0 53087 NULL ++qib_resize_cq_53090 qib_resize_cq 2 53090 NULL nohasharray ++store_pwm_auto_point_channel_53090 store_pwm_auto_point_channel 0-4 53090 &qib_resize_cq_53090 ++pm_trace_dev_match_show_53091 pm_trace_dev_match_show 0 53091 NULL ++deauthenticate_53093 deauthenticate 0 53093 NULL ++cbaf_wusb_chid_show_53095 cbaf_wusb_chid_show 0 53095 NULL ++ib_uverbs_write_53096 ib_uverbs_write 0-3 53096 NULL ++ceph_vxattrcb_dir_entries_53097 ceph_vxattrcb_dir_entries 0 53097 NULL nohasharray ++metrics_cpu_kcycles_used_show_53097 metrics_cpu_kcycles_used_show 0 53097 &ceph_vxattrcb_dir_entries_53097 ++queue_var_show_53098 queue_var_show 0 53098 NULL ++set_button_53099 set_button 0-4 53099 NULL ++wcn36xx_sta_add_53105 wcn36xx_sta_add 0 53105 NULL ++ocfs2_write_remove_suid_53106 ocfs2_write_remove_suid 0 53106 NULL ++zd_iowrite16a_locked_53109 zd_iowrite16a_locked 0 53109 NULL ++xhci_configure_endpoint_53110 xhci_configure_endpoint 0 53110 NULL ++store_temp_crit_hyst_53114 store_temp_crit_hyst 0-4 53114 NULL ++ath10k_mac_create_53118 ath10k_mac_create 1 53118 NULL ++ixgbe_setup_rx_resources_53119 ixgbe_setup_rx_resources 0 53119 NULL ++verity_status_53120 verity_status 5 53120 NULL nohasharray ++lp3971_i2c_write_53120 lp3971_i2c_write 0 53120 &verity_status_53120 ++ad198x_auto_build_controls_53122 ad198x_auto_build_controls 0 53122 NULL ++udf_adinicb_direct_IO_53125 udf_adinicb_direct_IO 0 53125 NULL nohasharray ++configure_device_53125 configure_device 0 53125 &udf_adinicb_direct_IO_53125 ++il3945_commit_rxon_53127 il3945_commit_rxon 0 53127 NULL ++da9052_rtc_set_alarm_53132 da9052_rtc_set_alarm 0 53132 NULL ++cpuup_callback_53134 cpuup_callback 0 53134 NULL ++ndo_vlan_rx_add_vid_53138 ndo_vlan_rx_add_vid 0 53138 NULL ++carrier_changes_show_53139 carrier_changes_show 0 53139 NULL ++ps_poll_ps_poll_max_ap_turn_read_53140 ps_poll_ps_poll_max_ap_turn_read 3-0 53140 NULL nohasharray ++inode_newsize_ok_53140 inode_newsize_ok 0 53140 &ps_poll_ps_poll_max_ap_turn_read_53140 ++brcmf_cfg80211_up_53146 brcmf_cfg80211_up 0 53146 NULL ++find_domain_name_53149 find_domain_name 0 53149 NULL ++copy_user_segment_list_53150 copy_user_segment_list 2 53150 NULL nohasharray ++store_xps_map_53150 store_xps_map 0-4 53150 ©_user_segment_list_53150 ++s5p_mfc_alloc_instance_buffer_v6_53154 s5p_mfc_alloc_instance_buffer_v6 0 53154 NULL nohasharray ++__team_option_inst_add_53154 __team_option_inst_add 0 53154 &s5p_mfc_alloc_instance_buffer_v6_53154 ++tpacpi_driver_debug_store_53158 tpacpi_driver_debug_store 0-3 53158 NULL ++pwm_enable_53163 pwm_enable 0 53163 NULL ++saa7146_pgtable_build_single_53169 saa7146_pgtable_build_single 0 53169 NULL ++ieee80211_bss_info_update_53170 ieee80211_bss_info_update 4 53170 NULL ++fuse_fsync_common_53172 fuse_fsync_common 0 53172 NULL ++n_alarm_show_53175 n_alarm_show 0 53175 NULL nohasharray ++qla4xxx_fw_load_src_show_53175 qla4xxx_fw_load_src_show 0 53175 &n_alarm_show_53175 ++btrfs_io_bio_alloc_53179 btrfs_io_bio_alloc 2 53179 NULL ++skfp_open_53190 skfp_open 0 53190 NULL ++C_SYSC_io_getevents_53191 C_SYSC_io_getevents 3 53191 NULL ++xfs_btree_updkey_53195 xfs_btree_updkey 0 53195 NULL ++hackrf_alloc_urbs_53198 hackrf_alloc_urbs 0 53198 NULL ++SyS_init_module_53202 SyS_init_module 2 53202 NULL ++toss_secs_write_53205 toss_secs_write 3-0 53205 NULL ++nfs_migrate_page_53206 nfs_migrate_page 0 53206 NULL nohasharray ++mtdoops_erase_block_53206 mtdoops_erase_block 2 53206 &nfs_migrate_page_53206 ++dln2_transfer_53211 dln2_transfer 0 53211 NULL ++saa7134_pgtable_build_53214 saa7134_pgtable_build 0 53214 NULL ++smsc75xx_wait_ready_53217 smsc75xx_wait_ready 0 53217 NULL ++tx_tx_start_data_read_53219 tx_tx_start_data_read 3-0 53219 NULL ++memory_set_cur_bandwidth_53231 memory_set_cur_bandwidth 0 53231 NULL ++nfs_wb_all_53233 nfs_wb_all 0 53233 NULL ++uvesafb_show_vbe_ver_53235 uvesafb_show_vbe_ver 0 53235 NULL nohasharray ++sd_pre_start_53235 sd_pre_start 0 53235 &uvesafb_show_vbe_ver_53235 ++mlx4_master_process_vhcr_53239 mlx4_master_process_vhcr 0 53239 NULL ++enable_supply_53242 enable_supply 0 53242 NULL ++ptlrpc_lprocfs_req_history_max_seq_write_53243 ptlrpc_lprocfs_req_history_max_seq_write 3 53243 NULL ++wl12xx_init_rx_config_53244 wl12xx_init_rx_config 0 53244 NULL nohasharray ++net1080_reset_53244 net1080_reset 0 53244 &wl12xx_init_rx_config_53244 ++tun_do_read_53245 tun_do_read 0 53245 NULL ++vcc_sendmsg_53246 vcc_sendmsg 0-4 53246 NULL ++logfs_writepage_53247 logfs_writepage 0 53247 NULL ++rtl8152_set_mac_address_53251 rtl8152_set_mac_address 0 53251 NULL ++smack_sb_statfs_53255 smack_sb_statfs 0 53255 NULL ++xfs_trans_read_buf_map_53258 xfs_trans_read_buf_map 5-0 53258 NULL nohasharray ++target_core_dev_wwn_store_attr_vpd_protocol_identifier_53258 target_core_dev_wwn_store_attr_vpd_protocol_identifier 0-3 53258 &xfs_trans_read_buf_map_53258 ++ip6_tnl_dev_init_gen_53263 ip6_tnl_dev_init_gen 0 53263 NULL nohasharray ++ipr_change_queue_depth_53263 ipr_change_queue_depth 0-2 53263 &ip6_tnl_dev_init_gen_53263 ++picolcd_operation_mode_store_53264 picolcd_operation_mode_store 0-4 53264 NULL ++sctp_make_fwdtsn_53265 sctp_make_fwdtsn 3 53265 NULL ++wil_write_file_ssid_53266 wil_write_file_ssid 3-0 53266 NULL ++cma_bitmap_pages_to_bits_53268 cma_bitmap_pages_to_bits 0-2 53268 NULL ++btrfs_file_extent_num_bytes_53269 btrfs_file_extent_num_bytes 0 53269 NULL ++cma_netdev_callback_53271 cma_netdev_callback 0 53271 NULL ++kstrtoull_53273 kstrtoull 0 53273 NULL ++genlmsg_multicast_53275 genlmsg_multicast 0 53275 NULL ++sha1_ssse3_final_53278 sha1_ssse3_final 0 53278 NULL ++target_fabric_np_base_attr_show_53281 target_fabric_np_base_attr_show 0 53281 NULL ++rtl28xxu_ctrl_msg_53289 rtl28xxu_ctrl_msg 0 53289 NULL ++null_update_53290 null_update 0 53290 NULL ++ieee80211_send_probe_req_53292 ieee80211_send_probe_req 5-7 53292 NULL ++ad9523_reg_access_53294 ad9523_reg_access 0 53294 NULL ++rsi_mac80211_add_interface_53299 rsi_mac80211_add_interface 0 53299 NULL ++wishbone_serial_open_53305 wishbone_serial_open 0 53305 NULL nohasharray ++isku_sysfs_write_key_mask_53305 isku_sysfs_write_key_mask 6-0-5 53305 &wishbone_serial_open_53305 ++dib7090p_rw_on_apb_53315 dib7090p_rw_on_apb 0-3 53315 NULL ++batadv_interface_rx_53325 batadv_interface_rx 4 53325 NULL ++ftrace_profile_write_53327 ftrace_profile_write 3 53327 NULL ++find_nr_power_limit_53330 find_nr_power_limit 0 53330 NULL ++gsm_control_reply_53333 gsm_control_reply 4 53333 NULL ++acpi_ut_copy_esimple_to_isimple_53338 acpi_ut_copy_esimple_to_isimple 0 53338 NULL ++tsk_set_importance_53339 tsk_set_importance 0 53339 NULL ++acpi_ds_eval_bank_field_operands_53341 acpi_ds_eval_bank_field_operands 0 53341 NULL nohasharray ++hp_sw_activate_53341 hp_sw_activate 0 53341 &acpi_ds_eval_bank_field_operands_53341 ++shmem_file_read_iter_53342 shmem_file_read_iter 0 53342 NULL ++xfs_vm_write_begin_53344 xfs_vm_write_begin 0 53344 NULL ++bq2415x_i2c_read_mask_53345 bq2415x_i2c_read_mask 0-4-3 53345 NULL nohasharray ++adfs_readpage_53345 adfs_readpage 0 53345 &bq2415x_i2c_read_mask_53345 ++netdev_master_upper_dev_link_private_53347 netdev_master_upper_dev_link_private 0 53347 NULL ++rio_write_config_53349 rio_write_config 0-5-6 53349 NULL ++zl10036_set_gain_params_53350 zl10036_set_gain_params 0 53350 NULL ++oxygen_prepare_53351 oxygen_prepare 0 53351 NULL nohasharray ++af9035_ctrl_msg_53351 af9035_ctrl_msg 0 53351 &oxygen_prepare_53351 ++bnx2i_send_nl_mesg_53353 bnx2i_send_nl_mesg 4 53353 NULL ++atkbd_do_show_err_count_53356 atkbd_do_show_err_count 0 53356 NULL ++alloc_xen_mmio_53359 alloc_xen_mmio 0 53359 NULL ++key_timeout_53364 key_timeout 0 53364 NULL ++smsc95xx_start_rx_path_53365 smsc95xx_start_rx_path 0 53365 NULL ++dwc3_gadget_ep0_enable_53366 dwc3_gadget_ep0_enable 0 53366 NULL ++efx_mcdi_poll_53367 efx_mcdi_poll 0 53367 NULL ++sock_setbindtodevice_53369 sock_setbindtodevice 3-0 53369 NULL nohasharray ++ubifs_write_end_53369 ubifs_write_end 0-5 53369 &sock_setbindtodevice_53369 nohasharray ++link_start_53369 link_start 0 53369 &ubifs_write_end_53369 ++get_random_bytes_arch_53370 get_random_bytes_arch 2 53370 NULL ++netlbl_unlhsh_add_addr4_53373 netlbl_unlhsh_add_addr4 0 53373 NULL ++pci_user_write_config_word_53375 pci_user_write_config_word 0 53375 NULL ++test_fw_misc_read_53384 test_fw_misc_read 3 53384 NULL ++show_vrdhot_53385 show_vrdhot 0 53385 NULL ++fuse_permission_53387 fuse_permission 0 53387 NULL ++ov2640_g_fmt_53388 ov2640_g_fmt 0 53388 NULL ++generic_file_write_iter_53392 generic_file_write_iter 0 53392 NULL ++s5k83a_set_gain_53395 s5k83a_set_gain 0 53395 NULL nohasharray ++s5p_mfc_alloc_dec_temp_buffers_v5_53395 s5p_mfc_alloc_dec_temp_buffers_v5 0 53395 &s5k83a_set_gain_53395 nohasharray ++xfs_attr_remove_53395 xfs_attr_remove 0 53395 &s5p_mfc_alloc_dec_temp_buffers_v5_53395 ++iwlagn_mac_sta_add_53401 iwlagn_mac_sta_add 0 53401 NULL ++hotkey_write_53403 hotkey_write 0 53403 NULL ++i915_pipe_crc_read_53405 i915_pipe_crc_read 0-3 53405 NULL ++start_53407 start 0 53407 NULL ++snd_vt1724_playback_pro_prepare_53409 snd_vt1724_playback_pro_prepare 0 53409 NULL ++iwl_pcie_txq_alloc_53413 iwl_pcie_txq_alloc 3 53413 NULL nohasharray ++nilfs_btree_assign_gc_53413 nilfs_btree_assign_gc 0 53413 &iwl_pcie_txq_alloc_53413 ++tm_attr_show_53415 tm_attr_show 0 53415 NULL ++isolate_lru_page_53417 isolate_lru_page 0 53417 NULL nohasharray ++hci_check_pending_name_53417 hci_check_pending_name 5 53417 &isolate_lru_page_53417 ++asus_hwmon_pwm1_53419 asus_hwmon_pwm1 0 53419 NULL ++uwb_radio_change_channel_53420 uwb_radio_change_channel 0 53420 NULL ++qt2_control_msg_53422 qt2_control_msg 0 53422 NULL ++b43_wireless_core_start_53426 b43_wireless_core_start 0 53426 NULL ++set_eeprom5_53432 set_eeprom5 4-0 53432 NULL nohasharray ++qlcnic_83xx_set_nic_info_53432 qlcnic_83xx_set_nic_info 0 53432 &set_eeprom5_53432 ++acpi_ex_field_datum_io_53436 acpi_ex_field_datum_io 0 53436 NULL ++rocker_group_tbl_add_53437 rocker_group_tbl_add 0 53437 NULL ++isr_cmd_cmplt_read_53439 isr_cmd_cmplt_read 3-0 53439 NULL nohasharray ++lm3533_set_hvled_config_53439 lm3533_set_hvled_config 0 53439 &isr_cmd_cmplt_read_53439 ++ipw_prom_open_53442 ipw_prom_open 0 53442 NULL ++snd_dma_alloc_pages_53447 snd_dma_alloc_pages 3 53447 NULL nohasharray ++mwifiex_info_read_53447 mwifiex_info_read 3-0 53447 &snd_dma_alloc_pages_53447 nohasharray ++acpi_os_create_semaphore_53447 acpi_os_create_semaphore 0 53447 &mwifiex_info_read_53447 ++show_ipFragCreates_53448 show_ipFragCreates 0 53448 NULL nohasharray ++reiserfs_unfreeze_53448 reiserfs_unfreeze 0 53448 &show_ipFragCreates_53448 ++syslog_print_all_53450 syslog_print_all 0 53450 NULL ++apei_exec_run_optional_53452 apei_exec_run_optional 0 53452 NULL ++ns83820_open_53454 ns83820_open 0 53454 NULL ++acpi_tb_parse_root_table_53455 acpi_tb_parse_root_table 1 53455 NULL nohasharray ++show_counter_tx_max_min_len_errs_53455 show_counter_tx_max_min_len_errs 0 53455 &acpi_tb_parse_root_table_53455 ++dyn_adc_capture_pcm_prepare_53457 dyn_adc_capture_pcm_prepare 0 53457 NULL nohasharray ++__btrfs_lookup_bio_sums_53457 __btrfs_lookup_bio_sums 0 53457 &dyn_adc_capture_pcm_prepare_53457 ++n2_run_53459 n2_run 3 53459 NULL ++pn_skb_send_53464 pn_skb_send 0 53464 NULL ++store_fan_max_output_53466 store_fan_max_output 0-4 53466 NULL ++wm831x_write_53469 wm831x_write 0 53469 NULL ++hidp_send_frame_53473 hidp_send_frame 3 53473 NULL ++neigh_sysctl_register_53474 neigh_sysctl_register 0 53474 NULL ++ima_write_template_field_data_53475 ima_write_template_field_data 2 53475 NULL nohasharray ++create_trace_kprobe_53475 create_trace_kprobe 1 53475 &ima_write_template_field_data_53475 ++rds_tcp_data_recv_53476 rds_tcp_data_recv 3-4 53476 NULL ++iowarrior_read_53483 iowarrior_read 3-0 53483 NULL ++osd_req_write_kern_53486 osd_req_write_kern 5-0 53486 NULL ++snd_pcm_pre_pause_53490 snd_pcm_pre_pause 0 53490 NULL nohasharray ++show_num_units_53490 show_num_units 0 53490 &snd_pcm_pre_pause_53490 ++create_extra_out_53491 create_extra_out 0 53491 NULL ++ext_prop_data_show_53493 ext_prop_data_show 0 53493 NULL ++memory_notify_53496 memory_notify 0 53496 NULL nohasharray ++hardware_test_53496 hardware_test 0 53496 &memory_notify_53496 ++do_verify_xattr_datum_53499 do_verify_xattr_datum 0 53499 NULL nohasharray ++adp8870_bl_l4_indoor_max_show_53499 adp8870_bl_l4_indoor_max_show 0 53499 &do_verify_xattr_datum_53499 ++sysfs_show_current_tick_dev_53501 sysfs_show_current_tick_dev 0 53501 NULL ++wm8350_isink_disable_53504 wm8350_isink_disable 0 53504 NULL ++snd_pcm_format_physical_width_53505 snd_pcm_format_physical_width 0 53505 NULL nohasharray ++bonding_show_ad_select_53505 bonding_show_ad_select 0 53505 &snd_pcm_format_physical_width_53505 ++dbAllocNext_53506 dbAllocNext 0 53506 NULL ++pcan_usb_pro_set_bus_53508 pcan_usb_pro_set_bus 0 53508 NULL ++nfs4_schedule_stateid_recovery_53510 nfs4_schedule_stateid_recovery 0 53510 NULL ++start_vga_cam_53511 start_vga_cam 0 53511 NULL ++check_acl_53512 check_acl 0 53512 NULL nohasharray ++force_sc_support_write_53512 force_sc_support_write 3-0 53512 &check_acl_53512 ++ea_remove_stuffed_53517 ea_remove_stuffed 0 53517 NULL ++m41t80_sysfs_show_flags_53525 m41t80_sysfs_show_flags 0 53525 NULL ++snd_seq_ioctl_get_named_queue_53529 snd_seq_ioctl_get_named_queue 0 53529 NULL ++qla2x00_serial_num_show_53535 qla2x00_serial_num_show 0 53535 NULL ++xfs_vn_listxattr_53536 xfs_vn_listxattr 0-3 53536 NULL ++st_sensors_spi_read_53537 st_sensors_spi_read 0-4 53537 NULL ++ubifs_jnl_write_inode_53538 ubifs_jnl_write_inode 0 53538 NULL ++slab_cpuup_callback_53542 slab_cpuup_callback 0 53542 NULL ++wl1273_fm_set_mode_53551 wl1273_fm_set_mode 0 53551 NULL ++packet_getname_spkt_53555 packet_getname_spkt 0 53555 NULL ++ec_poll_53557 ec_poll 0 53557 NULL ++store_cursor_blink_53559 store_cursor_blink 0-4 53559 NULL ++bop_check_insert_53561 bop_check_insert 0 53561 NULL ++wlcore_raw_read_53565 wlcore_raw_read 0 53565 NULL ++attr_release_to_select_show_tpkbd_53568 attr_release_to_select_show_tpkbd 0 53568 NULL ++sigma_fw_load_control_53569 sigma_fw_load_control 3 53569 NULL ++smsc75xx_write_reg_53571 smsc75xx_write_reg 0 53571 NULL ++regmap_spmi_ext_gather_write_53572 regmap_spmi_ext_gather_write 0 53572 NULL nohasharray ++ieee802154_hdr_minlen_53572 ieee802154_hdr_minlen 0 53572 ®map_spmi_ext_gather_write_53572 ++ubb_show_53578 ubb_show 0 53578 NULL nohasharray ++qlcnic_82xx_issue_cmd_53578 qlcnic_82xx_issue_cmd 0 53578 &ubb_show_53578 ++set_auto_pwm_min_53581 set_auto_pwm_min 0-4 53581 NULL ++SYSC_bind_53582 SYSC_bind 3 53582 NULL ++cifs_utf16_bytes_53593 cifs_utf16_bytes 0 53593 NULL nohasharray ++sctp_do_sm_53593 sctp_do_sm 0 53593 &cifs_utf16_bytes_53593 ++proc_uid_map_write_53596 proc_uid_map_write 3-0 53596 NULL ++load_cpu_fw_53598 load_cpu_fw 0 53598 NULL ++bpq_open_53602 bpq_open 0 53602 NULL ++__wait_on_bit_53603 __wait_on_bit 0 53603 NULL nohasharray ++isl1208_i2c_read_regs_53603 isl1208_i2c_read_regs 0 53603 &__wait_on_bit_53603 ++pfkey_recvmsg_53604 pfkey_recvmsg 0-4 53604 NULL nohasharray ++strict_strtoul_scaled_53604 strict_strtoul_scaled 0 53604 &pfkey_recvmsg_53604 ++check_reshape_53605 check_reshape 0 53605 NULL ++nes_show_idx_data_53612 nes_show_idx_data 0 53612 NULL ++o2hb_heartbeat_group_mode_store_53621 o2hb_heartbeat_group_mode_store 0-3 53621 NULL nohasharray ++nes_store_flash_data_53621 nes_store_flash_data 0-3 53621 &o2hb_heartbeat_group_mode_store_53621 ++atl1e_init_hw_53624 atl1e_init_hw 0 53624 NULL ++ds1553_rtc_set_alarm_53625 ds1553_rtc_set_alarm 0 53625 NULL ++___alloc_bootmem_nopanic_53626 ___alloc_bootmem_nopanic 1 53626 NULL nohasharray ++wil_write_file_txmgmt_53626 wil_write_file_txmgmt 3-0 53626 &___alloc_bootmem_nopanic_53626 ++mxl5007t_tuner_init_53627 mxl5007t_tuner_init 0 53627 NULL ++it87_get_rx_bytes_53630 it87_get_rx_bytes 0 53630 NULL ++ccid_getsockopt_builtin_ccids_53634 ccid_getsockopt_builtin_ccids 2 53634 NULL ++powr1220_show_voltage_53637 powr1220_show_voltage 0 53637 NULL nohasharray ++iwl_set_mode_53637 iwl_set_mode 0 53637 &powr1220_show_voltage_53637 ++nr_sendmsg_53656 nr_sendmsg 4-0 53656 NULL ++allocate_page_53658 allocate_page 0 53658 NULL nohasharray ++__bitmap_parse_53658 __bitmap_parse 0 53658 &allocate_page_53658 ++__nfs4_proc_set_acl_53665 __nfs4_proc_set_acl 0 53665 NULL ++show_trigger_53668 show_trigger 0 53668 NULL ++store_target_53673 store_target 0-4 53673 NULL ++lan911x_config_init_53675 lan911x_config_init 0 53675 NULL ++tcm_qla2xxx_tpg_attrib_show_demo_mode_login_only_53680 tcm_qla2xxx_tpg_attrib_show_demo_mode_login_only 0 53680 NULL ++create_in_jack_mode_53681 create_in_jack_mode 0 53681 NULL ++fuse_fill_write_pages_53682 fuse_fill_write_pages 0-4 53682 NULL ++check_reshape_53683 check_reshape 0 53683 NULL ++iscsi_stat_login_attr_store_53686 iscsi_stat_login_attr_store 0 53686 NULL ++v4l2_event_subscribe_53687 v4l2_event_subscribe 3 53687 NULL ++__show_signal_53688 __show_signal 0 53688 NULL ++bdev_logical_block_size_53690 bdev_logical_block_size 0 53690 NULL nohasharray ++igb_alloc_q_vector_53690 igb_alloc_q_vector 6-4 53690 &bdev_logical_block_size_53690 ++udp_disconnect_53691 udp_disconnect 0 53691 NULL ++m5602_start_transfer_53692 m5602_start_transfer 0 53692 NULL nohasharray ++bcm7xxx_28nm_config_init_53692 bcm7xxx_28nm_config_init 0 53692 &m5602_start_transfer_53692 ++adxl34x_autosleep_show_53693 adxl34x_autosleep_show 0 53693 NULL ++show_otp1_53696 show_otp1 0 53696 NULL ++iwl_mvm_mac_ctxt_cmd_go_53697 iwl_mvm_mac_ctxt_cmd_go 0 53697 NULL ++generate_signingkey_53698 generate_signingkey 0 53698 NULL ++read_53700 read 0 53700 NULL ++napi_alloc_skb_53701 napi_alloc_skb 2 53701 NULL ++si2157_set_params_53702 si2157_set_params 0 53702 NULL ++find_overflow_devnum_53711 find_overflow_devnum 0 53711 NULL ++nlmon_open_53719 nlmon_open 0 53719 NULL nohasharray ++status_control_write_53719 status_control_write 0-6-5 53719 &nlmon_open_53719 ++__ocfs2_resv_find_window_53721 __ocfs2_resv_find_window 3 53721 NULL ++__proc_debug_mb_53732 __proc_debug_mb 5 53732 NULL ++wdm_write_53735 wdm_write 3-0 53735 NULL ++ext3_try_to_allocate_with_rsv_53737 ext3_try_to_allocate_with_rsv 3-0-5 53737 NULL ++acpi_ev_address_space_dispatch_53738 acpi_ev_address_space_dispatch 0 53738 NULL nohasharray ++apei_write_53738 apei_write 0 53738 &acpi_ev_address_space_dispatch_53738 ++ixgbe_notify_dca_53739 ixgbe_notify_dca 0 53739 NULL nohasharray ++wil_vring_alloc_53739 wil_vring_alloc 0 53739 &ixgbe_notify_dca_53739 ++twl4030reg_disable_53741 twl4030reg_disable 0 53741 NULL nohasharray ++ufs_setattr_53741 ufs_setattr 0 53741 &twl4030reg_disable_53741 ++ipath_read_umem32_53742 ipath_read_umem32 0 53742 NULL ++da9052_disable_irq_53745 da9052_disable_irq 2 53745 NULL ++start_fw_53746 start_fw 0 53746 NULL ++ivtv_firmware_copy_53748 ivtv_firmware_copy 0 53748 NULL ++tda18271_ir_cal_init_53751 tda18271_ir_cal_init 0 53751 NULL ++sky2_get_regs_len_53754 sky2_get_regs_len 0 53754 NULL nohasharray ++pci_read_config_byte_53754 pci_read_config_byte 0 53754 &sky2_get_regs_len_53754 ++lpfc_idiag_queacc_read_qe_53755 lpfc_idiag_queacc_read_qe 0-2 53755 NULL ++hdpvr_i2c_read_53756 hdpvr_i2c_read 0 53756 NULL ++wa_populate_buf_in_urb_53758 wa_populate_buf_in_urb 3-4 53758 NULL nohasharray ++bql_set_limit_min_53758 bql_set_limit_min 0-4 53758 &wa_populate_buf_in_urb_53758 ++twl_rtc_alarm_irq_enable_53759 twl_rtc_alarm_irq_enable 0 53759 NULL ++class_attr_show_53762 class_attr_show 0 53762 NULL ++serport_ldisc_read_53764 serport_ldisc_read 0 53764 NULL ++nes_show_ee_cmd_53765 nes_show_ee_cmd 0 53765 NULL nohasharray ++smo8800_misc_read_53765 smo8800_misc_read 0-3 53765 &nes_show_ee_cmd_53765 ++store_53768 store 0-3 53768 NULL ++ext4_walk_page_buffers_53771 ext4_walk_page_buffers 0 53771 NULL ++ext2_acl_count_53773 ext2_acl_count 0-1 53773 NULL ++radeon_show_edid1_53782 radeon_show_edid1 6-0-5 53782 NULL ++falcon_b0_mem_map_size_53783 falcon_b0_mem_map_size 0 53783 NULL ++__kfifo_dma_in_prepare_r_53792 __kfifo_dma_in_prepare_r 4-5 53792 NULL nohasharray ++ubb_store_53792 ubb_store 0-3 53792 &__kfifo_dma_in_prepare_r_53792 ++call_usermodehelper_exec_53793 call_usermodehelper_exec 0 53793 NULL ++block_write_end_53795 block_write_end 0-5 53795 NULL ++show_fcstat_tx_words_53797 show_fcstat_tx_words 0 53797 NULL ++qp_alloc_host_work_53798 qp_alloc_host_work 3-5 53798 NULL nohasharray ++update_sf_53798 update_sf 0 53798 &qp_alloc_host_work_53798 ++__tty_alloc_driver_53799 __tty_alloc_driver 1 53799 NULL nohasharray ++w1_master_attribute_show_attempts_53799 w1_master_attribute_show_attempts 0 53799 &__tty_alloc_driver_53799 nohasharray ++gadget_strings_manufacturer_show_53799 gadget_strings_manufacturer_show 0 53799 &w1_master_attribute_show_attempts_53799 nohasharray ++lio_target_np_show_iser_53799 lio_target_np_show_iser 0 53799 &gadget_strings_manufacturer_show_53799 ++regmap_raw_write_53803 regmap_raw_write 2-4-0 53803 NULL ++b43_upload_microcode_53805 b43_upload_microcode 0 53805 NULL ++lpfc_idiag_ctlacc_read_reg_53809 lpfc_idiag_ctlacc_read_reg 0-3 53809 NULL ++nls_nullsize_53815 nls_nullsize 0 53815 NULL ++radio_tea5777_set_freq_53817 radio_tea5777_set_freq 0 53817 NULL ++setup_data_read_53822 setup_data_read 3-0 53822 NULL ++tcp_recv_urg_53826 tcp_recv_urg 0-3 53826 NULL ++part_stat_show_53838 part_stat_show 0 53838 NULL ++wacom_status1_luminance_store_53844 wacom_status1_luminance_store 4-0 53844 NULL ++ath10k_wmi_vdev_set_param_53849 ath10k_wmi_vdev_set_param 0 53849 NULL ++store_imon_clock_53854 store_imon_clock 0-4 53854 NULL ++smi_data_buf_phys_addr_show_53858 smi_data_buf_phys_addr_show 0 53858 NULL ++__mpage_writepage_53860 __mpage_writepage 0 53860 NULL ++show_led_53867 show_led 0 53867 NULL ++mlx4_bitmap_alloc_range_53870 mlx4_bitmap_alloc_range 0-3 53870 NULL ++btrfs_free_reserved_extent_53873 btrfs_free_reserved_extent 2 53873 NULL nohasharray ++show_lssw_53873 show_lssw 0 53873 &btrfs_free_reserved_extent_53873 nohasharray ++pms_read_53873 pms_read 3 53873 &show_lssw_53873 ++wcn36xx_smd_rsp_status_check_53874 wcn36xx_smd_rsp_status_check 0 53874 NULL nohasharray ++HYPERVISOR_dom0_op_53874 HYPERVISOR_dom0_op 0 53874 &wcn36xx_smd_rsp_status_check_53874 ++nf_hook_thresh_53875 nf_hook_thresh 0 53875 NULL ++mwifiex_cmd_tdls_oper_53876 mwifiex_cmd_tdls_oper 0 53876 NULL ++ieee80211_if_fmt_dropped_frames_congestion_53883 ieee80211_if_fmt_dropped_frames_congestion 3 53883 NULL nohasharray ++c2port_store_flash_access_53883 c2port_store_flash_access 0-4 53883 &ieee80211_if_fmt_dropped_frames_congestion_53883 ++packet_dev_mc_53885 packet_dev_mc 0 53885 NULL ++mwifiex_fw_dump_read_53887 mwifiex_fw_dump_read 0-3 53887 NULL ++__uncore_filter_c6_show_53891 __uncore_filter_c6_show 0 53891 NULL nohasharray ++wl1271_boot_upload_firmware_chunk_53891 wl1271_boot_upload_firmware_chunk 0 53891 &__uncore_filter_c6_show_53891 ++sync_max_show_53894 sync_max_show 0 53894 NULL ++m920x_i2c_xfer_53897 m920x_i2c_xfer 0-3 53897 NULL nohasharray ++mei_me_write_message_53897 mei_me_write_message 0 53897 &m920x_i2c_xfer_53897 ++s5k4aa_s_ctrl_53899 s5k4aa_s_ctrl 0 53899 NULL ++SyS_setgroups_53900 SyS_setgroups 1 53900 NULL ++posix_acl_chmod_53904 posix_acl_chmod 0 53904 NULL ++l2cap_sock_bind_53908 l2cap_sock_bind 0 53908 NULL ++batadv_tt_tvlv_ogm_handler_v1_53909 batadv_tt_tvlv_ogm_handler_v1 5 53909 NULL ++rocker_port_fwding_53916 rocker_port_fwding 0 53916 NULL ++rtl8152_open_53918 rtl8152_open 0 53918 NULL ++stv06xx_write_sensor_bytes_53919 stv06xx_write_sensor_bytes 0 53919 NULL ++do_switch_53920 do_switch 0 53920 NULL ++__dquot_transfer_53922 __dquot_transfer 0 53922 NULL ++input_polldev_set_poll_53926 input_polldev_set_poll 0-4 53926 NULL ++usb_serial_generic_write_53927 usb_serial_generic_write 4 53927 NULL ++romfs_readpage_53928 romfs_readpage 0 53928 NULL ++do_unbind_con_driver_53937 do_unbind_con_driver 0 53937 NULL ++ocfs2_make_clusters_writable_53938 ocfs2_make_clusters_writable 0 53938 NULL ++store_53940 store 0-4 53940 NULL ++show_sas_phy_loss_of_dword_sync_count_53942 show_sas_phy_loss_of_dword_sync_count 0 53942 NULL ++adcxx_set_max_53943 adcxx_set_max 0-4 53943 NULL ++f7188x_gpio_direction_out_53946 f7188x_gpio_direction_out 0 53946 NULL ++get_status_53950 get_status 0 53950 NULL ++mthca_setup_cmd_doorbells_53954 mthca_setup_cmd_doorbells 2 53954 NULL ++address_show_53957 address_show 0 53957 NULL ++vmw_fb_set_par_53959 vmw_fb_set_par 0 53959 NULL ++osdname_show_53962 osdname_show 0 53962 NULL ++batadv_tt_global_init_53964 batadv_tt_global_init 0 53964 NULL ++mlx4_num_eq_uar_53965 mlx4_num_eq_uar 0 53965 NULL ++iwl_pcie_load_given_ucode_8000b_53970 iwl_pcie_load_given_ucode_8000b 0 53970 NULL ++ds1682_show_53974 ds1682_show 0 53974 NULL nohasharray ++fw_shutdown_notify_53974 fw_shutdown_notify 0 53974 &ds1682_show_53974 ++idetape_chrdev_write_53976 idetape_chrdev_write 3-0 53976 NULL ++nfs_cache_register_sb_53977 nfs_cache_register_sb 0 53977 NULL ++reshape_53978 reshape 0 53978 NULL ++macvtap_get_minor_53980 macvtap_get_minor 0 53980 NULL ++qlcnic_sriov_get_pf_info_53985 qlcnic_sriov_get_pf_info 0 53985 NULL ++__iscsi_tpg_auth_store_userid_53989 __iscsi_tpg_auth_store_userid 0-3 53989 NULL ++sl811h_urb_enqueue_53990 sl811h_urb_enqueue 0 53990 NULL ++recv_53991 recv 0 53991 NULL ++smm665_show_lcrit_53997 smm665_show_lcrit 0 53997 NULL ++ieee80211_if_fmt_dot11MeshHWMPperrMinInterval_53998 ieee80211_if_fmt_dot11MeshHWMPperrMinInterval 3 53998 NULL ++ngene_i2c_master_xfer_53999 ngene_i2c_master_xfer 0-3 53999 NULL ++write_54000 write 0-6-5 54000 NULL ++pcistub_slot_add_54001 pcistub_slot_add 0-3 54001 NULL ++hdpvr_i2c_write_54005 hdpvr_i2c_write 0 54005 NULL ++wil_fw_load_54008 wil_fw_load 0 54008 NULL ++sta_info_insert_54009 sta_info_insert 0 54009 NULL ++hfsplus_attr_build_key_54013 hfsplus_attr_build_key 0 54013 NULL nohasharray ++state_store_54013 state_store 0-4 54013 &hfsplus_attr_build_key_54013 ++__uncore_filter_match_show_54015 __uncore_filter_match_show 0 54015 NULL ++generic_hdmi_build_controls_54016 generic_hdmi_build_controls 0 54016 NULL ++snd_pcm_lib_write_transfer_54018 snd_pcm_lib_write_transfer 5 54018 NULL ++vmci_transport_notify_pkt_recv_pre_block_54019 vmci_transport_notify_pkt_recv_pre_block 0 54019 NULL nohasharray ++mdc_kuc_write_54019 mdc_kuc_write 3 54019 &vmci_transport_notify_pkt_recv_pre_block_54019 ++ov6650_reg_read_54020 ov6650_reg_read 0 54020 NULL ++do_con_write_54021 do_con_write 0-3 54021 NULL ++cmpk_message_handle_tx_54024 cmpk_message_handle_tx 4 54024 NULL ++ath5k_hw_txpower_54026 ath5k_hw_txpower 0 54026 NULL ++status_show_54028 status_show 0 54028 NULL ++zd1201_setconfig16_54030 zd1201_setconfig16 0 54030 NULL ++ipxrtr_route_packet_54036 ipxrtr_route_packet 4-0 54036 NULL ++snd_ca0106_pcm_trigger_playback_54037 snd_ca0106_pcm_trigger_playback 0 54037 NULL ++nes_show_idx_addr_54043 nes_show_idx_addr 0 54043 NULL ++kbic_read_regr_54045 kbic_read_regr 0 54045 NULL ++batadv_tt_update_orig_54049 batadv_tt_update_orig 6-4 54049 NULL ++vx_set_stream_format_54050 vx_set_stream_format 0 54050 NULL ++udf_update_inode_54051 udf_update_inode 0 54051 NULL nohasharray ++b43legacy_phy_init_tssi2dbm_table_54051 b43legacy_phy_init_tssi2dbm_table 0 54051 &udf_update_inode_54051 ++pipeline_dec_packet_out_read_54052 pipeline_dec_packet_out_read 3-0 54052 NULL ++broadcast_show_54055 broadcast_show 0 54055 NULL nohasharray ++ways_of_associativity_show_54055 ways_of_associativity_show 0 54055 &broadcast_show_54055 ++rproc_state_read_54057 rproc_state_read 3-0 54057 NULL nohasharray ++bond_open_54057 bond_open 0 54057 &rproc_state_read_54057 nohasharray ++rx_complete_54057 rx_complete 3 54057 &bond_open_54057 ++set_ac97_input_54069 set_ac97_input 0 54069 NULL nohasharray ++buffer_write_io_error_54069 buffer_write_io_error 0 54069 &set_ac97_input_54069 ++ath10k_htt_rx_alloc_54070 ath10k_htt_rx_alloc 0 54070 NULL ++vivid_start_generating_vid_cap_54071 vivid_start_generating_vid_cap 0 54071 NULL ++acpi_ps_parse_loop_54072 acpi_ps_parse_loop 0 54072 NULL nohasharray ++ltc2945_show_bool_54072 ltc2945_show_bool 0 54072 &acpi_ps_parse_loop_54072 ++show_in_beep_54074 show_in_beep 0 54074 NULL ++ext3_xattr_security_get_54081 ext3_xattr_security_get 0 54081 NULL ++bitmap_bitremap_54096 bitmap_bitremap 4 54096 NULL ++remove_id_store_54097 remove_id_store 0-3 54097 NULL ++snd_cs5535audio_trigger_54101 snd_cs5535audio_trigger 0 54101 NULL ++altera_set_ir_pre_54103 altera_set_ir_pre 2 54103 NULL nohasharray ++show_command_event_reg_54103 show_command_event_reg 0 54103 &altera_set_ir_pre_54103 nohasharray ++lustre_posix_acl_xattr_filter_54103 lustre_posix_acl_xattr_filter 2 54103 &show_command_event_reg_54103 ++create_xattr_54106 create_xattr 5 54106 NULL ++bd2802_store_adv_conf_54107 bd2802_store_adv_conf 0-4 54107 NULL ++snd_soc_component_update_bits_legacy_54111 snd_soc_component_update_bits_legacy 0 54111 NULL ++rmd128_init_54119 rmd128_init 0 54119 NULL nohasharray ++wl1251_op_add_interface_54119 wl1251_op_add_interface 0 54119 &rmd128_init_54119 ++strn_len_54122 strn_len 0 54122 NULL ++ct_pcm_capture_prepare_54125 ct_pcm_capture_prepare 0 54125 NULL ++blk_mq_queue_reinit_notify_54126 blk_mq_queue_reinit_notify 0 54126 NULL ++v9fs_xattr_get_54127 v9fs_xattr_get 0 54127 NULL ++store_sys_acpi_54129 store_sys_acpi 0-4 54129 NULL nohasharray ++store_linear_54129 store_linear 0-4 54129 &store_sys_acpi_54129 ++ivtv_s_ctrl_54132 ivtv_s_ctrl 0 54132 NULL ++snd_usb_pcm_prepare_54134 snd_usb_pcm_prepare 0 54134 NULL nohasharray ++product_show_54134 product_show 0 54134 &snd_usb_pcm_prepare_54134 nohasharray ++proc_reg_write_54134 proc_reg_write 0-3 54134 &product_show_54134 ++isr_host_acknowledges_read_54136 isr_host_acknowledges_read 3-0 54136 NULL nohasharray ++isdn_net_open_54136 isdn_net_open 0 54136 &isr_host_acknowledges_read_54136 ++rs5c372_sysfs_show_osc_54137 rs5c372_sysfs_show_osc 0 54137 NULL ++irq_blk_threshold_write_54138 irq_blk_threshold_write 3-0 54138 NULL ++wait_on_bit_54143 wait_on_bit 0 54143 NULL ++simple_write_end_54149 simple_write_end 0-5 54149 NULL nohasharray ++kvm_pv_reboot_notify_54149 kvm_pv_reboot_notify 0 54149 &simple_write_end_54149 ++set_min_width_54150 set_min_width 0-4 54150 NULL ++devcgroup_update_access_54151 devcgroup_update_access 0 54151 NULL ++mci_ce_noinfo_show_54154 mci_ce_noinfo_show 0 54154 NULL nohasharray ++n_hdlc_tty_read_54154 n_hdlc_tty_read 0 54154 &mci_ce_noinfo_show_54154 ++skge_change_mtu_54157 skge_change_mtu 0 54157 NULL ++skge_get_regs_len_54160 skge_get_regs_len 0 54160 NULL ++f_rndis_opts_attr_show_54161 f_rndis_opts_attr_show 0 54161 NULL nohasharray ++kszphy_rmii_clk_sel_54161 kszphy_rmii_clk_sel 0 54161 &f_rndis_opts_attr_show_54161 ++i2400m_zrealloc_2x_54166 i2400m_zrealloc_2x 3 54166 NULL ++nouveau_falcon_create__54169 nouveau_falcon_create_ 8 54169 NULL ++ext_prop_type_show_54170 ext_prop_type_show 0 54170 NULL ++sysfs_show_reg_54174 sysfs_show_reg 0 54174 NULL ++p9_client_prepare_req_54175 p9_client_prepare_req 3 54175 NULL ++qla4xxx_iscsi_func_cnt_show_54184 qla4xxx_iscsi_func_cnt_show 0 54184 NULL ++acpi_os_read_memory_54186 acpi_os_read_memory 1-3 54186 NULL ++bd2802_store_reg0x07_54187 bd2802_store_reg0x07 0-4 54187 NULL ++ata_scsi_park_store_54188 ata_scsi_park_store 0-4 54188 NULL ++slab_attr_show_54189 slab_attr_show 0 54189 NULL ++ubifs_check_node_54196 ubifs_check_node 0 54196 NULL nohasharray ++fan_set_state_acpi4_54196 fan_set_state_acpi4 0 54196 &ubifs_check_node_54196 ++wl1251_hw_init_power_auth_54203 wl1251_hw_init_power_auth 0 54203 NULL ++SyS_ipc_54206 SyS_ipc 3 54206 NULL ++handle_version_mismatch_54211 handle_version_mismatch 0 54211 NULL ++nilfs_palloc_prepare_free_entry_54212 nilfs_palloc_prepare_free_entry 0 54212 NULL nohasharray ++twl_sysfs_compat_info_54212 twl_sysfs_compat_info 6-0-5 54212 &nilfs_palloc_prepare_free_entry_54212 ++target_core_alua_tg_pt_gp_attr_show_54214 target_core_alua_tg_pt_gp_attr_show 0 54214 NULL ++devm_request_threaded_irq_54215 devm_request_threaded_irq 0 54215 NULL nohasharray ++blkg_conf_prep_54215 blkg_conf_prep 0 54215 &devm_request_threaded_irq_54215 ++sctp_setsockopt_fragment_interleave_54216 sctp_setsockopt_fragment_interleave 0 54216 NULL ++ocfs2_inode_revalidate_54217 ocfs2_inode_revalidate 0 54217 NULL ++interface_capabilities_show_54218 interface_capabilities_show 0 54218 NULL ++iwl_pcie_load_cpu_sections_8000b_54219 iwl_pcie_load_cpu_sections_8000b 0 54219 NULL ++do_sys_poll_54221 do_sys_poll 2 54221 NULL ++__register_chrdev_54223 __register_chrdev 2-3 54223 NULL ++cm_validate_req_param_54225 cm_validate_req_param 0 54225 NULL ++nfs_commit_list_54226 nfs_commit_list 0 54226 NULL ++i8k_smm_54227 i8k_smm 0 54227 NULL ++fc0012_get_if_frequency_54229 fc0012_get_if_frequency 0 54229 NULL ++pi_read_regr_54231 pi_read_regr 0 54231 NULL nohasharray ++lnext_show_54231 lnext_show 0 54231 &pi_read_regr_54231 ++mtd_read_oob_54234 mtd_read_oob 0 54234 NULL ++get_a_ctxt_54239 get_a_ctxt 0 54239 NULL ++store_queue_type_field_54243 store_queue_type_field 0-4 54243 NULL ++bnx2x_setup_leading_54246 bnx2x_setup_leading 0 54246 NULL nohasharray ++mcp23s08_read_regs_54246 mcp23s08_read_regs 4 54246 &bnx2x_setup_leading_54246 ++reada_add_block_54247 reada_add_block 2 54247 NULL ++write_file_spec_scan_ctl_54248 write_file_spec_scan_ctl 3-0 54248 NULL nohasharray ++stream_dequeue_54248 stream_dequeue 0 54248 &write_file_spec_scan_ctl_54248 ++ad7887_ring_preenable_54249 ad7887_ring_preenable 0 54249 NULL nohasharray ++store_temp_offset_54249 store_temp_offset 0-4 54249 &ad7887_ring_preenable_54249 ++vxfs_statfs_54251 vxfs_statfs 0 54251 NULL ++iscsi_tpg_param_show_AuthMethod_54252 iscsi_tpg_param_show_AuthMethod 0 54252 NULL ++xfs_dir2_sf_addname_hard_54254 xfs_dir2_sf_addname_hard 3 54254 NULL ++venus_setattr_54255 venus_setattr 0 54255 NULL ++queue_logical_block_size_show_54257 queue_logical_block_size_show 0 54257 NULL ++ceph_msgpool_get_54258 ceph_msgpool_get 2 54258 NULL ++inv_reset_fifo_54259 inv_reset_fifo 0 54259 NULL ++audio_write_54261 audio_write 4-0 54261 NULL nohasharray ++wusb_prf_54261 wusb_prf 7-0 54261 &audio_write_54261 nohasharray ++asus_wmi_get_devstate_bits_54261 asus_wmi_get_devstate_bits 0-3 54261 &wusb_prf_54261 nohasharray ++bond_option_primary_reselect_set_54261 bond_option_primary_reselect_set 0 54261 &asus_wmi_get_devstate_bits_54261 ++get_temp_alarm_54267 get_temp_alarm 0 54267 NULL ++mwifiex_getlog_read_54269 mwifiex_getlog_read 3-0 54269 NULL ++kstrtou16_from_user_54274 kstrtou16_from_user 2 54274 NULL ++sizeof_long_54276 sizeof_long 0 54276 NULL ++ubi_calc_data_len_54279 ubi_calc_data_len 0-3 54279 NULL nohasharray ++bond_option_tlb_dynamic_lb_set_54279 bond_option_tlb_dynamic_lb_set 0 54279 &ubi_calc_data_len_54279 ++mls_context_cpy_low_54281 mls_context_cpy_low 0 54281 NULL ++fm10k_open_54283 fm10k_open 0 54283 NULL ++msi2500_queue_setup_54289 msi2500_queue_setup 0 54289 NULL ++_nfs4_proc_pathconf_54290 _nfs4_proc_pathconf 0 54290 NULL nohasharray ++watchdog_trigger_54290 watchdog_trigger 0 54290 &_nfs4_proc_pathconf_54290 ++altera_set_dr_post_54291 altera_set_dr_post 2 54291 NULL ++show_designated_port_54292 show_designated_port 0 54292 NULL ++xiic_xfer_54293 xiic_xfer 0-3 54293 NULL ++netlink_alloc_skb_54294 netlink_alloc_skb 2 54294 NULL ++dlm_alloc_pagevec_54296 dlm_alloc_pagevec 1 54296 NULL nohasharray ++sys_kexec_file_load_54296 sys_kexec_file_load 3 54296 &dlm_alloc_pagevec_54296 ++remove_store_54298 remove_store 0-4 54298 NULL ++dentry_has_perm_54299 dentry_has_perm 0 54299 NULL ++reclaim_pages_54301 reclaim_pages 3 54301 NULL ++crc32_pclmul_init_54305 crc32_pclmul_init 0 54305 NULL ++sprintf_54306 sprintf 0 54306 NULL ++path_setxattr_54308 path_setxattr 4 54308 NULL ++mlx4_en_create_rx_ring_54315 mlx4_en_create_rx_ring 3 54315 NULL ++kone_set_settings_54317 kone_set_settings 0 54317 NULL ++qlcnic_sriov_cfg_vf_guest_vlan_54318 qlcnic_sriov_cfg_vf_guest_vlan 0 54318 NULL ++bio_add_pc_page_54319 bio_add_pc_page 4 54319 NULL nohasharray ++snd_hwdep_write_54319 snd_hwdep_write 0-3 54319 &bio_add_pc_page_54319 ++setup_data_data_read_54324 setup_data_data_read 0-5-6 54324 NULL ++elan_i2c_calibrate_54325 elan_i2c_calibrate 0 54325 NULL ++pn_raw_send_54330 pn_raw_send 2 54330 NULL ++bnx2_setup_int_mode_54335 bnx2_setup_int_mode 0 54335 NULL ++ocrdma_addr_event_54337 ocrdma_addr_event 0 54337 NULL ++ths7303_s_stream_54338 ths7303_s_stream 0 54338 NULL ++br_fdb_fillbuf_54339 br_fdb_fillbuf 0 54339 NULL nohasharray ++ks0127_s_stream_54339 ks0127_s_stream 0 54339 &br_fdb_fillbuf_54339 ++da9052_enable_vddout_channel_54341 da9052_enable_vddout_channel 0 54341 NULL ++__alloc_dev_table_54343 __alloc_dev_table 2 54343 NULL ++fat_writepage_54344 fat_writepage 0 54344 NULL ++loop_attr_do_show_partscan_54346 loop_attr_do_show_partscan 0 54346 NULL ++_osd_realloc_seg_54352 _osd_realloc_seg 3-0 54352 NULL nohasharray ++__get_free_pages_54352 __get_free_pages 0 54352 &_osd_realloc_seg_54352 ++hsi_async_read_54365 hsi_async_read 0 54365 NULL ++readlink_copy_54366 readlink_copy 2-0 54366 NULL nohasharray ++lp55xx_show_current_54366 lp55xx_show_current 0 54366 &readlink_copy_54366 ++read_file_credit_dist_stats_54367 read_file_credit_dist_stats 3-0 54367 NULL ++wake_up_pme_store_54368 wake_up_pme_store 0-4 54368 NULL ++tps65912_set_bits_54370 tps65912_set_bits 0 54370 NULL ++aac_show_model_54375 aac_show_model 0 54375 NULL ++intel_sdvo_write_cmd_54377 intel_sdvo_write_cmd 4 54377 NULL nohasharray ++do_dccp_setsockopt_54377 do_dccp_setsockopt 5-0 54377 &intel_sdvo_write_cmd_54377 ++ah_alloc_tmp_54378 ah_alloc_tmp 2-3 54378 NULL ++gart_unmap_page_54379 gart_unmap_page 3-2 54379 NULL ++raid56_parity_recover_54381 raid56_parity_recover 5-0 54381 NULL ++wl1271_acx_cca_threshold_54385 wl1271_acx_cca_threshold 0 54385 NULL ++snd_pcm_oss_read2_54387 snd_pcm_oss_read2 0-3 54387 NULL ++bonding_show_packets_per_slave_54388 bonding_show_packets_per_slave 0 54388 NULL ++hash_mac4_expire_54392 hash_mac4_expire 4 54392 NULL nohasharray ++iwl_dbgfs_power_save_status_read_54392 iwl_dbgfs_power_save_status_read 3-0 54392 &hash_mac4_expire_54392 ++o2nm_cluster_attr_idle_timeout_ms_read_54400 o2nm_cluster_attr_idle_timeout_ms_read 0 54400 NULL nohasharray ++set_gss_proxy_54400 set_gss_proxy 0 54400 &o2nm_cluster_attr_idle_timeout_ms_read_54400 ++snd_pcm_add_chmap_ctls_54404 snd_pcm_add_chmap_ctls 0 54404 NULL ++efx_nic_describe_stats_54407 efx_nic_describe_stats 2 54407 NULL ++__iscsi_disc_show_authenticate_target_54411 __iscsi_disc_show_authenticate_target 0 54411 NULL ++iio_trigger_register_54412 iio_trigger_register 0 54412 NULL ++ath10k_install_peer_wep_keys_54414 ath10k_install_peer_wep_keys 0 54414 NULL ++sky2_set_mac_address_54415 sky2_set_mac_address 0 54415 NULL ++copy_gadget_strings_54417 copy_gadget_strings 3-2 54417 NULL ++wl1251_hw_init_energy_detection_54421 wl1251_hw_init_energy_detection 0 54421 NULL ++ixgbe_request_irq_54422 ixgbe_request_irq 0 54422 NULL ++nilfs_palloc_get_block_54425 nilfs_palloc_get_block 0 54425 NULL ++new_lockspace_54427 new_lockspace 0 54427 NULL ++__ocfs2_write_remove_suid_54433 __ocfs2_write_remove_suid 0 54433 NULL ++pm3fb_check_var_54437 pm3fb_check_var 0 54437 NULL ++rtl8139_open_54441 rtl8139_open 0 54441 NULL ++read_firmid_54443 read_firmid 0 54443 NULL ++cot_decompress_54452 cot_decompress 0 54452 NULL ++mc13783_gpo_regulator_is_enabled_54460 mc13783_gpo_regulator_is_enabled 0 54460 NULL ++lola_pcm_prepare_54465 lola_pcm_prepare 0 54465 NULL ++uvesafb_show_vendor_54467 uvesafb_show_vendor 0 54467 NULL ++dev_cpu_callback_54475 dev_cpu_callback 0 54475 NULL nohasharray ++iscsit_ta_generate_node_acls_54475 iscsit_ta_generate_node_acls 0 54475 &dev_cpu_callback_54475 ++__erst_get_next_record_id_54478 __erst_get_next_record_id 0 54478 NULL ++buffer_migrate_page_54480 buffer_migrate_page 0 54480 NULL ++fuse_notify_inval_entry_54481 fuse_notify_inval_entry 0 54481 NULL ++show_session_param_ISCSI_PARAM_DISCOVERY_SESS_54483 show_session_param_ISCSI_PARAM_DISCOVERY_SESS 0 54483 NULL ++sparse_early_mem_maps_alloc_node_54485 sparse_early_mem_maps_alloc_node 4 54485 NULL ++po1030_set_exposure_54489 po1030_set_exposure 0 54489 NULL ++garmin_write_54492 garmin_write 0-4 54492 NULL ++simple_strtoull_54493 simple_strtoull 0 54493 NULL ++swiotlb_tbl_map_single_54495 swiotlb_tbl_map_single 0 54495 NULL ++xen_alloc_ptpage_54497 xen_alloc_ptpage 2 54497 NULL ++vfio_raw_config_read_54500 vfio_raw_config_read 0-3 54500 NULL ++vfs_getattr_nosec_54503 vfs_getattr_nosec 0 54503 NULL nohasharray ++ieee80211_tdls_mgmt_setup_54503 ieee80211_tdls_mgmt_setup 10 54503 &vfs_getattr_nosec_54503 ++sh_mobile_ceu_s_ctrl_54508 sh_mobile_ceu_s_ctrl 0 54508 NULL nohasharray ++tipc_sk_anc_data_recv_54508 tipc_sk_anc_data_recv 0 54508 &sh_mobile_ceu_s_ctrl_54508 nohasharray ++l2cap_create_basic_pdu_54508 l2cap_create_basic_pdu 3 54508 &tipc_sk_anc_data_recv_54508 ++btrfs_ordered_sum_size_54509 btrfs_ordered_sum_size 0-2 54509 NULL ++xc_send_i2c_data_54514 xc_send_i2c_data 0 54514 NULL nohasharray ++mci_ce_count_show_54514 mci_ce_count_show 0 54514 &xc_send_i2c_data_54514 nohasharray ++xen_bus_to_phys_54514 xen_bus_to_phys 0-1 54514 &mci_ce_count_show_54514 ++cache_add_dev_54516 cache_add_dev 0 54516 NULL ++create_lkb_54517 create_lkb 0 54517 NULL ++rfc4106_set_key_54519 rfc4106_set_key 3 54519 NULL nohasharray ++remove_id_show_54519 remove_id_show 0 54519 &rfc4106_set_key_54519 ++memory_get_max_bandwidth_54523 memory_get_max_bandwidth 0 54523 NULL ++vmci_transport_dgram_enqueue_54525 vmci_transport_dgram_enqueue 4-0 54525 NULL ++viacam_read_54526 viacam_read 3-0 54526 NULL ++pnp_assign_resources_54531 pnp_assign_resources 0 54531 NULL ++bq2415x_sysfs_show_timer_54533 bq2415x_sysfs_show_timer 0 54533 NULL ++b43_bus_powerup_54534 b43_bus_powerup 0 54534 NULL ++unix_dgram_connect_54535 unix_dgram_connect 3 54535 NULL ++offcore_rsp_show_54537 offcore_rsp_show 0 54537 NULL ++setsockopt_54539 setsockopt 5 54539 NULL ++new_analog_input_54542 new_analog_input 0 54542 NULL ++show_iface_discovery_auth_optional_54545 show_iface_discovery_auth_optional 0 54545 NULL nohasharray ++pccard_store_card_pm_state_54545 pccard_store_card_pm_state 0-4 54545 &show_iface_discovery_auth_optional_54545 ++lbs_lowsnr_write_54549 lbs_lowsnr_write 3-0 54549 NULL ++i915_gem_get_seqno_54555 i915_gem_get_seqno 0 54555 NULL ++mwifiex_usb_submit_rx_urb_54558 mwifiex_usb_submit_rx_urb 2 54558 NULL ++SYSC_setsockopt_54561 SYSC_setsockopt 5 54561 NULL ++sht15_send_cmd_54567 sht15_send_cmd 0 54567 NULL ++cxgbi_get_host_param_54569 cxgbi_get_host_param 0 54569 NULL nohasharray ++l2tp_ip_getname_54569 l2tp_ip_getname 0 54569 &cxgbi_get_host_param_54569 nohasharray ++f2fs_write_node_page_54569 f2fs_write_node_page 0 54569 &l2tp_ip_getname_54569 ++target_stat_scsi_tgt_dev_show_attr_num_lus_54570 target_stat_scsi_tgt_dev_show_attr_num_lus 0 54570 NULL ++jffs2_security_listxattr_54571 jffs2_security_listxattr 0-5 54571 NULL nohasharray ++skb_put_padto_54571 skb_put_padto 2 54571 &jffs2_security_listxattr_54571 ++nfsd_vfs_write_54577 nfsd_vfs_write 6 54577 NULL ++s5k83a_set_brightness_54578 s5k83a_set_brightness 0 54578 NULL ++rds_getname_54579 rds_getname 0 54579 NULL ++fw_iso_buffer_init_54582 fw_iso_buffer_init 3 54582 NULL ++xfrm_polexpire_msgsize_54589 xfrm_polexpire_msgsize 0 54589 NULL ++sync_callback_54596 sync_callback 0 54596 NULL ++authorized_default_show_54600 authorized_default_show 0 54600 NULL ++security_netlink_send_54601 security_netlink_send 0 54601 NULL ++irq_pkt_threshold_write_54605 irq_pkt_threshold_write 3-0 54605 NULL ++it913x_set_params_54609 it913x_set_params 0 54609 NULL ++pdacf_resume_54612 pdacf_resume 0 54612 NULL ++show_unique_id_54613 show_unique_id 0 54613 NULL ++qlcnic_82xx_config_intrpt_54614 qlcnic_82xx_config_intrpt 0 54614 NULL ++sbp_update_unit_directory_54619 sbp_update_unit_directory 0 54619 NULL ++vb2_dma_sg_alloc_54621 vb2_dma_sg_alloc 2 54621 NULL ++port_fops_write_54627 port_fops_write 3-0 54627 NULL ++pxa168_set_settings_54634 pxa168_set_settings 0 54634 NULL ++s_ctrl_54635 s_ctrl 0 54635 NULL nohasharray ++ds2780_read_block_54635 ds2780_read_block 4-3-0 54635 &s_ctrl_54635 ++w1_f23_fix_count_54636 w1_f23_fix_count 0-2-1-3 54636 NULL nohasharray ++nilfs_superblock_sb_write_time_show_54636 nilfs_superblock_sb_write_time_show 0 54636 &w1_f23_fix_count_54636 nohasharray ++ext2_write_end_54636 ext2_write_end 5-0 54636 &nilfs_superblock_sb_write_time_show_54636 ++uart_get_attr_closing_wait_54637 uart_get_attr_closing_wait 0 54637 NULL nohasharray ++ds1682_eeprom_write_54637 ds1682_eeprom_write 0-5-6 54637 &uart_get_attr_closing_wait_54637 ++tcm_qla2xxx_tpg_attrib_store_cache_dynamic_acls_54638 tcm_qla2xxx_tpg_attrib_store_cache_dynamic_acls 0-3 54638 NULL ++__addrconf_sysctl_register_54645 __addrconf_sysctl_register 0 54645 NULL ++tipc_send_stream_54648 tipc_send_stream 4-0 54648 NULL ++ath10k_htc_alloc_skb_54651 ath10k_htc_alloc_skb 2 54651 NULL ++irq_timeout_read_54653 irq_timeout_read 3-0 54653 NULL ++iscsi_stat_logout_show_attr_abnormal_logouts_54654 iscsi_stat_logout_show_attr_abnormal_logouts 0 54654 NULL ++_regulator_enable_54655 _regulator_enable 0 54655 NULL nohasharray ++ubifs_wbuf_sync_nolock_54655 ubifs_wbuf_sync_nolock 0 54655 &_regulator_enable_54655 ++dns_resolver_read_54658 dns_resolver_read 3 54658 NULL ++twl6030_interrupt_mask_54659 twl6030_interrupt_mask 2 54659 NULL ++simple_alloc_urb_54661 simple_alloc_urb 3 54661 NULL nohasharray ++rds_page_remainder_cpu_notify_54661 rds_page_remainder_cpu_notify 0 54661 &simple_alloc_urb_54661 ++qla4xxx_serial_num_show_54662 qla4xxx_serial_num_show 0 54662 NULL nohasharray ++multicast_query_interval_store_54662 multicast_query_interval_store 4-0 54662 &qla4xxx_serial_num_show_54662 ++read_dev_54664 read_dev 0 54664 NULL nohasharray ++nfs4_server_capabilities_54664 nfs4_server_capabilities 0 54664 &read_dev_54664 nohasharray ++s35390a_get_reg_54664 s35390a_get_reg 0 54664 &nfs4_server_capabilities_54664 ++bus_add_device_54665 bus_add_device 0 54665 NULL ++cw1200_queue_stats_init_54670 cw1200_queue_stats_init 2 54670 NULL nohasharray ++atmtcp_v_open_54670 atmtcp_v_open 0 54670 &cw1200_queue_stats_init_54670 ++bio_kmalloc_54672 bio_kmalloc 2 54672 NULL ++show_target_temp_54673 show_target_temp 0 54673 NULL ++evm_read_key_54674 evm_read_key 3-0 54674 NULL nohasharray ++dm_attr_show_54674 dm_attr_show 0 54674 &evm_read_key_54674 ++ath10k_wmi_attach_54680 ath10k_wmi_attach 0 54680 NULL ++arcnet_open_54681 arcnet_open 0 54681 NULL nohasharray ++mc13xxx_rtc_set_alarm_54681 mc13xxx_rtc_set_alarm 0 54681 &arcnet_open_54681 nohasharray ++rtnl_link_get_slave_info_data_size_54681 rtnl_link_get_slave_info_data_size 0 54681 &mc13xxx_rtc_set_alarm_54681 ++hfsplus_write_begin_54686 hfsplus_write_begin 0-3 54686 NULL ++apei_exec_read_register_54687 apei_exec_read_register 0 54687 NULL nohasharray ++jfs_direct_IO_54687 jfs_direct_IO 4-0 54687 &apei_exec_read_register_54687 ++ad7879_disable_store_54690 ad7879_disable_store 0-4 54690 NULL ++ath9k_hw_rf_set_freq_54699 ath9k_hw_rf_set_freq 0 54699 NULL ++platform_get_irq_byname_54700 platform_get_irq_byname 0 54700 NULL ++smack_task_setscheduler_54707 smack_task_setscheduler 0 54707 NULL ++rfkill_fop_read_54711 rfkill_fop_read 3-0 54711 NULL ++hpet_read_54717 hpet_read 0-3 54717 NULL nohasharray ++iio_trigger_write_current_54717 iio_trigger_write_current 0-4 54717 &hpet_read_54717 ++_add_sg_continuation_descriptor_54721 _add_sg_continuation_descriptor 3 54721 NULL nohasharray ++pinmux_gpio_direction_54721 pinmux_gpio_direction 0 54721 &_add_sg_continuation_descriptor_54721 ++mwl8k_txq_init_54724 mwl8k_txq_init 0 54724 NULL ++show_54725 show 0 54725 NULL ++set_con2fb_map_54727 set_con2fb_map 0 54727 NULL ++rmd128_final_54728 rmd128_final 0 54728 NULL ++show_vgapass_54732 show_vgapass 0 54732 NULL ++mcs_setup_transceiver_sharp_54734 mcs_setup_transceiver_sharp 0 54734 NULL ++ocfs2_control_write_54737 ocfs2_control_write 3-0 54737 NULL ++kzalloc_54740 kzalloc 1 54740 NULL nohasharray ++store_led_override_54740 store_led_override 0-4 54740 &kzalloc_54740 ++do_trimming_54741 do_trimming 3 54741 NULL ++fm_tx_set_rds_mode_54743 fm_tx_set_rds_mode 0 54743 NULL ++wep_iv_read_54744 wep_iv_read 3-0 54744 NULL nohasharray ++dn_hash_sock_54744 dn_hash_sock 0 54744 &wep_iv_read_54744 ++mt9v022_g_fmt_54745 mt9v022_g_fmt 0 54745 NULL nohasharray ++_ctl_diag_trigger_master_store_54745 _ctl_diag_trigger_master_store 0-4 54745 &mt9v022_g_fmt_54745 ++lpfc_idiag_pcicfg_write_54749 lpfc_idiag_pcicfg_write 3-0 54749 NULL ++iio_event_chrdev_read_54757 iio_event_chrdev_read 3-0 54757 NULL ++adis16480_show_firmware_date_54762 adis16480_show_firmware_date 3-0 54762 NULL ++show_zone_54763 show_zone 0 54763 NULL ++smsc9420_ethtool_getregslen_54764 smsc9420_ethtool_getregslen 0 54764 NULL ++nfs3_listxattr_54765 nfs3_listxattr 0-3 54765 NULL ++snd_seq_ioctl_system_info_54773 snd_seq_ioctl_system_info 0 54773 NULL ++lbtf_op_add_interface_54775 lbtf_op_add_interface 0 54775 NULL ++dummy_dev_init_54776 dummy_dev_init 0 54776 NULL ++blk_mq_sysfs_merged_show_54780 blk_mq_sysfs_merged_show 0 54780 NULL ++s3c_camif_video_s_ctrl_54787 s3c_camif_video_s_ctrl 0 54787 NULL ++sis190_open_54790 sis190_open 0 54790 NULL ++nfs41_find_root_sec_54791 nfs41_find_root_sec 0 54791 NULL nohasharray ++xfs_rtallocate_extent_block_54791 xfs_rtallocate_extent_block 0 54791 &nfs41_find_root_sec_54791 ++flexcop_device_kmalloc_54793 flexcop_device_kmalloc 1 54793 NULL ++show_fcoe_fcf_device_fka_period_54796 show_fcoe_fcf_device_fka_period 0 54796 NULL ++domain_init_54797 domain_init 2 54797 NULL ++ext3_find_goal_54801 ext3_find_goal 0 54801 NULL nohasharray ++acpi_ds_resolve_operands_54801 acpi_ds_resolve_operands 0 54801 &ext3_find_goal_54801 nohasharray ++acpi_thermal_cpufreq_notifier_54801 acpi_thermal_cpufreq_notifier 0 54801 &acpi_ds_resolve_operands_54801 ++imx074_s_fmt_54808 imx074_s_fmt 0 54808 NULL nohasharray ++wl1271_init_vif_specific_54808 wl1271_init_vif_specific 0 54808 &imx074_s_fmt_54808 ++nfsd_write_54809 nfsd_write 6 54809 NULL ++iio_triggered_buffer_postenable_54812 iio_triggered_buffer_postenable 0 54812 NULL ++ar9287_dump_modal_eeprom_54814 ar9287_dump_modal_eeprom 2-3-0 54814 NULL ++kvzalloc_54815 kvzalloc 1 54815 NULL nohasharray ++aes_decrypt_fail_read_54815 aes_decrypt_fail_read 3-0 54815 &kvzalloc_54815 ++slabs_cpu_partial_show_54823 slabs_cpu_partial_show 0 54823 NULL ++_ctl_version_product_show_54831 _ctl_version_product_show 0 54831 NULL nohasharray ++__c2port_write_flash_erase_54831 __c2port_write_flash_erase 0 54831 &_ctl_version_product_show_54831 ++generic_perform_write_54832 generic_perform_write 3-0 54832 NULL ++omap_hsmmc_prepare_54833 omap_hsmmc_prepare 0 54833 NULL ++write_rio_54837 write_rio 3-0 54837 NULL ++ext3_acl_from_disk_54839 ext3_acl_from_disk 2 54839 NULL nohasharray ++nouveau_engctx_create__54839 nouveau_engctx_create_ 8 54839 &ext3_acl_from_disk_54839 ++gpio_direction_show_54843 gpio_direction_show 0 54843 NULL ++prepare_dma_54845 prepare_dma 0 54845 NULL ++rocker_flow_tbl_add_54846 rocker_flow_tbl_add 0 54846 NULL nohasharray ++hw_reset_phy_54846 hw_reset_phy 0 54846 &rocker_flow_tbl_add_54846 ++scsi_add_host_54847 scsi_add_host 0 54847 NULL nohasharray ++skein_256_final_54847 skein_256_final 0 54847 &scsi_add_host_54847 ++ufx_ops_write_54848 ufx_ops_write 3 54848 NULL ++printer_read_54851 printer_read 3 54851 NULL ++assign_irq_vector_54852 assign_irq_vector 0 54852 NULL ++show_node_54859 show_node 0 54859 NULL ++nilfs_segctor_attr_store_54860 nilfs_segctor_attr_store 0-4 54860 NULL ++m41t80_get_datetime_54861 m41t80_get_datetime 0 54861 NULL ++rdev_attr_store_54863 rdev_attr_store 0-4 54863 NULL ++broadsheet_spiflash_rewrite_sector_54864 broadsheet_spiflash_rewrite_sector 2-0 54864 NULL ++prism_build_supp_rates_54865 prism_build_supp_rates 0 54865 NULL ++f2fs_xattr_generic_list_54866 f2fs_xattr_generic_list 0-5 54866 NULL nohasharray ++acpi_ex_resolve_node_to_value_54866 acpi_ex_resolve_node_to_value 0 54866 &f2fs_xattr_generic_list_54866 ++cpuset_track_online_nodes_54867 cpuset_track_online_nodes 0 54867 NULL ++show_learning_54874 show_learning 0 54874 NULL ++time_show_54879 time_show 0 54879 NULL nohasharray ++xfs_alloc_read_agfl_54879 xfs_alloc_read_agfl 0 54879 &time_show_54879 ++mlx4_en_tunnel_steer_add_54880 mlx4_en_tunnel_steer_add 0 54880 NULL ++dmi_entry_raw_read_54883 dmi_entry_raw_read 0-5-6 54883 NULL ++isert_map_data_buf_54886 isert_map_data_buf 6-4 54886 NULL ++hci_dev_open_54891 hci_dev_open 0 54891 NULL nohasharray ++mxt_send_bootloader_cmd_54891 mxt_send_bootloader_cmd 0 54891 &hci_dev_open_54891 ++dummy_pcm_prepare_54892 dummy_pcm_prepare 0 54892 NULL ++bnx2x_change_mtu_54893 bnx2x_change_mtu 0 54893 NULL ++pscsi_create_type_rom_54898 pscsi_create_type_rom 0 54898 NULL nohasharray ++store_fan_start_output_54898 store_fan_start_output 0-4 54898 &pscsi_create_type_rom_54898 ++sendmsg_54900 sendmsg 0-4 54900 NULL ++squashfs_listxattr_54905 squashfs_listxattr 0-3 54905 NULL nohasharray ++affs_extent_file_ofs_54905 affs_extent_file_ofs 0 54905 &squashfs_listxattr_54905 ++adis_enable_irq_54908 adis_enable_irq 0 54908 NULL ++ad7791_set_channel_54909 ad7791_set_channel 0 54909 NULL ++snd_es1968_pcm_trigger_54911 snd_es1968_pcm_trigger 0 54911 NULL ++iscsi_pool_init_54913 iscsi_pool_init 2-4 54913 NULL nohasharray ++kobject_set_name_vargs_54913 kobject_set_name_vargs 0 54913 &iscsi_pool_init_54913 ++store_temp_54915 store_temp 0-4 54915 NULL ++ft_nacl_show_node_name_54916 ft_nacl_show_node_name 0 54916 NULL ++__ipoib_vlan_add_54918 __ipoib_vlan_add 0 54918 NULL ++__logfs_segment_read_54920 __logfs_segment_read 0 54920 NULL ++qlcnic_82xx_store_beacon_54923 qlcnic_82xx_store_beacon 0-3 54923 NULL ++loopback_dev_init_54927 loopback_dev_init 0 54927 NULL ++wl1251_boot_init_seq_54930 wl1251_boot_init_seq 0 54930 NULL ++bio_add_page_54933 bio_add_page 0-3 54933 NULL ++load_fx_54934 load_fx 0 54934 NULL ++input_polldev_get_max_54936 input_polldev_get_max 0 54936 NULL ++mxms_structlen_54939 mxms_structlen 0 54939 NULL nohasharray ++descending_callback_54939 descending_callback 0 54939 &mxms_structlen_54939 nohasharray ++snd_opl3_load_patch_seq_oss_54939 snd_opl3_load_patch_seq_oss 0 54939 &descending_callback_54939 ++ddebug_change_54940 ddebug_change 0 54940 NULL ++add_port_54941 add_port 2 54941 NULL ++dump_kernel_offset_54942 dump_kernel_offset 0 54942 NULL nohasharray ++bcm5482_read_status_54942 bcm5482_read_status 0 54942 &dump_kernel_offset_54942 ++__uncore_filter_band0_show_54943 __uncore_filter_band0_show 0 54943 NULL nohasharray ++lowpan_xmit_fragment_54943 lowpan_xmit_fragment 6-4 54943 &__uncore_filter_band0_show_54943 ++rj54n1_g_crop_54945 rj54n1_g_crop 0 54945 NULL ++ath9k_dump_btcoex_54949 ath9k_dump_btcoex 3-0 54949 NULL ++make_rate_54951 make_rate 0 54951 NULL ++usbhid_raw_request_54957 usbhid_raw_request 0 54957 NULL nohasharray ++write_fw_block_54957 write_fw_block 0 54957 &usbhid_raw_request_54957 ++init_pitch_v2_54959 init_pitch_v2 0 54959 NULL ++host_control_smi_type_show_54961 host_control_smi_type_show 0 54961 NULL ++recv_cb_54962 recv_cb 0 54962 NULL ++ggtt_probe_common_54963 ggtt_probe_common 2 54963 NULL ++smb2_open_file_54967 smb2_open_file 0 54967 NULL nohasharray ++alauda_write_data_54967 alauda_write_data 3 54967 &smb2_open_file_54967 ++c4_add_card_54968 c4_add_card 3 54968 NULL ++uart_get_attr_uartclk_54975 uart_get_attr_uartclk 0 54975 NULL ++igb_alloc_q_vectors_54977 igb_alloc_q_vectors 0 54977 NULL ++ubi_change_vtbl_record_54979 ubi_change_vtbl_record 0 54979 NULL nohasharray ++dev_exception_add_54979 dev_exception_add 0 54979 &ubi_change_vtbl_record_54979 ++virtual_gb_show_54981 virtual_gb_show 0 54981 NULL ++_queue_data_54983 _queue_data 4 54983 NULL ++cachefiles_daemon_inuse_54984 cachefiles_daemon_inuse 0 54984 NULL ++net2280_start_54985 net2280_start 0 54985 NULL ++ext3_xattr_get_54989 ext3_xattr_get 0 54989 NULL nohasharray ++padlock_sha256_init_nano_54989 padlock_sha256_init_nano 0 54989 &ext3_xattr_get_54989 ++instance_npe_count_show_54995 instance_npe_count_show 0 54995 NULL nohasharray ++mem_cgroup_precharge_mc_54995 mem_cgroup_precharge_mc 0 54995 &instance_npe_count_show_54995 ++ov5642_s_fmt_54996 ov5642_s_fmt 0 54996 NULL nohasharray ++load_patch_54996 load_patch 0 54996 &ov5642_s_fmt_54996 ++ocfs2_read_inline_data_54999 ocfs2_read_inline_data 0 54999 NULL ++wl1251_cmd_vbm_55009 wl1251_cmd_vbm 0 55009 NULL ++cx231xx_v4l2_read_55014 cx231xx_v4l2_read 3-0 55014 NULL ++i2o_exec_show_vendor_id_55020 i2o_exec_show_vendor_id 0 55020 NULL nohasharray ++ipvlan_vlan_rx_add_vid_55020 ipvlan_vlan_rx_add_vid 0 55020 &i2o_exec_show_vendor_id_55020 ++driver_pin_configs_show_55022 driver_pin_configs_show 0 55022 NULL ++error_error_null_Frame_tx_start_read_55024 error_error_null_Frame_tx_start_read 3-0 55024 NULL ++firmware_loading_store_55029 firmware_loading_store 0-4 55029 NULL ++ubifs_read_node_wbuf_55034 ubifs_read_node_wbuf 0 55034 NULL ++target_stat_scsi_auth_intr_attr_store_55035 target_stat_scsi_auth_intr_attr_store 0 55035 NULL ++efw_transaction_55052 efw_transaction 5-7 55052 NULL ++snd_cmipci_pcm_prepare_55054 snd_cmipci_pcm_prepare 0 55054 NULL ++ima_inode_removexattr_55055 ima_inode_removexattr 0 55055 NULL ++sctp_setsockopt_primary_addr_55057 sctp_setsockopt_primary_addr 0 55057 NULL ++tps65912_read_55058 tps65912_read 0 55058 NULL ++read_55065 read 0 55065 NULL ++idt77252_send_skb_55068 idt77252_send_skb 0 55068 NULL ++drm_dp_mst_topology_mgr_init_55074 drm_dp_mst_topology_mgr_init 5 55074 NULL nohasharray ++iscsi_stat_tgt_attr_show_attr_inst_55074 iscsi_stat_tgt_attr_show_attr_inst 0 55074 &drm_dp_mst_topology_mgr_init_55074 nohasharray ++lanai_setup_tx_vci_55074 lanai_setup_tx_vci 0 55074 &iscsi_stat_tgt_attr_show_attr_inst_55074 ++apei_exec_run_55075 apei_exec_run 0 55075 NULL ++bitmap_storage_alloc_55077 bitmap_storage_alloc 2-0 55077 NULL ++fuse_read_interrupt_55081 fuse_read_interrupt 0 55081 NULL ++acq_write_55082 acq_write 0-3 55082 NULL nohasharray ++cdc_mbim_rx_add_vid_55082 cdc_mbim_rx_add_vid 0 55082 &acq_write_55082 ++lnc_add_55085 lnc_add 0 55085 NULL ++read_dma_55086 read_dma 3 55086 NULL ++__pci_dev_reset_55090 __pci_dev_reset 0 55090 NULL ++solo_p2m_dma_t_55094 solo_p2m_dma_t 0 55094 NULL ++hx8357_spi_write_array_55095 hx8357_spi_write_array 3 55095 NULL ++update_raid_disks_55100 update_raid_disks 0 55100 NULL ++p9_client_write_55105 p9_client_write 0 55105 NULL ++rxpipe_beacon_buffer_thres_host_int_trig_rx_data_read_55106 rxpipe_beacon_buffer_thres_host_int_trig_rx_data_read 3-0 55106 NULL nohasharray ++proc_sys_read_55106 proc_sys_read 0-3 55106 &rxpipe_beacon_buffer_thres_host_int_trig_rx_data_read_55106 ++show_counter_rx_lpcrc_errs_55112 show_counter_rx_lpcrc_errs 0 55112 NULL ++corrupt_data_55120 corrupt_data 0-3 55120 NULL ++edac_pci_instance_store_55129 edac_pci_instance_store 0-4 55129 NULL ++sha256_ssse3_init_55131 sha256_ssse3_init 0 55131 NULL ++crypto_ahash_setkey_55134 crypto_ahash_setkey 0-3 55134 NULL nohasharray ++gr_ep_enable_55134 gr_ep_enable 0 55134 &crypto_ahash_setkey_55134 ++wp512_update_55143 wp512_update 0 55143 NULL ++iscsi_tpg_param_store_DataPDUInOrder_55147 iscsi_tpg_param_store_DataPDUInOrder 0-3 55147 NULL ++ieee80211_if_read_uapsd_queues_55150 ieee80211_if_read_uapsd_queues 3-0 55150 NULL ++tcp_splice_read_55151 tcp_splice_read 0 55151 NULL ++btrfs_fdatawrite_range_55152 btrfs_fdatawrite_range 0 55152 NULL nohasharray ++shmem_write_end_55152 shmem_write_end 0-5 55152 &btrfs_fdatawrite_range_55152 ++rtl2830_wr_regs_55154 rtl2830_wr_regs 0 55154 NULL nohasharray ++__uncore_mask_opc_show_55154 __uncore_mask_opc_show 0 55154 &rtl2830_wr_regs_55154 ++snd_rme9652_trigger_55155 snd_rme9652_trigger 0 55155 NULL nohasharray ++dwc3_gadget_ep_queue_55155 dwc3_gadget_ep_queue 0 55155 &snd_rme9652_trigger_55155 ++xfs_icsb_modify_counters_55156 xfs_icsb_modify_counters 0 55156 NULL ++pwm_show_55165 pwm_show 0 55165 NULL ++xen_pcpu_down_55168 xen_pcpu_down 0 55168 NULL ++__rpipe_set_descr_55173 __rpipe_set_descr 0 55173 NULL ++show_55175 show 0 55175 NULL nohasharray ++xfs_attr_shortform_lookup_55175 xfs_attr_shortform_lookup 0 55175 &show_55175 ++pcf85063_get_datetime_55179 pcf85063_get_datetime 0 55179 NULL ++patch_alc882_55183 patch_alc882 0 55183 NULL ++wacom_status1_luminance_show_55184 wacom_status1_luminance_show 0 55184 NULL ++gfs2_ri_update_55185 gfs2_ri_update 0 55185 NULL ++de4x5_open_55186 de4x5_open 0 55186 NULL ++alloc_lpt_leb_55189 alloc_lpt_leb 0 55189 NULL nohasharray ++lp3943_gpio_request_55189 lp3943_gpio_request 0 55189 &alloc_lpt_leb_55189 ++itg3200_read_reg_8_55190 itg3200_read_reg_8 0 55190 NULL nohasharray ++drbd_send_55190 drbd_send 4 55190 &itg3200_read_reg_8_55190 ++show_status_55193 show_status 0 55193 NULL ++set_gpio_mask_55194 set_gpio_mask 0-4 55194 NULL ++sel_write_relabel_55195 sel_write_relabel 3 55195 NULL nohasharray ++zswap_cpu_notifier_55195 zswap_cpu_notifier 0 55195 &sel_write_relabel_55195 ++compat_SyS_ppoll_55196 compat_SyS_ppoll 2 55196 NULL ++gr_udc_start_55200 gr_udc_start 0 55200 NULL ++sched_feat_write_55202 sched_feat_write 3-0 55202 NULL nohasharray ++tcmu_get_blocks_55202 tcmu_get_blocks 0 55202 &sched_feat_write_55202 ++ht40allow_map_read_55209 ht40allow_map_read 3-0 55209 NULL nohasharray ++vsock_dgram_recvmsg_55209 vsock_dgram_recvmsg 0-4 55209 &ht40allow_map_read_55209 nohasharray ++isdn_net_ciscohdlck_alloc_skb_55209 isdn_net_ciscohdlck_alloc_skb 2 55209 &vsock_dgram_recvmsg_55209 ++dlci_change_mtu_55210 dlci_change_mtu 0 55210 NULL ++__kfifo_dma_out_prepare_r_55211 __kfifo_dma_out_prepare_r 4-5 55211 NULL ++mlx4_load_one_55213 mlx4_load_one 3 55213 NULL ++do_raw_setsockopt_55215 do_raw_setsockopt 5-0 55215 NULL ++qxl_alloc_client_monitors_config_55216 qxl_alloc_client_monitors_config 2 55216 NULL ++nouveau_mc_create__55217 nouveau_mc_create_ 4 55217 NULL ++p2a_55219 p2a 0-1 55219 NULL ++firm_send_command_55222 firm_send_command 0 55222 NULL ++dbAllocDmap_55227 dbAllocDmap 0 55227 NULL ++be_vlan_add_vid_55230 be_vlan_add_vid 0 55230 NULL ++show_counter_rx_ebps_55234 show_counter_rx_ebps 0 55234 NULL ++zd_chip_enable_int_55245 zd_chip_enable_int 0 55245 NULL ++show_host_param_ISCSI_HOST_PARAM_PORT_STATE_55246 show_host_param_ISCSI_HOST_PARAM_PORT_STATE 0 55246 NULL ++memcpy_fromiovec_55247 memcpy_fromiovec 3-0 55247 NULL ++create_proc_profile_55256 create_proc_profile 0 55256 NULL ++xhci_evaluate_context_result_55258 xhci_evaluate_context_result 0 55258 NULL ++cfq_slice_async_store_55262 cfq_slice_async_store 3-0 55262 NULL ++output_sleep_55265 output_sleep 0 55265 NULL ++st_sensors_i2c_write_byte_55266 st_sensors_i2c_write_byte 0 55266 NULL ++vbi_cap_queue_setup_55269 vbi_cap_queue_setup 0 55269 NULL ++_nfs41_proc_get_locations_55273 _nfs41_proc_get_locations 0 55273 NULL ++lbs_failcount_write_55276 lbs_failcount_write 3-0 55276 NULL ++show_spi_transport_min_period_55279 show_spi_transport_min_period 0 55279 NULL ++inet_sendpage_55281 inet_sendpage 4 55281 NULL ++f7188x_gpio_direction_in_55284 f7188x_gpio_direction_in 0 55284 NULL ++pm8001_ctl_gsm_log_show_55287 pm8001_ctl_gsm_log_show 0 55287 NULL ++snd_seq_queue_use_55289 snd_seq_queue_use 0 55289 NULL ++rx_streaming_interval_read_55291 rx_streaming_interval_read 3-0 55291 NULL ++apds990x_lux_thresh_above_store_55296 apds990x_lux_thresh_above_store 0-4 55296 NULL ++lov_get_stripecnt_55297 lov_get_stripecnt 0-3 55297 NULL ++show_session_param_ISCSI_PARAM_TPGT_55299 show_session_param_ISCSI_PARAM_TPGT 0 55299 NULL ++gsm_control_modem_55303 gsm_control_modem 3 55303 NULL ++__get_vm_area_node_55305 __get_vm_area_node 1 55305 NULL nohasharray ++qp_alloc_guest_work_55305 qp_alloc_guest_work 3-5 55305 &__get_vm_area_node_55305 nohasharray ++compat_SyS_process_vm_readv_55305 compat_SyS_process_vm_readv 3-5 55305 &qp_alloc_guest_work_55305 ++adxl34x_rate_show_55315 adxl34x_rate_show 0 55315 NULL ++w5100_get_regs_len_55317 w5100_get_regs_len 0 55317 NULL ++vfat_revalidate_shortname_55319 vfat_revalidate_shortname 0 55319 NULL ++compat_SyS_mbind_55329 compat_SyS_mbind 5 55329 NULL ++show_fc_host_port_state_55331 show_fc_host_port_state 0 55331 NULL ++gpio_trig_gpio_show_55336 gpio_trig_gpio_show 0 55336 NULL ++reg_read_55337 reg_read 0 55337 NULL ++vme_user_read_55338 vme_user_read 3 55338 NULL ++read_byte_55340 read_byte 0 55340 NULL ++__wa_xfer_setup_sizes_55342 __wa_xfer_setup_sizes 0 55342 NULL ++SYSC_recvfrom_55346 SYSC_recvfrom 3 55346 NULL ++udf_writepage_55347 udf_writepage 0 55347 NULL ++device_user_lock_55350 device_user_lock 0 55350 NULL ++show_in0_max_55351 show_in0_max 0 55351 NULL ++input_dev_show_cap_ff_55354 input_dev_show_cap_ff 0 55354 NULL nohasharray ++set_nic_info_55354 set_nic_info 0 55354 &input_dev_show_cap_ff_55354 ++relay_hotcpu_callback_55355 relay_hotcpu_callback 0 55355 NULL ++tps80031_reads_55356 tps80031_reads 0 55356 NULL ++dsbr100_start_55357 dsbr100_start 0 55357 NULL nohasharray ++attr_select_right_store_tpkbd_55357 attr_select_right_store_tpkbd 0-4 55357 &dsbr100_start_55357 ++do_command_55363 do_command 0 55363 NULL ++vb2_reqbufs_55367 vb2_reqbufs 0 55367 NULL ++cxacru_sysfs_show_line_startable_55372 cxacru_sysfs_show_line_startable 0 55372 NULL ++get_fan_alarm_55373 get_fan_alarm 0 55373 NULL ++netpoll_setup_55376 netpoll_setup 0 55376 NULL ++protocol_id_get_55382 protocol_id_get 0 55382 NULL ++nf_nat_ipv4_manip_pkt_55387 nf_nat_ipv4_manip_pkt 2 55387 NULL ++compass_calibration_store_55390 compass_calibration_store 4-0 55390 NULL ++iscsi_nacl_attrib_store_nopin_response_timeout_55391 iscsi_nacl_attrib_store_nopin_response_timeout 0-3 55391 NULL nohasharray ++cw1200_sdio_align_size_55391 cw1200_sdio_align_size 2 55391 &iscsi_nacl_attrib_store_nopin_response_timeout_55391 ++bnx2x_set_real_num_queues_55399 bnx2x_set_real_num_queues 0 55399 NULL ++ad7314_show_temperature_55402 ad7314_show_temperature 0 55402 NULL ++wacom_btnimg3_store_55403 wacom_btnimg3_store 4-0 55403 NULL ++yurex_read_55405 yurex_read 0-3 55405 NULL ++lx_pipe_pause_55406 lx_pipe_pause 0 55406 NULL ++iwl_dbgfs_plcp_delta_read_55407 iwl_dbgfs_plcp_delta_read 3-0 55407 NULL ++ser12_open_55411 ser12_open 0 55411 NULL nohasharray ++com20020_suspend_55411 com20020_suspend 0 55411 &ser12_open_55411 ++omap_hsmmc_show_cover_switch_55416 omap_hsmmc_show_cover_switch 0 55416 NULL ++sky2_change_mtu_55422 sky2_change_mtu 0 55422 NULL ++show_port_55424 show_port 0 55424 NULL ++nouveau_cli_create_55425 nouveau_cli_create 3 55425 NULL ++si476x_radio_read_rds_blckcnt_blob_55427 si476x_radio_read_rds_blckcnt_blob 3-0 55427 NULL ++iwl_mvm_mac_add_interface_55429 iwl_mvm_mac_add_interface 0 55429 NULL ++jme_open_55432 jme_open 0 55432 NULL ++mac_set_mtu_55434 mac_set_mtu 0 55434 NULL ++show_in8_55438 show_in8 0 55438 NULL ++cxgb4vf_change_mtu_55439 cxgb4vf_change_mtu 0 55439 NULL nohasharray ++alloc_skb_55439 alloc_skb 1 55439 &cxgb4vf_change_mtu_55439 ++show_spi_host_signalling_55442 show_spi_host_signalling 0 55442 NULL ++ip_vs_nat_send_or_cont_55445 ip_vs_nat_send_or_cont 0 55445 NULL ++af9005_generic_read_write_55446 af9005_generic_read_write 0 55446 NULL ++SyS_read_55449 SyS_read 3 55449 NULL ++vmxnet3_vlan_rx_add_vid_55453 vmxnet3_vlan_rx_add_vid 0 55453 NULL nohasharray ++swiotlb_map_sg_attrs_55453 swiotlb_map_sg_attrs 0-3 55453 &vmxnet3_vlan_rx_add_vid_55453 ++sys_recv_55455 sys_recv 3 55455 NULL ++fsp_attr_set_hscroll_55456 fsp_attr_set_hscroll 0-4 55456 NULL ++wmi_rx_chain_add_55457 wmi_rx_chain_add 0 55457 NULL ++__vxge_hw_channel_allocate_55462 __vxge_hw_channel_allocate 3 55462 NULL nohasharray ++ath6kl_wmi_simple_cmd_55462 ath6kl_wmi_simple_cmd 0 55462 &__vxge_hw_channel_allocate_55462 ++pmbus_update_byte_data_55465 pmbus_update_byte_data 0 55465 NULL ++isdnhdlc_decode_55466 isdnhdlc_decode 0 55466 NULL ++cx23888_ir_rx_read_55473 cx23888_ir_rx_read 3 55473 NULL ++xen_evtchn_max_channels_55478 xen_evtchn_max_channels 0 55478 NULL nohasharray ++store_enable_clkb1_output_55478 store_enable_clkb1_output 0-4 55478 &xen_evtchn_max_channels_55478 ++af9005_read_ofdm_register_55482 af9005_read_ofdm_register 0 55482 NULL nohasharray ++new_sync_write_55482 new_sync_write 0-3 55482 &af9005_read_ofdm_register_55482 ++snd_pcm_lib_write_55483 snd_pcm_lib_write 0-3 55483 NULL ++i2o_pool_alloc_55485 i2o_pool_alloc 4 55485 NULL ++uvesafb_show_product_name_55487 uvesafb_show_product_name 0 55487 NULL ++show_ipv6_iface_dup_addr_detect_cnt_55489 show_ipv6_iface_dup_addr_detect_cnt 0 55489 NULL ++atl1e_request_irq_55492 atl1e_request_irq 0 55492 NULL ++rtl8180_init_tx_ring_55496 rtl8180_init_tx_ring 0 55496 NULL ++wm5100_gpio_direction_out_55497 wm5100_gpio_direction_out 0 55497 NULL nohasharray ++drm_fb_helper_panic_55497 drm_fb_helper_panic 0 55497 &wm5100_gpio_direction_out_55497 ++show_engine2_leds_55501 show_engine2_leds 0 55501 NULL ++temp1_max_show_55510 temp1_max_show 0 55510 NULL nohasharray ++dlm_lowcomms_addr_55510 dlm_lowcomms_addr 0 55510 &temp1_max_show_55510 ++tx_tx_done_int_template_read_55511 tx_tx_done_int_template_read 3-0 55511 NULL nohasharray ++target_fabric_port_store_attr_alua_tg_pt_offline_55511 target_fabric_port_store_attr_alua_tg_pt_offline 0-3 55511 &tx_tx_done_int_template_read_55511 nohasharray ++cfpkt_pad_trail_55511 cfpkt_pad_trail 2 55511 &target_fabric_port_store_attr_alua_tg_pt_offline_55511 ++memconsole_read_55512 memconsole_read 0-6-5 55512 NULL ++bcm54xx_config_init_55513 bcm54xx_config_init 0 55513 NULL ++cbaf_wusb_host_band_groups_show_55514 cbaf_wusb_host_band_groups_show 0 55514 NULL ++xfs_btree_split_55515 xfs_btree_split 0 55515 NULL ++ina209_set_value_55517 ina209_set_value 0-4 55517 NULL ++ea_get_55522 ea_get 0-3 55522 NULL ++cafe_smbus_write_data_55535 cafe_smbus_write_data 0 55535 NULL ++qla4xxx_fw_ext_timestamp_show_55537 qla4xxx_fw_ext_timestamp_show 0 55537 NULL ++set_msr_interception_55538 set_msr_interception 2 55538 NULL ++bitmap_create_55543 bitmap_create 0 55543 NULL nohasharray ++tty_port_register_device_55543 tty_port_register_device 3 55543 &bitmap_create_55543 ++hash_ipport6_expire_55549 hash_ipport6_expire 4 55549 NULL ++_regulator_is_enabled_55550 _regulator_is_enabled 0 55550 NULL ++dm_stats_list_55551 dm_stats_list 4 55551 NULL ++unmerge_and_remove_all_rmap_items_55557 unmerge_and_remove_all_rmap_items 0 55557 NULL ++show_55563 show 0 55563 NULL ++rpc_pipe_read_55564 rpc_pipe_read 0-3 55564 NULL ++show_ipv6_iface_link_local_addr_55568 show_ipv6_iface_link_local_addr 0 55568 NULL ++sidtab_context_to_sid_55570 sidtab_context_to_sid 0 55570 NULL nohasharray ++patch_vt1708_55570 patch_vt1708 0 55570 &sidtab_context_to_sid_55570 ++max8998_get_enable_register_55572 max8998_get_enable_register 0 55572 NULL ++show_host_param_ISCSI_HOST_PARAM_NETDEV_NAME_55575 show_host_param_ISCSI_HOST_PARAM_NETDEV_NAME 0 55575 NULL ++edt_ft5x06_register_read_55576 edt_ft5x06_register_read 0 55576 NULL ++compat_SyS_setsockopt_55581 compat_SyS_setsockopt 5 55581 NULL ++add_partition_55588 add_partition 2 55588 NULL ++write_inode_55592 write_inode 0 55592 NULL ++ufx_reg_write_55594 ufx_reg_write 0 55594 NULL ++ip_vs_reply6_55598 ip_vs_reply6 0 55598 NULL ++kstrtou8_from_user_55599 kstrtou8_from_user 2-0 55599 NULL ++SyS_keyctl_55602 SyS_keyctl 4 55602 NULL ++mlx4_set_port_mac_table_55603 mlx4_set_port_mac_table 0 55603 NULL ++tg3_set_mac_addr_55606 tg3_set_mac_addr 0 55606 NULL ++delete_child_55607 delete_child 0-4 55607 NULL nohasharray ++allocate_without_wrapping_disk_55607 allocate_without_wrapping_disk 4 55607 &delete_child_55607 ++dspcreate_55610 dspcreate 0 55610 NULL ++selinux_setprocattr_55611 selinux_setprocattr 4-0 55611 NULL ++fastopen_init_queue_55615 fastopen_init_queue 0 55615 NULL ++__qbuf_dmabuf_55617 __qbuf_dmabuf 0 55617 NULL ++set_oversampling_55622 set_oversampling 0-4 55622 NULL nohasharray ++edge_tty_recv_55622 edge_tty_recv 3 55622 &set_oversampling_55622 ++snd_pcm_hw_param_last_55624 snd_pcm_hw_param_last 0 55624 NULL ++nilfs_checkpoints_snapshots_number_show_55626 nilfs_checkpoints_snapshots_number_show 0 55626 NULL ++reiserfs_xattr_get_55628 reiserfs_xattr_get 0 55628 NULL nohasharray ++pktgen_if_write_55628 pktgen_if_write 3-0 55628 &reiserfs_xattr_get_55628 ++mt2063_init_55629 mt2063_init 0 55629 NULL ++osc_obd_max_pages_per_rpc_seq_write_55636 osc_obd_max_pages_per_rpc_seq_write 3 55636 NULL ++show_board_55637 show_board 0 55637 NULL ++ipv6_helper_55640 ipv6_helper 0 55640 NULL ++ivtv_write_vbi_from_user_55641 ivtv_write_vbi_from_user 0-3 55641 NULL nohasharray ++niu_init_classifier_hw_55641 niu_init_classifier_hw 0 55641 &ivtv_write_vbi_from_user_55641 ++dvb_dmxdev_set_buffer_size_55643 dvb_dmxdev_set_buffer_size 2 55643 NULL ++tomoyo_audit_path_log_55646 tomoyo_audit_path_log 0 55646 NULL ++iolink_show_55647 iolink_show 0 55647 NULL ++xfs_bmbt_maxrecs_55649 xfs_bmbt_maxrecs 0-2 55649 NULL ++snd_seq_read_55651 snd_seq_read 0-3 55651 NULL ++bh1770_power_state_show_55658 bh1770_power_state_show 0 55658 NULL nohasharray ++niu_alloc_rx_ring_info_55658 niu_alloc_rx_ring_info 0 55658 &bh1770_power_state_show_55658 ++pm_trace_dev_match_store_55659 pm_trace_dev_match_store 0-4 55659 NULL ++e1000_get_regs_len_55660 e1000_get_regs_len 0 55660 NULL ++lpfc_idiag_queinfo_read_55662 lpfc_idiag_queinfo_read 3-0 55662 NULL nohasharray ++fc0011_vcocal_trigger_55662 fc0011_vcocal_trigger 0 55662 &lpfc_idiag_queinfo_read_55662 ++online_55663 online 0 55663 NULL ++buffer_size_write_55665 buffer_size_write 3-0 55665 NULL ++il_dbgfs_tx_queue_read_55668 il_dbgfs_tx_queue_read 3-0 55668 NULL ++snd_sb16_capture_trigger_55676 snd_sb16_capture_trigger 0 55676 NULL ++direct2indirect_55677 direct2indirect 0 55677 NULL ++add_loopback_list_55678 add_loopback_list 0 55678 NULL ++get_info_55681 get_info 3 55681 NULL ++iwl_dbgfs_plcp_delta_write_55682 iwl_dbgfs_plcp_delta_write 3-0 55682 NULL ++show_ipOutRequests_55684 show_ipOutRequests 0 55684 NULL nohasharray ++brcms_c_up_55684 brcms_c_up 0 55684 &show_ipOutRequests_55684 ++arizona_gpio_direction_in_55690 arizona_gpio_direction_in 0 55690 NULL ++wil_vring_alloc_skb_55703 wil_vring_alloc_skb 0-4 55703 NULL nohasharray ++rocker_port_fdb_learn_55703 rocker_port_fdb_learn 0 55703 &wil_vring_alloc_skb_55703 ++genl_allocate_reserve_groups_55705 genl_allocate_reserve_groups 1 55705 NULL ++ixgbe_obtain_mbx_lock_pf_55707 ixgbe_obtain_mbx_lock_pf 0 55707 NULL ++isl1208_i2c_set_regs_55709 isl1208_i2c_set_regs 0 55709 NULL nohasharray ++tcp_push_55709 tcp_push 3 55709 &isl1208_i2c_set_regs_55709 ++nfc_hci_send_cmd_55714 nfc_hci_send_cmd 5 55714 NULL ++uwb_rsv_get_stream_55715 uwb_rsv_get_stream 0 55715 NULL ++pm8001_store_update_fw_55716 pm8001_store_update_fw 4-0 55716 NULL ++store_ringtone_55717 store_ringtone 0-4 55717 NULL ++mtdswap_init_55719 mtdswap_init 2 55719 NULL nohasharray ++ocfs2_lock_refcount_tree_55719 ocfs2_lock_refcount_tree 0 55719 &mtdswap_init_55719 ++btree_readpage_55720 btree_readpage 0 55720 NULL ++typhoon_wakeup_55723 typhoon_wakeup 0 55723 NULL ++da9052_read_tjunc_55726 da9052_read_tjunc 0 55726 NULL ++il3945_show_debug_level_55727 il3945_show_debug_level 0 55727 NULL ++qlcnic_82xx_fw_cmd_create_rx_ctx_55730 qlcnic_82xx_fw_cmd_create_rx_ctx 0 55730 NULL ++tid_fd_revalidate_55734 tid_fd_revalidate 0 55734 NULL nohasharray ++prepare_reply_55734 prepare_reply 4 55734 &tid_fd_revalidate_55734 ++brforward_read_55735 brforward_read 0-5-6 55735 NULL ++__iio_allocate_kfifo_55738 __iio_allocate_kfifo 2-0 55738 NULL ++qla4_8xxx_get_flash_info_55740 qla4_8xxx_get_flash_info 0 55740 NULL ++label_cpu_local_55744 label_cpu_local 0 55744 NULL ++inv_mpu6050_set_lpf_55750 inv_mpu6050_set_lpf 0 55750 NULL nohasharray ++batadv_tvlv_unicast_send_55750 batadv_tvlv_unicast_send 7 55750 &inv_mpu6050_set_lpf_55750 ++st_sensors_spi_read_byte_55754 st_sensors_spi_read_byte 0 55754 NULL ++hfs_writepages_55757 hfs_writepages 0 55757 NULL nohasharray ++wl12xx_spi_raw_read_55757 wl12xx_spi_raw_read 0 55757 &hfs_writepages_55757 nohasharray ++set_local_name_55757 set_local_name 4 55757 &wl12xx_spi_raw_read_55757 ++tx_queue_len_store_55761 tx_queue_len_store 4-0 55761 NULL ++ethtool_copy_validate_indir_55769 ethtool_copy_validate_indir 4 55769 NULL ++regmap_mmio_gather_write_55773 regmap_mmio_gather_write 0 55773 NULL nohasharray ++sync_write_55773 sync_write 0 55773 ®map_mmio_gather_write_55773 ++cxacru_sysfs_showattr_dB_55774 cxacru_sysfs_showattr_dB 0 55774 NULL ++isp1760_urb_enqueue_55777 isp1760_urb_enqueue 0 55777 NULL ++strlen_55778 strlen 0 55778 NULL ++conf_read_55786 conf_read 3-0 55786 NULL nohasharray ++req_bio_endio_55786 req_bio_endio 3 55786 &conf_read_55786 ++tcmu_netlink_event_55791 tcmu_netlink_event 0 55791 NULL ++rtnl_vfinfo_size_55794 rtnl_vfinfo_size 0 55794 NULL ++uwb_rc_neh_grok_event_55799 uwb_rc_neh_grok_event 3 55799 NULL ++ican3_sysfs_set_term_55801 ican3_sysfs_set_term 0-4 55801 NULL ++target_core_dev_show_55803 target_core_dev_show 0 55803 NULL ++w1_master_attribute_show_slaves_55804 w1_master_attribute_show_slaves 0 55804 NULL ++write_fw_55806 write_fw 0-5-6 55806 NULL ++adis_data_rdy_trigger_set_state_55812 adis_data_rdy_trigger_set_state 0 55812 NULL ++show_55816 show 0 55816 NULL ++kvmclock_cpu_notifier_55817 kvmclock_cpu_notifier 0 55817 NULL ++TermCharEnabled_show_55819 TermCharEnabled_show 0 55819 NULL ++crypto_aead_ctxsize_55820 crypto_aead_ctxsize 0 55820 NULL ++blkcg_can_attach_55832 blkcg_can_attach 0 55832 NULL ++twl_i2c_read_55834 twl_i2c_read 0 55834 NULL nohasharray ++ad7879_disable_show_55834 ad7879_disable_show 0 55834 &twl_i2c_read_55834 ++sb16_copy_from_user_55836 sb16_copy_from_user 10-7-6 55836 NULL ++snd_em28xx_prepare_55837 snd_em28xx_prepare 0 55837 NULL ++regmap_field_read_55839 regmap_field_read 0 55839 NULL ++extts_enable_store_55841 extts_enable_store 0-4 55841 NULL ++uvc_set_video_ctrl_55845 uvc_set_video_ctrl 0 55845 NULL ++tps80031_vbus_disable_55847 tps80031_vbus_disable 0 55847 NULL ++rsq_status_55848 rsq_status 0 55848 NULL ++ip_hdrlen_55849 ip_hdrlen 0 55849 NULL nohasharray ++mxt_initialize_55849 mxt_initialize 0 55849 &ip_hdrlen_55849 ++show_temp11_55853 show_temp11 0 55853 NULL nohasharray ++bnx2x_get_eeprom_len_55853 bnx2x_get_eeprom_len 0 55853 &show_temp11_55853 ++lowpan_device_event_55857 lowpan_device_event 0 55857 NULL ++hcd_alloc_coherent_55862 hcd_alloc_coherent 0-5 55862 NULL ++happy_meal_open_55863 happy_meal_open 0 55863 NULL ++status_55864 status 0 55864 NULL nohasharray ++sht21_show_temperature_55864 sht21_show_temperature 0 55864 &status_55864 ++ath6kl_wmi_data_hdr_add_55866 ath6kl_wmi_data_hdr_add 0 55866 NULL ++shmem_setxattr_55867 shmem_setxattr 4-0 55867 NULL ++bad_inode_setattr_55868 bad_inode_setattr 0 55868 NULL ++ab3100_mask_and_set_register_interruptible_55872 ab3100_mask_and_set_register_interruptible 0 55872 NULL ++iwl_mvm_disable_beacon_filter_55873 iwl_mvm_disable_beacon_filter 0 55873 NULL ++hsc_write_55875 hsc_write 3-0 55875 NULL ++nr_listen_55884 nr_listen 0 55884 NULL ++ramdisk_store_55885 ramdisk_store 4-0 55885 NULL ++qla4_8xxx_update_idc_reg_55889 qla4_8xxx_update_idc_reg 0 55889 NULL ++pm_qos_power_read_55891 pm_qos_power_read 3-0 55891 NULL ++tda18271_init_55894 tda18271_init 0 55894 NULL ++sysfs_ctlreg_write_55899 sysfs_ctlreg_write 0-6-5 55899 NULL ++ace_change_mtu_55900 ace_change_mtu 0 55900 NULL ++snd_card_saa7134_capture_trigger_55901 snd_card_saa7134_capture_trigger 0 55901 NULL ++cmos_write_55903 cmos_write 0 55903 NULL ++acpi_ds_eval_table_region_operands_55909 acpi_ds_eval_table_region_operands 0 55909 NULL ++validate_change_55910 validate_change 0 55910 NULL ++hash_ip4_expire_55911 hash_ip4_expire 4 55911 NULL ++map_size_show_55916 map_size_show 0 55916 NULL nohasharray ++xadc_trigger_set_state_55916 xadc_trigger_set_state 0 55916 &map_size_show_55916 ++snd_pcm_hw_param_value_min_55917 snd_pcm_hw_param_value_min 0 55917 NULL nohasharray ++uevent_helper_show_55917 uevent_helper_show 0 55917 &snd_pcm_hw_param_value_min_55917 ++crypto_ablkcipher_setkey_55918 crypto_ablkcipher_setkey 0 55918 NULL ++show_spi_transport_pcomp_en_55923 show_spi_transport_pcomp_en 0 55923 NULL ++ecm_opts_dev_addr_store_55924 ecm_opts_dev_addr_store 0-3 55924 NULL nohasharray ++badblocks_store_55924 badblocks_store 0-3 55924 &ecm_opts_dev_addr_store_55924 ++bit_xfer_55925 bit_xfer 0-3 55925 NULL ++vx_conf_pipe_55934 vx_conf_pipe 0 55934 NULL ++loop_attr_do_show_autoclear_55938 loop_attr_do_show_autoclear 0 55938 NULL nohasharray ++fm10k_update_vlan_vf_55938 fm10k_update_vlan_vf 0 55938 &loop_attr_do_show_autoclear_55938 ++show_priv_session_target_id_55946 show_priv_session_target_id 0 55946 NULL ++sel_read_policy_55947 sel_read_policy 3-0 55947 NULL ++usb_bus_notify_55950 usb_bus_notify 0 55950 NULL ++snd_pcm_do_prepare_55952 snd_pcm_do_prepare 0 55952 NULL ++dn_wait_run_55954 dn_wait_run 0 55954 NULL ++ceph_get_direct_page_vector_55956 ceph_get_direct_page_vector 2 55956 NULL ++simple_read_from_buffer_55957 simple_read_from_buffer 5-2-0 55957 NULL nohasharray ++target_stat_scsi_transport_attr_show_55957 target_stat_scsi_transport_attr_show 0 55957 &simple_read_from_buffer_55957 nohasharray ++drv_set_csma_params_55957 drv_set_csma_params 0 55957 &target_stat_scsi_transport_attr_show_55957 ++ixgb_get_regs_len_55958 ixgb_get_regs_len 0 55958 NULL ++loopback_prepare_55959 loopback_prepare 0 55959 NULL ++shmem_statfs_55960 shmem_statfs 0 55960 NULL ++tx_tx_imm_resp_read_55964 tx_tx_imm_resp_read 3-0 55964 NULL ++init_subctxts_55970 init_subctxts 0 55970 NULL ++query_device_55971 query_device 0 55971 NULL ++__smsc95xx_mdio_read_55980 __smsc95xx_mdio_read 0 55980 NULL ++koneplus_set_actual_profile_55981 koneplus_set_actual_profile 0 55981 NULL ++sk_stream_error_55984 sk_stream_error 0-3 55984 NULL ++wusb_trust_timeout_show_55986 wusb_trust_timeout_show 0 55986 NULL nohasharray ++umask_show_55986 umask_show 0 55986 &wusb_trust_timeout_show_55986 ++wa_xfer_create_subset_sg_55992 wa_xfer_create_subset_sg 2-3 55992 NULL ++dimmdev_dev_type_show_55994 dimmdev_dev_type_show 0 55994 NULL nohasharray ++uv_scir_cpu_notify_55994 uv_scir_cpu_notify 0 55994 &dimmdev_dev_type_show_55994 nohasharray ++niu_reset_rx_mac_55994 niu_reset_rx_mac 0 55994 &uv_scir_cpu_notify_55994 ++SMB2_negotiate_55995 SMB2_negotiate 0 55995 NULL ++trunc_start_55996 trunc_start 0 55996 NULL nohasharray ++_c4iw_write_mem_inline_55996 _c4iw_write_mem_inline 3 55996 &trunc_start_55996 ++epic_open_55997 epic_open 0 55997 NULL ++iscsi_tpg_attrib_store_default_cmdsn_depth_55998 iscsi_tpg_attrib_store_default_cmdsn_depth 0-3 55998 NULL ++show_otp0_56000 show_otp0 0 56000 NULL ++autosuspend_delay_ms_store_56005 autosuspend_delay_ms_store 0-4 56005 NULL ++soft_store_56006 soft_store 0-4 56006 NULL ++tda18271_set_params_56008 tda18271_set_params 0 56008 NULL ++irda_listen_56013 irda_listen 0 56013 NULL nohasharray ++int3403_set_cur_state_56013 int3403_set_cur_state 0 56013 &irda_listen_56013 ++batadv_interface_set_mac_addr_56014 batadv_interface_set_mac_addr 0 56014 NULL ++integrity_tag_size_show_56019 integrity_tag_size_show 0 56019 NULL ++ssb_bus_pcmciabus_register_56020 ssb_bus_pcmciabus_register 3 56020 NULL ++cp_init_rings_56021 cp_init_rings 0 56021 NULL ++hotkey_get_tablet_mode_56028 hotkey_get_tablet_mode 0 56028 NULL nohasharray ++rtl8169_init_ring_56028 rtl8169_init_ring 0 56028 &hotkey_get_tablet_mode_56028 ++acpi_get_name_56030 acpi_get_name 0 56030 NULL ++nfs_write_end_56034 nfs_write_end 0-5 56034 NULL ++vmci_ctx_enqueue_datagram_56035 vmci_ctx_enqueue_datagram 0 56035 NULL ++store_cursor_56036 store_cursor 0-4 56036 NULL ++build_controls_56044 build_controls 0 56044 NULL ++smsc95xx_manage_power_56045 smsc95xx_manage_power 0 56045 NULL ++usb_ocp_write_56047 usb_ocp_write 4 56047 NULL ++qlcnic_show_diag_mode_56049 qlcnic_show_diag_mode 0 56049 NULL ++iwl_trans_read_prph_56052 iwl_trans_read_prph 0 56052 NULL nohasharray ++__igb_open_56052 __igb_open 0 56052 &iwl_trans_read_prph_56052 ++bnad_get_eeprom_len_56053 bnad_get_eeprom_len 0 56053 NULL nohasharray ++visorchannel_get_physaddr_56053 visorchannel_get_physaddr 0 56053 &bnad_get_eeprom_len_56053 ++qh_link_periodic_56055 qh_link_periodic 0 56055 NULL ++show_numbatt_56056 show_numbatt 0 56056 NULL nohasharray ++show_nic_type_56056 show_nic_type 0 56056 &show_numbatt_56056 ++garmin_open_56057 garmin_open 0 56057 NULL nohasharray ++mwifiex_wait_queue_complete_56057 mwifiex_wait_queue_complete 0 56057 &garmin_open_56057 nohasharray ++wdt_restart_handle_56057 wdt_restart_handle 0 56057 &mwifiex_wait_queue_complete_56057 ++dccp_sendmsg_56058 dccp_sendmsg 4-0 56058 NULL ++acm_tty_write_56064 acm_tty_write 0-3 56064 NULL ++pm80x_rtc_read_time_56065 pm80x_rtc_read_time 0 56065 NULL ++may_follow_link_56073 may_follow_link 0 56073 NULL ++show_fc_rport_scsi_target_id_56077 show_fc_rport_scsi_target_id 0 56077 NULL nohasharray ++qp_dequeue_locked_56077 qp_dequeue_locked 3-0-5 56077 &show_fc_rport_scsi_target_id_56077 ++nilfs_segctor_create_checkpoint_56078 nilfs_segctor_create_checkpoint 0 56078 NULL ++acpi_power_get_state_56083 acpi_power_get_state 0 56083 NULL ++vsc824x_config_init_56086 vsc824x_config_init 0 56086 NULL ++debugfs_reg_access_56087 debugfs_reg_access 0 56087 NULL ++qlcnic_hwmon_show_temp_56088 qlcnic_hwmon_show_temp 0 56088 NULL ++gpio_direction_output_56094 gpio_direction_output 0 56094 NULL ++pci_user_write_config_dword_56099 pci_user_write_config_dword 0 56099 NULL ++pscsi_get_bio_56103 pscsi_get_bio 1 56103 NULL ++em28xx_write_reg_bits_56107 em28xx_write_reg_bits 0 56107 NULL nohasharray ++v9fs_launder_page_56107 v9fs_launder_page 0 56107 &em28xx_write_reg_bits_56107 ++rmd256_update_56110 rmd256_update 0 56110 NULL ++usb_alloc_stream_buffers_56123 usb_alloc_stream_buffers 3 56123 NULL nohasharray ++show_als_attr_56123 show_als_attr 0 56123 &usb_alloc_stream_buffers_56123 ++hsi_async_write_56124 hsi_async_write 0 56124 NULL ++ieee802154_sechdr_authtag_len_56129 ieee802154_sechdr_authtag_len 0 56129 NULL ++sctp_add_bind_addr_56130 sctp_add_bind_addr 0 56130 NULL nohasharray ++crypto_comp_decompress_56130 crypto_comp_decompress 0 56130 &sctp_add_bind_addr_56130 ++dlfb_ops_check_var_56132 dlfb_ops_check_var 0 56132 NULL ++acpi_ds_get_buffer_field_arguments_56137 acpi_ds_get_buffer_field_arguments 0 56137 NULL ++sel_read_handle_status_56139 sel_read_handle_status 3-0 56139 NULL nohasharray ++fs_open_56139 fs_open 0 56139 &sel_read_handle_status_56139 ++dib8096p_tuner_rw_serpar_56144 dib8096p_tuner_rw_serpar 0-3 56144 NULL nohasharray ++extra_show_56144 extra_show 0 56144 &dib8096p_tuner_rw_serpar_56144 nohasharray ++map_addr_56144 map_addr 7 56144 &extra_show_56144 ++write_file_frameerrors_56145 write_file_frameerrors 3-0 56145 NULL ++__uwb_rc_cmd_56148 __uwb_rc_cmd 0 56148 NULL ++check_auto_mute_availability_56150 check_auto_mute_availability 0 56150 NULL ++lpfc_XLanePriority_store_56153 lpfc_XLanePriority_store 0-4 56153 NULL ++add_extent_mapping_56157 add_extent_mapping 0 56157 NULL ++netlbl_cfg_unlbl_static_del_56158 netlbl_cfg_unlbl_static_del 0 56158 NULL ++store_slidebar_mode_56160 store_slidebar_mode 0-4 56160 NULL ++__i2c_transfer_56162 __i2c_transfer 0-3 56162 NULL ++xfs_attr_shortform_addname_56164 xfs_attr_shortform_addname 0 56164 NULL ++rawv6_setsockopt_56165 rawv6_setsockopt 5-0 56165 NULL nohasharray ++mptscsih_board_name_show_56165 mptscsih_board_name_show 0 56165 &rawv6_setsockopt_56165 nohasharray ++affs_notify_change_56165 affs_notify_change 0 56165 &mptscsih_board_name_show_56165 ++aac_show_bios_version_56173 aac_show_bios_version 0 56173 NULL ++power_limit_1_tmin_us_show_56177 power_limit_1_tmin_us_show 0 56177 NULL ++change_qos_56178 change_qos 0 56178 NULL ++complain_error_56186 complain_error 0-1 56186 NULL ++snd_m3_pcm_trigger_56189 snd_m3_pcm_trigger 0 56189 NULL nohasharray ++hfs_find_init_56189 hfs_find_init 0 56189 &snd_m3_pcm_trigger_56189 ++ip_vs_reply4_56190 ip_vs_reply4 0 56190 NULL nohasharray ++bnx2x_validate_addr_56190 bnx2x_validate_addr 0 56190 &ip_vs_reply4_56190 ++azx_pcm_trigger_56193 azx_pcm_trigger 0 56193 NULL ++ath9k_dump_legacy_btcoex_56194 ath9k_dump_legacy_btcoex 3-0 56194 NULL ++show_fc_host_npiv_vports_inuse_56196 show_fc_host_npiv_vports_inuse 0 56196 NULL ++amd_uncore_cpu_notifier_56203 amd_uncore_cpu_notifier 0 56203 NULL ++qla4_82xx_rcvpeg_ready_56206 qla4_82xx_rcvpeg_ready 0 56206 NULL ++gluebi_notify_56213 gluebi_notify 0 56213 NULL ++i40e_vsi_control_tx_56215 i40e_vsi_control_tx 0 56215 NULL ++isp116x_urb_enqueue_56219 isp116x_urb_enqueue 0 56219 NULL ++ocfs2_find_xe_in_bucket_56224 ocfs2_find_xe_in_bucket 0 56224 NULL ++iwl_dbgfs_bcast_filters_write_56225 iwl_dbgfs_bcast_filters_write 0-3 56225 NULL ++cp210x_get_config_56229 cp210x_get_config 4 56229 NULL ++show_cursor_blink_56236 show_cursor_blink 0 56236 NULL ++do_ipt_set_ctl_56238 do_ipt_set_ctl 4 56238 NULL ++fd_copyin_56247 fd_copyin 3 56247 NULL ++nv_device_resource_len_56251 nv_device_resource_len 0 56251 NULL ++ax_header_56252 ax_header 0 56252 NULL ++lpfc_use_adisc_store_56254 lpfc_use_adisc_store 0-4 56254 NULL ++fm10k_get_regs_len_56259 fm10k_get_regs_len 0 56259 NULL ++set_otp1en_56264 set_otp1en 4-0 56264 NULL ++clk_enable_56265 clk_enable 0 56265 NULL ++qib_set_part_key_56267 qib_set_part_key 0 56267 NULL ++acpi_ex_get_serial_access_length_56275 acpi_ex_get_serial_access_length 0-2 56275 NULL ++il4965_ucode_general_stats_read_56277 il4965_ucode_general_stats_read 3-0 56277 NULL ++mgt_commit_list_56281 mgt_commit_list 0 56281 NULL ++ieee80211_if_fmt_user_power_level_56283 ieee80211_if_fmt_user_power_level 3 56283 NULL ++pci_dev_reset_56285 pci_dev_reset 0 56285 NULL ++RESIZE_IF_NEEDED_56286 RESIZE_IF_NEEDED 2 56286 NULL ++bql_show_limit_56292 bql_show_limit 0 56292 NULL ++dvb_aplay_56296 dvb_aplay 3-0 56296 NULL ++parport_ieee1284_read_byte_56300 parport_ieee1284_read_byte 0 56300 NULL nohasharray ++ubifs_tnc_end_commit_56300 ubifs_tnc_end_commit 0 56300 &parport_ieee1284_read_byte_56300 nohasharray ++iwl_mvm_mac_ctxt_cmd_ap_56300 iwl_mvm_mac_ctxt_cmd_ap 0 56300 &ubifs_tnc_end_commit_56300 ++inode_permission_56303 inode_permission 0 56303 NULL nohasharray ++btmrvl_hscfgcmd_read_56303 btmrvl_hscfgcmd_read 3-0 56303 &inode_permission_56303 ++tg_set_conf_uint_56306 tg_set_conf_uint 3-0 56306 NULL ++store_bpdu_guard_56307 store_bpdu_guard 0 56307 NULL nohasharray ++register_mem_sect_under_node_56307 register_mem_sect_under_node 0 56307 &store_bpdu_guard_56307 ++ksz9021_rd_mmd_phyreg_56309 ksz9021_rd_mmd_phyreg 0 56309 NULL ++erst_exec_subtract_56310 erst_exec_subtract 0 56310 NULL nohasharray ++speakup_file_write_56310 speakup_file_write 3 56310 &erst_exec_subtract_56310 ++linear_add_56314 linear_add 0 56314 NULL ++patch_stac92hd83xxx_56315 patch_stac92hd83xxx 0 56315 NULL ++show_constraint_max_power_uw_56319 show_constraint_max_power_uw 0 56319 NULL nohasharray ++ax88172_link_reset_56319 ax88172_link_reset 0 56319 &show_constraint_max_power_uw_56319 ++pipeline_pre_to_defrag_swi_read_56321 pipeline_pre_to_defrag_swi_read 3-0 56321 NULL ++idtg2_show_errlog_56322 idtg2_show_errlog 0 56322 NULL ++qlcnic_83xx_store_beacon_56330 qlcnic_83xx_store_beacon 0-3 56330 NULL ++journal_init_revoke_table_56331 journal_init_revoke_table 1 56331 NULL ++axnet_suspend_56334 axnet_suspend 0 56334 NULL ++snd_rawmidi_read_56337 snd_rawmidi_read 3-0 56337 NULL ++show_fcoe_ctlr_device_fcf_dev_loss_tmo_56343 show_fcoe_ctlr_device_fcf_dev_loss_tmo 0 56343 NULL ++show_line2_56346 show_line2 0 56346 NULL ++read_human_status_56349 read_human_status 0 56349 NULL ++ov6550_s_ctrl_56351 ov6550_s_ctrl 0 56351 NULL ++snd_via8233_playback_prepare_56359 snd_via8233_playback_prepare 0 56359 NULL ++bnx2fc_vport_create_56364 bnx2fc_vport_create 0 56364 NULL ++regmap_i2c_write_56365 regmap_i2c_write 0-3 56365 NULL nohasharray ++qd_get_56365 qd_get 0 56365 ®map_i2c_write_56365 ++show_oo_req_56366 show_oo_req 0 56366 NULL nohasharray ++asix_sw_reset_56366 asix_sw_reset 0 56366 &show_oo_req_56366 ++iov_iter_copy_from_user_atomic_56368 iov_iter_copy_from_user_atomic 4-0 56368 NULL nohasharray ++sctp_cmd_process_sack_56368 sctp_cmd_process_sack 0 56368 &iov_iter_copy_from_user_atomic_56368 ++dev_read_56369 dev_read 3-0 56369 NULL nohasharray ++ims_pcu_send_cmd_chunk_56369 ims_pcu_send_cmd_chunk 0 56369 &dev_read_56369 ++ath10k_read_simulate_fw_crash_56371 ath10k_read_simulate_fw_crash 3-0 56371 NULL ++iio_device_add_info_mask_type_56373 iio_device_add_info_mask_type 0 56373 NULL nohasharray ++usb_xfer_56373 usb_xfer 0-3 56373 &iio_device_add_info_mask_type_56373 nohasharray ++store_56373 store 0-3 56373 &usb_xfer_56373 ++wacom_btnimg5_store_56378 wacom_btnimg5_store 4-0 56378 NULL ++gadget_config_name_attr_show_56381 gadget_config_name_attr_show 0 56381 NULL ++s5h1420_tuner_i2c_tuner_xfer_56382 s5h1420_tuner_i2c_tuner_xfer 0-3 56382 NULL nohasharray ++key_seal_56382 key_seal 0 56382 &s5h1420_tuner_i2c_tuner_xfer_56382 ++ldo_regulator_disable_56383 ldo_regulator_disable 0 56383 NULL nohasharray ++b44_get_invariants_56383 b44_get_invariants 0 56383 &ldo_regulator_disable_56383 ++show_iface_redirect_en_56384 show_iface_redirect_en 0 56384 NULL ++res_get_56393 res_get 0 56393 NULL ++strtobool_56399 strtobool 0 56399 NULL ++ocfs2_loaded_cluster_plugins_show_56401 ocfs2_loaded_cluster_plugins_show 0 56401 NULL ++store_prochot_override_duty_cycle_56402 store_prochot_override_duty_cycle 0-4 56402 NULL nohasharray ++e1000_alloc_rx_skb_56402 e1000_alloc_rx_skb 2 56402 &store_prochot_override_duty_cycle_56402 ++niu_init_zcp_56403 niu_init_zcp 0 56403 NULL ++write_gssp_56404 write_gssp 3-0 56404 NULL ++ocfs2_control_read_56405 ocfs2_control_read 3-0 56405 NULL ++acpi_ds_eval_data_object_operands_56406 acpi_ds_eval_data_object_operands 0 56406 NULL ++SMB2_open_56407 SMB2_open 0 56407 NULL ++target_core_alua_lu_gp_store_attr_lu_gp_id_56409 target_core_alua_lu_gp_store_attr_lu_gp_id 0-3 56409 NULL ++do_get_write_access_56410 do_get_write_access 0 56410 NULL ++__get_vm_area_caller_56416 __get_vm_area_caller 1 56416 NULL nohasharray ++acpi_os_write_memory_56416 acpi_os_write_memory 1-3 56416 &__get_vm_area_caller_56416 nohasharray ++_cx25821_stop_audio_dma_56416 _cx25821_stop_audio_dma 0 56416 &acpi_os_write_memory_56416 nohasharray ++set_phy_flash_cfg_56416 set_phy_flash_cfg 0-4 56416 &_cx25821_stop_audio_dma_56416 ++store_msg_56417 store_msg 3 56417 NULL ++app_tag_own_show_56418 app_tag_own_show 0 56418 NULL ++pppol2tp_sendmsg_56420 pppol2tp_sendmsg 4-0 56420 NULL ++at86rf230_sync_state_change_56422 at86rf230_sync_state_change 0 56422 NULL nohasharray ++ath10k_mac_txpower_setup_56422 ath10k_mac_txpower_setup 0 56422 &at86rf230_sync_state_change_56422 ++l2cap_segment_le_sdu_56426 l2cap_segment_le_sdu 4 56426 NULL ++vsock_listen_56427 vsock_listen 0 56427 NULL ++mddev_lock_56428 mddev_lock 0 56428 NULL ++wl1271_acx_ap_rate_policy_56430 wl1271_acx_ap_rate_policy 0 56430 NULL nohasharray ++syscore_suspend_56430 syscore_suspend 0 56430 &wl1271_acx_ap_rate_policy_56430 ++ec_dbgfs_cmd_read_56431 ec_dbgfs_cmd_read 3 56431 NULL nohasharray ++lprocfs_fid_space_seq_write_56431 lprocfs_fid_space_seq_write 3 56431 &ec_dbgfs_cmd_read_56431 ++omninet_write_56432 omninet_write 0-4 56432 NULL ++fl_create_56435 fl_create 5 56435 NULL nohasharray ++iscsi_tpg_attrib_show_cache_dynamic_acls_56435 iscsi_tpg_attrib_show_cache_dynamic_acls 0 56435 &fl_create_56435 ++gnttab_map_56439 gnttab_map 2 56439 NULL ++get_linkerrors_56444 get_linkerrors 0 56444 NULL ++cifs_getxattr_56445 cifs_getxattr 0 56445 NULL ++show_ipv4_iface_tos_56446 show_ipv4_iface_tos 0 56446 NULL ++i2400m_idle_timeout_store_56450 i2400m_idle_timeout_store 0-4 56450 NULL ++cx231xx_init_isoc_56453 cx231xx_init_isoc 3-4-2-0 56453 NULL ++wl1271_acx_sleep_auth_56455 wl1271_acx_sleep_auth 0 56455 NULL ++pcf8563_set_alarm_mode_56456 pcf8563_set_alarm_mode 0 56456 NULL ++show_ideapad_cam_56457 show_ideapad_cam 0 56457 NULL ++set_connectable_56458 set_connectable 4 56458 NULL ++sdev_store_evt_mode_parameter_change_reported_56461 sdev_store_evt_mode_parameter_change_reported 0-4 56461 NULL ++lif_s_stream_56462 lif_s_stream 0 56462 NULL nohasharray ++nfc_hci_send_response_56462 nfc_hci_send_response 5 56462 &lif_s_stream_56462 ++osd_req_list_partition_objects_56464 osd_req_list_partition_objects 5 56464 NULL nohasharray ++make_pnode_dirty_56464 make_pnode_dirty 0 56464 &osd_req_list_partition_objects_56464 ++wl1251_hw_init_hwenc_config_56465 wl1251_hw_init_hwenc_config 0 56465 NULL ++putused_user_56467 putused_user 3 56467 NULL ++lbs_rdmac_write_56471 lbs_rdmac_write 3-0 56471 NULL ++phy_write_56475 phy_write 0 56475 NULL nohasharray ++bond_option_arp_ip_target_rem_56475 bond_option_arp_ip_target_rem 0 56475 &phy_write_56475 ++handle_eject_request_56476 handle_eject_request 0 56476 NULL ++ds1511_nvram_read_56477 ds1511_nvram_read 0-5-6 56477 NULL ++wl1271_cmd_template_set_56480 wl1271_cmd_template_set 0 56480 NULL ++e100_get_eeprom_len_56481 e100_get_eeprom_len 0 56481 NULL ++bsp_check_56487 bsp_check 0 56487 NULL ++hdcs_set_exposure_56491 hdcs_set_exposure 0 56491 NULL nohasharray ++show_iface_data_pdu_in_order_56491 show_iface_data_pdu_in_order 0 56491 &hdcs_set_exposure_56491 nohasharray ++ieee80211_rx_mgmt_probe_beacon_56491 ieee80211_rx_mgmt_probe_beacon 3 56491 &show_iface_data_pdu_in_order_56491 ++nfs_namespace_getattr_56496 nfs_namespace_getattr 0 56496 NULL ++regcache_lzo_decompress_56499 regcache_lzo_decompress 0 56499 NULL ++memblock_virt_alloc_56501 memblock_virt_alloc 1 56501 NULL ++ad7877_disable_store_56502 ad7877_disable_store 0-4 56502 NULL ++show_in_value_56503 show_in_value 0 56503 NULL ++init_map_ip_56508 init_map_ip 5 56508 NULL ++lpfc_enable_hba_heartbeat_show_56509 lpfc_enable_hba_heartbeat_show 0 56509 NULL ++efx_mcdi_rpc_start_56510 efx_mcdi_rpc_start 0 56510 NULL ++lustre_posix_acl_xattr_reduce_space_56512 lustre_posix_acl_xattr_reduce_space 3 56512 NULL ++ip6_blackhole_mtu_56513 ip6_blackhole_mtu 0 56513 NULL ++cfg80211_connect_result_56515 cfg80211_connect_result 6-4 56515 NULL ++hotkey_wakeup_hotunplug_complete_show_56521 hotkey_wakeup_hotunplug_complete_show 0 56521 NULL ++get_temp_56524 get_temp 0 56524 NULL ++issue_thinkpad_cmos_command_56535 issue_thinkpad_cmos_command 0 56535 NULL ++l1oip_socket_recv_56537 l1oip_socket_recv 6 56537 NULL ++ip_options_get_56538 ip_options_get 4 56538 NULL ++vmci_datagram_get_priv_flags_56540 vmci_datagram_get_priv_flags 0 56540 NULL ++ia_open_56543 ia_open 0 56543 NULL ++ll_wr_track_id_56544 ll_wr_track_id 2 56544 NULL ++megasas_sysfs_show_version_56547 megasas_sysfs_show_version 0 56547 NULL nohasharray ++tcp_cwnd_test_56547 tcp_cwnd_test 0 56547 &megasas_sysfs_show_version_56547 ++ip_vs_prepare_tunneled_skb_56550 ip_vs_prepare_tunneled_skb 3 56550 NULL ++skein_512_update_56556 skein_512_update 0 56556 NULL ++vim2m_start_streaming_56558 vim2m_start_streaming 0 56558 NULL nohasharray ++xs_watch_56558 xs_watch 0 56558 &vim2m_start_streaming_56558 nohasharray ++mmc_blk_probe_56558 mmc_blk_probe 0 56558 &xs_watch_56558 ++alloc_apertures_56561 alloc_apertures 1 56561 NULL nohasharray ++ali_notify_sys_56561 ali_notify_sys 0 56561 &alloc_apertures_56561 ++forward_delay_show_56565 forward_delay_show 0 56565 NULL ++adp5520_bl_office_max_show_56572 adp5520_bl_office_max_show 0 56572 NULL ++rs_sta_dbgfs_stats_table_read_56573 rs_sta_dbgfs_stats_table_read 3-0 56573 NULL ++macvtap_read_iter_56580 macvtap_read_iter 0 56580 NULL ++portcntrs_2_read_56586 portcntrs_2_read 3-0 56586 NULL ++input_dev_show_id_vendor_56590 input_dev_show_id_vendor 0 56590 NULL ++acpi_ex_convert_to_string_56591 acpi_ex_convert_to_string 0 56591 NULL ++w1_f12_write_output_56594 w1_f12_write_output 0-6-5 56594 NULL ++dmi_sel_raw_read_56601 dmi_sel_raw_read 0-5-6 56601 NULL ++set_dec_all_56602 set_dec_all 4-0 56602 NULL ++event_filter_write_56609 event_filter_write 3 56609 NULL ++ocrdma_inet6addr_event_56610 ocrdma_inet6addr_event 0 56610 NULL ++nvme_trans_log_temperature_56613 nvme_trans_log_temperature 3 56613 NULL ++cx2341x_try_ctrl_56620 cx2341x_try_ctrl 0 56620 NULL ++show_56623 show 0 56623 NULL nohasharray ++store_temp_pwm_enable_56623 store_temp_pwm_enable 0-4 56623 &show_56623 ++cifs_flush_file_56628 cifs_flush_file 0 56628 NULL ++mct_u232_open_56631 mct_u232_open 0 56631 NULL ++_nfs4_proc_mkdir_56633 _nfs4_proc_mkdir 0 56633 NULL ++ov7660_set_hvflip_56639 ov7660_set_hvflip 0 56639 NULL ++gather_array_56641 gather_array 3 56641 NULL ++show_ipv6_iface_mld_en_56648 show_ipv6_iface_mld_en 0 56648 NULL nohasharray ++snd_card_register_56648 snd_card_register 0 56648 &show_ipv6_iface_mld_en_56648 ++ceph_vxattrcb_dir_subdirs_56649 ceph_vxattrcb_dir_subdirs 0 56649 NULL nohasharray ++show_56649 show 0 56649 &ceph_vxattrcb_dir_subdirs_56649 ++uvc_debugfs_stats_read_56651 uvc_debugfs_stats_read 3-0 56651 NULL ++lxt970_config_init_56653 lxt970_config_init 0 56653 NULL nohasharray ++qla2x00_reset_chip_56653 qla2x00_reset_chip 0 56653 &lxt970_config_init_56653 ++show_bank2_setting_56655 show_bank2_setting 0 56655 NULL ++qlcnic_sysfs_get_esw_stats_56657 qlcnic_sysfs_get_esw_stats 0-6-5 56657 NULL ++clk_nodrv_prepare_enable_56659 clk_nodrv_prepare_enable 0 56659 NULL ++wake_up_wlan_show_56660 wake_up_wlan_show 0 56660 NULL ++fc_rport_set_dev_loss_tmo_56661 fc_rport_set_dev_loss_tmo 0 56661 NULL ++tps6586x_rtc_alarm_irq_enable_56662 tps6586x_rtc_alarm_irq_enable 0 56662 NULL ++show_ctlr_mode_56665 show_ctlr_mode 0 56665 NULL nohasharray ++rndis_wlan_reset_56665 rndis_wlan_reset 0 56665 &show_ctlr_mode_56665 ++fm_config_rx_mute_reg_56667 fm_config_rx_mute_reg 0 56667 NULL ++gdm_dev16_to_cpu_56668 gdm_dev16_to_cpu 0-2 56668 NULL ++mem_used_total_show_56672 mem_used_total_show 0 56672 NULL ++reconfig_store_56674 reconfig_store 0-4 56674 NULL ++btrfs_cow_block_56678 btrfs_cow_block 0 56678 NULL ++show_ipv6_iface_hop_limit_56679 show_ipv6_iface_hop_limit 0 56679 NULL ++iscsi_tpg_param_show_IFMarkInt_56682 iscsi_tpg_param_show_IFMarkInt 0 56682 NULL ++mtd_read_fact_prot_reg_56683 mtd_read_fact_prot_reg 0 56683 NULL ++netlink_getname_56685 netlink_getname 0 56685 NULL nohasharray ++target_stat_scsi_transport_attr_store_56685 target_stat_scsi_transport_attr_store 0 56685 &netlink_getname_56685 ++da9055_gpio_to_irq_56686 da9055_gpio_to_irq 2 56686 NULL nohasharray ++o2nm_node_num_write_56686 o2nm_node_num_write 0-3 56686 &da9055_gpio_to_irq_56686 nohasharray ++snd_gus_dram_read_56686 snd_gus_dram_read 4 56686 &o2nm_node_num_write_56686 ++sd_done_56689 sd_done 0 56689 NULL ++set_promiscuous_mode_56691 set_promiscuous_mode 0 56691 NULL ++dm9601_get_eeprom_len_56697 dm9601_get_eeprom_len 0 56697 NULL ++dvb_ringbuffer_read_user_56702 dvb_ringbuffer_read_user 0-3 56702 NULL ++atl1c_get_regs_len_56705 atl1c_get_regs_len 0 56705 NULL ++qla4xxx_fw_build_user_show_56706 qla4xxx_fw_build_user_show 0 56706 NULL ++extract_attr_from_ios_56709 extract_attr_from_ios 0 56709 NULL nohasharray ++conn_send_command_56709 conn_send_command 4-6 56709 &extract_attr_from_ios_56709 ++sta_flags_read_56710 sta_flags_read 3-0 56710 NULL nohasharray ++hibernation_snapshot_56710 hibernation_snapshot 0 56710 &sta_flags_read_56710 ++ipv6_getsockopt_sticky_56711 ipv6_getsockopt_sticky 5 56711 NULL ++brcms_up_56713 brcms_up 0 56713 NULL nohasharray ++twl6030_pwmled_config_56713 twl6030_pwmled_config 0 56713 &brcms_up_56713 ++xfs_btree_decrement_56718 xfs_btree_decrement 0 56718 NULL ++acpi_os_wait_semaphore_56719 acpi_os_wait_semaphore 0 56719 NULL ++__hw_addr_add_ex_56720 __hw_addr_add_ex 0 56720 NULL ++perf_event_mux_interval_ms_show_56723 perf_event_mux_interval_ms_show 0 56723 NULL ++__wa_xfer_setup_segs_56725 __wa_xfer_setup_segs 0-2 56725 NULL nohasharray ++ds2780_set_rsgain_setting_56725 ds2780_set_rsgain_setting 0-4 56725 &__wa_xfer_setup_segs_56725 ++wm831x_isink_enable_56730 wm831x_isink_enable 0 56730 NULL ++m41t80_rtc_read_time_56736 m41t80_rtc_read_time 0 56736 NULL ++__copy_from_user_ll_56738 __copy_from_user_ll 0 56738 NULL ++show_cons_active_56740 show_cons_active 0 56740 NULL nohasharray ++niu_alloc_channels_56740 niu_alloc_channels 0 56740 &show_cons_active_56740 nohasharray ++reset_temp_history_56740 reset_temp_history 0-4 56740 &niu_alloc_channels_56740 ++drm_agp_bind_pages_56748 drm_agp_bind_pages 3 56748 NULL ++btrfsic_map_block_56751 btrfsic_map_block 2 56751 NULL ++__logfs_writepage_56752 __logfs_writepage 0 56752 NULL ++ov7670_try_fmt_internal_56754 ov7670_try_fmt_internal 0 56754 NULL nohasharray ++get_temp2_fault_56754 get_temp2_fault 0 56754 &ov7670_try_fmt_internal_56754 ++pm8001_ctl_max_devices_show_56759 pm8001_ctl_max_devices_show 0 56759 NULL ++nilfs_btree_prepare_propagate_v_56762 nilfs_btree_prepare_propagate_v 0 56762 NULL ++dm_attr_uuid_show_56774 dm_attr_uuid_show 0 56774 NULL ++alloc_iommu_56778 alloc_iommu 2-3-0 56778 NULL ++ore_get_io_state_56779 ore_get_io_state 0 56779 NULL nohasharray ++orinoco_open_56779 orinoco_open 0 56779 &ore_get_io_state_56779 ++__carl9170_rx_56784 __carl9170_rx 3 56784 NULL ++bq2415x_i2c_write_bit_56787 bq2415x_i2c_write_bit 0 56787 NULL ++firmware_id_show_56790 firmware_id_show 0 56790 NULL nohasharray ++smsc95xx_phy_initialize_56790 smsc95xx_phy_initialize 0 56790 &firmware_id_show_56790 ++ttm_alloc_new_pages_56792 ttm_alloc_new_pages 5 56792 NULL ++nilfs_sufile_get_header_block_56794 nilfs_sufile_get_header_block 0 56794 NULL ++sdo_s_stream_56795 sdo_s_stream 0 56795 NULL ++ecryptfs_set_f_namelen_56796 ecryptfs_set_f_namelen 0 56796 NULL ++tun_net_open_56800 tun_net_open 0 56800 NULL ++backlog_store_56804 backlog_store 0-3 56804 NULL ++read_indexes_56805 read_indexes 2-0 56805 NULL nohasharray ++vfat_hashi_56805 vfat_hashi 0 56805 &read_indexes_56805 ++ion_ioctl_56806 ion_ioctl 2 56806 NULL ++do_syslog_56807 do_syslog 3-0 56807 NULL ++target_stat_scsi_lu_show_attr_vend_56808 target_stat_scsi_lu_show_attr_vend 0 56808 NULL ++rdev_attr_show_56809 rdev_attr_show 0 56809 NULL nohasharray ++exofs_update_inode_56809 exofs_update_inode 0 56809 &rdev_attr_show_56809 ++acpi_evaluate_object_56815 acpi_evaluate_object 0 56815 NULL ++show_sys_acpi_56816 show_sys_acpi 0 56816 NULL ++brightness_write_56821 brightness_write 0 56821 NULL nohasharray ++mic_dma_unmap_page_56821 mic_dma_unmap_page 2 56821 &brightness_write_56821 ++rbd_features_show_56824 rbd_features_show 0 56824 NULL ++mlx4_en_start_port_56826 mlx4_en_start_port 0 56826 NULL ++lookup_slow_56827 lookup_slow 0 56827 NULL ++ntfs_rl_realloc_56831 ntfs_rl_realloc 3 56831 NULL nohasharray ++mtdchar_write_56831 mtdchar_write 3-0 56831 &ntfs_rl_realloc_56831 ++solo_enc_start_streaming_56834 solo_enc_start_streaming 0 56834 NULL ++snd_rawmidi_kernel_write1_56847 snd_rawmidi_kernel_write1 4-0 56847 NULL ++mlx5_buf_alloc_56848 mlx5_buf_alloc 2 56848 NULL ++si476x_radio_read_agc_blob_56849 si476x_radio_read_agc_blob 3-0 56849 NULL ++mlx4_en_get_qp_56851 mlx4_en_get_qp 0 56851 NULL ++twl4030reg_get_status_56852 twl4030reg_get_status 0 56852 NULL ++identify_fw_56853 identify_fw 0 56853 NULL ++mxl5007t_set_params_56856 mxl5007t_set_params 0 56856 NULL nohasharray ++header_create_56856 header_create 0 56856 &mxl5007t_set_params_56856 ++__uncore_filter_link_show_56859 __uncore_filter_link_show 0 56859 NULL ++adp8860_show_56860 adp8860_show 0 56860 NULL ++cros_ec_cmd_xfer_56862 cros_ec_cmd_xfer 0 56862 NULL ++gk20a_ram_get_56863 gk20a_ram_get 2 56863 NULL nohasharray ++max197_show_range_56863 max197_show_range 0 56863 &gk20a_ram_get_56863 nohasharray ++target_stat_scsi_auth_intr_show_attr_inst_56863 target_stat_scsi_auth_intr_show_attr_inst 0 56863 &max197_show_range_56863 nohasharray ++dlfb_setup_modes_56863 dlfb_setup_modes 0 56863 &target_stat_scsi_auth_intr_show_attr_inst_56863 ++check_export_56865 check_export 0 56865 NULL ++store_sched7_56868 store_sched7 0-4 56868 NULL ++mwl8k_cmd_get_stat_56876 mwl8k_cmd_get_stat 0 56876 NULL ++ims_pcu_ofn_bit_store_56878 ims_pcu_ofn_bit_store 0-4 56878 NULL ++ext3_xattr_ibody_get_56880 ext3_xattr_ibody_get 0 56880 NULL ++bitmap_init_from_disk_56884 bitmap_init_from_disk 0 56884 NULL ++vfio_raw_config_write_56885 vfio_raw_config_write 0-3 56885 NULL ++ov9740_reg_rmw_56888 ov9740_reg_rmw 0 56888 NULL ++pvr2_debugifc_print_status_56890 pvr2_debugifc_print_status 3 56890 NULL nohasharray ++gfs2_recover_set_56890 gfs2_recover_set 0 56890 &pvr2_debugifc_print_status_56890 ++enic_dev_notify_set_56891 enic_dev_notify_set 0 56891 NULL ++debug_debug3_read_56894 debug_debug3_read 3-0 56894 NULL ++batadv_tt_update_changes_56895 batadv_tt_update_changes 3 56895 NULL ++show_fnode_erl_56896 show_fnode_erl 0 56896 NULL ++pktgen_add_device_56898 pktgen_add_device 0 56898 NULL ++hfsplus_find_cat_56899 hfsplus_find_cat 0 56899 NULL ++rio_open_56900 rio_open 0 56900 NULL ++arp_mangle_56902 arp_mangle 0 56902 NULL ++sys_dmi_field_show_56905 sys_dmi_field_show 0 56905 NULL ++fm10k_pfvf_mbx_init_56911 fm10k_pfvf_mbx_init 0 56911 NULL ++strcspn_56913 strcspn 0 56913 NULL ++i801_transaction_56919 i801_transaction 0 56919 NULL ++uhid_hid_output_raw_56921 uhid_hid_output_raw 0-3 56921 NULL ++__kfifo_out_56927 __kfifo_out 0-3 56927 NULL ++mtd_subpagesize_show_56928 mtd_subpagesize_show 0 56928 NULL ++check_header_56930 check_header 2 56930 NULL ++gpio_edge_show_56931 gpio_edge_show 0 56931 NULL ++bnx2x_phy_init_56932 bnx2x_phy_init 0 56932 NULL ++journal_init_revoke_56933 journal_init_revoke 2 56933 NULL ++read_56934 read 0 56934 NULL ++bond_alb_init_slave_56936 bond_alb_init_slave 0 56936 NULL ++set_temp_min_56937 set_temp_min 0-4 56937 NULL ++set_property_56939 set_property 0 56939 NULL ++tpu_pwm_timer_start_56940 tpu_pwm_timer_start 0 56940 NULL ++xfs_alloc_ag_vextent_56943 xfs_alloc_ag_vextent 0 56943 NULL ++iscsi_nacl_param_show_DataPDUInOrder_56949 iscsi_nacl_param_show_DataPDUInOrder 0 56949 NULL ++nouveau_xtensa_create__56952 nouveau_xtensa_create_ 8 56952 NULL ++cirrusfb_set_par_56956 cirrusfb_set_par 0 56956 NULL ++cw1200_set_uapsd_param_56957 cw1200_set_uapsd_param 0 56957 NULL nohasharray ++iwl_send_static_wepkey_cmd_56957 iwl_send_static_wepkey_cmd 0 56957 &cw1200_set_uapsd_param_56957 ++ovs_flow_cmd_msg_size_56959 ovs_flow_cmd_msg_size 0 56959 NULL ++show_fcoe_fcf_device_dev_loss_tmo_56966 show_fcoe_fcf_device_dev_loss_tmo 0 56966 NULL ++diva_get_driver_info_56967 diva_get_driver_info 0 56967 NULL ++sdev_store_eh_timeout_56971 sdev_store_eh_timeout 0-4 56971 NULL ++rx_queue_attr_store_56972 rx_queue_attr_store 0-4 56972 NULL ++ext4_readpage_56973 ext4_readpage 0 56973 NULL ++show_pwm_max_56976 show_pwm_max 0 56976 NULL ++enc28j60_set_mac_address_56979 enc28j60_set_mac_address 0 56979 NULL ++read_56981 read 0 56981 NULL ++vmci_transport_notify_pkt_recv_pre_dequeue_56988 vmci_transport_notify_pkt_recv_pre_dequeue 0 56988 NULL nohasharray ++default_write_file_56988 default_write_file 0-3 56988 &vmci_transport_notify_pkt_recv_pre_dequeue_56988 nohasharray ++init_hw_56988 init_hw 0 56988 &default_write_file_56988 ++savage_init_hw_56989 savage_init_hw 0 56989 NULL ++CIFS_open_56997 CIFS_open 0 56997 NULL ++consolidate_57001 consolidate 0 57001 NULL ++powr1220_show_max_57002 powr1220_show_max 0 57002 NULL nohasharray ++ds2781_read16_57002 ds2781_read16 3-0 57002 &powr1220_show_max_57002 ++vlsi_alloc_ring_57003 vlsi_alloc_ring 3-4 57003 NULL ++hdmi_s_dv_timings_57004 hdmi_s_dv_timings 0 57004 NULL ++fore200e_send_57011 fore200e_send 0 57011 NULL ++show_rc6pp_ms_57015 show_rc6pp_ms 0 57015 NULL ++s2io_get_eeprom_len_57016 s2io_get_eeprom_len 0 57016 NULL ++cur_freq_show_57023 cur_freq_show 0 57023 NULL nohasharray ++show_channels_57023 show_channels 0 57023 &cur_freq_show_57023 ++aircable_process_packet_57027 aircable_process_packet 4 57027 NULL ++snd_dma_alloc_pages_fallback_57029 snd_dma_alloc_pages_fallback 3 57029 NULL ++arp_netdev_event_57032 arp_netdev_event 0 57032 NULL ++instance_ce_count_show_57038 instance_ce_count_show 0 57038 NULL ++fuse_simple_request_57042 fuse_simple_request 0 57042 NULL ++ieee80211_if_fmt_state_57043 ieee80211_if_fmt_state 3 57043 NULL nohasharray ++skb_network_offset_57043 skb_network_offset 0 57043 &ieee80211_if_fmt_state_57043 ++af9035_wr_regs_57045 af9035_wr_regs 0 57045 NULL ++ovl_copy_up_data_57049 ovl_copy_up_data 3 57049 NULL ++xfs_buf_read_map_57053 xfs_buf_read_map 3 57053 NULL ++rose_setsockopt_57054 rose_setsockopt 0 57054 NULL ++cx2341x_ctrl_new_std_57061 cx2341x_ctrl_new_std 4 57061 NULL ++sca3000_read_data_57064 sca3000_read_data 4 57064 NULL ++do_jit_57066 do_jit 0 57066 NULL nohasharray ++pcmcia_replace_cis_57066 pcmcia_replace_cis 3 57066 &do_jit_57066 ++get_temp_limit_57067 get_temp_limit 0 57067 NULL ++macvtap_write_iter_57068 macvtap_write_iter 0 57068 NULL ++buf_prepare_57069 buf_prepare 0 57069 NULL nohasharray ++sis190_try_rx_copy_57069 sis190_try_rx_copy 3 57069 &buf_prepare_57069 ++ath5k_hw_init_queues_57074 ath5k_hw_init_queues 0 57074 NULL ++blk_mq_sysfs_store_57081 blk_mq_sysfs_store 0-4 57081 NULL ++wmi_send_57083 wmi_send 0 57083 NULL ++cx231xx_i2c_recv_bytes_with_saddr_57086 cx231xx_i2c_recv_bytes_with_saddr 0 57086 NULL ++psmouse_show_int_attr_57088 psmouse_show_int_attr 0 57088 NULL ++show_57089 show 0 57089 NULL ++patch_alc880_57095 patch_alc880 0 57095 NULL ++tracing_set_trace_write_57096 tracing_set_trace_write 3 57096 NULL ++show_spi_transport_iu_57098 show_spi_transport_iu 0 57098 NULL ++vmci_transport_notify_pkt_send_post_enqueue_57105 vmci_transport_notify_pkt_send_post_enqueue 0 57105 NULL nohasharray ++aty_var_to_pll_57105 aty_var_to_pll 0 57105 &vmci_transport_notify_pkt_send_post_enqueue_57105 ++hpfs_readpages_57106 hpfs_readpages 4 57106 NULL ++wakeup_prevent_sleep_time_show_57107 wakeup_prevent_sleep_time_show 0 57107 NULL ++s_stream_57108 s_stream 0 57108 NULL ++show_enabled_57111 show_enabled 0 57111 NULL ++mwl8k_tx_wait_empty_57118 mwl8k_tx_wait_empty 0 57118 NULL nohasharray ++target_fabric_port_store_attr_alua_tg_pt_gp_57118 target_fabric_port_store_attr_alua_tg_pt_gp 0-3 57118 &mwl8k_tx_wait_empty_57118 ++cipso_v4_gentag_loc_57119 cipso_v4_gentag_loc 0 57119 NULL ++get_sum_57128 get_sum 0 57128 NULL nohasharray ++alloc_sleep_millisecs_show_57128 alloc_sleep_millisecs_show 0 57128 &get_sum_57128 nohasharray ++cardr_store_57128 cardr_store 4-0 57128 &alloc_sleep_millisecs_show_57128 ++ov9640_cropcap_57129 ov9640_cropcap 0 57129 NULL ++nvme_alloc_iod_57130 nvme_alloc_iod 1-2 57130 NULL ++ima_show_htable_value_57136 ima_show_htable_value 2-0 57136 NULL nohasharray ++boot_params_data_read_57136 boot_params_data_read 0-6-5 57136 &ima_show_htable_value_57136 ++mmc_io_rw_direct_57137 mmc_io_rw_direct 0 57137 NULL ++tpm_seal_57138 tpm_seal 0 57138 NULL ++show_rxbuf_57139 show_rxbuf 0 57139 NULL ++_iwl_dbgfs_bf_params_write_57141 _iwl_dbgfs_bf_params_write 3-0 57141 NULL ++lp3972_dcdc_disable_57142 lp3972_dcdc_disable 0 57142 NULL ++show_ipv4_iface_incoming_forwarding_en_57143 show_ipv4_iface_incoming_forwarding_en 0 57143 NULL ++acpi_gsb_i2c_read_bytes_57145 acpi_gsb_i2c_read_bytes 4 57145 NULL nohasharray ++set_cidmode_57145 set_cidmode 0-4 57145 &acpi_gsb_i2c_read_bytes_57145 ++xfs_attr3_leaf_lookup_int_57153 xfs_attr3_leaf_lookup_int 0 57153 NULL nohasharray ++cifs_zap_mapping_57153 cifs_zap_mapping 0 57153 &xfs_attr3_leaf_lookup_int_57153 ++udl_prime_create_57159 udl_prime_create 2 57159 NULL ++netxen_receive_peg_ready_57162 netxen_receive_peg_ready 0 57162 NULL ++set_shutter_57164 set_shutter 0 57164 NULL nohasharray ++nilfs_btree_prepare_convert_and_insert_57164 nilfs_btree_prepare_convert_and_insert 0 57164 &set_shutter_57164 ++composite_os_desc_req_prepare_57166 composite_os_desc_req_prepare 0 57166 NULL ++stk_prepare_sio_buffers_57168 stk_prepare_sio_buffers 2 57168 NULL nohasharray ++snd_tm6000_prepare_57168 snd_tm6000_prepare 0 57168 &stk_prepare_sio_buffers_57168 ++rcu_panic_57170 rcu_panic 0 57170 NULL ++fc_stat_show_57171 fc_stat_show 0 57171 NULL ++average_read_57175 average_read 0-3 57175 NULL ++netlink_create_57178 netlink_create 0 57178 NULL ++rx_hw_stuck_read_57179 rx_hw_stuck_read 3-0 57179 NULL ++da9055_reg_read_57185 da9055_reg_read 0 57185 NULL ++ct_map_audio_buffer_57187 ct_map_audio_buffer 0 57187 NULL ++common_file_perm_57189 common_file_perm 0 57189 NULL ++sys_poll_57190 sys_poll 2 57190 NULL ++hash_netnet6_expire_57191 hash_netnet6_expire 4 57191 NULL ++target_stat_scsi_port_attr_store_57198 target_stat_scsi_port_attr_store 0 57198 NULL ++pcan_usb_set_sja1000_57201 pcan_usb_set_sja1000 0 57201 NULL nohasharray ++cache_setup_of_node_57201 cache_setup_of_node 0 57201 &pcan_usb_set_sja1000_57201 ++mwifiex_cmd_802_11_hs_cfg_57205 mwifiex_cmd_802_11_hs_cfg 0 57205 NULL ++sys_io_getevents_57206 sys_io_getevents 3 57206 NULL ++show_session_param_ISCSI_PARAM_PASSWORD_IN_57207 show_session_param_ISCSI_PARAM_PASSWORD_IN 0 57207 NULL ++exofs_write_begin_57210 exofs_write_begin 0 57210 NULL nohasharray ++lp_check_status_57210 lp_check_status 0 57210 &exofs_write_begin_57210 ++ctor_show_57213 ctor_show 0 57213 NULL ++mlx4_qp_attach_common_57214 mlx4_qp_attach_common 0 57214 NULL ++edid_show_57216 edid_show 0-5-6 57216 NULL ++stats_show_57218 stats_show 0 57218 NULL ++tt3650_ci_msg_57219 tt3650_ci_msg 4 57219 NULL nohasharray ++acpi_eject_store_57219 acpi_eject_store 0-4 57219 &tt3650_ci_msg_57219 ++change_mtu_57227 change_mtu 0 57227 NULL ++show_session_param_ISCSI_PARAM_IFACE_NAME_57230 show_session_param_ISCSI_PARAM_IFACE_NAME 0 57230 NULL ++_nfs4_proc_readlink_57231 _nfs4_proc_readlink 0 57231 NULL ++csource_show_57233 csource_show 0 57233 NULL ++dma_fifo_alloc_57236 dma_fifo_alloc 2-3-5 57236 NULL ++drbg_blocklen_57239 drbg_blocklen 0 57239 NULL ++flush_space_57241 flush_space 0 57241 NULL ++rmd320_update_57243 rmd320_update 0 57243 NULL ++rsxx_cram_write_57244 rsxx_cram_write 3-0 57244 NULL ++lbmRead_57247 lbmRead 0 57247 NULL ++ieee80211_if_fmt_tsf_57249 ieee80211_if_fmt_tsf 3 57249 NULL ++oprofilefs_ulong_from_user_57251 oprofilefs_ulong_from_user 3-0 57251 NULL ++wl12xx_cmd_add_peer_57254 wl12xx_cmd_add_peer 0 57254 NULL ++sbp_tpg_attrib_show_mgt_orb_timeout_57256 sbp_tpg_attrib_show_mgt_orb_timeout 0 57256 NULL ++alloc_flex_gd_57259 alloc_flex_gd 1 57259 NULL ++vti_tunnel_init_57265 vti_tunnel_init 0 57265 NULL ++set_component_active_57266 set_component_active 0-4 57266 NULL ++__inet_stream_connect_57269 __inet_stream_connect 0 57269 NULL ++bnx2x_avoid_link_flap_57270 bnx2x_avoid_link_flap 0 57270 NULL ++parport_uss720_epp_read_addr_57271 parport_uss720_epp_read_addr 0 57271 NULL ++usb_gadget_map_request_57272 usb_gadget_map_request 0 57272 NULL ++show_voltage_57273 show_voltage 0 57273 NULL ++dib0070_tune_57275 dib0070_tune 0 57275 NULL ++crc32c_intel_final_57279 crc32c_intel_final 0 57279 NULL nohasharray ++load_data_57279 load_data 0-3 57279 &crc32c_intel_final_57279 ++mc44s803_set_params_57281 mc44s803_set_params 0 57281 NULL ++lbs_sleepparams_write_57283 lbs_sleepparams_write 3-0 57283 NULL nohasharray ++read_iter_57283 read_iter 0 57283 &lbs_sleepparams_write_57283 ++store_tolerance_57285 store_tolerance 0-4 57285 NULL ++ath6kl_wmi_cmd_send_57286 ath6kl_wmi_cmd_send 0 57286 NULL ++pstore_file_read_57288 pstore_file_read 3-0 57288 NULL ++snd_pcm_read_57289 snd_pcm_read 3-0 57289 NULL ++sdev_store_evt_soft_threshold_reached_57290 sdev_store_evt_soft_threshold_reached 0-4 57290 NULL nohasharray ++string_length_no_trail_57290 string_length_no_trail 0-2 57290 &sdev_store_evt_soft_threshold_reached_57290 ++tmp102_set_temp_57299 tmp102_set_temp 0-4 57299 NULL ++ath6kl_buf_alloc_57304 ath6kl_buf_alloc 1 57304 NULL ++ftdi_elan_write_57309 ftdi_elan_write 3-0 57309 NULL ++write_file_regval_57313 write_file_regval 3-0 57313 NULL ++tm6000_start_thread_57314 tm6000_start_thread 0 57314 NULL ++show_alarm_57318 show_alarm 0 57318 NULL ++ieee802154_hdr_addr_len_57324 ieee802154_hdr_addr_len 0 57324 NULL ++__mxt_write_reg_57326 __mxt_write_reg 3-0 57326 NULL ++cm32181_get_it_available_57330 cm32181_get_it_available 0 57330 NULL ++acpi_pad_rrtime_show_57332 acpi_pad_rrtime_show 0 57332 NULL ++adc128_show_alarm_57333 adc128_show_alarm 0 57333 NULL nohasharray ++fan_write_57333 fan_write 0 57333 &adc128_show_alarm_57333 ++roccat_common2_sysfs_read_key_mask_57336 roccat_common2_sysfs_read_key_mask 0-5-6 57336 NULL ++evtchn_fifo_cpu_notification_57337 evtchn_fifo_cpu_notification 0 57337 NULL ++get_fan_pulses_57339 get_fan_pulses 0 57339 NULL ++mt9m111_set_gain_57340 mt9m111_set_gain 0 57340 NULL ++hw_init_57341 hw_init 0 57341 NULL ++check_mirror_57342 check_mirror 1-2 57342 NULL nohasharray ++usblp_read_57342 usblp_read 3-0 57342 &check_mirror_57342 ++kvaser_usb_send_simple_msg_57346 kvaser_usb_send_simple_msg 0 57346 NULL ++print_devstats_dot11RTSFailureCount_57347 print_devstats_dot11RTSFailureCount 3 57347 NULL ++dio_send_cur_page_57348 dio_send_cur_page 0 57348 NULL nohasharray ++probe_57348 probe 0 57348 &dio_send_cur_page_57348 nohasharray ++ata_scsi_lpm_store_57348 ata_scsi_lpm_store 0-4 57348 &probe_57348 ++ql_adapter_reset_57354 ql_adapter_reset 0 57354 NULL ++raid_bytes_show_57357 raid_bytes_show 0 57357 NULL ++get_component_type_57362 get_component_type 0 57362 NULL ++iscsi_nacl_attrib_show_nopin_timeout_57364 iscsi_nacl_attrib_show_nopin_timeout 0 57364 NULL ++bnx2x_func_state_change_57365 bnx2x_func_state_change 0 57365 NULL ++sh_eth_open_57366 sh_eth_open 0 57366 NULL nohasharray ++w5100_set_macaddr_57366 w5100_set_macaddr 0 57366 &sh_eth_open_57366 ++_snd_pcm_hw_param_set_57369 _snd_pcm_hw_param_set 0 57369 NULL ++tipc_bclink_stats_57372 tipc_bclink_stats 2 57372 NULL ++pscsi_create_type_other_57380 pscsi_create_type_other 0 57380 NULL ++tty_register_device_attr_57381 tty_register_device_attr 2 57381 NULL ++slabs_show_57383 slabs_show 0 57383 NULL ++bzImage64_load_57388 bzImage64_load 7 57388 NULL ++squashfs_symlink_readpage_57390 squashfs_symlink_readpage 0 57390 NULL ++cx231xx_s_video_encoding_57392 cx231xx_s_video_encoding 0 57392 NULL ++ad7298_update_scan_mode_57393 ad7298_update_scan_mode 0 57393 NULL ++ivtvfb_check_var_57394 ivtvfb_check_var 0 57394 NULL ++bfs_statfs_57403 bfs_statfs 0 57403 NULL ++lbs_prb_rsp_limit_get_57405 lbs_prb_rsp_limit_get 0 57405 NULL ++read_file_blob_57406 read_file_blob 3-0 57406 NULL ++rd_show_configfs_dev_params_57407 rd_show_configfs_dev_params 0 57407 NULL ++enclosure_register_57412 enclosure_register 3 57412 NULL nohasharray ++show_fnode_def_taskmgmt_tmo_57412 show_fnode_def_taskmgmt_tmo 0 57412 &enclosure_register_57412 nohasharray ++pcistub_reg_add_57412 pcistub_reg_add 0 57412 &show_fnode_def_taskmgmt_tmo_57412 nohasharray ++snd_hda_codec_configure_57412 snd_hda_codec_configure 0 57412 &pcistub_reg_add_57412 ++mtd_badblocks_show_57413 mtd_badblocks_show 0 57413 NULL ++carl9170_read_mreg_57415 carl9170_read_mreg 0 57415 NULL ++gre_manip_pkt_57416 gre_manip_pkt 4 57416 NULL ++parport_ieee1284_epp_read_data_57421 parport_ieee1284_epp_read_data 0 57421 NULL ++wl1271_acx_set_ht_capabilities_57426 wl1271_acx_set_ht_capabilities 0 57426 NULL ++read_file_eeprom_57428 read_file_eeprom 3-0 57428 NULL ++compat_keyctl_instantiate_key_iov_57431 compat_keyctl_instantiate_key_iov 3 57431 NULL nohasharray ++alloc_ftrace_hash_57431 alloc_ftrace_hash 1 57431 &compat_keyctl_instantiate_key_iov_57431 ++copy_to_user_fromio_57432 copy_to_user_fromio 3 57432 NULL ++fscaps_show_57434 fscaps_show 0 57434 NULL nohasharray ++fuse_notify_inval_inode_57434 fuse_notify_inval_inode 0 57434 &fscaps_show_57434 ++gadget_dev_desc_bDeviceSubClass_store_57437 gadget_dev_desc_bDeviceSubClass_store 0-3 57437 NULL ++vmxnet3_rq_init_all_57442 vmxnet3_rq_init_all 0 57442 NULL ++ov7670_s_gain_57445 ov7670_s_gain 0 57445 NULL ++sys_pselect6_57449 sys_pselect6 1 57449 NULL ++uhid_hid_set_report_57455 uhid_hid_set_report 0-4 57455 NULL ++diolan_i2c_stop_57458 diolan_i2c_stop 0 57458 NULL nohasharray ++cafe_smbus_read_data_57458 cafe_smbus_read_data 0 57458 &diolan_i2c_stop_57458 ++__roundup_pow_of_two_57461 __roundup_pow_of_two 0 57461 NULL ++send_midi_async_57463 send_midi_async 3 57463 NULL ++sisusb_clear_vram_57466 sisusb_clear_vram 2-3 57466 NULL ++ieee80211_if_read_flags_57470 ieee80211_if_read_flags 3-0 57470 NULL nohasharray ++max6900_rtc_read_time_57470 max6900_rtc_read_time 0 57470 &ieee80211_if_read_flags_57470 ++iwl_send_add_sta_57474 iwl_send_add_sta 0 57474 NULL ++nilfs_segctor_collect_57484 nilfs_segctor_collect 0 57484 NULL nohasharray ++wdtpci_notify_sys_57484 wdtpci_notify_sys 0 57484 &nilfs_segctor_collect_57484 ++vlan_dev_netpoll_setup_57486 vlan_dev_netpoll_setup 0 57486 NULL ++em_store_57488 em_store 0 57488 NULL ++o2hb_heartbeat_group_store_57489 o2hb_heartbeat_group_store 0-4 57489 NULL ++read_file_skb_rx_57490 read_file_skb_rx 3-0 57490 NULL nohasharray ++read_57490 read 0 57490 &read_file_skb_rx_57490 ++bnad_debugfs_write_regwr_57500 bnad_debugfs_write_regwr 3-0 57500 NULL nohasharray ++usbvision_stream_interrupt_57500 usbvision_stream_interrupt 0 57500 &bnad_debugfs_write_regwr_57500 ++copy_in_user_57502 copy_in_user 3 57502 NULL ++chip_direction_output_57503 chip_direction_output 0 57503 NULL ++tcp_peek_sndq_57504 tcp_peek_sndq 0 57504 NULL ++ckhdid_printf_57505 ckhdid_printf 2-0 57505 NULL nohasharray ++gfs2_quota_hold_57505 gfs2_quota_hold 0 57505 &ckhdid_printf_57505 nohasharray ++ks8842_read32_57505 ks8842_read32 0 57505 &gfs2_quota_hold_57505 ++search_by_entry_key_57509 search_by_entry_key 0 57509 NULL ++ASIE_store_57511 ASIE_store 0-4 57511 NULL ++ib_send_rmpp_mad_57512 ib_send_rmpp_mad 0 57512 NULL ++start_spy_cam_57513 start_spy_cam 0 57513 NULL ++init_tag_map_57515 init_tag_map 3 57515 NULL ++ad7877_gpio4_show_57516 ad7877_gpio4_show 0 57516 NULL ++wil_read_file_ssid_57517 wil_read_file_ssid 3-0 57517 NULL nohasharray ++il_dbgfs_force_reset_read_57517 il_dbgfs_force_reset_read 3-0 57517 &wil_read_file_ssid_57517 nohasharray ++store_57517 store 0-3 57517 &il_dbgfs_force_reset_read_57517 ++als_lux0_input_data_show_57519 als_lux0_input_data_show 0 57519 NULL ++cmm_read_57520 cmm_read 3-0 57520 NULL ++rt2500usb_enable_radio_57521 rt2500usb_enable_radio 0 57521 NULL ++snd_seq_queue_delete_57527 snd_seq_queue_delete 0 57527 NULL ++aa_path_perm_57530 aa_path_perm 0 57530 NULL ++inode_permission_57531 inode_permission 0 57531 NULL ++acpi_dev_get_resources_57534 acpi_dev_get_resources 0 57534 NULL ++ptlrpc_lprocfs_hp_ratio_seq_write_57537 ptlrpc_lprocfs_hp_ratio_seq_write 3 57537 NULL ++vsock_dgram_sendmsg_57538 vsock_dgram_sendmsg 0-4 57538 NULL ++show_country_rel_date_57539 show_country_rel_date 0 57539 NULL ++compat_SyS_process_vm_writev_57542 compat_SyS_process_vm_writev 3-5 57542 NULL ++ext4_group_first_block_no_57559 ext4_group_first_block_no 0-2 57559 NULL nohasharray ++iscsi_tpg_attrib_show_demo_mode_discovery_57559 iscsi_tpg_attrib_show_demo_mode_discovery 0 57559 &ext4_group_first_block_no_57559 nohasharray ++ReadHDLCPnP_57559 ReadHDLCPnP 0 57559 &iscsi_tpg_attrib_show_demo_mode_discovery_57559 ++snd_pcm_playback_ioctl1_57569 snd_pcm_playback_ioctl1 0 57569 NULL ++pn544_hci_i2c_fw_write_cmd_57572 pn544_hci_i2c_fw_write_cmd 4 57572 NULL nohasharray ++rtpm_enabled_show_57572 rtpm_enabled_show 0 57572 &pn544_hci_i2c_fw_write_cmd_57572 ++get_bridge_ifindices_57579 get_bridge_ifindices 0 57579 NULL ++tc3589x_reg_write_57581 tc3589x_reg_write 0 57581 NULL ++ldlm_cli_enqueue_local_57582 ldlm_cli_enqueue_local 11 57582 NULL ++il_dbgfs_interrupt_write_57591 il_dbgfs_interrupt_write 3-0 57591 NULL nohasharray ++set_pwm_tmin_57591 set_pwm_tmin 0-4 57591 &il_dbgfs_interrupt_write_57591 ++read_file_spectral_fft_period_57593 read_file_spectral_fft_period 3-0 57593 NULL ++ivtv_write_57597 ivtv_write 0 57597 NULL nohasharray ++cifs_async_readv_57597 cifs_async_readv 0 57597 &ivtv_write_57597 ++ath9k_sta_state_57600 ath9k_sta_state 0 57600 NULL nohasharray ++kone_tcu_command_57600 kone_tcu_command 0 57600 &ath9k_sta_state_57600 nohasharray ++lp8788_update_bits_57600 lp8788_update_bits 0 57600 &kone_tcu_command_57600 ++pm_autosleep_set_state_57609 pm_autosleep_set_state 0 57609 NULL ++mt9m111_set_pixfmt_57612 mt9m111_set_pixfmt 0 57612 NULL ++wm831x_gpio_to_irq_57614 wm831x_gpio_to_irq 2 57614 NULL ++show_atmaddress_57617 show_atmaddress 0 57617 NULL nohasharray ++llc_ui_bind_57617 llc_ui_bind 0 57617 &show_atmaddress_57617 ++gfs2_write_begin_57618 gfs2_write_begin 0 57618 NULL ++sk_stream_alloc_skb_57622 sk_stream_alloc_skb 2 57622 NULL ++tps65217_reg_write_57623 tps65217_reg_write 0 57623 NULL nohasharray ++tx_tx_retry_template_read_57623 tx_tx_retry_template_read 3-0 57623 &tps65217_reg_write_57623 ++cpu_hotplug_notify_57624 cpu_hotplug_notify 0 57624 NULL nohasharray ++store_57624 store 0-3 57624 &cpu_hotplug_notify_57624 ++osdmap_set_max_osd_57630 osdmap_set_max_osd 2 57630 NULL nohasharray ++sisusbcon_putcs_57630 sisusbcon_putcs 3 57630 &osdmap_set_max_osd_57630 ++mem_read_57631 mem_read 3-0 57631 NULL ++msi_compose_msg_57637 msi_compose_msg 0 57637 NULL ++mr_read_57639 mr_read 0 57639 NULL ++iwl_mvm_flush_tx_path_57640 iwl_mvm_flush_tx_path 0 57640 NULL ++xen_swiotlb_sync_single_for_cpu_57648 xen_swiotlb_sync_single_for_cpu 2 57648 NULL nohasharray ++skein_256_update_57648 skein_256_update 0 57648 &xen_swiotlb_sync_single_for_cpu_57648 ++mce_disable_error_reporting_57651 mce_disable_error_reporting 0 57651 NULL ++xfs_alloc_ag_vextent_near_57653 xfs_alloc_ag_vextent_near 0 57653 NULL ++c_can_start_57654 c_can_start 0 57654 NULL ++t4vf_sge_alloc_eth_txq_57656 t4vf_sge_alloc_eth_txq 0 57656 NULL ++iscsi_tpg_attrib_store_cache_dynamic_acls_57657 iscsi_tpg_attrib_store_cache_dynamic_acls 0-3 57657 NULL ++sys_mq_timedsend_57661 sys_mq_timedsend 3 57661 NULL ++r3964_write_57662 r3964_write 4 57662 NULL nohasharray ++ath10k_htt_init_57662 ath10k_htt_init 0 57662 &r3964_write_57662 ++withdraw_store_57663 withdraw_store 0-3 57663 NULL ++proc_ns_readlink_57664 proc_ns_readlink 3-0 57664 NULL ++dev_mc_add_57667 dev_mc_add 0 57667 NULL ++__lgwrite_57669 __lgwrite 4 57669 NULL ++__v9fs_readpage_from_fscache_57670 __v9fs_readpage_from_fscache 0 57670 NULL ++nf_call_arptables_show_57677 nf_call_arptables_show 0 57677 NULL ++tps6507x_pmic_write_57680 tps6507x_pmic_write 0 57680 NULL ++qlcnic_get_pci_func_type_57685 qlcnic_get_pci_func_type 0 57685 NULL ++show_pwm_auto_vrdhot_ramp_57686 show_pwm_auto_vrdhot_ramp 0 57686 NULL ++rt2x00debug_read_eeprom_57690 rt2x00debug_read_eeprom 0-3 57690 NULL ++i40evf_open_57695 i40evf_open 0 57695 NULL nohasharray ++f1x_match_to_this_node_57695 f1x_match_to_this_node 3 57695 &i40evf_open_57695 ++ks8842_set_mac_57697 ks8842_set_mac 0 57697 NULL ++i2400m_rx_stats_read_57706 i2400m_rx_stats_read 3-0 57706 NULL ++lbs_mesh_config_send_57711 lbs_mesh_config_send 0 57711 NULL ++mwl8k_load_firmware_57712 mwl8k_load_firmware 0 57712 NULL ++aac_reset_adapter_57720 aac_reset_adapter 0 57720 NULL ++ieee80211_if_read_dot11MeshHWMPconfirmationInterval_57722 ieee80211_if_read_dot11MeshHWMPconfirmationInterval 3-0 57722 NULL nohasharray ++wl18xx_pre_upload_57722 wl18xx_pre_upload 0 57722 &ieee80211_if_read_dot11MeshHWMPconfirmationInterval_57722 ++ipgre_tunnel_init_57728 ipgre_tunnel_init 0 57728 NULL ++show_status_str_57729 show_status_str 0 57729 NULL ++bt_6lowpan_disconnect_57732 bt_6lowpan_disconnect 0 57732 NULL ++ip6table_nat_out_57735 ip6table_nat_out 0 57735 NULL nohasharray ++sc1200wdt_notify_sys_57735 sc1200wdt_notify_sys 0 57735 &ip6table_nat_out_57735 ++ath10k_wait_for_peer_created_57736 ath10k_wait_for_peer_created 0 57736 NULL nohasharray ++severities_coverage_write_57736 severities_coverage_write 0-3 57736 &ath10k_wait_for_peer_created_57736 ++ne2k_pci_open_57741 ne2k_pci_open 0 57741 NULL ++compat_sys_set_mempolicy_57742 compat_sys_set_mempolicy 3 57742 NULL nohasharray ++pppol2tp_recvmsg_57742 pppol2tp_recvmsg 0-4 57742 &compat_sys_set_mempolicy_57742 ++wlcore_boot_run_firmware_57744 wlcore_boot_run_firmware 0 57744 NULL ++nouveau_hwmon_max_temp_hyst_57747 nouveau_hwmon_max_temp_hyst 0 57747 NULL ++ipmi_write_57748 ipmi_write 0-3 57748 NULL ++mesh_id_get_57750 mesh_id_get 0 57750 NULL ++bond_create_57752 bond_create 0 57752 NULL ++mbx_cmd_57753 mbx_cmd 0 57753 NULL ++ieee80211_if_fmt_dot11MeshHWMPpreqMinInterval_57762 ieee80211_if_fmt_dot11MeshHWMPpreqMinInterval 3 57762 NULL ++selinux_kernel_module_request_57769 selinux_kernel_module_request 0 57769 NULL ++tgr192_final_57774 tgr192_final 0 57774 NULL ++SYSC_process_vm_writev_57776 SYSC_process_vm_writev 3-5 57776 NULL ++zd_usb_enable_rx_57778 zd_usb_enable_rx 0 57778 NULL ++r6040_open_57779 r6040_open 0 57779 NULL ++dmi_entry_length_57782 dmi_entry_length 0 57782 NULL ++is_valid_bcd_57785 is_valid_bcd 0 57785 NULL nohasharray ++set_eeprom2_57785 set_eeprom2 4-0 57785 &is_valid_bcd_57785 nohasharray ++__i915_wait_seqno_57785 __i915_wait_seqno 0 57785 &set_eeprom2_57785 nohasharray ++read_fifo_57785 read_fifo 0 57785 &__i915_wait_seqno_57785 ++go7007_snd_pcm_trigger_57787 go7007_snd_pcm_trigger 0 57787 NULL nohasharray ++crypto_shash_final_57787 crypto_shash_final 0 57787 &go7007_snd_pcm_trigger_57787 ++ld2_57794 ld2 0 57794 NULL ++ivtv_read_57796 ivtv_read 3-0 57796 NULL ++ion_test_ioctl_57799 ion_test_ioctl 2 57799 NULL ++qla2x00_sysfs_read_nvram_57800 qla2x00_sysfs_read_nvram 6-0-5 57800 NULL ++bnad_txrx_irq_alloc_57804 bnad_txrx_irq_alloc 0 57804 NULL ++be_get_reg_len_57805 be_get_reg_len 0 57805 NULL ++evdev_read_57810 evdev_read 0-3 57810 NULL ++skein256_final_57814 skein256_final 0 57814 NULL ++max8997_update_reg_57818 max8997_update_reg 0 57818 NULL ++mptsas_sas_enclosure_pg0_57820 mptsas_sas_enclosure_pg0 0 57820 NULL ++sedlbauer_suspend_57826 sedlbauer_suspend 0 57826 NULL ++__bnx2fc_disable_57827 __bnx2fc_disable 0 57827 NULL ++bfad_debugfs_read_regrd_57830 bfad_debugfs_read_regrd 3-0 57830 NULL ++copy_to_user_57835 copy_to_user 3-0 57835 NULL nohasharray ++ecryptfs_decrypt_page_57835 ecryptfs_decrypt_page 0 57835 ©_to_user_57835 ++start_ch_57836 start_ch 0 57836 NULL ++show_auto_temp_min_57837 show_auto_temp_min 0 57837 NULL ++mwl8k_rxq_init_57838 mwl8k_rxq_init 0 57838 NULL ++nouveau_hwmon_critical_temp_57841 nouveau_hwmon_critical_temp 0 57841 NULL ++wl128x_manually_configure_mcs_pll_57842 wl128x_manually_configure_mcs_pll 0 57842 NULL ++flash_read_57843 flash_read 3-0 57843 NULL nohasharray ++xfs_rtpick_extent_57843 xfs_rtpick_extent 0 57843 &flash_read_57843 ++cp2112_xfer_status_57844 cp2112_xfer_status 0 57844 NULL ++kiblnd_create_tx_pool_57846 kiblnd_create_tx_pool 2 57846 NULL ++skcipher_wait_for_wmem_57849 skcipher_wait_for_wmem 0 57849 NULL ++acpi_ns_internalize_name_57852 acpi_ns_internalize_name 0 57852 NULL ++niu_request_irq_57856 niu_request_irq 0 57856 NULL ++iscsit_tpg_set_initiator_node_queue_depth_57857 iscsit_tpg_set_initiator_node_queue_depth 0 57857 NULL ++bttv_i2c_wait_done_57858 bttv_i2c_wait_done 0 57858 NULL ++__inode_direct_access_57861 __inode_direct_access 0 57861 NULL nohasharray ++__clockevents_try_unbind_57861 __clockevents_try_unbind 0 57861 &__inode_direct_access_57861 ++ahci_read_em_buffer_57862 ahci_read_em_buffer 0 57862 NULL ++c2port_store_reset_57867 c2port_store_reset 0-4 57867 NULL ++show_pwm_weight_temp_sel_57872 show_pwm_weight_temp_sel 0 57872 NULL ++hsi_async_57877 hsi_async 0 57877 NULL ++radeon_ttm_gtt_read_57879 radeon_ttm_gtt_read 3-0 57879 NULL ++bmg160_setup_any_motion_interrupt_57881 bmg160_setup_any_motion_interrupt 0 57881 NULL ++iscsi_disc_show_enforce_discovery_auth_57891 iscsi_disc_show_enforce_discovery_auth 0 57891 NULL ++e100_set_mac_address_57894 e100_set_mac_address 0 57894 NULL ++bh1770_lux_interrupt_control_57897 bh1770_lux_interrupt_control 0 57897 NULL ++pccard_extract_cis_57899 pccard_extract_cis 0 57899 NULL ++user_dlm_lock_57900 user_dlm_lock 0 57900 NULL nohasharray ++num_tgts_store_57900 num_tgts_store 0-3 57900 &user_dlm_lock_57900 ++xt_alloc_table_info_57903 xt_alloc_table_info 1 57903 NULL nohasharray ++sb1000_reset_57903 sb1000_reset 0 57903 &xt_alloc_table_info_57903 ++emi26_writememory_57908 emi26_writememory 4 57908 NULL ++iio_read_first_n_kfifo_57910 iio_read_first_n_kfifo 2-0 57910 NULL ++ll_xattr_find_get_lock_57912 ll_xattr_find_get_lock 0 57912 NULL ++__uhid_report_queue_and_wait_57914 __uhid_report_queue_and_wait 0 57914 NULL ++w1_reply_len_57916 w1_reply_len 0 57916 NULL ++mwifiex_hscfg_read_57920 mwifiex_hscfg_read 3-0 57920 NULL ++journal_join_57921 journal_join 0 57921 NULL ++twl_i2c_write_57923 twl_i2c_write 3-4-0 57923 NULL ++serio_show_bind_mode_57925 serio_show_bind_mode 0 57925 NULL ++pci_ni8420_init_57926 pci_ni8420_init 0 57926 NULL ++vsp1_video_start_streaming_57928 vsp1_video_start_streaming 0 57928 NULL ++ipath_diag_write_57929 ipath_diag_write 0-3 57929 NULL nohasharray ++store_temp_mode_57929 store_temp_mode 0-4 57929 &ipath_diag_write_57929 ++lpfc_lun_queue_depth_show_57930 lpfc_lun_queue_depth_show 0 57930 NULL nohasharray ++nilfs_btree_mark_57930 nilfs_btree_mark 0 57930 &lpfc_lun_queue_depth_show_57930 nohasharray ++lp5523_update_program_memory_57930 lp5523_update_program_memory 0-3 57930 &nilfs_btree_mark_57930 ++store_als_attr_57931 store_als_attr 0-4 57931 NULL nohasharray ++ext4_freeze_57931 ext4_freeze 0 57931 &store_als_attr_57931 ++sel_read_handle_unknown_57933 sel_read_handle_unknown 3-0 57933 NULL ++nvc0_vm_create_57942 nvc0_vm_create 2-3 57942 NULL ++xfs_mru_cache_create_57943 xfs_mru_cache_create 3 57943 NULL ++rx_57944 rx 4 57944 NULL ++key_algorithm_read_57946 key_algorithm_read 3-0 57946 NULL ++ds2781_get_sense_resistor_value_57949 ds2781_get_sense_resistor_value 0 57949 NULL ++wl1273_fm_set_tx_power_57951 wl1273_fm_set_tx_power 0 57951 NULL ++ip_set_alloc_57953 ip_set_alloc 1 57953 NULL nohasharray ++ioat3_dca_count_dca_slots_57953 ioat3_dca_count_dca_slots 0 57953 &ip_set_alloc_57953 ++ipmr_device_event_57954 ipmr_device_event 0 57954 NULL nohasharray ++xfs_log_store_57954 xfs_log_store 4-0 57954 &ipmr_device_event_57954 ++tpm_atml_send_57957 tpm_atml_send 0-3 57957 NULL ++vport_create_57966 vport_create 0 57966 NULL ++adv7170_s_fmt_57967 adv7170_s_fmt 0 57967 NULL ++cxgb4_clip_get_57970 cxgb4_clip_get 0 57970 NULL ++hfc_empty_fifo_57972 hfc_empty_fifo 2 57972 NULL ++iov_iter_npages_57979 iov_iter_npages 0-2 57979 NULL ++cifs_open_file_57982 cifs_open_file 0 57982 NULL ++proc_getattr_57984 proc_getattr 0 57984 NULL ++input_polldev_get_poll_57988 input_polldev_get_poll 0 57988 NULL ++drv_get_et_sset_count_57992 drv_get_et_sset_count 0 57992 NULL ++lmLogShutdown_57995 lmLogShutdown 0 57995 NULL ++lua_sysfs_write_control_57996 lua_sysfs_write_control 0-6-5 57996 NULL ++rx_reset_counter_read_58001 rx_reset_counter_read 3-0 58001 NULL nohasharray ++btree_csum_one_bio_58001 btree_csum_one_bio 0 58001 &rx_reset_counter_read_58001 ++pfkey_create_58010 pfkey_create 0 58010 NULL ++srpt_tpg_attrib_store_srp_max_rdma_size_58012 srpt_tpg_attrib_store_srp_max_rdma_size 0-3 58012 NULL ++dbg_walk_index_58013 dbg_walk_index 0 58013 NULL ++ocfs2_getattr_58020 ocfs2_getattr 0 58020 NULL ++iwl_dbgfs_ucode_rx_stats_read_58023 iwl_dbgfs_ucode_rx_stats_read 3-0 58023 NULL nohasharray ++si4713_set_power_state_58023 si4713_set_power_state 0 58023 &iwl_dbgfs_ucode_rx_stats_read_58023 ++svga_match_format_58028 svga_match_format 0 58028 NULL ++io_playback_transfer_58030 io_playback_transfer 4 58030 NULL ++get_temp_58031 get_temp 0 58031 NULL ++ext4_block_bitmap_58033 ext4_block_bitmap 0 58033 NULL ++fsl_asrc_dma_trigger_58039 fsl_asrc_dma_trigger 0 58039 NULL ++store_tabletMouseLeft_58046 store_tabletMouseLeft 0-4 58046 NULL ++do_writepage_58047 do_writepage 0 58047 NULL ++__adp5520_read_58050 __adp5520_read 0 58050 NULL ++ov6650_s_crop_58051 ov6650_s_crop 0 58051 NULL ++b43_lpphy_op_switch_channel_58053 b43_lpphy_op_switch_channel 0 58053 NULL ++mce_async_out_58056 mce_async_out 3 58056 NULL ++bq32k_write_58057 bq32k_write 4 58057 NULL ++show_fcoe_ctlr_device_vlink_fail_58058 show_fcoe_ctlr_device_vlink_fail 0 58058 NULL ++deadline_writes_starved_store_58060 deadline_writes_starved_store 3-0 58060 NULL ++idt77252_change_qos_58063 idt77252_change_qos 0 58063 NULL ++ocfs2_find_leaf_58065 ocfs2_find_leaf 0 58065 NULL ++ignore_store_58069 ignore_store 0-4 58069 NULL ++nf_call_ip6tables_store_58072 nf_call_ip6tables_store 4-0 58072 NULL ++usb2_hardware_lpm_show_58073 usb2_hardware_lpm_show 0 58073 NULL nohasharray ++dt3155_alloc_coherent_58073 dt3155_alloc_coherent 2 58073 &usb2_hardware_lpm_show_58073 ++store_event_char_58077 store_event_char 0-4 58077 NULL ++cm4040_write_58079 cm4040_write 3-0 58079 NULL nohasharray ++bad_inode_permission_58079 bad_inode_permission 0 58079 &cm4040_write_58079 nohasharray ++kprobe_exceptions_notify_58079 kprobe_exceptions_notify 0 58079 &bad_inode_permission_58079 ++pcxhr_trigger_58080 pcxhr_trigger 0 58080 NULL ++amd8111e_get_regs_len_58082 amd8111e_get_regs_len 0 58082 NULL nohasharray ++sdr_cap_queue_setup_58082 sdr_cap_queue_setup 0 58082 &amd8111e_get_regs_len_58082 ++inode_listxattr_58085 inode_listxattr 0 58085 NULL ++rpipe_get_idle_58088 rpipe_get_idle 0 58088 NULL ++rfcomm_wmalloc_58090 rfcomm_wmalloc 2 58090 NULL ++defined_show_58091 defined_show 0 58091 NULL nohasharray ++show_sg_prot_tablesize_58091 show_sg_prot_tablesize 0 58091 &defined_show_58091 nohasharray ++wcn36xx_smd_start_rsp_58091 wcn36xx_smd_start_rsp 0 58091 &show_sg_prot_tablesize_58091 ++ufx_reg_clear_and_set_bits_58093 ufx_reg_clear_and_set_bits 0 58093 NULL ++mt9m111_reg_write_58095 mt9m111_reg_write 0 58095 NULL ++sanity_checks_show_58100 sanity_checks_show 0 58100 NULL nohasharray ++pnp_stop_dev_58100 pnp_stop_dev 0 58100 &sanity_checks_show_58100 ++acpi_get_table_by_index_58102 acpi_get_table_by_index 0 58102 NULL ++deadline_fifo_batch_store_58104 deadline_fifo_batch_store 3-0 58104 NULL ++nilfs_cpfile_get_header_block_58111 nilfs_cpfile_get_header_block 0 58111 NULL ++padata_set_cpumask_58112 padata_set_cpumask 0 58112 NULL ++show_force_pwm_max_58119 show_force_pwm_max 0 58119 NULL ++tle62x0_read_58120 tle62x0_read 0 58120 NULL nohasharray ++ath5k_hw_phy_init_58120 ath5k_hw_phy_init 0 58120 &tle62x0_read_58120 ++target_stat_scsi_port_attr_show_58121 target_stat_scsi_port_attr_show 0 58121 NULL ++hiddev_write_58123 hiddev_write 0-3 58123 NULL ++sha224_init_58128 sha224_init 0 58128 NULL nohasharray ++transient_duration_store_58128 transient_duration_store 0-4 58128 &sha224_init_58128 ++savemem_58129 savemem 3 58129 NULL ++std_validate_58132 std_validate 0 58132 NULL ++i2c_dw_handle_tx_abort_58134 i2c_dw_handle_tx_abort 0 58134 NULL ++ipv6_flowlabel_opt_58135 ipv6_flowlabel_opt 3 58135 NULL nohasharray ++slhc_init_58135 slhc_init 1-2 58135 &ipv6_flowlabel_opt_58135 ++lxfb_set_par_58136 lxfb_set_par 0 58136 NULL ++TermCharEnabled_store_58139 TermCharEnabled_store 0-4 58139 NULL ++hackrf_s_ctrl_58141 hackrf_s_ctrl 0 58141 NULL ++ql_clear_routing_entries_58143 ql_clear_routing_entries 0 58143 NULL nohasharray ++create_out_jack_modes_58143 create_out_jack_modes 0 58143 &ql_clear_routing_entries_58143 ++powr1220_show_label_58146 powr1220_show_label 0 58146 NULL ++platform_suspend_prepare_noirq_58149 platform_suspend_prepare_noirq 0 58149 NULL nohasharray ++simple_xattr_remove_58149 simple_xattr_remove 0 58149 &platform_suspend_prepare_noirq_58149 ++_osd_req_finalize_attr_page_58151 _osd_req_finalize_attr_page 0 58151 NULL nohasharray ++xfs_bmap_add_extent_delay_real_58151 xfs_bmap_add_extent_delay_real 0 58151 &_osd_req_finalize_attr_page_58151 ++elan_update_firmware_58154 elan_update_firmware 0 58154 NULL ++error_state_write_58159 error_state_write 0-6-5 58159 NULL ++open_ttys_show_58161 open_ttys_show 0 58161 NULL ++dbg_scan_orphans_58163 dbg_scan_orphans 0 58163 NULL ++nilfs_writepage_58164 nilfs_writepage 0 58164 NULL ++max6900_i2c_read_regs_58165 max6900_i2c_read_regs 0 58165 NULL ++xfs_btree_update_58167 xfs_btree_update 0 58167 NULL ++ext4_bg_num_gdb_58171 ext4_bg_num_gdb 0 58171 NULL ++bonding_show_num_peer_notif_58172 bonding_show_num_peer_notif 0 58172 NULL ++domid_mask_show_58174 domid_mask_show 0 58174 NULL ++pages_collapsed_show_58175 pages_collapsed_show 0 58175 NULL nohasharray ++write_58175 write 0 58175 &pages_collapsed_show_58175 ++ceph_tcp_recvmsg_58177 ceph_tcp_recvmsg 3 58177 NULL ++max77802_rtc_update_58178 max77802_rtc_update 0 58178 NULL nohasharray ++acpi_hibernation_begin_old_58178 acpi_hibernation_begin_old 0 58178 &max77802_rtc_update_58178 ++show_temp_max_hyst_58179 show_temp_max_hyst 0 58179 NULL ++uart_get_attr_irq_58182 uart_get_attr_irq 0 58182 NULL nohasharray ++bnad_open_58182 bnad_open 0 58182 &uart_get_attr_irq_58182 ++wlcore_read_58185 wlcore_read 0 58185 NULL ++garmin_write_bulk_58191 garmin_write_bulk 3-0 58191 NULL ++asix_write_cmd_58192 asix_write_cmd 0-5 58192 NULL ++wacom_buttons_luminance_show_58193 wacom_buttons_luminance_show 0 58193 NULL ++send_pre_enqueue_58203 send_pre_enqueue 0 58203 NULL nohasharray ++brd_direct_access_58203 brd_direct_access 0 58203 &send_pre_enqueue_58203 ++qlcnic_82xx_get_nic_info_58204 qlcnic_82xx_get_nic_info 0 58204 NULL ++ieee80211_if_fmt_flags_58205 ieee80211_if_fmt_flags 3 58205 NULL ++nci_send_cmd_58206 nci_send_cmd 3 58206 NULL ++intel_iommu_show_cap_58208 intel_iommu_show_cap 0 58208 NULL ++ipg_nic_open_58209 ipg_nic_open 0 58209 NULL ++i40evf_allocate_virt_mem_d_58210 i40evf_allocate_virt_mem_d 3 58210 NULL ++ipath_diag_read_58213 ipath_diag_read 0-3 58213 NULL ++snd_seq_deliver_single_event_58223 snd_seq_deliver_single_event 0 58223 NULL ++cpuid_read_58224 cpuid_read 0-3 58224 NULL nohasharray ++__niu_wait_bits_clear_mac_58224 __niu_wait_bits_clear_mac 0 58224 &cpuid_read_58224 ++bop_check_delete_58229 bop_check_delete 0 58229 NULL ++bitmap_new_disk_sb_58232 bitmap_new_disk_sb 0 58232 NULL ++core_alua_store_implicit_trans_secs_58234 core_alua_store_implicit_trans_secs 0-3 58234 NULL ++cdc_ncm_show_wNdpOutAlignment_58236 cdc_ncm_show_wNdpOutAlignment 0 58236 NULL ++usX2Y_usbpcm_urbs_allocate_58238 usX2Y_usbpcm_urbs_allocate 0 58238 NULL nohasharray ++object_size_show_58238 object_size_show 0 58238 &usX2Y_usbpcm_urbs_allocate_58238 ++show_counter_rx_p7_hdr_egr_ovfls_58240 show_counter_rx_p7_hdr_egr_ovfls 0 58240 NULL ++cbus_receive_word_58243 cbus_receive_word 0 58243 NULL ++usb_set_report_58244 usb_set_report 0 58244 NULL ++btrfsic_create_link_to_next_block_58246 btrfsic_create_link_to_next_block 4 58246 NULL nohasharray ++regmap_raw_read_58246 regmap_raw_read 0 58246 &btrfsic_create_link_to_next_block_58246 ++erst_exec_stall_58252 erst_exec_stall 0 58252 NULL ++test_rtc_set_alarm_58255 test_rtc_set_alarm 0 58255 NULL ++read_file_debug_58256 read_file_debug 3-0 58256 NULL ++nilfs_sufile_get_segment_usage_block_58261 nilfs_sufile_get_segment_usage_block 0 58261 NULL ++osc_max_dirty_mb_seq_write_58263 osc_max_dirty_mb_seq_write 3 58263 NULL ++rtl8723be_hw_init_58265 rtl8723be_hw_init 0 58265 NULL ++cifs_revalidate_mapping_58266 cifs_revalidate_mapping 0 58266 NULL ++profile_load_58267 profile_load 3-0 58267 NULL ++kstrtos8_from_user_58268 kstrtos8_from_user 2 58268 NULL ++nf_call_arptables_store_58269 nf_call_arptables_store 4-0 58269 NULL ++acpi_ds_build_internal_package_obj_58271 acpi_ds_build_internal_package_obj 3-0 58271 NULL ++tps6105x_regulator_is_enabled_58273 tps6105x_regulator_is_enabled 0 58273 NULL ++vlv_rpe_freq_mhz_show_58274 vlv_rpe_freq_mhz_show 0 58274 NULL nohasharray ++set_enable_58274 set_enable 0-4 58274 &vlv_rpe_freq_mhz_show_58274 ++r100_mm_rreg_58276 r100_mm_rreg 0 58276 NULL nohasharray ++ds1553_nvram_write_58276 ds1553_nvram_write 0-6-5 58276 &r100_mm_rreg_58276 ++apds990x_lux_calib_show_58291 apds990x_lux_calib_show 0 58291 NULL ++iscsi_decode_text_input_58292 iscsi_decode_text_input 4 58292 NULL ++ext4_xattr_security_get_58301 ext4_xattr_security_get 0 58301 NULL ++intel_alloc_coherent_58302 intel_alloc_coherent 2 58302 NULL ++uart6850_open_58304 uart6850_open 0 58304 NULL ++mcp794xx_set_alarm_58306 mcp794xx_set_alarm 0 58306 NULL ++ieee80211_if_read_dot11MeshTTL_58307 ieee80211_if_read_dot11MeshTTL 3-0 58307 NULL nohasharray ++airo_resume_58307 airo_resume 0 58307 &ieee80211_if_read_dot11MeshTTL_58307 ++zd_chip_switch_radio_on_58309 zd_chip_switch_radio_on 0 58309 NULL nohasharray ++i915_wait_seqno_58309 i915_wait_seqno 0 58309 &zd_chip_switch_radio_on_58309 ++acpi_ds_scope_stack_push_58311 acpi_ds_scope_stack_push 0 58311 NULL nohasharray ++nilfs_checkpoints_attr_store_58311 nilfs_checkpoints_attr_store 0-4 58311 &acpi_ds_scope_stack_push_58311 ++post_send_58312 post_send 0 58312 NULL ++ov7660_set_auto_white_balance_58319 ov7660_set_auto_white_balance 0 58319 NULL ++__generic_file_fsync_58320 __generic_file_fsync 0 58320 NULL nohasharray ++xfs_dir2_leafn_split_58320 xfs_dir2_leafn_split 0 58320 &__generic_file_fsync_58320 ++sitd_urb_transaction_58322 sitd_urb_transaction 0 58322 NULL ++mic_virtio_copy_from_user_58323 mic_virtio_copy_from_user 3 58323 NULL nohasharray ++ff_eeprom_write_58323 ff_eeprom_write 0-2-4 58323 &mic_virtio_copy_from_user_58323 ++tx_tx_start_int_templates_read_58324 tx_tx_start_int_templates_read 3-0 58324 NULL ++mgslpc_resume_58329 mgslpc_resume 0 58329 NULL ++pcim_iomap_58334 pcim_iomap 3 58334 NULL nohasharray ++dlm_user_adopt_orphan_58334 dlm_user_adopt_orphan 0 58334 &pcim_iomap_58334 ++rmd320_init_58335 rmd320_init 0 58335 NULL nohasharray ++store_pwm2_enable_58335 store_pwm2_enable 0-4 58335 &rmd320_init_58335 ++diva_init_dma_map_58336 diva_init_dma_map 3 58336 NULL ++__copy_from_user_swizzled_58337 __copy_from_user_swizzled 2-4 58337 NULL nohasharray ++ax25_create_58337 ax25_create 0 58337 &__copy_from_user_swizzled_58337 nohasharray ++skb_ensure_writable_58337 skb_ensure_writable 2 58337 &ax25_create_58337 ++mt9m001_s_fmt_58340 mt9m001_s_fmt 0 58340 NULL ++name_assign_type_show_58341 name_assign_type_show 0 58341 NULL ++soft_offline_page_58343 soft_offline_page 0 58343 NULL ++get_in_max_58344 get_in_max 0 58344 NULL ++opts_show_58345 opts_show 0 58345 NULL ++ec_i2c_parse_response_58347 ec_i2c_parse_response 0 58347 NULL nohasharray ++show_ipOutMcastPkts_58347 show_ipOutMcastPkts 0 58347 &ec_i2c_parse_response_58347 nohasharray ++next_pidmap_58347 next_pidmap 2-0 58347 &show_ipOutMcastPkts_58347 ++vmalloc_to_sg_58354 vmalloc_to_sg 2 58354 NULL ++goldfish_pipe_read_write_58356 goldfish_pipe_read_write 0 58356 NULL ++find_aligned_range_58362 find_aligned_range 0-5-2 58362 NULL ++selinux_task_setscheduler_58363 selinux_task_setscheduler 0 58363 NULL ++macvlan_device_event_58365 macvlan_device_event 0 58365 NULL ++reiserfs_setxattr_58368 reiserfs_setxattr 0 58368 NULL ++wiimote_dev_show_58369 wiimote_dev_show 0 58369 NULL ++nilfs_bmap_convert_error_58371 nilfs_bmap_convert_error 0-3 58371 NULL ++saa7134_vb2_start_streaming_58372 saa7134_vb2_start_streaming 0 58372 NULL ++deadline_var_show_58374 deadline_var_show 0 58374 NULL ++find_best_unit_58375 find_best_unit 0 58375 NULL ++available_cpufv_show_58376 available_cpufv_show 0 58376 NULL ++ixgbe_find_vlvf_slot_58378 ixgbe_find_vlvf_slot 0 58378 NULL nohasharray ++ixgbevf_setup_all_tx_resources_58378 ixgbevf_setup_all_tx_resources 0 58378 &ixgbe_find_vlvf_slot_58378 ++snd_usb_endpoint_start_58379 snd_usb_endpoint_start 0 58379 NULL nohasharray ++ads7846_disable_store_58379 ads7846_disable_store 0-4 58379 &snd_usb_endpoint_start_58379 ++cxacru_sysfs_show_downstream_snr_margin_58384 cxacru_sysfs_show_downstream_snr_margin 0 58384 NULL ++il_dbgfs_status_read_58388 il_dbgfs_status_read 3-0 58388 NULL nohasharray ++loop_attr_autoclear_show_58388 loop_attr_autoclear_show 0 58388 &il_dbgfs_status_read_58388 ++hermes_docmd_wait_58393 hermes_docmd_wait 0 58393 NULL ++rt2800_enable_radio_58395 rt2800_enable_radio 0 58395 NULL ++max_ratio_show_58398 max_ratio_show 0 58398 NULL ++iscsi_disc_store_password_58403 iscsi_disc_store_password 0-3 58403 NULL ++skein_512_final_58405 skein_512_final 0 58405 NULL ++idetape_pad_zeros_58406 idetape_pad_zeros 2 58406 NULL ++xfs_btree_get_rec_58410 xfs_btree_get_rec 0 58410 NULL ++madc_read_58412 madc_read 0 58412 NULL ++fc0012_readreg_58415 fc0012_readreg 0 58415 NULL nohasharray ++can_create_58415 can_create 0 58415 &fc0012_readreg_58415 ++mmc_manfid_show_58419 mmc_manfid_show 0 58419 NULL nohasharray ++ib_uverbs_event_read_58419 ib_uverbs_event_read 0-3 58419 &mmc_manfid_show_58419 nohasharray ++adfs_notify_change_58419 adfs_notify_change 0 58419 &ib_uverbs_event_read_58419 ++smk_access_58423 smk_access 0 58423 NULL nohasharray ++bop_gather_data_58423 bop_gather_data 0-4 58423 &smk_access_58423 ++iscsi_offload_mesg_58425 iscsi_offload_mesg 5 58425 NULL ++wm831x_rtc_readtime_58429 wm831x_rtc_readtime 0 58429 NULL ++v4l2_m2m_reqbufs_58437 v4l2_m2m_reqbufs 0 58437 NULL ++show_bit_58443 show_bit 0 58443 NULL ++diolan_i2c_put_byte_ack_58446 diolan_i2c_put_byte_ack 0 58446 NULL ++sha384_ssse3_final_58451 sha384_ssse3_final 0 58451 NULL nohasharray ++zd_op_start_58451 zd_op_start 0 58451 &sha384_ssse3_final_58451 ++__vb2_init_fileio_58456 __vb2_init_fileio 0 58456 NULL ++capabilities_read_58457 capabilities_read 3-0 58457 NULL ++store_memory_58460 store_memory 0-4 58460 NULL ++usnic_vnic_get_resources_58462 usnic_vnic_get_resources 3 58462 NULL ++snd_seq_ioctl_get_queue_info_58464 snd_seq_ioctl_get_queue_info 0 58464 NULL ++compat_do_ipt_set_ctl_58466 compat_do_ipt_set_ctl 4 58466 NULL nohasharray ++lpfc_idiag_baracc_read_58466 lpfc_idiag_baracc_read 3-0 58466 &compat_do_ipt_set_ctl_58466 nohasharray ++bnad_mem_alloc_58466 bnad_mem_alloc 0 58466 &lpfc_idiag_baracc_read_58466 ++vol_cdev_fsync_58467 vol_cdev_fsync 0 58467 NULL ++qib_write_umem64_58468 qib_write_umem64 0 58468 NULL ++show_flow_cntrl_58473 show_flow_cntrl 0 58473 NULL ++cxgb_up_58476 cxgb_up 0 58476 NULL ++affs_write_end_ofs_58477 affs_write_end_ofs 0-5 58477 NULL nohasharray ++sctp_get_port_local_58477 sctp_get_port_local 0 58477 &affs_write_end_ofs_58477 ++show_nctxts_58478 show_nctxts 0 58478 NULL ++dgram_enqueue_58479 dgram_enqueue 0 58479 NULL ++snd_rme96_capture_copy_58484 snd_rme96_capture_copy 5 58484 NULL nohasharray ++shmem_reacct_size_58484 shmem_reacct_size 0 58484 &snd_rme96_capture_copy_58484 ++restart_syscall_58485 restart_syscall 0 58485 NULL nohasharray ++cmpc_accel_sensitivity_store_v4_58485 cmpc_accel_sensitivity_store_v4 0-4 58485 &restart_syscall_58485 ++dw_spi_show_regs_58486 dw_spi_show_regs 3-0 58486 NULL ++batadv_bla_is_backbone_gw_58488 batadv_bla_is_backbone_gw 3 58488 NULL ++wm831x_reg_write_58489 wm831x_reg_write 0 58489 NULL ++isl1208_rtc_set_alarm_58494 isl1208_rtc_set_alarm 0 58494 NULL ++show_temp_alarms_58495 show_temp_alarms 0 58495 NULL ++btrfs_cont_expand_58498 btrfs_cont_expand 0 58498 NULL ++memory_subsys_online_58499 memory_subsys_online 0 58499 NULL ++show_ipReasmOKs_58505 show_ipReasmOKs 0 58505 NULL ++setcontrast_58506 setcontrast 0 58506 NULL nohasharray ++rt61pci_set_device_state_58506 rt61pci_set_device_state 0 58506 &setcontrast_58506 nohasharray ++patch_cs420x_58506 patch_cs420x 0 58506 &rt61pci_set_device_state_58506 ++tcf_hash_create_58507 tcf_hash_create 4 58507 NULL ++gfs2_dir_get_new_buffer_58509 gfs2_dir_get_new_buffer 0 58509 NULL ++w7090p_tuner_read_serpar_58513 w7090p_tuner_read_serpar 0-3 58513 NULL ++smi_request_store_58516 smi_request_store 0-4 58516 NULL ++efs_readpage_58517 efs_readpage 0 58517 NULL ++cifs_write_from_iter_58526 cifs_write_from_iter 2-0 58526 NULL ++freezer_write_58529 freezer_write 0-3 58529 NULL ++ext2_writepages_58533 ext2_writepages 0 58533 NULL ++alloc_mbx_args_58536 alloc_mbx_args 0 58536 NULL ++rndis_add_response_58544 rndis_add_response 2 58544 NULL nohasharray ++xfs_attr3_leaf_to_node_58544 xfs_attr3_leaf_to_node 0 58544 &rndis_add_response_58544 ++twl4030_madc_read_channels_58559 twl4030_madc_read_channels 0 58559 NULL ++ath10k_debug_htt_stats_req_58561 ath10k_debug_htt_stats_req 0 58561 NULL ++wep_decrypt_fail_read_58567 wep_decrypt_fail_read 3-0 58567 NULL ++dev_set_mac_address_58568 dev_set_mac_address 0 58568 NULL ++gpio_twl4030_read_58572 gpio_twl4030_read 0 58572 NULL ++sip_sprintf_addr_port_58574 sip_sprintf_addr_port 0 58574 NULL ++scsi_scan_host_selected_58575 scsi_scan_host_selected 0 58575 NULL ++scnprint_mac_oui_58578 scnprint_mac_oui 0-3 58578 NULL ++store_sustain_58580 store_sustain 0-4 58580 NULL ++cur_wm_latency_write_58581 cur_wm_latency_write 3-0 58581 NULL ++sendmsg_58582 sendmsg 0-4 58582 NULL ++ea_read_inline_58589 ea_read_inline 0 58589 NULL ++isku_sysfs_read_keys_thumbster_58590 isku_sysfs_read_keys_thumbster 6-0-5 58590 NULL ++xip_file_read_58592 xip_file_read 3-0 58592 NULL ++ecryptfs_write_end_58594 ecryptfs_write_end 5-3-0 58594 NULL ++gdth_search_isa_58595 gdth_search_isa 1 58595 NULL ++ath5k_rx_start_58602 ath5k_rx_start 0 58602 NULL ++force_remove_store_58605 force_remove_store 0-4 58605 NULL ++snd_seq_ioctl_get_queue_status_58607 snd_seq_ioctl_get_queue_status 0 58607 NULL ++btrfs_direct_IO_58608 btrfs_direct_IO 4-0 58608 NULL ++show_selfballoon_interval_58611 show_selfballoon_interval 0 58611 NULL ++acpi_ut_copy_isimple_to_esimple_58617 acpi_ut_copy_isimple_to_esimple 0 58617 NULL ++pwm_duty_cycle_store_58620 pwm_duty_cycle_store 0-4 58620 NULL ++bond_event_changename_58623 bond_event_changename 0 58623 NULL ++skb_copy_to_page_nocache_58624 skb_copy_to_page_nocache 6-0 58624 NULL ++pmbus_read_byte_data_58627 pmbus_read_byte_data 0 58627 NULL ++run_show_58628 run_show 0 58628 NULL nohasharray ++ath10k_bmi_read_memory_58628 ath10k_bmi_read_memory 0 58628 &run_show_58628 ++filemap_fdatawrite_range_58630 filemap_fdatawrite_range 0 58630 NULL ++vb2_qbuf_58631 vb2_qbuf 0 58631 NULL ++tcp_packet_58632 tcp_packet 0 58632 NULL nohasharray ++dlmfs_file_setattr_58632 dlmfs_file_setattr 0 58632 &tcp_packet_58632 ++module_alloc_update_bounds_rx_58634 module_alloc_update_bounds_rx 1 58634 NULL nohasharray ++efi_ioremap_58634 efi_ioremap 1-2 58634 &module_alloc_update_bounds_rx_58634 ++tcs3472_show_int_time_available_58636 tcs3472_show_int_time_available 0 58636 NULL ++cisco_hard_header_58638 cisco_hard_header 0 58638 NULL nohasharray ++i40e_vsi_configure_tx_58638 i40e_vsi_configure_tx 0 58638 &cisco_hard_header_58638 ++tx_tx_start_fw_gen_read_58648 tx_tx_start_fw_gen_read 3-0 58648 NULL ++acpi_ds_exec_end_control_op_58649 acpi_ds_exec_end_control_op 0 58649 NULL ++pcap_rtc_read_time_58650 pcap_rtc_read_time 0 58650 NULL ++fmvj18x_suspend_58653 fmvj18x_suspend 0 58653 NULL ++iwl_dbgfs_rx_handlers_write_58655 iwl_dbgfs_rx_handlers_write 3-0 58655 NULL ++nas_led_blink_store_58660 nas_led_blink_store 0-4 58660 NULL ++snd_fm801_capture_trigger_58662 snd_fm801_capture_trigger 0 58662 NULL nohasharray ++qs6612_config_init_58662 qs6612_config_init 0 58662 &snd_fm801_capture_trigger_58662 nohasharray ++nfulnl_alloc_skb_58662 nfulnl_alloc_skb 4-3 58662 &qs6612_config_init_58662 ++extcon_update_state_58670 extcon_update_state 0 58670 NULL ++lis3lv02d_misc_read_58672 lis3lv02d_misc_read 0-3 58672 NULL ++simple_statfs_58676 simple_statfs 0 58676 NULL ++store_local_port_58678 store_local_port 0 58678 NULL ++iwl_trans_send_cmd_58681 iwl_trans_send_cmd 0 58681 NULL ++nilfs_btree_do_lookup_last_58684 nilfs_btree_do_lookup_last 0 58684 NULL ++mcs7830_set_reg_async_58685 mcs7830_set_reg_async 3 58685 NULL ++uwb_bce_print_IEs_58686 uwb_bce_print_IEs 4-0 58686 NULL ++tps6586x_writes_58689 tps6586x_writes 2-3-0 58689 NULL ++nfs_scan_commit_58690 nfs_scan_commit 0 58690 NULL ++nilfs_segbuf_submit_bh_58691 nilfs_segbuf_submit_bh 0 58691 NULL ++tpm_show_ppi_version_58692 tpm_show_ppi_version 0 58692 NULL ++tcm_loop_tpg_store_transport_status_58695 tcm_loop_tpg_store_transport_status 0-3 58695 NULL ++regulator_min_uA_show_58696 regulator_min_uA_show 0 58696 NULL ++show_temp_crit_alarm_58698 show_temp_crit_alarm 0 58698 NULL ++vmalloc_node_58700 vmalloc_node 1 58700 NULL ++transient_activate_show_58702 transient_activate_show 0 58702 NULL ++scsi_setup_command_freelist_58703 scsi_setup_command_freelist 0 58703 NULL nohasharray ++visor_charqueue_create_58703 visor_charqueue_create 1 58703 &scsi_setup_command_freelist_58703 ++iscsi_tpg_param_show_MaxBurstLength_58706 iscsi_tpg_param_show_MaxBurstLength 0 58706 NULL ++core_alua_show_trans_delay_msecs_58708 core_alua_show_trans_delay_msecs 0 58708 NULL ++vx_send_msg_58711 vx_send_msg 0 58711 NULL ++_osd_req_finalize_cdb_cont_58713 _osd_req_finalize_cdb_cont 0 58713 NULL ++snd_als300_playback_prepare_58717 snd_als300_playback_prepare 0 58717 NULL ++acpi_map_58725 acpi_map 1-2 58725 NULL nohasharray ++go7007_i2c_master_xfer_58725 go7007_i2c_master_xfer 0-3 58725 &acpi_map_58725 ++idt77252_init_rx_58728 idt77252_init_rx 0 58728 NULL ++da9052_gpio_to_irq_58729 da9052_gpio_to_irq 2 58729 NULL ++csum_exist_in_range_58730 csum_exist_in_range 2-3 58730 NULL ++on26_read_regr_58734 on26_read_regr 0 58734 NULL ++do_tx_58737 do_tx 0 58737 NULL ++qla2x00_flash_block_size_show_58747 qla2x00_flash_block_size_show 0 58747 NULL ++ieee80211_if_write_tkip_mic_test_58748 ieee80211_if_write_tkip_mic_test 3-0 58748 NULL nohasharray ++lpfc_fcp_imax_show_58748 lpfc_fcp_imax_show 0 58748 &ieee80211_if_write_tkip_mic_test_58748 ++aarp_device_event_58749 aarp_device_event 0 58749 NULL ++show_iface_tcp_wsf_disable_58750 show_iface_tcp_wsf_disable 0 58750 NULL ++qlcnic_83xx_napi_add_58751 qlcnic_83xx_napi_add 0 58751 NULL ++ft_parse_wwn_58752 ft_parse_wwn 0 58752 NULL ++__set_rdc_table_num_58755 __set_rdc_table_num 0 58755 NULL ++iscsi_tpg_param_store_InitialR2T_58757 iscsi_tpg_param_store_InitialR2T 0-3 58757 NULL ++kernfs_iop_removexattr_58760 kernfs_iop_removexattr 0 58760 NULL ++agp_allocate_memory_58761 agp_allocate_memory 2 58761 NULL ++via_gpio_dir_out_58763 via_gpio_dir_out 0 58763 NULL nohasharray ++__do_config_autodelink_58763 __do_config_autodelink 3 58763 &via_gpio_dir_out_58763 ++wil_fw_verify_58765 wil_fw_verify 0 58765 NULL ++dn_fib_dnaddr_event_58767 dn_fib_dnaddr_event 0 58767 NULL nohasharray ++broadsheet_loadstore_waveform_58767 broadsheet_loadstore_waveform 0-4 58767 &dn_fib_dnaddr_event_58767 ++coherency_line_size_show_58775 coherency_line_size_show 0 58775 NULL ++__uncore_occ_sel_show_58777 __uncore_occ_sel_show 0 58777 NULL ++fuse_reverse_inval_inode_58782 fuse_reverse_inval_inode 0 58782 NULL ++ecryptfs_derive_iv_58784 ecryptfs_derive_iv 0 58784 NULL ++show_58791 show 0 58791 NULL ++regmap_calc_reg_len_58795 regmap_calc_reg_len 0 58795 NULL ++smack_inode_setxattr_58801 smack_inode_setxattr 0 58801 NULL ++dlm_lock_58802 dlm_lock 0 58802 NULL nohasharray ++mmc_hwrev_show_58802 mmc_hwrev_show 0 58802 &dlm_lock_58802 ++raw_send_hdrinc_58803 raw_send_hdrinc 4 58803 NULL ++soc_camera_platform_cropcap_58806 soc_camera_platform_cropcap 0 58806 NULL nohasharray ++isku_sysfs_read_58806 isku_sysfs_read 0-5 58806 &soc_camera_platform_cropcap_58806 ++pci_dma_mapping_error_58811 pci_dma_mapping_error 2 58811 NULL ++write_file_58812 write_file 4 58812 NULL ++ipr_show_iopoll_weight_58813 ipr_show_iopoll_weight 0 58813 NULL nohasharray ++ep_read_58813 ep_read 3 58813 &ipr_show_iopoll_weight_58813 ++show_tempsense_58819 show_tempsense 0 58819 NULL ++ufshcd_change_queue_depth_58821 ufshcd_change_queue_depth 0-2 58821 NULL ++usbhsg_ep_enable_58825 usbhsg_ep_enable 0 58825 NULL ++tnc_read_node_nm_58830 tnc_read_node_nm 0 58830 NULL ++pm8001_chip_ssp_io_req_58831 pm8001_chip_ssp_io_req 0 58831 NULL ++command_write_58841 command_write 3-0 58841 NULL nohasharray ++diolan_i2c_start_58841 diolan_i2c_start 0 58841 &command_write_58841 ++vendor_show_58845 vendor_show 0 58845 NULL nohasharray ++ep_bd_list_alloc_58845 ep_bd_list_alloc 0 58845 &vendor_show_58845 ++iio_trigger_detach_poll_func_58847 iio_trigger_detach_poll_func 0 58847 NULL ++asus_wmi_evaluate_method_58849 asus_wmi_evaluate_method 0 58849 NULL nohasharray ++begin_58849 begin 0 58849 &asus_wmi_evaluate_method_58849 ++i915_l3_read_58851 i915_l3_read 0-5-6 58851 NULL nohasharray ++asr_write_58851 asr_write 0-3 58851 &i915_l3_read_58851 ++fuse_dev_write_58852 fuse_dev_write 0 58852 NULL nohasharray ++myri10ge_change_mtu_58852 myri10ge_change_mtu 0 58852 &fuse_dev_write_58852 ++ath6kl_wmi_send_action_cmd_58860 ath6kl_wmi_send_action_cmd 7 58860 NULL ++mptscsih_version_fw_show_58861 mptscsih_version_fw_show 0 58861 NULL nohasharray ++tcp_v4_init_sock_58861 tcp_v4_init_sock 0 58861 &mptscsih_version_fw_show_58861 ++dump_midi_58863 dump_midi 3 58863 NULL nohasharray ++target_core_dev_wwn_attr_store_58863 target_core_dev_wwn_attr_store 0-4 58863 &dump_midi_58863 ++wl12xx_pre_upload_58866 wl12xx_pre_upload 0 58866 NULL ++i2c_atmel_send_58870 i2c_atmel_send 3-0 58870 NULL ++out_read_index_show_58873 out_read_index_show 0 58873 NULL ++nilfs_dev_device_size_show_58875 nilfs_dev_device_size_show 0 58875 NULL ++pm80xx_chip_sata_req_58878 pm80xx_chip_sata_req 0 58878 NULL nohasharray ++srp_lookup_path_58878 srp_lookup_path 0 58878 &pm80xx_chip_sata_req_58878 ++il4965_static_wepkey_cmd_58879 il4965_static_wepkey_cmd 0 58879 NULL nohasharray ++vmxnet3_tq_create_58879 vmxnet3_tq_create 0 58879 &il4965_static_wepkey_cmd_58879 ++sony_nc_sysfs_show_58880 sony_nc_sysfs_show 0 58880 NULL nohasharray ++hotplug_enabled_store_58880 hotplug_enabled_store 0-4 58880 &sony_nc_sysfs_show_58880 ++pnp_show_card_ids_58881 pnp_show_card_ids 0 58881 NULL ++lxt973a2_update_link_58883 lxt973a2_update_link 0 58883 NULL nohasharray ++gs_alloc_req_58883 gs_alloc_req 2 58883 &lxt973a2_update_link_58883 ++nes_store_wqm_quanta_58885 nes_store_wqm_quanta 0-3 58885 NULL ++cs553x_init_one_58886 cs553x_init_one 3 58886 NULL ++wlcore_handle_static_data_58888 wlcore_handle_static_data 0 58888 NULL ++ipath_user_sdma_pin_pkt_58901 ipath_user_sdma_pin_pkt 0 58901 NULL ++ltc4222_show_value_58902 ltc4222_show_value 0 58902 NULL ++sd_format_disk_name_58907 sd_format_disk_name 0 58907 NULL ++hackrf_ctrl_msg_58912 hackrf_ctrl_msg 0 58912 NULL ++store_in8_58913 store_in8 0-4 58913 NULL ++compat_fillonedir_58914 compat_fillonedir 3 58914 NULL nohasharray ++hsw_pcm_trigger_58914 hsw_pcm_trigger 0 58914 &compat_fillonedir_58914 nohasharray ++lprocfs_wr_pinger_recov_58914 lprocfs_wr_pinger_recov 3 58914 &hsw_pcm_trigger_58914 ++print_devstats_dot11FCSErrorCount_58919 print_devstats_dot11FCSErrorCount 3 58919 NULL ++ncp_request_58920 ncp_request 0 58920 NULL ++clocksource_unbind_58922 clocksource_unbind 0 58922 NULL ++pipeline_cs_rx_packet_out_read_58926 pipeline_cs_rx_packet_out_read 3-0 58926 NULL nohasharray ++isku_sysfs_show_actual_profile_58926 isku_sysfs_show_actual_profile 0 58926 &pipeline_cs_rx_packet_out_read_58926 ++t4vf_config_rss_range_58930 t4vf_config_rss_range 0 58930 NULL ++SyS_pread64_58935 SyS_pread64 3 58935 NULL ++xfs_bmap_read_extents_58936 xfs_bmap_read_extents 0 58936 NULL ++set_als_58942 set_als 0-4 58942 NULL ++iscsi_disc_show_authenticate_target_58943 iscsi_disc_show_authenticate_target 0 58943 NULL nohasharray ++atl2_request_irq_58943 atl2_request_irq 0 58943 &iscsi_disc_show_authenticate_target_58943 ++dlm_new_lockspace_58945 dlm_new_lockspace 0 58945 NULL ++koneplus_sysfs_write_profile_buttons_58951 koneplus_sysfs_write_profile_buttons 0-6-5 58951 NULL ++st5481_isoc_flatten_58952 st5481_isoc_flatten 0 58952 NULL ++store_multicast_router_58954 store_multicast_router 0 58954 NULL ++netpoll_send_udp_58955 netpoll_send_udp 3 58955 NULL ++version_show_58957 version_show 0 58957 NULL ++pcf8523_write_58961 pcf8523_write 0 58961 NULL ++target_core_attr_show_58962 target_core_attr_show 0 58962 NULL ++ieee80211_if_fmt_dot11MeshHWMPactivePathToRootTimeout_58965 ieee80211_if_fmt_dot11MeshHWMPactivePathToRootTimeout 3 58965 NULL nohasharray ++fddi_change_mtu_58965 fddi_change_mtu 0 58965 &ieee80211_if_fmt_dot11MeshHWMPactivePathToRootTimeout_58965 ++wake_up_modem_show_58966 wake_up_modem_show 0 58966 NULL ++CIFS_SessSetup_58968 CIFS_SessSetup 0 58968 NULL nohasharray ++wacom_led0_select_store_58968 wacom_led0_select_store 4-0 58968 &CIFS_SessSetup_58968 ++cgroup_tasks_write_58971 cgroup_tasks_write 3-0 58971 NULL ++vmci_transport_notify_send_pre_block_58972 vmci_transport_notify_send_pre_block 0 58972 NULL ++msi001_wreg_58975 msi001_wreg 0 58975 NULL nohasharray ++rs5c348_rtc_read_time_58975 rs5c348_rtc_read_time 0 58975 &msi001_wreg_58975 nohasharray ++als_wait_for_data_ready_58975 als_wait_for_data_ready 0 58975 &rs5c348_rtc_read_time_58975 ++store_fc_host_system_hostname_58977 store_fc_host_system_hostname 0-4 58977 NULL ++ipxitf_device_event_58983 ipxitf_device_event 0 58983 NULL ++switch_radio_on_58985 switch_radio_on 0 58985 NULL ++fsp_attr_show_ver_58986 fsp_attr_show_ver 0 58986 NULL ++rtpm_children_show_58989 rtpm_children_show 0 58989 NULL ++chip_direction_input_58992 chip_direction_input 0 58992 NULL ++handle_rx_packet_58993 handle_rx_packet 3 58993 NULL ++show_comm_59000 show_comm 0 59000 NULL ++isku_set_actual_profile_59004 isku_set_actual_profile 0 59004 NULL ++init_list_set_59005 init_list_set 3 59005 NULL ++ep_write_59008 ep_write 3 59008 NULL ++ds2780_recall_eeprom_59009 ds2780_recall_eeprom 0 59009 NULL ++beiscsi_ep_get_param_59012 beiscsi_ep_get_param 0 59012 NULL ++lpfc_idiag_baracc_write_59014 lpfc_idiag_baracc_write 3-0 59014 NULL ++ad5360_update_ctrl_59016 ad5360_update_ctrl 0 59016 NULL ++ath10k_wmi_force_fw_hang_59026 ath10k_wmi_force_fw_hang 0 59026 NULL ++SyS_preadv_59029 SyS_preadv 3 59029 NULL ++init_pci_cap_msi_perm_59033 init_pci_cap_msi_perm 2-0 59033 NULL nohasharray ++setgain_59033 setgain 0 59033 &init_pci_cap_msi_perm_59033 ++show_fnode_isid_59034 show_fnode_isid 0 59034 NULL ++write_59035 write 0 59035 NULL ++selinux_transaction_write_59038 selinux_transaction_write 3-0 59038 NULL ++contrast_store_59039 contrast_store 0-4 59039 NULL ++ct_pcm_capture_trigger_59041 ct_pcm_capture_trigger 0 59041 NULL ++mwifiex_cmd_11n_delba_59043 mwifiex_cmd_11n_delba 0 59043 NULL ++set_therm_min_59046 set_therm_min 0-4 59046 NULL ++target_stat_scsi_lu_show_attr_status_59047 target_stat_scsi_lu_show_attr_status 0 59047 NULL ++regmap_bulk_write_59049 regmap_bulk_write 2-4-0 59049 NULL nohasharray ++elan_i2c_write_fw_block_59049 elan_i2c_write_fw_block 0 59049 ®map_bulk_write_59049 ++__bnx2x_get_regs_len_59052 __bnx2x_get_regs_len 0 59052 NULL ++dlci_header_59057 dlci_header 0 59057 NULL ++dm9161_config_init_59059 dm9161_config_init 0 59059 NULL ++acpi_ns_search_and_enter_59061 acpi_ns_search_and_enter 0 59061 NULL ++da9052_gpio_direction_input_59062 da9052_gpio_direction_input 0 59062 NULL ++gspca_init_transfer_59079 gspca_init_transfer 0 59079 NULL ++tcm_qla2xxx_wwn_show_attr_version_59082 tcm_qla2xxx_wwn_show_attr_version 0 59082 NULL ++bcm_sf2_port_setup_59085 bcm_sf2_port_setup 0 59085 NULL ++si4713_tx_tune_freq_59087 si4713_tx_tune_freq 0 59087 NULL nohasharray ++nes_store_idx_data_59087 nes_store_idx_data 0-3 59087 &si4713_tx_tune_freq_59087 nohasharray ++store_rx_pol_inv_59087 store_rx_pol_inv 0-4 59087 &nes_store_idx_data_59087 ++show_tcrit2_hyst_59088 show_tcrit2_hyst 0 59088 NULL nohasharray ++cpuidle_store_59088 cpuidle_store 0-4 59088 &show_tcrit2_hyst_59088 ++snd_cmipci_pcm_trigger_59090 snd_cmipci_pcm_trigger 0 59090 NULL ++nfs4_map_errors_59095 nfs4_map_errors 0-1 59095 NULL ++xfs_zero_eof_59103 xfs_zero_eof 3-2-0 59103 NULL ++tiadc_buffer_preenable_59104 tiadc_buffer_preenable 0 59104 NULL ++hfsplus_trusted_listxattr_59112 hfsplus_trusted_listxattr 0-5 59112 NULL nohasharray ++mmc_sd_num_wr_blocks_59112 mmc_sd_num_wr_blocks 0 59112 &hfsplus_trusted_listxattr_59112 ++launder_page_59115 launder_page 0 59115 NULL nohasharray ++class_pktcdvd_show_map_59115 class_pktcdvd_show_map 0 59115 &launder_page_59115 ++bConfigurationValue_show_59121 bConfigurationValue_show 0 59121 NULL nohasharray ++show_session_param_ISCSI_PARAM_BOOT_NIC_59121 show_session_param_ISCSI_PARAM_BOOT_NIC 0 59121 &bConfigurationValue_show_59121 ++sta_tx_latency_stat_table_59122 sta_tx_latency_stat_table 0-4-5 59122 NULL nohasharray ++temp_get_59122 temp_get 0 59122 &sta_tx_latency_stat_table_59122 nohasharray ++scsi_io_completion_59122 scsi_io_completion 2 59122 &temp_get_59122 ++wait_for_completion_killable_timeout_59124 wait_for_completion_killable_timeout 0 59124 NULL ++nfc_llcp_send_i_frame_59130 nfc_llcp_send_i_frame 3-0 59130 NULL ++reiserfs_commit_for_inode_59131 reiserfs_commit_for_inode 0 59131 NULL ++__iio_add_event_config_attrs_59136 __iio_add_event_config_attrs 0 59136 NULL nohasharray ++__uncore_occ_invert_show_59136 __uncore_occ_invert_show 0 59136 &__iio_add_event_config_attrs_59136 ++tg_set_conf_59142 tg_set_conf 0-3 59142 NULL ++pch_gbe_change_mtu_59144 pch_gbe_change_mtu 0 59144 NULL ++print_devstats_dot11RTSSuccessCount_59145 print_devstats_dot11RTSSuccessCount 3 59145 NULL nohasharray ++framebuffer_alloc_59145 framebuffer_alloc 1 59145 &print_devstats_dot11RTSSuccessCount_59145 ++lpfc_link_speed_store_59146 lpfc_link_speed_store 0-4 59146 NULL ++qla2x00_sysfs_read_optrom_59148 qla2x00_sysfs_read_optrom 6-0-5 59148 NULL ++radeon_compat_ioctl_59150 radeon_compat_ioctl 2 59150 NULL ++pvr2_hdw_report_clients_59152 pvr2_hdw_report_clients 3 59152 NULL ++fan_fan_watchdog_store_59153 fan_fan_watchdog_store 0-3 59153 NULL ++snd_ad1889_capture_trigger_59160 snd_ad1889_capture_trigger 0 59160 NULL ++sha224_ssse3_final_59161 sha224_ssse3_final 0 59161 NULL ++qla4_83xx_start_firmware_59164 qla4_83xx_start_firmware 0 59164 NULL ++jffs2_do_readpage_nolock_59166 jffs2_do_readpage_nolock 0 59166 NULL ++ieee802154_create_59169 ieee802154_create 0 59169 NULL ++ksize_59176 ksize 0 59176 NULL ++setup_window_59178 setup_window 7-5-2-4 59178 NULL ++patch_alc268_59181 patch_alc268 0 59181 NULL nohasharray ++fill_bitmap_rle_bits_59181 fill_bitmap_rle_bits 0 59181 &patch_alc268_59181 nohasharray ++lowpan_fetch_skb_59181 lowpan_fetch_skb 3 59181 &fill_bitmap_rle_bits_59181 ++sh_csi2_s_fmt_59187 sh_csi2_s_fmt 0 59187 NULL nohasharray ++cbaf_wusb_ck_store_59187 cbaf_wusb_ck_store 0-4 59187 &sh_csi2_s_fmt_59187 ++show_fan_smart_tach_59191 show_fan_smart_tach 0 59191 NULL ++ims_pcu_attribute_store_59196 ims_pcu_attribute_store 0-4 59196 NULL ++gadget_dev_desc_bDeviceProtocol_store_59200 gadget_dev_desc_bDeviceProtocol_store 0-3 59200 NULL ++acpi_ex_name_segment_59202 acpi_ex_name_segment 0 59202 NULL ++cpia2_s_ctrl_59205 cpia2_s_ctrl 0 59205 NULL ++dtcs033_start_59207 dtcs033_start 0 59207 NULL nohasharray ++rv3029c2_i2c_write_regs_59207 rv3029c2_i2c_write_regs 0 59207 &dtcs033_start_59207 ++xfs_iext_realloc_indirect_59211 xfs_iext_realloc_indirect 2 59211 NULL ++i2c_hid_raw_request_59214 i2c_hid_raw_request 0-4 59214 NULL nohasharray ++fast_rx_path_59214 fast_rx_path 3 59214 &i2c_hid_raw_request_59214 ++osst_get_logical_frame_59215 osst_get_logical_frame 0 59215 NULL ++inftl_partscan_59216 inftl_partscan 0 59216 NULL ++ath10k_debug_cal_data_read_59222 ath10k_debug_cal_data_read 3-0 59222 NULL ++dt3155_read_59226 dt3155_read 3 59226 NULL ++xen_write_cr3_init_59228 xen_write_cr3_init 1 59228 NULL ++ql_adapter_initialize_59229 ql_adapter_initialize 0 59229 NULL ++sdev_store_queue_depth_59231 sdev_store_queue_depth 0-4 59231 NULL nohasharray ++dummy_queue_59231 dummy_queue 0 59231 &sdev_store_queue_depth_59231 ++qlcnic_get_pci_info_59233 qlcnic_get_pci_info 0 59233 NULL ++__logfs_write_inode_59237 __logfs_write_inode 0 59237 NULL nohasharray ++store_59237 store 0-3 59237 &__logfs_write_inode_59237 ++wacom_btnimg0_store_59239 wacom_btnimg0_store 4-0 59239 NULL ++_prepare_for_striping_59240 _prepare_for_striping 0 59240 NULL ++qla4_8xxx_device_state_handler_59242 qla4_8xxx_device_state_handler 0 59242 NULL ++SMB2_write_59246 SMB2_write 0 59246 NULL ++cyber2000fb_decode_crtc_59247 cyber2000fb_decode_crtc 0 59247 NULL ++wlcore_cmd_regdomain_config_locked_59248 wlcore_cmd_regdomain_config_locked 0 59248 NULL ++tg3_poll_fw_59249 tg3_poll_fw 0 59249 NULL ++ib_ucm_write_59250 ib_ucm_write 0-3 59250 NULL nohasharray ++brcmf_p2p_ifchange_59250 brcmf_p2p_ifchange 0 59250 &ib_ucm_write_59250 ++lola_set_clock_59255 lola_set_clock 0 59255 NULL ++hid_rtc_read_time_59262 hid_rtc_read_time 0 59262 NULL nohasharray ++store_target_temp_59262 store_target_temp 0-4 59262 &hid_rtc_read_time_59262 ++max_active_store_59266 max_active_store 0-4 59266 NULL ++iwlagn_update_beacon_59272 iwlagn_update_beacon 0 59272 NULL ++lut_s_stream_59273 lut_s_stream 0 59273 NULL ++i40e_up_complete_59277 i40e_up_complete 0 59277 NULL nohasharray ++cfhsi_open_59277 cfhsi_open 0 59277 &i40e_up_complete_59277 ++da9055_reg_update_59280 da9055_reg_update 0 59280 NULL nohasharray ++saa6752hs_s_mbus_fmt_59280 saa6752hs_s_mbus_fmt 0 59280 &da9055_reg_update_59280 ++node_memory_callback_59283 node_memory_callback 0 59283 NULL ++reiserfs_getxattr_59286 reiserfs_getxattr 0 59286 NULL ++show_pressure_59287 show_pressure 0 59287 NULL nohasharray ++_transport_expander_phy_control_59287 _transport_expander_phy_control 0 59287 &show_pressure_59287 ++show_install_59288 show_install 0 59288 NULL nohasharray ++iio_sysfs_trigger_poll_59288 iio_sysfs_trigger_poll 0-4 59288 &show_install_59288 ++show_shost_mode_59289 show_shost_mode 0 59289 NULL ++iscsit_ta_default_cmdsn_depth_59290 iscsit_ta_default_cmdsn_depth 0 59290 NULL ++key_instantiate_and_link_59295 key_instantiate_and_link 0 59295 NULL nohasharray ++rtl88e_download_fw_59295 rtl88e_download_fw 0 59295 &key_instantiate_and_link_59295 ++store_delete_devices_59296 store_delete_devices 0-4 59296 NULL ++pin_hbr_setup_59300 pin_hbr_setup 0 59300 NULL ++udp_error_59301 udp_error 0 59301 NULL nohasharray ++netdev_queue_update_kobjects_59301 netdev_queue_update_kobjects 0 59301 &udp_error_59301 ++get_key_haup_common_59302 get_key_haup_common 5 59302 NULL nohasharray ++in_read_index_show_59302 in_read_index_show 0 59302 &get_key_haup_common_59302 ++mxt_bootloader_read_59303 mxt_bootloader_read 0 59303 NULL ++btrfs_insert_dir_item_59304 btrfs_insert_dir_item 4 59304 NULL ++da9052_read_chgend_current_59305 da9052_read_chgend_current 0 59305 NULL nohasharray ++start_59305 start 0 59305 &da9052_read_chgend_current_59305 ++scsiback_wwn_show_attr_version_59315 scsiback_wwn_show_attr_version 0 59315 NULL ++fd_copyout_59323 fd_copyout 3 59323 NULL ++store_59326 store 0-4 59326 NULL ++carl9170_upload_key_59330 carl9170_upload_key 0 59330 NULL ++mt9v022_cropcap_59331 mt9v022_cropcap 0 59331 NULL ++ati_remote2_store_channel_mask_59334 ati_remote2_store_channel_mask 0-4 59334 NULL ++debug_store_59337 debug_store 0-4 59337 NULL ++rx_defrag_in_process_called_read_59338 rx_defrag_in_process_called_read 3-0 59338 NULL nohasharray ++show_resume_reason_59338 show_resume_reason 0 59338 &rx_defrag_in_process_called_read_59338 ++sg_new_read_59344 sg_new_read 0-3 59344 NULL ++acpi_show_profile_59345 acpi_show_profile 0 59345 NULL ++xfs_attrmulti_attr_set_59346 xfs_attrmulti_attr_set 4 59346 NULL ++show_transport_handle_59347 show_transport_handle 0 59347 NULL ++gfs2_quota_lock_check_59353 gfs2_quota_lock_check 0 59353 NULL ++target_core_alua_tg_pt_gp_attr_store_59357 target_core_alua_tg_pt_gp_attr_store 0-4 59357 NULL nohasharray ++store_in_reg_59357 store_in_reg 0-4 59357 &target_core_alua_tg_pt_gp_attr_store_59357 ++xfs_dir2_sf_entsize_59366 xfs_dir2_sf_entsize 0-2 59366 NULL nohasharray ++SyS_getrandom_59366 SyS_getrandom 2 59366 &xfs_dir2_sf_entsize_59366 ++xen_set_identity_and_release_chunk_59368 xen_set_identity_and_release_chunk 1 59368 NULL ++i7core_inject_type_store_59376 i7core_inject_type_store 0-4 59376 NULL ++pvr2_debugifc_print_info_59380 pvr2_debugifc_print_info 3 59380 NULL ++ibmasm_start_reverse_heartbeat_59382 ibmasm_start_reverse_heartbeat 0 59382 NULL ++journal_init_dev_59384 journal_init_dev 5 59384 NULL ++__net_get_random_once_59389 __net_get_random_once 2 59389 NULL ++diff_objects_59390 diff_objects 0 59390 NULL nohasharray ++show_hca_59390 show_hca 0 59390 &diff_objects_59390 ++fc_frame_alloc_fill_59394 fc_frame_alloc_fill 2 59394 NULL ++qlcnic_83xx_config_intrpt_59397 qlcnic_83xx_config_intrpt 0 59397 NULL ++pci_write_config_59398 pci_write_config 0-5-6 59398 NULL ++idProduct_show_59405 idProduct_show 0 59405 NULL ++ds1286_read_time_59406 ds1286_read_time 0 59406 NULL ++isku_sysfs_read_keys_function_59412 isku_sysfs_read_keys_function 6-0-5 59412 NULL ++show_modinfo_version_59413 show_modinfo_version 0 59413 NULL ++afs_file_write_59418 afs_file_write 0 59418 NULL nohasharray ++patch_stac92hd71bxx_59418 patch_stac92hd71bxx 0 59418 &afs_file_write_59418 ++devcgroup_access_write_59423 devcgroup_access_write 0-3 59423 NULL ++nct7802_read_voltage_59424 nct7802_read_voltage 0 59424 NULL ++show_counter_lb_flow_stalls_59426 show_counter_lb_flow_stalls 0 59426 NULL ++show_fan_alarm_59439 show_fan_alarm 0 59439 NULL ++max_show_59442 max_show 0 59442 NULL nohasharray ++psb_intel_opregion_video_event_59442 psb_intel_opregion_video_event 0 59442 &max_show_59442 nohasharray ++adxl34x_rate_store_59442 adxl34x_rate_store 0-4 59442 &psb_intel_opregion_video_event_59442 nohasharray ++SyS_sched_setaffinity_59442 SyS_sched_setaffinity 2 59442 &adxl34x_rate_store_59442 ++atm_change_qos_59444 atm_change_qos 0 59444 NULL ++fs_path_ensure_buf_59445 fs_path_ensure_buf 2 59445 NULL nohasharray ++snd_seq_write_59445 snd_seq_write 0-3 59445 &fs_path_ensure_buf_59445 nohasharray ++bnx2_change_mtu_59445 bnx2_change_mtu 0 59445 &snd_seq_write_59445 ++descriptor_loc_59446 descriptor_loc 3 59446 NULL ++acpi_ds_build_internal_buffer_obj_59448 acpi_ds_build_internal_buffer_obj 0 59448 NULL nohasharray ++ath10k_peer_delete_59448 ath10k_peer_delete 0 59448 &acpi_ds_build_internal_buffer_obj_59448 ++mv_u3d_start_59449 mv_u3d_start 0 59449 NULL ++cxacru_sysfs_show_adsl_state_59456 cxacru_sysfs_show_adsl_state 0 59456 NULL nohasharray ++tipc_recv_stream_59456 tipc_recv_stream 0-4 59456 &cxacru_sysfs_show_adsl_state_59456 ++skb_maybe_pull_tail_59461 skb_maybe_pull_tail 3 59461 NULL ++blk_mq_hw_sysfs_show_59462 blk_mq_hw_sysfs_show 0 59462 NULL ++coda_file_write_59463 coda_file_write 0-3 59463 NULL ++ad7791_write_frequency_59465 ad7791_write_frequency 0-4 59465 NULL ++aux_ch_59466 aux_ch 0 59466 NULL ++cfg80211_iter_combinations_59467 cfg80211_iter_combinations 0 59467 NULL ++ab3100_otp_cid_show_59473 ab3100_otp_cid_show 0 59473 NULL ++vmw_kms_write_svga_59477 vmw_kms_write_svga 0 59477 NULL ++diolan_i2c_get_byte_ack_59482 diolan_i2c_get_byte_ack 0 59482 NULL ++get_sas_device_type_names_59483 get_sas_device_type_names 0 59483 NULL ++snd_card_asihpi_capture_prepare_59484 snd_card_asihpi_capture_prepare 0 59484 NULL nohasharray ++mcam_vb_queue_setup_59484 mcam_vb_queue_setup 0 59484 &snd_card_asihpi_capture_prepare_59484 ++amd64_top_mem2_show_59487 amd64_top_mem2_show 0 59487 NULL ++_iwl_dbgfs_bcast_filters_write_59491 _iwl_dbgfs_bcast_filters_write 3-0 59491 NULL nohasharray ++pscsi_get_blocks_59491 pscsi_get_blocks 0 59491 &_iwl_dbgfs_bcast_filters_write_59491 ++adp5520_store_59492 adp5520_store 0-3 59492 NULL ++r8a66597_urb_enqueue_59493 r8a66597_urb_enqueue 0 59493 NULL nohasharray ++show_hrtbt_enb_59493 show_hrtbt_enb 0 59493 &r8a66597_urb_enqueue_59493 ++blkcg_reset_stats_59496 blkcg_reset_stats 0 59496 NULL ++c2port_show_flash_access_59497 c2port_show_flash_access 0 59497 NULL ++ath10k_htc_send_59498 ath10k_htc_send 0 59498 NULL ++show_ata_link_sata_spd_59499 show_ata_link_sata_spd 0 59499 NULL nohasharray ++blk_mq_tag_sysfs_show_59499 blk_mq_tag_sysfs_show 0 59499 &show_ata_link_sata_spd_59499 ++defrag_store_59501 defrag_store 4-0 59501 NULL ++ib_copy_from_udata_59502 ib_copy_from_udata 3 59502 NULL nohasharray ++hackrf_submit_urbs_59502 hackrf_submit_urbs 0 59502 &ib_copy_from_udata_59502 ++nfsd_nrpools_59503 nfsd_nrpools 0 59503 NULL nohasharray ++snd_seq_queue_timer_open_59503 snd_seq_queue_timer_open 0 59503 &nfsd_nrpools_59503 nohasharray ++qlcnic_sysfs_write_mem_59503 qlcnic_sysfs_write_mem 0-6-5 59503 &snd_seq_queue_timer_open_59503 ++rds_pin_pages_59507 rds_pin_pages 0 59507 NULL ++st21nfca_hci_dep_link_up_59509 st21nfca_hci_dep_link_up 5 59509 NULL ++C_SYSC_get_mempolicy_59516 C_SYSC_get_mempolicy 3 59516 NULL ++gfs2_dhash_59522 gfs2_dhash 0 59522 NULL ++gather_write_59526 gather_write 0 59526 NULL nohasharray ++bnx2fc_vport_disable_59526 bnx2fc_vport_disable 0 59526 &gather_write_59526 ++vcc_create_59531 vcc_create 0 59531 NULL ++scsiback_drop_nexus_59532 scsiback_drop_nexus 0 59532 NULL ++usb_wwan_write_59533 usb_wwan_write 0-4 59533 NULL ++show_associate_remote_59534 show_associate_remote 0 59534 NULL ++kmalloc_large_node_59542 kmalloc_large_node 1 59542 NULL ++ecryptfs_encrypt_page_59543 ecryptfs_encrypt_page 0 59543 NULL nohasharray ++ext4_resize_fs_59543 ext4_resize_fs 2 59543 &ecryptfs_encrypt_page_59543 ++idr_alloc_59545 idr_alloc 0 59545 NULL nohasharray ++msix_setup_entries_59545 msix_setup_entries 0 59545 &idr_alloc_59545 ++mpi_get_nbits_59551 mpi_get_nbits 0 59551 NULL ++lpfc_fcp_cpu_map_store_59552 lpfc_fcp_cpu_map_store 0-4 59552 NULL ++mos7840_get_reg_sync_59553 mos7840_get_reg_sync 0 59553 NULL ++f2fs_xattr_advise_set_59555 f2fs_xattr_advise_set 0 59555 NULL ++show_59558 show 0 59558 NULL ++img_i2c_xfer_59559 img_i2c_xfer 0-3 59559 NULL ++tunables_write_59563 tunables_write 3-0 59563 NULL ++bio_split_59564 bio_split 2 59564 NULL ++da9055_group_read_59566 da9055_group_read 0 59566 NULL nohasharray ++cmos_nvram_read_59566 cmos_nvram_read 0-5-6 59566 &da9055_group_read_59566 nohasharray ++nilfs_setattr_59566 nilfs_setattr 0 59566 &cmos_nvram_read_59566 ++afs_fsync_59569 afs_fsync 0 59569 NULL ++__copy_from_user_ll_nozero_59571 __copy_from_user_ll_nozero 0 59571 NULL ++show_temp_auto_temp_min_59574 show_temp_auto_temp_min 0 59574 NULL nohasharray ++eth_prepare_mac_addr_change_59574 eth_prepare_mac_addr_change 0 59574 &show_temp_auto_temp_min_59574 ++pwm_enable_show_59579 pwm_enable_show 0 59579 NULL ++write_pbl_59583 write_pbl 4 59583 NULL ++resp_write_same_59587 resp_write_same 2 59587 NULL ++memdup_user_59590 memdup_user 2 59590 NULL ++tcp_set_congestion_control_59591 tcp_set_congestion_control 0 59591 NULL ++si470x_fops_read_59592 si470x_fops_read 0-3 59592 NULL ++gether_opts_host_addr_show_59595 gether_opts_host_addr_show 0 59595 NULL ++max8925_bulk_write_59597 max8925_bulk_write 3-0 59597 NULL ++tps6586x_irq_get_virq_59601 tps6586x_irq_get_virq 2 59601 NULL ++zd_iowrite32a_59602 zd_iowrite32a 0 59602 NULL nohasharray ++store_v86d_59602 store_v86d 0-3 59602 &zd_iowrite32a_59602 ++uart_get_attr_iomem_base_59606 uart_get_attr_iomem_base 0 59606 NULL ++fcoe_ctlr_vn_send_59607 fcoe_ctlr_vn_send 4 59607 NULL ++validate_pm_config_59612 validate_pm_config 0 59612 NULL ++module_event_59614 module_event 0 59614 NULL ++cirrusfb_check_var_59615 cirrusfb_check_var 0 59615 NULL ++mem_fwlog_free_mem_blks_read_59616 mem_fwlog_free_mem_blks_read 3-0 59616 NULL ++integrity_format_show_59617 integrity_format_show 0 59617 NULL ++xadc_axi_write_adc_reg_59620 xadc_axi_write_adc_reg 0 59620 NULL ++ecp_write_data_59621 ecp_write_data 0 59621 NULL nohasharray ++ath6kl_endpoint_stats_write_59621 ath6kl_endpoint_stats_write 3-0 59621 &ecp_write_data_59621 ++mtrr_write_59622 mtrr_write 3-0 59622 NULL nohasharray ++sock_sendpage_59622 sock_sendpage 4 59622 &mtrr_write_59622 ++gfs2_writepage_59624 gfs2_writepage 0 59624 NULL ++core_alua_allocate_lba_map_mem_59632 core_alua_allocate_lba_map_mem 0 59632 NULL ++find_first_zero_bit_59636 find_first_zero_bit 0-2 59636 NULL nohasharray ++v9fs_cache_session_get_key_59636 v9fs_cache_session_get_key 0 59636 &find_first_zero_bit_59636 ++console_show_59641 console_show 0 59641 NULL ++logi_dj_ll_raw_request_59642 logi_dj_ll_raw_request 0 59642 NULL ++dn_fib_nlmsg_size_59643 dn_fib_nlmsg_size 0 59643 NULL ++trusted_instantiate_59644 trusted_instantiate 0 59644 NULL ++osst_sysfs_add_59645 osst_sysfs_add 0 59645 NULL ++mxl111sf_tuner_get_if_frequency_59646 mxl111sf_tuner_get_if_frequency 0 59646 NULL nohasharray ++SyS_setdomainname_59646 SyS_setdomainname 2 59646 &mxl111sf_tuner_get_if_frequency_59646 ++file_update_time_59647 file_update_time 0 59647 NULL ++hidraw_read_59650 hidraw_read 3-0 59650 NULL nohasharray ++snd_usb_substream_capture_trigger_59650 snd_usb_substream_capture_trigger 0 59650 &hidraw_read_59650 nohasharray ++ubifs_setxattr_59650 ubifs_setxattr 0-4 59650 &snd_usb_substream_capture_trigger_59650 ++v9fs_xattr_set_acl_59651 v9fs_xattr_set_acl 4-0 59651 NULL ++set_in_min2_59659 set_in_min2 0-4 59659 NULL ++mv_u3d_ep_enable_59661 mv_u3d_ep_enable 0 59661 NULL nohasharray ++level_store_59661 level_store 0-3 59661 &mv_u3d_ep_enable_59661 nohasharray ++ax88179_write_cmd_59661 ax88179_write_cmd 0 59661 &level_store_59661 ++__devcgroup_check_permission_59665 __devcgroup_check_permission 0 59665 NULL ++iwl_dbgfs_mac_params_read_59666 iwl_dbgfs_mac_params_read 3-0 59666 NULL ++register_jprobe_59669 register_jprobe 0 59669 NULL ++alloc_dca_provider_59670 alloc_dca_provider 2 59670 NULL ++create_multi_cap_vol_ctl_59672 create_multi_cap_vol_ctl 0 59672 NULL ++int3400_thermal_get_temp_59676 int3400_thermal_get_temp 0 59676 NULL ++jffs2_decompress_59682 jffs2_decompress 0 59682 NULL ++tw_show_stats_59686 tw_show_stats 0 59686 NULL ++sriov_enable_59689 sriov_enable 0 59689 NULL ++show_sas_phy_negotiated_linkrate_59695 show_sas_phy_negotiated_linkrate 0 59695 NULL ++enc28j60_set_hw_macaddr_59696 enc28j60_set_hw_macaddr 0 59696 NULL ++mic_calc_failure_read_59700 mic_calc_failure_read 3-0 59700 NULL ++ioperm_get_59701 ioperm_get 4-3 59701 NULL ++create_59705 create 0 59705 NULL ++rndis_opts_dev_addr_store_59706 rndis_opts_dev_addr_store 0-3 59706 NULL ++xpc_system_reboot_59708 xpc_system_reboot 0 59708 NULL ++__team_option_inst_add_option_59709 __team_option_inst_add_option 0 59709 NULL ++qt1010_set_params_59719 qt1010_set_params 0 59719 NULL ++store_remove_id_59721 store_remove_id 0-3 59721 NULL ++cfq_group_idle_store_59722 cfq_group_idle_store 3-0 59722 NULL ++mlx4_tunnel_steer_add_59724 mlx4_tunnel_steer_add 0 59724 NULL ++nouveau_hwmon_set_emergency_temp_hyst_59727 nouveau_hwmon_set_emergency_temp_hyst 0-4 59727 NULL ++prism2_info_scanresults_59729 prism2_info_scanresults 3 59729 NULL nohasharray ++ftrace_mod_jmp_59729 ftrace_mod_jmp 1 59729 &prism2_info_scanresults_59729 ++pc_show_59731 pc_show 0 59731 NULL nohasharray ++bcmgenet_open_59731 bcmgenet_open 0 59731 &pc_show_59731 ++ivtv_firmware_check_59732 ivtv_firmware_check 0 59732 NULL ++set_mode_59733 set_mode 0 59733 NULL ++nfs_file_splice_read_59735 nfs_file_splice_read 0 59735 NULL ++twl4030_madc_wait_conversion_ready_59737 twl4030_madc_wait_conversion_ready 0 59737 NULL nohasharray ++perf_event_read_group_59737 perf_event_read_group 0 59737 &twl4030_madc_wait_conversion_ready_59737 ++wm8996_gpio_direction_in_59739 wm8996_gpio_direction_in 0 59739 NULL nohasharray ++show_cursor_59739 show_cursor 0 59739 &wm8996_gpio_direction_in_59739 nohasharray ++peak_usb_start_59739 peak_usb_start 0 59739 &show_cursor_59739 ++ieee80211_if_read_fwded_unicast_59740 ieee80211_if_read_fwded_unicast 3-0 59740 NULL nohasharray ++vivid_vid_out_s_ctrl_59740 vivid_vid_out_s_ctrl 0 59740 &ieee80211_if_read_fwded_unicast_59740 ++i7core_inject_show_bank_59743 i7core_inject_show_bank 0 59743 NULL ++qib_decode_7220_sdma_errs_59745 qib_decode_7220_sdma_errs 4 59745 NULL ++strnlen_59746 strnlen 0 59746 NULL nohasharray ++dump_eeprom_59746 dump_eeprom 0-5 59746 &strnlen_59746 nohasharray ++bitmap_parse_user_59746 bitmap_parse_user 0 59746 &dump_eeprom_59746 ++snd_interval_refine_set_59748 snd_interval_refine_set 0 59748 NULL nohasharray ++sd_start_video_59748 sd_start_video 0 59748 &snd_interval_refine_set_59748 ++tridentfb_check_var_59749 tridentfb_check_var 0 59749 NULL nohasharray ++sctp_manip_pkt_59749 sctp_manip_pkt 4 59749 &tridentfb_check_var_59749 ++ext3_acl_count_59754 ext3_acl_count 0-1 59754 NULL ++isci_port_perform_hard_reset_59760 isci_port_perform_hard_reset 0 59760 NULL ++cxacru_sysfs_show_adsl_controller_version_59762 cxacru_sysfs_show_adsl_controller_version 0 59762 NULL ++long_retry_limit_read_59766 long_retry_limit_read 3-0 59766 NULL nohasharray ++cap_inode_need_killpriv_59766 cap_inode_need_killpriv 0 59766 &long_retry_limit_read_59766 nohasharray ++get_sset_count_59766 get_sset_count 0 59766 &cap_inode_need_killpriv_59766 ++interf_mitigation_59777 interf_mitigation 0 59777 NULL ++complain_secs_show_59778 complain_secs_show 0 59778 NULL ++venus_remove_59781 venus_remove 4 59781 NULL ++mei_nfc_recv_59784 mei_nfc_recv 3 59784 NULL ++net2280_enable_59787 net2280_enable 0 59787 NULL ++tle62x0_gpio_store_59790 tle62x0_gpio_store 0-4 59790 NULL ++smsc_phy_ack_interrupt_59791 smsc_phy_ack_interrupt 0 59791 NULL ++ims_pcu_update_firmware_status_show_59793 ims_pcu_update_firmware_status_show 0 59793 NULL ++pcf2127_rtc_read_time_59796 pcf2127_rtc_read_time 0 59796 NULL ++msb_get_zone_from_lba_59800 msb_get_zone_from_lba 0-1 59800 NULL ++C_SYSC_preadv_59801 C_SYSC_preadv 3 59801 NULL ++behind_writes_used_reset_59807 behind_writes_used_reset 0-3 59807 NULL nohasharray ++ipw_write_59807 ipw_write 3 59807 &behind_writes_used_reset_59807 ++rtllib_wx_set_gen_ie_59808 rtllib_wx_set_gen_ie 3 59808 NULL ++scsi_init_shared_tag_map_59812 scsi_init_shared_tag_map 2-0 59812 NULL nohasharray ++usbhsg_try_start_59812 usbhsg_try_start 0 59812 &scsi_init_shared_tag_map_59812 ++jffs2_readpage_59813 jffs2_readpage 0 59813 NULL ++fuse_writepage_locked_59814 fuse_writepage_locked 0 59814 NULL ++regulator_suspend_standby_state_show_59817 regulator_suspend_standby_state_show 0 59817 NULL ++store_mem_state_59818 store_mem_state 0-4 59818 NULL ++acpi_ds_get_predicate_value_59819 acpi_ds_get_predicate_value 0 59819 NULL nohasharray ++ft_nacl_show_port_name_59819 ft_nacl_show_port_name 0 59819 &acpi_ds_get_predicate_value_59819 nohasharray ++at76_add_interface_59819 at76_add_interface 0 59819 &ft_nacl_show_port_name_59819 ++drxk_i2c_transfer_59821 drxk_i2c_transfer 3 59821 NULL ++vivid_vid_cap_s_ctrl_59824 vivid_vid_cap_s_ctrl 0 59824 NULL ++__logfs_truncate_rec_59827 __logfs_truncate_rec 0 59827 NULL ++ieee80211_if_read_dot11MeshHWMPmaxPREQretries_59829 ieee80211_if_read_dot11MeshHWMPmaxPREQretries 3-0 59829 NULL ++gspca_dev_probe2_59833 gspca_dev_probe2 4 59833 NULL nohasharray ++pzl_urb_enqueue_59833 pzl_urb_enqueue 0 59833 &gspca_dev_probe2_59833 ++lkdtm_register_cpoint_59834 lkdtm_register_cpoint 0 59834 NULL ++erst_clear_59835 erst_clear 0 59835 NULL ++bq24190_write_59837 bq24190_write 0 59837 NULL ++inv_mpu6050_fifo_rate_store_59838 inv_mpu6050_fifo_rate_store 0-4 59838 NULL ++__oxu_urb_enqueue_59839 __oxu_urb_enqueue 0 59839 NULL nohasharray ++apparmor_inode_getattr_59839 apparmor_inode_getattr 0 59839 &__oxu_urb_enqueue_59839 nohasharray ++wusb_dev_set_encryption_59839 wusb_dev_set_encryption 0 59839 &apparmor_inode_getattr_59839 nohasharray ++wl3501_suspend_59839 wl3501_suspend 0 59839 &wusb_dev_set_encryption_59839 ++qla24xx_vport_disable_59843 qla24xx_vport_disable 0 59843 NULL ++fs64_to_cpu_59845 fs64_to_cpu 0 59845 NULL ++da9063_ldo_get_mode_59846 da9063_ldo_get_mode 0 59846 NULL ++show_iface_tcp_wsf_59848 show_iface_tcp_wsf 0 59848 NULL ++regmap_raw_write_async_59849 regmap_raw_write_async 2-4 59849 NULL nohasharray ++f_read_cntrs_59849 f_read_cntrs 0 59849 ®map_raw_write_async_59849 ++vsp1_video_buffer_prepare_59850 vsp1_video_buffer_prepare 0 59850 NULL ++qla27xx_fwdt_template_size_59858 qla27xx_fwdt_template_size 0 59858 NULL ++niu_rx_channel_lpage_init_59865 niu_rx_channel_lpage_init 0 59865 NULL nohasharray ++intel_ring_wait_request_59865 intel_ring_wait_request 0 59865 &niu_rx_channel_lpage_init_59865 ++target_core_alua_tg_pt_gp_show_attr_alua_support_transitioning_59869 target_core_alua_tg_pt_gp_show_attr_alua_support_transitioning 0 59869 NULL ++m48t59_nvram_write_59870 m48t59_nvram_write 0-6-5 59870 NULL ++set_pwm_auto_pwm_min_59872 set_pwm_auto_pwm_min 0-4 59872 NULL ++show_alarm_mask_59874 show_alarm_mask 0 59874 NULL ++biovec_create_pool_59878 biovec_create_pool 1 59878 NULL ++osst_flush_buffer_59879 osst_flush_buffer 0 59879 NULL ++pvr2_ioread_set_sync_key_59882 pvr2_ioread_set_sync_key 3 59882 NULL ++mwifiex_cfg80211_tdls_mgmt_59884 mwifiex_cfg80211_tdls_mgmt 10 59884 NULL ++l2cap_sock_recvmsg_59886 l2cap_sock_recvmsg 4-0 59886 NULL ++ffs_prepare_buffer_59892 ffs_prepare_buffer 2 59892 NULL ++xwrite_59906 xwrite 3 59906 NULL ++do_rbd_remove_59907 do_rbd_remove 0-3 59907 NULL ++swiotlb_map_page_59909 swiotlb_map_page 3-0 59909 NULL ++cpu_rt_period_write_uint_59912 cpu_rt_period_write_uint 0 59912 NULL ++rx_dropped_show_59917 rx_dropped_show 0 59917 NULL ++store_rescan_field_59920 store_rescan_field 0-4 59920 NULL ++zd1201_net_open_59921 zd1201_net_open 0 59921 NULL ++cachefiles_read_or_alloc_page_59923 cachefiles_read_or_alloc_page 0 59923 NULL ++bnx2_fw_sync_59929 bnx2_fw_sync 0 59929 NULL ++read_59931 read 0 59931 NULL ++ecryptfs_process_key_cipher_59932 ecryptfs_process_key_cipher 0 59932 NULL nohasharray ++cifs_sync_mid_result_59932 cifs_sync_mid_result 0 59932 &ecryptfs_process_key_cipher_59932 ++ath5k_hw_rfgain_init_59935 ath5k_hw_rfgain_init 0 59935 NULL ++cxacru_sysfs_show_downstream_bits_per_frame_59943 cxacru_sysfs_show_downstream_bits_per_frame 0 59943 NULL ++mmio32write__write_file_59944 mmio32write__write_file 0 59944 NULL ++advansys_board_found_59945 advansys_board_found 0 59945 NULL ++ncp_make_closed_59948 ncp_make_closed 0 59948 NULL ++ath10k_read_dfs_stats_59949 ath10k_read_dfs_stats 3-0 59949 NULL ++dapm_widget_power_read_file_59950 dapm_widget_power_read_file 3-0 59950 NULL nohasharray ++il_dbgfs_rxon_flags_read_59950 il_dbgfs_rxon_flags_read 3-0 59950 &dapm_widget_power_read_file_59950 ++cfq_back_seek_max_store_59951 cfq_back_seek_max_store 3-0 59951 NULL ++il_dbgfs_missed_beacon_read_59956 il_dbgfs_missed_beacon_read 3-0 59956 NULL ++cuse_write_59958 cuse_write 0-3 59958 NULL ++cifs_setup_session_59967 cifs_setup_session 0 59967 NULL nohasharray ++v9fs_write_inode_59967 v9fs_write_inode 0 59967 &cifs_setup_session_59967 ++__arch_hweight16_59975 __arch_hweight16 0 59975 NULL nohasharray ++smsc911x_ethtool_get_eeprom_len_59975 smsc911x_ethtool_get_eeprom_len 0 59975 &__arch_hweight16_59975 ++store_frontswap_hysteresis_59976 store_frontswap_hysteresis 0-4 59976 NULL ++fuse_perm_getattr_59977 fuse_perm_getattr 0 59977 NULL ++squashfs_max_decompressors_59978 squashfs_max_decompressors 0 59978 NULL nohasharray ++tsl2550_set_operating_mode_59978 tsl2550_set_operating_mode 0 59978 &squashfs_max_decompressors_59978 ++memcg_activate_kmem_59980 memcg_activate_kmem 0 59980 NULL nohasharray ++tpm_tis_send_main_59980 tpm_tis_send_main 0-3 59980 &memcg_activate_kmem_59980 ++elan_smbus_write_fw_block_59982 elan_smbus_write_fw_block 0 59982 NULL ++osd_req_read_kern_59990 osd_req_read_kern 5 59990 NULL ++get_ether_addr_str_59995 get_ether_addr_str 0 59995 NULL ++deadline_read_expire_show_59999 deadline_read_expire_show 0 59999 NULL ++setup_60000 setup 0 60000 NULL ++ghash_async_setkey_60001 ghash_async_setkey 3 60001 NULL ++sctp_bindx_add_60002 sctp_bindx_add 0 60002 NULL ++ieee80211_if_fmt_dot11MeshAwakeWindowDuration_60006 ieee80211_if_fmt_dot11MeshAwakeWindowDuration 3 60006 NULL nohasharray ++enic_vlan_rx_add_vid_60006 enic_vlan_rx_add_vid 0 60006 &ieee80211_if_fmt_dot11MeshAwakeWindowDuration_60006 nohasharray ++hif_usb_send_60006 hif_usb_send 0 60006 &enic_vlan_rx_add_vid_60006 ++copy_items_60009 copy_items 7 60009 NULL ++rawsock_sendmsg_60010 rawsock_sendmsg 4-0 60010 NULL ++mthca_init_cq_60011 mthca_init_cq 2 60011 NULL ++register_device_60015 register_device 2-3 60015 NULL ++target_core_store_dev_lba_map_60016 target_core_store_dev_lba_map 0-3 60016 NULL ++batadv_dat_init_60023 batadv_dat_init 0 60023 NULL ++ebitmap_set_bit_60024 ebitmap_set_bit 0 60024 NULL ++osd_req_list_dev_partitions_60027 osd_req_list_dev_partitions 4 60027 NULL ++ds2781_get_control_register_60028 ds2781_get_control_register 0 60028 NULL nohasharray ++target_fabric_tpg_attrib_attr_store_60028 target_fabric_tpg_attrib_attr_store 0-4 60028 &ds2781_get_control_register_60028 ++store_60029 store 0-3 60029 NULL nohasharray ++do_set_fan_target_60029 do_set_fan_target 0 60029 &store_60029 ++xlog_bread_offset_60030 xlog_bread_offset 3 60030 NULL ++squashfs_security_list_60031 squashfs_security_list 0-5 60031 NULL ++gen10g_soft_reset_60032 gen10g_soft_reset 0 60032 NULL ++sys_sched_getaffinity_60033 sys_sched_getaffinity 2 60033 NULL nohasharray ++proc_setattr_60033 proc_setattr 0 60033 &sys_sched_getaffinity_60033 ++toshiba_kbd_type_show_60034 toshiba_kbd_type_show 0 60034 NULL ++do_ip6t_set_ctl_60040 do_ip6t_set_ctl 4 60040 NULL ++sock_aio_read_60043 sock_aio_read 0 60043 NULL ++pmcraid_change_queue_depth_60044 pmcraid_change_queue_depth 0-2 60044 NULL ++vcs_size_60050 vcs_size 0 60050 NULL ++sis630_transaction_start_60054 sis630_transaction_start 0 60054 NULL nohasharray ++arcmsr_attr_host_fw_model_60054 arcmsr_attr_host_fw_model 0 60054 &sis630_transaction_start_60054 ++afs_cell_init_60055 afs_cell_init 0 60055 NULL nohasharray ++pch_phub_write_serial_rom_60055 pch_phub_write_serial_rom 0 60055 &afs_cell_init_60055 ++gru_alloc_gts_60056 gru_alloc_gts 2-3 60056 NULL ++il4965_txq_ctx_alloc_60062 il4965_txq_ctx_alloc 0 60062 NULL ++compat_writev_60063 compat_writev 3 60063 NULL ++ath6kl_listen_int_write_60066 ath6kl_listen_int_write 3-0 60066 NULL nohasharray ++fsa9480_show_device_60066 fsa9480_show_device 0 60066 &ath6kl_listen_int_write_60066 ++mxl5007t_tuner_rf_tune_60070 mxl5007t_tuner_rf_tune 0 60070 NULL ++i7core_inject_section_store_60074 i7core_inject_section_store 0-4 60074 NULL ++usb_os_desc_prepare_interf_dir_60075 usb_os_desc_prepare_interf_dir 2 60075 NULL ++show_60078 show 0 60078 NULL ++mp_register_gsi_60079 mp_register_gsi 2 60079 NULL ++smk_curacc_60080 smk_curacc 0 60080 NULL ++rxrpc_kernel_send_data_60083 rxrpc_kernel_send_data 3 60083 NULL nohasharray ++real_power_state_show_60083 real_power_state_show 0 60083 &rxrpc_kernel_send_data_60083 ++hw_init_60084 hw_init 0 60084 NULL ++store_dts_ext_60085 store_dts_ext 0-4 60085 NULL nohasharray ++roccat_common2_sysfs_write_keys_function_60085 roccat_common2_sysfs_write_keys_function 0-6-5 60085 &store_dts_ext_60085 ++check_pages_physically_contiguous_60091 check_pages_physically_contiguous 1 60091 NULL ++set_hw_addr_filt_60093 set_hw_addr_filt 0 60093 NULL ++read_fs_60094 read_fs 0-5-6 60094 NULL ++in_tx_show_60098 in_tx_show 0 60098 NULL ++show_temp_auto_point1_temp_hyst_60099 show_temp_auto_point1_temp_hyst 0 60099 NULL nohasharray ++qla2x00_pci_info_show_60099 qla2x00_pci_info_show 0 60099 &show_temp_auto_point1_temp_hyst_60099 ++ieee80211_if_fmt_fwded_frames_60103 ieee80211_if_fmt_fwded_frames 3 60103 NULL ++ext3_xattr_security_set_60108 ext3_xattr_security_set 0 60108 NULL ++cmd_rsv_establish_60112 cmd_rsv_establish 0 60112 NULL ++SYSC_msgsnd_60113 SYSC_msgsnd 3 60113 NULL ++i40e_vsi_control_rx_60116 i40e_vsi_control_rx 0 60116 NULL ++ttm_bo_kmap_60118 ttm_bo_kmap 2-3 60118 NULL nohasharray ++reserve_or_set_tx_60118 reserve_or_set_tx 0 60118 &ttm_bo_kmap_60118 ++nfs_idmap_request_key_60124 nfs_idmap_request_key 2 60124 NULL ++show_60125 show 0 60125 NULL ++show_60127 show 0 60127 NULL ++hfs_brec_find_60131 hfs_brec_find 0 60131 NULL ++pcpu_need_to_extend_60133 pcpu_need_to_extend 0 60133 NULL ++devnum_show_60150 devnum_show 0 60150 NULL ++zatm_setsockopt_60154 zatm_setsockopt 0 60154 NULL ++ld_usb_read_60156 ld_usb_read 3-0 60156 NULL nohasharray ++bind_60156 bind 0 60156 &ld_usb_read_60156 ++jmb38x_ms_count_slots_60164 jmb38x_ms_count_slots 0 60164 NULL ++init_state_60165 init_state 2 60165 NULL nohasharray ++hugetlbfs_statfs_60165 hugetlbfs_statfs 0 60165 &init_state_60165 ++deadline_front_merges_show_60171 deadline_front_merges_show 0 60171 NULL ++usbvision_read_reg_60172 usbvision_read_reg 0 60172 NULL ++lp5521_update_program_memory_60174 lp5521_update_program_memory 0-3 60174 NULL ++jffs2_alloc_full_dirent_60179 jffs2_alloc_full_dirent 1 60179 NULL nohasharray ++sg_build_sgat_60179 sg_build_sgat 3 60179 &jffs2_alloc_full_dirent_60179 ++uwb_rc_start_beacon_60180 uwb_rc_start_beacon 0 60180 NULL ++avc_denied_60181 avc_denied 0 60181 NULL ++ath10k_wmi_vdev_spectral_conf_60182 ath10k_wmi_vdev_spectral_conf 0 60182 NULL ++fuse_async_req_send_60183 fuse_async_req_send 0-3 60183 NULL nohasharray ++show_in_min2_60183 show_in_min2 0 60183 &fuse_async_req_send_60183 ++uwb_dev_BPST_show_60184 uwb_dev_BPST_show 0 60184 NULL ++parse_init_verbs_60185 parse_init_verbs 0 60185 NULL ++pm3393_set_mtu_60190 pm3393_set_mtu 0 60190 NULL ++rx_rx_tkip_replays_read_60193 rx_rx_tkip_replays_read 3-0 60193 NULL nohasharray ++arch_setup_msi_irqs_60193 arch_setup_msi_irqs 0 60193 &rx_rx_tkip_replays_read_60193 ++show_reconnect_delay_60198 show_reconnect_delay 0 60198 NULL ++acquire_store_60201 acquire_store 0-4 60201 NULL ++qib_reg_phys_mr_60202 qib_reg_phys_mr 3 60202 NULL nohasharray ++ib_send_cm_mra_60202 ib_send_cm_mra 4 60202 &qib_reg_phys_mr_60202 ++__mt9t112_mcu_write_60204 __mt9t112_mcu_write 0 60204 NULL ++ubifs_jnl_truncate_60206 ubifs_jnl_truncate 0 60206 NULL ++da9052_read_vddout_60207 da9052_read_vddout 0 60207 NULL nohasharray ++__hw_addr_del_60207 __hw_addr_del 0 60207 &da9052_read_vddout_60207 ++btrfs_get_token_16_60220 btrfs_get_token_16 0 60220 NULL ++rtpm_active_time_show_60221 rtpm_active_time_show 0 60221 NULL ++__phys_addr_nodebug_60230 __phys_addr_nodebug 0 60230 NULL nohasharray ++arizona_map_irq_60230 arizona_map_irq 2 60230 &__phys_addr_nodebug_60230 ++kstrtouint_60233 kstrtouint 0 60233 NULL ++show_pwm_tmax_60240 show_pwm_tmax 0 60240 NULL ++alc880_parse_auto_config_60242 alc880_parse_auto_config 0 60242 NULL ++wm831x_auxadc_read_uv_60248 wm831x_auxadc_read_uv 0 60248 NULL nohasharray ++sht15_show_humidity_60248 sht15_show_humidity 0 60248 &wm831x_auxadc_read_uv_60248 nohasharray ++de_open_60248 de_open 0 60248 &sht15_show_humidity_60248 ++wm831x_irq_60254 wm831x_irq 2 60254 NULL ++compat_sys_fcntl64_60256 compat_sys_fcntl64 3 60256 NULL ++irq_alloc_domain_generic_chips_60264 irq_alloc_domain_generic_chips 3-2 60264 NULL ++notify_recv_post_dequeue_60265 notify_recv_post_dequeue 0 60265 NULL nohasharray ++mlx4_ACCESS_MEM_60265 mlx4_ACCESS_MEM 0 60265 ¬ify_recv_post_dequeue_60265 ++validate_trigger_60267 validate_trigger 0 60267 NULL ++m920x_read_60272 m920x_read 0 60272 NULL ++display_crc_ctl_write_60273 display_crc_ctl_write 3-0 60273 NULL ++printer_write_60276 printer_write 3 60276 NULL ++rds_recvmsg_60282 rds_recvmsg 0-4 60282 NULL ++rv3029c2_rtc_set_alarm_60283 rv3029c2_rtc_set_alarm 0 60283 NULL ++__pskb_pull_tail_60287 __pskb_pull_tail 2 60287 NULL ++at86rf230_start_60288 at86rf230_start 0 60288 NULL nohasharray ++store_in_beep_60288 store_in_beep 0-4 60288 &at86rf230_start_60288 ++pwm1_enable_show_60290 pwm1_enable_show 0 60290 NULL nohasharray ++dsense_store_60290 dsense_store 0-3 60290 &pwm1_enable_show_60290 ++target_stat_scsi_port_show_attr_inst_60295 target_stat_scsi_port_show_attr_inst 0 60295 NULL ++do_xip_mapping_read_60297 do_xip_mapping_read 5-0 60297 NULL ++bh1770_prox_set_threshold_60299 bh1770_prox_set_threshold 0 60299 NULL ++show_auto_pwm_min_60306 show_auto_pwm_min 0 60306 NULL nohasharray ++bch_subtract_dirty_60306 bch_subtract_dirty 3 60306 &show_auto_pwm_min_60306 ++os_desc_use_show_60317 os_desc_use_show 0 60317 NULL ++lpfc_drvr_version_show_60319 lpfc_drvr_version_show 0 60319 NULL ++rocker_dma_rx_ring_skbs_alloc_60321 rocker_dma_rx_ring_skbs_alloc 0 60321 NULL ++lpfc_request_firmware_upgrade_show_60324 lpfc_request_firmware_upgrade_show 0 60324 NULL ++mlx4_slave_cmd_60337 mlx4_slave_cmd 0 60337 NULL ++v9fs_xattr_security_get_60341 v9fs_xattr_security_get 0 60341 NULL ++ecryptfs_write_inode_size_to_header_60342 ecryptfs_write_inode_size_to_header 0 60342 NULL ++__kfifo_from_user_r_60345 __kfifo_from_user_r 3-5 60345 NULL ++show_uframe_periodic_max_60347 show_uframe_periodic_max 0 60347 NULL ++wusb_usb_ncb_60348 wusb_usb_ncb 0 60348 NULL ++rh_call_control_60349 rh_call_control 0 60349 NULL ++__ext2_get_block_60350 __ext2_get_block 0 60350 NULL ++init_60352 init 0 60352 NULL ++show_sas_phy_phy_reset_problem_count_60353 show_sas_phy_phy_reset_problem_count 0 60353 NULL ++mlx4_en_change_mtu_60358 mlx4_en_change_mtu 0 60358 NULL ++prepare_60360 prepare 0 60360 NULL ++mesh_rx_csa_frame_60361 mesh_rx_csa_frame 3 60361 NULL ++show_firmwareCode_60363 show_firmwareCode 0 60363 NULL ++listxattr_filler_60364 listxattr_filler 3 60364 NULL ++dccp_setsockopt_60367 dccp_setsockopt 5-0 60367 NULL nohasharray ++wl1251_event_unmask_60367 wl1251_event_unmask 0 60367 &dccp_setsockopt_60367 ++tcp_md5_do_del_60370 tcp_md5_do_del 0 60370 NULL ++try_ctrl_60373 try_ctrl 0 60373 NULL ++store_fc_private_host_dev_loss_tmo_60376 store_fc_private_host_dev_loss_tmo 0-4 60376 NULL ++ali15x3_transaction_60378 ali15x3_transaction 0 60378 NULL ++ubi_eba_atomic_leb_change_60379 ubi_eba_atomic_leb_change 5-0 60379 NULL nohasharray ++ncp_notify_change_60379 ncp_notify_change 0 60379 &ubi_eba_atomic_leb_change_60379 ++uevent_show_60385 uevent_show 0 60385 NULL ++notifier_call_60391 notifier_call 0 60391 NULL ++mthca_alloc_resize_buf_60394 mthca_alloc_resize_buf 3 60394 NULL ++iscsi_tpg_attrib_store_demo_mode_discovery_60396 iscsi_tpg_attrib_store_demo_mode_discovery 0-3 60396 NULL ++tveeprom_read_60397 tveeprom_read 3 60397 NULL ++cfv_netdev_open_60398 cfv_netdev_open 0 60398 NULL ++driver_names_read_60399 driver_names_read 3-0 60399 NULL ++bus_speed_read_60406 bus_speed_read 0 60406 NULL ++imx074_g_fmt_60411 imx074_g_fmt 0 60411 NULL ++SendReceive_60415 SendReceive 0 60415 NULL ++control_show_60422 control_show 0 60422 NULL ++show_fan_beep_60423 show_fan_beep 0 60423 NULL ++excessive_retries_read_60425 excessive_retries_read 3-0 60425 NULL ++of_property_count_elems_of_size_60426 of_property_count_elems_of_size 0-3 60426 NULL ++tstats_write_60432 tstats_write 3-0 60432 NULL ++atl1_change_mtu_60434 atl1_change_mtu 0 60434 NULL ++iio_trigger_read_name_60437 iio_trigger_read_name 0 60437 NULL nohasharray ++lio_target_tpg_show_enable_60437 lio_target_tpg_show_enable 0 60437 &iio_trigger_read_name_60437 nohasharray ++tipc_buf_acquire_60437 tipc_buf_acquire 1 60437 &lio_target_tpg_show_enable_60437 ++parse_output_paths_60438 parse_output_paths 0 60438 NULL ++show_carrier_60439 show_carrier 0 60439 NULL nohasharray ++elan_i2c_iap_get_mode_60439 elan_i2c_iap_get_mode 0 60439 &show_carrier_60439 ++sysv_write_begin_60442 sysv_write_begin 0 60442 NULL nohasharray ++rx_data_60442 rx_data 4 60442 &sysv_write_begin_60442 ++s5k4aa_set_hvflip_60444 s5k4aa_set_hvflip 0 60444 NULL ++read_usrate_60445 read_usrate 0 60445 NULL ++tcf_csum_ipv4_igmp_60446 tcf_csum_ipv4_igmp 3 60446 NULL ++__uncore_mask0_show_60454 __uncore_mask0_show 0 60454 NULL ++snd_hda_get_num_raw_conns_60462 snd_hda_get_num_raw_conns 0 60462 NULL ++cmos_set_alarm_60463 cmos_set_alarm 0 60463 NULL ++pnfs_layoutcommit_inode_60465 pnfs_layoutcommit_inode 0 60465 NULL ++initialize_controlvm_payload_info_60472 initialize_controlvm_payload_info 2-1-3 60472 NULL ++reiserfs_permission_60474 reiserfs_permission 0 60474 NULL ++hfsplus_listxattr_finder_info_60475 hfsplus_listxattr_finder_info 0 60475 NULL ++lp8788_show_eoc_level_60477 lp8788_show_eoc_level 0 60477 NULL ++ext3_writeback_writepage_60479 ext3_writeback_writepage 0 60479 NULL ++load_info_60481 load_info 0 60481 NULL ++ht_show_60482 ht_show 0 60482 NULL nohasharray ++broadsheet_spiflash_wait_for_status_60482 broadsheet_spiflash_wait_for_status 0 60482 &ht_show_60482 ++crypto_shash_setkey_60483 crypto_shash_setkey 0-3 60483 NULL ++tpacpi_driver_version_show_60485 tpacpi_driver_version_show 0 60485 NULL ++mmc_cid_show_60490 mmc_cid_show 0 60490 NULL nohasharray ++generic_key_timeout_60490 generic_key_timeout 0 60490 &mmc_cid_show_60490 ++walk_component_60493 walk_component 0 60493 NULL ++lustre_msg_early_size_60496 lustre_msg_early_size 0 60496 NULL ++elv_iosched_show_60498 elv_iosched_show 0 60498 NULL ++acpi_tb_get_root_table_entry_60501 acpi_tb_get_root_table_entry 0 60501 NULL ++show_unicast_flood_60505 show_unicast_flood 0 60505 NULL nohasharray ++iscsi_stat_sess_show_attr_rsp_pdus_60505 iscsi_stat_sess_show_attr_rsp_pdus 0 60505 &show_unicast_flood_60505 nohasharray ++rbd_dev_v2_header_onetime_60505 rbd_dev_v2_header_onetime 0 60505 &iscsi_stat_sess_show_attr_rsp_pdus_60505 ++store_temp_auto_pwm_min_60510 store_temp_auto_pwm_min 0-4 60510 NULL ++xfs_btree_make_block_unfull_60511 xfs_btree_make_block_unfull 0 60511 NULL ++set_fan_pulses_60512 set_fan_pulses 0-4 60512 NULL ++smb2_new_read_req_60513 smb2_new_read_req 0 60513 NULL ++ath_tx_init_60515 ath_tx_init 2 60515 NULL ++device_for_each_child_60519 device_for_each_child 0 60519 NULL ++pm8001_ctl_fw_version_show_60521 pm8001_ctl_fw_version_show 0 60521 NULL nohasharray ++nilfs_mdt_write_page_60521 nilfs_mdt_write_page 0 60521 &pm8001_ctl_fw_version_show_60521 ++lx_dsp_reg_read_60524 lx_dsp_reg_read 0 60524 NULL nohasharray ++btcx_riscmem_alloc_60524 btcx_riscmem_alloc 0 60524 &lx_dsp_reg_read_60524 ++raw_connect_60525 raw_connect 0 60525 NULL ++compat_SyS_get_mempolicy_60527 compat_SyS_get_mempolicy 3 60527 NULL ++ad799x_read_frequency_60533 ad799x_read_frequency 0 60533 NULL nohasharray ++hysdn_sched_rx_60533 hysdn_sched_rx 3 60533 &ad799x_read_frequency_60533 ++ql_adapter_up_60540 ql_adapter_up 0 60540 NULL ++zl10036_set_frequency_60543 zl10036_set_frequency 0 60543 NULL ++v9fs_fid_readn_60544 v9fs_fid_readn 4-0 60544 NULL ++__device_refresh_sync_60549 __device_refresh_sync 0 60549 NULL ++osc_lockless_truncate_seq_write_60553 osc_lockless_truncate_seq_write 3 60553 NULL ++xfs_vm_direct_IO_60557 xfs_vm_direct_IO 4-0 60557 NULL ++xen_panic_event_60561 xen_panic_event 0 60561 NULL ++nfsd_hashsize_60562 nfsd_hashsize 0 60562 NULL nohasharray ++em28xx_write_ac97_60562 em28xx_write_ac97 0 60562 &nfsd_hashsize_60562 nohasharray ++sidtab_map_60562 sidtab_map 0 60562 &em28xx_write_ac97_60562 ++tracing_entries_write_60563 tracing_entries_write 3 60563 NULL ++ath9k_htc_update_cap_target_60566 ath9k_htc_update_cap_target 0 60566 NULL ++snd_ctl_read_60575 snd_ctl_read 0-3 60575 NULL nohasharray ++qlcnic_inetaddr_event_60575 qlcnic_inetaddr_event 0 60575 &snd_ctl_read_60575 ++inv_mpu6050_switch_engine_60578 inv_mpu6050_switch_engine 0 60578 NULL ++instance_ue_count_show_60587 instance_ue_count_show 0 60587 NULL ++usbhid_get_raw_report_60588 usbhid_get_raw_report 0 60588 NULL nohasharray ++default_read_file_60588 default_read_file 0-3 60588 &usbhid_get_raw_report_60588 ++nilfs_segctor_next_pseg_offset_show_60590 nilfs_segctor_next_pseg_offset_show 0 60590 NULL nohasharray ++set_brightness_60590 set_brightness 0-4 60590 &nilfs_segctor_next_pseg_offset_show_60590 ++getoptions_60593 getoptions 0 60593 NULL ++kone_sysfs_show_tcu_60597 kone_sysfs_show_tcu 0 60597 NULL ++rtl8723_download_fw_60599 rtl8723_download_fw 0 60599 NULL ++memblock_virt_alloc_try_nid_nopanic_60604 memblock_virt_alloc_try_nid_nopanic 1 60604 NULL nohasharray ++resources_show_60604 resources_show 0 60604 &memblock_virt_alloc_try_nid_nopanic_60604 nohasharray ++__uncore_mask_dnid_show_60604 __uncore_mask_dnid_show 0 60604 &resources_show_60604 nohasharray ++usblp_rwait_and_lock_60604 usblp_rwait_and_lock 0 60604 &__uncore_mask_dnid_show_60604 ++qlcnic_issue_cmd_60607 qlcnic_issue_cmd 0 60607 NULL ++mwifiex_cmd_mef_cfg_60610 mwifiex_cmd_mef_cfg 0 60610 NULL ++nilfs_dat_prepare_end_60611 nilfs_dat_prepare_end 0 60611 NULL ++cifs_partialpagewrite_60612 cifs_partialpagewrite 0 60612 NULL nohasharray ++os_desc_qw_sign_store_60612 os_desc_qw_sign_store 0-3 60612 &cifs_partialpagewrite_60612 ++inode_change_ok_60614 inode_change_ok 0 60614 NULL ++ath10k_wmi_pdev_set_param_60615 ath10k_wmi_pdev_set_param 0 60615 NULL ++target_core_alua_tg_pt_gp_store_attr_tg_pt_gp_id_60619 target_core_alua_tg_pt_gp_store_attr_tg_pt_gp_id 0-3 60619 NULL nohasharray ++skb_transport_offset_60619 skb_transport_offset 0 60619 &target_core_alua_tg_pt_gp_store_attr_tg_pt_gp_id_60619 ++efx_mcdi_rpc_60620 efx_mcdi_rpc 0 60620 NULL ++wl1273_fm_fops_write_60621 wl1273_fm_fops_write 3-0 60621 NULL ++usb_control_msg_60624 usb_control_msg 0 60624 NULL nohasharray ++igbvf_vlan_rx_add_vid_60624 igbvf_vlan_rx_add_vid 0 60624 &usb_control_msg_60624 ++store_60628 store 0 60628 NULL ++acl_alloc_stack_init_60630 acl_alloc_stack_init 1 60630 NULL ++x509_key_preparse_60633 x509_key_preparse 0 60633 NULL ++show_fnode_port_60637 show_fnode_port 0 60637 NULL nohasharray ++nilfs_transaction_begin_60637 nilfs_transaction_begin 0 60637 &show_fnode_port_60637 ++ubifs_recover_leb_60639 ubifs_recover_leb 3 60639 NULL ++uwb_set_status_60644 uwb_set_status 0 60644 NULL ++ath10k_hif_power_up_60645 ath10k_hif_power_up 0 60645 NULL ++smi_data_read_60646 smi_data_read 6-0-5 60646 NULL ++__proc_lnet_stats_60647 __proc_lnet_stats 5 60647 NULL ++rbd_dev_v2_parent_info_60648 rbd_dev_v2_parent_info 0 60648 NULL ++show_falltime_60666 show_falltime 0 60666 NULL nohasharray ++if_sdio_host_to_card_60666 if_sdio_host_to_card 4 60666 &show_falltime_60666 ++tvaudio_s_ctrl_60667 tvaudio_s_ctrl 0 60667 NULL ++wl12xx_wait_for_event_60668 wl12xx_wait_for_event 0 60668 NULL ++show_fcstat_invalid_tx_word_count_60669 show_fcstat_invalid_tx_word_count 0 60669 NULL ++ieee80211_if_read_dot11MeshConfirmTimeout_60670 ieee80211_if_read_dot11MeshConfirmTimeout 3-0 60670 NULL ++sctp_v4_addr_to_user_60672 sctp_v4_addr_to_user 0 60672 NULL ++bluetooth_set_status_60674 bluetooth_set_status 0 60674 NULL ++amd64_inject_ecc_vector_show_60676 amd64_inject_ecc_vector_show 0 60676 NULL nohasharray ++o2hb_region_start_block_read_60676 o2hb_region_start_block_read 0 60676 &amd64_inject_ecc_vector_show_60676 nohasharray ++upload_firmware_60676 upload_firmware 0 60676 &o2hb_region_start_block_read_60676 ++packet_alloc_pending_60677 packet_alloc_pending 0 60677 NULL nohasharray ++alc861vd_parse_auto_config_60677 alc861vd_parse_auto_config 0 60677 &packet_alloc_pending_60677 ++read_vbt_r10_60679 read_vbt_r10 1 60679 NULL nohasharray ++stv06xx_start_60679 stv06xx_start 0 60679 &read_vbt_r10_60679 ++set_register_60683 set_register 0 60683 NULL ++jme_get_regs_len_60691 jme_get_regs_len 0 60691 NULL ++lapbeth_device_event_60697 lapbeth_device_event 0 60697 NULL ++niu_init_hw_60698 niu_init_hw 0 60698 NULL ++si5351_clkout_prepare_60701 si5351_clkout_prepare 0 60701 NULL ++max6900_i2c_read_time_60702 max6900_i2c_read_time 0 60702 NULL nohasharray ++rfcomm_sock_listen_60702 rfcomm_sock_listen 0 60702 &max6900_i2c_read_time_60702 ++gfs2_write_jdata_pagevec_60703 gfs2_write_jdata_pagevec 0 60703 NULL ++fan_set_60708 fan_set 0 60708 NULL ++init_data_container_60709 init_data_container 1 60709 NULL ++rsi_set_vap_capabilities_60711 rsi_set_vap_capabilities 0 60711 NULL ++wlcore_write_reg_60715 wlcore_write_reg 0 60715 NULL ++snd_emu10k1_efx_playback_trigger_60716 snd_emu10k1_efx_playback_trigger 0 60716 NULL ++timerfd_read_60719 timerfd_read 0-3 60719 NULL ++ext3_xattr_set_60721 ext3_xattr_set 0 60721 NULL ++ov9640_s_stream_60722 ov9640_s_stream 0 60722 NULL ++store_debug_level_60726 store_debug_level 0-3 60726 NULL ++show_chip_60728 show_chip 0 60728 NULL nohasharray ++show_session_param_ISCSI_PARAM_DEF_TIME2WAIT_60728 show_session_param_ISCSI_PARAM_DEF_TIME2WAIT 0 60728 &show_chip_60728 ++max77802_rtc_set_alarm_60735 max77802_rtc_set_alarm 0 60735 NULL ++reg_set_60739 reg_set 0 60739 NULL ++wl12xx_acx_config_hangover_60741 wl12xx_acx_config_hangover 0 60741 NULL ++pppol2tp_create_60743 pppol2tp_create 0 60743 NULL ++lp3972_reg_read_60744 lp3972_reg_read 0 60744 NULL ++vxge_vlan_rx_add_vid_60745 vxge_vlan_rx_add_vid 0 60745 NULL ++set_pwmctrl_60747 set_pwmctrl 0-4 60747 NULL ++proc_read_60749 proc_read 0 60749 NULL ++c2port_show_flash_blocks_num_60752 c2port_show_flash_blocks_num 0 60752 NULL ++ocfs2_xattr_trusted_get_60754 ocfs2_xattr_trusted_get 0 60754 NULL ++raid_status_60755 raid_status 5 60755 NULL ++ibmphp_hpc_readslot_60757 ibmphp_hpc_readslot 0 60757 NULL ++queue_phy_reset_60759 queue_phy_reset 0 60759 NULL ++ad7314_show_name_60763 ad7314_show_name 0 60763 NULL ++nr_setsockopt_60766 nr_setsockopt 0 60766 NULL ++devfreq_powersave_func_60767 devfreq_powersave_func 0 60767 NULL ++arcnet_header_60769 arcnet_header 0 60769 NULL ++ubifs_garbage_collect_60771 ubifs_garbage_collect 0 60771 NULL nohasharray ++clear_error_60771 clear_error 0-4 60771 &ubifs_garbage_collect_60771 ++ltc4260_show_bool_60772 ltc4260_show_bool 0 60772 NULL nohasharray ++max8997_write_reg_60772 max8997_write_reg 0 60772 <c4260_show_bool_60772 ++wafwdt_notify_sys_60773 wafwdt_notify_sys 0 60773 NULL ++sel_write_checkreqprot_60774 sel_write_checkreqprot 3-0 60774 NULL ++opticon_write_60775 opticon_write 4-0 60775 NULL nohasharray ++mtd_numeraseregions_show_60775 mtd_numeraseregions_show 0 60775 &opticon_write_60775 ++acl_alloc_num_60778 acl_alloc_num 2-1 60778 NULL ++set_temp_crit_hyst_60783 set_temp_crit_hyst 0-4 60783 NULL ++d_manage_60789 d_manage 0 60789 NULL nohasharray ++niu_rbr_add_page_60789 niu_rbr_add_page 0 60789 &d_manage_60789 ++snd_pcm_oss_readv3_60792 snd_pcm_oss_readv3 3 60792 NULL ++lp8788_show_eoc_time_60793 lp8788_show_eoc_time 0 60793 NULL ++vx_pcm_trigger_60795 vx_pcm_trigger 0 60795 NULL ++ds2780_read8_60799 ds2780_read8 3-0 60799 NULL ++store_spi_transport_max_iu_60803 store_spi_transport_max_iu 0-4 60803 NULL ++ch341_open_60810 ch341_open 0 60810 NULL ++i_ipmi_request_60811 i_ipmi_request 0 60811 NULL ++qlcnic_sriov_pf_init_60813 qlcnic_sriov_pf_init 0 60813 NULL ++bnx2i_show_sq_info_60815 bnx2i_show_sq_info 0 60815 NULL ++show_sched0_60819 show_sched0 0 60819 NULL ++gfs2_bmap_alloc_60822 gfs2_bmap_alloc 0 60822 NULL ++sync_read_60823 sync_read 0 60823 NULL ++adp8860_bl_l3_dark_max_show_60831 adp8860_bl_l3_dark_max_show 0 60831 NULL ++ensure_zone_is_initialized_60832 ensure_zone_is_initialized 0 60832 NULL ++msi_bus_show_60838 msi_bus_show 0 60838 NULL ++usb_dsbr100_s_ctrl_60840 usb_dsbr100_s_ctrl 0 60840 NULL ++internal_dev_change_mtu_60841 internal_dev_change_mtu 0 60841 NULL ++aac_show_flags_60844 aac_show_flags 0 60844 NULL nohasharray ++apds990x_power_state_show_60844 apds990x_power_state_show 0 60844 &aac_show_flags_60844 ++vivid_fb_set_var_60845 vivid_fb_set_var 0 60845 NULL ++iscsi_tpg_param_store_DefaultTime2Wait_60846 iscsi_tpg_param_store_DefaultTime2Wait 0-3 60846 NULL ++pcistub_irq_handler_show_60847 pcistub_irq_handler_show 0 60847 NULL ++nvif_object_init_60848 nvif_object_init 6 60848 NULL ++pwr_tx_with_ps_read_60851 pwr_tx_with_ps_read 3-0 60851 NULL ++show_hardware_version_60852 show_hardware_version 0 60852 NULL ++show_shost_supported_mode_60854 show_shost_supported_mode 0 60854 NULL ++htc_issue_send_60856 htc_issue_send 0 60856 NULL ++usb_bulk_msg_60861 usb_bulk_msg 0 60861 NULL ++alloc_buf_60864 alloc_buf 3-2 60864 NULL ++generic_writepages_60871 generic_writepages 0 60871 NULL ++show_fc_vport_vport_last_state_60872 show_fc_vport_vport_last_state 0 60872 NULL ++lanai_change_qos_60877 lanai_change_qos 0 60877 NULL ++manage_power_60879 manage_power 0 60879 NULL ++cdc_ncm_store_tx_timer_usecs_60887 cdc_ncm_store_tx_timer_usecs 0-4 60887 NULL ++ext4_update_inline_data_60888 ext4_update_inline_data 3 60888 NULL nohasharray ++bttv_buffer_risc_60888 bttv_buffer_risc 0 60888 &ext4_update_inline_data_60888 ++tpu_pwm_config_60889 tpu_pwm_config 0 60889 NULL ++max8660_ldo67_disable_60892 max8660_ldo67_disable 0 60892 NULL ++uuid_show_fallback_60896 uuid_show_fallback 0 60896 NULL nohasharray ++hpfs_readpage_60896 hpfs_readpage 0 60896 &uuid_show_fallback_60896 ++ch341_configure_60897 ch341_configure 0 60897 NULL ++w1_master_attribute_show_timeout_60898 w1_master_attribute_show_timeout 0 60898 NULL ++pnp_assign_irq_60906 pnp_assign_irq 0 60906 NULL ++ceph_sync_direct_write_60907 ceph_sync_direct_write 0 60907 NULL ++iio_debugfs_read_reg_60908 iio_debugfs_read_reg 3-0 60908 NULL nohasharray ++hfs_writepage_60908 hfs_writepage 0 60908 &iio_debugfs_read_reg_60908 ++dg_dispatch_as_host_60909 dg_dispatch_as_host 0 60909 NULL ++libcfs_sock_ioctl_60915 libcfs_sock_ioctl 0 60915 NULL ++ipath_f_get_boardname_60916 ipath_f_get_boardname 0 60916 NULL nohasharray ++mgt_set_varlen_60916 mgt_set_varlen 4 60916 &ipath_f_get_boardname_60916 ++sysprops_show_60920 sysprops_show 0 60920 NULL ++show_device_bridge_60922 show_device_bridge 0 60922 NULL nohasharray ++atmtcp_v_proc_60922 atmtcp_v_proc 0 60922 &show_device_bridge_60922 ++scrub_chunk_60926 scrub_chunk 5 60926 NULL ++show_60927 show 0 60927 NULL nohasharray ++iscsi_nacl_attrib_store_dataout_timeout_60927 iscsi_nacl_attrib_store_dataout_timeout 0-3 60927 &show_60927 ++submit_extent_page_60928 submit_extent_page 5-0 60928 NULL ++kxcjk1013_setup_new_data_interrupt_60930 kxcjk1013_setup_new_data_interrupt 0 60930 NULL ++qla2x00_isp_id_show_60931 qla2x00_isp_id_show 0 60931 NULL ++xfs_rtallocate_extent_size_60939 xfs_rtallocate_extent_size 0 60939 NULL ++snd_ivtv_pcm_prepare_60940 snd_ivtv_pcm_prepare 0 60940 NULL ++dw2102_serit_i2c_transfer_60942 dw2102_serit_i2c_transfer 0-3 60942 NULL ++f_ecm_opts_attr_show_60943 f_ecm_opts_attr_show 0 60943 NULL ++bch_cached_dev_show_60949 bch_cached_dev_show 0 60949 NULL ++_ivtvfb_check_var_60952 _ivtvfb_check_var 0 60952 NULL ++set_pwm_max_60954 set_pwm_max 0-4 60954 NULL ++send_pktsched_cmd_60957 send_pktsched_cmd 0 60957 NULL ++pti_char_write_60960 pti_char_write 3-0 60960 NULL nohasharray ++acpi_ds_init_field_objects_60960 acpi_ds_init_field_objects 0 60960 &pti_char_write_60960 ++mwifiex_alloc_sdio_mpa_buffers_60961 mwifiex_alloc_sdio_mpa_buffers 2-3 60961 NULL ++bttv_i2c_readbytes_60964 bttv_i2c_readbytes 0 60964 NULL ++store_60970 store 0 60970 NULL ++vga16fb_set_par_60971 vga16fb_set_par 0 60971 NULL ++acpi_suspend_begin_60973 acpi_suspend_begin 0 60973 NULL ++il_dbgfs_ucode_tx_stats_read_60975 il_dbgfs_ucode_tx_stats_read 0-3 60975 NULL ++__a2mp_build_60987 __a2mp_build 3 60987 NULL ++hsc_msg_alloc_60990 hsc_msg_alloc 1 60990 NULL ++tps80031_rtc_set_alarm_60992 tps80031_rtc_set_alarm 0 60992 NULL nohasharray ++init_currently_empty_zone_60992 init_currently_empty_zone 0 60992 &tps80031_rtc_set_alarm_60992 ++mars_s_ctrl_60993 mars_s_ctrl 0 60993 NULL ++generic_file_direct_write_60995 generic_file_direct_write 0 60995 NULL ++get_conn_param_61000 get_conn_param 0 61000 NULL nohasharray ++koneplus_sysfs_read_profile_settings_61000 koneplus_sysfs_read_profile_settings 0-5-6 61000 &get_conn_param_61000 ++check_dev_61003 check_dev 0 61003 NULL ++prepare_late_61011 prepare_late 0 61011 NULL ++rt2x00usb_initialize_61013 rt2x00usb_initialize 0 61013 NULL ++f_gether_opts_attr_store_61017 f_gether_opts_attr_store 0-4 61017 NULL ++koneplus_sysfs_write_talk_61018 koneplus_sysfs_write_talk 0-6-5 61018 NULL ++ath6kl_lrssi_roam_read_61022 ath6kl_lrssi_roam_read 3-0 61022 NULL ++model_show_61023 model_show 0 61023 NULL ++graph_depth_write_61024 graph_depth_write 3 61024 NULL ++nilfs_snapshot_README_show_61029 nilfs_snapshot_README_show 0 61029 NULL ++sdhci_pltfm_register_61031 sdhci_pltfm_register 3 61031 NULL ++saa717x_s_mbus_fmt_61034 saa717x_s_mbus_fmt 0 61034 NULL ++gro_flush_timeout_show_61035 gro_flush_timeout_show 0 61035 NULL nohasharray ++show_fnode_chap_in_idx_61035 show_fnode_chap_in_idx 0 61035 &gro_flush_timeout_show_61035 ++sigma_fw_load_samplerates_61036 sigma_fw_load_samplerates 3 61036 NULL nohasharray ++roccat_common2_sysfs_read_general_61036 roccat_common2_sysfs_read_general 0-5-6 61036 &sigma_fw_load_samplerates_61036 ++read_file_ackto_61037 read_file_ackto 3-0 61037 NULL ++call_modprobe_61038 call_modprobe 0 61038 NULL ++lpfc_idiag_queacc_write_61043 lpfc_idiag_queacc_write 3-0 61043 NULL ++escr_show_61048 escr_show 0 61048 NULL ++symtab_init_61050 symtab_init 2-0 61050 NULL ++since_epoch_show_61053 since_epoch_show 0 61053 NULL ++hotkey_recommended_mask_show_61055 hotkey_recommended_mask_show 0 61055 NULL nohasharray ++show_tolerance5_61055 show_tolerance5 0 61055 &hotkey_recommended_mask_show_61055 ++rcar_thermal_get_temp_61061 rcar_thermal_get_temp 0 61061 NULL ++bitmap_scnlistprintf_61062 bitmap_scnlistprintf 2-0-4 61062 NULL ++musb_gadget_enable_61064 musb_gadget_enable 0 61064 NULL ++get_adapter_status_61066 get_adapter_status 0 61066 NULL ++security_set_61074 security_set 0 61074 NULL ++min_freq_show_61080 min_freq_show 0 61080 NULL nohasharray ++journal_stop_61080 journal_stop 0 61080 &min_freq_show_61080 ++mb862xx_i2c_do_address_61081 mb862xx_i2c_do_address 0 61081 NULL ++bfad_im_num_of_ports_show_61082 bfad_im_num_of_ports_show 0 61082 NULL ++ov7670_write_array_61086 ov7670_write_array 0 61086 NULL nohasharray ++patch_stac922x_61086 patch_stac922x 0 61086 &ov7670_write_array_61086 ++inv_mpu_data_rdy_trigger_set_state_61090 inv_mpu_data_rdy_trigger_set_state 0 61090 NULL ++last_sync_action_show_61092 last_sync_action_show 0 61092 NULL ++n_tty_read_61096 n_tty_read 0 61096 NULL ++show_mode_61098 show_mode 0 61098 NULL nohasharray ++prep_dma_61098 prep_dma 0 61098 &show_mode_61098 ++get_derived_key_61100 get_derived_key 4 61100 NULL nohasharray ++regulator_suspend_mem_mode_show_61100 regulator_suspend_mem_mode_show 0 61100 &get_derived_key_61100 ++i40e_calculate_l2fpm_size_61104 i40e_calculate_l2fpm_size 0-1-2-3-4 61104 NULL ++lancer_cmd_get_file_len_61108 lancer_cmd_get_file_len 0 61108 NULL ++packet_getname_61110 packet_getname 0 61110 NULL ++iwl_pcie_enqueue_hcmd_61111 iwl_pcie_enqueue_hcmd 0 61111 NULL ++alloc_chrdev_region_61112 alloc_chrdev_region 0 61112 NULL ++ip6gre_header_61113 ip6gre_header 0 61113 NULL ++show_61117 show 0 61117 NULL ++show_counter_rx_vcrc_errs_61118 show_counter_rx_vcrc_errs 0 61118 NULL ++__probe_kernel_read_61119 __probe_kernel_read 3 61119 NULL nohasharray ++p80211_headerlen_61119 p80211_headerlen 0 61119 &__probe_kernel_read_61119 ++c2_rx_ring_alloc_61122 c2_rx_ring_alloc 0 61122 NULL ++vmemmap_alloc_block_buf_61126 vmemmap_alloc_block_buf 1 61126 NULL ++mce_syscore_suspend_61128 mce_syscore_suspend 0 61128 NULL ++tw68_s_ctrl_61130 tw68_s_ctrl 0 61130 NULL ++ipath_tempsense_internal_read_61132 ipath_tempsense_internal_read 0 61132 NULL ++rocker_dma_rx_ring_skb_map_61133 rocker_dma_rx_ring_skb_map 0 61133 NULL ++afs_proc_cells_write_61139 afs_proc_cells_write 3-0 61139 NULL ++beiscsi_process_mcc_61141 beiscsi_process_mcc 0 61141 NULL ++fc_str_to_dev_loss_61142 fc_str_to_dev_loss 0 61142 NULL ++load_guspatch_61144 load_guspatch 0 61144 NULL ++erst_exec_set_dst_address_base_61146 erst_exec_set_dst_address_base 0 61146 NULL ++adp8870_bl_l2_bright_dim_show_61148 adp8870_bl_l2_bright_dim_show 0 61148 NULL nohasharray ++_unlock_lock_61148 _unlock_lock 0 61148 &adp8870_bl_l2_bright_dim_show_61148 ++rxrpc_preparse_61158 rxrpc_preparse 0 61158 NULL ++uvesafb_show_product_rev_61162 uvesafb_show_product_rev 0 61162 NULL ++sdev_show_device_blocked_61163 sdev_show_device_blocked 0 61163 NULL ++write_dev_61164 write_dev 0 61164 NULL ++__vmalloc_61168 __vmalloc 1 61168 NULL ++iwl_send_phy_cfg_cmd_61172 iwl_send_phy_cfg_cmd 0 61172 NULL ++event_oom_late_read_61175 event_oom_late_read 3-0 61175 NULL nohasharray ++pair_device_61175 pair_device 4 61175 &event_oom_late_read_61175 ++da9052_adc_manual_read_61176 da9052_adc_manual_read 0 61176 NULL ++sys_lsetxattr_61177 sys_lsetxattr 4 61177 NULL ++dio_bio_add_page_61178 dio_bio_add_page 0 61178 NULL ++store_61180 store 0 61180 NULL ++minix_writepage_61183 minix_writepage 0 61183 NULL ++acpi_ut_get_package_object_size_61186 acpi_ut_get_package_object_size 0 61186 NULL nohasharray ++f2fs_sync_file_61186 f2fs_sync_file 0 61186 &acpi_ut_get_package_object_size_61186 ++lpfc_board_mode_show_61189 lpfc_board_mode_show 0 61189 NULL ++show_regs_in_min0_61190 show_regs_in_min0 0 61190 NULL nohasharray ++coherence_id_show_61190 coherence_id_show 0 61190 &show_regs_in_min0_61190 ++wpan_phy_new_61194 wpan_phy_new 2 61194 NULL ++wusb_dnts_show_61200 wusb_dnts_show 0 61200 NULL ++wiimod_pro_calib_show_61201 wiimod_pro_calib_show 0 61201 NULL ++SyS_prctl_61202 SyS_prctl 4 61202 NULL ++cfpkt_append_61206 cfpkt_append 3 61206 NULL ++srp_create_fr_pool_61207 srp_create_fr_pool 3 61207 NULL ++arch_hibernation_header_save_61212 arch_hibernation_header_save 0 61212 NULL ++__iscsi_nacl_auth_store_password_61218 __iscsi_nacl_auth_store_password 0-3 61218 NULL ++smk_read_ambient_61220 smk_read_ambient 3-0 61220 NULL nohasharray ++da9052_read_vbbat_61220 da9052_read_vbbat 0 61220 &smk_read_ambient_61220 nohasharray ++test_init_61220 test_init 0 61220 &da9052_read_vbbat_61220 ++ib_umem_end_61223 ib_umem_end 0 61223 NULL nohasharray ++usb_translate_errors_61223 usb_translate_errors 0-1 61223 &ib_umem_end_61223 nohasharray ++ov7670_write_61223 ov7670_write 0 61223 &usb_translate_errors_61223 ++convert_lock_61230 convert_lock 0 61230 NULL ++disk_show_61241 disk_show 0 61241 NULL ++ns_open_61243 ns_open 0 61243 NULL ++atalk_bind_61244 atalk_bind 0 61244 NULL ++zd1201_setconfig_61247 zd1201_setconfig 0 61247 NULL ++ov5642_g_crop_61248 ov5642_g_crop 0 61248 NULL ++__verify_planes_array_61249 __verify_planes_array 0 61249 NULL nohasharray ++mlx4_en_uc_steer_add_61249 mlx4_en_uc_steer_add 0 61249 &__verify_planes_array_61249 ++squashfs_read_metadata_61251 squashfs_read_metadata 0-5 61251 NULL nohasharray ++max77686_rtc_tm_to_data_61251 max77686_rtc_tm_to_data 0 61251 &squashfs_read_metadata_61251 ++efi_status_to_err_61254 efi_status_to_err 0 61254 NULL ++snd_ca0106_pcm_prepare_capture_61260 snd_ca0106_pcm_prepare_capture 0 61260 NULL ++v9fs_mmap_file_read_61262 v9fs_mmap_file_read 3-0 61262 NULL ++submit_bh_61263 submit_bh 0 61263 NULL ++attr_sensitivity_show_tpkbd_61269 attr_sensitivity_show_tpkbd 0 61269 NULL nohasharray ++t3_sge_init_ecntxt_61269 t3_sge_init_ecntxt 0 61269 &attr_sensitivity_show_tpkbd_61269 ++btrfs_bio_alloc_61270 btrfs_bio_alloc 3 61270 NULL nohasharray ++ifalias_store_61270 ifalias_store 4-0 61270 &btrfs_bio_alloc_61270 nohasharray ++show_fcstat_dumped_frames_61270 show_fcstat_dumped_frames 0 61270 &ifalias_store_61270 ++wiimote_ext_show_61274 wiimote_ext_show 0 61274 NULL ++wlcore_raw_read32_61276 wlcore_raw_read32 0 61276 NULL ++snd_seq_oss_read_61278 snd_seq_oss_read 0 61278 NULL ++max8925_read_device_61279 max8925_read_device 0 61279 NULL ++hfsplus_getxattr_finder_info_61283 hfsplus_getxattr_finder_info 0 61283 NULL ++sys_add_key_61288 sys_add_key 4 61288 NULL nohasharray ++nvme_trans_copy_to_user_61288 nvme_trans_copy_to_user 3 61288 &sys_add_key_61288 ++dbg_notify_reboot_61292 dbg_notify_reboot 0 61292 NULL ++b43_ssb_probe_61293 b43_ssb_probe 0 61293 NULL ++rbd_remove_61294 rbd_remove 0-3 61294 NULL ++teles_resume_61301 teles_resume 0 61301 NULL ++ext4_issue_discard_61305 ext4_issue_discard 2 61305 NULL ++videobuf_dqbuf_61306 videobuf_dqbuf 0 61306 NULL ++xfer_from_user_61307 xfer_from_user 3 61307 NULL ++restart_transaction_61310 restart_transaction 0 61310 NULL ++lp3971_dcdc_disable_61311 lp3971_dcdc_disable 0 61311 NULL ++direntry_bytes_number_61315 direntry_bytes_number 0-2 61315 NULL ++mem_cgroup_resize_limit_61316 mem_cgroup_resize_limit 0 61316 NULL ++sha1_ssse3_export_61318 sha1_ssse3_export 0 61318 NULL ++xfrm_user_sec_ctx_size_61320 xfrm_user_sec_ctx_size 0 61320 NULL ++show_fnode_discovery_auth_optional_61321 show_fnode_discovery_auth_optional 0 61321 NULL ++bonding_show_mii_status_61322 bonding_show_mii_status 0 61322 NULL ++ocfs2_xattr_set_61323 ocfs2_xattr_set 0 61323 NULL ++fsl_asrc_dma_prepare_and_submit_61324 fsl_asrc_dma_prepare_and_submit 0 61324 NULL ++pcan_usb_write_mode_61329 pcan_usb_write_mode 0 61329 NULL ++C_SYSC_msgsnd_61330 C_SYSC_msgsnd 3 61330 NULL nohasharray ++__netdev_adjacent_dev_insert_61330 __netdev_adjacent_dev_insert 0 61330 &C_SYSC_msgsnd_61330 ++write_file_spectral_short_repeat_61335 write_file_spectral_short_repeat 3-0 61335 NULL ++rirb_get_response_61337 rirb_get_response 0 61337 NULL ++st5481_setup_isocpipes_61340 st5481_setup_isocpipes 4-6 61340 NULL ++rx_rx_wa_ba_not_expected_read_61341 rx_rx_wa_ba_not_expected_read 3-0 61341 NULL nohasharray ++init_pin_configs_show_61341 init_pin_configs_show 0 61341 &rx_rx_wa_ba_not_expected_read_61341 nohasharray ++store_select_amcb2_transmit_clock_61341 store_select_amcb2_transmit_clock 0-4 61341 &init_pin_configs_show_61341 nohasharray ++do_splice_direct_61341 do_splice_direct 5-0 61341 &store_select_amcb2_transmit_clock_61341 ++__dm_get_reserved_ios_61342 __dm_get_reserved_ios 0-3-2 61342 NULL ++iwl_poll_bit_61343 iwl_poll_bit 0 61343 NULL ++f1x_map_sysaddr_to_csrow_61344 f1x_map_sysaddr_to_csrow 2 61344 NULL ++lx_hardware_close_61347 lx_hardware_close 0 61347 NULL ++sbp_tpg_attrib_show_max_logins_per_lun_61352 sbp_tpg_attrib_show_max_logins_per_lun 0 61352 NULL ++pm8001_update_flash_61353 pm8001_update_flash 0 61353 NULL ++wil_write_file_recovery_61354 wil_write_file_recovery 3-0 61354 NULL ++vfio_fops_write_61355 vfio_fops_write 0-3 61355 NULL ++num_users_show_61356 num_users_show 0 61356 NULL ++iwlagn_disable_bss_61364 iwlagn_disable_bss 0 61364 NULL nohasharray ++ixgbevf_set_mac_61364 ixgbevf_set_mac 0 61364 &iwlagn_disable_bss_61364 ++show_mem_removable_61365 show_mem_removable 0 61365 NULL ++debug_debug4_read_61367 debug_debug4_read 3-0 61367 NULL ++show_parent_61376 show_parent 0 61376 NULL ++online_pages_61385 online_pages 0 61385 NULL nohasharray ++clps711x_fb_check_var_61385 clps711x_fb_check_var 0 61385 &online_pages_61385 ++change_xattr_61390 change_xattr 5 61390 NULL ++system_enable_write_61396 system_enable_write 3 61396 NULL ++rdac_activate_61397 rdac_activate 0 61397 NULL ++size_entry_mwt_61400 size_entry_mwt 0 61400 NULL nohasharray ++cfg80211_vendor_cmd_alloc_reply_skb_61400 cfg80211_vendor_cmd_alloc_reply_skb 2 61400 &size_entry_mwt_61400 ++systemid_show_61405 systemid_show 0 61405 NULL ++_xadc_update_adc_reg_61411 _xadc_update_adc_reg 0 61411 NULL ++usblp_wwait_61417 usblp_wwait 0 61417 NULL ++arcmsr_attr_host_driver_posted_cmd_61420 arcmsr_attr_host_driver_posted_cmd 0 61420 NULL ++do_s2io_add_mac_61423 do_s2io_add_mac 0 61423 NULL ++show_cpus_attr_61428 show_cpus_attr 0 61428 NULL ++patch_ad1986a_61432 patch_ad1986a 0 61432 NULL ++tw9910_power_61435 tw9910_power 0 61435 NULL ++store_fc_rport_dev_loss_tmo_61436 store_fc_rport_dev_loss_tmo 0-4 61436 NULL ++dma_ops_area_alloc_61440 dma_ops_area_alloc 0-3-4-5 61440 NULL ++target_core_alua_tg_pt_gp_store_attr_alua_support_active_optimized_61445 target_core_alua_tg_pt_gp_store_attr_alua_support_active_optimized 0-3 61445 NULL ++target_core_dev_pr_show_spc3_res_61447 target_core_dev_pr_show_spc3_res 0 61447 NULL ++job_control_61452 job_control 0 61452 NULL ++ceph_sync_write_61453 ceph_sync_write 0 61453 NULL ++unix_stream_sendmsg_61455 unix_stream_sendmsg 0-4 61455 NULL ++show_temperature_61459 show_temperature 0 61459 NULL ++clps711x_pwm_config_61461 clps711x_pwm_config 0 61461 NULL ++mwifiex_cmd_802_11_rssi_info_61464 mwifiex_cmd_802_11_rssi_info 0 61464 NULL nohasharray ++netconsole_target_attr_show_61464 netconsole_target_attr_show 0 61464 &mwifiex_cmd_802_11_rssi_info_61464 ++validate_61467 validate 0 61467 NULL ++vxfs_readpage_61468 vxfs_readpage 0 61468 NULL ++rt2x00usb_vendor_request_61470 rt2x00usb_vendor_request 0 61470 NULL ++capability_get_61474 capability_get 0 61474 NULL ++get_fan_input_61476 get_fan_input 0 61476 NULL ++iad_bFunctionClass_show_61477 iad_bFunctionClass_show 0 61477 NULL ++fm10k_setup_all_rx_resources_61478 fm10k_setup_all_rx_resources 0 61478 NULL ++snd_pcm_lib_writev_transfer_61483 snd_pcm_lib_writev_transfer 5 61483 NULL nohasharray ++show_61483 show 0 61483 &snd_pcm_lib_writev_transfer_61483 ++btrfs_item_size_61485 btrfs_item_size 0 61485 NULL ++__mv88e6xxx_reg_write_61486 __mv88e6xxx_reg_write 0 61486 NULL ++mc13xxx_reg_write_61490 mc13xxx_reg_write 0 61490 NULL ++bonding_show_resend_igmp_61498 bonding_show_resend_igmp 0 61498 NULL ++batadv_interface_add_vid_61502 batadv_interface_add_vid 0 61502 NULL ++ocfs2_xattr_security_get_61503 ocfs2_xattr_security_get 0 61503 NULL nohasharray ++qla2x00_link_state_show_61503 qla2x00_link_state_show 0 61503 &ocfs2_xattr_security_get_61503 nohasharray ++bnad_setup_tx_61503 bnad_setup_tx 0 61503 &qla2x00_link_state_show_61503 ++pppol2tp_getname_61506 pppol2tp_getname 0 61506 NULL ++__dn_connect_61507 __dn_connect 0 61507 NULL ++he_open_61509 he_open 0 61509 NULL nohasharray ++ali_ircc_net_open_61509 ali_ircc_net_open 0 61509 &he_open_61509 ++__nfs_revalidate_inode_61510 __nfs_revalidate_inode 0 61510 NULL ++ubi_version_show_61514 ubi_version_show 0 61514 NULL ++brcmf_sdio_txpkt_prep_sg_61521 brcmf_sdio_txpkt_prep_sg 4-0 61521 NULL ++dummy_downcall_61522 dummy_downcall 0-3 61522 NULL nohasharray ++ath9k_hw_do_fastcc_61522 ath9k_hw_do_fastcc 0 61522 &dummy_downcall_61522 nohasharray ++start_dma_61522 start_dma 0 61522 &ath9k_hw_do_fastcc_61522 ++mtu_show_61523 mtu_show 0 61523 NULL ++show_pwm_reg_61524 show_pwm_reg 0 61524 NULL ++usbvision_i2c_xfer_61527 usbvision_i2c_xfer 0-3 61527 NULL ++unmap_and_move_huge_page_61528 unmap_and_move_huge_page 0 61528 NULL ++jffs2_write_end_61529 jffs2_write_end 0-5 61529 NULL ++l2tp_ip_connect_61530 l2tp_ip_connect 0 61530 NULL ++ntfs_attr_lookup_61539 ntfs_attr_lookup 0 61539 NULL ++test_power_get_ac_property_61540 test_power_get_ac_property 0 61540 NULL ++show_fcstat_seconds_since_last_reset_61541 show_fcstat_seconds_since_last_reset 0 61541 NULL nohasharray ++adt7x10_set_temp_61541 adt7x10_set_temp 0-4 61541 &show_fcstat_seconds_since_last_reset_61541 nohasharray ++proc_write_device_61541 proc_write_device 3 61541 &adt7x10_set_temp_61541 ++compat_SyS_select_61542 compat_SyS_select 1 61542 NULL ++set_gssp_clnt_61543 set_gssp_clnt 0 61543 NULL nohasharray ++shrink_store_61543 shrink_store 0-3 61543 &set_gssp_clnt_61543 ++get_ohm_of_thermistor_61545 get_ohm_of_thermistor 0 61545 NULL ++bch_cached_dev_store_61547 bch_cached_dev_store 0-4 61547 NULL nohasharray ++xadc_axi_read_adc_reg_61547 xadc_axi_read_adc_reg 0 61547 &bch_cached_dev_store_61547 ++show_fc_host_permanent_port_name_61549 show_fc_host_permanent_port_name 0 61549 NULL ++lpfc_oas_supported_show_61550 lpfc_oas_supported_show 0 61550 NULL ++trace_options_core_write_61551 trace_options_core_write 3 61551 NULL ++store_61553 store 0-3 61553 NULL nohasharray ++ip_gre_calc_hlen_61553 ip_gre_calc_hlen 0 61553 &store_61553 ++reiserfs_xattr_set_61558 reiserfs_xattr_set 0 61558 NULL ++dvb_net_ioctl_61559 dvb_net_ioctl 2 61559 NULL ++hidpp_prefix_name_61562 hidpp_prefix_name 2 61562 NULL ++iscsi_tpg_auth_show_authenticate_target_61563 iscsi_tpg_auth_show_authenticate_target 0 61563 NULL nohasharray ++wl1271_hw_init_61563 wl1271_hw_init 0 61563 &iscsi_tpg_auth_show_authenticate_target_61563 ++b43_phy_ht_op_switch_channel_61564 b43_phy_ht_op_switch_channel 0 61564 NULL ++iwl_force_rf_reset_61566 iwl_force_rf_reset 0 61566 NULL ++sock_sendmsg_61567 sock_sendmsg 0-3 61567 NULL ++fan_proc_write_61569 fan_proc_write 3-0 61569 NULL ++ieee80211_if_read_rc_rateidx_mask_2ghz_61570 ieee80211_if_read_rc_rateidx_mask_2ghz 3-0 61570 NULL ++ldlm_pool_rw_atomic_seq_write_61572 ldlm_pool_rw_atomic_seq_write 3 61572 NULL ++max_brightness_show_61577 max_brightness_show 0 61577 NULL ++show_ordinals_61579 show_ordinals 0 61579 NULL ++nfs4_do_find_root_sec_61580 nfs4_do_find_root_sec 0 61580 NULL ++seq_open_private_61589 seq_open_private 3 61589 NULL ++ov2640_set_params_61591 ov2640_set_params 0 61591 NULL ++ipath_write_61598 ipath_write 0-3 61598 NULL ++__get_vm_area_61599 __get_vm_area 1 61599 NULL ++netlink_recvmsg_61600 netlink_recvmsg 0-4 61600 NULL ++nfs4_init_uniform_client_string_61601 nfs4_init_uniform_client_string 3 61601 NULL nohasharray ++cx2341x_handler_init_61601 cx2341x_handler_init 2 61601 &nfs4_init_uniform_client_string_61601 ++br_device_event_61613 br_device_event 0 61613 NULL ++configfs_write_file_61621 configfs_write_file 3-0 61621 NULL nohasharray ++alloc_cq_buf_61621 alloc_cq_buf 4-3 61621 &configfs_write_file_61621 ++get_pages_array_61622 get_pages_array 1 61622 NULL ++s1d13xxxfb_set_par_61623 s1d13xxxfb_set_par 0 61623 NULL ++ieee80211_if_fmt_hw_queues_61629 ieee80211_if_fmt_hw_queues 3 61629 NULL ++i2o_parm_table_get_61635 i2o_parm_table_get 6 61635 NULL ++pm8001_chip_fw_flash_update_req_61637 pm8001_chip_fw_flash_update_req 0 61637 NULL ++store_61638 store 0 61638 NULL ++btrfs_add_ordered_extent_61642 btrfs_add_ordered_extent 0 61642 NULL ++snd_pcm_oss_read3_61643 snd_pcm_oss_read3 0-3 61643 NULL nohasharray ++tcf_hashinfo_init_61643 tcf_hashinfo_init 2 61643 &snd_pcm_oss_read3_61643 ++ipath_write_umem64_61644 ipath_write_umem64 0 61644 NULL ++resize_stripes_61650 resize_stripes 2-0 61650 NULL ++video_autosw_set_61652 video_autosw_set 0 61652 NULL ++wl1251_sdio_set_power_61653 wl1251_sdio_set_power 0 61653 NULL ++zd_chip_set_multicast_hash_61656 zd_chip_set_multicast_hash 0 61656 NULL ++uvesafb_exec_61657 uvesafb_exec 0 61657 NULL ++show_counter_tx_underruns_61658 show_counter_tx_underruns 0 61658 NULL ++fill_meta_index_61660 fill_meta_index 0-2 61660 NULL ++pci_read_config_dword_61662 pci_read_config_dword 0 61662 NULL ++twl6040gpo_direction_out_61663 twl6040gpo_direction_out 0 61663 NULL ++pwm_store_61666 pwm_store 0-4 61666 NULL ++insert_one_name_61668 insert_one_name 7 61668 NULL nohasharray ++gx1fb_set_par_61668 gx1fb_set_par 0 61668 &insert_one_name_61668 ++x25_open_61673 x25_open 0 61673 NULL nohasharray ++atl1_setup_ring_resources_61673 atl1_setup_ring_resources 0 61673 &x25_open_61673 ++pcan_usb_pro_set_filter_61674 pcan_usb_pro_set_filter 0 61674 NULL nohasharray ++store_fan_step_output_61674 store_fan_step_output 0-4 61674 &pcan_usb_pro_set_filter_61674 ++input_event_size_61677 input_event_size 0 61677 NULL nohasharray ++ceph_direct_io_61677 ceph_direct_io 0 61677 &input_event_size_61677 ++vid_out_buf_prepare_61678 vid_out_buf_prepare 0 61678 NULL ++lock_loop_61681 lock_loop 1 61681 NULL ++amd_gpio_dirout_61682 amd_gpio_dirout 0 61682 NULL nohasharray ++show_tabletXtilt_61682 show_tabletXtilt 0 61682 &amd_gpio_dirout_61682 nohasharray ++fuse_dentry_revalidate_61682 fuse_dentry_revalidate 0 61682 &show_tabletXtilt_61682 ++__do_tune_cpucache_61684 __do_tune_cpucache 2-0 61684 NULL ++sco_sock_create_61686 sco_sock_create 0 61686 NULL ++wl1271_sta_hw_init_post_mem_61688 wl1271_sta_hw_init_post_mem 0 61688 NULL ++abx500_set_register_interruptible_61690 abx500_set_register_interruptible 0 61690 NULL ++filter_read_61692 filter_read 3-0 61692 NULL ++show_session_param_ISCSI_PARAM_DEF_TIME2RETAIN_61693 show_session_param_ISCSI_PARAM_DEF_TIME2RETAIN 0 61693 NULL ++qlcnic_validate_beacon_61694 qlcnic_validate_beacon 0 61694 NULL ++prepare_61695 prepare 0 61695 NULL ++lpfc_oas_lun_state_show_61697 lpfc_oas_lun_state_show 0 61697 NULL ++mt_set_quirks_61702 mt_set_quirks 0-4 61702 NULL ++o2hb_heartbeat_group_mode_show_61706 o2hb_heartbeat_group_mode_show 0 61706 NULL ++prog_page_61711 prog_page 2 61711 NULL ++SyS_kexec_file_load_61715 SyS_kexec_file_load 3 61715 NULL ++iov_length_61716 iov_length 0 61716 NULL ++fragmentation_threshold_read_61718 fragmentation_threshold_read 3-0 61718 NULL nohasharray ++rocker_port_ctrl_61718 rocker_port_ctrl 0 61718 &fragmentation_threshold_read_61718 ++iad_bFunctionSubClass_show_61719 iad_bFunctionSubClass_show 0 61719 NULL nohasharray ++rtpm_status_show_61719 rtpm_status_show 0 61719 &iad_bFunctionSubClass_show_61719 nohasharray ++null_alloc_reqbuf_61719 null_alloc_reqbuf 3 61719 &rtpm_status_show_61719 ++show_61723 show 0 61723 NULL nohasharray ++store_rtap_filter_61723 store_rtap_filter 0-4 61723 &show_61723 ++max1027_validate_device_61728 max1027_validate_device 0 61728 NULL ++read_file_regval_61742 read_file_regval 3-0 61742 NULL ++w5100_open_61743 w5100_open 0 61743 NULL ++nfc_llcp_allocate_snl_61749 nfc_llcp_allocate_snl 2 61749 NULL ++tipc_msg_make_bundle_61751 tipc_msg_make_bundle 3 61751 NULL ++cx_auto_init_61752 cx_auto_init 0 61752 NULL ++velocity_init_dma_rings_61759 velocity_init_dma_rings 0 61759 NULL ++nilfs_segctor_last_seg_checkpoint_show_61761 nilfs_segctor_last_seg_checkpoint_show 0 61761 NULL nohasharray ++vmlfb_check_var_61761 vmlfb_check_var 0 61761 &nilfs_segctor_last_seg_checkpoint_show_61761 ++SyS_sendto_61763 SyS_sendto 6-3 61763 NULL ++max77802_rtc_start_alarm_61767 max77802_rtc_start_alarm 0 61767 NULL ++show_pwm_auto_point_temp_61771 show_pwm_auto_point_temp 0 61771 NULL ++features_show_61772 features_show 0 61772 NULL nohasharray ++elv_iosched_store_61772 elv_iosched_store 0-3 61772 &features_show_61772 ++gfs2_meta_wait_61773 gfs2_meta_wait 0 61773 NULL ++compiled_by_show_61788 compiled_by_show 0 61788 NULL ++security_bounded_transition_61790 security_bounded_transition 0 61790 NULL ++sctp_cmd_send_msg_61795 sctp_cmd_send_msg 0 61795 NULL ++batadv_dat_snoop_incoming_arp_reply_61801 batadv_dat_snoop_incoming_arp_reply 3 61801 NULL ++kone_sysfs_show_actual_dpi_61804 kone_sysfs_show_actual_dpi 0 61804 NULL ++show_blank_61805 show_blank 0 61805 NULL ++ecryptfs_removexattr_61808 ecryptfs_removexattr 0 61808 NULL ++mls_compute_context_len_61812 mls_compute_context_len 0 61812 NULL nohasharray ++pch_gbe_setup_rx_resources_61812 pch_gbe_setup_rx_resources 0 61812 &mls_compute_context_len_61812 ++cifs_server_get_key_61813 cifs_server_get_key 0 61813 NULL ++show_pwm_ast_61818 show_pwm_ast 0 61818 NULL ++get_cap_size_61822 get_cap_size 0 61822 NULL ++wacom_btnimg1_store_61823 wacom_btnimg1_store 4-0 61823 NULL ++bd2802_store_reg0x13_61826 bd2802_store_reg0x13 0-4 61826 NULL ++show_root_block_61828 show_root_block 0 61828 NULL ++tps80031_irq_init_61830 tps80031_irq_init 3 61830 NULL ++qlcnic_change_mtu_61833 qlcnic_change_mtu 0 61833 NULL ++bfad_debugfs_write_regwr_61841 bfad_debugfs_write_regwr 3-0 61841 NULL ++iscsit_na_dataout_timeout_61844 iscsit_na_dataout_timeout 0 61844 NULL ++regcache_sync_block_61846 regcache_sync_block 5-4 61846 NULL ++t4vf_sge_alloc_rxq_61850 t4vf_sge_alloc_rxq 0 61850 NULL ++mwifiex_cmd_mac_multicast_adr_61851 mwifiex_cmd_mac_multicast_adr 0 61851 NULL ++ath9k_hw_def_dump_eeprom_61853 ath9k_hw_def_dump_eeprom 4-5-0 61853 NULL ++nvidiafb_set_par_61854 nvidiafb_set_par 0 61854 NULL ++x25_getname_61857 x25_getname 0 61857 NULL ++store_61861 store 0-3 61861 NULL ++evdev_compute_buffer_size_61863 evdev_compute_buffer_size 0 61863 NULL nohasharray ++aty128_decode_var_61863 aty128_decode_var 0 61863 &evdev_compute_buffer_size_61863 ++SYSC_lsetxattr_61869 SYSC_lsetxattr 4 61869 NULL ++store_61871 store 0-3 61871 NULL ++snd_ymfpci_capture_prepare_61873 snd_ymfpci_capture_prepare 0 61873 NULL nohasharray ++lbs_ethtool_get_eeprom_len_61873 lbs_ethtool_get_eeprom_len 0 61873 &snd_ymfpci_capture_prepare_61873 ++get_fw_name_61874 get_fw_name 3 61874 NULL nohasharray ++smsc95xx_ethtool_getregslen_61874 smsc95xx_ethtool_getregslen 0 61874 &get_fw_name_61874 ++qla4xxx_board_id_show_61879 qla4xxx_board_id_show 0 61879 NULL ++cmpc_accel_sensitivity_show_v4_61886 cmpc_accel_sensitivity_show_v4 0 61886 NULL ++show_temp3_alarm_61887 show_temp3_alarm 0 61887 NULL ++disconnect_61888 disconnect 0 61888 NULL ++lprocfs_write_frac_u64_helper_61897 lprocfs_write_frac_u64_helper 2 61897 NULL ++make_rate_61898 make_rate 0 61898 NULL ++ax25_addr_size_61899 ax25_addr_size 0 61899 NULL nohasharray ++cxgb4_pktgl_to_skb_61899 cxgb4_pktgl_to_skb 2 61899 &ax25_addr_size_61899 ++clear_refs_write_61904 clear_refs_write 3-0 61904 NULL ++squashfs_security_get_61914 squashfs_security_get 0 61914 NULL nohasharray ++rx_filter_arp_filter_read_61914 rx_filter_arp_filter_read 3-0 61914 &squashfs_security_get_61914 ++rtl2830_wr_61915 rtl2830_wr 0 61915 NULL ++au0828_init_isoc_61917 au0828_init_isoc 3-4-2-0 61917 NULL ++sctp_sendmsg_61919 sctp_sendmsg 4-0 61919 NULL ++csrow_ce_count_show_61921 csrow_ce_count_show 0 61921 NULL nohasharray ++acpi_ut_release_mutex_61921 acpi_ut_release_mutex 0 61921 &csrow_ce_count_show_61921 nohasharray ++pid_getattr_61921 pid_getattr 0 61921 &acpi_ut_release_mutex_61921 ++fsp_attr_show_pagereg_61922 fsp_attr_show_pagereg 0 61922 NULL ++dps1_is_key_locked_61924 dps1_is_key_locked 0 61924 NULL ++efi_get_runtime_map_size_61927 efi_get_runtime_map_size 0 61927 NULL ++ov9740_reg_write_61928 ov9740_reg_write 0 61928 NULL ++host_show_hp_ssd_smart_path_status_61932 host_show_hp_ssd_smart_path_status 0 61932 NULL nohasharray ++send_bulk_static_data_61932 send_bulk_static_data 3 61932 &host_show_hp_ssd_smart_path_status_61932 ++iscsi_stat_instance_show_attr_sessions_61934 iscsi_stat_instance_show_attr_sessions 0 61934 NULL ++be_mcc_notify_wait_61936 be_mcc_notify_wait 0 61936 NULL ++adv7175_init_61938 adv7175_init 0 61938 NULL ++as3935_read_61939 as3935_read 0 61939 NULL ++multicast_startup_query_count_store_61940 multicast_startup_query_count_store 4-0 61940 NULL nohasharray ++store_indirect_byte_61940 store_indirect_byte 0-4 61940 &multicast_startup_query_count_store_61940 ++kernfs_iop_getxattr_61941 kernfs_iop_getxattr 0 61941 NULL ++e1000e_phc_enable_61945 e1000e_phc_enable 0 61945 NULL ++SyS_kexec_load_61946 SyS_kexec_load 2 61946 NULL ++il4965_ucode_rx_stats_read_61948 il4965_ucode_rx_stats_read 3-0 61948 NULL ++bonding_show_ad_partner_mac_61958 bonding_show_ad_partner_mac 0 61958 NULL ++show_in_max0_61959 show_in_max0 0 61959 NULL ++squashfs_read_id_index_table_61961 squashfs_read_id_index_table 4 61961 NULL nohasharray ++set_type_61961 set_type 0-4 61961 &squashfs_read_id_index_table_61961 ++cmpc_accel_sensitivity_store_61964 cmpc_accel_sensitivity_store 0-4 61964 NULL ++fix_read_error_61965 fix_read_error 4 61965 NULL ++raw_getfrag_61976 raw_getfrag 3-4 61976 NULL ++fd_locked_ioctl_61978 fd_locked_ioctl 3 61978 NULL ++cow_file_range_61979 cow_file_range 3-0 61979 NULL nohasharray ++vfs_fsync_61979 vfs_fsync 0 61979 &cow_file_range_61979 ++crypto_shash_init_61980 crypto_shash_init 0 61980 NULL ++set_extent_delalloc_61982 set_extent_delalloc 0 61982 NULL ++e4000_set_lna_gain_61986 e4000_set_lna_gain 0 61986 NULL ++bus_rescan_store_61988 bus_rescan_store 0-3 61988 NULL ++mem_cgroup_reset_61989 mem_cgroup_reset 0-3 61989 NULL ++module_alloc_exec_61991 module_alloc_exec 1 61991 NULL ++ieee802154_hdr_get_addr_61996 ieee802154_hdr_get_addr 0 61996 NULL ++min_partial_store_61998 min_partial_store 0-3 61998 NULL ++dequeue_event_62000 dequeue_event 3-0 62000 NULL ++ceph_vxattrcb_dir_files_62002 ceph_vxattrcb_dir_files 0 62002 NULL ++snprint_stack_trace_62003 snprint_stack_trace 0 62003 NULL nohasharray ++show_tolerance4_62003 show_tolerance4 0 62003 &snprint_stack_trace_62003 ++wlcore_cmd_configure_failsafe_62004 wlcore_cmd_configure_failsafe 0 62004 NULL nohasharray ++store_pwm_auto_vrdhot_ramp_62004 store_pwm_auto_vrdhot_ramp 0-4 62004 &wlcore_cmd_configure_failsafe_62004 ++niu_init_mac_62007 niu_init_mac 0 62007 NULL ++nilfs_segctor_last_nongc_write_time_show_62008 nilfs_segctor_last_nongc_write_time_show 0 62008 NULL ++xt_compat_match_offset_62011 xt_compat_match_offset 0 62011 NULL ++show_pwm_enable1_62017 show_pwm_enable1 0 62017 NULL ++mtrr_add_page_62018 mtrr_add_page 0 62018 NULL ++SyS_setxattr_62019 SyS_setxattr 4 62019 NULL ++jffs2_do_unlink_62020 jffs2_do_unlink 4 62020 NULL ++SYSC_select_62024 SYSC_select 1 62024 NULL ++regulator_suspend_disk_uV_show_62026 regulator_suspend_disk_uV_show 0 62026 NULL ++max_gen_clk_prepare_62029 max_gen_clk_prepare 0 62029 NULL ++crypt_extent_62033 crypt_extent 0 62033 NULL ++pmcraid_build_passthrough_ioadls_62034 pmcraid_build_passthrough_ioadls 2 62034 NULL ++create_message_62035 create_message 0 62035 NULL nohasharray ++statfs_by_dentry_62035 statfs_by_dentry 0 62035 &create_message_62035 ++em28xx_read_reg_62039 em28xx_read_reg 0 62039 NULL nohasharray ++afs_statfs_62039 afs_statfs 0 62039 &em28xx_read_reg_62039 ++romfs_blk_read_62040 romfs_blk_read 0 62040 NULL ++pcxhr_send_it_dsp_62043 pcxhr_send_it_dsp 0 62043 NULL ++ppp_tx_cp_62044 ppp_tx_cp 5 62044 NULL ++get_attn_62046 get_attn 0 62046 NULL ++cs5345_s_ctrl_62047 cs5345_s_ctrl 0 62047 NULL ++add_vol_ctl_62054 add_vol_ctl 0 62054 NULL ++usnic_ib_inetaddr_event_62056 usnic_ib_inetaddr_event 0 62056 NULL ++do_pselect_62061 do_pselect 1 62061 NULL ++pcpu_alloc_bootmem_62074 pcpu_alloc_bootmem 2 62074 NULL ++_xfs_log_force_lsn_62083 _xfs_log_force_lsn 0 62083 NULL ++fat_setattr_62084 fat_setattr 0 62084 NULL ++lpfc_EnableXLane_show_62087 lpfc_EnableXLane_show 0 62087 NULL ++get_domain_for_dev_62099 get_domain_for_dev 2 62099 NULL ++ipath_user_sdma_pin_pages_62100 ipath_user_sdma_pin_pages 0 62100 NULL ++airspy_alloc_stream_bufs_62101 airspy_alloc_stream_bufs 0 62101 NULL ++jffs2_security_setxattr_62107 jffs2_security_setxattr 4-0 62107 NULL ++online_page_ext_62110 online_page_ext 0 62110 NULL nohasharray ++roccat_common2_sysfs_write_62110 roccat_common2_sysfs_write 0-6 62110 &online_page_ext_62110 ++mwifiex_cmd_get_hw_spec_62112 mwifiex_cmd_get_hw_spec 0 62112 NULL ++ip_recv_error_62117 ip_recv_error 0-3 62117 NULL ++cpuusage_write_62121 cpuusage_write 0 62121 NULL ++dst_ca_write_62125 dst_ca_write 0-3 62125 NULL ++via_parse_auto_config_62126 via_parse_auto_config 0 62126 NULL ++llc_ui_header_len_62131 llc_ui_header_len 0 62131 NULL ++pkg_temp_thermal_cpu_callback_62132 pkg_temp_thermal_cpu_callback 0 62132 NULL ++qib_diag_write_62133 qib_diag_write 3-0 62133 NULL nohasharray ++kobject_add_varg_62133 kobject_add_varg 0 62133 &qib_diag_write_62133 ++ql_status_62135 ql_status 5-0 62135 NULL nohasharray ++show_in16_min_62135 show_in16_min 0 62135 &ql_status_62135 nohasharray ++device_add_attrs_62135 device_add_attrs 0 62135 &show_in16_min_62135 ++fat12_ent_bread_62139 fat12_ent_bread 0 62139 NULL ++acpi_ns_attach_object_62141 acpi_ns_attach_object 0 62141 NULL ++inode_has_perm_62142 inode_has_perm 0 62142 NULL ++mt9v022_g_crop_62149 mt9v022_g_crop 0 62149 NULL nohasharray ++wl1251_acx_sg_cfg_62149 wl1251_acx_sg_cfg 0 62149 &mt9v022_g_crop_62149 nohasharray ++mlx4_en_init_allocator_62149 mlx4_en_init_allocator 0 62149 &wl1251_acx_sg_cfg_62149 nohasharray ++orinoco_cs_resume_62149 orinoco_cs_resume 0 62149 &mlx4_en_init_allocator_62149 ++edac_dimm_info_location_62150 edac_dimm_info_location 0 62150 NULL ++video_usercopy_62151 video_usercopy 2 62151 NULL ++set_component_fault_62152 set_component_fault 0-4 62152 NULL ++array_state_store_62164 array_state_store 0-3 62164 NULL ++SyS_getxattr_62166 SyS_getxattr 4 62166 NULL ++phy_id_show_62171 phy_id_show 0 62171 NULL ++prism54_wpa_bss_ie_get_62173 prism54_wpa_bss_ie_get 0 62173 NULL ++toshiba_haps_reset_protection_62177 toshiba_haps_reset_protection 0 62177 NULL ++write_file_dfs_62180 write_file_dfs 3-0 62180 NULL nohasharray ++writecmd_62180 writecmd 0 62180 &write_file_dfs_62180 ++show_conn_ep_param_ISCSI_PARAM_CONN_ADDRESS_62184 show_conn_ep_param_ISCSI_PARAM_CONN_ADDRESS 0 62184 NULL nohasharray ++small_smb_init_62184 small_smb_init 0 62184 &show_conn_ep_param_ISCSI_PARAM_CONN_ADDRESS_62184 ++alloc_upcall_62186 alloc_upcall 2 62186 NULL ++snd_als300_trigger_62188 snd_als300_trigger 0 62188 NULL ++isl29003_store_range_62197 isl29003_store_range 0-4 62197 NULL ++global_page_state_62202 global_page_state 0 62202 NULL ++sock_kmalloc_62205 sock_kmalloc 2 62205 NULL nohasharray ++cx25821_risc_buffer_upstream_62205 cx25821_risc_buffer_upstream 0 62205 &sock_kmalloc_62205 ++start_62206 start 0 62206 NULL ++drm_fb_helper_check_var_62213 drm_fb_helper_check_var 0 62213 NULL ++host_control_action_show_62216 host_control_action_show 0 62216 NULL ++s_wakeup_filter_62217 s_wakeup_filter 0 62217 NULL ++fuse_notify_poll_wakeup_62218 fuse_notify_poll_wakeup 0 62218 NULL ++niu_open_62220 niu_open 0 62220 NULL ++show_label_62225 show_label 0 62225 NULL nohasharray ++enic_request_intr_62225 enic_request_intr 0 62225 &show_label_62225 ++smk_read_syslog_62227 smk_read_syslog 3-0 62227 NULL ++SYSC_setgroups16_62232 SYSC_setgroups16 1 62232 NULL ++bmp085_get_pressure_62234 bmp085_get_pressure 0 62234 NULL nohasharray ++store_pwm_setting_62234 store_pwm_setting 0-4 62234 &bmp085_get_pressure_62234 ++twl4030_pwmled_config_62243 twl4030_pwmled_config 0 62243 NULL ++allocate_partition_62245 allocate_partition 4 62245 NULL ++pnp_show_card_name_62246 pnp_show_card_name 0 62246 NULL ++nilfs_btree_prepare_insert_62249 nilfs_btree_prepare_insert 0 62249 NULL ++power_supply_store_property_62250 power_supply_store_property 0-4 62250 NULL ++bnx2x_initial_phy_init_62252 bnx2x_initial_phy_init 0 62252 NULL ++fc0013_readreg_62253 fc0013_readreg 0 62253 NULL nohasharray ++pcf50633_rtc_read_time_62253 pcf50633_rtc_read_time 0 62253 &fc0013_readreg_62253 ++of_io_request_and_map_62254 of_io_request_and_map 2 62254 NULL ++m41t94_read_time_62258 m41t94_read_time 0 62258 NULL ++send_control_msg_62261 send_control_msg 0 62261 NULL ++ion_handle_test_dma_62262 ion_handle_test_dma 4-5 62262 NULL ++myri10ge_notify_dca_62265 myri10ge_notify_dca 0 62265 NULL ++pptp_outbound_pkt_62269 pptp_outbound_pkt 0 62269 NULL ++chunk_size_store_62271 chunk_size_store 0-3 62271 NULL ++security_file_permission_62278 security_file_permission 0 62278 NULL ++pcxhr_prepare_62280 pcxhr_prepare 0 62280 NULL nohasharray ++tcm_qla2xxx_tpg_attrib_show_generate_node_acls_62280 tcm_qla2xxx_tpg_attrib_show_generate_node_acls 0 62280 &pcxhr_prepare_62280 ++dccp_init_sock_62281 dccp_init_sock 0 62281 NULL ++osst_write_error_recovery_62287 osst_write_error_recovery 0 62287 NULL ++palmas_clks_prepare_62291 palmas_clks_prepare 0 62291 NULL ++store_tabletWheel_62292 store_tabletWheel 0-4 62292 NULL ++store_62293 store 0-4 62293 NULL ++il_dbgfs_sram_read_62296 il_dbgfs_sram_read 3-0 62296 NULL ++ath10k_pci_cold_reset_62297 ath10k_pci_cold_reset 0 62297 NULL ++sparse_early_usemaps_alloc_pgdat_section_62304 sparse_early_usemaps_alloc_pgdat_section 2 62304 NULL ++ieee80211_do_open_62305 ieee80211_do_open 0 62305 NULL ++pch_gbe_setup_tx_resources_62306 pch_gbe_setup_tx_resources 0 62306 NULL ++state_show_62309 state_show 0 62309 NULL ++subsystem_filter_read_62310 subsystem_filter_read 3 62310 NULL ++udf_sb_alloc_partition_maps_62313 udf_sb_alloc_partition_maps 2 62313 NULL ++hfcpci_empty_bfifo_62323 hfcpci_empty_bfifo 4 62323 NULL ++sierra_open_62327 sierra_open 0 62327 NULL nohasharray ++target_core_alua_tg_pt_gp_store_attr_alua_access_state_62327 target_core_alua_tg_pt_gp_store_attr_alua_access_state 0-3 62327 &sierra_open_62327 ++rtl_op_start_62329 rtl_op_start 0 62329 NULL ++queue_bulk_sg_tx_62330 queue_bulk_sg_tx 0 62330 NULL ++subseq_list_62332 subseq_list 0-3 62332 NULL ++ll_statahead_max_seq_write_62333 ll_statahead_max_seq_write 3 62333 NULL ++pcxhr_write_io_num_reg_cont_62334 pcxhr_write_io_num_reg_cont 0 62334 NULL ++pega_int_read_62335 pega_int_read 0 62335 NULL ++ath5k_attr_show_spur_level_max_62339 ath5k_attr_show_spur_level_max 0 62339 NULL ++show_guid_62340 show_guid 0 62340 NULL nohasharray ++sdev_show_evt_lun_change_reported_62340 sdev_show_evt_lun_change_reported 0 62340 &show_guid_62340 ++pppoe_create_62344 pppoe_create 0 62344 NULL nohasharray ++set_attr_decimals_62344 set_attr_decimals 0-4 62344 &pppoe_create_62344 ++st_version_show_62346 st_version_show 0 62346 NULL ++flash_write_62354 flash_write 3-0 62354 NULL ++gigaset_tty_read_62357 gigaset_tty_read 0 62357 NULL ++nilfs_dev_uuid_show_62360 nilfs_dev_uuid_show 0 62360 NULL ++xfpregs_set_62363 xfpregs_set 4 62363 NULL ++spmi_register_zero_write_62367 spmi_register_zero_write 0 62367 NULL nohasharray ++small_smb2_init_62367 small_smb2_init 0 62367 &spmi_register_zero_write_62367 ++iblock_configure_device_62372 iblock_configure_device 0 62372 NULL nohasharray ++kmalloc_order_62372 kmalloc_order 1 62372 &iblock_configure_device_62372 ++tps6507x_pmic_clear_bits_62373 tps6507x_pmic_clear_bits 0 62373 NULL ++register_netdevice_62374 register_netdevice 0 62374 NULL ++host_control_on_shutdown_show_62376 host_control_on_shutdown_show 0 62376 NULL ++af9005_write_ofdm_register_62378 af9005_write_ofdm_register 0 62378 NULL ++bfad_im_vport_disable_62384 bfad_im_vport_disable 0 62384 NULL ++snd_info_dev_register_entry_62385 snd_info_dev_register_entry 0 62385 NULL ++twl_get_num_slaves_62386 twl_get_num_slaves 0 62386 NULL ++rx_rx_timeout_read_62389 rx_rx_timeout_read 3-0 62389 NULL ++altera_irscan_62396 altera_irscan 2 62396 NULL ++bq2415x_get_weak_battery_voltage_62404 bq2415x_get_weak_battery_voltage 0 62404 NULL nohasharray ++eem_opts_dev_addr_show_62404 eem_opts_dev_addr_show 0 62404 &bq2415x_get_weak_battery_voltage_62404 nohasharray ++ath10k_pci_hif_start_62404 ath10k_pci_hif_start 0 62404 &eem_opts_dev_addr_show_62404 ++fill_zeros_to_end_of_page_62405 fill_zeros_to_end_of_page 0 62405 NULL ++set_umcast_62409 set_umcast 0-4 62409 NULL ++set_ssp_62411 set_ssp 4 62411 NULL ++flags_store_62413 flags_store 4-0 62413 NULL ++mt9m111_reg_read_62415 mt9m111_reg_read 0 62415 NULL ++emit_flush_62420 emit_flush 0 62420 NULL ++ext4_journalled_write_end_62421 ext4_journalled_write_end 5-0 62421 NULL ++setkey_62422 setkey 0 62422 NULL ++ipw_net_set_mac_address_62423 ipw_net_set_mac_address 0 62423 NULL ++fwtty_write_62424 fwtty_write 0-3 62424 NULL ++irst_show_wakeup_events_62429 irst_show_wakeup_events 0 62429 NULL ++roccat_common2_sysfs_write_talk_62430 roccat_common2_sysfs_write_talk 0-6-5 62430 NULL ++disp_store_62433 disp_store 0-4 62433 NULL ++vb2_vmalloc_alloc_62434 vb2_vmalloc_alloc 2 62434 NULL ++ovl_dir_getattr_62435 ovl_dir_getattr 0 62435 NULL ++netdev_alloc_skb_62437 netdev_alloc_skb 2 62437 NULL ++af9005_i2c_xfer_62438 af9005_i2c_xfer 0-3 62438 NULL ++i915_error_state_write_62439 i915_error_state_write 0-3 62439 NULL ++pppox_create_62440 pppox_create 0 62440 NULL ++bmc150_accel_setup_any_motion_interrupt_62441 bmc150_accel_setup_any_motion_interrupt 0 62441 NULL ++inv_mpu6050_write_reg_62443 inv_mpu6050_write_reg 0 62443 NULL ++cxacru_sysfs_show_downstream_hec_errors_62448 cxacru_sysfs_show_downstream_hec_errors 0 62448 NULL ++mlog_store_62451 mlog_store 0-4 62451 NULL ++store_select_redundant_clock_62465 store_select_redundant_clock 0-4 62465 NULL ++show_temp10_62469 show_temp10 0 62469 NULL ++show_shost_eh_deadline_62470 show_shost_eh_deadline 0 62470 NULL nohasharray ++udf_expand_file_adinicb_62470 udf_expand_file_adinicb 0 62470 &show_shost_eh_deadline_62470 ++force_remove_show_62475 force_remove_show 0 62475 NULL ++ip_vs_icmp_xmit_v6_62477 ip_vs_icmp_xmit_v6 0-4 62477 NULL nohasharray ++adapter_test_62477 adapter_test 0 62477 &ip_vs_icmp_xmit_v6_62477 ++cdc_ncm_show_wNtbOutMaxDatagrams_62480 cdc_ncm_show_wNtbOutMaxDatagrams 0 62480 NULL ++do_io_rw_62484 do_io_rw 0-4-3-6 62484 NULL nohasharray ++boost_notify_62484 boost_notify 0 62484 &do_io_rw_62484 ++intr_submit_62485 intr_submit 0 62485 NULL ++rds_add_bound_62490 rds_add_bound 0 62490 NULL ++tracing_saved_cmdlines_size_read_62491 tracing_saved_cmdlines_size_read 3 62491 NULL ++mem_cgroup_write_62492 mem_cgroup_write 0-3 62492 NULL ++persistent_ram_new_62493 persistent_ram_new 1-2 62493 NULL nohasharray ++lpfc_stat_data_ctrl_show_62493 lpfc_stat_data_ctrl_show 0 62493 &persistent_ram_new_62493 ++tps6105x_regulator_enable_62498 tps6105x_regulator_enable 0 62498 NULL ++qat_uclo_map_uof_obj_62504 qat_uclo_map_uof_obj 3 62504 NULL ++scsi_scan_62506 scsi_scan 0 62506 NULL ++store_mtu_62507 store_mtu 0-4 62507 NULL ++show_bank1_setting_62508 show_bank1_setting 0 62508 NULL ++start_show_62510 start_show 0 62510 NULL ++pnp_assign_dma_62518 pnp_assign_dma 0 62518 NULL ++set_beacon_interval_62521 set_beacon_interval 0 62521 NULL ++int3403_get_max_state_62522 int3403_get_max_state 0 62522 NULL ++pep_sendmsg_62524 pep_sendmsg 4-0 62524 NULL ++rio_request_outb_mbox_62526 rio_request_outb_mbox 0 62526 NULL ++atl1e_up_62528 atl1e_up 0 62528 NULL ++iscsi_nacl_attrib_store_default_erl_62529 iscsi_nacl_attrib_store_default_erl 0-3 62529 NULL ++caps_show_62531 caps_show 0 62531 NULL ++test_iso_queue_62534 test_iso_queue 5 62534 NULL nohasharray ++__kmalloc_node_track_caller_62534 __kmalloc_node_track_caller 1 62534 &test_iso_queue_62534 ++debugfs_read_62535 debugfs_read 3-0 62535 NULL nohasharray ++qlcnicvf_config_led_62535 qlcnicvf_config_led 0 62535 &debugfs_read_62535 ++mei_fw_status_62539 mei_fw_status 0 62539 NULL nohasharray ++batadv_softif_create_vlan_62539 batadv_softif_create_vlan 0 62539 &mei_fw_status_62539 ++sco_sock_sendmsg_62542 sco_sock_sendmsg 4-0 62542 NULL ++wl12xx_cmd_role_enable_62545 wl12xx_cmd_role_enable 0 62545 NULL ++qib_refresh_qsfp_cache_62547 qib_refresh_qsfp_cache 0 62547 NULL ++pci_conf2_read_62548 pci_conf2_read 0 62548 NULL ++roccat_common2_sysfs_write_sensor_62554 roccat_common2_sysfs_write_sensor 0-6-5 62554 NULL ++ecp_read_data_62555 ecp_read_data 0 62555 NULL ++target_stat_scsi_auth_intr_show_attr_map_indx_62561 target_stat_scsi_auth_intr_show_attr_map_indx 0 62561 NULL ++errcatch_bytes_number_62564 errcatch_bytes_number 0-2 62564 NULL ++efivarfs_d_hash_62565 efivarfs_d_hash 0 62565 NULL ++ping_init_sock_62567 ping_init_sock 0 62567 NULL ++compute_bitstructs_62570 compute_bitstructs 0 62570 NULL ++cxacru_sysfs_showattr_LINK_62572 cxacru_sysfs_showattr_LINK 0 62572 NULL nohasharray ++bcm54xx_shadow_read_62572 bcm54xx_shadow_read 0 62572 &cxacru_sysfs_showattr_LINK_62572 ++xfrm_user_policy_62573 xfrm_user_policy 4-0 62573 NULL ++compat_SyS_rt_sigpending_62580 compat_SyS_rt_sigpending 2 62580 NULL ++get_subdir_62581 get_subdir 3 62581 NULL nohasharray ++efx_mcdi_await_completion_62581 efx_mcdi_await_completion 0 62581 &get_subdir_62581 ++regcache_lzo_decompress_cache_block_62585 regcache_lzo_decompress_cache_block 0 62585 NULL ++ext3_unfreeze_62588 ext3_unfreeze 0 62588 NULL ++amradio_set_mute_62597 amradio_set_mute 0 62597 NULL ++sm501fb_check_var_pnl_62600 sm501fb_check_var_pnl 0 62600 NULL ++tg3_show_temp_62602 tg3_show_temp 0 62602 NULL nohasharray ++packet_alloc_skb_62602 packet_alloc_skb 4-5-2 62602 &tg3_show_temp_62602 ++bonding_store_bonds_62603 bonding_store_bonds 0-4 62603 NULL ++gfs2_xattr_get_62604 gfs2_xattr_get 0 62604 NULL ++prism2_send_mgmt_62605 prism2_send_mgmt 4 62605 NULL ++bond_alb_set_mac_address_62611 bond_alb_set_mac_address 0 62611 NULL ++show_iface_immediate_data_62613 show_iface_immediate_data 0 62613 NULL ++workqueue_cpu_down_callback_62614 workqueue_cpu_down_callback 0 62614 NULL ++teql_master_mtu_62616 teql_master_mtu 0 62616 NULL nohasharray ++evtchn_fifo_max_channels_62616 evtchn_fifo_max_channels 0 62616 &teql_master_mtu_62616 ++backend_probe_and_watch_62618 backend_probe_and_watch 0 62618 NULL ++iommu_area_alloc_62619 iommu_area_alloc 4-0-7-3-2 62619 NULL ++sync_max_store_62621 sync_max_store 0-3 62621 NULL ++__offline_pages_62626 __offline_pages 0 62626 NULL ++ems_pcmcia_add_card_62627 ems_pcmcia_add_card 2 62627 NULL nohasharray ++fsg_common_set_num_buffers_62627 fsg_common_set_num_buffers 2 62627 &ems_pcmcia_add_card_62627 ++dut_mode_write_62630 dut_mode_write 3-0 62630 NULL ++parport_ieee1284_read_nibble_62634 parport_ieee1284_read_nibble 0 62634 NULL ++vfs_fsync_range_62635 vfs_fsync_range 0 62635 NULL ++bch_btree_map_nodes_62641 bch_btree_map_nodes 0 62641 NULL ++palmas_is_enabled_ldo_62644 palmas_is_enabled_ldo 0 62644 NULL nohasharray ++autosuspend_show_62644 autosuspend_show 0 62644 &palmas_is_enabled_ldo_62644 ++lpfc_sli4_queue_alloc_62646 lpfc_sli4_queue_alloc 3 62646 NULL nohasharray ++ath10k_pci_hif_exchange_bmi_msg_62646 ath10k_pci_hif_exchange_bmi_msg 0-3 62646 &lpfc_sli4_queue_alloc_62646 ++show_counter_rx_tid_full_errs_62647 show_counter_rx_tid_full_errs 0 62647 NULL ++ti_vsend_sync_62648 ti_vsend_sync 0 62648 NULL nohasharray ++show_model_62648 show_model 0 62648 &ti_vsend_sync_62648 nohasharray ++nfs4_proc_set_acl_62648 nfs4_proc_set_acl 0 62648 &show_model_62648 ++wm8994_gpio_direction_in_62649 wm8994_gpio_direction_in 0 62649 NULL ++crypto_shash_finup_62656 crypto_shash_finup 0 62656 NULL ++show_62657 show 0 62657 NULL ++pages_shared_show_62658 pages_shared_show 0 62658 NULL ++da9052_read_tbat_62666 da9052_read_tbat 0 62666 NULL ++atl1e_change_mtu_62670 atl1e_change_mtu 0 62670 NULL ++show_cardr_62674 show_cardr 0 62674 NULL ++wl1273_fm_suspend_62676 wl1273_fm_suspend 0 62676 NULL ++sdio_card_irq_get_62679 sdio_card_irq_get 0 62679 NULL ++qla4xxx_hba_model_show_62680 qla4xxx_hba_model_show 0 62680 NULL ++xfrm_count_pfkey_auth_supported_62684 xfrm_count_pfkey_auth_supported 0 62684 NULL ++printer_req_alloc_62687 printer_req_alloc 2 62687 NULL ++target_stat_scsi_tgt_port_show_attr_in_cmds_62689 target_stat_scsi_tgt_port_show_attr_in_cmds 0 62689 NULL nohasharray ++iscsi_tpg_attrib_show_default_erl_62689 iscsi_tpg_attrib_show_default_erl 0 62689 &target_stat_scsi_tgt_port_show_attr_in_cmds_62689 ++adxl34x_i2c_read_block_62691 adxl34x_i2c_read_block 3 62691 NULL ++ioremap_wc_62695 ioremap_wc 2-1 62695 NULL nohasharray ++proc_mpc_write_62695 proc_mpc_write 0-3 62695 &ioremap_wc_62695 ++sock_no_bind_62697 sock_no_bind 0 62697 NULL ++show_fan_time_62699 show_fan_time 0 62699 NULL ++ieee80211_set_probe_resp_62700 ieee80211_set_probe_resp 3 62700 NULL nohasharray ++fddi_header_62700 fddi_header 0 62700 &ieee80211_set_probe_resp_62700 ++simple_readpage_62703 simple_readpage 0 62703 NULL ++flush_62706 flush 0 62706 NULL ++bioset_integrity_create_62708 bioset_integrity_create 2 62708 NULL nohasharray ++target_stat_scsi_tgt_dev_attr_show_62708 target_stat_scsi_tgt_dev_attr_show 0 62708 &bioset_integrity_create_62708 ++target_configure_device_62714 target_configure_device 0 62714 NULL ++ubifs_getxattr_62717 ubifs_getxattr 0 62717 NULL nohasharray ++gfs2_log_write_62717 gfs2_log_write 3 62717 &ubifs_getxattr_62717 ++do_serial8250_set_rxtrig_62720 do_serial8250_set_rxtrig 0 62720 NULL ++cachefiles_daemon_read_62723 cachefiles_daemon_read 0-3 62723 NULL ++belkin_sa_open_62724 belkin_sa_open 0 62724 NULL nohasharray ++kpagecount_read_62724 kpagecount_read 0-3 62724 &belkin_sa_open_62724 ++atkbd_do_show_softraw_62726 atkbd_do_show_softraw 0 62726 NULL ++rndis_filter_send_request_62727 rndis_filter_send_request 0 62727 NULL ++set_beep_enable_62731 set_beep_enable 0-4 62731 NULL ++show_fc_host_supported_fc4s_62732 show_fc_host_supported_fc4s 0 62732 NULL ++client_channels_62735 client_channels 0 62735 NULL ++obd_ioctl_popdata_62741 obd_ioctl_popdata 3 62741 NULL ++key_replays_read_62746 key_replays_read 3-0 62746 NULL nohasharray ++roccat_common2_sysfs_write_buttons_62746 roccat_common2_sysfs_write_buttons 0-6-5 62746 &key_replays_read_62746 ++lov_verify_lmm_62747 lov_verify_lmm 2 62747 NULL ++show_tabletMouseRight_62750 show_tabletMouseRight 0 62750 NULL ++mwifiex_rdeeprom_write_62754 mwifiex_rdeeprom_write 3-0 62754 NULL ++da903x_is_enabled_62756 da903x_is_enabled 0 62756 NULL ++hardware_show_62757 hardware_show 0 62757 NULL ++selinux_key_getsecurity_62760 selinux_key_getsecurity 0 62760 NULL nohasharray ++cciss_scsi_user_command_62760 cciss_scsi_user_command 0-4 62760 &selinux_key_getsecurity_62760 ++lpfc_soft_wwnn_show_62761 lpfc_soft_wwnn_show 0 62761 NULL ++register_kprobe_62762 register_kprobe 0 62762 NULL ++show_ibdev_62764 show_ibdev 0 62764 NULL ++init_chip_wc_pat_62768 init_chip_wc_pat 2 62768 NULL ++ax25_sendmsg_62770 ax25_sendmsg 4-0 62770 NULL nohasharray ++copy_page_to_iter_iovec_62770 copy_page_to_iter_iovec 0-3 62770 &ax25_sendmsg_62770 ++cm_show_counter_62774 cm_show_counter 0 62774 NULL ++tomoyo_audit_inet_log_62775 tomoyo_audit_inet_log 0 62775 NULL ++C_SYSC_ipc_62776 C_SYSC_ipc 3 62776 NULL nohasharray ++mvs_queue_command_62776 mvs_queue_command 0 62776 &C_SYSC_ipc_62776 ++store_sched5_62779 store_sched5 4-0 62779 NULL ++show_62782 show 0 62782 NULL ++stmmac_change_mtu_62783 stmmac_change_mtu 0 62783 NULL ++sabi_command_62785 sabi_command 0 62785 NULL ++SyS_sched_getaffinity_62786 SyS_sched_getaffinity 2 62786 NULL ++bttv_prepare_buffer_62787 bttv_prepare_buffer 0 62787 NULL nohasharray ++update_clusterinfo_62787 update_clusterinfo 0 62787 &bttv_prepare_buffer_62787 ++smack_inode_setattr_62789 smack_inode_setattr 0 62789 NULL ++_create_message_62795 _create_message 0 62795 NULL ++max_freq_show_62797 max_freq_show 0 62797 NULL nohasharray ++hdaps_temp1_show_62797 hdaps_temp1_show 0 62797 &max_freq_show_62797 nohasharray ++qla2x00_optrom_bios_version_show_62797 qla2x00_optrom_bios_version_show 0 62797 &hdaps_temp1_show_62797 ++fsa9480_get_switch_62799 fsa9480_get_switch 0 62799 NULL ++show_cam_size_62800 show_cam_size 0 62800 NULL ++ad9523_store_62804 ad9523_store 0-4 62804 NULL ++pcap_regulator_is_enabled_62811 pcap_regulator_is_enabled 0 62811 NULL nohasharray ++da9052_read_chg_current_62811 da9052_read_chg_current 0 62811 &pcap_regulator_is_enabled_62811 nohasharray ++set_port0_62811 set_port0 0-4 62811 &da9052_read_chg_current_62811 ++ceph_update_writeable_page_62812 ceph_update_writeable_page 0 62812 NULL ++lm8323_pwm_store_time_62816 lm8323_pwm_store_time 0-4 62816 NULL ++tracing_total_entries_read_62817 tracing_total_entries_read 3 62817 NULL ++of_alias_get_id_62818 of_alias_get_id 0 62818 NULL ++efivar_show_raw_62820 efivar_show_raw 0 62820 NULL ++show_iface_max_outstanding_r2t_62826 show_iface_max_outstanding_r2t 0 62826 NULL nohasharray ++journal_end_62826 journal_end 0 62826 &show_iface_max_outstanding_r2t_62826 ++gem_do_start_62827 gem_do_start 0 62827 NULL ++hpfs_read_ea_62828 hpfs_read_ea 0 62828 NULL nohasharray ++fm10k_change_mtu_62828 fm10k_change_mtu 0 62828 &hpfs_read_ea_62828 ++iscsi_tpg_param_show_OFMarkInt_62831 iscsi_tpg_param_show_OFMarkInt 0 62831 NULL ++__generic_file_splice_read_62834 __generic_file_splice_read 0 62834 NULL ++__rounddown_pow_of_two_62836 __rounddown_pow_of_two 0 62836 NULL ++bio_get_nr_vecs_62838 bio_get_nr_vecs 0 62838 NULL nohasharray ++notifier_to_errno_62838 notifier_to_errno 0-1 62838 &bio_get_nr_vecs_62838 ++xlog_recover_add_to_trans_62839 xlog_recover_add_to_trans 4 62839 NULL ++timeouts_show_62841 timeouts_show 0 62841 NULL ++kovaplus_sysfs_read_profile_buttons_62843 kovaplus_sysfs_read_profile_buttons 0-5-6 62843 NULL ++rx_fcs_err_read_62844 rx_fcs_err_read 3-0 62844 NULL ++show_spi_transport_period_62848 show_spi_transport_period 0 62848 NULL ++uwb_rc_cmd_62850 uwb_rc_cmd 0 62850 NULL ++wl12xx_trigger_cmd_62853 wl12xx_trigger_cmd 0 62853 NULL ++mt2131_set_params_62854 mt2131_set_params 0 62854 NULL ++sr9800_reset_62856 sr9800_reset 0 62856 NULL ++__f2fs_setxattr_62857 __f2fs_setxattr 0 62857 NULL ++hpi_read_word_62862 hpi_read_word 0 62862 NULL ++pcf8563_read_block_data_62864 pcf8563_read_block_data 0 62864 NULL ++uart_get_attr_close_delay_62867 uart_get_attr_close_delay 0 62867 NULL ++adv7343_s_ctrl_62869 adv7343_s_ctrl 0 62869 NULL ++acpi_ds_result_pop_62871 acpi_ds_result_pop 0 62871 NULL ++l2tp_ip6_recvmsg_62874 l2tp_ip6_recvmsg 0-4 62874 NULL nohasharray ++netif_set_xps_queue_62874 netif_set_xps_queue 0 62874 &l2tp_ip6_recvmsg_62874 ++typhoon_download_firmware_62875 typhoon_download_firmware 0 62875 NULL ++jffs2_security_getxattr_62876 jffs2_security_getxattr 0 62876 NULL ++show_62877 show 0 62877 NULL nohasharray ++xfs_rtmodify_range_62877 xfs_rtmodify_range 0 62877 &show_62877 ++store_engine_leds_62878 store_engine_leds 0-4 62878 NULL ++pcol_try_alloc_62879 pcol_try_alloc 0 62879 NULL nohasharray ++raid5_store_preread_threshold_62879 raid5_store_preread_threshold 0-3 62879 &pcol_try_alloc_62879 ++compass_store_62881 compass_store 0-3 62881 NULL ++aoechr_write_62883 aoechr_write 3-0 62883 NULL nohasharray ++cache_parse_62883 cache_parse 0 62883 &aoechr_write_62883 ++uart_mode_show_62886 uart_mode_show 0 62886 NULL ++resize_info_buffer_62889 resize_info_buffer 2 62889 NULL ++if_spi_host_to_card_62890 if_spi_host_to_card 4 62890 NULL ++power_uw_show_62894 power_uw_show 0 62894 NULL nohasharray ++tg3_power_up_62894 tg3_power_up 0 62894 &power_uw_show_62894 ++dummy_hrtimer_start_62897 dummy_hrtimer_start 0 62897 NULL nohasharray ++mrf24j40_start_62897 mrf24j40_start 0 62897 &dummy_hrtimer_start_62897 ++mxl5005s_get_if_frequency_62898 mxl5005s_get_if_frequency 0 62898 NULL nohasharray ++hdaps_calibrate_store_62898 hdaps_calibrate_store 0-4 62898 &mxl5005s_get_if_frequency_62898 ++wiimod_bboard_calib_show_62903 wiimod_bboard_calib_show 0 62903 NULL nohasharray ++afs_vlocation_cache_get_key_62903 afs_vlocation_cache_get_key 0 62903 &wiimod_bboard_calib_show_62903 ++mempool_create_slab_pool_62907 mempool_create_slab_pool 1 62907 NULL ++getdqbuf_62908 getdqbuf 1 62908 NULL ++get_temp_max_62909 get_temp_max 0 62909 NULL ++si476x_core_cmd_fm_phase_diversity_62915 si476x_core_cmd_fm_phase_diversity 0 62915 NULL ++o2nm_node_store_62916 o2nm_node_store 0-4 62916 NULL ++rdmsr_safe_on_cpu_62917 rdmsr_safe_on_cpu 0 62917 NULL ++stk17ta8_rtc_read_time_62918 stk17ta8_rtc_read_time 0 62918 NULL ++ll_statahead_agl_seq_write_62928 ll_statahead_agl_seq_write 3 62928 NULL ++netvsc_send_62939 netvsc_send 0 62939 NULL nohasharray ++acpi_processor_set_throttling_62939 acpi_processor_set_throttling 0 62939 &netvsc_send_62939 ++edt_ft5x06_setting_show_62940 edt_ft5x06_setting_show 0 62940 NULL ++sr9800_set_default_mode_62946 sr9800_set_default_mode 0 62946 NULL ++adp5520_bl_daylight_max_store_62947 adp5520_bl_daylight_max_store 4-0 62947 NULL ++agp_create_user_memory_62955 agp_create_user_memory 1 62955 NULL ++set_trigger_state_62957 set_trigger_state 0 62957 NULL ++nvif_object_mthd_62960 nvif_object_mthd 4-0 62960 NULL nohasharray ++show_hyst_common_62960 show_hyst_common 0 62960 &nvif_object_mthd_62960 ++rc5t583_rtc_read_time_62965 rc5t583_rtc_read_time 0 62965 NULL ++libcfs_sock_read_62968 libcfs_sock_read 3 62968 NULL ++dib8096p_rw_on_apb_62970 dib8096p_rw_on_apb 0-3 62970 NULL ++asus_wmi_set_devstate_62971 asus_wmi_set_devstate 0 62971 NULL ++bcm7xxx_config_init_62973 bcm7xxx_config_init 0 62973 NULL ++sleep_millisecs_show_62979 sleep_millisecs_show 0 62979 NULL ++extts_fifo_show_62981 extts_fifo_show 0 62981 NULL ++show_state_name_62985 show_state_name 0 62985 NULL nohasharray ++cifs_direct_io_62985 cifs_direct_io 0 62985 &show_state_name_62985 ++ipoib_vlan_add_62988 ipoib_vlan_add 0 62988 NULL ++prof_cpu_mask_proc_write_62989 prof_cpu_mask_proc_write 0-3 62989 NULL ++snd_emu10k1_fx8010_playback_trigger_62990 snd_emu10k1_fx8010_playback_trigger 0 62990 NULL ++hwdep_read_62992 hwdep_read 3 62992 NULL nohasharray ++ivtv_start_capture_62992 ivtv_start_capture 0 62992 &hwdep_read_62992 ++send_62994 send 0 62994 NULL ++iscsit_ta_demo_mode_write_protect_62998 iscsit_ta_demo_mode_write_protect 0 62998 NULL ++generic_file_fsync_62999 generic_file_fsync 0 62999 NULL ++asus_wmi_get_devstate_63000 asus_wmi_get_devstate 0 63000 NULL ++hash_max_show_63001 hash_max_show 0 63001 NULL ++get_skb_63008 get_skb 2 63008 NULL ++__ext3_journal_stop_63017 __ext3_journal_stop 0 63017 NULL ++__sctp_connect_63020 __sctp_connect 0 63020 NULL ++show_pwmfreq_63024 show_pwmfreq 0 63024 NULL ++kstrtoull_from_user_63026 kstrtoull_from_user 2 63026 NULL nohasharray ++xfs_trans_reserve_63026 xfs_trans_reserve 0 63026 &kstrtoull_from_user_63026 ++nfs_revalidate_inode_63032 nfs_revalidate_inode 0 63032 NULL ++__vb2_perform_fileio_63033 __vb2_perform_fileio 3-0 63033 NULL nohasharray ++PTR_ERR_63033 PTR_ERR 0 63033 &__vb2_perform_fileio_63033 ++solo_i2c_master_xfer_63036 solo_i2c_master_xfer 0-3 63036 NULL ++pipeline_defrag_to_csum_swi_read_63037 pipeline_defrag_to_csum_swi_read 3-0 63037 NULL ++crypto_ahash_finup_63039 crypto_ahash_finup 0 63039 NULL ++scsi_host_alloc_63041 scsi_host_alloc 2 63041 NULL ++po1030_set_green_balance_63045 po1030_set_green_balance 0 63045 NULL nohasharray ++s6e63m0_sysfs_show_gamma_mode_63045 s6e63m0_sysfs_show_gamma_mode 0 63045 &po1030_set_green_balance_63045 ++b43_nphy_set_channel_63047 b43_nphy_set_channel 0 63047 NULL ++wiimote_cmd_wait_63051 wiimote_cmd_wait 0 63051 NULL nohasharray ++pyra_sysfs_write_info_63051 pyra_sysfs_write_info 0-6-5 63051 &wiimote_cmd_wait_63051 ++gso_pskb_expand_head_63052 gso_pskb_expand_head 2 63052 NULL ++wait_for_event_63054 wait_for_event 0 63054 NULL ++unlink1_63059 unlink1 3 63059 NULL nohasharray ++show_conn_param_ISCSI_PARAM_IFMARKER_EN_63059 show_conn_param_ISCSI_PARAM_IFMARKER_EN 0 63059 &unlink1_63059 ++__nilfs_btree_get_block_63062 __nilfs_btree_get_block 0 63062 NULL ++show_in_max_63065 show_in_max 0 63065 NULL nohasharray ++remote_settings_file_read_63065 remote_settings_file_read 0-3 63065 &show_in_max_63065 ++xen_set_nslabs_63066 xen_set_nslabs 0 63066 NULL ++parport_ieee1284_ecp_write_data_63067 parport_ieee1284_ecp_write_data 0 63067 NULL ++iwl_dbgfs_fw_rx_stats_read_63070 iwl_dbgfs_fw_rx_stats_read 3-0 63070 NULL ++enable_show_63071 enable_show 0 63071 NULL ++__uncore_filter_state_show_63073 __uncore_filter_state_show 0 63073 NULL ++show_priority_63080 show_priority 0 63080 NULL ++show_counter_rx_dropped_pkts_63082 show_counter_rx_dropped_pkts 0 63082 NULL nohasharray ++nosy_read_63082 nosy_read 0-3 63082 &show_counter_rx_dropped_pkts_63082 nohasharray ++bd2802_store_reg0x00_63082 bd2802_store_reg0x00 0-4 63082 &nosy_read_63082 ++gpio_trig_brightness_show_63087 gpio_trig_brightness_show 0 63087 NULL ++ath10k_bmi_execute_63089 ath10k_bmi_execute 0 63089 NULL ++rt2x00usb_find_endpoints_63091 rt2x00usb_find_endpoints 0 63091 NULL ++show_tcpInSegs_63094 show_tcpInSegs 0 63094 NULL ++cachefiles_check_in_use_63096 cachefiles_check_in_use 0 63096 NULL ++compr_data_size_show_63105 compr_data_size_show 0 63105 NULL ++pcistub_slot_remove_63106 pcistub_slot_remove 0-3 63106 NULL ++ip_vs_out_icmp_63108 ip_vs_out_icmp 0 63108 NULL ++errors_store_63110 errors_store 0-3 63110 NULL ++dquot_alloc_block_63114 dquot_alloc_block 0 63114 NULL ++iwl_dbgfs_sensitivity_read_63116 iwl_dbgfs_sensitivity_read 3-0 63116 NULL ++ethoc_open_63118 ethoc_open 0 63118 NULL ++atc_pcm_capture_get_resources_63121 atc_pcm_capture_get_resources 0 63121 NULL ++pcf8523_read_63123 pcf8523_read 0 63123 NULL ++fat_writepages_63131 fat_writepages 0 63131 NULL nohasharray ++target_core_show_alua_lu_gp_63131 target_core_show_alua_lu_gp 0 63131 &fat_writepages_63131 ++bma180_set_bits_63133 bma180_set_bits 0 63133 NULL ++team_queue_override_init_63136 team_queue_override_init 0 63136 NULL ++ib_send_cm_rtu_63138 ib_send_cm_rtu 3 63138 NULL ++brcmf_fil_cmd_data_set_63139 brcmf_fil_cmd_data_set 0 63139 NULL ++mcs_get_reg_63141 mcs_get_reg 0 63141 NULL ++show_ipv4_iface_ttl_63146 show_ipv4_iface_ttl 0 63146 NULL ++pwc_set_u8_ctrl_63148 pwc_set_u8_ctrl 0 63148 NULL nohasharray ++c2port_store_flash_erase_63148 c2port_store_flash_erase 0-4 63148 &pwc_set_u8_ctrl_63148 ++zd_ioread16_locked_63151 zd_ioread16_locked 0 63151 NULL ++iwl_mvm_coex_dump_mbox_63153 iwl_mvm_coex_dump_mbox 0-3-4 63153 NULL ++ubifs_change_one_lp_63157 ubifs_change_one_lp 0 63157 NULL ++csio_t4_mc_read_63158 csio_t4_mc_read 0 63158 NULL ++iscsi_tpg_param_show_IFMarker_63161 iscsi_tpg_param_show_IFMarker 0 63161 NULL ++il4965_show_tx_power_63163 il4965_show_tx_power 0 63163 NULL nohasharray ++arvo_sysfs_set_key_mask_63163 arvo_sysfs_set_key_mask 0-4 63163 &il4965_show_tx_power_63163 ++amd_iommu_show_features_63168 amd_iommu_show_features 0 63168 NULL ++smk_write_revoke_subj_63173 smk_write_revoke_subj 3-0 63173 NULL ++wm831x_reg_read_63175 wm831x_reg_read 0 63175 NULL ++read_63177 read 0-3 63177 NULL ++SyS_syslog_63178 SyS_syslog 3 63178 NULL ++ds2780_write_63179 ds2780_write 4-3-0 63179 NULL ++picolcd_debug_eeprom_write_63182 picolcd_debug_eeprom_write 0-3 63182 NULL nohasharray ++snd_pcm_lib_malloc_pages_63182 snd_pcm_lib_malloc_pages 2 63182 &picolcd_debug_eeprom_write_63182 ++is_local_show_63185 is_local_show 0 63185 NULL ++hfsplus_file_fsync_63186 hfsplus_file_fsync 0 63186 NULL ++iwl_trans_start_hw_63187 iwl_trans_start_hw 0 63187 NULL ++qib_user_sdma_pin_pkt_63190 qib_user_sdma_pin_pkt 0 63190 NULL ++isdn_net_init_63192 isdn_net_init 0 63192 NULL ++security_policydb_len_63198 security_policydb_len 0 63198 NULL ++_kstrtoull_63201 _kstrtoull 0 63201 NULL ++suspend_enter_63203 suspend_enter 0 63203 NULL ++bq24190_sysfs_store_63207 bq24190_sysfs_store 0-4 63207 NULL ++nilfs_segctor_assign_63208 nilfs_segctor_assign 0 63208 NULL ++dev_get_phys_port_id_63210 dev_get_phys_port_id 0 63210 NULL nohasharray ++tx_63210 tx 0 63210 &dev_get_phys_port_id_63210 ++client_monitor_latency_show_63212 client_monitor_latency_show 0 63212 NULL ++patch_stac925x_63213 patch_stac925x 0 63213 NULL ++cp_get_eeprom_len_63219 cp_get_eeprom_len 0 63219 NULL ++xfs_file_write_iter_63220 xfs_file_write_iter 0 63220 NULL ++bnx2x_func_start_63221 bnx2x_func_start 0 63221 NULL ++zl10039_set_params_63225 zl10039_set_params 0 63225 NULL ++encrypted_instantiate_63226 encrypted_instantiate 0 63226 NULL ++SyS_gethostname_63227 SyS_gethostname 2 63227 NULL ++ttm_bo_global_show_63228 ttm_bo_global_show 0 63228 NULL ++stk17ta8_rtc_set_alarm_63230 stk17ta8_rtc_set_alarm 0 63230 NULL ++ctxsize_63232 ctxsize 0 63232 NULL ++module_alloc_update_bounds_rw_63233 module_alloc_update_bounds_rw 1 63233 NULL ++mwl8k_cmd_get_hw_spec_ap_63234 mwl8k_cmd_get_hw_spec_ap 0 63234 NULL ++pcan_usb_pro_set_ts_63236 pcan_usb_pro_set_ts 0 63236 NULL ++show_firmware_63239 show_firmware 0 63239 NULL nohasharray ++pnp_activate_dev_63239 pnp_activate_dev 0 63239 &show_firmware_63239 ++lp3971_ldo_is_enabled_63245 lp3971_ldo_is_enabled 0 63245 NULL ++do_convert_63247 do_convert 0 63247 NULL ++setxattr_63249 setxattr 0 63249 NULL ++ptp_read_63251 ptp_read 4-0 63251 NULL ++bond_option_arp_ip_targets_set_63257 bond_option_arp_ip_targets_set 0 63257 NULL ++xfs_dir2_leaf_getdents_63262 xfs_dir2_leaf_getdents 3 63262 NULL ++show_auto_brightness_63263 show_auto_brightness 0 63263 NULL nohasharray ++acpi_ns_handle_to_pathname_63263 acpi_ns_handle_to_pathname 0 63263 &show_auto_brightness_63263 ++qlcnic_get_ring_regs_len_63265 qlcnic_get_ring_regs_len 0 63265 NULL nohasharray ++btrfs_space_info_show_disk_used_63265 btrfs_space_info_show_disk_used 0 63265 &qlcnic_get_ring_regs_len_63265 ++nilfs_segbuf_wait_63274 nilfs_segbuf_wait 0 63274 NULL ++elan_i2c_read_cmd_63276 elan_i2c_read_cmd 0 63276 NULL ++caches_show_63278 caches_show 0 63278 NULL nohasharray ++update_mode_store_63278 update_mode_store 0-4 63278 &caches_show_63278 ++target_core_hba_show_attr_hba_mode_63281 target_core_hba_show_attr_hba_mode 0 63281 NULL ++i40evf_vlan_rx_add_vid_63284 i40evf_vlan_rx_add_vid 0 63284 NULL ++tcp_collapse_63294 tcp_collapse 5-6 63294 NULL ++buf_to_pages_noslab_63296 buf_to_pages_noslab 0 63296 NULL ++isdn_ppp_ccp_xmit_reset_63297 isdn_ppp_ccp_xmit_reset 6 63297 NULL ++nf_nat_ipv6_fn_63304 nf_nat_ipv6_fn 0 63304 NULL ++raid5_resize_63306 raid5_resize 2-0 63306 NULL ++nfsd_vfs_read_63307 nfsd_vfs_read 5 63307 NULL ++uwb_radio_start_63310 uwb_radio_start 0 63310 NULL ++wl1251_hw_init_beacon_filter_63321 wl1251_hw_init_beacon_filter 0 63321 NULL ++mac802154_slave_open_63322 mac802154_slave_open 0 63322 NULL nohasharray ++qla4_8xxx_check_init_adapter_retry_63322 qla4_8xxx_check_init_adapter_retry 0 63322 &mac802154_slave_open_63322 ++ath10k_read_fw_dbglog_63323 ath10k_read_fw_dbglog 3-0 63323 NULL ++nfs_scan_commit_list_63325 nfs_scan_commit_list 0 63325 NULL ++recv_data_63327 recv_data 3-0 63327 NULL ++store_mem_db_63330 store_mem_db 0-4 63330 NULL ++C_SYSC_recvfrom_63331 C_SYSC_recvfrom 3 63331 NULL ++snd_hdsp_trigger_63332 snd_hdsp_trigger 0 63332 NULL ++msm6242_read_time_63339 msm6242_read_time 0 63339 NULL ++lpfc_issue_lip_63340 lpfc_issue_lip 0 63340 NULL ++info_server_63343 info_server 4 63343 NULL ++il_force_reset_63344 il_force_reset 0 63344 NULL ++kobj_attr_show_63349 kobj_attr_show 0 63349 NULL ++show_fc_starget_port_name_63354 show_fc_starget_port_name 0 63354 NULL ++nvif_device_new_63358 nvif_device_new 5 63358 NULL ++ps_upsd_max_sptime_read_63362 ps_upsd_max_sptime_read 3-0 63362 NULL ++simple_xattr_list_63373 simple_xattr_list 0 63373 NULL ++idmouse_read_63374 idmouse_read 3-0 63374 NULL ++guid_show_63379 guid_show 0 63379 NULL ++read_word_63384 read_word 0 63384 NULL nohasharray ++vmci_qpair_peekv_63384 vmci_qpair_peekv 3-0 63384 &read_word_63384 ++wl1251_spi_set_power_63385 wl1251_spi_set_power 0 63385 NULL nohasharray ++tridentfb_set_par_63385 tridentfb_set_par 0 63385 &wl1251_spi_set_power_63385 ++edac_pci_alloc_ctl_info_63388 edac_pci_alloc_ctl_info 1 63388 NULL nohasharray ++usbnet_read_cmd_nopm_63388 usbnet_read_cmd_nopm 0-7 63388 &edac_pci_alloc_ctl_info_63388 ++dbg_check_synced_i_size_63395 dbg_check_synced_i_size 0 63395 NULL ++rxpipe_missed_beacon_host_int_trig_rx_data_read_63405 rxpipe_missed_beacon_host_int_trig_rx_data_read 3-0 63405 NULL ++ppr_notifier_63406 ppr_notifier 0 63406 NULL ++cxacru_sysfs_show_downstream_rate_63407 cxacru_sysfs_show_downstream_rate 0 63407 NULL ++show_jint_max_packets_63409 show_jint_max_packets 0 63409 NULL ++fm10k_setup_all_tx_resources_63412 fm10k_setup_all_tx_resources 0 63412 NULL ++s_audio_mode_63418 s_audio_mode 0 63418 NULL nohasharray ++target_stat_scsi_tgt_dev_attr_store_63418 target_stat_scsi_tgt_dev_attr_store 0 63418 &s_audio_mode_63418 ++adc128_set_in_63419 adc128_set_in 0-4 63419 NULL ++start_power_clamp_63423 start_power_clamp 0 63423 NULL ++show_temp0_min_63424 show_temp0_min 0 63424 NULL ++l2cap_sock_sendmsg_63427 l2cap_sock_sendmsg 0-4 63427 NULL ++show_fcstat_nos_count_63429 show_fcstat_nos_count 0 63429 NULL ++led_trigger_show_63434 led_trigger_show 0 63434 NULL ++kone_send_63435 kone_send 0-4 63435 NULL nohasharray ++uwb_rc_addr_set_63435 uwb_rc_addr_set 0 63435 &kone_send_63435 ++cifs_invalidate_mapping_63438 cifs_invalidate_mapping 0 63438 NULL ++of_irq_get_63443 of_irq_get 0 63443 NULL ++write_end_63445 write_end 0-5 63445 NULL ++mac80211_hwsim_start_63447 mac80211_hwsim_start 0 63447 NULL ++ipv6_is_mld_63461 ipv6_is_mld 3 63461 NULL ++ath10k_wmi_cmd_send_63462 ath10k_wmi_cmd_send 0 63462 NULL ++sock_common_setsockopt_63466 sock_common_setsockopt 0 63466 NULL ++root_path_cost_show_63467 root_path_cost_show 0 63467 NULL nohasharray ++integrity_verify_show_63467 integrity_verify_show 0 63467 &root_path_cost_show_63467 ++si5351_bulk_write_63468 si5351_bulk_write 2-3 63468 NULL nohasharray ++MT2063_SetReceiverMode_63468 MT2063_SetReceiverMode 0 63468 &si5351_bulk_write_63468 ++snd_info_entry_write_63474 snd_info_entry_write 3-0 63474 NULL ++cdc_ncm_show_rx_max_63475 cdc_ncm_show_rx_max 0 63475 NULL ++scm_fp_copy_63479 scm_fp_copy 0 63479 NULL ++__nvme_submit_admin_cmd_63481 __nvme_submit_admin_cmd 0 63481 NULL ++reada_find_extent_63486 reada_find_extent 2 63486 NULL nohasharray ++rivafb_check_var_63486 rivafb_check_var 0 63486 &reada_find_extent_63486 ++ath10k_peer_assoc_qos_ap_63487 ath10k_peer_assoc_qos_ap 0 63487 NULL nohasharray ++__copy_from_user_ll_nocache_63487 __copy_from_user_ll_nocache 0 63487 &ath10k_peer_assoc_qos_ap_63487 ++read_kcore_63488 read_kcore 3-0 63488 NULL ++iwl_dbgfs_bcast_filters_read_63489 iwl_dbgfs_bcast_filters_read 3-0 63489 NULL ++i2c_request_63490 i2c_request 0 63490 NULL ++pm8001_ctl_max_out_io_show_63492 pm8001_ctl_max_out_io_show 0 63492 NULL ++show_crit_hyst_63497 show_crit_hyst 0 63497 NULL ++module_attr_show_63501 module_attr_show 0 63501 NULL ++snd_pcm_plug_write_transfer_63503 snd_pcm_plug_write_transfer 0-3 63503 NULL ++reiserfs_xattr_set_handle_63522 reiserfs_xattr_set_handle 0 63522 NULL nohasharray ++lpfc_max_scsicmpl_time_store_63522 lpfc_max_scsicmpl_time_store 0-4 63522 &reiserfs_xattr_set_handle_63522 ++sctp_bind_63523 sctp_bind 0 63523 NULL nohasharray ++__stop_machine_63523 __stop_machine 0 63523 &sctp_bind_63523 ++mwifiex_cmd_802_11_key_material_v2_63525 mwifiex_cmd_802_11_key_material_v2 0 63525 NULL ++pwm1_show_63527 pwm1_show 0 63527 NULL ++efx_mcdi_rpc_async_63529 efx_mcdi_rpc_async 4-5 63529 NULL ++__ath10k_ce_rx_post_buf_63531 __ath10k_ce_rx_post_buf 0 63531 NULL nohasharray ++cond_read_list_63531 cond_read_list 0 63531 &__ath10k_ce_rx_post_buf_63531 ++ubi_more_leb_change_data_63534 ubi_more_leb_change_data 4-0 63534 NULL nohasharray ++generic_cont_expand_simple_63534 generic_cont_expand_simple 0 63534 &ubi_more_leb_change_data_63534 ++write_file_spectral_period_63536 write_file_spectral_period 3-0 63536 NULL ++SyS_recv_63537 SyS_recv 3 63537 NULL ++fan1_input_show_63540 fan1_input_show 0 63540 NULL nohasharray ++get_int_63540 get_int 0 63540 &fan1_input_show_63540 nohasharray ++if_sdio_read_scratch_63540 if_sdio_read_scratch 0 63540 &get_int_63540 ++i40e_fcoe_ddp_target_63544 i40e_fcoe_ddp_target 4 63544 NULL ++append_to_buffer_63550 append_to_buffer 3-0 63550 NULL ++dbg_leb_write_63555 dbg_leb_write 5-4-0 63555 NULL ++request_dma_63556 request_dma 0 63556 NULL ++__xudc_ep0_queue_63557 __xudc_ep0_queue 0 63557 NULL ++parse_mic_boost_63564 parse_mic_boost 0 63564 NULL ++ubifs_lpt_scan_nolock_63572 ubifs_lpt_scan_nolock 0 63572 NULL ++volume_set_status_ec_63573 volume_set_status_ec 0 63573 NULL ++hih6130_show_temperature_63574 hih6130_show_temperature 0 63574 NULL ++ext2_writepage_63575 ext2_writepage 0 63575 NULL ++rproc_alloc_63577 rproc_alloc 5 63577 NULL nohasharray ++iwl_send_tx_ant_cfg_63577 iwl_send_tx_ant_cfg 0 63577 &rproc_alloc_63577 ++__commit_trans_jl_63590 __commit_trans_jl 0 63590 NULL nohasharray ++tipc_listen_63590 tipc_listen 0 63590 &__commit_trans_jl_63590 ++store_lcd_level_63595 store_lcd_level 0-4 63595 NULL ++queue_store_iostats_63596 queue_store_iostats 3-0 63596 NULL ++ext3_clear_blocks_63597 ext3_clear_blocks 5-4 63597 NULL nohasharray ++data_sock_setsockopt_63597 data_sock_setsockopt 0 63597 &ext3_clear_blocks_63597 ++snd_als4000_playback_trigger_63605 snd_als4000_playback_trigger 0 63605 NULL ++usb_8dev_wait_cmd_msg_63607 usb_8dev_wait_cmd_msg 0 63607 NULL ++mlx4_ib_alloc_cq_buf_63610 mlx4_ib_alloc_cq_buf 3 63610 NULL ++write_debug_level_63613 write_debug_level 3 63613 NULL ++__spi_validate_63618 __spi_validate 0 63618 NULL nohasharray ++comp_algorithm_store_63618 comp_algorithm_store 0-4 63618 &__spi_validate_63618 ++show_dev_name_63623 show_dev_name 0 63623 NULL ++module_alloc_63630 module_alloc 1 63630 NULL ++ntfs_malloc_nofs_nofail_63631 ntfs_malloc_nofs_nofail 1 63631 NULL ++symbol_build_supp_rates_63634 symbol_build_supp_rates 0 63634 NULL ++hid_report_len_63637 hid_report_len 0 63637 NULL ++iscsi_stat_tgt_attr_show_attr_indx_63639 iscsi_stat_tgt_attr_show_attr_indx 0 63639 NULL ++_ubh_find_next_zero_bit__63640 _ubh_find_next_zero_bit_ 3-5-4 63640 NULL ++apei_exec_write_register_value_63642 apei_exec_write_register_value 0 63642 NULL ++il3945_store_filter_flags_63643 il3945_store_filter_flags 0-4 63643 NULL ++ubifs_lpt_end_commit_63644 ubifs_lpt_end_commit 0 63644 NULL ++wr_log_clear_63646 wr_log_clear 0-3 63646 NULL ++apds990x_power_state_store_63647 apds990x_power_state_store 0-4 63647 NULL ++proc_loginuid_write_63648 proc_loginuid_write 3-0 63648 NULL nohasharray ++gre_packet_63648 gre_packet 0 63648 &proc_loginuid_write_63648 ++simple_write_begin_63649 simple_write_begin 0 63649 NULL ++ext2_xattr_security_set_63650 ext2_xattr_security_set 0 63650 NULL ++sock_sendmsg_nosec_63655 sock_sendmsg_nosec 3 63655 NULL ++atkbd_do_set_softraw_63656 atkbd_do_set_softraw 0-4 63656 NULL ++ldlm_cli_enqueue_63657 ldlm_cli_enqueue 8 63657 NULL ++hidraw_ioctl_63658 hidraw_ioctl 2 63658 NULL nohasharray ++show_infos_63658 show_infos 0 63658 &hidraw_ioctl_63658 ++igbvf_setup_rx_resources_63659 igbvf_setup_rx_resources 0 63659 NULL nohasharray ++lpfc_devloss_tmo_store_63659 lpfc_devloss_tmo_store 0-4 63659 &igbvf_setup_rx_resources_63659 ++si4713_tx_tune_power_63660 si4713_tx_tune_power 0 63660 NULL ++virtnet_set_mac_address_63662 virtnet_set_mac_address 0 63662 NULL ++pm_print_times_store_63663 pm_print_times_store 0-4 63663 NULL ++ip_vs_remote_request4_63664 ip_vs_remote_request4 0 63664 NULL nohasharray ++poison_store_63664 poison_store 0-3 63664 &ip_vs_remote_request4_63664 ++vbi_read_63673 vbi_read 3-0 63673 NULL nohasharray ++xen_register_pirq_63673 xen_register_pirq 2-1 63673 &vbi_read_63673 ++dwc3_gadget_ep0_queue_63675 dwc3_gadget_ep0_queue 0 63675 NULL ++bnep_net_open_63676 bnep_net_open 0 63676 NULL ++multicast_router_store_63677 multicast_router_store 4-0 63677 NULL ++dlm_scand_start_63680 dlm_scand_start 0 63680 NULL ++alloc_tty_driver_63681 alloc_tty_driver 1 63681 NULL ++idt77252_init_ubr_63684 idt77252_init_ubr 0 63684 NULL ++volume_get_status_ec_63685 volume_get_status_ec 0 63685 NULL ++i2c_algo_dp_aux_get_byte_63690 i2c_algo_dp_aux_get_byte 0 63690 NULL ++mos7720_open_63691 mos7720_open 0 63691 NULL ++i2c_algo_dp_aux_address_63695 i2c_algo_dp_aux_address 0 63695 NULL nohasharray ++nf_hook_slow_63695 nf_hook_slow 0 63695 &i2c_algo_dp_aux_address_63695 ++write_file_spectral_fft_period_63696 write_file_spectral_fft_period 3-0 63696 NULL ++bin_search_63697 bin_search 0 63697 NULL ++xen_pvclock_gtod_notify_63705 xen_pvclock_gtod_notify 0 63705 NULL ++mismatch_cnt_show_63711 mismatch_cnt_show 0 63711 NULL ++nouveau_object_create__63715 nouveau_object_create_ 5 63715 NULL ++btrfs_insert_delayed_dir_index_63720 btrfs_insert_delayed_dir_index 4 63720 NULL ++read_rxflow_63726 read_rxflow 0 63726 NULL ++ntb_debugfs_read_63728 ntb_debugfs_read 3-0 63728 NULL ++max8998_rtc_read_time_63729 max8998_rtc_read_time 0 63729 NULL ++ipmi_read_63730 ipmi_read 0-3 63730 NULL ++ks8851_set_mac_address_63734 ks8851_set_mac_address 0 63734 NULL ++snd_bt87x_stop_63735 snd_bt87x_stop 0 63735 NULL nohasharray ++sh_eth_ring_init_63735 sh_eth_ring_init 0 63735 &snd_bt87x_stop_63735 ++sctp_setsockopt_paddr_thresholds_63737 sctp_setsockopt_paddr_thresholds 0 63737 NULL ++_ctl_host_trace_buffer_enable_store_63738 _ctl_host_trace_buffer_enable_store 0-4 63738 NULL ++selinux_secctx_to_secid_63744 selinux_secctx_to_secid 2 63744 NULL ++i40e_vsi_setup_tx_resources_63745 i40e_vsi_setup_tx_resources 0 63745 NULL ++acpi_tb_install_fixed_table_63749 acpi_tb_install_fixed_table 1 63749 NULL ++cxgb4vf_set_mac_addr_63751 cxgb4vf_set_mac_addr 0 63751 NULL ++led_delay_off_show_63754 led_delay_off_show 0 63754 NULL ++write_63755 write 0-3 63755 NULL ++show_atmindex_63757 show_atmindex 0 63757 NULL nohasharray ++uv_cpu_mask_to_apicid_and_63757 uv_cpu_mask_to_apicid_and 0 63757 &show_atmindex_63757 ++tvp5150_cropcap_63758 tvp5150_cropcap 0 63758 NULL ++__send_control_msg_63761 __send_control_msg 0 63761 NULL ++snd_cs4281_trigger_63762 snd_cs4281_trigger 0 63762 NULL ++isl12022_get_datetime_63765 isl12022_get_datetime 0 63765 NULL nohasharray ++ocfs2_control_do_down_msg_63765 ocfs2_control_do_down_msg 0 63765 &isl12022_get_datetime_63765 ++tipc_sk_publish_63767 tipc_sk_publish 0 63767 NULL ++snd_pcm_oss_read1_63771 snd_pcm_oss_read1 3-0 63771 NULL nohasharray ++alc882_parse_auto_config_63771 alc882_parse_auto_config 0 63771 &snd_pcm_oss_read1_63771 ++ath10k_ce_init_dest_ring_63773 ath10k_ce_init_dest_ring 0 63773 NULL ++tda826x_set_params_63774 tda826x_set_params 0 63774 NULL nohasharray ++snd_opl4_mem_proc_read_63774 snd_opl4_mem_proc_read 5 63774 &tda826x_set_params_63774 ++filelayout_scan_ds_commit_list_63776 filelayout_scan_ds_commit_list 0 63776 NULL ++spidev_compat_ioctl_63778 spidev_compat_ioctl 2 63778 NULL nohasharray ++generic_getxattr_63778 generic_getxattr 0 63778 &spidev_compat_ioctl_63778 nohasharray ++usnic_ib_show_max_vf_63778 usnic_ib_show_max_vf 0 63778 &generic_getxattr_63778 ++ohci_urb_enqueue_63779 ohci_urb_enqueue 0 63779 NULL ++pvr2_i2c_xfer_63786 pvr2_i2c_xfer 0-3 63786 NULL ++iscsi_tpg_param_store_DataDigest_63792 iscsi_tpg_param_store_DataDigest 0-3 63792 NULL ++coda_getattr_63793 coda_getattr 0 63793 NULL ++carl9170_set_channel_63795 carl9170_set_channel 0 63795 NULL nohasharray ++at76_mac80211_start_63795 at76_mac80211_start 0 63795 &carl9170_set_channel_63795 nohasharray ++kovaplus_sysfs_write_63795 kovaplus_sysfs_write 0-6 63795 &at76_mac80211_start_63795 ++__ieee80211_start_rx_ba_session_63796 __ieee80211_start_rx_ba_session 7 63796 NULL ++mwifiex_11n_create_rx_reorder_tbl_63806 mwifiex_11n_create_rx_reorder_tbl 4 63806 NULL nohasharray ++global_rsv_reserved_show_63806 global_rsv_reserved_show 0 63806 &mwifiex_11n_create_rx_reorder_tbl_63806 nohasharray ++ivtv_yuv_udma_stream_frame_63806 ivtv_yuv_udma_stream_frame 0 63806 &global_rsv_reserved_show_63806 ++copy_nodes_to_user_63807 copy_nodes_to_user 2 63807 NULL nohasharray ++e1000_test_msi_interrupt_63807 e1000_test_msi_interrupt 0 63807 ©_nodes_to_user_63807 ++dev_show_vendor_63810 dev_show_vendor 0 63810 NULL ++C_SYSC_process_vm_readv_63811 C_SYSC_process_vm_readv 3-5 63811 NULL ++usb_find_address_63814 usb_find_address 0 63814 NULL nohasharray ++h245_help_63814 h245_help 0 63814 &usb_find_address_63814 ++issue_creg_rw_63819 issue_creg_rw 0 63819 NULL nohasharray ++ipath_create_rcvhdrq_63819 ipath_create_rcvhdrq 0 63819 &issue_creg_rw_63819 ++bmg160_set_power_state_63824 bmg160_set_power_state 0 63824 NULL ++regmap_multi_reg_write_63826 regmap_multi_reg_write 3 63826 NULL nohasharray ++prepare_copy_63826 prepare_copy 2 63826 ®map_multi_reg_write_63826 ++sel_write_load_63830 sel_write_load 3-0 63830 NULL ++hdaps_position_show_63832 hdaps_position_show 0 63832 NULL ++shm_fsync_63834 shm_fsync 0 63834 NULL ++max8997_reg_is_enabled_63837 max8997_reg_is_enabled 0 63837 NULL ++kcore_callback_63841 kcore_callback 0 63841 NULL ++ds2781_save_eeprom_63843 ds2781_save_eeprom 0 63843 NULL ++proc_pid_attr_write_63845 proc_pid_attr_write 3-0 63845 NULL ++cap_inode_removexattr_63846 cap_inode_removexattr 0 63846 NULL ++alc268_parse_auto_config_63852 alc268_parse_auto_config 0 63852 NULL ++mt9t112_s_fmt_63855 mt9t112_s_fmt 0 63855 NULL ++disk_ext_range_show_63859 disk_ext_range_show 0 63859 NULL ++bus_uevent_store_63861 bus_uevent_store 0-3 63861 NULL ++eql_open_63862 eql_open 0 63862 NULL ++read_page_owner_63869 read_page_owner 0-3 63869 NULL ++adc128_show_in_63872 adc128_show_in 0 63872 NULL ++smb2_sync_write_63880 smb2_sync_write 0 63880 NULL nohasharray ++store_sched3_63880 store_sched3 4-0 63880 &smb2_sync_write_63880 ++bt_size_63881 bt_size 0 63881 NULL ++group_fwd_mask_show_63890 group_fwd_mask_show 0 63890 NULL ++cachefiles_daemon_bcull_63894 cachefiles_daemon_bcull 0 63894 NULL ++ceph_tcp_sendmsg_63895 ceph_tcp_sendmsg 4 63895 NULL ++selinux_ipv6_forward_63896 selinux_ipv6_forward 0 63896 NULL nohasharray ++kyrofb_set_par_63896 kyrofb_set_par 0 63896 &selinux_ipv6_forward_63896 ++sctp_auth_del_key_id_63897 sctp_auth_del_key_id 0 63897 NULL ++minix_statfs_63900 minix_statfs 0 63900 NULL ++divas_write_63901 divas_write 3-0 63901 NULL ++xhci_alloc_stream_info_63902 xhci_alloc_stream_info 3 63902 NULL nohasharray ++cp2112_wait_63902 cp2112_wait 0 63902 &xhci_alloc_stream_info_63902 ++copy_from_iter_nocache_63915 copy_from_iter_nocache 2 63915 NULL nohasharray ++iblock_set_configfs_dev_params_63915 iblock_set_configfs_dev_params 0-3 63915 ©_from_iter_nocache_63915 ++lpfc_link_state_show_63919 lpfc_link_state_show 0 63919 NULL ++uvc_alloc_urb_buffers_63922 uvc_alloc_urb_buffers 2-3-0 63922 NULL ++snd_compr_write_63923 snd_compr_write 3-0 63923 NULL ++cdc_ncm_show_dwNtbInMaxSize_63926 cdc_ncm_show_dwNtbInMaxSize 0 63926 NULL ++write_63928 write 0 63928 NULL ++eni_proc_read_63929 eni_proc_read 0 63929 NULL ++bsg_write_63933 bsg_write 0-3 63933 NULL nohasharray ++drv_set_extended_addr_63933 drv_set_extended_addr 0 63933 &bsg_write_63933 ++lp5521_selftest_63935 lp5521_selftest 0 63935 NULL ++pem_show_fan_63938 pem_show_fan 0 63938 NULL ++afs_send_simple_reply_63940 afs_send_simple_reply 3 63940 NULL ++__team_options_register_63941 __team_options_register 3-0 63941 NULL ++connected_duration_show_63943 connected_duration_show 0 63943 NULL ++show_srp_rport_fast_io_fail_tmo_63949 show_srp_rport_fast_io_fail_tmo 0 63949 NULL nohasharray ++macvtap_recvmsg_63949 macvtap_recvmsg 0-4 63949 &show_srp_rport_fast_io_fail_tmo_63949 ++netdev_rx_handler_register_63952 netdev_rx_handler_register 0 63952 NULL ++show_fnode_ipv4_tos_63962 show_fnode_ipv4_tos 0 63962 NULL ++nametoid_parse_63971 nametoid_parse 0 63971 NULL ++usb_serial_generic_submit_read_urbs_63972 usb_serial_generic_submit_read_urbs 0 63972 NULL nohasharray ++videobuf_qbuf_63972 videobuf_qbuf 0 63972 &usb_serial_generic_submit_read_urbs_63972 ++ieee80211_authentication_req_63973 ieee80211_authentication_req 3 63973 NULL ++diva_xdi_write_63975 diva_xdi_write 4-0 63975 NULL nohasharray ++set_bredr_63975 set_bredr 4 63975 &diva_xdi_write_63975 ++msi001_set_tuner_63978 msi001_set_tuner 0 63978 NULL ++set_mode_63982 set_mode 0-4 63982 NULL nohasharray ++genlmsg_new_unicast_63982 genlmsg_new_unicast 1 63982 &set_mode_63982 ++construct_key_and_link_63985 construct_key_and_link 3 63985 NULL ++core_alua_store_offline_bit_63989 core_alua_store_offline_bit 0-3 63989 NULL ++get_host_param_63991 get_host_param 0 63991 NULL nohasharray ++tifm_map_sg_63991 tifm_map_sg 3 63991 &get_host_param_63991 ++ageing_time_store_63994 ageing_time_store 4-0 63994 NULL ++be2iscsi_get_if_param_63997 be2iscsi_get_if_param 0 63997 NULL ++s5p_mfc_alloc_codec_buffers_v5_64000 s5p_mfc_alloc_codec_buffers_v5 0 64000 NULL ++read_file_frameerrors_64001 read_file_frameerrors 3-0 64001 NULL ++read_descriptors_64002 read_descriptors 0-5-6 64002 NULL ++ov7670_read_64006 ov7670_read 0 64006 NULL ++hfsplus_security_setxattr_64009 hfsplus_security_setxattr 0 64009 NULL ++vb2_start_streaming_64013 vb2_start_streaming 0 64013 NULL ++cxgb_set_mac_addr_64015 cxgb_set_mac_addr 0 64015 NULL nohasharray ++kmemdup_64015 kmemdup 2 64015 &cxgb_set_mac_addr_64015 ++C_SYSC_sendfile64_64017 C_SYSC_sendfile64 4 64017 NULL ++SyS_rt_sigpending_64018 SyS_rt_sigpending 2 64018 NULL ++hid_debug_events_read_64023 hid_debug_events_read 0-3 64023 NULL ++tcf_csum_skb_nextlayer_64025 tcf_csum_skb_nextlayer 3 64025 NULL ++dbAllocDmapLev_64030 dbAllocDmapLev 0 64030 NULL ++vga_get_interruptible_64032 vga_get_interruptible 0 64032 NULL ++get_component_locate_64036 get_component_locate 0 64036 NULL ++r6040_alloc_rxbufs_64037 r6040_alloc_rxbufs 0 64037 NULL ++SyS_fsetxattr_64039 SyS_fsetxattr 4 64039 NULL ++f_init_sdma_regs_64047 f_init_sdma_regs 0 64047 NULL nohasharray ++udc_queue_64047 udc_queue 0 64047 &f_init_sdma_regs_64047 ++dvb_dmxdev_ts_callback_64051 dvb_dmxdev_ts_callback 2-4 64051 NULL nohasharray ++usbnet_change_mtu_64051 usbnet_change_mtu 0 64051 &dvb_dmxdev_ts_callback_64051 ++qlcnic_alloc_sw_resources_64057 qlcnic_alloc_sw_resources 0 64057 NULL ++tps65912_reg_disable_64058 tps65912_reg_disable 0 64058 NULL ++alloc_codec_buffers_64063 alloc_codec_buffers 0 64063 NULL ++start_hw_64065 start_hw 0 64065 NULL ++nfs4_lookup_root_64067 nfs4_lookup_root 0 64067 NULL ++__sock_create_64069 __sock_create 0 64069 NULL ++pcifront_bus_write_64071 pcifront_bus_write 0 64071 NULL ++e4000_s_ctrl_64076 e4000_s_ctrl 0 64076 NULL ++qlcnic_sriov_issue_cmd_64077 qlcnic_sriov_issue_cmd 0 64077 NULL ++show_rd_sect_64078 show_rd_sect 0 64078 NULL ++fc_header_64083 fc_header 0 64083 NULL ++sl_realloc_bufs_64086 sl_realloc_bufs 0-2 64086 NULL ++clear_update_marker_64088 clear_update_marker 0 64088 NULL nohasharray ++gether_opts_qmult_store_64088 gether_opts_qmult_store 0-3 64088 &clear_update_marker_64088 ++lbs_highrssi_read_64089 lbs_highrssi_read 3-0 64089 NULL ++gfs2_inplace_reserve_64096 gfs2_inplace_reserve 0 64096 NULL nohasharray ++SyS_set_mempolicy_64096 SyS_set_mempolicy 3 64096 &gfs2_inplace_reserve_64096 ++logfs_statfs_64097 logfs_statfs 0 64097 NULL ++show_64101 show 0 64101 NULL ++__soft_offline_page_64103 __soft_offline_page 0 64103 NULL ++SyS_mq_timedsend_64107 SyS_mq_timedsend 3 64107 NULL ++ipoib_hard_header_64116 ipoib_hard_header 0 64116 NULL nohasharray ++keyring_instantiate_64116 keyring_instantiate 0 64116 &ipoib_hard_header_64116 ++do_load_xattr_datum_64118 do_load_xattr_datum 0 64118 NULL ++max77693_chg_is_enabled_64122 max77693_chg_is_enabled 0 64122 NULL ++ext4_prepare_inline_data_64124 ext4_prepare_inline_data 3 64124 NULL ++mwifiex_cmd_802_11_deauthenticate_64129 mwifiex_cmd_802_11_deauthenticate 0 64129 NULL ++init_bch_64130 init_bch 1-2 64130 NULL ++v4l2_m2m_streamon_64133 v4l2_m2m_streamon 0 64133 NULL ++pyra_set_settings_64134 pyra_set_settings 0 64134 NULL ++soft_reset_64137 soft_reset 0 64137 NULL nohasharray ++adt7x10_write_word_64137 adt7x10_write_word 0 64137 &soft_reset_64137 ++__dequeue_signal_64139 __dequeue_signal 0 64139 NULL nohasharray ++uea_idma_write_64139 uea_idma_write 3 64139 &__dequeue_signal_64139 ++ablkcipher_copy_iv_64140 ablkcipher_copy_iv 3 64140 NULL ++omfs_write_begin_64144 omfs_write_begin 0 64144 NULL ++broadsheet_write_spiflash_64148 broadsheet_write_spiflash 0 64148 NULL ++dlfb_ops_write_64150 dlfb_ops_write 3 64150 NULL ++show_sas_phy_minimum_linkrate_64151 show_sas_phy_minimum_linkrate 0 64151 NULL ++__comedi_buf_alloc_64155 __comedi_buf_alloc 3 64155 NULL ++number_of_tds_64156 number_of_tds 0 64156 NULL ++get_fan_auto_nearest_64164 get_fan_auto_nearest 0 64164 NULL ++bnx2x_vf_mcast_64166 bnx2x_vf_mcast 4 64166 NULL ++cpumask_scnprintf_64170 cpumask_scnprintf 0-2 64170 NULL ++store_temp_crit_64171 store_temp_crit 0-4 64171 NULL ++do_command_extended_64178 do_command_extended 0 64178 NULL ++show_ipInTooBigErrors_64191 show_ipInTooBigErrors 0 64191 NULL ++wl1251_acx_mem_map_64198 wl1251_acx_mem_map 0 64198 NULL nohasharray ++store_jint_max_packets_64198 store_jint_max_packets 0-4 64198 &wl1251_acx_mem_map_64198 ++eeprom_write_64199 eeprom_write 6-5-0 64199 NULL ++__pskb_copy_fclone_64202 __pskb_copy_fclone 2 64202 NULL ++shadow_rd32_64205 shadow_rd32 2 64205 NULL ++autosuspend_delay_ms_show_64206 autosuspend_delay_ms_show 0 64206 NULL ++rocker_port_switch_parent_id_get_64207 rocker_port_switch_parent_id_get 0 64207 NULL ++diagc_attr_store_64209 diagc_attr_store 0-4 64209 NULL ++sisfb_check_var_64211 sisfb_check_var 0 64211 NULL ++hippi_change_mtu_64218 hippi_change_mtu 0 64218 NULL ++get_et_sset_count_64219 get_et_sset_count 0 64219 NULL ++kernfs_iop_setxattr_64220 kernfs_iop_setxattr 4-0 64220 NULL ++wacom_status0_luminance_store_64221 wacom_status0_luminance_store 4-0 64221 NULL ++vb2_dc_get_userptr_64222 vb2_dc_get_userptr 3-2 64222 NULL ++ad799x_update_scan_mode_64224 ad799x_update_scan_mode 0 64224 NULL ++ip6_datagram_connect_v6_only_64226 ip6_datagram_connect_v6_only 0 64226 NULL ++ea_len_64229 ea_len 0 64229 NULL nohasharray ++nfs_initiate_commit_64229 nfs_initiate_commit 0 64229 &ea_len_64229 ++zd1201_set_mac_address_64232 zd1201_set_mac_address 0 64232 NULL nohasharray ++header_len_64232 header_len 0 64232 &zd1201_set_mac_address_64232 ++em28xx_i2c_xfer_64233 em28xx_i2c_xfer 0-3 64233 NULL ++vprbrd_i2c_status_64236 vprbrd_i2c_status 0 64236 NULL ++xfrm_acquire_msgsize_64239 xfrm_acquire_msgsize 0 64239 NULL ++fuse_do_getattr_64245 fuse_do_getattr 0 64245 NULL nohasharray ++bd2802_store_reg0x14_64245 bd2802_store_reg0x14 0-4 64245 &fuse_do_getattr_64245 nohasharray ++brcmf_sdiod_send_buf_64245 brcmf_sdiod_send_buf 3 64245 &bd2802_store_reg0x14_64245 ++mmc_enhanced_area_offset_show_64250 mmc_enhanced_area_offset_show 0 64250 NULL ++__vb2_queue_free_64257 __vb2_queue_free 0 64257 NULL nohasharray ++target_stat_scsi_lu_show_attr_rev_64257 target_stat_scsi_lu_show_attr_rev 0 64257 &__vb2_queue_free_64257 ++ipath_port_info_64258 ipath_port_info 0 64258 NULL ++stmmac_init_rx_buffers_64260 stmmac_init_rx_buffers 0 64260 NULL ++vim2m_queue_setup_64261 vim2m_queue_setup 0 64261 NULL ++ads7846_pen_down_show_64263 ads7846_pen_down_show 0 64263 NULL ++cn_netlink_send_mult_64264 cn_netlink_send_mult 0-2 64264 NULL ++xfs_rtmodify_summary_64265 xfs_rtmodify_summary 0 64265 NULL ++subbuf_splice_actor_64270 subbuf_splice_actor 0 64270 NULL ++ocfs2_max_locking_protocol_show_64273 ocfs2_max_locking_protocol_show 0 64273 NULL ++ab3100_otp_fac_show_64276 ab3100_otp_fac_show 0 64276 NULL nohasharray ++io_capture_transfer_64276 io_capture_transfer 4 64276 &ab3100_otp_fac_show_64276 ++comm_addr_write_64277 comm_addr_write 0-3 64277 NULL ++btrfs_file_extent_offset_64278 btrfs_file_extent_offset 0 64278 NULL nohasharray ++bpf_check_classic_64278 bpf_check_classic 2 64278 &btrfs_file_extent_offset_64278 ++wake_up_mouse_show_64279 wake_up_mouse_show 0 64279 NULL ++shmem_xattr_validate_64280 shmem_xattr_validate 0 64280 NULL ++ip_vs_out_64282 ip_vs_out 0 64282 NULL nohasharray ++new_id_store_64282 new_id_store 0-3 64282 &ip_vs_out_64282 ++crypto_hmacmd5_alloc_64284 crypto_hmacmd5_alloc 0 64284 NULL ++sta_current_tx_rate_read_64286 sta_current_tx_rate_read 3-0 64286 NULL ++xfs_dir_cilookup_result_64288 xfs_dir_cilookup_result 3 64288 NULL nohasharray ++event_id_read_64288 event_id_read 3 64288 &xfs_dir_cilookup_result_64288 ++show_iface_tcp_timer_scale_64291 show_iface_tcp_timer_scale 0 64291 NULL nohasharray ++ov7670_init_64291 ov7670_init 0 64291 &show_iface_tcp_timer_scale_64291 nohasharray ++info_debugfs_read_64291 info_debugfs_read 3 64291 &ov7670_init_64291 ++ocfs2_block_check_validate_bhs_64302 ocfs2_block_check_validate_bhs 0 64302 NULL nohasharray ++sta_info_insert_drv_state_64302 sta_info_insert_drv_state 0 64302 &ocfs2_block_check_validate_bhs_64302 ++snd_hda_get_sub_nodes_64304 snd_hda_get_sub_nodes 0 64304 NULL ++error_error_bar_retry_read_64305 error_error_bar_retry_read 3-0 64305 NULL ++revision_show_64311 revision_show 0 64311 NULL ++carl9170_op_start_64315 carl9170_op_start 0 64315 NULL ++shm16read__read_file_64316 shm16read__read_file 0 64316 NULL ++uri_show_64318 uri_show 0 64318 NULL nohasharray ++read_vda_64318 read_vda 0-5-6 64318 &uri_show_64318 ++bq2415x_sysfs_print_reg_64320 bq2415x_sysfs_print_reg 0 64320 NULL nohasharray ++ray_resume_64320 ray_resume 0 64320 &bq2415x_sysfs_print_reg_64320 ++ffz_64324 ffz 0 64324 NULL nohasharray ++irq_create_of_mapping_64324 irq_create_of_mapping 0 64324 &ffz_64324 ++map_region_64328 map_region 1 64328 NULL ++sisusbcon_clear_64329 sisusbcon_clear 5-3-4 64329 NULL ++set_pwm_temp_map_64330 set_pwm_temp_map 0-4 64330 NULL ++ov9650_set_red_balance_64331 ov9650_set_red_balance 0 64331 NULL ++ts_write_64336 ts_write 3-0 64336 NULL ++qla8044_write_optrom_data_64338 qla8044_write_optrom_data 4 64338 NULL ++usbtmc_write_64340 usbtmc_write 3-0 64340 NULL ++do_write_orph_node_64343 do_write_orph_node 2-0 64343 NULL ++tua6100_set_params_64346 tua6100_set_params 0 64346 NULL ++cgroup_addrm_files_64347 cgroup_addrm_files 0 64347 NULL ++shmem_file_splice_read_64350 shmem_file_splice_read 0 64350 NULL ++iscsi_tpg_attrib_show_prod_mode_write_protect_64351 iscsi_tpg_attrib_show_prod_mode_write_protect 0 64351 NULL ++il3945_show_flags_64353 il3945_show_flags 0 64353 NULL nohasharray ++ip6_route_me_harder_64353 ip6_route_me_harder 0 64353 &il3945_show_flags_64353 ++qlcnic_82xx_calculate_msix_vector_64354 qlcnic_82xx_calculate_msix_vector 0 64354 NULL nohasharray ++write_64354 write 0 64354 &qlcnic_82xx_calculate_msix_vector_64354 ++coda_file_splice_read_64358 coda_file_splice_read 0 64358 NULL ++hermes_issue_cmd_64360 hermes_issue_cmd 0 64360 NULL ++show_prochot_override_duty_cycle_64364 show_prochot_override_duty_cycle 0 64364 NULL ++show_64365 show 0 64365 NULL nohasharray ++show_stats_64365 show_stats 0 64365 &show_64365 ++llc_alloc_frame_64366 llc_alloc_frame 4 64366 NULL ++wlc_phy_loadsampletable_nphy_64367 wlc_phy_loadsampletable_nphy 3 64367 NULL ++xudc_ep_enable_64369 xudc_ep_enable 0 64369 NULL ++videobuf_reqbufs_64371 videobuf_reqbufs 0 64371 NULL ++reg_create_64372 reg_create 5 64372 NULL nohasharray ++bnx2_enable_msix_64372 bnx2_enable_msix 2 64372 ®_create_64372 ++ilo_write_64378 ilo_write 3-0 64378 NULL ++btrfs_map_block_64379 btrfs_map_block 3 64379 NULL ++nilfs_alloc_seg_bio_64383 nilfs_alloc_seg_bio 3 64383 NULL ++show_port_no_64391 show_port_no 0 64391 NULL ++fuse_getxattr_64394 fuse_getxattr 0 64394 NULL ++brcmf_sdio_download_nvram_64395 brcmf_sdio_download_nvram 3 64395 NULL ++copy_recv_mad_64399 copy_recv_mad 0 64399 NULL ++ir_lirc_transmit_ir_64403 ir_lirc_transmit_ir 3-0 64403 NULL nohasharray ++pci_bus_write_config_dword_64403 pci_bus_write_config_dword 0 64403 &ir_lirc_transmit_ir_64403 ++pidlist_allocate_64404 pidlist_allocate 1 64404 NULL ++gpio_value_show_64406 gpio_value_show 0 64406 NULL ++rx_hdr_overflow_read_64407 rx_hdr_overflow_read 3-0 64407 NULL nohasharray ++show_regs_in_0_64407 show_regs_in_0 0 64407 &rx_hdr_overflow_read_64407 nohasharray ++il4965_send_rxon_assoc_64407 il4965_send_rxon_assoc 0 64407 &show_regs_in_0_64407 ++carl9170_init_rf_bank4_pwr_64410 carl9170_init_rf_bank4_pwr 0 64410 NULL nohasharray ++iwl_mvm_sta_send_to_fw_64410 iwl_mvm_sta_send_to_fw 0 64410 &carl9170_init_rf_bank4_pwr_64410 ++usb_amradio_s_ctrl_64411 usb_amradio_s_ctrl 0 64411 NULL ++find_rsb_dir_64415 find_rsb_dir 0 64415 NULL nohasharray ++ovl_readlink_64415 ovl_readlink 0 64415 &find_rsb_dir_64415 ++keyctl_get_security_64418 keyctl_get_security 3 64418 NULL nohasharray ++netlbl_unlhsh_remove_addr6_64418 netlbl_unlhsh_remove_addr6 0 64418 &keyctl_get_security_64418 ++oom_adj_write_64428 oom_adj_write 3-0 64428 NULL ++_ctl_host_trace_buffer_size_show_64430 _ctl_host_trace_buffer_size_show 0 64430 NULL nohasharray ++uvesafb_set_par_64430 uvesafb_set_par 0 64430 &_ctl_host_trace_buffer_size_show_64430 ++read_file_spectral_short_repeat_64431 read_file_spectral_short_repeat 3-0 64431 NULL nohasharray ++ext4_trim_extent_64431 ext4_trim_extent 4 64431 &read_file_spectral_short_repeat_64431 ++show_in2_input_64433 show_in2_input 0 64433 NULL ++trace_store_64437 trace_store 0-3 64437 NULL ++iscsi_stat_tgt_attr_show_attr_last_fail_time_64438 iscsi_stat_tgt_attr_show_attr_last_fail_time 0 64438 NULL ++bch_btree_map_nodes_recurse_64440 bch_btree_map_nodes_recurse 0 64440 NULL nohasharray ++uart_get_attr_custom_divisor_64440 uart_get_attr_custom_divisor 0 64440 &bch_btree_map_nodes_recurse_64440 ++ax25_recvmsg_64441 ax25_recvmsg 0-4 64441 NULL ++sm_sl_show_64445 sm_sl_show 0 64445 NULL ++stmmac_init_phy_64449 stmmac_init_phy 0 64449 NULL ++pfkey_sockaddr_len_64453 pfkey_sockaddr_len 0 64453 NULL ++mcs_setup_transceiver_vishay_64466 mcs_setup_transceiver_vishay 0 64466 NULL ++nilfs_btree_do_lookup_64475 nilfs_btree_do_lookup 0 64475 NULL nohasharray ++store_engine2_mode_64475 store_engine2_mode 4-0 64475 &nilfs_btree_do_lookup_64475 ++raid5_show_stripe_cache_size_64477 raid5_show_stripe_cache_size 0 64477 NULL nohasharray ++store_line_64477 store_line 0-3 64477 &raid5_show_stripe_cache_size_64477 ++ip_vs_create_timeout_table_64478 ip_vs_create_timeout_table 2 64478 NULL ++prod_id4_show_64479 prod_id4_show 0 64479 NULL ++__request_module_64480 __request_module 0 64480 NULL ++ib_post_send_64481 ib_post_send 0 64481 NULL ++target_stat_scsi_auth_intr_show_attr_row_status_64482 target_stat_scsi_auth_intr_show_attr_row_status 0 64482 NULL ++single_open_size_64483 single_open_size 4 64483 NULL ++qib_diag_read_64485 qib_diag_read 0-3 64485 NULL ++nfs3_proc_getattr_64491 nfs3_proc_getattr 0 64491 NULL ++p54_parse_rssical_64493 p54_parse_rssical 3 64493 NULL ++suspend_hi_show_64497 suspend_hi_show 0 64497 NULL ++read_64498 read 0 64498 NULL ++set_div_64499 set_div 0-4 64499 NULL ++current_uuid_show_64500 current_uuid_show 0 64500 NULL ++twl6030reg_is_enabled_64501 twl6030reg_is_enabled 0 64501 NULL ++msg_data_sz_64503 msg_data_sz 0 64503 NULL ++remove_uuid_64505 remove_uuid 4 64505 NULL ++isl29003_show_mode_64507 isl29003_show_mode 0 64507 NULL nohasharray ++store_enable_clk3b_output_64507 store_enable_clk3b_output 0-4 64507 &isl29003_show_mode_64507 ++bfad_im_symbolic_name_show_64508 bfad_im_symbolic_name_show 0 64508 NULL nohasharray ++map_slaves_64508 map_slaves 0 64508 &bfad_im_symbolic_name_show_64508 ++uvesafb_check_var_64509 uvesafb_check_var 0 64509 NULL ++irq_domain_alloc_descs_64511 irq_domain_alloc_descs 0-2-1-3 64511 NULL ++security_sid_to_context_core_64519 security_sid_to_context_core 0 64519 NULL ++opera1_usb_i2c_msgxfer_64521 opera1_usb_i2c_msgxfer 4 64521 NULL ++iwl_dbgfs_ucode_tracing_write_64524 iwl_dbgfs_ucode_tracing_write 3-0 64524 NULL ++udplite_error_64525 udplite_error 0 64525 NULL ++avtab_read_item_64526 avtab_read_item 0 64526 NULL nohasharray ++asix_write_medium_mode_64526 asix_write_medium_mode 0 64526 &avtab_read_item_64526 ++ses_send_diag_64527 ses_send_diag 4 64527 NULL ++ov7670_s_mbus_fmt_64528 ov7670_s_mbus_fmt 0 64528 NULL nohasharray ++wacom_led0_select_show_64528 wacom_led0_select_show 0 64528 &ov7670_s_mbus_fmt_64528 ++befs_readpage_64530 befs_readpage 0 64530 NULL ++show_pwm_temp_sel_64531 show_pwm_temp_sel 0 64531 NULL ++enic_change_mtu_64536 enic_change_mtu 0 64536 NULL ++bh1770_prox_result_show_64537 bh1770_prox_result_show 0 64537 NULL nohasharray ++max_corrected_read_errors_store_64537 max_corrected_read_errors_store 0-3 64537 &bh1770_prox_result_show_64537 ++prctl_set_mm_64538 prctl_set_mm 3 64538 NULL ++bonding_show_slaves_active_64540 bonding_show_slaves_active 0 64540 NULL ++SyS_bind_64544 SyS_bind 3 64544 NULL ++cmos_read_time_64546 cmos_read_time 0 64546 NULL ++lm8323_read_64547 lm8323_read 4 64547 NULL nohasharray ++type_show_64547 type_show 0 64547 &lm8323_read_64547 ++rbd_obj_read_sync_64554 rbd_obj_read_sync 3-4-0 64554 NULL nohasharray ++s5p_mfc_alloc_codec_buffers_v6_64554 s5p_mfc_alloc_codec_buffers_v6 0 64554 &rbd_obj_read_sync_64554 ++enic_set_mac_address_dynamic_64556 enic_set_mac_address_dynamic 0 64556 NULL ++mptsas_get_bay_identifier_64560 mptsas_get_bay_identifier 0 64560 NULL ++__spi_sync_64561 __spi_sync 0 64561 NULL nohasharray ++ll_max_rw_chunk_seq_write_64561 ll_max_rw_chunk_seq_write 3 64561 &__spi_sync_64561 ++e100_open_64562 e100_open 0 64562 NULL ++__apei_exec_run_64563 __apei_exec_run 0 64563 NULL ++asd_check_flash_type_64566 asd_check_flash_type 0 64566 NULL nohasharray ++cfq_low_latency_store_64566 cfq_low_latency_store 3-0 64566 &asd_check_flash_type_64566 ++diva_os_alloc_message_buffer_64568 diva_os_alloc_message_buffer 1 64568 NULL ++kstrtoul_from_user_64569 kstrtoul_from_user 2-0 64569 NULL ++osst_version_show_64570 osst_version_show 0 64570 NULL nohasharray ++l2tp_ip6_disconnect_64570 l2tp_ip6_disconnect 0 64570 &osst_version_show_64570 ++do_erase_64574 do_erase 4 64574 NULL ++__c2port_show_rev_id_64583 __c2port_show_rev_id 0 64583 NULL nohasharray ++kfd_set_pasid_limit_64583 kfd_set_pasid_limit 1 64583 &__c2port_show_rev_id_64583 ++snd_usb_init_sample_rate_64586 snd_usb_init_sample_rate 0 64586 NULL ++parport_uss720_ecp_write_data_64589 parport_uss720_ecp_write_data 0 64589 NULL ++suspend_64593 suspend 0 64593 NULL ++snd_soundfont_load_guspatch_64595 snd_soundfont_load_guspatch 0 64595 NULL ++gpiochip_irqchip_add_64596 gpiochip_irqchip_add 3 64596 NULL ++tcp_write_xmit_64602 tcp_write_xmit 2 64602 NULL ++srp_show_tmo_64605 srp_show_tmo 0 64605 NULL nohasharray ++__nodelist_parse_64605 __nodelist_parse 0 64605 &srp_show_tmo_64605 ++show_64606 show 0 64606 NULL ++use_pool_64607 use_pool 2 64607 NULL ++regulator_min_uV_show_64608 regulator_min_uV_show 0 64608 NULL ++efi_pstore_sysfs_entry_iter_64618 efi_pstore_sysfs_entry_iter 0 64618 NULL ++chksum_update_64619 chksum_update 0 64619 NULL ++dwmac100_dma_init_64622 dwmac100_dma_init 0 64622 NULL ++fanotify_write_64623 fanotify_write 3-0 64623 NULL ++ocfs2_inode_lock_with_page_64625 ocfs2_inode_lock_with_page 0 64625 NULL ++cs53l32a_s_ctrl_64628 cs53l32a_s_ctrl 0 64628 NULL ++hptiop_show_fw_version_64629 hptiop_show_fw_version 0 64629 NULL ++ntfs_write_inode_64630 ntfs_write_inode 0 64630 NULL nohasharray ++wm8994_gpio_request_64630 wm8994_gpio_request 0 64630 &ntfs_write_inode_64630 ++max8997_bulk_write_64633 max8997_bulk_write 0 64633 NULL ++tw68_queue_setup_64637 tw68_queue_setup 0 64637 NULL ++store_64641 store 0 64641 NULL ++_iwl_dbgfs_d0i3_refs_write_64642 _iwl_dbgfs_d0i3_refs_write 3-0 64642 NULL ++tse_open_64644 tse_open 0 64644 NULL ++playback_pcm_prepare_64646 playback_pcm_prepare 0 64646 NULL ++wl1271_ap_init_templates_64654 wl1271_ap_init_templates 0 64654 NULL ++regmap_read_debugfs_64658 regmap_read_debugfs 0-5 64658 NULL ++ocfs2_read_xattr_block_64661 ocfs2_read_xattr_block 0 64661 NULL nohasharray ++tlbflush_read_file_64661 tlbflush_read_file 3-0 64661 &ocfs2_read_xattr_block_64661 ++efx_tsoh_get_buffer_64664 efx_tsoh_get_buffer 3 64664 NULL ++vmci_transport_send_control_pkt_64666 vmci_transport_send_control_pkt 0 64666 NULL ++rx_rx_out_of_mpdu_nodes_read_64668 rx_rx_out_of_mpdu_nodes_read 3-0 64668 NULL ++show_f_req_64669 show_f_req 0 64669 NULL nohasharray ++lanai_proc_read_64669 lanai_proc_read 0 64669 &show_f_req_64669 ++nr_free_zone_pages_64680 nr_free_zone_pages 0 64680 NULL nohasharray ++aux_64680 aux 0 64680 &nr_free_zone_pages_64680 nohasharray ++bq2415x_sysfs_set_registers_64680 bq2415x_sysfs_set_registers 0-4 64680 &aux_64680 ++isl29003_show_power_state_64687 isl29003_show_power_state 0 64687 NULL ++snd_seq_ioctl_delete_queue_64690 snd_seq_ioctl_delete_queue 0 64690 NULL ++i9xx_pipe_crc_auto_source_64691 i9xx_pipe_crc_auto_source 0 64691 NULL ++set_volt_min_64693 set_volt_min 0-4 64693 NULL ++qla4xxx_optrom_version_show_64695 qla4xxx_optrom_version_show 0 64695 NULL ++iwl_send_rxon_timing_64697 iwl_send_rxon_timing 0 64697 NULL nohasharray ++wm8962_gpio_request_64697 wm8962_gpio_request 0 64697 &iwl_send_rxon_timing_64697 ++show_otp4_64699 show_otp4 0 64699 NULL ++mmc_test_probe_64700 mmc_test_probe 0 64700 NULL ++regcache_flat_write_64702 regcache_flat_write 0 64702 NULL ++show_temp_hyst_64705 show_temp_hyst 0 64705 NULL ++_cx25821_start_audio_dma_64707 _cx25821_start_audio_dma 0 64707 NULL ++validate_show_64709 validate_show 0 64709 NULL ++__feat_register_sp_64712 __feat_register_sp 0-6 64712 NULL ++snd_pcm_oss_capture_position_fixup_64713 snd_pcm_oss_capture_position_fixup 0 64713 NULL nohasharray ++show_in_input2_64713 show_in_input2 0 64713 &snd_pcm_oss_capture_position_fixup_64713 ++c_can_open_64714 c_can_open 0 64714 NULL ++dapm_bias_read_file_64715 dapm_bias_read_file 3-0 64715 NULL ++hermes_enable_port_64716 hermes_enable_port 0 64716 NULL nohasharray ++macvlan_set_mac_address_64716 macvlan_set_mac_address 0 64716 &hermes_enable_port_64716 ++atomic_add_return_64720 atomic_add_return 0 64720 NULL ++ds1343_store_glitchfilter_64721 ds1343_store_glitchfilter 0-4 64721 NULL ++i2400m_msg_to_dev_64722 i2400m_msg_to_dev 3 64722 NULL ++__dev_mc_del_64733 __dev_mc_del 0 64733 NULL ++sony_pic_wwanpower_store_64734 sony_pic_wwanpower_store 0-4 64734 NULL ++gsc_m2m_queue_setup_64736 gsc_m2m_queue_setup 0 64736 NULL ++squashfs_read_inode_lookup_table_64739 squashfs_read_inode_lookup_table 4 64739 NULL ++show_pwm_tmin_64745 show_pwm_tmin 0 64745 NULL ++power_limit_1_step_uw_show_64746 power_limit_1_step_uw_show 0 64746 NULL ++show_tcrit2_64747 show_tcrit2 0 64747 NULL ++bio_map_kern_64751 bio_map_kern 3 64751 NULL ++rt2x00debug_write_csr_64753 rt2x00debug_write_csr 3-0 64753 NULL ++wl12xx_init_ap_role_64754 wl12xx_init_ap_role 0 64754 NULL ++mt9m111_reg_set_64760 mt9m111_reg_set 0 64760 NULL ++cfq_slice_idle_store_64761 cfq_slice_idle_store 3-0 64761 NULL ++sensor_write_reg_64764 sensor_write_reg 0 64764 NULL nohasharray ++huawei_cdc_ncm_manage_power_64764 huawei_cdc_ncm_manage_power 0 64764 &sensor_write_reg_64764 ++show_64765 show 0 64765 NULL ++compat_sys_recvfrom_64769 compat_sys_recvfrom 3 64769 NULL ++mv88e6352_set_temp_limit_64771 mv88e6352_set_temp_limit 0 64771 NULL nohasharray ++init_housekeeping_64771 init_housekeeping 0 64771 &mv88e6352_set_temp_limit_64771 ++hwdep_write_64776 hwdep_write 3 64776 NULL nohasharray ++server_monitor_latency_show_64776 server_monitor_latency_show 0 64776 &hwdep_write_64776 ++message_for_md_64777 message_for_md 5 64777 NULL nohasharray ++skcipher_recvmsg_64777 skcipher_recvmsg 0-4 64777 &message_for_md_64777 ++acpi_pad_idlecpus_store_64782 acpi_pad_idlecpus_store 0-4 64782 NULL ++ceph_fscache_session_get_key_64785 ceph_fscache_session_get_key 0 64785 NULL ++isr_low_rssi_read_64789 isr_low_rssi_read 3-0 64789 NULL ++twl6040_reg_write_64790 twl6040_reg_write 0 64790 NULL nohasharray ++zisofs_readpage_64790 zisofs_readpage 0 64790 &twl6040_reg_write_64790 ++i40e_vsi_request_irq_msix_64791 i40e_vsi_request_irq_msix 0 64791 NULL ++inetdev_event_64794 inetdev_event 0 64794 NULL ++regmap_reg_ranges_read_file_64798 regmap_reg_ranges_read_file 3-0 64798 NULL ++nfsctl_transaction_write_64800 nfsctl_transaction_write 3-0 64800 NULL nohasharray ++target_fabric_wwn_attr_show_64800 target_fabric_wwn_attr_show 0 64800 &nfsctl_transaction_write_64800 ++bop_lookup_contig_64801 bop_lookup_contig 0 64801 NULL nohasharray ++carl9170_init_power_cal_64801 carl9170_init_power_cal 0 64801 &bop_lookup_contig_64801 ++snd_via8233_multi_prepare_64803 snd_via8233_multi_prepare 0 64803 NULL nohasharray ++vm_enough_memory_64803 vm_enough_memory 0 64803 &snd_via8233_multi_prepare_64803 ++rfkill_fop_write_64808 rfkill_fop_write 3-0 64808 NULL nohasharray ++nv_mask_64808 nv_mask 0 64808 &rfkill_fop_write_64808 ++sync_speed_show_64809 sync_speed_show 0 64809 NULL nohasharray ++ims_pcu_handle_firmware_update_64809 ims_pcu_handle_firmware_update 0 64809 &sync_speed_show_64809 ++proc_projid_map_write_64810 proc_projid_map_write 3-0 64810 NULL ++rxrpc_preparse_xdr_64812 rxrpc_preparse_xdr 0 64812 NULL ++clps711x_fb_set_par_64814 clps711x_fb_set_par 0 64814 NULL ++ecryptfs_send_miscdev_64816 ecryptfs_send_miscdev 2 64816 NULL ++show_target_kb_64823 show_target_kb 0 64823 NULL ++multicast_querier_interval_show_64824 multicast_querier_interval_show 0 64824 NULL ++sr9700_set_mac_address_64826 sr9700_set_mac_address 0 64826 NULL ++em28xx_read_reg_64839 em28xx_read_reg 0 64839 NULL ++driver_override_show_64842 driver_override_show 0 64842 NULL nohasharray ++v4l2_read_64842 v4l2_read 0-3 64842 &driver_override_show_64842 ++dummy_ipv6_recv_error_64843 dummy_ipv6_recv_error 0 64843 NULL ++ci_hdrc_add_device_64844 ci_hdrc_add_device 3 64844 NULL ++elan_smbus_iap_reset_64851 elan_smbus_iap_reset 0 64851 NULL ++do_request_64853 do_request 0 64853 NULL ++qla2x00_fw_state_show_64860 qla2x00_fw_state_show 0 64860 NULL ++altera_set_dr_pre_64862 altera_set_dr_pre 2 64862 NULL ++gpio_trig_inverted_show_64863 gpio_trig_inverted_show 0 64863 NULL ++rd_get_blocks_64864 rd_get_blocks 0 64864 NULL ++s5p_mfc_dec_s_ctrl_64865 s5p_mfc_dec_s_ctrl 0 64865 NULL ++ati_remote2_store_mode_mask_64866 ati_remote2_store_mode_mask 0-4 64866 NULL ++roccat_common2_sysfs_write_control_64868 roccat_common2_sysfs_write_control 0-6-5 64868 NULL nohasharray ++ndisc_alloc_skb_64868 ndisc_alloc_skb 2 64868 &roccat_common2_sysfs_write_control_64868 ++show_alarms_fan_64869 show_alarms_fan 0 64869 NULL ++rbd_image_refresh_64870 rbd_image_refresh 0-4 64870 NULL ++zl10039_write_64873 zl10039_write 0 64873 NULL ++shtc1_update_values_64875 shtc1_update_values 4 64875 NULL nohasharray ++show_constraint_max_time_window_us_64875 show_constraint_max_time_window_us 0 64875 &shtc1_update_values_64875 nohasharray ++nouveau_hwmon_get_pwm1_max_64875 nouveau_hwmon_get_pwm1_max 0 64875 &show_constraint_max_time_window_us_64875 ++pci_vc_do_save_buffer_64876 pci_vc_do_save_buffer 0 64876 NULL ++lprocfs_write_u64_helper_64880 lprocfs_write_u64_helper 2 64880 NULL ++task_setscheduler_64882 task_setscheduler 0 64882 NULL ++xfs_da3_node_lookup_int_64889 xfs_da3_node_lookup_int 0 64889 NULL ++av7110_send_fw_cmd_64902 av7110_send_fw_cmd 0 64902 NULL nohasharray ++ds2781_set_pmod_enabled_64902 ds2781_set_pmod_enabled 0-4 64902 &av7110_send_fw_cmd_64902 nohasharray ++mlx4_en_phc_enable_64902 mlx4_en_phc_enable 0 64902 &ds2781_set_pmod_enabled_64902 ++nouveau_hwmon_show_fan1_input_64916 nouveau_hwmon_show_fan1_input 0 64916 NULL ++cxacru_sysfs_showattr_MODU_64917 cxacru_sysfs_showattr_MODU 0 64917 NULL ++wl1271_acx_event_mbox_mask_64919 wl1271_acx_event_mbox_mask 0 64919 NULL ++sigma_fw_load_data_64923 sigma_fw_load_data 3 64923 NULL ++ceph_vxattrcb_layout_object_size_64924 ceph_vxattrcb_layout_object_size 0 64924 NULL nohasharray ++ieee80211_if_read_ave_beacon_64924 ieee80211_if_read_ave_beacon 3-0 64924 &ceph_vxattrcb_layout_object_size_64924 ++show_temp_auto_temp_off_64928 show_temp_auto_temp_off 0 64928 NULL ++adp8870_bl_l3_office_dim_show_64930 adp8870_bl_l3_office_dim_show 0 64930 NULL ++ql_wait_cfg_64933 ql_wait_cfg 0 64933 NULL ++hidp_process_report_64935 hidp_process_report 4 64935 NULL ++hdlc_device_event_64937 hdlc_device_event 0 64937 NULL ++smsc_phy_reset_64938 smsc_phy_reset 0 64938 NULL ++pcan_usb_set_bus_64942 pcan_usb_set_bus 0 64942 NULL ++ubifs_wbuf_write_nolock_64946 ubifs_wbuf_write_nolock 3-0 64946 NULL ++gadget_dev_desc_bDeviceClass_show_64948 gadget_dev_desc_bDeviceClass_show 0 64948 NULL nohasharray ++mac802154_llsec_set_params_64948 mac802154_llsec_set_params 0 64948 &gadget_dev_desc_bDeviceClass_show_64948 ++__uncore_mask_show_64950 __uncore_mask_show 0 64950 NULL nohasharray ++pcipcwd_notify_sys_64950 pcipcwd_notify_sys 0 64950 &__uncore_mask_show_64950 ++sony_pic_fanspeed_store_64951 sony_pic_fanspeed_store 0-4 64951 NULL ++fsid_present_64955 fsid_present 0 64955 NULL ++ip_options_get_from_user_64958 ip_options_get_from_user 4-0 64958 NULL ++show_64959 show 0 64959 NULL ++ieee802154_sock_bind_64960 ieee802154_sock_bind 0 64960 NULL ++acpi_os_install_interrupt_handler_64968 acpi_os_install_interrupt_handler 1 64968 NULL ++traceprobe_probes_write_64969 traceprobe_probes_write 3 64969 NULL ++suspend_dtim_interval_read_64971 suspend_dtim_interval_read 3-0 64971 NULL ++ext2_group_first_block_no_64972 ext2_group_first_block_no 0-2 64972 NULL ++core_alua_show_secondary_write_metadata_64979 core_alua_show_secondary_write_metadata 0 64979 NULL nohasharray ++proc_sys_call_handler_64979 proc_sys_call_handler 0 64979 &core_alua_show_secondary_write_metadata_64979 ++show_tcpRtoAlgorithm_64982 show_tcpRtoAlgorithm 0 64982 NULL ++i7core_inject_store_col_64991 i7core_inject_store_col 0-4 64991 NULL ++sq905_command_64994 sq905_command 0 64994 NULL ++xip_truncate_page_64995 xip_truncate_page 0 64995 NULL ++alloc_all_mem_65005 alloc_all_mem 0 65005 NULL nohasharray ++pskb_pull_65005 pskb_pull 2 65005 &alloc_all_mem_65005 ++wakeup_expire_count_show_65013 wakeup_expire_count_show 0 65013 NULL ++sh_mobile_ceu_videobuf_prepare_65016 sh_mobile_ceu_videobuf_prepare 0 65016 NULL ++llc_ui_listen_65018 llc_ui_listen 0 65018 NULL ++mag3110_show_samp_freq_avail_65028 mag3110_show_samp_freq_avail 0 65028 NULL ++insert_dent_65034 insert_dent 7 65034 NULL ++root_id_show_65050 root_id_show 0 65050 NULL ++keene_cmd_set_65052 keene_cmd_set 0 65052 NULL ++v4l2_ctrl_handler_init_class_65053 v4l2_ctrl_handler_init_class 2 65053 NULL nohasharray ++logfs_truncate_rec_65053 logfs_truncate_rec 0 65053 &v4l2_ctrl_handler_init_class_65053 ++vmci_transport_notify_pkt_send_init_65056 vmci_transport_notify_pkt_send_init 0 65056 NULL nohasharray ++mwifiex_cmd_802_11_associate_65056 mwifiex_cmd_802_11_associate 0 65056 &vmci_transport_notify_pkt_send_init_65056 nohasharray ++ath9k_multi_regread_65056 ath9k_multi_regread 4 65056 &mwifiex_cmd_802_11_associate_65056 ++snd_rme32_pcm_trigger_65058 snd_rme32_pcm_trigger 0 65058 NULL ++__erst_record_id_cache_add_one_65059 __erst_record_id_cache_add_one 0 65059 NULL nohasharray ++pcibios_enable_device_65059 pcibios_enable_device 0 65059 &__erst_record_id_cache_add_one_65059 nohasharray ++be_cmd_get_active_mac_65059 be_cmd_get_active_mac 0 65059 &pcibios_enable_device_65059 ++fw_write_65069 fw_write 3 65069 NULL ++count_run_65072 count_run 0-4-5-2 65072 NULL nohasharray ++bnx2fc_process_l2_frame_compl_65072 bnx2fc_process_l2_frame_compl 3 65072 &count_run_65072 ++koneplus_sysfs_write_info_65073 koneplus_sysfs_write_info 0-6-5 65073 NULL ++__alloc_bootmem_node_high_65076 __alloc_bootmem_node_high 2 65076 NULL nohasharray ++nf_nat_alloc_null_binding_65076 nf_nat_alloc_null_binding 0 65076 &__alloc_bootmem_node_high_65076 ++patch_65078 patch 0 65078 NULL ++io_submit_init_bio_65080 io_submit_init_bio 0 65080 NULL ++batadv_socket_write_65083 batadv_socket_write 3-0 65083 NULL ++wl1271_ap_hw_init_65086 wl1271_ap_hw_init 0 65086 NULL ++ath9k_dump_mci_btcoex_65090 ath9k_dump_mci_btcoex 3-0 65090 NULL nohasharray ++show_temp_fault_65090 show_temp_fault 0 65090 &ath9k_dump_mci_btcoex_65090 nohasharray ++mwl8k_cmd_set_mac_addr_65090 mwl8k_cmd_set_mac_addr 0 65090 &show_temp_fault_65090 ++snd_ali_playback_prepare_65093 snd_ali_playback_prepare 0 65093 NULL nohasharray ++scsi_add_host_with_dma_65093 scsi_add_host_with_dma 0 65093 &snd_ali_playback_prepare_65093 ++cfq_fifo_expire_sync_show_65097 cfq_fifo_expire_sync_show 0 65097 NULL ++qlcnic_83xx_create_rx_ctx_65098 qlcnic_83xx_create_rx_ctx 0 65098 NULL ++__ext3_journal_dirty_metadata_65103 __ext3_journal_dirty_metadata 0 65103 NULL ++pm_test_store_65104 pm_test_store 0-4 65104 NULL ++it8709_get_rx_bytes_65106 it8709_get_rx_bytes 0 65106 NULL ++generic_ocp_write_65107 generic_ocp_write 4 65107 NULL ++usbvision_i2c_read_max4_65113 usbvision_i2c_read_max4 0-4 65113 NULL ++show_ipReasmReqds_65114 show_ipReasmReqds 0 65114 NULL ++usbtest_alloc_urb_65115 usbtest_alloc_urb 5-3 65115 NULL ++direction_input_65122 direction_input 0 65122 NULL nohasharray ++br_nf_forward_ip_65122 br_nf_forward_ip 0 65122 &direction_input_65122 ++store_65127 store 0-3 65127 NULL ++store_srp_rport_delete_65128 store_srp_rport_delete 0-4 65128 NULL ++show_tcpMaxConn_65131 show_tcpMaxConn 0 65131 NULL ++nf_setsockopt_65135 nf_setsockopt 0 65135 NULL ++xfs_attr_node_addname_65138 xfs_attr_node_addname 0 65138 NULL ++ov7670_s_ctrl_65141 ov7670_s_ctrl 0 65141 NULL ++r8a66597_queue_65143 r8a66597_queue 0 65143 NULL ++cpia2_usb_transfer_cmd_65145 cpia2_usb_transfer_cmd 0 65145 NULL ++vpe_queue_setup_65155 vpe_queue_setup 0 65155 NULL ++tsl2550_set_power_state_65158 tsl2550_set_power_state 0 65158 NULL ++hpfs_hash_dentry_65163 hpfs_hash_dentry 0 65163 NULL ++truncate_upper_65167 truncate_upper 0 65167 NULL ++snd_emu10k1_playback_prepare_65169 snd_emu10k1_playback_prepare 0 65169 NULL ++virtnet_vlan_rx_add_vid_65170 virtnet_vlan_rx_add_vid 0 65170 NULL ++lpfc_fcf_failover_policy_show_65181 lpfc_fcf_failover_policy_show 0 65181 NULL ++i2c_smbus_xfer_emulated_65183 i2c_smbus_xfer_emulated 0 65183 NULL nohasharray ++ssb_bus_register_65183 ssb_bus_register 3 65183 &i2c_smbus_xfer_emulated_65183 ++lola_setup_periods_65184 lola_setup_periods 0 65184 NULL nohasharray ++__mlx4_alloc_from_zone_65184 __mlx4_alloc_from_zone 3 65184 &lola_setup_periods_65184 ++sha384_init_65187 sha384_init 0 65187 NULL ++ovl_getattr_65189 ovl_getattr 0 65189 NULL ++nf_bridge_mtu_reduction_65192 nf_bridge_mtu_reduction 0 65192 NULL ++card_wait_for_busy_clear_65196 card_wait_for_busy_clear 0 65196 NULL ++power_limit_0_step_uw_show_65199 power_limit_0_step_uw_show 0 65199 NULL nohasharray ++logfs_segment_read_65199 logfs_segment_read 0 65199 &power_limit_0_step_uw_show_65199 ++fcopy_write_65211 fcopy_write 0-3 65211 NULL ++rx_rx_done_read_65217 rx_rx_done_read 3-0 65217 NULL ++show_pwm_enable_65224 show_pwm_enable 0 65224 NULL nohasharray ++squashfs_statfs_65224 squashfs_statfs 0 65224 &show_pwm_enable_65224 ++store_color_common_65227 store_color_common 0 65227 NULL ++init_verbs_store_65228 init_verbs_store 0-4 65228 NULL ++rt_mutex_fasttrylock_65229 rt_mutex_fasttrylock 0 65229 NULL ++print_endpoint_stat_65232 print_endpoint_stat 4-0-3 65232 NULL ++create_indep_hp_ctls_65234 create_indep_hp_ctls 0 65234 NULL ++show_temp_mode_65238 show_temp_mode 0 65238 NULL ++tg3_phydsp_write_65240 tg3_phydsp_write 0 65240 NULL ++journal_get_write_access_65243 journal_get_write_access 0 65243 NULL ++whci_n_caps_65247 whci_n_caps 0 65247 NULL ++finup_65248 finup 0 65248 NULL ++twl6040_power_up_automatic_65249 twl6040_power_up_automatic 0 65249 NULL ++sbridge_mce_check_error_65250 sbridge_mce_check_error 0 65250 NULL ++adt7x10_show_t_hyst_65253 adt7x10_show_t_hyst 0 65253 NULL ++store_pwm_ac_65254 store_pwm_ac 0-4 65254 NULL ++s_stream_vbi_fmt_65256 s_stream_vbi_fmt 0 65256 NULL ++mwave_read_65257 mwave_read 0-3 65257 NULL ++core_siblings_show_65263 core_siblings_show 0 65263 NULL ++tc3589x_gpio_direction_input_65264 tc3589x_gpio_direction_input 0 65264 NULL ++kmem_zalloc_greedy_65268 kmem_zalloc_greedy 3-2 65268 NULL nohasharray ++inet_netconf_msgsize_devconf_65268 inet_netconf_msgsize_devconf 0 65268 &kmem_zalloc_greedy_65268 ++new_offset_store_65271 new_offset_store 0-3 65271 NULL ++logfs_segment_write_65277 logfs_segment_write 0 65277 NULL ++vivid_streaming_s_ctrl_65278 vivid_streaming_s_ctrl 0 65278 NULL ++kmalloc_parameter_65279 kmalloc_parameter 1 65279 NULL ++xfs_btree_check_ptr_65281 xfs_btree_check_ptr 0 65281 NULL ++bnx2_alloc_mem_65285 bnx2_alloc_mem 0 65285 NULL nohasharray ++compat_core_sys_select_65285 compat_core_sys_select 1 65285 &bnx2_alloc_mem_65285 ++getproplen_65293 getproplen 0 65293 NULL ++mpi_set_buffer_65294 mpi_set_buffer 3 65294 NULL ++fat_direct_IO_65295 fat_direct_IO 4-0 65295 NULL ++redirected_tty_write_65297 redirected_tty_write 3-0 65297 NULL nohasharray ++update_relax_domain_level_65297 update_relax_domain_level 0 65297 &redirected_tty_write_65297 nohasharray ++aa_setprocattr_changeprofile_65297 aa_setprocattr_changeprofile 0 65297 &update_relax_domain_level_65297 ++acpi_ex_resolve_object_to_value_65298 acpi_ex_resolve_object_to_value 0 65298 NULL ++rt_mutex_trylock_65300 rt_mutex_trylock 0 65300 NULL ++get_var_len_65304 get_var_len 0 65304 NULL nohasharray ++apds990x_lux_show_65304 apds990x_lux_show 0 65304 &get_var_len_65304 ++generic_read_dir_65308 generic_read_dir 0-3 65308 NULL ++nfc_hci_execute_cmd_async_65314 nfc_hci_execute_cmd_async 5 65314 NULL ++udf_adinicb_readpage_65316 udf_adinicb_readpage 0 65316 NULL ++unpack_array_65318 unpack_array 0 65318 NULL ++ttm_mem_zone_show_65319 ttm_mem_zone_show 0 65319 NULL ++write_acpi_int_65322 write_acpi_int 0 65322 NULL nohasharray ++ivtv_start_decoding_65322 ivtv_start_decoding 0 65322 &write_acpi_int_65322 ++pci_vpd_find_tag_65325 pci_vpd_find_tag 0-2 65325 NULL ++dccp_setsockopt_service_65336 dccp_setsockopt_service 4-0 65336 NULL ++nv_get_regs_len_65344 nv_get_regs_len 0 65344 NULL ++ext4_statfs_65345 ext4_statfs 0 65345 NULL ++stv0680_handle_error_65352 stv0680_handle_error 0-2 65352 NULL ++dma_rx_requested_read_65354 dma_rx_requested_read 3-0 65354 NULL ++ns_proc_read_65358 ns_proc_read 0 65358 NULL nohasharray ++sxgbe_init_dma_engine_65358 sxgbe_init_dma_engine 0 65358 &ns_proc_read_65358 ++alloc_cpu_rmap_65363 alloc_cpu_rmap 1 65363 NULL ++set_tcrit1_hyst_65366 set_tcrit1_hyst 0-4 65366 NULL ++__ext4_new_inode_65370 __ext4_new_inode 5 65370 NULL nohasharray ++lpfc_soft_wwnn_store_65370 lpfc_soft_wwnn_store 0-4 65370 &__ext4_new_inode_65370 ++iwl_dbgfs_netdetect_read_65371 iwl_dbgfs_netdetect_read 3-0 65371 NULL nohasharray ++mxt_write_reg_65371 mxt_write_reg 0 65371 &iwl_dbgfs_netdetect_read_65371 ++SyS_writev_65372 SyS_writev 3 65372 NULL ++velocity_change_mtu_65375 velocity_change_mtu 0 65375 NULL ++fuse_write_end_65376 fuse_write_end 0-5 65376 NULL ++adcxx_read_65379 adcxx_read 0 65379 NULL nohasharray ++mem_cgroup_swappiness_write_65379 mem_cgroup_swappiness_write 0 65379 &adcxx_read_65379 ++nouveau_hwmon_set_pwm1_max_65382 nouveau_hwmon_set_pwm1_max 0-4 65382 NULL ++m88e3016_config_init_65388 m88e3016_config_init 0 65388 NULL ++hide_icon_65390 hide_icon 0-4 65390 NULL ++mi_set_context_65395 mi_set_context 0 65395 NULL ++__alloc_bootmem_nopanic_65397 __alloc_bootmem_nopanic 1 65397 NULL nohasharray ++f2fs_xattr_advise_get_65397 f2fs_xattr_advise_get 0 65397 &__alloc_bootmem_nopanic_65397 ++trace_seq_to_user_65398 trace_seq_to_user 3 65398 NULL ++mtd_get_device_size_65400 mtd_get_device_size 0 65400 NULL ++__read_vmcore_65402 __read_vmcore 2-0 65402 NULL ++rxrpc_krb5_decode_tagged_array_65404 rxrpc_krb5_decode_tagged_array 0 65404 NULL nohasharray ++atmel_suspend_65404 atmel_suspend 0 65404 &rxrpc_krb5_decode_tagged_array_65404 ++usb_ep_enable_65405 usb_ep_enable 0 65405 NULL ++iio_device_add_channel_sysfs_65406 iio_device_add_channel_sysfs 0 65406 NULL ++consistent_dma_mask_bits_show_65407 consistent_dma_mask_bits_show 0 65407 NULL ++snd_ca0106_pcm_prepare_playback_65408 snd_ca0106_pcm_prepare_playback 0 65408 NULL ++show_temp_src_65410 show_temp_src 0 65410 NULL nohasharray ++ocfs2_write_begin_nolock_65410 ocfs2_write_begin_nolock 0 65410 &show_temp_src_65410 ++edge_open_65411 edge_open 0 65411 NULL ++snd_pcm_plugin_insert_65412 snd_pcm_plugin_insert 0 65412 NULL ++ali1535_access_65416 ali1535_access 0 65416 NULL nohasharray ++kobj_pkt_show_65416 kobj_pkt_show 0 65416 &ali1535_access_65416 ++i40evf_get_rxfh_indir_size_65417 i40evf_get_rxfh_indir_size 0 65417 NULL ++aux2_show_65419 aux2_show 0 65419 NULL ++drm_calloc_large_65421 drm_calloc_large 1-2 65421 NULL ++device_add_groups_65423 device_add_groups 0 65423 NULL ++core_alua_store_secondary_write_metadata_65425 core_alua_store_secondary_write_metadata 0-3 65425 NULL ++cpufreq_stat_notifier_policy_65431 cpufreq_stat_notifier_policy 0 65431 NULL ++xpc_kzalloc_cacheline_aligned_65433 xpc_kzalloc_cacheline_aligned 1 65433 NULL ++vmalloc_to_pfn_65437 vmalloc_to_pfn 0 65437 NULL ++usb_alloc_coherent_65444 usb_alloc_coherent 2 65444 NULL ++mlx4_comm_cmd_poll_65445 mlx4_comm_cmd_poll 0 65445 NULL nohasharray ++cpu_cfs_period_write_u64_65445 cpu_cfs_period_write_u64 0 65445 &mlx4_comm_cmd_poll_65445 ++set_emul_temp_65452 set_emul_temp 0 65452 NULL ++affs_write_inode_65454 affs_write_inode 0 65454 NULL ++read_65459 read 0 65459 NULL ++pinctrl_request_gpio_65460 pinctrl_request_gpio 0 65460 NULL ++il_dbgfs_wd_timeout_write_65464 il_dbgfs_wd_timeout_write 3-0 65464 NULL ++input_dev_show_id_bustype_65465 input_dev_show_id_bustype 0 65465 NULL ++ipath_tid_free_65467 ipath_tid_free 0 65467 NULL ++clear_user_65470 clear_user 2 65470 NULL ++crypto_ablkcipher_encrypt_65473 crypto_ablkcipher_encrypt 0 65473 NULL ++set_temp_max_hyst_65474 set_temp_max_hyst 0-4 65474 NULL ++eem_opts_qmult_store_65476 eem_opts_qmult_store 0-3 65476 NULL nohasharray ++write_profile_65476 write_profile 0-3 65476 &eem_opts_qmult_store_65476 ++dquot_alloc_space_65477 dquot_alloc_space 0 65477 NULL ++regmap_write_65478 regmap_write 0 65478 NULL ++activate_65483 activate 0 65483 NULL nohasharray ++ath_rx_edma_init_65483 ath_rx_edma_init 2 65483 &activate_65483 ++sock_recvmsg_nosec_65484 sock_recvmsg_nosec 3 65484 NULL ++ixgbevf_get_regs_len_65486 ixgbevf_get_regs_len 0 65486 NULL ++show_temp3_beep_65487 show_temp3_beep 0 65487 NULL ++xen_tmem_get_page_65488 xen_tmem_get_page 4 65488 NULL ++dpcm_state_read_file_65489 dpcm_state_read_file 3-0 65489 NULL nohasharray ++setup_spdif_playback_65489 setup_spdif_playback 0 65489 &dpcm_state_read_file_65489 ++fotg210_config_ep_65494 fotg210_config_ep 0 65494 NULL ++selnl_msglen_65499 selnl_msglen 0 65499 NULL ++wm8350_rtc_setalarm_65501 wm8350_rtc_setalarm 0 65501 NULL ++__xudc_ep_enable_65502 __xudc_ep_enable 0 65502 NULL ++dcdbas_smi_request_65515 dcdbas_smi_request 0 65515 NULL ++tdfxfb_check_var_65516 tdfxfb_check_var 0 65516 NULL ++comm_read_regr_65525 comm_read_regr 0 65525 NULL ++nvme_trans_standard_inquiry_page_65526 nvme_trans_standard_inquiry_page 4 65526 NULL nohasharray ++__vxge_hw_vpath_rts_table_set_65526 __vxge_hw_vpath_rts_table_set 0 65526 &nvme_trans_standard_inquiry_page_65526 ++tps6507x_pmic_set_bits_65527 tps6507x_pmic_set_bits 0 65527 NULL ++gpio_set_direction_65528 gpio_set_direction 0 65528 NULL ++show_memory_65529 show_memory 0 65529 NULL ++reg_read_65530 reg_read 0 65530 NULL ++hfsplus_trusted_getxattr_65531 hfsplus_trusted_getxattr 0 65531 NULL ++tree_mod_log_eb_copy_65535 tree_mod_log_eb_copy 6-0 65535 NULL +diff --git a/tools/gcc/size_overflow_plugin/size_overflow_hash_aux.data b/tools/gcc/size_overflow_plugin/size_overflow_hash_aux.data +new file mode 100644 +index 0000000..560cd7b +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/size_overflow_hash_aux.data +@@ -0,0 +1,92 @@ ++spa_set_aux_vdevs_746 spa_set_aux_vdevs 3 746 NULL ++zfs_lookup_2144 zfs_lookup 0 2144 NULL ++mappedread_2627 mappedread 2 2627 NULL ++vdev_disk_dio_alloc_2957 vdev_disk_dio_alloc 1 2957 NULL ++nv_alloc_pushpage_spl_4286 nv_alloc_pushpage_spl 2 4286 NULL ++zpl_xattr_get_4574 zpl_xattr_get 0 4574 NULL ++sa_replace_all_by_template_5699 sa_replace_all_by_template 3 5699 NULL ++dmu_write_6048 dmu_write 4-3 6048 NULL ++dmu_buf_hold_array_6095 dmu_buf_hold_array 4-3 6095 NULL ++update_pages_6225 update_pages 2-3 6225 NULL ++bio_nr_pages_7117 bio_nr_pages 0-2 7117 NULL ++dmu_buf_hold_array_by_bonus_8562 dmu_buf_hold_array_by_bonus 3-2 8562 NULL ++zpios_dmu_write_8858 zpios_dmu_write 4-5 8858 NULL ++ddi_copyout_9401 ddi_copyout 3 9401 NULL ++avl_numnodes_12384 avl_numnodes 0 12384 NULL ++dmu_write_uio_dnode_12473 dmu_write_uio_dnode 3 12473 NULL ++dmu_xuio_init_12866 dmu_xuio_init 2 12866 NULL ++zpl_read_common_14389 zpl_read_common 0 14389 NULL ++dmu_snapshot_realname_14632 dmu_snapshot_realname 4 14632 NULL ++kmem_alloc_debug_14852 kmem_alloc_debug 1 14852 NULL ++kmalloc_node_nofail_15151 kmalloc_node_nofail 1 15151 NULL ++dmu_write_uio_16351 dmu_write_uio 4 16351 NULL ++zfs_log_write_16524 zfs_log_write 6-5 16524 NULL ++sa_build_layouts_16910 sa_build_layouts 3 16910 NULL ++dsl_dir_namelen_17053 dsl_dir_namelen 0 17053 NULL ++kcopy_copy_to_user_17336 kcopy_copy_to_user 5 17336 NULL ++sa_add_layout_entry_17507 sa_add_layout_entry 3 17507 NULL ++sa_attr_table_setup_18029 sa_attr_table_setup 3 18029 NULL ++uiocopy_18680 uiocopy 2 18680 NULL ++dmu_buf_hold_array_by_dnode_19125 dmu_buf_hold_array_by_dnode 2-3 19125 NULL ++zpl_acl_from_xattr_21141 zpl_acl_from_xattr 2 21141 NULL ++dsl_pool_tx_assign_init_22518 dsl_pool_tx_assign_init 2 22518 NULL ++nvlist_lookup_byte_array_22527 nvlist_lookup_byte_array 0 22527 NULL ++sa_replace_all_by_template_locked_22533 sa_replace_all_by_template_locked 3 22533 NULL ++tsd_hash_table_init_22559 tsd_hash_table_init 1 22559 NULL ++spa_vdev_remove_aux_23966 spa_vdev_remove_aux 4 23966 NULL ++zpl_xattr_acl_set_access_24129 zpl_xattr_acl_set_access 4 24129 NULL ++dmu_assign_arcbuf_24622 dmu_assign_arcbuf 2 24622 NULL ++zap_lookup_norm_25166 zap_lookup_norm 9 25166 NULL ++dmu_prealloc_25456 dmu_prealloc 4-3 25456 NULL ++kmalloc_nofail_26347 kmalloc_nofail 1 26347 NULL ++zfsctl_snapshot_zpath_27578 zfsctl_snapshot_zpath 2 27578 NULL ++zpios_dmu_read_30015 zpios_dmu_read 4-5 30015 NULL ++splat_write_30943 splat_write 3 30943 NULL ++zpl_xattr_get_sa_31183 zpl_xattr_get_sa 0 31183 NULL ++dmu_read_uio_31467 dmu_read_uio 4 31467 NULL ++zfs_replay_fuids_31479 zfs_replay_fuids 4 31479 NULL ++spa_history_log_to_phys_31632 spa_history_log_to_phys 0-1 31632 NULL ++__zpl_xattr_get_32601 __zpl_xattr_get 0 32601 NULL ++proc_copyout_string_34049 proc_copyout_string 2 34049 NULL ++nv_alloc_sleep_spl_34544 nv_alloc_sleep_spl 2 34544 NULL ++nv_alloc_nosleep_spl_34761 nv_alloc_nosleep_spl 2 34761 NULL ++zap_leaf_array_match_36922 zap_leaf_array_match 4 36922 NULL ++copyinstr_36980 copyinstr 3 36980 NULL ++zpl_xattr_acl_set_default_37864 zpl_xattr_acl_set_default 4 37864 NULL ++splat_read_38116 splat_read 3 38116 NULL ++sa_setup_38756 sa_setup 4 38756 NULL ++vdev_disk_physio_39898 vdev_disk_physio 3 39898 NULL ++arc_buf_size_39982 arc_buf_size 0 39982 NULL ++kzalloc_nofail_40719 kzalloc_nofail 1 40719 NULL ++fuidstr_to_sid_40777 fuidstr_to_sid 4 40777 NULL ++vdev_raidz_matrix_reconstruct_40852 vdev_raidz_matrix_reconstruct 2-3 40852 NULL ++sa_find_layout_40892 sa_find_layout 4 40892 NULL ++zpl_xattr_get_dir_41918 zpl_xattr_get_dir 0 41918 NULL ++zfs_sa_get_xattr_42600 zfs_sa_get_xattr 0 42600 NULL ++zpl_xattr_acl_set_42808 zpl_xattr_acl_set 4 42808 NULL ++xdr_dec_array_43091 xdr_dec_array 5 43091 NULL ++dsl_dataset_namelen_43136 dsl_dataset_namelen 0 43136 NULL ++kcopy_write_43683 kcopy_write 3 43683 NULL ++uiomove_44355 uiomove 2 44355 NULL ++dmu_read_44418 dmu_read 4-3 44418 NULL ++ddi_copyin_44846 ddi_copyin 3 44846 NULL ++kcopy_do_get_45061 kcopy_do_get 5 45061 NULL ++copyin_45945 copyin 3 45945 NULL ++zil_itx_create_46555 zil_itx_create 2 46555 NULL ++dmu_write_uio_dbuf_48064 dmu_write_uio_dbuf 3 48064 NULL ++blk_rq_pos_48233 blk_rq_pos 0 48233 NULL ++spa_history_write_49650 spa_history_write 3 49650 NULL ++kcopy_copy_pages_to_user_49823 kcopy_copy_pages_to_user 3-4 49823 NULL ++zfs_log_write_50162 zfs_log_write 6-5 50162 NULL ++i_fm_alloc_51038 i_fm_alloc 2 51038 NULL ++copyout_51409 copyout 3 51409 NULL ++zvol_log_write_54898 zvol_log_write 4-3 54898 NULL ++zfs_acl_node_alloc_55641 zfs_acl_node_alloc 1 55641 NULL ++get_nvlist_56685 get_nvlist 2 56685 NULL ++zprop_get_numprops_56820 zprop_get_numprops 0 56820 NULL ++splat_taskq_test4_common_59829 splat_taskq_test4_common 5 59829 NULL ++zfs_replay_domain_cnt_61399 zfs_replay_domain_cnt 0 61399 NULL ++zpios_write_61823 zpios_write 3 61823 NULL ++proc_copyin_string_62019 proc_copyin_string 4 62019 NULL ++random_get_pseudo_bytes_64611 random_get_pseudo_bytes 2 64611 NULL ++zpios_read_64734 zpios_read 3 64734 NULL +diff --git a/tools/gcc/size_overflow_plugin/size_overflow_ipa.c b/tools/gcc/size_overflow_plugin/size_overflow_ipa.c +new file mode 100644 +index 0000000..9846ab0 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/size_overflow_ipa.c +@@ -0,0 +1,913 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++static next_interesting_function_t walk_use_def_next_functions(gimple_set *visited, next_interesting_function_t next_cnodes_head, const_tree lhs); ++ ++next_interesting_function_t global_next_interesting_function[GLOBAL_NIFN_LEN]; ++ ++static struct cgraph_node_hook_list *function_insertion_hook_holder; ++static struct cgraph_2node_hook_list *node_duplication_hook_holder; ++ ++struct cgraph_node *get_cnode(const_tree fndecl) ++{ ++ gcc_assert(TREE_CODE(fndecl) == FUNCTION_DECL); ++#if BUILDING_GCC_VERSION <= 4005 ++ return cgraph_get_node((tree)fndecl); ++#else ++ return cgraph_get_node(fndecl); ++#endif ++} ++ ++static bool compare_next_interesting_functions(next_interesting_function_t cur_node, const char *decl_name, const char *context, unsigned int num) ++{ ++ if (cur_node->marked == ASM_STMT_SO_MARK) ++ return false; ++ if (num != CANNOT_FIND_ARG && cur_node->num != num) ++ return false; ++ if (strcmp(cur_node->context, context)) ++ return false; ++ return !strcmp(cur_node->decl_name, decl_name); ++} ++ ++// Return the type name for a function pointer (or "fielddecl" if the type has no name), otherwise either "vardecl" or "fndecl" ++static const char* get_decl_context(const_tree decl) ++{ ++ const char *context; ++ ++ if (TREE_CODE(decl) == VAR_DECL) ++ return "vardecl"; ++ if (TREE_CODE(decl) == FUNCTION_DECL) ++ return "fndecl"; ++ ++ gcc_assert(TREE_CODE(decl) == FIELD_DECL); ++ context = get_type_name_from_field(decl); ++ ++ if (!context) ++ return "fielddecl"; ++ return context; ++} ++ ++/* Find the function with the specified argument in the list ++ * * if marked is ASM_STMT_SO_MARK or YES_SO_MARK then filter accordingly ++ * * if num is CANNOT_FIND_ARG then ignore it ++ */ ++next_interesting_function_t get_global_next_interesting_function_entry(const char *decl_name, const char *context, unsigned int hash, unsigned int num, enum size_overflow_mark marked) ++{ ++ next_interesting_function_t cur_node, head; ++ ++ head = global_next_interesting_function[hash]; ++ for (cur_node = head; cur_node; cur_node = cur_node->next) { ++ if ((marked == ASM_STMT_SO_MARK || marked == YES_SO_MARK) && cur_node->marked != marked) ++ continue; ++ if (compare_next_interesting_functions(cur_node, decl_name, context, num)) ++ return cur_node; ++ } ++ return NULL; ++} ++ ++next_interesting_function_t get_global_next_interesting_function_entry_with_hash(const_tree decl, const char *decl_name, unsigned int num, enum size_overflow_mark marked) ++{ ++ const char *context; ++ unsigned int hash; ++ ++ hash = get_decl_hash(decl, decl_name); ++ if (hash == NO_HASH) ++ return NULL; ++ ++ context = get_decl_context(decl); ++ return get_global_next_interesting_function_entry(decl_name, context, hash, num, marked); ++} ++ ++static bool is_vararg(const_tree fn, unsigned int num) ++{ ++ const_tree fn_type, last, type; ++ tree arg_list; ++ ++ if (num == 0) ++ return false; ++ if (fn == NULL_TREE) ++ return false; ++ if (TREE_CODE(fn) != FUNCTION_DECL) ++ return false; ++ ++ fn_type = TREE_TYPE(fn); ++ if (fn_type == NULL_TREE) ++ return false; ++ ++ arg_list = TYPE_ARG_TYPES(fn_type); ++ if (arg_list == NULL_TREE) ++ return false; ++ last = TREE_VALUE(tree_last(arg_list)); ++ ++ if (TREE_CODE_CLASS(TREE_CODE(last)) == tcc_type) ++ type = last; ++ else ++ type = TREE_TYPE(last); ++ ++ gcc_assert(type != NULL_TREE); ++ if (type == void_type_node) ++ return false; ++ ++ return num >= (unsigned int)list_length(arg_list); ++} ++ ++next_interesting_function_t create_new_next_interesting_entry(const char *decl_name, const char *context, unsigned int hash, unsigned int num, enum size_overflow_mark marked, next_interesting_function_t orig_next_node) ++{ ++ next_interesting_function_t new_node; ++ ++ new_node = (next_interesting_function_t)xmalloc(sizeof(*new_node)); ++ new_node->decl_name = xstrdup(decl_name); ++ gcc_assert(context); ++ new_node->context = xstrdup(context); ++ new_node->hash = hash; ++ new_node->num = num; ++ new_node->next = NULL; ++ new_node->children = NULL; ++ new_node->marked = marked; ++ new_node->orig_next_node = orig_next_node; ++ return new_node; ++} ++ ++// Create the main data structure ++next_interesting_function_t create_new_next_interesting_decl(tree decl, const char *decl_name, unsigned int num, enum size_overflow_mark marked, next_interesting_function_t orig_next_node) ++{ ++ unsigned int hash; ++ const char *context; ++ enum tree_code decl_code = TREE_CODE(decl); ++ ++ gcc_assert(decl_code == FIELD_DECL || decl_code == FUNCTION_DECL || decl_code == VAR_DECL); ++ ++ if (is_vararg(decl, num)) ++ return NULL; ++ ++ hash = get_decl_hash(decl, decl_name); ++ if (hash == NO_HASH) ++ return NULL; ++ ++ gcc_assert(num <= MAX_PARAM); ++ // Clones must have an orig_next_node ++ gcc_assert(!made_by_compiler(decl) || orig_next_node); ++ ++ context = get_decl_context(decl); ++ return create_new_next_interesting_entry(decl_name, context, hash, num, marked, orig_next_node); ++} ++ ++void add_to_global_next_interesting_function(next_interesting_function_t new_entry) ++{ ++ next_interesting_function_t cur_global_head, cur_global, cur_global_end = NULL; ++ ++ // new_entry is appended to the end of a list ++ new_entry->next = NULL; ++ ++ cur_global_head = global_next_interesting_function[new_entry->hash]; ++ if (!cur_global_head) { ++ global_next_interesting_function[new_entry->hash] = new_entry; ++ return; ++ } ++ ++ ++ for (cur_global = cur_global_head; cur_global; cur_global = cur_global->next) { ++ if (!cur_global->next) ++ cur_global_end = cur_global; ++ if (compare_next_interesting_functions(cur_global, new_entry->decl_name, new_entry->context, new_entry->num)) ++ return; ++ } ++ ++ gcc_assert(cur_global_end); ++ cur_global_end->next = new_entry; ++} ++ ++/* If the interesting function is a clone then find or create its original next_interesting_function_t node ++ * and add it to global_next_interesting_function ++ */ ++static next_interesting_function_t create_orig_next_node_for_a_clone(const_tree clone_fndecl, unsigned int num, enum size_overflow_mark marked) ++{ ++ next_interesting_function_t orig_next_node; ++ tree decl; ++ unsigned int orig_num; ++ enum tree_code decl_code; ++ const char *decl_name; ++ ++ decl = get_orig_fndecl(clone_fndecl); ++ decl_code = TREE_CODE(decl); ++ ++ if (decl_code == FIELD_DECL || decl_code == VAR_DECL) ++ orig_num = num; ++ else ++ orig_num = get_correct_argnum(clone_fndecl, decl, num); ++ ++ // Skip over ISRA.162 parm decls ++ if (orig_num == CANNOT_FIND_ARG) ++ return NULL; ++ ++ decl_name = get_orig_decl_name(decl); ++ orig_next_node = get_global_next_interesting_function_entry_with_hash(decl, decl_name, orig_num, NO_SO_MARK); ++ if (orig_next_node) ++ return orig_next_node; ++ ++ orig_next_node = create_new_next_interesting_decl(decl, decl_name, orig_num, marked, NULL); ++ gcc_assert(orig_next_node); ++ ++ add_to_global_next_interesting_function(orig_next_node); ++ return orig_next_node; ++} ++ ++// Find or create the next_interesting_function_t node for decl and num ++next_interesting_function_t get_and_create_next_node_from_global_next_nodes(tree decl, unsigned int num, enum size_overflow_mark marked, next_interesting_function_t orig_next_node) ++{ ++ next_interesting_function_t cur_next_cnode; ++ const char *decl_name = DECL_NAME_POINTER(decl); ++ ++ cur_next_cnode = get_global_next_interesting_function_entry_with_hash(decl, decl_name, num, marked); ++ if (cur_next_cnode) ++ goto out; ++ ++ if (!orig_next_node && made_by_compiler(decl)) { ++ orig_next_node = create_orig_next_node_for_a_clone(decl, num, marked); ++ if (!orig_next_node) ++ return NULL; ++ } ++ ++ cur_next_cnode = create_new_next_interesting_decl(decl, decl_name, num, marked, orig_next_node); ++ if (!cur_next_cnode) ++ return NULL; ++ ++ add_to_global_next_interesting_function(cur_next_cnode); ++out: ++ if (cur_next_cnode->marked != marked && cur_next_cnode->marked == YES_SO_MARK) ++ return cur_next_cnode; ++ gcc_assert(cur_next_cnode->marked == marked); ++ return cur_next_cnode; ++} ++ ++static bool has_next_interesting_function_chain_node(next_interesting_function_t next_cnodes_head, const_tree decl, unsigned int num) ++{ ++ next_interesting_function_t cur_node; ++ const char *context, *decl_name; ++ ++ decl_name = DECL_NAME_POINTER(decl); ++ context = get_decl_context(decl); ++ for (cur_node = next_cnodes_head; cur_node; cur_node = cur_node->next) { ++ if (compare_next_interesting_functions(cur_node, decl_name, context, num)) ++ return true; ++ } ++ return false; ++} ++ ++static next_interesting_function_t handle_function(next_interesting_function_t next_cnodes_head, tree fndecl, const_tree arg) ++{ ++ unsigned int num; ++ next_interesting_function_t orig_next_node, new_node; ++ ++ gcc_assert(fndecl != NULL_TREE); ++ ++ // ignore builtins to not explode coverage (e.g., memcpy) ++ if (DECL_BUILT_IN(fndecl)) ++ return next_cnodes_head; ++ ++ // convert arg into its position ++ if (arg == NULL_TREE) ++ num = 0; ++ else ++ num = find_arg_number_tree(arg, fndecl); ++ if (num == CANNOT_FIND_ARG) ++ return next_cnodes_head; ++ ++ if (has_next_interesting_function_chain_node(next_cnodes_head, fndecl, num)) ++ return next_cnodes_head; ++ ++ if (made_by_compiler(fndecl)) { ++ orig_next_node = create_orig_next_node_for_a_clone(fndecl, num, NO_SO_MARK); ++ if (!orig_next_node) ++ return next_cnodes_head; ++ } else ++ orig_next_node = NULL; ++ new_node = create_new_next_interesting_decl(fndecl, DECL_NAME_POINTER(fndecl), num, NO_SO_MARK, orig_next_node); ++ if (!new_node) ++ return next_cnodes_head; ++ new_node->next = next_cnodes_head; ++ return new_node; ++} ++ ++static next_interesting_function_t walk_use_def_next_functions_phi(gimple_set *visited, next_interesting_function_t next_cnodes_head, const_tree result) ++{ ++ gphi *phi = as_a_gphi(get_def_stmt(result)); ++ unsigned int i, n = gimple_phi_num_args(phi); ++ ++ pointer_set_insert(visited, phi); ++ for (i = 0; i < n; i++) { ++ tree arg = gimple_phi_arg_def(phi, i); ++ ++ next_cnodes_head = walk_use_def_next_functions(visited, next_cnodes_head, arg); ++ } ++ ++ return next_cnodes_head; ++} ++ ++static next_interesting_function_t walk_use_def_next_functions_binary(gimple_set *visited, next_interesting_function_t next_cnodes_head, const_tree lhs) ++{ ++ gassign *def_stmt = as_a_gassign(get_def_stmt(lhs)); ++ tree rhs1, rhs2; ++ ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ rhs2 = gimple_assign_rhs2(def_stmt); ++ ++ next_cnodes_head = walk_use_def_next_functions(visited, next_cnodes_head, rhs1); ++ return walk_use_def_next_functions(visited, next_cnodes_head, rhs2); ++} ++ ++next_interesting_function_t __attribute__((weak)) handle_function_ptr_ret(gimple_set *visited __unused, next_interesting_function_t next_cnodes_head, const_tree fn_ptr __unused) ++{ ++ return next_cnodes_head; ++} ++ ++/* Find all functions that influence lhs ++ * ++ * Encountered functions are added to the children vector (next_interesting_function_t). ++ */ ++static next_interesting_function_t walk_use_def_next_functions(gimple_set *visited, next_interesting_function_t next_cnodes_head, const_tree lhs) ++{ ++ const_gimple def_stmt; ++ ++ if (skip_types(lhs)) ++ return next_cnodes_head; ++ ++ if (TREE_CODE(lhs) == PARM_DECL) ++ return handle_function(next_cnodes_head, current_function_decl, lhs); ++ ++ if (TREE_CODE(lhs) != SSA_NAME) ++ return next_cnodes_head; ++ ++ def_stmt = get_def_stmt(lhs); ++ if (!def_stmt) ++ return next_cnodes_head; ++ ++ if (pointer_set_insert(visited, def_stmt)) ++ return next_cnodes_head; ++ ++ switch (gimple_code(def_stmt)) { ++ case GIMPLE_NOP: ++ return walk_use_def_next_functions(visited, next_cnodes_head, SSA_NAME_VAR(lhs)); ++ case GIMPLE_ASM: ++ if (is_size_overflow_asm(def_stmt)) ++ return walk_use_def_next_functions(visited, next_cnodes_head, get_size_overflow_asm_input(as_a_const_gasm(def_stmt))); ++ return next_cnodes_head; ++ case GIMPLE_CALL: { ++ tree fndecl = gimple_call_fndecl(def_stmt); ++ ++ if (fndecl != NULL_TREE) ++ return handle_function(next_cnodes_head, fndecl, NULL_TREE); ++ fndecl = gimple_call_fn(def_stmt); ++ return handle_function_ptr_ret(visited, next_cnodes_head, fndecl); ++ } ++ case GIMPLE_PHI: ++ return walk_use_def_next_functions_phi(visited, next_cnodes_head, lhs); ++ case GIMPLE_ASSIGN: ++ switch (gimple_num_ops(def_stmt)) { ++ case 2: ++ return walk_use_def_next_functions(visited, next_cnodes_head, gimple_assign_rhs1(def_stmt)); ++ case 3: ++ return walk_use_def_next_functions_binary(visited, next_cnodes_head, lhs); ++ } ++ default: ++ debug_gimple_stmt((gimple)def_stmt); ++ error("%s: unknown gimple code", __func__); ++ gcc_unreachable(); ++ } ++} ++ ++// Start the search for next_interesting_function_t children based on the (next_interesting_function_t) parent node ++static next_interesting_function_t search_next_functions(const_tree node) ++{ ++ gimple_set *visited; ++ next_interesting_function_t next_cnodes_head; ++ ++ visited = pointer_set_create(); ++ next_cnodes_head = walk_use_def_next_functions(visited, NULL, node); ++ pointer_set_destroy(visited); ++ ++ return next_cnodes_head; ++} ++ ++// True if child already exists in the next_interesting_function_t children vector ++bool has_next_interesting_function_vec(next_interesting_function_t target, next_interesting_function_t next_node) ++{ ++ unsigned int i; ++ next_interesting_function_t cur; ++ ++ gcc_assert(next_node); ++ // handle recursion ++ if (!strcmp(target->decl_name, next_node->decl_name) && target->num == next_node->num) ++ return true; ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ if (VEC_empty(next_interesting_function_t, target->children)) ++ return false; ++ FOR_EACH_VEC_ELT(next_interesting_function_t, target->children, i, cur) { ++#else ++ FOR_EACH_VEC_SAFE_ELT(target->children, i, cur) { ++#endif ++ if (compare_next_interesting_functions(cur, next_node->decl_name, next_node->context, next_node->num)) ++ return true; ++ } ++ return false; ++} ++ ++void push_child(next_interesting_function_t parent, next_interesting_function_t child) ++{ ++ if (!has_next_interesting_function_vec(parent, child)) { ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC_safe_push(next_interesting_function_t, heap, parent->children, child); ++#else ++ vec_safe_push(parent->children, child); ++#endif ++ } ++} ++ ++void __attribute__((weak)) check_local_variables(next_interesting_function_t next_node __unused) {} ++ ++// Add children to parent and global_next_interesting_function ++static void collect_data_for_execute(next_interesting_function_t parent, next_interesting_function_t children) ++{ ++ next_interesting_function_t cur = children; ++ ++ gcc_assert(parent); ++ ++ while (cur) { ++ next_interesting_function_t next, child; ++ ++ next = cur->next; ++ ++ child = get_global_next_interesting_function_entry(cur->decl_name, cur->context, cur->hash, cur->num, NO_SO_MARK); ++ if (!child) { ++ add_to_global_next_interesting_function(cur); ++ child = cur; ++ } ++ ++ check_local_variables(child); ++ ++ push_child(parent, child); ++ ++ cur = next; ++ } ++ ++ check_local_variables(parent); ++} ++ ++next_interesting_function_t __attribute__((weak)) get_and_create_next_node_from_global_next_nodes_fnptr(const_tree fn_ptr __unused, unsigned int num __unused, enum size_overflow_mark marked __unused) ++{ ++ return NULL; ++} ++ ++static next_interesting_function_t create_parent_next_cnode(const_gimple stmt, unsigned int num) ++{ ++ switch (gimple_code(stmt)) { ++ case GIMPLE_ASM: ++ return get_and_create_next_node_from_global_next_nodes(current_function_decl, num, ASM_STMT_SO_MARK, NULL); ++ case GIMPLE_CALL: { ++ tree decl = gimple_call_fndecl(stmt); ++ ++ if (decl != NULL_TREE) ++ return get_and_create_next_node_from_global_next_nodes(decl, num, NO_SO_MARK, NULL); ++ decl = gimple_call_fn(stmt); ++ return get_and_create_next_node_from_global_next_nodes_fnptr(decl, num, NO_SO_MARK); ++ } ++ case GIMPLE_RETURN: ++ return get_and_create_next_node_from_global_next_nodes(current_function_decl, num, NO_SO_MARK, NULL); ++ default: ++ debug_gimple_stmt((gimple)stmt); ++ gcc_unreachable(); ++ } ++} ++ ++// Handle potential next_interesting_function_t parent if its argument has an integer type ++static void collect_all_possible_size_overflow_fns(const_gimple stmt, unsigned int num) ++{ ++ const_tree start_var; ++ next_interesting_function_t children_next_cnode, parent_next_cnode; ++ ++ switch (gimple_code(stmt)) { ++ case GIMPLE_ASM: ++ if (!is_size_overflow_insert_check_asm(as_a_const_gasm(stmt))) ++ return; ++ start_var = get_size_overflow_asm_input(as_a_const_gasm(stmt)); ++ gcc_assert(start_var != NULL_TREE); ++ break; ++ case GIMPLE_CALL: ++ start_var = gimple_call_arg(stmt, num - 1); ++ break; ++ case GIMPLE_RETURN: ++ start_var = gimple_return_retval(as_a_const_greturn(stmt)); ++ if (start_var == NULL_TREE) ++ return; ++ break; ++ default: ++ debug_gimple_stmt((gimple)stmt); ++ gcc_unreachable(); ++ } ++ ++ if (skip_types(start_var)) ++ return; ++ ++ // handle intentional MARK_TURN_OFF ++ if (check_intentional_asm(stmt, num) == MARK_TURN_OFF) ++ return; ++ ++ parent_next_cnode = create_parent_next_cnode(stmt, num); ++ if (!parent_next_cnode) ++ return; ++ ++ children_next_cnode = search_next_functions(start_var); ++ collect_data_for_execute(parent_next_cnode, children_next_cnode); ++} ++ ++// Find potential next_interesting_function_t parents ++static void handle_cgraph_node(struct cgraph_node *node) ++{ ++ basic_block bb; ++ tree cur_fndecl = NODE_DECL(node); ++ ++ set_current_function_decl(cur_fndecl); ++ ++ FOR_ALL_BB_FN(bb, cfun) { ++ gimple_stmt_iterator gsi; ++ ++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { ++ gimple stmt = gsi_stmt(gsi); ++ ++ switch (gimple_code(stmt)) { ++ case GIMPLE_RETURN: ++ case GIMPLE_ASM: ++ collect_all_possible_size_overflow_fns(stmt, 0); ++ break; ++ case GIMPLE_CALL: { ++ unsigned int i, len; ++ tree fndecl = gimple_call_fndecl(stmt); ++ ++ if (fndecl != NULL_TREE && DECL_BUILT_IN(fndecl)) ++ break; ++ ++ len = gimple_call_num_args(stmt); ++ for (i = 0; i < len; i++) ++ collect_all_possible_size_overflow_fns(stmt, i + 1); ++ break; ++ } ++ default: ++ break; ++ } ++ } ++ } ++ ++ unset_current_function_decl(); ++} ++ ++/* Collect all potentially interesting function parameters and return values of integer types ++ * and store their data flow dependencies ++ */ ++static void size_overflow_generate_summary(void) ++{ ++ struct cgraph_node *node; ++ ++ size_overflow_register_hooks(); ++ ++ FOR_EACH_FUNCTION(node) { ++ if (is_valid_cgraph_node(node)) ++ handle_cgraph_node(node); ++ } ++} ++ ++static void size_overflow_function_insertion_hook(struct cgraph_node *node __unused, void *data __unused) ++{ ++ debug_cgraph_node(node); ++ gcc_unreachable(); ++} ++ ++/* Handle dst if src is in the global_next_interesting_function list. ++ * If src is a clone then dst inherits the orig_next_node of src otherwise ++ * src will become the orig_next_node of dst. ++ */ ++static void size_overflow_node_duplication_hook(struct cgraph_node *src, struct cgraph_node *dst, void *data __unused) ++{ ++ next_interesting_function_t head, cur; ++ const_tree decl; ++ const char *src_name, *src_context; ++ ++ decl = NODE_DECL(src); ++ src_name = DECL_NAME_POINTER(decl); ++ src_context = get_decl_context(decl); ++ ++ head = get_global_next_interesting_function_entry_with_hash(decl, src_name, NONE_ARGNUM, NO_SO_MARK); ++ if (!head) ++ return; ++ ++ for (cur = head; cur; cur = cur->next) { ++ unsigned int new_argnum; ++ next_interesting_function_t orig_next_node, next_node; ++ bool dst_clone; ++ ++ if (!compare_next_interesting_functions(cur, src_name, src_context, CANNOT_FIND_ARG)) ++ continue; ++ ++ dst_clone = made_by_compiler(NODE_DECL(dst)); ++ if (!dst_clone) ++ break; ++ ++ // For clones use the original node instead ++ if (cur->orig_next_node) ++ orig_next_node = cur->orig_next_node; ++ else ++ orig_next_node = cur; ++ ++ new_argnum = get_correct_argnum_fndecl(NODE_DECL(src), NODE_DECL(dst), cur->num); ++ if (new_argnum == CANNOT_FIND_ARG) ++ continue; ++ ++ next_node = create_new_next_interesting_decl(NODE_DECL(dst), cgraph_node_name(dst), new_argnum, cur->marked, orig_next_node); ++ if (next_node) ++ add_to_global_next_interesting_function(next_node); ++ } ++} ++ ++void size_overflow_register_hooks(void) ++{ ++ static bool init_p = false; ++ ++ if (init_p) ++ return; ++ init_p = true; ++ ++ function_insertion_hook_holder = cgraph_add_function_insertion_hook(&size_overflow_function_insertion_hook, NULL); ++ node_duplication_hook_holder = cgraph_add_node_duplication_hook(&size_overflow_node_duplication_hook, NULL); ++} ++ ++static void set_yes_so_mark(next_interesting_function_t next_node) ++{ ++ next_node->marked = YES_SO_MARK; ++ // Mark the orig decl as well if it's a clone ++ if (next_node->orig_next_node) ++ next_node->orig_next_node->marked = YES_SO_MARK; ++} ++ ++// Determine if the function is already in the hash table ++static bool is_marked_fn(next_interesting_function_t next_node) ++{ ++ const struct size_overflow_hash *entry; ++ ++ if (next_node->marked != NO_SO_MARK) ++ return true; ++ ++ if (next_node->orig_next_node) ++ entry = get_size_overflow_hash_entry(next_node->orig_next_node->hash, next_node->orig_next_node->decl_name, next_node->orig_next_node->num); ++ else ++ entry = get_size_overflow_hash_entry(next_node->hash, next_node->decl_name, next_node->num); ++ if (!entry) ++ return false; ++ ++ set_yes_so_mark(next_node); ++ return true; ++} ++ ++// Determine if any of the function pointer targets have data flow between the return value and one of the arguments ++static next_interesting_function_t get_same_not_ret_child(next_interesting_function_t parent) ++{ ++ unsigned int i; ++ next_interesting_function_t child; ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ if (VEC_empty(next_interesting_function_t, parent->children)) ++ return NULL; ++ FOR_EACH_VEC_ELT(next_interesting_function_t, parent->children, i, child) { ++#else ++ FOR_EACH_VEC_SAFE_ELT(parent->children, i, child) { ++#endif ++ if (child->num == 0) ++ continue; ++ if (strcmp(parent->decl_name, child->decl_name)) ++ continue; ++ if (!strcmp(child->context, "fndecl")) ++ return child; ++ } ++ return NULL; ++} ++ ++/* Trace a return value of function pointer type back to an argument via a concrete function ++ fnptr 0 && fn 0 && (fn 0 -> fn 2) => fnptr 2 */ ++static void search_missing_fptr_arg(next_interesting_function_t parent) ++{ ++ next_interesting_function_t tracked_fn, cur_next_node, child; ++ unsigned int i; ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC(next_interesting_function_t, heap) *new_children = NULL; ++#else ++ vec<next_interesting_function_t, va_heap, vl_embed> *new_children = NULL; ++#endif ++ ++ if (parent->num != 0) ++ return; ++ if (!strcmp(parent->context, "fndecl")) ++ return; ++ if (!strcmp(parent->context, "vardecl")) ++ return; ++ ++ // fnptr 0 && fn 0 ++#if BUILDING_GCC_VERSION <= 4007 ++ if (VEC_empty(next_interesting_function_t, parent->children)) ++ return; ++ FOR_EACH_VEC_ELT(next_interesting_function_t, parent->children, i, child) { ++#else ++ FOR_EACH_VEC_SAFE_ELT(parent->children, i, child) { ++#endif ++ if (child->num != 0) ++ continue; ++ // (fn 0 -> fn 2) ++ tracked_fn = get_same_not_ret_child(child); ++ if (!tracked_fn) ++ continue; ++ ++ // fn 2 => fnptr 2 ++ for (cur_next_node = global_next_interesting_function[parent->hash]; cur_next_node; cur_next_node = cur_next_node->next) { ++ if (cur_next_node->num != tracked_fn->num) ++ continue; ++ if (strcmp(parent->decl_name, cur_next_node->decl_name)) ++ continue; ++ if (!has_next_interesting_function_vec(parent, cur_next_node)) { ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC_safe_push(next_interesting_function_t, heap, new_children, cur_next_node); ++#else ++ vec_safe_push(new_children, cur_next_node); ++#endif ++ } ++ } ++ } ++ ++#if BUILDING_GCC_VERSION == 4005 ++ if (VEC_empty(next_interesting_function_t, new_children)) ++ return; ++ FOR_EACH_VEC_ELT(next_interesting_function_t, new_children, i, child) ++ VEC_safe_push(next_interesting_function_t, heap, parent->children, child); ++#elif BUILDING_GCC_VERSION <= 4007 ++ VEC_safe_splice(next_interesting_function_t, heap, parent->children, new_children); ++#else ++ vec_safe_splice(parent->children, new_children); ++#endif ++} ++ ++// Do a depth-first recursive dump of the next_interesting_function_t children vector ++static void print_missing_functions(next_interesting_function_set *visited, next_interesting_function_t parent) ++{ ++ unsigned int i; ++ next_interesting_function_t child; ++ ++ gcc_assert(parent); ++ check_global_variables(parent); ++ search_missing_fptr_arg(parent); ++ print_missing_function(parent); ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ if (VEC_empty(next_interesting_function_t, parent->children)) ++ return; ++ FOR_EACH_VEC_ELT(next_interesting_function_t, parent->children, i, child) { ++#else ++ FOR_EACH_VEC_SAFE_ELT(parent->children, i, child) { ++#endif ++ // Since the parent is a marked function we will set YES_SO_MARK on the children to transform them as well ++ child->marked = YES_SO_MARK; ++ if (!pointer_set_insert(visited, child)) ++ print_missing_functions(visited, child); ++ } ++} ++ ++void __attribute__((weak)) check_global_variables(next_interesting_function_t cur_global __unused) {} ++ ++// Print all missing interesting functions ++static unsigned int size_overflow_execute(void) ++{ ++ unsigned int i; ++ next_interesting_function_set *visited; ++ next_interesting_function_t cur_global; ++ ++ visited = next_interesting_function_pointer_set_create(); ++ ++ for (i = 0; i < GLOBAL_NIFN_LEN; i++) { ++ for (cur_global = global_next_interesting_function[i]; cur_global; cur_global = cur_global->next) { ++ if (is_marked_fn(cur_global)) ++ print_missing_functions(visited, cur_global); ++ } ++ } ++ ++ pointer_set_destroy(visited); ++ ++/* if (in_lto_p) { ++ fprintf(stderr, "%s: SIZE_OVERFLOW EXECUTE\n", __func__); ++ print_global_next_interesting_functions(); ++ }*/ ++ ++ return 0; ++} ++ ++// Omit the IPA/LTO callbacks until https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61311 gets fixed (license concerns) ++#if BUILDING_GCC_VERSION >= 4008 ++void __attribute__((weak)) size_overflow_write_summary_lto(void) {} ++#elif BUILDING_GCC_VERSION >= 4006 ++void __attribute__((weak)) size_overflow_write_summary_lto(cgraph_node_set set __unused, varpool_node_set vset __unused) {} ++#else ++void __attribute__((weak)) size_overflow_write_summary_lto(cgraph_node_set set __unused) {} ++#endif ++ ++void __attribute__((weak)) size_overflow_read_summary_lto(void) {} ++ ++#if BUILDING_GCC_VERSION >= 4009 ++static const struct pass_data size_overflow_functions_pass_data = { ++#else ++static struct ipa_opt_pass_d size_overflow_functions_pass = { ++ .pass = { ++#endif ++ .type = IPA_PASS, ++ .name = "size_overflow_functions", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION >= 4009 ++ .has_gate = false, ++ .has_execute = true, ++#else ++ .gate = NULL, ++ .execute = size_overflow_execute, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = 0, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = 0, ++#if BUILDING_GCC_VERSION < 4009 ++ }, ++ .generate_summary = size_overflow_generate_summary, ++ .write_summary = size_overflow_write_summary_lto, ++ .read_summary = size_overflow_read_summary_lto, ++#if BUILDING_GCC_VERSION >= 4006 ++ .write_optimization_summary = size_overflow_write_summary_lto, ++ .read_optimization_summary = size_overflow_read_summary_lto, ++#endif ++ .stmt_fixup = NULL, ++ .function_transform_todo_flags_start = 0, ++ .function_transform = size_overflow_transform, ++ .variable_transform = NULL, ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++class size_overflow_functions_pass : public ipa_opt_pass_d { ++public: ++ size_overflow_functions_pass() : ipa_opt_pass_d(size_overflow_functions_pass_data, ++ g, ++ size_overflow_generate_summary, ++ size_overflow_write_summary_lto, ++ size_overflow_read_summary_lto, ++ size_overflow_write_summary_lto, ++ size_overflow_read_summary_lto, ++ NULL, ++ 0, ++ size_overflow_transform, ++ NULL) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return size_overflow_execute(); } ++#else ++ unsigned int execute() { return size_overflow_execute(); } ++#endif ++}; ++} ++ ++opt_pass *make_size_overflow_functions_pass(void) ++{ ++ return new size_overflow_functions_pass(); ++} ++#else ++struct opt_pass *make_size_overflow_functions_pass(void) ++{ ++ return &size_overflow_functions_pass.pass; ++} ++#endif +diff --git a/tools/gcc/size_overflow_plugin/size_overflow_plugin.c b/tools/gcc/size_overflow_plugin/size_overflow_plugin.c +new file mode 100644 +index 0000000..cf8320d +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/size_overflow_plugin.c +@@ -0,0 +1,256 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++int plugin_is_GPL_compatible; ++ ++tree report_size_overflow_decl; ++ ++tree size_overflow_type_HI; ++tree size_overflow_type_SI; ++tree size_overflow_type_DI; ++tree size_overflow_type_TI; ++ ++static struct plugin_info size_overflow_plugin_info = { ++ .version = "20150429", ++ .help = "no-size-overflow\tturn off size overflow checking\n", ++}; ++ ++static tree handle_size_overflow_attribute(tree *node, tree __unused name, tree args, int __unused flags, bool *no_add_attrs) ++{ ++ unsigned int arg_count; ++ enum tree_code code = TREE_CODE(*node); ++ ++ switch (code) { ++ case FUNCTION_DECL: ++ arg_count = type_num_arguments(TREE_TYPE(*node)); ++ break; ++ case FUNCTION_TYPE: ++ case METHOD_TYPE: ++ arg_count = type_num_arguments(*node); ++ break; ++ default: ++ *no_add_attrs = true; ++ error("%s: %qE attribute only applies to functions", __func__, name); ++ return NULL_TREE; ++ } ++ ++ for (; args; args = TREE_CHAIN(args)) { ++ int cur_val; ++ tree position = TREE_VALUE(args); ++ ++ if (TREE_CODE(position) != INTEGER_CST) { ++ error("%s: parameter isn't an integer", __func__); ++ debug_tree(args); ++ *no_add_attrs = true; ++ return NULL_TREE; ++ } ++ ++ cur_val = tree_to_shwi(position); ++ if (cur_val < 0 || arg_count < (unsigned int)cur_val) { ++ error("%s: parameter %d is outside range.", __func__, cur_val); ++ *no_add_attrs = true; ++ return NULL_TREE; ++ } ++ } ++ return NULL_TREE; ++} ++ ++static tree handle_intentional_overflow_attribute(tree *node, tree __unused name, tree args, int __unused flags, bool *no_add_attrs) ++{ ++ unsigned int arg_count; ++ HOST_WIDE_INT s_first_arg; ++ enum tree_code code = TREE_CODE(*node); ++ ++ switch (code) { ++ case FUNCTION_DECL: ++ arg_count = type_num_arguments(TREE_TYPE(*node)); ++ break; ++ case FUNCTION_TYPE: ++ case METHOD_TYPE: ++ arg_count = type_num_arguments(*node); ++ break; ++ case FIELD_DECL: ++ return NULL_TREE; ++ default: ++ *no_add_attrs = true; ++ error("%qE attribute only applies to functions", name); ++ return NULL_TREE; ++ } ++ ++ s_first_arg = tree_to_shwi(TREE_VALUE(args)); ++ if (s_first_arg == -1) ++ return NULL_TREE; ++ if (s_first_arg < -1) ++ error("%s: parameter %d is outside range.", __func__, (int)s_first_arg); ++ ++ for (; args; args = TREE_CHAIN(args)) { ++ unsigned int cur_val; ++ ++ if (TREE_CODE(TREE_VALUE(args)) != INTEGER_CST) { ++ error("%s: parameter isn't an integer", __func__); ++ debug_tree(args); ++ *no_add_attrs = true; ++ return NULL_TREE; ++ } ++ ++ cur_val = (unsigned int)tree_to_uhwi(TREE_VALUE(args)); ++ if (cur_val > arg_count ) { ++ error("%s: parameter %u is outside range. (arg_count: %u)", __func__, cur_val, arg_count); ++ *no_add_attrs = true; ++ return NULL_TREE; ++ } ++ } ++ return NULL_TREE; ++} ++ ++static struct attribute_spec size_overflow_attr = { ++ .name = "size_overflow", ++ .min_length = 1, ++ .max_length = -1, ++ .decl_required = true, ++ .type_required = false, ++ .function_type_required = false, ++ .handler = handle_size_overflow_attribute, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = false ++#endif ++}; ++ ++static struct attribute_spec intentional_overflow_attr = { ++ .name = "intentional_overflow", ++ .min_length = 1, ++ .max_length = -1, ++ .decl_required = true, ++ .type_required = false, ++ .function_type_required = false, ++ .handler = handle_intentional_overflow_attribute, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = false ++#endif ++}; ++ ++static void register_attributes(void __unused *event_data, void __unused *data) ++{ ++ register_attribute(&size_overflow_attr); ++ register_attribute(&intentional_overflow_attr); ++} ++ ++static tree create_typedef(tree type, const char* ident) ++{ ++ tree new_type, decl; ++ ++ new_type = build_variant_type_copy(type); ++ decl = build_decl(BUILTINS_LOCATION, TYPE_DECL, get_identifier(ident), new_type); ++ DECL_ORIGINAL_TYPE(decl) = type; ++ TYPE_NAME(new_type) = decl; ++ return new_type; ++} ++ ++// Create the noreturn report_size_overflow() function decl. ++static void size_overflow_start_unit(void __unused *gcc_data, void __unused *user_data) ++{ ++ tree const_char_ptr_type_node; ++ tree fntype; ++ ++ const_char_ptr_type_node = build_pointer_type(build_type_variant(char_type_node, 1, 0)); ++ ++ size_overflow_type_HI = create_typedef(intHI_type_node, "size_overflow_type_HI"); ++ size_overflow_type_SI = create_typedef(intSI_type_node, "size_overflow_type_SI"); ++ size_overflow_type_DI = create_typedef(intDI_type_node, "size_overflow_type_DI"); ++ size_overflow_type_TI = create_typedef(intTI_type_node, "size_overflow_type_TI"); ++ ++ // void report_size_overflow(const char *loc_file, unsigned int loc_line, const char *current_func, const char *ssa_var) ++ fntype = build_function_type_list(void_type_node, ++ const_char_ptr_type_node, ++ unsigned_type_node, ++ const_char_ptr_type_node, ++ const_char_ptr_type_node, ++ NULL_TREE); ++ report_size_overflow_decl = build_fn_decl("report_size_overflow", fntype); ++ ++ DECL_ASSEMBLER_NAME(report_size_overflow_decl); ++ TREE_PUBLIC(report_size_overflow_decl) = 1; ++ DECL_EXTERNAL(report_size_overflow_decl) = 1; ++ DECL_ARTIFICIAL(report_size_overflow_decl) = 1; ++ TREE_THIS_VOLATILE(report_size_overflow_decl) = 1; ++// !!! ++ DECL_PRESERVE_P(report_size_overflow_decl) = 1; ++ DECL_UNINLINABLE(report_size_overflow_decl) = 1; ++ TREE_USED(report_size_overflow_decl) = 1; ++ TREE_NOTHROW(report_size_overflow_decl) = 1; ++} ++ ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ int i; ++ const char * const plugin_name = plugin_info->base_name; ++ const int argc = plugin_info->argc; ++ const struct plugin_argument * const argv = plugin_info->argv; ++ bool enable = true; ++ struct register_pass_info insert_size_overflow_asm_pass_info; ++ struct register_pass_info size_overflow_functions_pass_info; ++ ++ static const struct ggc_root_tab gt_ggc_r_gt_size_overflow[] = { ++ { ++ .base = &report_size_overflow_decl, ++ .nelt = 1, ++ .stride = sizeof(report_size_overflow_decl), ++ .cb = >_ggc_mx_tree_node, ++ .pchw = >_pch_nx_tree_node ++ }, ++ LAST_GGC_ROOT_TAB ++ }; ++ ++ insert_size_overflow_asm_pass_info.pass = make_insert_size_overflow_asm_pass(); ++ insert_size_overflow_asm_pass_info.reference_pass_name = "ssa"; ++ insert_size_overflow_asm_pass_info.ref_pass_instance_number = 1; ++ insert_size_overflow_asm_pass_info.pos_op = PASS_POS_INSERT_AFTER; ++ ++ size_overflow_functions_pass_info.pass = make_size_overflow_functions_pass(); ++ size_overflow_functions_pass_info.reference_pass_name = "inline"; ++ size_overflow_functions_pass_info.ref_pass_instance_number = 1; ++ size_overflow_functions_pass_info.pos_op = PASS_POS_INSERT_AFTER; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ for (i = 0; i < argc; ++i) { ++ if (!strcmp(argv[i].key, "no-size-overflow")) { ++ enable = false; ++ continue; ++ } ++ error(G_("unkown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &size_overflow_plugin_info); ++ if (enable) { ++ register_callback(plugin_name, PLUGIN_START_UNIT, &size_overflow_start_unit, NULL); ++ register_callback(plugin_name, PLUGIN_REGISTER_GGC_ROOTS, NULL, (void *)>_ggc_r_gt_size_overflow); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &insert_size_overflow_asm_pass_info); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &size_overflow_functions_pass_info); ++ } ++ register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL); ++ ++ return 0; ++} +diff --git a/tools/gcc/size_overflow_plugin/size_overflow_plugin_hash.c b/tools/gcc/size_overflow_plugin/size_overflow_plugin_hash.c +new file mode 100644 +index 0000000..1d9ddb6 +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/size_overflow_plugin_hash.c +@@ -0,0 +1,345 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++#include "size_overflow_hash.h" ++#include "size_overflow_hash_aux.h" ++ ++static const_tree get_function_type(const_tree decl) ++{ ++ if (FUNCTION_PTR_P(decl)) ++ return TREE_TYPE(TREE_TYPE(decl)); ++ gcc_assert(TREE_CODE(decl) == FUNCTION_DECL); ++ return TREE_TYPE(decl); ++} ++ ++static unsigned char get_tree_code(const_tree type) ++{ ++ switch (TREE_CODE(type)) { ++ case ARRAY_TYPE: ++ return 0; ++ case BOOLEAN_TYPE: ++ return 1; ++ case ENUMERAL_TYPE: ++ return 2; ++ case FUNCTION_TYPE: ++ return 3; ++ case INTEGER_TYPE: ++ return 4; ++ case POINTER_TYPE: ++ return 5; ++ case RECORD_TYPE: ++ return 6; ++ case UNION_TYPE: ++ return 7; ++ case VOID_TYPE: ++ return 8; ++ case REAL_TYPE: ++ return 9; ++ case VECTOR_TYPE: ++ return 10; ++ case REFERENCE_TYPE: ++ return 11; ++ case OFFSET_TYPE: ++ return 12; ++ case COMPLEX_TYPE: ++ return 13; ++ default: ++ debug_tree((tree)type); ++ gcc_unreachable(); ++ } ++} ++ ++// http://www.team5150.com/~andrew/noncryptohashzoo2~/CrapWow.html ++static unsigned int CrapWow(const char *key, unsigned int len, unsigned int seed) ++{ ++#define cwfold( a, b, lo, hi ) { p = (unsigned int)(a) * (unsigned long long)(b); lo ^= (unsigned int)p; hi ^= (unsigned int)(p >> 32); } ++#define cwmixa( in ) { cwfold( in, m, k, h ); } ++#define cwmixb( in ) { cwfold( in, n, h, k ); } ++ ++ unsigned int m = 0x57559429; ++ unsigned int n = 0x5052acdb; ++ const unsigned int *key4 = (const unsigned int *)key; ++ unsigned int h = len; ++ unsigned int k = len + seed + n; ++ unsigned long long p; ++ ++ while (len >= 8) { ++ cwmixb(key4[0]) cwmixa(key4[1]) key4 += 2; ++ len -= 8; ++ } ++ if (len >= 4) { ++ cwmixb(key4[0]) key4 += 1; ++ len -= 4; ++ } ++ if (len) ++ cwmixa(key4[0] & ((1 << (len * 8)) - 1 )); ++ cwmixb(h ^ (k + n)); ++ return k ^ h; ++ ++#undef cwfold ++#undef cwmixa ++#undef cwmixb ++} ++ ++// For function pointer fields include the structure name in the hash ++static unsigned int get_type_name_hash(const_tree decl) ++{ ++ const char *type_str; ++ unsigned int type_name_len; ++ ++ if (!FUNCTION_PTR_P(decl)) ++ return 0; ++ if (TREE_CODE(decl) == VAR_DECL) ++ return 0; ++ ++ gcc_assert(TREE_CODE(decl) == FIELD_DECL); ++ type_str = get_type_name_from_field(decl); ++ if (!type_str) ++ return 0; ++ type_name_len = strlen(type_str); ++ return CrapWow(type_str, type_name_len, 0) & 0xffff; ++} ++ ++static void set_hash(struct decl_hash *decl_hash_data) ++{ ++ unsigned int fn, type, codes, seed = 0; ++ ++ fn = CrapWow(decl_hash_data->fn_name, strlen(decl_hash_data->fn_name), seed) & 0xffff; ++ codes = CrapWow((const char*)decl_hash_data->tree_codes, decl_hash_data->tree_codes_len, seed) & 0xffff; ++ type = get_type_name_hash(decl_hash_data->decl); ++ decl_hash_data->hash = type ^ fn ^ codes; ++} ++ ++static void set_decl_type_codes(const_tree type, struct decl_hash *decl_hash_data) ++{ ++ gcc_assert(type != NULL_TREE); ++ gcc_assert(TREE_CODE_CLASS(TREE_CODE(type)) == tcc_type); ++ ++ while (type && decl_hash_data->tree_codes_len < CODES_LIMIT) { ++ decl_hash_data->tree_codes[decl_hash_data->tree_codes_len] = get_tree_code(type); ++ decl_hash_data->tree_codes_len++; ++ type = TREE_TYPE(type); ++ } ++} ++ ++static void set_result_codes(const_tree node, struct decl_hash *decl_hash_data) ++{ ++ const_tree result; ++ ++ gcc_assert(node != NULL_TREE); ++ ++ if (DECL_P(node)) { ++ result = DECL_RESULT(node); ++ if (result != NULL_TREE) ++ return set_decl_type_codes(TREE_TYPE(result), decl_hash_data); ++ return set_result_codes(TREE_TYPE(node), decl_hash_data); ++ } ++ ++ gcc_assert(TYPE_P(node)); ++ ++ if (TREE_CODE(node) == FUNCTION_TYPE) ++ return set_result_codes(TREE_TYPE(node), decl_hash_data); ++ ++ return set_decl_type_codes(node, decl_hash_data); ++} ++ ++static void set_decl_codes(struct decl_hash *decl_hash_data) ++{ ++ const_tree arg, type; ++ enum tree_code code; ++ ++ if (TREE_CODE(decl_hash_data->decl) == VAR_DECL) { ++ set_decl_type_codes(TREE_TYPE(decl_hash_data->decl), decl_hash_data); ++ return; ++ } ++ ++ type = get_function_type(decl_hash_data->decl); ++ code = TREE_CODE(type); ++ gcc_assert(code == FUNCTION_TYPE || code == METHOD_TYPE); ++ ++ if (FUNCTION_PTR_P(decl_hash_data->decl)) ++ set_result_codes(type, decl_hash_data); ++ else ++ set_result_codes(decl_hash_data->decl, decl_hash_data); ++ ++ for (arg = TYPE_ARG_TYPES(type); arg != NULL_TREE && decl_hash_data->tree_codes_len < CODES_LIMIT; arg = TREE_CHAIN(arg)) ++ set_decl_type_codes(TREE_VALUE(arg), decl_hash_data); ++} ++ ++static const struct size_overflow_hash *get_proper_hash_chain(const struct size_overflow_hash *entry, const char *func_name) ++{ ++ while (entry) { ++ if (!strcmp(entry->name, func_name)) ++ return entry; ++ entry = entry->next; ++ } ++ return NULL; ++} ++ ++unsigned int get_decl_hash(const_tree decl, const char *decl_name) ++{ ++ struct decl_hash decl_hash_data; ++ enum tree_code code = TREE_CODE(decl); ++ ++ gcc_assert(code == FIELD_DECL || code == FUNCTION_DECL || code == VAR_DECL); ++ ++ // skip builtins __builtin_constant_p ++ if (code == FUNCTION_DECL && DECL_BUILT_IN(decl)) ++ return NO_HASH; ++ ++ decl_hash_data.fn_name = decl_name; ++ decl_hash_data.decl = decl; ++ decl_hash_data.tree_codes_len = 0; ++ ++ set_decl_codes(&decl_hash_data); ++ gcc_assert(decl_hash_data.tree_codes_len != 0); ++ set_hash(&decl_hash_data); ++ return decl_hash_data.hash; ++} ++ ++const char *get_orig_decl_name(const_tree decl) ++{ ++ const char *name; ++ unsigned int len; ++ const void *end; ++ const_tree orig_decl = DECL_ORIGIN(decl); ++ ++ len = DECL_NAME_LENGTH(orig_decl); ++ name = DECL_NAME_POINTER(orig_decl); ++ ++ /* Sometimes gcc loses the original cgraph node leaving only clones behind. ++ * In such cases we will extract the name from the clone and use it in the hash table ++ * without checking the parameter number on the original (unavailable) decl. ++ */ ++ ++ if (made_by_compiler(orig_decl)) { ++ end = memchr(name, '.', len); ++ gcc_assert(end); ++ len = (long)end - (long)name; ++ gcc_assert(len > 0); ++ } ++ ++ return xstrndup(name, len); ++} ++ ++const struct size_overflow_hash *get_size_overflow_hash_entry(unsigned int hash, const char *decl_name, unsigned int argnum) ++{ ++ const struct size_overflow_hash *entry, *entry_node; ++ ++ entry = size_overflow_hash[hash]; ++ entry_node = get_proper_hash_chain(entry, decl_name); ++ if (entry_node && entry_node->param & (1U << argnum)) ++ return entry_node; ++ ++ entry = size_overflow_hash_aux[hash]; ++ entry_node = get_proper_hash_chain(entry, decl_name); ++ if (entry_node && entry_node->param & (1U << argnum)) ++ return entry_node; ++ ++ return NULL; ++} ++ ++const struct size_overflow_hash *get_size_overflow_hash_entry_tree(const_tree fndecl, unsigned int argnum) ++{ ++ const struct size_overflow_hash *entry; ++ const_tree orig_decl; ++ unsigned int orig_argnum, hash; ++ const char *decl_name; ++ ++ if (made_by_compiler(fndecl)) { ++ orig_decl = get_orig_fndecl(fndecl); ++ orig_argnum = get_correct_argnum(fndecl, orig_decl, argnum); ++ } else { ++ orig_decl = fndecl; ++ orig_argnum = argnum; ++ } ++ ++ if (orig_argnum == CANNOT_FIND_ARG) ++ return NULL; ++ ++ decl_name = get_orig_decl_name(orig_decl); ++ hash = get_decl_hash(orig_decl, decl_name); ++ if (hash == NO_HASH) ++ return NULL; ++ ++ entry = get_size_overflow_hash_entry(hash, decl_name, orig_argnum); ++ return entry; ++} ++ ++unsigned int find_arg_number_tree(const_tree arg, const_tree func) ++{ ++ tree var; ++ unsigned int argnum = 1; ++ ++ if (DECL_ARGUMENTS(func) == NULL_TREE) ++ return CANNOT_FIND_ARG; ++ ++ if (TREE_CODE(arg) == SSA_NAME) ++ arg = SSA_NAME_VAR(arg); ++ ++ for (var = DECL_ARGUMENTS(func); var; var = TREE_CHAIN(var), argnum++) { ++ if (!operand_equal_p(arg, var, 0) && strcmp(DECL_NAME_POINTER(var), DECL_NAME_POINTER(arg))) ++ continue; ++ if (!skip_types(var)) ++ return argnum; ++ } ++ ++ return CANNOT_FIND_ARG; ++} ++ ++const_tree get_attribute(const char* attr_name, const_tree decl) ++{ ++ const_tree attr = lookup_attribute(attr_name, DECL_ATTRIBUTES(decl)); ++ if (attr && TREE_VALUE(attr)) ++ return attr; ++ return NULL_TREE; ++} ++ ++/* Check if the function has a size_overflow attribute or it is in the size_overflow hash table. ++ * If the function is missing everywhere then print the missing message into stderr. ++ */ ++void print_missing_function(next_interesting_function_t node) ++{ ++ unsigned int argnum, hash; ++ const struct size_overflow_hash *entry; ++ const char *decl_name; ++ ++ if (node->marked == ASM_STMT_SO_MARK) ++ return; ++ ++ if (node->orig_next_node) { ++ hash = node->orig_next_node->hash; ++ decl_name = node->orig_next_node->decl_name; ++ argnum = node->orig_next_node->num; ++ } else { ++ hash = node->hash; ++ decl_name = node->decl_name; ++ argnum = node->num; ++ } ++ ++ entry = get_size_overflow_hash_entry(hash, decl_name, argnum); ++ if (entry) ++ return; ++ ++ // inform() would be too slow ++ fprintf(stderr, "Function %s is missing from the size_overflow hash table +%s+%u+%u+\n", decl_name, decl_name, argnum, hash); ++} ++ +diff --git a/tools/gcc/size_overflow_plugin/size_overflow_transform.c b/tools/gcc/size_overflow_plugin/size_overflow_transform.c +new file mode 100644 +index 0000000..13c610e +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/size_overflow_transform.c +@@ -0,0 +1,431 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++static tree cast_to_orig_type(struct visited *visited, gimple stmt, const_tree orig_node, tree new_node) ++{ ++ const_gimple assign; ++ tree orig_type = TREE_TYPE(orig_node); ++ gimple_stmt_iterator gsi = gsi_for_stmt(stmt); ++ ++ assign = build_cast_stmt(visited, orig_type, new_node, CREATE_NEW_VAR, &gsi, BEFORE_STMT, false); ++ return get_lhs(assign); ++} ++ ++static void change_size_overflow_asm_input(gasm *stmt, tree new_input) ++{ ++ tree list; ++ ++ gcc_assert(is_size_overflow_insert_check_asm(stmt)); ++ ++ list = build_tree_list(NULL_TREE, build_string(3, "rm")); ++ list = chainon(NULL_TREE, build_tree_list(list, new_input)); ++ gimple_asm_set_input_op(stmt, 0, list); ++} ++ ++static void change_orig_node(struct visited *visited, gimple stmt, const_tree orig_node, tree new_node, unsigned int num) ++{ ++ tree cast_lhs = cast_to_orig_type(visited, stmt, orig_node, new_node); ++ ++ switch (gimple_code(stmt)) { ++ case GIMPLE_RETURN: ++ gimple_return_set_retval(as_a_greturn(stmt), cast_lhs); ++ break; ++ case GIMPLE_CALL: ++ gimple_call_set_arg(stmt, num - 1, cast_lhs); ++ break; ++ case GIMPLE_ASM: ++ change_size_overflow_asm_input(as_a_gasm(stmt), cast_lhs); ++ break; ++ default: ++ debug_gimple_stmt(stmt); ++ gcc_unreachable(); ++ } ++ ++ update_stmt(stmt); ++} ++ ++// e.g., 3.8.2, 64, arch/x86/ia32/ia32_signal.c copy_siginfo_from_user32(): compat_ptr() u32 max ++static bool skip_asm_cast(const_tree arg) ++{ ++ gimple def_stmt = get_def_stmt(arg); ++ ++ if (!def_stmt || !gimple_assign_cast_p(def_stmt)) ++ return false; ++ ++ def_stmt = get_def_stmt(gimple_assign_rhs1(def_stmt)); ++ if (is_size_overflow_asm(def_stmt)) ++ return false; ++ return def_stmt && gimple_code(def_stmt) == GIMPLE_ASM; ++} ++ ++struct interesting_stmts { ++ struct interesting_stmts *next; ++ gimple first_stmt; ++ tree orig_node; ++ unsigned int num; ++}; ++ ++static struct interesting_stmts *create_interesting_stmts(struct interesting_stmts *head, tree orig_node, gimple first_stmt, unsigned int num) ++{ ++ struct interesting_stmts *new_node; ++ ++ new_node = (struct interesting_stmts *)xmalloc(sizeof(*new_node)); ++ new_node->first_stmt = first_stmt; ++ new_node->num = num; ++ new_node->orig_node = orig_node; ++ new_node->next = head; ++ return new_node; ++} ++ ++static void free_interesting_stmts(struct interesting_stmts *head) ++{ ++ while (head) { ++ struct interesting_stmts *cur = head->next; ++ free(head); ++ head = cur; ++ } ++} ++ ++/* This function calls the main recursion function (expand) that duplicates the stmts. Before that it checks the intentional_overflow attribute, ++ * it decides whether the duplication is necessary or not. After expand() it changes the orig node to the duplicated node ++ * in the original stmt (first stmt) and it inserts the overflow check for the arg of the callee or for the return value. ++ */ ++static struct interesting_stmts *search_interesting_stmt(struct interesting_stmts *head, gimple first_stmt, tree orig_node, unsigned int num) ++{ ++ enum tree_code orig_code; ++ ++ gcc_assert(orig_node != NULL_TREE); ++ ++ if (is_gimple_constant(orig_node)) ++ return head; ++ ++ orig_code = TREE_CODE(orig_node); ++ gcc_assert(orig_code != FIELD_DECL && orig_code != FUNCTION_DECL); ++ gcc_assert(!skip_types(orig_node)); ++ ++ if (check_intentional_asm(first_stmt, num) != MARK_NO) ++ return head; ++ ++ if (SSA_NAME_IS_DEFAULT_DEF(orig_node)) ++ return head; ++ ++ if (skip_asm_cast(orig_node)) ++ return head; ++ ++ return create_interesting_stmts(head, orig_node, first_stmt, num); ++} ++ ++static void handle_interesting_stmt(struct visited *visited, struct interesting_stmts *head) ++{ ++ struct interesting_stmts *cur; ++ ++ for (cur = head; cur; cur = cur->next) { ++ tree new_node; ++ ++ new_node = expand(visited, cur->orig_node); ++ if (new_node == NULL_TREE) ++ continue; ++ ++ change_orig_node(visited, cur->first_stmt, cur->orig_node, new_node, cur->num); ++ check_size_overflow(cur->first_stmt, TREE_TYPE(new_node), new_node, cur->orig_node, BEFORE_STMT); ++ } ++} ++ ++static bool is_interesting_function(const_tree decl, unsigned int num) ++{ ++ const struct size_overflow_hash *so_hash; ++ ++ if (get_global_next_interesting_function_entry_with_hash(decl, DECL_NAME_POINTER(decl), num, YES_SO_MARK)) ++ return true; ++ ++ if (made_by_compiler(decl)) ++ return false; ++ ++ so_hash = get_size_overflow_hash_entry_tree(decl, num); ++ return so_hash != NULL; ++} ++ ++tree handle_fnptr_assign(const_gimple stmt) ++{ ++ tree field, rhs, op0; ++ const_tree op0_type; ++ enum tree_code rhs_code; ++ ++ // TODO skip binary assignments for now (fs/sync.c _591 = __bpf_call_base + _590;) ++ if (gimple_num_ops(stmt) != 2) ++ return NULL_TREE; ++ ++ gcc_assert(gimple_num_ops(stmt) == 2); ++ // TODO skip asm_stmt for now ++ if (gimple_code(stmt) == GIMPLE_ASM) ++ return NULL_TREE; ++ rhs = gimple_assign_rhs1(stmt); ++ if (is_gimple_constant(rhs)) ++ return NULL_TREE; ++ ++ rhs_code = TREE_CODE(rhs); ++ if (rhs_code == VAR_DECL) ++ return rhs; ++ ++ switch (rhs_code) { ++ case ADDR_EXPR: ++ op0 = TREE_OPERAND(rhs, 0); ++ gcc_assert(TREE_CODE(op0) == FUNCTION_DECL); ++ return op0; ++ case COMPONENT_REF: ++ break; ++ // TODO skip array_ref for now ++ case ARRAY_REF: ++ return NULL_TREE; ++ // TODO skip ssa_name because it can lead to parm_decl ++ case SSA_NAME: ++ return NULL_TREE; ++#if BUILDING_GCC_VERSION >= 4006 ++ // TODO skip mem_ref for now ++ case MEM_REF: ++ return NULL_TREE; ++#endif ++ default: ++ debug_tree(rhs); ++ debug_gimple_stmt((gimple)stmt); ++ gcc_unreachable(); ++ } ++ ++ op0 = TREE_OPERAND(rhs, 0); ++ switch (TREE_CODE(op0)) { ++ // TODO skip array_ref and parm_decl for now ++ case ARRAY_REF: ++ case PARM_DECL: ++ return NULL_TREE; ++ case COMPONENT_REF: ++#if BUILDING_GCC_VERSION >= 4006 ++ case MEM_REF: ++#endif ++ case VAR_DECL: ++ break; ++ default: ++ debug_tree(op0); ++ gcc_unreachable(); ++ } ++ ++ op0_type = TREE_TYPE(op0); ++ // TODO skip unions for now ++ if (TREE_CODE(op0_type) == UNION_TYPE) ++ return NULL_TREE; ++ gcc_assert(TREE_CODE(op0_type) == RECORD_TYPE); ++ ++ field = TREE_OPERAND(rhs, 1); ++ gcc_assert(TREE_CODE(field) == FIELD_DECL); ++ return field; ++} ++ ++static tree get_fn_or_fnptr_decl(const gcall *call_stmt) ++{ ++ const_tree fnptr; ++ const_gimple def_stmt; ++ tree decl = gimple_call_fndecl(call_stmt); ++ ++ if (decl != NULL_TREE) ++ return decl; ++ ++ fnptr = gimple_call_fn(call_stmt); ++ // !!! assertot kell irni 0-ra, mert csak az lehet ott ++ if (is_gimple_constant(fnptr)) ++ return NULL_TREE; ++ def_stmt = get_fnptr_def_stmt(fnptr); ++ return handle_fnptr_assign(def_stmt); ++} ++ ++// Start stmt duplication on marked function parameters ++static struct interesting_stmts *search_interesting_calls(struct interesting_stmts *head, gcall *call_stmt) ++{ ++ tree decl; ++ unsigned int i, len; ++ ++ len = gimple_call_num_args(call_stmt); ++ if (len == 0) ++ return head; ++ ++ decl = get_fn_or_fnptr_decl(call_stmt); ++ if (decl == NULL_TREE) ++ return head; ++ ++ for (i = 0; i < len; i++) { ++ tree arg; ++ ++ arg = gimple_call_arg(call_stmt, i); ++ if (is_gimple_constant(arg)) ++ continue; ++ if (skip_types(arg)) ++ continue; ++ if (is_interesting_function(decl, i + 1)) ++ head = search_interesting_stmt(head, call_stmt, arg, i + 1); ++ } ++ ++ return head; ++} ++ ++// Collect interesting stmts for duplication ++static void search_interesting_stmts(struct visited *visited) ++{ ++ basic_block bb; ++ bool search_ret; ++ struct interesting_stmts *head = NULL; ++ ++ search_ret = is_interesting_function(current_function_decl, 0); ++ ++ FOR_ALL_BB_FN(bb, cfun) { ++ gimple_stmt_iterator gsi; ++ ++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { ++ tree first_node; ++ gimple stmt = gsi_stmt(gsi); ++ ++ switch (gimple_code(stmt)) { ++ case GIMPLE_ASM: ++ if (!is_size_overflow_insert_check_asm(as_a_gasm(stmt))) ++ continue; ++ first_node = get_size_overflow_asm_input(as_a_gasm(stmt)); ++ head = search_interesting_stmt(head, stmt, first_node, 0); ++ break; ++ case GIMPLE_RETURN: ++ if (!search_ret) ++ continue; ++ first_node = gimple_return_retval(as_a_greturn(stmt)); ++ if (first_node == NULL_TREE) ++ break; ++ head = search_interesting_stmt(head, stmt, first_node, 0); ++ break; ++ case GIMPLE_CALL: ++ head = search_interesting_calls(head, as_a_gcall(stmt)); ++ break; ++ default: ++ break; ++ } ++ } ++ } ++ ++ handle_interesting_stmt(visited, head); ++ free_interesting_stmts(head); ++} ++ ++static struct visited *create_visited(void) ++{ ++ struct visited *new_node; ++ ++ new_node = (struct visited *)xmalloc(sizeof(*new_node)); ++ new_node->stmts = pointer_set_create(); ++ new_node->my_stmts = pointer_set_create(); ++ new_node->skip_expr_casts = pointer_set_create(); ++ new_node->no_cast_check = pointer_set_create(); ++ return new_node; ++} ++ ++static void free_visited(struct visited *visited) ++{ ++ pointer_set_destroy(visited->stmts); ++ pointer_set_destroy(visited->my_stmts); ++ pointer_set_destroy(visited->skip_expr_casts); ++ pointer_set_destroy(visited->no_cast_check); ++ ++ free(visited); ++} ++ ++// Remove the size_overflow asm stmt and create an assignment from the input and output of the asm ++static void replace_size_overflow_asm_with_assign(gasm *asm_stmt, tree lhs, tree rhs) ++{ ++ gassign *assign; ++ gimple_stmt_iterator gsi; ++ ++ // already removed ++ if (gimple_bb(asm_stmt) == NULL) ++ return; ++ gsi = gsi_for_stmt(asm_stmt); ++ ++ assign = gimple_build_assign(lhs, rhs); ++ gsi_insert_before(&gsi, assign, GSI_SAME_STMT); ++ SSA_NAME_DEF_STMT(lhs) = assign; ++ ++ gsi_remove(&gsi, true); ++} ++ ++// Replace our asm stmts with assignments (they are no longer needed and may interfere with later optimizations) ++static void remove_size_overflow_asm(gimple stmt) ++{ ++ gimple_stmt_iterator gsi; ++ tree input, output; ++ ++ if (!is_size_overflow_asm(stmt)) ++ return; ++ ++ if (gimple_asm_noutputs(as_a_gasm(stmt)) == 0) { ++ gsi = gsi_for_stmt(stmt); ++ ++ ipa_remove_stmt_references(cgraph_get_node(current_function_decl), stmt); ++ gsi_remove(&gsi, true); ++ return; ++ } ++ ++ input = gimple_asm_input_op(as_a_gasm(stmt), 0); ++ output = gimple_asm_output_op(as_a_gasm(stmt), 0); ++ replace_size_overflow_asm_with_assign(as_a_gasm(stmt), TREE_VALUE(output), TREE_VALUE(input)); ++} ++ ++static void remove_all_size_overflow_asm(void) ++{ ++ basic_block bb; ++ ++ FOR_ALL_BB_FN(bb, cfun) { ++ gimple_stmt_iterator si; ++ ++ for (si = gsi_start_bb(bb); !gsi_end_p(si); gsi_next(&si)) ++ remove_size_overflow_asm(gsi_stmt(si)); ++ } ++} ++ ++unsigned int size_overflow_transform(struct cgraph_node *node __unused) ++{ ++ struct visited *visited; ++ ++#if BUILDING_GCC_VERSION >= 4008 ++ if (dump_file) { ++ fprintf(dump_file, "BEFORE TRANSFORM -------------------------\n"); ++ size_overflow_dump_function(dump_file, node); ++ } ++#endif ++ visited = create_visited(); ++ set_dominance_info(); ++ ++ search_interesting_stmts(visited); ++ ++ remove_all_size_overflow_asm(); ++ ++ unset_dominance_info(); ++ free_visited(visited); ++ ++#if BUILDING_GCC_VERSION >= 4008 ++ if (dump_file) { ++ fprintf(dump_file, "AFTER TRANSFORM -------------------------\n"); ++ size_overflow_dump_function(dump_file, node); ++ } ++#endif ++ return TODO_dump_func | TODO_verify_stmts | TODO_remove_unused_locals | TODO_update_ssa_no_phi | TODO_ggc_collect | TODO_verify_flow; ++} +diff --git a/tools/gcc/size_overflow_plugin/size_overflow_transform_core.c b/tools/gcc/size_overflow_plugin/size_overflow_transform_core.c +new file mode 100644 +index 0000000..ec1596a +--- /dev/null ++++ b/tools/gcc/size_overflow_plugin/size_overflow_transform_core.c +@@ -0,0 +1,941 @@ ++/* ++ * Copyright 2011-2015 by Emese Revfy <re.emese@gmail.com> ++ * Licensed under the GPL v2, or (at your option) v3 ++ * ++ * Homepage: ++ * https://github.com/ephox-gcc-plugins/size_overflow ++ * ++ * Documentation: ++ * http://forums.grsecurity.net/viewtopic.php?f=7&t=3043 ++ * ++ * This plugin recomputes expressions of function arguments marked by a size_overflow attribute ++ * with double integer precision (DImode/TImode for 32/64 bit integer types). ++ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed. ++ * ++ * Usage: ++ * $ make ++ * $ make run ++ */ ++ ++#include "size_overflow.h" ++ ++#define MIN_CHECK true ++#define MAX_CHECK false ++ ++unsigned int call_count = 0; ++ ++static tree get_size_overflow_type(struct visited *visited, const_gimple stmt, const_tree node) ++{ ++ const_tree type; ++ tree new_type; ++ ++ gcc_assert(node != NULL_TREE); ++ ++ type = TREE_TYPE(node); ++ ++ if (pointer_set_contains(visited->my_stmts, stmt)) ++ return TREE_TYPE(node); ++ ++ switch (TYPE_MODE(type)) { ++ case QImode: ++ new_type = size_overflow_type_HI; ++ break; ++ case HImode: ++ new_type = size_overflow_type_SI; ++ break; ++ case SImode: ++ new_type = size_overflow_type_DI; ++ break; ++ case DImode: ++ if (LONG_TYPE_SIZE == GET_MODE_BITSIZE(SImode)) ++ new_type = TYPE_UNSIGNED(type) ? unsigned_intDI_type_node : intDI_type_node; ++ else ++ new_type = size_overflow_type_TI; ++ break; ++ case TImode: ++ gcc_assert(!TYPE_UNSIGNED(type)); ++ new_type = size_overflow_type_TI; ++ break; ++ default: ++ debug_tree((tree)node); ++ error("%s: unsupported gcc configuration (%qE).", __func__, current_function_decl); ++ gcc_unreachable(); ++ } ++ ++ if (TYPE_QUALS(type) != 0) ++ return build_qualified_type(new_type, TYPE_QUALS(type)); ++ return new_type; ++} ++ ++static tree cast_to_new_size_overflow_type(struct visited *visited, gimple stmt, tree rhs, tree size_overflow_type, bool before) ++{ ++ gimple_stmt_iterator gsi; ++ gimple new_stmt; ++ ++ if (rhs == NULL_TREE) ++ return NULL_TREE; ++ ++ gsi = gsi_for_stmt(stmt); ++ new_stmt = build_cast_stmt(visited, size_overflow_type, rhs, CREATE_NEW_VAR, &gsi, before, false); ++ if (gimple_assign_cast_p(new_stmt)) ++ gimple_assign_set_rhs_code(new_stmt, CONVERT_EXPR); ++ pointer_set_insert(visited->my_stmts, new_stmt); ++ ++ return get_lhs(new_stmt); ++} ++ ++tree create_assign(struct visited *visited, gimple oldstmt, tree rhs1, bool before) ++{ ++ tree lhs, dst_type; ++ gimple_stmt_iterator gsi; ++ ++ if (rhs1 == NULL_TREE) { ++ debug_gimple_stmt(oldstmt); ++ error("%s: rhs1 is NULL_TREE", __func__); ++ gcc_unreachable(); ++ } ++ ++ switch (gimple_code(oldstmt)) { ++ case GIMPLE_ASM: ++ lhs = rhs1; ++ break; ++ case GIMPLE_CALL: ++ case GIMPLE_ASSIGN: ++ lhs = gimple_get_lhs(oldstmt); ++ break; ++ default: ++ debug_gimple_stmt(oldstmt); ++ gcc_unreachable(); ++ } ++ ++ gsi = gsi_for_stmt(oldstmt); ++ pointer_set_insert(visited->stmts, oldstmt); ++ if (lookup_stmt_eh_lp(oldstmt) != 0) { ++ basic_block next_bb, cur_bb; ++ const_edge e; ++ ++ gcc_assert(before == false); ++ gcc_assert(stmt_can_throw_internal(oldstmt)); ++ gcc_assert(gimple_code(oldstmt) == GIMPLE_CALL); ++ gcc_assert(!gsi_end_p(gsi)); ++ ++ cur_bb = gimple_bb(oldstmt); ++ next_bb = cur_bb->next_bb; ++ e = find_edge(cur_bb, next_bb); ++ gcc_assert(e != NULL); ++ gcc_assert(e->flags & EDGE_FALLTHRU); ++ ++ gsi = gsi_after_labels(next_bb); ++ gcc_assert(!gsi_end_p(gsi)); ++ ++ before = true; ++ oldstmt = gsi_stmt(gsi); ++ } ++ ++ if (is_gimple_constant(rhs1) && TREE_CODE_CLASS(gimple_assign_rhs_code(oldstmt)) == tcc_comparison) ++ dst_type = get_size_overflow_type(visited, oldstmt, rhs1); ++ else ++ dst_type = get_size_overflow_type(visited, oldstmt, lhs); ++ ++ if (is_gimple_constant(rhs1)) ++ return cast_a_tree(dst_type, rhs1); ++ return cast_to_new_size_overflow_type(visited, oldstmt, rhs1, dst_type, before); ++} ++ ++tree dup_assign(struct visited *visited, gassign *oldstmt, const_tree node, tree rhs1, tree rhs2, tree __unused rhs3) ++{ ++ gassign *stmt; ++ gimple_stmt_iterator gsi; ++ tree size_overflow_type, new_var, lhs = gimple_assign_lhs(oldstmt); ++ ++ if (pointer_set_contains(visited->my_stmts, oldstmt)) ++ return lhs; ++ ++ if (gimple_num_ops(oldstmt) != 4 && rhs1 == NULL_TREE) { ++ rhs1 = gimple_assign_rhs1(oldstmt); ++ rhs1 = create_assign(visited, oldstmt, rhs1, BEFORE_STMT); ++ } ++ if (gimple_num_ops(oldstmt) == 3 && rhs2 == NULL_TREE) { ++ rhs2 = gimple_assign_rhs2(oldstmt); ++ rhs2 = create_assign(visited, oldstmt, rhs2, BEFORE_STMT); ++ } ++ ++ stmt = as_a_gassign(gimple_copy(oldstmt)); ++ gimple_set_location(stmt, gimple_location(oldstmt)); ++ pointer_set_insert(visited->my_stmts, stmt); ++ ++ if (gimple_assign_rhs_code(oldstmt) == WIDEN_MULT_EXPR) ++ gimple_assign_set_rhs_code(stmt, MULT_EXPR); ++ ++ size_overflow_type = get_size_overflow_type(visited, oldstmt, node); ++ ++ new_var = create_new_var(size_overflow_type); ++ new_var = make_ssa_name(new_var, stmt); ++ gimple_assign_set_lhs(stmt, new_var); ++ ++ if (rhs1 != NULL_TREE) ++ gimple_assign_set_rhs1(stmt, rhs1); ++ ++ if (rhs2 != NULL_TREE) ++ gimple_assign_set_rhs2(stmt, rhs2); ++#if BUILDING_GCC_VERSION >= 4006 ++ if (rhs3 != NULL_TREE) ++ gimple_assign_set_rhs3(stmt, rhs3); ++#endif ++ gimple_set_vuse(stmt, gimple_vuse(oldstmt)); ++ gimple_set_vdef(stmt, gimple_vdef(oldstmt)); ++ ++ gsi = gsi_for_stmt(oldstmt); ++ gsi_insert_after(&gsi, stmt, GSI_SAME_STMT); ++ update_stmt(stmt); ++ pointer_set_insert(visited->stmts, oldstmt); ++ return gimple_assign_lhs(stmt); ++} ++ ++static tree cast_parm_decl(struct visited *visited, tree phi_ssa_name, tree arg, tree size_overflow_type, basic_block bb) ++{ ++ const_gimple assign; ++ gimple_stmt_iterator gsi; ++ basic_block first_bb; ++ ++ gcc_assert(SSA_NAME_IS_DEFAULT_DEF(arg)); ++ ++ if (bb->index == 0) { ++ first_bb = split_block_after_labels(ENTRY_BLOCK_PTR_FOR_FN(cfun))->dest; ++ gcc_assert(dom_info_available_p(CDI_DOMINATORS)); ++ set_immediate_dominator(CDI_DOMINATORS, first_bb, ENTRY_BLOCK_PTR_FOR_FN(cfun)); ++ bb = first_bb; ++ } ++ ++ gsi = gsi_after_labels(bb); ++ assign = build_cast_stmt(visited, size_overflow_type, arg, phi_ssa_name, &gsi, BEFORE_STMT, false); ++ pointer_set_insert(visited->my_stmts, assign); ++ return get_lhs(assign); ++} ++ ++static tree use_phi_ssa_name(struct visited *visited, tree ssa_name_var, tree new_arg) ++{ ++ gimple_stmt_iterator gsi; ++ const_gimple assign; ++ gimple def_stmt = get_def_stmt(new_arg); ++ ++ if (gimple_code(def_stmt) == GIMPLE_PHI) { ++ gsi = gsi_after_labels(gimple_bb(def_stmt)); ++ assign = build_cast_stmt(visited, TREE_TYPE(new_arg), new_arg, ssa_name_var, &gsi, BEFORE_STMT, true); ++ } else { ++ gsi = gsi_for_stmt(def_stmt); ++ assign = build_cast_stmt(visited, TREE_TYPE(new_arg), new_arg, ssa_name_var, &gsi, AFTER_STMT, true); ++ } ++ ++ pointer_set_insert(visited->my_stmts, assign); ++ return get_lhs(assign); ++} ++ ++static tree cast_visited_phi_arg(struct visited *visited, tree ssa_name_var, tree arg, tree size_overflow_type) ++{ ++ basic_block bb; ++ gimple_stmt_iterator gsi; ++ const_gimple def_stmt; ++ const_gimple assign; ++ ++ def_stmt = get_def_stmt(arg); ++ bb = gimple_bb(def_stmt); ++ gcc_assert(bb->index != 0); ++ gsi = gsi_after_labels(bb); ++ ++ assign = build_cast_stmt(visited, size_overflow_type, arg, ssa_name_var, &gsi, BEFORE_STMT, false); ++ pointer_set_insert(visited->my_stmts, assign); ++ return get_lhs(assign); ++} ++ ++static tree create_new_phi_arg(struct visited *visited, tree ssa_name_var, tree new_arg, gphi *oldstmt, unsigned int i) ++{ ++ tree size_overflow_type; ++ tree arg; ++ const_gimple def_stmt; ++ ++ if (new_arg != NULL_TREE && is_gimple_constant(new_arg)) ++ return new_arg; ++ ++ arg = gimple_phi_arg_def(oldstmt, i); ++ def_stmt = get_def_stmt(arg); ++ gcc_assert(def_stmt != NULL); ++ size_overflow_type = get_size_overflow_type(visited, oldstmt, arg); ++ ++ switch (gimple_code(def_stmt)) { ++ case GIMPLE_PHI: ++ return cast_visited_phi_arg(visited, ssa_name_var, arg, size_overflow_type); ++ case GIMPLE_NOP: { ++ basic_block bb; ++ ++ bb = gimple_phi_arg_edge(oldstmt, i)->src; ++ return cast_parm_decl(visited, ssa_name_var, arg, size_overflow_type, bb); ++ } ++ case GIMPLE_ASM: { ++ gimple_stmt_iterator gsi; ++ const_gimple assign; ++ gimple stmt = get_def_stmt(arg); ++ ++ gsi = gsi_for_stmt(stmt); ++ assign = build_cast_stmt(visited, size_overflow_type, arg, ssa_name_var, &gsi, AFTER_STMT, false); ++ pointer_set_insert(visited->my_stmts, assign); ++ return get_lhs(assign); ++ } ++ default: ++ gcc_assert(new_arg != NULL_TREE); ++ gcc_assert(types_compatible_p(TREE_TYPE(new_arg), size_overflow_type)); ++ return use_phi_ssa_name(visited, ssa_name_var, new_arg); ++ } ++} ++ ++static gphi *overflow_create_phi_node(struct visited *visited, gphi *oldstmt, tree result) ++{ ++ basic_block bb; ++ gphi *phi; ++ gimple_seq seq; ++ gimple_stmt_iterator gsi = gsi_for_stmt(oldstmt); ++ ++ bb = gsi_bb(gsi); ++ ++ if (result == NULL_TREE) { ++ tree old_result = gimple_phi_result(oldstmt); ++ tree size_overflow_type = get_size_overflow_type(visited, oldstmt, old_result); ++ ++ result = create_new_var(size_overflow_type); ++ } ++ ++ phi = create_phi_node(result, bb); ++ gimple_phi_set_result(phi, make_ssa_name(result, phi)); ++ seq = phi_nodes(bb); ++ gsi = gsi_last(seq); ++ gsi_remove(&gsi, false); ++ ++ gsi = gsi_for_stmt(oldstmt); ++ gsi_insert_after(&gsi, phi, GSI_NEW_STMT); ++ gimple_set_bb(phi, bb); ++ return phi; ++} ++ ++#if BUILDING_GCC_VERSION <= 4007 ++static tree create_new_phi_node(struct visited *visited, VEC(tree, heap) **args, tree ssa_name_var, gimple oldstmt) ++#else ++static tree create_new_phi_node(struct visited *visited, vec<tree, va_heap, vl_embed> *&args, tree ssa_name_var, gphi *oldstmt) ++#endif ++{ ++ gphi *new_phi; ++ unsigned int i; ++ tree arg, result; ++ location_t loc = gimple_location(oldstmt); ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ gcc_assert(!VEC_empty(tree, *args)); ++#else ++ gcc_assert(!args->is_empty()); ++#endif ++ ++ new_phi = overflow_create_phi_node(visited, oldstmt, ssa_name_var); ++ result = gimple_phi_result(new_phi); ++ ssa_name_var = SSA_NAME_VAR(result); ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ FOR_EACH_VEC_ELT(tree, *args, i, arg) { ++#else ++ FOR_EACH_VEC_SAFE_ELT(args, i, arg) { ++#endif ++ arg = create_new_phi_arg(visited, ssa_name_var, arg, oldstmt, i); ++ add_phi_arg(new_phi, arg, gimple_phi_arg_edge(oldstmt, i), loc); ++ } ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC_free(tree, heap, *args); ++#else ++ vec_free(args); ++#endif ++ update_stmt(new_phi); ++ pointer_set_insert(visited->my_stmts, new_phi); ++ return result; ++} ++ ++static tree handle_phi(struct visited *visited, tree orig_result) ++{ ++ tree ssa_name_var = NULL_TREE; ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC(tree, heap) *args = NULL; ++#else ++ vec<tree, va_heap, vl_embed> *args = NULL; ++#endif ++ gphi *oldstmt = as_a_gphi(get_def_stmt(orig_result)); ++ unsigned int i, len = gimple_phi_num_args(oldstmt); ++ ++ pointer_set_insert(visited->stmts, oldstmt); ++ for (i = 0; i < len; i++) { ++ tree arg, new_arg; ++ ++ arg = gimple_phi_arg_def(oldstmt, i); ++ new_arg = expand(visited, arg); ++ ++ if (ssa_name_var == NULL_TREE && new_arg != NULL_TREE) ++ ssa_name_var = SSA_NAME_VAR(new_arg); ++ ++ if (is_gimple_constant(arg)) { ++ tree size_overflow_type = get_size_overflow_type(visited, oldstmt, arg); ++ ++ new_arg = cast_a_tree(size_overflow_type, arg); ++ } ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ VEC_safe_push(tree, heap, args, new_arg); ++#else ++ vec_safe_push(args, new_arg); ++#endif ++ } ++ ++#if BUILDING_GCC_VERSION <= 4007 ++ return create_new_phi_node(visited, &args, ssa_name_var, oldstmt); ++#else ++ return create_new_phi_node(visited, args, ssa_name_var, oldstmt); ++#endif ++} ++ ++static tree create_cast_assign(struct visited *visited, gassign *stmt) ++{ ++ tree rhs1 = gimple_assign_rhs1(stmt); ++ tree lhs = gimple_assign_lhs(stmt); ++ const_tree rhs1_type = TREE_TYPE(rhs1); ++ const_tree lhs_type = TREE_TYPE(lhs); ++ ++ if (TYPE_UNSIGNED(rhs1_type) == TYPE_UNSIGNED(lhs_type)) ++ return create_assign(visited, stmt, lhs, AFTER_STMT); ++ ++ return create_assign(visited, stmt, rhs1, AFTER_STMT); ++} ++ ++static bool skip_lhs_cast_check(const gassign *stmt) ++{ ++ const_tree rhs = gimple_assign_rhs1(stmt); ++ const_gimple def_stmt = get_def_stmt(rhs); ++ ++ // 3.8.2 kernel/futex_compat.c compat_exit_robust_list(): get_user() 64 ulong -> int (compat_long_t), int max ++ if (gimple_code(def_stmt) == GIMPLE_ASM) ++ return true; ++ ++ if (is_const_plus_unsigned_signed_truncation(rhs)) ++ return true; ++ ++ return false; ++} ++ ++static tree create_string_param(tree string) ++{ ++ tree i_type, a_type; ++ const int length = TREE_STRING_LENGTH(string); ++ ++ gcc_assert(length > 0); ++ ++ i_type = build_index_type(build_int_cst(NULL_TREE, length - 1)); ++ a_type = build_array_type(char_type_node, i_type); ++ ++ TREE_TYPE(string) = a_type; ++ TREE_CONSTANT(string) = 1; ++ TREE_READONLY(string) = 1; ++ ++ return build1(ADDR_EXPR, ptr_type_node, string); ++} ++ ++static void insert_cond(basic_block cond_bb, tree arg, enum tree_code cond_code, tree type_value) ++{ ++ gcond *cond_stmt; ++ gimple_stmt_iterator gsi = gsi_last_bb(cond_bb); ++ ++ cond_stmt = gimple_build_cond(cond_code, arg, type_value, NULL_TREE, NULL_TREE); ++ gsi_insert_after(&gsi, cond_stmt, GSI_CONTINUE_LINKING); ++ update_stmt(cond_stmt); ++} ++ ++static void insert_cond_result(basic_block bb_true, const_gimple stmt, const_tree arg, bool min) ++{ ++ gcall *func_stmt; ++ const_gimple def_stmt; ++ const_tree loc_line; ++ tree loc_file, ssa_name, current_func; ++ expanded_location xloc; ++ char *ssa_name_buf; ++ int len; ++ struct cgraph_edge *edge; ++ struct cgraph_node *report_node; ++ int frequency; ++ gimple_stmt_iterator gsi = gsi_start_bb(bb_true); ++ ++ def_stmt = get_def_stmt(arg); ++ xloc = expand_location(gimple_location(def_stmt)); ++ ++ if (!gimple_has_location(def_stmt)) { ++ xloc = expand_location(gimple_location(stmt)); ++ if (!gimple_has_location(stmt)) ++ xloc = expand_location(DECL_SOURCE_LOCATION(current_function_decl)); ++ } ++ ++ loc_line = build_int_cstu(unsigned_type_node, xloc.line); ++ ++ loc_file = build_string(strlen(xloc.file) + 1, xloc.file); ++ loc_file = create_string_param(loc_file); ++ ++ current_func = build_string(DECL_NAME_LENGTH(current_function_decl) + 1, DECL_NAME_POINTER(current_function_decl)); ++ current_func = create_string_param(current_func); ++ ++ gcc_assert(DECL_NAME(SSA_NAME_VAR(arg)) != NULL); ++ call_count++; ++ len = asprintf(&ssa_name_buf, "%s_%u %s, count: %u\n", DECL_NAME_POINTER(SSA_NAME_VAR(arg)), SSA_NAME_VERSION(arg), min ? "min" : "max", call_count); ++ gcc_assert(len > 0); ++ ssa_name = build_string(len + 1, ssa_name_buf); ++ free(ssa_name_buf); ++ ssa_name = create_string_param(ssa_name); ++ ++ // void report_size_overflow(const char *file, unsigned int line, const char *func, const char *ssa_name) ++ func_stmt = gimple_build_call(report_size_overflow_decl, 4, loc_file, loc_line, current_func, ssa_name); ++ gsi_insert_after(&gsi, func_stmt, GSI_CONTINUE_LINKING); ++ ++ report_node = cgraph_get_create_node(report_size_overflow_decl); ++ gcc_assert(report_node); ++ frequency = compute_call_stmt_bb_frequency(current_function_decl, bb_true); ++ ++ edge = cgraph_create_edge(get_cnode(current_function_decl), report_node, func_stmt, bb_true->count, frequency, bb_true->loop_depth); ++ gcc_assert(edge != NULL); ++} ++ ++static void insert_check_size_overflow(gimple stmt, enum tree_code cond_code, tree arg, tree type_value, bool before, bool min) ++{ ++ basic_block cond_bb, join_bb, bb_true; ++ edge e; ++ gimple_stmt_iterator gsi = gsi_for_stmt(stmt); ++ ++ cond_bb = gimple_bb(stmt); ++ if (before) ++ gsi_prev(&gsi); ++ if (gsi_end_p(gsi)) ++ e = split_block_after_labels(cond_bb); ++ else ++ e = split_block(cond_bb, gsi_stmt(gsi)); ++ cond_bb = e->src; ++ join_bb = e->dest; ++ e->flags = EDGE_FALSE_VALUE; ++ e->probability = REG_BR_PROB_BASE; ++ ++ bb_true = create_empty_bb(cond_bb); ++ make_edge(cond_bb, bb_true, EDGE_TRUE_VALUE); ++ make_edge(cond_bb, join_bb, EDGE_FALSE_VALUE); ++ make_edge(bb_true, join_bb, EDGE_FALLTHRU); ++ ++ gcc_assert(dom_info_available_p(CDI_DOMINATORS)); ++ set_immediate_dominator(CDI_DOMINATORS, bb_true, cond_bb); ++ set_immediate_dominator(CDI_DOMINATORS, join_bb, cond_bb); ++ ++ if (current_loops != NULL) { ++ gcc_assert(cond_bb->loop_father == join_bb->loop_father); ++ add_bb_to_loop(bb_true, cond_bb->loop_father); ++ } ++ ++ insert_cond(cond_bb, arg, cond_code, type_value); ++ insert_cond_result(bb_true, stmt, arg, min); ++ ++// print_the_code_insertions(stmt); ++} ++ ++void check_size_overflow(gimple stmt, tree size_overflow_type, tree cast_rhs, tree rhs, bool before) ++{ ++ const_tree rhs_type = TREE_TYPE(rhs); ++ tree cast_rhs_type, type_max_type, type_min_type, type_max, type_min; ++ ++ gcc_assert(rhs_type != NULL_TREE); ++ if (TREE_CODE(rhs_type) == POINTER_TYPE) ++ return; ++ ++ gcc_assert(TREE_CODE(rhs_type) == INTEGER_TYPE || TREE_CODE(rhs_type) == ENUMERAL_TYPE); ++ ++ if (is_const_plus_unsigned_signed_truncation(rhs)) ++ return; ++ ++ type_max = cast_a_tree(size_overflow_type, TYPE_MAX_VALUE(rhs_type)); ++ // typemax (-1) < typemin (0) ++ if (TREE_OVERFLOW(type_max)) ++ return; ++ ++ type_min = cast_a_tree(size_overflow_type, TYPE_MIN_VALUE(rhs_type)); ++ ++ cast_rhs_type = TREE_TYPE(cast_rhs); ++ type_max_type = TREE_TYPE(type_max); ++ gcc_assert(types_compatible_p(cast_rhs_type, type_max_type)); ++ ++ insert_check_size_overflow(stmt, GT_EXPR, cast_rhs, type_max, before, MAX_CHECK); ++ ++ // special case: get_size_overflow_type(), 32, u64->s ++ if (LONG_TYPE_SIZE == GET_MODE_BITSIZE(SImode) && TYPE_UNSIGNED(size_overflow_type) && !TYPE_UNSIGNED(rhs_type)) ++ return; ++ ++ type_min_type = TREE_TYPE(type_min); ++ gcc_assert(types_compatible_p(type_max_type, type_min_type)); ++ insert_check_size_overflow(stmt, LT_EXPR, cast_rhs, type_min, before, MIN_CHECK); ++} ++ ++static tree create_cast_overflow_check(struct visited *visited, tree new_rhs1, gassign *stmt) ++{ ++ bool cast_lhs, cast_rhs; ++ tree lhs = gimple_assign_lhs(stmt); ++ tree rhs = gimple_assign_rhs1(stmt); ++ const_tree lhs_type = TREE_TYPE(lhs); ++ const_tree rhs_type = TREE_TYPE(rhs); ++ enum machine_mode lhs_mode = TYPE_MODE(lhs_type); ++ enum machine_mode rhs_mode = TYPE_MODE(rhs_type); ++ unsigned int lhs_size = GET_MODE_BITSIZE(lhs_mode); ++ unsigned int rhs_size = GET_MODE_BITSIZE(rhs_mode); ++ ++ static bool check_lhs[3][4] = { ++ // ss su us uu ++ { false, true, true, false }, // lhs > rhs ++ { false, false, false, false }, // lhs = rhs ++ { true, true, true, true }, // lhs < rhs ++ }; ++ ++ static bool check_rhs[3][4] = { ++ // ss su us uu ++ { true, false, true, true }, // lhs > rhs ++ { true, false, true, true }, // lhs = rhs ++ { true, false, true, true }, // lhs < rhs ++ }; ++ ++ // skip lhs check on signed SI -> HI cast or signed SI -> QI cast ++ if (rhs_mode == SImode && !TYPE_UNSIGNED(rhs_type) && (lhs_mode == HImode || lhs_mode == QImode)) ++ return create_assign(visited, stmt, lhs, AFTER_STMT); ++ ++ if (lhs_size > rhs_size) { ++ cast_lhs = check_lhs[0][TYPE_UNSIGNED(rhs_type) + 2 * TYPE_UNSIGNED(lhs_type)]; ++ cast_rhs = check_rhs[0][TYPE_UNSIGNED(rhs_type) + 2 * TYPE_UNSIGNED(lhs_type)]; ++ } else if (lhs_size == rhs_size) { ++ cast_lhs = check_lhs[1][TYPE_UNSIGNED(rhs_type) + 2 * TYPE_UNSIGNED(lhs_type)]; ++ cast_rhs = check_rhs[1][TYPE_UNSIGNED(rhs_type) + 2 * TYPE_UNSIGNED(lhs_type)]; ++ } else { ++ cast_lhs = check_lhs[2][TYPE_UNSIGNED(rhs_type) + 2 * TYPE_UNSIGNED(lhs_type)]; ++ cast_rhs = check_rhs[2][TYPE_UNSIGNED(rhs_type) + 2 * TYPE_UNSIGNED(lhs_type)]; ++ } ++ ++ if (!cast_lhs && !cast_rhs) ++ return dup_assign(visited, stmt, lhs, new_rhs1, NULL_TREE, NULL_TREE); ++ ++ if (cast_lhs && !skip_lhs_cast_check(stmt)) ++ check_size_overflow(stmt, TREE_TYPE(new_rhs1), new_rhs1, lhs, BEFORE_STMT); ++ ++ if (cast_rhs) ++ check_size_overflow(stmt, TREE_TYPE(new_rhs1), new_rhs1, rhs, BEFORE_STMT); ++ ++ return dup_assign(visited, stmt, lhs, new_rhs1, NULL_TREE, NULL_TREE); ++} ++ ++static tree handle_unary_rhs(struct visited *visited, gassign *stmt) ++{ ++ enum tree_code rhs_code; ++ tree rhs1, new_rhs1, lhs = gimple_assign_lhs(stmt); ++ ++ if (pointer_set_contains(visited->my_stmts, stmt)) ++ return lhs; ++ ++ rhs1 = gimple_assign_rhs1(stmt); ++ if (TREE_CODE(TREE_TYPE(rhs1)) == POINTER_TYPE) ++ return create_assign(visited, stmt, lhs, AFTER_STMT); ++ ++ new_rhs1 = expand(visited, rhs1); ++ ++ if (new_rhs1 == NULL_TREE) ++ return create_cast_assign(visited, stmt); ++ ++ if (pointer_set_contains(visited->no_cast_check, stmt)) ++ return dup_assign(visited, stmt, lhs, new_rhs1, NULL_TREE, NULL_TREE); ++ ++ rhs_code = gimple_assign_rhs_code(stmt); ++ if (rhs_code == BIT_NOT_EXPR || rhs_code == NEGATE_EXPR) { ++ tree size_overflow_type = get_size_overflow_type(visited, stmt, rhs1); ++ ++ new_rhs1 = cast_to_new_size_overflow_type(visited, stmt, new_rhs1, size_overflow_type, BEFORE_STMT); ++ check_size_overflow(stmt, size_overflow_type, new_rhs1, rhs1, BEFORE_STMT); ++ return create_assign(visited, stmt, lhs, AFTER_STMT); ++ } ++ ++ if (!gimple_assign_cast_p(stmt)) ++ return dup_assign(visited, stmt, lhs, new_rhs1, NULL_TREE, NULL_TREE); ++ ++ return create_cast_overflow_check(visited, new_rhs1, stmt); ++} ++ ++static tree handle_unary_ops(struct visited *visited, gassign *stmt) ++{ ++ tree rhs1, lhs = gimple_assign_lhs(stmt); ++ gimple def_stmt = get_def_stmt(lhs); ++ ++ gcc_assert(gimple_code(def_stmt) != GIMPLE_NOP); ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ ++ if (is_gimple_constant(rhs1)) ++ return create_assign(visited, def_stmt, lhs, AFTER_STMT); ++ ++ switch (TREE_CODE(rhs1)) { ++ case SSA_NAME: { ++ tree ret = handle_unary_rhs(visited, as_a_gassign(def_stmt)); ++ ++ if (gimple_assign_cast_p(stmt)) ++ unsigned_signed_cast_intentional_overflow(visited, stmt); ++ return ret; ++ } ++ case ARRAY_REF: ++ case BIT_FIELD_REF: ++ case ADDR_EXPR: ++ case COMPONENT_REF: ++ case INDIRECT_REF: ++#if BUILDING_GCC_VERSION >= 4006 ++ case MEM_REF: ++#endif ++ case TARGET_MEM_REF: ++ case VIEW_CONVERT_EXPR: ++ return create_assign(visited, def_stmt, lhs, AFTER_STMT); ++ case PARM_DECL: ++ case VAR_DECL: ++ return create_assign(visited, stmt, lhs, AFTER_STMT); ++ ++ default: ++ debug_gimple_stmt(def_stmt); ++ debug_tree(rhs1); ++ gcc_unreachable(); ++ } ++} ++ ++static void __unused print_the_code_insertions(const_gimple stmt) ++{ ++ location_t loc = gimple_location(stmt); ++ ++ inform(loc, "Integer size_overflow check applied here."); ++} ++ ++static bool is_from_cast(const_tree node) ++{ ++ gimple def_stmt = get_def_stmt(node); ++ ++ if (!def_stmt) ++ return false; ++ ++ if (gimple_assign_cast_p(def_stmt)) ++ return true; ++ ++ return false; ++} ++ ++// Skip duplication when there is a minus expr and the type of rhs1 or rhs2 is a pointer_type. ++static bool is_ptr_diff(gassign *stmt) ++{ ++ const_tree rhs1, rhs2, ptr1_rhs, ptr2_rhs; ++ ++ if (gimple_assign_rhs_code(stmt) != MINUS_EXPR) ++ return false; ++ ++ rhs1 = gimple_assign_rhs1(stmt); ++ if (!is_from_cast(rhs1)) ++ return false; ++ ++ rhs2 = gimple_assign_rhs2(stmt); ++ if (!is_from_cast(rhs2)) ++ return false; ++ ++ ptr1_rhs = gimple_assign_rhs1(get_def_stmt(rhs1)); ++ ptr2_rhs = gimple_assign_rhs1(get_def_stmt(rhs2)); ++ ++ if (TREE_CODE(TREE_TYPE(ptr1_rhs)) != POINTER_TYPE && TREE_CODE(TREE_TYPE(ptr2_rhs)) != POINTER_TYPE) ++ return false; ++ ++ return true; ++} ++ ++static tree handle_binary_ops(struct visited *visited, tree lhs) ++{ ++ enum intentional_overflow_type res; ++ tree rhs1, rhs2, new_lhs; ++ gassign *def_stmt = as_a_gassign(get_def_stmt(lhs)); ++ tree new_rhs1 = NULL_TREE; ++ tree new_rhs2 = NULL_TREE; ++ ++ if (is_ptr_diff(def_stmt)) ++ return create_assign(visited, def_stmt, lhs, AFTER_STMT); ++ ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ rhs2 = gimple_assign_rhs2(def_stmt); ++ ++ /* no DImode/TImode division in the 32/64 bit kernel */ ++ switch (gimple_assign_rhs_code(def_stmt)) { ++ case RDIV_EXPR: ++ case TRUNC_DIV_EXPR: ++ case CEIL_DIV_EXPR: ++ case FLOOR_DIV_EXPR: ++ case ROUND_DIV_EXPR: ++ case TRUNC_MOD_EXPR: ++ case CEIL_MOD_EXPR: ++ case FLOOR_MOD_EXPR: ++ case ROUND_MOD_EXPR: ++ case EXACT_DIV_EXPR: ++ case POINTER_PLUS_EXPR: ++ case BIT_AND_EXPR: ++ return create_assign(visited, def_stmt, lhs, AFTER_STMT); ++ default: ++ break; ++ } ++ ++ new_lhs = handle_integer_truncation(visited, lhs); ++ if (new_lhs != NULL_TREE) ++ return new_lhs; ++ ++ if (TREE_CODE(rhs1) == SSA_NAME) ++ new_rhs1 = expand(visited, rhs1); ++ if (TREE_CODE(rhs2) == SSA_NAME) ++ new_rhs2 = expand(visited, rhs2); ++ ++ res = add_mul_intentional_overflow(def_stmt); ++ if (res != NO_INTENTIONAL_OVERFLOW) { ++ new_lhs = dup_assign(visited, def_stmt, lhs, new_rhs1, new_rhs2, NULL_TREE); ++ insert_cast_expr(visited, as_a_gassign(get_def_stmt(new_lhs)), res); ++ return new_lhs; ++ } ++ ++ if (skip_expr_on_double_type(def_stmt)) { ++ new_lhs = dup_assign(visited, def_stmt, lhs, new_rhs1, new_rhs2, NULL_TREE); ++ insert_cast_expr(visited, as_a_gassign(get_def_stmt(new_lhs)), NO_INTENTIONAL_OVERFLOW); ++ return new_lhs; ++ } ++ ++ if (is_a_neg_overflow(def_stmt, rhs2)) ++ return handle_intentional_overflow(visited, true, def_stmt, new_rhs1, NULL_TREE); ++ if (is_a_neg_overflow(def_stmt, rhs1)) ++ return handle_intentional_overflow(visited, true, def_stmt, new_rhs2, new_rhs2); ++ ++ ++ if (is_a_constant_overflow(def_stmt, rhs2)) ++ return handle_intentional_overflow(visited, !is_a_cast_and_const_overflow(rhs1), def_stmt, new_rhs1, NULL_TREE); ++ if (is_a_constant_overflow(def_stmt, rhs1)) ++ return handle_intentional_overflow(visited, !is_a_cast_and_const_overflow(rhs2), def_stmt, new_rhs2, new_rhs2); ++ ++ // the const is between 0 and (signed) MAX ++ if (is_gimple_constant(rhs1)) ++ new_rhs1 = create_assign(visited, def_stmt, rhs1, BEFORE_STMT); ++ if (is_gimple_constant(rhs2)) ++ new_rhs2 = create_assign(visited, def_stmt, rhs2, BEFORE_STMT); ++ ++ return dup_assign(visited, def_stmt, lhs, new_rhs1, new_rhs2, NULL_TREE); ++} ++ ++#if BUILDING_GCC_VERSION >= 4006 ++static tree get_new_rhs(struct visited *visited, tree size_overflow_type, tree rhs) ++{ ++ if (is_gimple_constant(rhs)) ++ return cast_a_tree(size_overflow_type, rhs); ++ if (TREE_CODE(rhs) != SSA_NAME) ++ return NULL_TREE; ++ return expand(visited, rhs); ++} ++ ++static tree handle_ternary_ops(struct visited *visited, tree lhs) ++{ ++ tree rhs1, rhs2, rhs3, new_rhs1, new_rhs2, new_rhs3, size_overflow_type; ++ gassign *def_stmt = as_a_gassign(get_def_stmt(lhs)); ++ ++ size_overflow_type = get_size_overflow_type(visited, def_stmt, lhs); ++ ++ rhs1 = gimple_assign_rhs1(def_stmt); ++ rhs2 = gimple_assign_rhs2(def_stmt); ++ rhs3 = gimple_assign_rhs3(def_stmt); ++ new_rhs1 = get_new_rhs(visited, size_overflow_type, rhs1); ++ new_rhs2 = get_new_rhs(visited, size_overflow_type, rhs2); ++ new_rhs3 = get_new_rhs(visited, size_overflow_type, rhs3); ++ ++ return dup_assign(visited, def_stmt, lhs, new_rhs1, new_rhs2, new_rhs3); ++} ++#endif ++ ++static tree get_my_stmt_lhs(struct visited *visited, gimple stmt) ++{ ++ gimple_stmt_iterator gsi; ++ gimple next_stmt = NULL; ++ ++ gsi = gsi_for_stmt(stmt); ++ ++ do { ++ gsi_next(&gsi); ++ next_stmt = gsi_stmt(gsi); ++ ++ if (gimple_code(stmt) == GIMPLE_PHI && !pointer_set_contains(visited->my_stmts, next_stmt)) ++ return NULL_TREE; ++ ++ if (pointer_set_contains(visited->my_stmts, next_stmt) && !pointer_set_contains(visited->skip_expr_casts, next_stmt)) ++ break; ++ ++ gcc_assert(pointer_set_contains(visited->my_stmts, next_stmt)); ++ } while (!gsi_end_p(gsi)); ++ ++ gcc_assert(next_stmt); ++ return get_lhs(next_stmt); ++} ++ ++static tree expand_visited(struct visited *visited, gimple def_stmt) ++{ ++ gimple_stmt_iterator gsi; ++ enum gimple_code code = gimple_code(def_stmt); ++ ++ if (code == GIMPLE_ASM) ++ return NULL_TREE; ++ ++ gsi = gsi_for_stmt(def_stmt); ++ gsi_next(&gsi); ++ ++ if (gimple_code(def_stmt) == GIMPLE_PHI && gsi_end_p(gsi)) ++ return NULL_TREE; ++ return get_my_stmt_lhs(visited, def_stmt); ++} ++ ++tree expand(struct visited *visited, tree lhs) ++{ ++ gimple def_stmt; ++ ++ def_stmt = get_def_stmt(lhs); ++ ++ if (!def_stmt || gimple_code(def_stmt) == GIMPLE_NOP) ++ return NULL_TREE; ++ ++ if (pointer_set_contains(visited->my_stmts, def_stmt)) ++ return lhs; ++ ++ if (pointer_set_contains(visited->stmts, def_stmt)) ++ return expand_visited(visited, def_stmt); ++ ++ if (is_gimple_constant(lhs)) ++ return NULL_TREE; ++ if (skip_types(lhs)) ++ return NULL_TREE; ++ ++ switch (gimple_code(def_stmt)) { ++ case GIMPLE_PHI: ++ return handle_phi(visited, lhs); ++ case GIMPLE_CALL: ++ case GIMPLE_ASM: ++ if (is_size_overflow_asm(def_stmt)) ++ return expand(visited, get_size_overflow_asm_input(as_a_gasm(def_stmt))); ++ return create_assign(visited, def_stmt, lhs, AFTER_STMT); ++ case GIMPLE_ASSIGN: ++ switch (gimple_num_ops(def_stmt)) { ++ case 2: ++ return handle_unary_ops(visited, as_a_gassign(def_stmt)); ++ case 3: ++ return handle_binary_ops(visited, lhs); ++#if BUILDING_GCC_VERSION >= 4006 ++ case 4: ++ return handle_ternary_ops(visited, lhs); ++#endif ++ } ++ default: ++ debug_gimple_stmt(def_stmt); ++ error("%s: unknown gimple code", __func__); ++ gcc_unreachable(); ++ } ++} +diff --git a/tools/gcc/stackleak_plugin.c b/tools/gcc/stackleak_plugin.c +new file mode 100644 +index 0000000..1d296ce +--- /dev/null ++++ b/tools/gcc/stackleak_plugin.c +@@ -0,0 +1,432 @@ ++/* ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> ++ * Licensed under the GPL v2 ++ * ++ * Note: the choice of the license means that the compilation process is ++ * NOT 'eligible' as defined by gcc's library exception to the GPL v3, ++ * but for the kernel it doesn't matter since it doesn't link against ++ * any of the gcc libraries ++ * ++ * gcc plugin to help implement various PaX features ++ * ++ * - track lowest stack pointer ++ * ++ * TODO: ++ * - initialize all local variables ++ * ++ * BUGS: ++ * - none known ++ */ ++ ++#include "gcc-common.h" ++ ++int plugin_is_GPL_compatible; ++ ++static int track_frame_size = -1; ++static const char track_function[] = "pax_track_stack"; ++static const char check_function[] = "pax_check_alloca"; ++static GTY(()) tree track_function_decl; ++static GTY(()) tree check_function_decl; ++static bool init_locals; ++ ++static struct plugin_info stackleak_plugin_info = { ++ .version = "201504282245", ++ .help = "track-lowest-sp=nn\ttrack sp in functions whose frame size is at least nn bytes\n" ++// "initialize-locals\t\tforcibly initialize all stack frames\n" ++}; ++ ++static void stackleak_check_alloca(gimple_stmt_iterator *gsi) ++{ ++ gcall *check_alloca; ++ tree alloca_size; ++ cgraph_node_ptr node; ++ int frequency; ++ basic_block bb; ++ ++ // insert call to void pax_check_alloca(unsigned long size) ++ alloca_size = gimple_call_arg(gsi_stmt(*gsi), 0); ++ check_alloca = gimple_build_call(check_function_decl, 1, alloca_size); ++ gsi_insert_before(gsi, check_alloca, GSI_SAME_STMT); ++ ++ // update the cgraph ++ bb = gimple_bb(check_alloca); ++ node = cgraph_get_create_node(check_function_decl); ++ gcc_assert(node); ++ frequency = compute_call_stmt_bb_frequency(current_function_decl, bb); ++ cgraph_create_edge(cgraph_get_node(current_function_decl), node, check_alloca, bb->count, frequency, bb->loop_depth); ++} ++ ++static void stackleak_add_instrumentation(gimple_stmt_iterator *gsi) ++{ ++ gcall *track_stack; ++ cgraph_node_ptr node; ++ int frequency; ++ basic_block bb; ++ ++ // insert call to void pax_track_stack(void) ++ track_stack = gimple_build_call(track_function_decl, 0); ++ gsi_insert_after(gsi, track_stack, GSI_CONTINUE_LINKING); ++ ++ // update the cgraph ++ bb = gimple_bb(track_stack); ++ node = cgraph_get_create_node(track_function_decl); ++ gcc_assert(node); ++ frequency = compute_call_stmt_bb_frequency(current_function_decl, bb); ++ cgraph_create_edge(cgraph_get_node(current_function_decl), node, track_stack, bb->count, frequency, bb->loop_depth); ++} ++ ++static bool is_alloca(gimple stmt) ++{ ++ if (gimple_call_builtin_p(stmt, BUILT_IN_ALLOCA)) ++ return true; ++ ++#if BUILDING_GCC_VERSION >= 4007 ++ if (gimple_call_builtin_p(stmt, BUILT_IN_ALLOCA_WITH_ALIGN)) ++ return true; ++#endif ++ ++ return false; ++} ++ ++static unsigned int execute_stackleak_tree_instrument(void) ++{ ++ basic_block bb, entry_bb; ++ bool prologue_instrumented = false, is_leaf = true; ++ ++ entry_bb = ENTRY_BLOCK_PTR_FOR_FN(cfun)->next_bb; ++ ++ // 1. loop through BBs and GIMPLE statements ++ FOR_EACH_BB_FN(bb, cfun) { ++ gimple_stmt_iterator gsi; ++ ++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { ++ gimple stmt; ++ ++ stmt = gsi_stmt(gsi); ++ ++ if (is_gimple_call(stmt)) ++ is_leaf = false; ++ ++ // gimple match: align 8 built-in BUILT_IN_NORMAL:BUILT_IN_ALLOCA attributes <tree_list 0xb7576450> ++ if (!is_alloca(stmt)) ++ continue; ++ ++ // 2. insert stack overflow check before each __builtin_alloca call ++ stackleak_check_alloca(&gsi); ++ ++ // 3. insert track call after each __builtin_alloca call ++ stackleak_add_instrumentation(&gsi); ++ if (bb == entry_bb) ++ prologue_instrumented = true; ++ } ++ } ++ ++ // special cases for some bad linux code: taking the address of static inline functions will materialize them ++ // but we mustn't instrument some of them as the resulting stack alignment required by the function call ABI ++ // will break other assumptions regarding the expected (but not otherwise enforced) register clobbering ABI. ++ // case in point: native_save_fl on amd64 when optimized for size clobbers rdx if it were instrumented here. ++ if (is_leaf && !TREE_PUBLIC(current_function_decl) && DECL_DECLARED_INLINE_P(current_function_decl)) ++ return 0; ++ if (is_leaf && !strncmp(IDENTIFIER_POINTER(DECL_NAME(current_function_decl)), "_paravirt_", 10)) ++ return 0; ++ ++ // 4. insert track call at the beginning ++ if (!prologue_instrumented) { ++ gimple_stmt_iterator gsi; ++ ++ bb = split_block_after_labels(ENTRY_BLOCK_PTR_FOR_FN(cfun))->dest; ++ if (dom_info_available_p(CDI_DOMINATORS)) ++ set_immediate_dominator(CDI_DOMINATORS, bb, ENTRY_BLOCK_PTR_FOR_FN(cfun)); ++ gsi = gsi_start_bb(bb); ++ stackleak_add_instrumentation(&gsi); ++ } ++ ++ return 0; ++} ++ ++static unsigned int execute_stackleak_final(void) ++{ ++ rtx_insn *insn, *next; ++ ++ if (cfun->calls_alloca) ++ return 0; ++ ++ // keep calls only if function frame is big enough ++ if (get_frame_size() >= track_frame_size) ++ return 0; ++ ++ // 1. find pax_track_stack calls ++ for (insn = get_insns(); insn; insn = next) { ++ // rtl match: (call_insn 8 7 9 3 (call (mem (symbol_ref ("pax_track_stack") [flags 0x41] <function_decl 0xb7470e80 pax_track_stack>) [0 S1 A8]) (4)) -1 (nil) (nil)) ++ rtx body; ++ ++ next = NEXT_INSN(insn); ++ if (!CALL_P(insn)) ++ continue; ++ body = PATTERN(insn); ++ if (GET_CODE(body) != CALL) ++ continue; ++ body = XEXP(body, 0); ++ if (GET_CODE(body) != MEM) ++ continue; ++ body = XEXP(body, 0); ++ if (GET_CODE(body) != SYMBOL_REF) ++ continue; ++// if (strcmp(XSTR(body, 0), track_function)) ++ if (SYMBOL_REF_DECL(body) != track_function_decl) ++ continue; ++// warning(0, "track_frame_size: %d %ld %d", cfun->calls_alloca, get_frame_size(), track_frame_size); ++ // 2. delete call ++ delete_insn_and_edges(insn); ++#if BUILDING_GCC_VERSION >= 4007 ++ if (GET_CODE(next) == NOTE && NOTE_KIND(next) == NOTE_INSN_CALL_ARG_LOCATION) { ++ insn = next; ++ next = NEXT_INSN(insn); ++ delete_insn_and_edges(insn); ++ } ++#endif ++ } ++ ++// print_simple_rtl(stderr, get_insns()); ++// print_rtl(stderr, get_insns()); ++// warning(0, "track_frame_size: %d %ld %d", cfun->calls_alloca, get_frame_size(), track_frame_size); ++ ++ return 0; ++} ++ ++static bool gate_stackleak_track_stack(void) ++{ ++ tree section; ++ ++ if (ix86_cmodel != CM_KERNEL) ++ return false; ++ ++ section = lookup_attribute("section", DECL_ATTRIBUTES(current_function_decl)); ++ if (section && TREE_VALUE(section)) { ++ section = TREE_VALUE(TREE_VALUE(section)); ++ ++ if (!strncmp(TREE_STRING_POINTER(section), ".init.text", 10)) ++ return false; ++ if (!strncmp(TREE_STRING_POINTER(section), ".devinit.text", 13)) ++ return false; ++ if (!strncmp(TREE_STRING_POINTER(section), ".cpuinit.text", 13)) ++ return false; ++ if (!strncmp(TREE_STRING_POINTER(section), ".meminit.text", 13)) ++ return false; ++ } ++ ++ return track_frame_size >= 0; ++} ++ ++static void stackleak_start_unit(void *gcc_data, void *user_data) ++{ ++ tree fntype; ++ ++ // void pax_track_stack(void) ++ fntype = build_function_type_list(void_type_node, NULL_TREE); ++ track_function_decl = build_fn_decl(track_function, fntype); ++ DECL_ASSEMBLER_NAME(track_function_decl); // for LTO ++ TREE_PUBLIC(track_function_decl) = 1; ++ TREE_USED(track_function_decl) = 1; ++ DECL_EXTERNAL(track_function_decl) = 1; ++ DECL_ARTIFICIAL(track_function_decl) = 1; ++ DECL_PRESERVE_P(track_function_decl) = 1; ++ ++ // void pax_check_alloca(unsigned long) ++ fntype = build_function_type_list(void_type_node, long_unsigned_type_node, NULL_TREE); ++ check_function_decl = build_fn_decl(check_function, fntype); ++ DECL_ASSEMBLER_NAME(check_function_decl); // for LTO ++ TREE_PUBLIC(check_function_decl) = 1; ++ TREE_USED(check_function_decl) = 1; ++ DECL_EXTERNAL(check_function_decl) = 1; ++ DECL_ARTIFICIAL(check_function_decl) = 1; ++ DECL_PRESERVE_P(check_function_decl) = 1; ++} ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++static const struct pass_data stackleak_tree_instrument_pass_data = { ++#else ++static struct gimple_opt_pass stackleak_tree_instrument_pass = { ++ .pass = { ++#endif ++ .type = GIMPLE_PASS, ++ .name = "stackleak_tree_instrument", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 ++ .has_gate = true, ++ .has_execute = true, ++#else ++ .gate = gate_stackleak_track_stack, ++ .execute = execute_stackleak_tree_instrument, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = PROP_gimple_leh | PROP_cfg, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, //TODO_verify_ssa | TODO_verify_flow | TODO_verify_stmts, ++ .todo_flags_finish = TODO_verify_ssa | TODO_verify_stmts | TODO_dump_func | TODO_update_ssa | TODO_rebuild_cgraph_edges ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++static const struct pass_data stackleak_final_rtl_opt_pass_data = { ++#else ++static struct rtl_opt_pass stackleak_final_rtl_opt_pass = { ++ .pass = { ++#endif ++ .type = RTL_PASS, ++ .name = "stackleak_final", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 ++ .has_gate = true, ++ .has_execute = true, ++#else ++ .gate = gate_stackleak_track_stack, ++ .execute = execute_stackleak_final, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = 0, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = TODO_dump_func ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++class stackleak_tree_instrument_pass : public gimple_opt_pass { ++public: ++ stackleak_tree_instrument_pass() : gimple_opt_pass(stackleak_tree_instrument_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_stackleak_track_stack(); } ++ virtual unsigned int execute(function *) { return execute_stackleak_tree_instrument(); } ++#else ++ bool gate() { return gate_stackleak_track_stack(); } ++ unsigned int execute() { return execute_stackleak_tree_instrument(); } ++#endif ++}; ++ ++class stackleak_final_rtl_opt_pass : public rtl_opt_pass { ++public: ++ stackleak_final_rtl_opt_pass() : rtl_opt_pass(stackleak_final_rtl_opt_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_stackleak_track_stack(); } ++ virtual unsigned int execute(function *) { return execute_stackleak_final(); } ++#else ++ bool gate() { return gate_stackleak_track_stack(); } ++ unsigned int execute() { return execute_stackleak_final(); } ++#endif ++}; ++} ++ ++static opt_pass *make_stackleak_tree_instrument_pass(void) ++{ ++ return new stackleak_tree_instrument_pass(); ++} ++ ++static opt_pass *make_stackleak_final_rtl_opt_pass(void) ++{ ++ return new stackleak_final_rtl_opt_pass(); ++} ++#else ++static struct opt_pass *make_stackleak_tree_instrument_pass(void) ++{ ++ return &stackleak_tree_instrument_pass.pass; ++} ++ ++static struct opt_pass *make_stackleak_final_rtl_opt_pass(void) ++{ ++ return &stackleak_final_rtl_opt_pass.pass; ++} ++#endif ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ const char * const plugin_name = plugin_info->base_name; ++ const int argc = plugin_info->argc; ++ const struct plugin_argument * const argv = plugin_info->argv; ++ int i; ++ struct register_pass_info stackleak_tree_instrument_pass_info; ++ struct register_pass_info stackleak_final_pass_info; ++ static const struct ggc_root_tab gt_ggc_r_gt_stackleak[] = { ++ { ++ .base = &track_function_decl, ++ .nelt = 1, ++ .stride = sizeof(track_function_decl), ++ .cb = >_ggc_mx_tree_node, ++ .pchw = >_pch_nx_tree_node ++ }, ++ { ++ .base = &check_function_decl, ++ .nelt = 1, ++ .stride = sizeof(check_function_decl), ++ .cb = >_ggc_mx_tree_node, ++ .pchw = >_pch_nx_tree_node ++ }, ++ LAST_GGC_ROOT_TAB ++ }; ++ ++ stackleak_tree_instrument_pass_info.pass = make_stackleak_tree_instrument_pass(); ++// stackleak_tree_instrument_pass_info.reference_pass_name = "tree_profile"; ++ stackleak_tree_instrument_pass_info.reference_pass_name = "optimized"; ++ stackleak_tree_instrument_pass_info.ref_pass_instance_number = 1; ++ stackleak_tree_instrument_pass_info.pos_op = PASS_POS_INSERT_BEFORE; ++ ++ stackleak_final_pass_info.pass = make_stackleak_final_rtl_opt_pass(); ++ stackleak_final_pass_info.reference_pass_name = "final"; ++ stackleak_final_pass_info.ref_pass_instance_number = 1; ++ stackleak_final_pass_info.pos_op = PASS_POS_INSERT_BEFORE; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &stackleak_plugin_info); ++ ++ for (i = 0; i < argc; ++i) { ++ if (!strcmp(argv[i].key, "track-lowest-sp")) { ++ if (!argv[i].value) { ++ error(G_("no value supplied for option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ continue; ++ } ++ track_frame_size = atoi(argv[i].value); ++ if (argv[i].value[0] < '0' || argv[i].value[0] > '9' || track_frame_size < 0) ++ error(G_("invalid option argument '-fplugin-arg-%s-%s=%s'"), plugin_name, argv[i].key, argv[i].value); ++ continue; ++ } ++ if (!strcmp(argv[i].key, "initialize-locals")) { ++ if (argv[i].value) { ++ error(G_("invalid option argument '-fplugin-arg-%s-%s=%s'"), plugin_name, argv[i].key, argv[i].value); ++ continue; ++ } ++ init_locals = true; ++ continue; ++ } ++ error(G_("unkown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ } ++ ++ register_callback(plugin_name, PLUGIN_START_UNIT, &stackleak_start_unit, NULL); ++ register_callback(plugin_name, PLUGIN_REGISTER_GGC_ROOTS, NULL, (void *)>_ggc_r_gt_stackleak); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &stackleak_tree_instrument_pass_info); ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &stackleak_final_pass_info); ++ ++ return 0; ++} +diff --git a/tools/gcc/structleak_plugin.c b/tools/gcc/structleak_plugin.c +new file mode 100644 +index 0000000..4436cbe +--- /dev/null ++++ b/tools/gcc/structleak_plugin.c +@@ -0,0 +1,287 @@ ++/* ++ * Copyright 2013-2015 by PaX Team <pageexec@freemail.hu> ++ * Licensed under the GPL v2 ++ * ++ * Note: the choice of the license means that the compilation process is ++ * NOT 'eligible' as defined by gcc's library exception to the GPL v3, ++ * but for the kernel it doesn't matter since it doesn't link against ++ * any of the gcc libraries ++ * ++ * gcc plugin to forcibly initialize certain local variables that could ++ * otherwise leak kernel stack to userland if they aren't properly initialized ++ * by later code ++ * ++ * Homepage: http://pax.grsecurity.net/ ++ * ++ * Usage: ++ * $ # for 4.5/4.6/C based 4.7 ++ * $ gcc -I`gcc -print-file-name=plugin`/include -I`gcc -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o structleak_plugin.so structleak_plugin.c ++ * $ # for C++ based 4.7/4.8+ ++ * $ g++ -I`g++ -print-file-name=plugin`/include -I`g++ -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o structleak_plugin.so structleak_plugin.c ++ * $ gcc -fplugin=./structleak_plugin.so test.c -O2 ++ * ++ * TODO: eliminate redundant initializers ++ * increase type coverage ++ */ ++ ++#include "gcc-common.h" ++ ++// unused C type flag in all versions 4.5-5.0 ++#define TYPE_USERSPACE(TYPE) TYPE_LANG_FLAG_5(TYPE) ++ ++int plugin_is_GPL_compatible; ++ ++static struct plugin_info structleak_plugin_info = { ++ .version = "201401260140", ++ .help = "disable\tdo not activate plugin\n", ++}; ++ ++static tree handle_user_attribute(tree *node, tree name, tree args, int flags, bool *no_add_attrs) ++{ ++ *no_add_attrs = true; ++ ++ // check for types? for now accept everything linux has to offer ++ if (TREE_CODE(*node) != FIELD_DECL) ++ return NULL_TREE; ++ ++ *no_add_attrs = false; ++ return NULL_TREE; ++} ++ ++static struct attribute_spec user_attr = { ++ .name = "user", ++ .min_length = 0, ++ .max_length = 0, ++ .decl_required = false, ++ .type_required = false, ++ .function_type_required = false, ++ .handler = handle_user_attribute, ++#if BUILDING_GCC_VERSION >= 4007 ++ .affects_type_identity = true ++#endif ++}; ++ ++static void register_attributes(void *event_data, void *data) ++{ ++ register_attribute(&user_attr); ++// register_attribute(&force_attr); ++} ++ ++static tree get_field_type(tree field) ++{ ++ return strip_array_types(TREE_TYPE(field)); ++} ++ ++static bool is_userspace_type(tree type) ++{ ++ tree field; ++ ++ for (field = TYPE_FIELDS(type); field; field = TREE_CHAIN(field)) { ++ tree fieldtype = get_field_type(field); ++ enum tree_code code = TREE_CODE(fieldtype); ++ ++ if (code == RECORD_TYPE || code == UNION_TYPE) ++ if (is_userspace_type(fieldtype)) ++ return true; ++ ++ if (lookup_attribute("user", DECL_ATTRIBUTES(field))) ++ return true; ++ } ++ return false; ++} ++ ++static void finish_type(void *event_data, void *data) ++{ ++ tree type = (tree)event_data; ++ ++ if (type == NULL_TREE || type == error_mark_node) ++ return; ++ ++#if BUILDING_GCC_VERSION >= 5000 ++ if (TREE_CODE(type) == ENUMERAL_TYPE) ++ return; ++#endif ++ ++ if (TYPE_USERSPACE(type)) ++ return; ++ ++ if (is_userspace_type(type)) ++ TYPE_USERSPACE(type) = 1; ++} ++ ++static void initialize(tree var) ++{ ++ basic_block bb; ++ gimple_stmt_iterator gsi; ++ tree initializer; ++ gimple init_stmt; ++ ++ // this is the original entry bb before the forced split ++ // TODO: check further BBs in case more splits occured before us ++ bb = ENTRY_BLOCK_PTR_FOR_FN(cfun)->next_bb->next_bb; ++ ++ // first check if the variable is already initialized, warn otherwise ++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { ++ gimple stmt = gsi_stmt(gsi); ++ tree rhs1; ++ ++ // we're looking for an assignment of a single rhs... ++ if (!gimple_assign_single_p(stmt)) ++ continue; ++ rhs1 = gimple_assign_rhs1(stmt); ++#if BUILDING_GCC_VERSION >= 4007 ++ // ... of a non-clobbering expression... ++ if (TREE_CLOBBER_P(rhs1)) ++ continue; ++#endif ++ // ... to our variable... ++ if (gimple_get_lhs(stmt) != var) ++ continue; ++ // if it's an initializer then we're good ++ if (TREE_CODE(rhs1) == CONSTRUCTOR) ++ return; ++ } ++ ++ // these aren't the 0days you're looking for ++// inform(DECL_SOURCE_LOCATION(var), "userspace variable will be forcibly initialized"); ++ ++ // build the initializer expression ++ initializer = build_constructor(TREE_TYPE(var), NULL); ++ ++ // build the initializer stmt ++ init_stmt = gimple_build_assign(var, initializer); ++ gsi = gsi_start_bb(ENTRY_BLOCK_PTR_FOR_FN(cfun)->next_bb); ++ gsi_insert_before(&gsi, init_stmt, GSI_NEW_STMT); ++ update_stmt(init_stmt); ++} ++ ++static unsigned int handle_function(void) ++{ ++ basic_block bb; ++ unsigned int ret = 0; ++ tree var; ++ unsigned int i; ++ ++ // split the first bb where we can put the forced initializers ++ bb = split_block_after_labels(ENTRY_BLOCK_PTR_FOR_FN(cfun))->dest; ++ if (dom_info_available_p(CDI_DOMINATORS)) ++ set_immediate_dominator(CDI_DOMINATORS, bb, ENTRY_BLOCK_PTR_FOR_FN(cfun)); ++ ++ // enumarate all local variables and forcibly initialize our targets ++ FOR_EACH_LOCAL_DECL(cfun, i, var) { ++ tree type = TREE_TYPE(var); ++ ++ gcc_assert(DECL_P(var)); ++ if (!auto_var_in_fn_p(var, current_function_decl)) ++ continue; ++ ++ // only care about structure types ++ if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE) ++ continue; ++ ++ // if the type is of interest, examine the variable ++ if (TYPE_USERSPACE(type)) ++ initialize(var); ++ } ++ ++ return ret; ++} ++ ++#if BUILDING_GCC_VERSION >= 4009 ++namespace { ++static const struct pass_data structleak_pass_data = { ++#else ++static struct gimple_opt_pass structleak_pass = { ++ .pass = { ++#endif ++ .type = GIMPLE_PASS, ++ .name = "structleak", ++#if BUILDING_GCC_VERSION >= 4008 ++ .optinfo_flags = OPTGROUP_NONE, ++#endif ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 ++ .has_gate = false, ++ .has_execute = true, ++#else ++ .gate = NULL, ++ .execute = handle_function, ++ .sub = NULL, ++ .next = NULL, ++ .static_pass_number = 0, ++#endif ++ .tv_id = TV_NONE, ++ .properties_required = PROP_cfg, ++ .properties_provided = 0, ++ .properties_destroyed = 0, ++ .todo_flags_start = 0, ++ .todo_flags_finish = TODO_verify_ssa | TODO_verify_stmts | TODO_dump_func | TODO_remove_unused_locals | TODO_update_ssa | TODO_ggc_collect | TODO_verify_flow ++#if BUILDING_GCC_VERSION < 4009 ++ } ++#endif ++}; ++ ++#if BUILDING_GCC_VERSION >= 4009 ++class structleak_pass : public gimple_opt_pass { ++public: ++ structleak_pass() : gimple_opt_pass(structleak_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return handle_function(); } ++#else ++ unsigned int execute() { return handle_function(); } ++#endif ++}; ++} ++ ++static opt_pass *make_structleak_pass(void) ++{ ++ return new structleak_pass(); ++} ++#else ++static struct opt_pass *make_structleak_pass(void) ++{ ++ return &structleak_pass.pass; ++} ++#endif ++ ++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) ++{ ++ int i; ++ const char * const plugin_name = plugin_info->base_name; ++ const int argc = plugin_info->argc; ++ const struct plugin_argument * const argv = plugin_info->argv; ++ bool enable = true; ++ struct register_pass_info structleak_pass_info; ++ ++ structleak_pass_info.pass = make_structleak_pass(); ++ structleak_pass_info.reference_pass_name = "ssa"; ++ structleak_pass_info.ref_pass_instance_number = 1; ++ structleak_pass_info.pos_op = PASS_POS_INSERT_AFTER; ++ ++ if (!plugin_default_version_check(version, &gcc_version)) { ++ error(G_("incompatible gcc/plugin versions")); ++ return 1; ++ } ++ ++ if (strncmp(lang_hooks.name, "GNU C", 5) || !strncmp(lang_hooks.name, "GNU C+", 6)) { ++ inform(UNKNOWN_LOCATION, G_("%s supports C only"), plugin_name); ++ enable = false; ++ } ++ ++ for (i = 0; i < argc; ++i) { ++ if (!strcmp(argv[i].key, "disable")) { ++ enable = false; ++ continue; ++ } ++ error(G_("unkown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key); ++ } ++ ++ register_callback(plugin_name, PLUGIN_INFO, NULL, &structleak_plugin_info); ++ if (enable) { ++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &structleak_pass_info); ++ register_callback(plugin_name, PLUGIN_FINISH_TYPE, finish_type, NULL); ++ } ++ register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL); ++ ++ return 0; ++} +diff --git a/tools/include/linux/compiler.h b/tools/include/linux/compiler.h +index 88461f0..6fb70a0 100644 +--- a/tools/include/linux/compiler.h ++++ b/tools/include/linux/compiler.h +@@ -35,6 +35,14 @@ + # define unlikely(x) __builtin_expect(!!(x), 0) + #endif + ++#ifndef __size_overflow ++# define __size_overflow(...) ++#endif ++ ++#ifndef __intentional_overflow ++# define __intentional_overflow(...) ++#endif ++ + #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) + + #endif /* _TOOLS_LINUX_COMPILER_H */ +diff --git a/tools/lib/api/Makefile b/tools/lib/api/Makefile +index 36c08b1..87c72d1 100644 +--- a/tools/lib/api/Makefile ++++ b/tools/lib/api/Makefile +@@ -21,7 +21,7 @@ LIB_OBJS += $(OUTPUT)fd/array.o + + LIBFILE = libapikfs.a + +-CFLAGS = -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) -fPIC ++CFLAGS = -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) -fPIC + EXTLIBS = -lelf -lpthread -lrt -lm + ALL_CFLAGS = $(CFLAGS) $(BASIC_CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 + ALL_LDFLAGS = $(LDFLAGS) +diff --git a/tools/perf/util/include/asm/alternative-asm.h b/tools/perf/util/include/asm/alternative-asm.h +index 6789d788..4afd019e 100644 +--- a/tools/perf/util/include/asm/alternative-asm.h ++++ b/tools/perf/util/include/asm/alternative-asm.h +@@ -5,4 +5,7 @@ + + #define altinstruction_entry # + ++ .macro pax_force_retaddr rip=0, reload=0 ++ .endm ++ + #endif +diff --git a/tools/virtio/linux/uaccess.h b/tools/virtio/linux/uaccess.h +index 0a578fe..b81f62d 100644 +--- a/tools/virtio/linux/uaccess.h ++++ b/tools/virtio/linux/uaccess.h +@@ -13,7 +13,7 @@ static inline void __chk_user_ptr(const volatile void *p, size_t size) + ({ \ + typeof(ptr) __pu_ptr = (ptr); \ + __chk_user_ptr(__pu_ptr, sizeof(*__pu_ptr)); \ +- ACCESS_ONCE(*(__pu_ptr)) = x; \ ++ ACCESS_ONCE_RW(*(__pu_ptr)) = x; \ + 0; \ + }) + +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c +index 272fee8..d3e2e36 100644 +--- a/virt/kvm/kvm_main.c ++++ b/virt/kvm/kvm_main.c +@@ -78,12 +78,17 @@ LIST_HEAD(vm_list); + + static cpumask_var_t cpus_hardware_enabled; + static int kvm_usage_count = 0; +-static atomic_t hardware_enable_failed; ++static atomic_unchecked_t hardware_enable_failed; + + struct kmem_cache *kvm_vcpu_cache; + EXPORT_SYMBOL_GPL(kvm_vcpu_cache); + +-static __read_mostly struct preempt_ops kvm_preempt_ops; ++static void kvm_sched_in(struct preempt_notifier *pn, int cpu); ++static void kvm_sched_out(struct preempt_notifier *pn, struct task_struct *next); ++static struct preempt_ops kvm_preempt_ops = { ++ .sched_in = kvm_sched_in, ++ .sched_out = kvm_sched_out, ++}; + + struct dentry *kvm_debugfs_dir; + +@@ -786,7 +791,7 @@ int __kvm_set_memory_region(struct kvm *kvm, + /* We can read the guest memory with __xxx_user() later on. */ + if ((mem->slot < KVM_USER_MEM_SLOTS) && + ((mem->userspace_addr & (PAGE_SIZE - 1)) || +- !access_ok(VERIFY_WRITE, ++ !access_ok_noprefault(VERIFY_WRITE, + (void __user *)(unsigned long)mem->userspace_addr, + mem->memory_size))) + goto out; +@@ -1691,9 +1696,17 @@ EXPORT_SYMBOL_GPL(kvm_read_guest_cached); + + int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len) + { +- const void *zero_page = (const void *) __va(page_to_phys(ZERO_PAGE(0))); ++ int r; ++ unsigned long addr; + +- return kvm_write_guest_page(kvm, gfn, zero_page, offset, len); ++ addr = gfn_to_hva(kvm, gfn); ++ if (kvm_is_error_hva(addr)) ++ return -EFAULT; ++ r = __clear_user((void __user *)addr + offset, len); ++ if (r) ++ return -EFAULT; ++ mark_page_dirty(kvm, gfn); ++ return 0; + } + EXPORT_SYMBOL_GPL(kvm_clear_guest_page); + +@@ -1942,7 +1955,7 @@ static int kvm_vcpu_release(struct inode *inode, struct file *filp) + return 0; + } + +-static struct file_operations kvm_vcpu_fops = { ++static file_operations_no_const kvm_vcpu_fops __read_only = { + .release = kvm_vcpu_release, + .unlocked_ioctl = kvm_vcpu_ioctl, + #ifdef CONFIG_COMPAT +@@ -2652,7 +2665,7 @@ out: + } + #endif + +-static struct file_operations kvm_vm_fops = { ++static file_operations_no_const kvm_vm_fops __read_only = { + .release = kvm_vm_release, + .unlocked_ioctl = kvm_vm_ioctl, + #ifdef CONFIG_COMPAT +@@ -2723,7 +2736,7 @@ out: + return r; + } + +-static struct file_operations kvm_chardev_ops = { ++static file_operations_no_const kvm_chardev_ops __read_only = { + .unlocked_ioctl = kvm_dev_ioctl, + .compat_ioctl = kvm_dev_ioctl, + .llseek = noop_llseek, +@@ -2749,7 +2762,7 @@ static void hardware_enable_nolock(void *junk) + + if (r) { + cpumask_clear_cpu(cpu, cpus_hardware_enabled); +- atomic_inc(&hardware_enable_failed); ++ atomic_inc_unchecked(&hardware_enable_failed); + printk(KERN_INFO "kvm: enabling virtualization on " + "CPU%d failed\n", cpu); + } +@@ -2805,10 +2818,10 @@ static int hardware_enable_all(void) + + kvm_usage_count++; + if (kvm_usage_count == 1) { +- atomic_set(&hardware_enable_failed, 0); ++ atomic_set_unchecked(&hardware_enable_failed, 0); + on_each_cpu(hardware_enable_nolock, NULL, 1); + +- if (atomic_read(&hardware_enable_failed)) { ++ if (atomic_read_unchecked(&hardware_enable_failed)) { + hardware_disable_all_nolock(); + r = -EBUSY; + } +@@ -3215,7 +3228,7 @@ static void kvm_sched_out(struct preempt_notifier *pn, + kvm_arch_vcpu_put(vcpu); + } + +-int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, ++int kvm_init(const void *opaque, unsigned vcpu_size, unsigned vcpu_align, + struct module *module) + { + int r; +@@ -3262,7 +3275,7 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, + if (!vcpu_align) + vcpu_align = __alignof__(struct kvm_vcpu); + kvm_vcpu_cache = kmem_cache_create("kvm_vcpu", vcpu_size, vcpu_align, +- 0, NULL); ++ SLAB_USERCOPY, NULL); + if (!kvm_vcpu_cache) { + r = -ENOMEM; + goto out_free_3; +@@ -3272,9 +3285,11 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, + if (r) + goto out_free; + ++ pax_open_kernel(); + kvm_chardev_ops.owner = module; + kvm_vm_fops.owner = module; + kvm_vcpu_fops.owner = module; ++ pax_close_kernel(); + + r = misc_register(&kvm_dev); + if (r) { +@@ -3284,9 +3299,6 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, + + register_syscore_ops(&kvm_syscore_ops); + +- kvm_preempt_ops.sched_in = kvm_sched_in; +- kvm_preempt_ops.sched_out = kvm_sched_out; +- + r = kvm_init_debug(); + if (r) { + printk(KERN_ERR "kvm: create debugfs files failed\n"); |