# Base git commit: 4cece7649650 # (Linux 6.9-rc1) # # Author: Russell King (Oracle) (Thu 18 Apr 12:13:38 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:13:38 BST 2024) # # Merge branches 'amba' and 'misc' into for-next # # Author: Linus Walleij (Mon 15 Apr 09:42:42 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:12:18 BST 2024) # # ARM: 9382/1: ftrace: Define ftrace_stub_graph # # Several architectures defines this stub for the graph tracer, # and it is needed for CFI, as it needs a separate symbol for it. # The trick from include/asm-generic/vmlinux.lds.h to define # ftrace_stub_graph to ftrace_stub isn't working when using CFI. # Commit 883bbbffa5a4 contains the details. # # Tested-by: Kees Cook # Signed-off-by: Linus Walleij # Signed-off-by: Russell King (Oracle) # # a9a058031cfb7e1fcd7a03a4f7228179a0426cb4 # arch/arm/kernel/entry-ftrace.S | 4 ++++ # 1 file changed, 4 insertions(+) # # Author: Linus Walleij (Mon 25 Mar 07:31:13 GMT 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:10:46 BST 2024) # # ARM: 9358/2: Implement PAN for LPAE by TTBR0 page table walks disablement # # With LPAE enabled, privileged no-access cannot be enforced using CPU # domains as such feature is not available. This patch implements PAN # by disabling TTBR0 page table walks while in kernel mode. # # The ARM architecture allows page table walks to be split between TTBR0 # and TTBR1. With LPAE enabled, the split is defined by a combination of # TTBCR T0SZ and T1SZ bits. Currently, an LPAE-enabled kernel uses TTBR0 # for user addresses and TTBR1 for kernel addresses with the VMSPLIT_2G # and VMSPLIT_3G configurations. The main advantage for the 3:1 split is # that TTBR1 is reduced to 2 levels, so potentially faster TLB refill # (though usually the first level entries are already cached in the TLB). # # The PAN support on LPAE-enabled kernels uses TTBR0 when running in user # space or in kernel space during user access routines (TTBCR T0SZ and # T1SZ are both 0). When running user accesses are disabled in kernel # mode, TTBR0 page table walks are disabled by setting TTBCR.EPD0. TTBR1 # is used for kernel accesses (including loadable modules; anything # covered by swapper_pg_dir) by reducing the TTBCR.T0SZ to the minimum # (2^(32-7) = 32MB). To avoid user accesses potentially hitting stale TLB # entries, the ASID is switched to 0 (reserved) by setting TTBCR.A1 and # using the ASID value in TTBR1. The difference from a non-PAN kernel is # that with the 3:1 memory split, TTBR1 always uses 3 levels of page # tables. # # As part of the change we are using preprocessor elif definied() clauses # so balance these clauses by converting relevant precedingt ifdef # clauses to if defined() clauses. # # Signed-off-by: Catalin Marinas # Reviewed-by: Kees Cook # Tested-by: Florian Fainelli # Signed-off-by: Linus Walleij # Signed-off-by: Russell King (Oracle) # # 7af5b901e84743c608aae90cb0e429702812c324 # arch/arm/Kconfig | 22 +++++++++++++-- # arch/arm/include/asm/assembler.h | 1 + # arch/arm/include/asm/pgtable-3level-hwdef.h | 9 ++++++ # arch/arm/include/asm/ptrace.h | 1 + # arch/arm/include/asm/uaccess-asm.h | 44 ++++++++++++++++++++++++++++- # arch/arm/include/asm/uaccess.h | 26 ++++++++++++++++- # arch/arm/kernel/asm-offsets.c | 1 + # arch/arm/kernel/suspend.c | 8 ++++++ # arch/arm/lib/csumpartialcopyuser.S | 20 ++++++++++++- # arch/arm/mm/fault.c | 29 +++++++++++++++++++ # 10 files changed, 155 insertions(+), 6 deletions(-) # # Author: Linus Walleij (Mon 25 Mar 07:30:02 GMT 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:10:45 BST 2024) # # ARM: 9357/2: Reduce the number of #ifdef CONFIG_CPU_SW_DOMAIN_PAN # # This is a clean-up patch aimed at reducing the number of checks on # CONFIG_CPU_SW_DOMAIN_PAN, together with some empty lines for better # clarity once the CONFIG_CPU_TTBR0_PAN is introduced. # # Signed-off-by: Catalin Marinas # Reviewed-by: Kees Cook # Tested-by: Florian Fainelli # Signed-off-by: Linus Walleij # Signed-off-by: Russell King (Oracle) # # de7f60f0b03175ff056f18996d7e2577bc4baa65 # arch/arm/include/asm/uaccess-asm.h | 16 ++++++++++++---- # arch/arm/include/asm/uaccess.h | 21 +++++++++++++++------ # 2 files changed, 27 insertions(+), 10 deletions(-) # # Author: Linus Walleij (Mon 25 Mar 07:28:50 GMT 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:10:44 BST 2024) # # ARM: 9356/2: Move asm statements accessing TTBCR into C functions # # This patch implements cpu_get_ttbcr() and cpu_set_ttbcr() and replaces # the corresponding asm statements. # # Signed-off-by: Catalin Marinas # Reviewed-by: Kees Cook # Tested-by: Florian Fainelli # Signed-off-by: Linus Walleij # Signed-off-by: Russell King (Oracle) # # 66abdd3b5d4e53bc17c524493b404266e0af114e # arch/arm/include/asm/proc-fns.h | 12 ++++++++++++ # arch/arm/mm/mmu.c | 7 +++---- # 2 files changed, 15 insertions(+), 4 deletions(-) # # Author: Linus Walleij (Mon 25 Mar 07:27:00 GMT 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:10:43 BST 2024) # # ARM: 9355/2: Add TTBCR_* definitions to pgtable-3level-hwdef.h # # These macros will be used in a subsequent patch. # # At one point these were part of the ARM32 KVM but that is no # longer the case. # # Since these macros are only relevant to LPAE kernel builds, they # are added to pgtable-3level-hwdef.h # # Signed-off-by: Catalin Marinas # Reviewed-by: Kees Cook # Tested-by: Florian Fainelli # Signed-off-by: Linus Walleij # Signed-off-by: Russell King (Oracle) # # a8f15b31a6479d077b851c86a2cc47391bccafb5 # arch/arm/include/asm/pgtable-3level-hwdef.h | 17 +++++++++++++++++ # 1 file changed, 17 insertions(+) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:18 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:28 BST 2024) # # ARM: 9379/1: coresight: tpda: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-11-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # aff00427579d4c915ee92553f712e4c632185e6e # drivers/hwtracing/coresight/coresight-tpda.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:12 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:27 BST 2024) # # ARM: 9378/1: coresight: etm4x: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-5-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 8fea6b7ff574dd4e04364de8c2cdfc2f2b7d47c2 # drivers/hwtracing/coresight/coresight-etm4x-core.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:22 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:26 BST 2024) # # ARM: 9377/1: hwrng: nomadik: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-15-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 4b5bcd5a3c843fb72ee5c25dcf28338905f295bd # drivers/char/hw_random/nomadik-rng.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:19 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:25 BST 2024) # # ARM: 9376/1: coresight: tpdm: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-12-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 87ef18443e24cac1aaa78ffcf16fce991ed246da # drivers/hwtracing/coresight/coresight-tpdm.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:16 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:25 BST 2024) # # ARM: 9375/1: coresight: stm: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-9-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 60bf16d824fb5623e5a721ae7d458048b4bcbd0f # drivers/hwtracing/coresight/coresight-stm.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:15 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:24 BST 2024) # # ARM: 9374/1: coresight: etb10: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-8-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # a0c50b9bd932139e7f2bc7e8851a446e5e8a4392 # drivers/hwtracing/coresight/coresight-etb10.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:13 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:23 BST 2024) # # ARM: 9373/1: coresight: funnel: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-6-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 7ebc2eefdc3c4a913df05fedf784bd0a81daf1cb # drivers/hwtracing/coresight/coresight-funnel.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:25 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:22 BST 2024) # # ARM: 9372/1: memory: pl353-smc: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-18-4517b091385b@linaro.org # # Reviewed-by: Miquel Raynal # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 93fcceffc6a6fe261ccd5f1565e0b8d5f176f41a # drivers/memory/pl353-smc.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:09 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:22 BST 2024) # # ARM: 9371/1: coresight: cti: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-2-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 862acebd11861996dc90a45caacb4b95332841de # drivers/hwtracing/coresight/coresight-cti-core.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:26 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:21 BST 2024) # # ARM: 9370/1: vfio: amba: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-19-4517b091385b@linaro.org # # Reviewed-by: Eric Auger # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # bb549ce39d3f8eb60e87c32a41b3fadf4b15954e # drivers/vfio/platform/vfio_amba.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:24 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:20 BST 2024) # # ARM: 9369/1: Input: ambakmi - drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-17-4517b091385b@linaro.org # # Acked-by: Dmitry Torokhov # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 6fce490c80cf2382d6ffe5d653c98d06db041b6c # drivers/input/serio/ambakmi.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:23 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:19 BST 2024) # # ARM: 9368/1: dmaengine: pl330: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-16-4517b091385b@linaro.org # # Acked-by: Vinod Koul # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 8ab268e97d06e0be4339b6a8d9eccfae959587a8 # drivers/dma/pl330.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:21 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:18 BST 2024) # # ARM: 9367/1: i2c: nomadik: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-14-4517b091385b@linaro.org # # Acked-by: Linus Walleij # Acked-by: Andi Shyti # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 727265eeaf8e858dfd0d7a5f3a4195e00905bfb5 # drivers/i2c/busses/i2c-nomadik.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:20 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:18 BST 2024) # # ARM: 9366/1: coresight: tpiu: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-13-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 57c7aa7ef2d7cce9c4d59dc10c162d371e78b9f7 # drivers/hwtracing/coresight/coresight-tpiu.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:17 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:17 BST 2024) # # ARM: 9365/1: coresight: tmc: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-10-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # a257144055b40cd0e756bb29dbf8eaed9c4b303b # drivers/hwtracing/coresight/coresight-tmc-core.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:14 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:16 BST 2024) # # ARM: 9364/1: coresight: replicator: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-7-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 90b5ec20e7204511f70f52eaa3dc7a6e5a6c2bbf # drivers/hwtracing/coresight/coresight-replicator.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:11 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:15 BST 2024) # # ARM: 9363/1: coresight: etm3x: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-4-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 152a7a4c4dc10270b7e95fe38527d66bd9dd2887 # drivers/hwtracing/coresight/coresight-etm3x-core.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:10 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:14 BST 2024) # # ARM: 9362/1: coresight: catu: drop owner assignment # # Amba bus core already sets owner, so driver does not need to. # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-3-4517b091385b@linaro.org # # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 45745c84a7615c436a1a16d8643959a9c2bd72c9 # drivers/hwtracing/coresight/coresight-catu.c | 1 - # 1 file changed, 1 deletion(-) # # Author: Krzysztof Kozlowski (Tue 2 Apr 10:51:08 BST 2024) # Committer: Russell King (Oracle) (Thu 18 Apr 12:09:14 BST 2024) # # ARM: 9361/1: amba: store owner from modules with amba_driver_register() # # Modules registering driver with amba_driver_register() often forget to # set .owner field. The field is used by some of other kernel parts for # reference counting (try_module_get()), so it is expected that drivers # will set it. # # Solve the problem by moving this task away from the drivers to the core # amba bus code, just like we did for platform_driver in # commit 9447057eaff8 ("platform_device: use a macro instead of # platform_driver_register"). # # Link: https://lore.kernel.org/r/20240326-module-owner-amba-v1-1-4517b091385b@linaro.org # # Reviewed-by: Andi Shyti # Acked-by: Suzuki K Poulose # Signed-off-by: Krzysztof Kozlowski # Signed-off-by: Russell King (Oracle) # # 5677b17c33246fb69ecc250d493c635500b78980 # drivers/amba/bus.c | 11 +++++++---- # include/linux/amba/bus.h | 11 +++++++++-- # 2 files changed, 16 insertions(+), 6 deletions(-) # diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index b14aed3a17ab..1394a8491210 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1233,9 +1233,9 @@ config HIGHPTE consumed by page tables. Setting this option will allow user-space 2nd level page tables to reside in high memory. -config CPU_SW_DOMAIN_PAN - bool "Enable use of CPU domains to implement privileged no-access" - depends on MMU && !ARM_LPAE +config ARM_PAN + bool "Enable privileged no-access" + depends on MMU default y help Increase kernel security by ensuring that normal kernel accesses @@ -1244,10 +1244,26 @@ config CPU_SW_DOMAIN_PAN by ensuring that magic values (such as LIST_POISON) will always fault when dereferenced. + The implementation uses CPU domains when !CONFIG_ARM_LPAE and + disabling of TTBR0 page table walks with CONFIG_ARM_LPAE. + +config CPU_SW_DOMAIN_PAN + def_bool y + depends on ARM_PAN && !ARM_LPAE + help + Enable use of CPU domains to implement privileged no-access. + CPUs with low-vector mappings use a best-efforts implementation. Their lower 1MB needs to remain accessible for the vectors, but the remainder of userspace will become appropriately inaccessible. +config CPU_TTBR0_PAN + def_bool y + depends on ARM_PAN && ARM_LPAE + help + Enable privileged no-access by disabling TTBR0 page table walks when + running in kernel mode. + config HW_PERF_EVENTS def_bool y depends on ARM_PMU diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index aebe2c8f6a68..d33c1e24e00b 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include diff --git a/arch/arm/include/asm/pgtable-3level-hwdef.h b/arch/arm/include/asm/pgtable-3level-hwdef.h index 2f35b4eddaa8..323ad811732e 100644 --- a/arch/arm/include/asm/pgtable-3level-hwdef.h +++ b/arch/arm/include/asm/pgtable-3level-hwdef.h @@ -74,6 +74,7 @@ #define PHYS_MASK_SHIFT (40) #define PHYS_MASK ((1ULL << PHYS_MASK_SHIFT) - 1) +#ifndef CONFIG_CPU_TTBR0_PAN /* * TTBR0/TTBR1 split (PAGE_OFFSET): * 0x40000000: T0SZ = 2, T1SZ = 0 (not used) @@ -93,5 +94,30 @@ #endif #define TTBR1_SIZE (((PAGE_OFFSET >> 30) - 1) << 16) +#else +/* + * With CONFIG_CPU_TTBR0_PAN enabled, TTBR1 is only used during uaccess + * disabled regions when TTBR0 is disabled. + */ +#define TTBR1_OFFSET 0 /* pointing to swapper_pg_dir */ +#define TTBR1_SIZE 0 /* TTBR1 size controlled via TTBCR.T0SZ */ +#endif + +/* + * TTBCR register bits. + */ +#define TTBCR_EAE (1 << 31) +#define TTBCR_IMP (1 << 30) +#define TTBCR_SH1_MASK (3 << 28) +#define TTBCR_ORGN1_MASK (3 << 26) +#define TTBCR_IRGN1_MASK (3 << 24) +#define TTBCR_EPD1 (1 << 23) +#define TTBCR_A1 (1 << 22) +#define TTBCR_T1SZ_MASK (7 << 16) +#define TTBCR_SH0_MASK (3 << 12) +#define TTBCR_ORGN0_MASK (3 << 10) +#define TTBCR_IRGN0_MASK (3 << 8) +#define TTBCR_EPD0 (1 << 7) +#define TTBCR_T0SZ_MASK (7 << 0) #endif diff --git a/arch/arm/include/asm/proc-fns.h b/arch/arm/include/asm/proc-fns.h index 280396483f5d..9b3105a2a5e0 100644 --- a/arch/arm/include/asm/proc-fns.h +++ b/arch/arm/include/asm/proc-fns.h @@ -178,6 +178,18 @@ extern void cpu_resume(void); }) #endif +static inline unsigned int cpu_get_ttbcr(void) +{ + unsigned int ttbcr; + asm("mrc p15, 0, %0, c2, c0, 2" : "=r" (ttbcr)); + return ttbcr; +} + +static inline void cpu_set_ttbcr(unsigned int ttbcr) +{ + asm("mcr p15, 0, %0, c2, c0, 2" : : "r" (ttbcr)); +} + #else /*!CONFIG_MMU */ #define cpu_switch_mm(pgd,mm) { } diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h index 14a38cc67e0b..6eb311fb2da0 100644 --- a/arch/arm/include/asm/ptrace.h +++ b/arch/arm/include/asm/ptrace.h @@ -20,6 +20,7 @@ struct pt_regs { struct svc_pt_regs { struct pt_regs regs; u32 dacr; + u32 ttbcr; }; #define to_svc_pt_regs(r) container_of(r, struct svc_pt_regs, regs) diff --git a/arch/arm/include/asm/uaccess-asm.h b/arch/arm/include/asm/uaccess-asm.h index 65da32e1f1c1..4bccd895d954 100644 --- a/arch/arm/include/asm/uaccess-asm.h +++ b/arch/arm/include/asm/uaccess-asm.h @@ -39,8 +39,9 @@ #endif .endm +#if defined(CONFIG_CPU_SW_DOMAIN_PAN) + .macro uaccess_disable, tmp, isb=1 -#ifdef CONFIG_CPU_SW_DOMAIN_PAN /* * Whenever we re-enter userspace, the domains should always be * set appropriately. @@ -50,11 +51,9 @@ .if \isb instr_sync .endif -#endif .endm .macro uaccess_enable, tmp, isb=1 -#ifdef CONFIG_CPU_SW_DOMAIN_PAN /* * Whenever we re-enter userspace, the domains should always be * set appropriately. @@ -64,13 +63,59 @@ .if \isb instr_sync .endif -#endif .endm +#elif defined(CONFIG_CPU_TTBR0_PAN) + + .macro uaccess_disable, tmp, isb=1 + /* + * Disable TTBR0 page table walks (EDP0 = 1), use the reserved ASID + * from TTBR1 (A1 = 1) and enable TTBR1 page table walks for kernel + * addresses by reducing TTBR0 range to 32MB (T0SZ = 7). + */ + mrc p15, 0, \tmp, c2, c0, 2 @ read TTBCR + orr \tmp, \tmp, #TTBCR_EPD0 | TTBCR_T0SZ_MASK + orr \tmp, \tmp, #TTBCR_A1 + mcr p15, 0, \tmp, c2, c0, 2 @ write TTBCR + .if \isb + instr_sync + .endif + .endm + + .macro uaccess_enable, tmp, isb=1 + /* + * Enable TTBR0 page table walks (T0SZ = 0, EDP0 = 0) and ASID from + * TTBR0 (A1 = 0). + */ + mrc p15, 0, \tmp, c2, c0, 2 @ read TTBCR + bic \tmp, \tmp, #TTBCR_EPD0 | TTBCR_T0SZ_MASK + bic \tmp, \tmp, #TTBCR_A1 + mcr p15, 0, \tmp, c2, c0, 2 @ write TTBCR + .if \isb + instr_sync + .endif + .endm + +#else + + .macro uaccess_disable, tmp, isb=1 + .endm + + .macro uaccess_enable, tmp, isb=1 + .endm + +#endif + #if defined(CONFIG_CPU_SW_DOMAIN_PAN) || defined(CONFIG_CPU_USE_DOMAINS) #define DACR(x...) x #else #define DACR(x...) +#endif + +#ifdef CONFIG_CPU_TTBR0_PAN +#define PAN(x...) x +#else +#define PAN(x...) #endif /* @@ -86,6 +131,8 @@ .macro uaccess_entry, tsk, tmp0, tmp1, tmp2, disable DACR( mrc p15, 0, \tmp0, c3, c0, 0) DACR( str \tmp0, [sp, #SVC_DACR]) + PAN( mrc p15, 0, \tmp0, c2, c0, 2) + PAN( str \tmp0, [sp, #SVC_TTBCR]) .if \disable && IS_ENABLED(CONFIG_CPU_SW_DOMAIN_PAN) /* kernel=client, user=no access */ mov \tmp2, #DACR_UACCESS_DISABLE @@ -104,8 +151,11 @@ .macro uaccess_exit, tsk, tmp0, tmp1 DACR( ldr \tmp0, [sp, #SVC_DACR]) DACR( mcr p15, 0, \tmp0, c3, c0, 0) + PAN( ldr \tmp0, [sp, #SVC_TTBCR]) + PAN( mcr p15, 0, \tmp0, c2, c0, 2) .endm #undef DACR +#undef PAN #endif /* __ASM_UACCESS_ASM_H__ */ diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index 9556d04387f7..25d21d7d6e3e 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include @@ -24,9 +26,10 @@ * perform such accesses (eg, via list poison values) which could then * be exploited for priviledge escalation. */ +#if defined(CONFIG_CPU_SW_DOMAIN_PAN) + static __always_inline unsigned int uaccess_save_and_enable(void) { -#ifdef CONFIG_CPU_SW_DOMAIN_PAN unsigned int old_domain = get_domain(); /* Set the current domain access to permit user accesses */ @@ -34,19 +37,49 @@ static __always_inline unsigned int uaccess_save_and_enable(void) domain_val(DOMAIN_USER, DOMAIN_CLIENT)); return old_domain; -#else - return 0; -#endif } static __always_inline void uaccess_restore(unsigned int flags) { -#ifdef CONFIG_CPU_SW_DOMAIN_PAN /* Restore the user access mask */ set_domain(flags); -#endif } +#elif defined(CONFIG_CPU_TTBR0_PAN) + +static inline unsigned int uaccess_save_and_enable(void) +{ + unsigned int old_ttbcr = cpu_get_ttbcr(); + + /* + * Enable TTBR0 page table walks (T0SZ = 0, EDP0 = 0) and ASID from + * TTBR0 (A1 = 0). + */ + cpu_set_ttbcr(old_ttbcr & ~(TTBCR_A1 | TTBCR_EPD0 | TTBCR_T0SZ_MASK)); + isb(); + + return old_ttbcr; +} + +static inline void uaccess_restore(unsigned int flags) +{ + cpu_set_ttbcr(flags); + isb(); +} + +#else + +static inline unsigned int uaccess_save_and_enable(void) +{ + return 0; +} + +static inline void uaccess_restore(unsigned int flags) +{ +} + +#endif + /* * These two are intentionally not defined anywhere - if the kernel * code generates any references to them, that's a bug. diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index 4915662842ff..4853875740d0 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c @@ -85,6 +85,7 @@ int main(void) DEFINE(S_OLD_R0, offsetof(struct pt_regs, ARM_ORIG_r0)); DEFINE(PT_REGS_SIZE, sizeof(struct pt_regs)); DEFINE(SVC_DACR, offsetof(struct svc_pt_regs, dacr)); + DEFINE(SVC_TTBCR, offsetof(struct svc_pt_regs, ttbcr)); DEFINE(SVC_REGS_SIZE, sizeof(struct svc_pt_regs)); BLANK(); DEFINE(SIGFRAME_RC3_OFFSET, offsetof(struct sigframe, retcode[3])); diff --git a/arch/arm/kernel/entry-ftrace.S b/arch/arm/kernel/entry-ftrace.S index 3e7bcaca5e07..bc598e3d8dd2 100644 --- a/arch/arm/kernel/entry-ftrace.S +++ b/arch/arm/kernel/entry-ftrace.S @@ -271,6 +271,10 @@ ENTRY(ftrace_stub) ret lr ENDPROC(ftrace_stub) +ENTRY(ftrace_stub_graph) + ret lr +ENDPROC(ftrace_stub_graph) + #ifdef CONFIG_DYNAMIC_FTRACE __INIT diff --git a/arch/arm/kernel/suspend.c b/arch/arm/kernel/suspend.c index c3ec3861dd07..58a6441b58c4 100644 --- a/arch/arm/kernel/suspend.c +++ b/arch/arm/kernel/suspend.c @@ -12,6 +12,7 @@ #include #include #include +#include extern int __cpu_suspend(unsigned long, int (*)(unsigned long), u32 cpuid); extern void cpu_resume_mmu(void); @@ -26,6 +27,13 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long)) if (!idmap_pgd) return -EINVAL; + /* + * Needed for the MMU disabling/enabing code to be able to run from + * TTBR0 addresses. + */ + if (IS_ENABLED(CONFIG_CPU_TTBR0_PAN)) + uaccess_save_and_enable(); + /* * Function graph tracer state gets incosistent when the kernel * calls functions that never return (aka suspend finishers) hence diff --git a/arch/arm/lib/csumpartialcopyuser.S b/arch/arm/lib/csumpartialcopyuser.S index 6928781e6bee..c289bde04743 100644 --- a/arch/arm/lib/csumpartialcopyuser.S +++ b/arch/arm/lib/csumpartialcopyuser.S @@ -13,7 +13,8 @@ .text -#ifdef CONFIG_CPU_SW_DOMAIN_PAN +#if defined(CONFIG_CPU_SW_DOMAIN_PAN) + .macro save_regs mrc p15, 0, ip, c3, c0, 0 stmfd sp!, {r1, r2, r4 - r8, ip, lr} @@ -25,7 +26,23 @@ mcr p15, 0, ip, c3, c0, 0 ret lr .endm + +#elif defined(CONFIG_CPU_TTBR0_PAN) + + .macro save_regs + mrc p15, 0, ip, c2, c0, 2 @ read TTBCR + stmfd sp!, {r1, r2, r4 - r8, ip, lr} + uaccess_enable ip + .endm + + .macro load_regs + ldmfd sp!, {r1, r2, r4 - r8, ip, lr} + mcr p15, 0, ip, c2, c0, 2 @ restore TTBCR + ret lr + .endm + #else + .macro save_regs stmfd sp!, {r1, r2, r4 - r8, lr} .endm @@ -33,6 +50,7 @@ .macro load_regs ldmfd sp!, {r1, r2, r4 - r8, pc} .endm + #endif .macro load1b, reg1 diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index 439dc6a26bb9..dfa9554ef331 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c @@ -242,6 +242,27 @@ static inline bool is_permission_fault(unsigned int fsr) return false; } +#ifdef CONFIG_CPU_TTBR0_PAN +static inline bool ttbr0_usermode_access_allowed(struct pt_regs *regs) +{ + struct svc_pt_regs *svcregs; + + /* If we are in user mode: permission granted */ + if (user_mode(regs)) + return true; + + /* uaccess state saved above pt_regs on SVC exception entry */ + svcregs = to_svc_pt_regs(regs); + + return !(svcregs->ttbcr & TTBCR_EPD0); +} +#else +static inline bool ttbr0_usermode_access_allowed(struct pt_regs *regs) +{ + return true; +} +#endif + static int __kprobes do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) { @@ -285,6 +306,14 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr); + /* + * Privileged access aborts with CONFIG_CPU_TTBR0_PAN enabled are + * routed via the translation fault mechanism. Check whether uaccess + * is disabled while in kernel mode. + */ + if (!ttbr0_usermode_access_allowed(regs)) + goto no_context; + if (!(flags & FAULT_FLAG_USER)) goto lock_mmap; diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index c24e29c0b9a4..3f774856ca67 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -1687,9 +1687,8 @@ static void __init early_paging_init(const struct machine_desc *mdesc) */ cr = get_cr(); set_cr(cr & ~(CR_I | CR_C)); - asm("mrc p15, 0, %0, c2, c0, 2" : "=r" (ttbcr)); - asm volatile("mcr p15, 0, %0, c2, c0, 2" - : : "r" (ttbcr & ~(3 << 8 | 3 << 10))); + ttbcr = cpu_get_ttbcr(); + cpu_set_ttbcr(ttbcr & ~(3 << 8 | 3 << 10)); flush_cache_all(); /* @@ -1701,7 +1700,7 @@ static void __init early_paging_init(const struct machine_desc *mdesc) lpae_pgtables_remap(offset, pa_pgd); /* Re-enable the caches and cacheable TLB walks */ - asm volatile("mcr p15, 0, %0, c2, c0, 2" : : "r" (ttbcr)); + cpu_set_ttbcr(ttbcr); set_cr(cr); } diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index a24c152bfaac..aba3aa95b224 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c @@ -488,28 +488,31 @@ static int __init amba_stub_drv_init(void) * waiting on amba_match(). So, register a stub driver to make sure * amba_match() is called even if no amba driver has been registered. */ - return amba_driver_register(&amba_proxy_drv); + return __amba_driver_register(&amba_proxy_drv, NULL); } late_initcall_sync(amba_stub_drv_init); /** - * amba_driver_register - register an AMBA device driver + * __amba_driver_register - register an AMBA device driver * @drv: amba device driver structure + * @owner: owning module/driver * * Register an AMBA device driver with the Linux device model * core. If devices pre-exist, the drivers probe function will * be called. */ -int amba_driver_register(struct amba_driver *drv) +int __amba_driver_register(struct amba_driver *drv, + struct module *owner) { if (!drv->probe) return -EINVAL; + drv->drv.owner = owner; drv->drv.bus = &amba_bustype; return driver_register(&drv->drv); } -EXPORT_SYMBOL(amba_driver_register); +EXPORT_SYMBOL(__amba_driver_register); /** * amba_driver_unregister - remove an AMBA device driver diff --git a/drivers/char/hw_random/nomadik-rng.c b/drivers/char/hw_random/nomadik-rng.c index a2009fc4ad3c..f2a2aa7a531c 100644 --- a/drivers/char/hw_random/nomadik-rng.c +++ b/drivers/char/hw_random/nomadik-rng.c @@ -78,7 +78,6 @@ MODULE_DEVICE_TABLE(amba, nmk_rng_ids); static struct amba_driver nmk_rng_driver = { .drv = { - .owner = THIS_MODULE, .name = "rng", }, .probe = nmk_rng_probe, diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index 5f6d7f1e095f..b37ef28bb417 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c @@ -3265,7 +3265,6 @@ MODULE_DEVICE_TABLE(amba, pl330_ids); static struct amba_driver pl330_driver = { .drv = { - .owner = THIS_MODULE, .name = "dma-pl330", .pm = &pl330_pm, }, diff --git a/drivers/hwtracing/coresight/coresight-catu.c b/drivers/hwtracing/coresight/coresight-catu.c index 3949ded0d4fa..375bd0d89b0c 100644 --- a/drivers/hwtracing/coresight/coresight-catu.c +++ b/drivers/hwtracing/coresight/coresight-catu.c @@ -590,7 +590,6 @@ MODULE_DEVICE_TABLE(amba, catu_ids); static struct amba_driver catu_driver = { .drv = { .name = "coresight-catu", - .owner = THIS_MODULE, .suppress_bind_attrs = true, }, .probe = catu_probe, diff --git a/drivers/hwtracing/coresight/coresight-cti-core.c b/drivers/hwtracing/coresight/coresight-cti-core.c index e805617020d0..d2b5a5718c29 100644 --- a/drivers/hwtracing/coresight/coresight-cti-core.c +++ b/drivers/hwtracing/coresight/coresight-cti-core.c @@ -982,7 +982,6 @@ MODULE_DEVICE_TABLE(amba, cti_ids); static struct amba_driver cti_driver = { .drv = { .name = "coresight-cti", - .owner = THIS_MODULE, .suppress_bind_attrs = true, }, .probe = cti_probe, diff --git a/drivers/hwtracing/coresight/coresight-etb10.c b/drivers/hwtracing/coresight/coresight-etb10.c index 3aab182b562f..7edd3f1d0d46 100644 --- a/drivers/hwtracing/coresight/coresight-etb10.c +++ b/drivers/hwtracing/coresight/coresight-etb10.c @@ -844,7 +844,6 @@ MODULE_DEVICE_TABLE(amba, etb_ids); static struct amba_driver etb_driver = { .drv = { .name = "coresight-etb10", - .owner = THIS_MODULE, .pm = &etb_dev_pm_ops, .suppress_bind_attrs = true, diff --git a/drivers/hwtracing/coresight/coresight-etm3x-core.c b/drivers/hwtracing/coresight/coresight-etm3x-core.c index 9d5c1391ffb1..8b362605d242 100644 --- a/drivers/hwtracing/coresight/coresight-etm3x-core.c +++ b/drivers/hwtracing/coresight/coresight-etm3x-core.c @@ -1008,7 +1008,6 @@ MODULE_DEVICE_TABLE(amba, etm_ids); static struct amba_driver etm_driver = { .drv = { .name = "coresight-etm3x", - .owner = THIS_MODULE, .pm = &etm_dev_pm_ops, .suppress_bind_attrs = true, }, diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c index c2ca4a02dfce..e6cd9705596c 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c @@ -2344,7 +2344,6 @@ MODULE_DEVICE_TABLE(amba, etm4_ids); static struct amba_driver etm4x_amba_driver = { .drv = { .name = "coresight-etm4x", - .owner = THIS_MODULE, .suppress_bind_attrs = true, }, .probe = etm4_probe_amba, diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c index ef1a0abfee4e..5ab1f592917a 100644 --- a/drivers/hwtracing/coresight/coresight-funnel.c +++ b/drivers/hwtracing/coresight/coresight-funnel.c @@ -399,7 +399,6 @@ MODULE_DEVICE_TABLE(amba, dynamic_funnel_ids); static struct amba_driver dynamic_funnel_driver = { .drv = { .name = "coresight-dynamic-funnel", - .owner = THIS_MODULE, .pm = &funnel_dev_pm_ops, .suppress_bind_attrs = true, }, diff --git a/drivers/hwtracing/coresight/coresight-replicator.c b/drivers/hwtracing/coresight/coresight-replicator.c index 73452d9dc13b..2bb9ba66e3c0 100644 --- a/drivers/hwtracing/coresight/coresight-replicator.c +++ b/drivers/hwtracing/coresight/coresight-replicator.c @@ -406,7 +406,6 @@ static struct amba_driver dynamic_replicator_driver = { .drv = { .name = "coresight-dynamic-replicator", .pm = &replicator_dev_pm_ops, - .owner = THIS_MODULE, .suppress_bind_attrs = true, }, .probe = dynamic_replicator_probe, diff --git a/drivers/hwtracing/coresight/coresight-stm.c b/drivers/hwtracing/coresight/coresight-stm.c index 974d37e5f94c..15b52358965c 100644 --- a/drivers/hwtracing/coresight/coresight-stm.c +++ b/drivers/hwtracing/coresight/coresight-stm.c @@ -954,7 +954,6 @@ MODULE_DEVICE_TABLE(amba, stm_ids); static struct amba_driver stm_driver = { .drv = { .name = "coresight-stm", - .owner = THIS_MODULE, .pm = &stm_dev_pm_ops, .suppress_bind_attrs = true, }, diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c index 72005b0c633e..0d251cae814f 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-core.c +++ b/drivers/hwtracing/coresight/coresight-tmc-core.c @@ -602,7 +602,6 @@ MODULE_DEVICE_TABLE(amba, tmc_ids); static struct amba_driver tmc_driver = { .drv = { .name = "coresight-tmc", - .owner = THIS_MODULE, .suppress_bind_attrs = true, }, .probe = tmc_probe, diff --git a/drivers/hwtracing/coresight/coresight-tpda.c b/drivers/hwtracing/coresight/coresight-tpda.c index 7739bc7adc44..bfca103f9f84 100644 --- a/drivers/hwtracing/coresight/coresight-tpda.c +++ b/drivers/hwtracing/coresight/coresight-tpda.c @@ -333,7 +333,6 @@ static struct amba_id tpda_ids[] = { static struct amba_driver tpda_driver = { .drv = { .name = "coresight-tpda", - .owner = THIS_MODULE, .suppress_bind_attrs = true, }, .probe = tpda_probe, diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c index a9708ab0d488..0726f8842552 100644 --- a/drivers/hwtracing/coresight/coresight-tpdm.c +++ b/drivers/hwtracing/coresight/coresight-tpdm.c @@ -1310,7 +1310,6 @@ static struct amba_id tpdm_ids[] = { static struct amba_driver tpdm_driver = { .drv = { .name = "coresight-tpdm", - .owner = THIS_MODULE, .suppress_bind_attrs = true, }, .probe = tpdm_probe, diff --git a/drivers/hwtracing/coresight/coresight-tpiu.c b/drivers/hwtracing/coresight/coresight-tpiu.c index 29024f880fda..7dc9ea564bca 100644 --- a/drivers/hwtracing/coresight/coresight-tpiu.c +++ b/drivers/hwtracing/coresight/coresight-tpiu.c @@ -236,7 +236,6 @@ MODULE_DEVICE_TABLE(amba, tpiu_ids); static struct amba_driver tpiu_driver = { .drv = { .name = "coresight-tpiu", - .owner = THIS_MODULE, .pm = &tpiu_dev_pm_ops, .suppress_bind_attrs = true, }, diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index 4f41a3c7824d..17fb313565b8 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -1194,7 +1194,6 @@ MODULE_DEVICE_TABLE(amba, nmk_i2c_ids); static struct amba_driver nmk_i2c_driver = { .drv = { - .owner = THIS_MODULE, .name = DRIVER_NAME, .pm = pm_ptr(&nmk_i2c_pm), }, diff --git a/drivers/input/serio/ambakmi.c b/drivers/input/serio/ambakmi.c index 8fbfa448be4a..496bb7a312d2 100644 --- a/drivers/input/serio/ambakmi.c +++ b/drivers/input/serio/ambakmi.c @@ -195,7 +195,6 @@ MODULE_DEVICE_TABLE(amba, amba_kmi_idtable); static struct amba_driver ambakmi_driver = { .drv = { .name = "kmi-pl050", - .owner = THIS_MODULE, .pm = pm_sleep_ptr(&amba_kmi_dev_pm_ops), }, .id_table = amba_kmi_idtable, diff --git a/drivers/memory/pl353-smc.c b/drivers/memory/pl353-smc.c index 48540817e046..56e51737c81f 100644 --- a/drivers/memory/pl353-smc.c +++ b/drivers/memory/pl353-smc.c @@ -154,7 +154,6 @@ MODULE_DEVICE_TABLE(amba, pl353_ids); static struct amba_driver pl353_smc_driver = { .drv = { - .owner = THIS_MODULE, .name = "pl353-smc", .pm = &pl353_smc_dev_pm_ops, }, diff --git a/drivers/vfio/platform/vfio_amba.c b/drivers/vfio/platform/vfio_amba.c index 485c6f9161a9..ff8ff8480968 100644 --- a/drivers/vfio/platform/vfio_amba.c +++ b/drivers/vfio/platform/vfio_amba.c @@ -134,7 +134,6 @@ static struct amba_driver vfio_amba_driver = { .id_table = vfio_amba_ids, .drv = { .name = "vfio-amba", - .owner = THIS_MODULE, }, .driver_managed_dma = true, }; diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h index c60a6a14638c..958a55bcc708 100644 --- a/include/linux/amba/bus.h +++ b/include/linux/amba/bus.h @@ -112,11 +112,18 @@ extern struct bus_type amba_bustype; #define amba_get_drvdata(d) dev_get_drvdata(&d->dev) #define amba_set_drvdata(d,p) dev_set_drvdata(&d->dev, p) +/* + * use a macro to avoid include chaining to get THIS_MODULE + */ +#define amba_driver_register(drv) \ + __amba_driver_register(drv, THIS_MODULE) + #ifdef CONFIG_ARM_AMBA -int amba_driver_register(struct amba_driver *); +int __amba_driver_register(struct amba_driver *, struct module *); void amba_driver_unregister(struct amba_driver *); #else -static inline int amba_driver_register(struct amba_driver *drv) +static inline int __amba_driver_register(struct amba_driver *drv, + struct module *owner) { return -EINVAL; }