Merge tag 'asm-generic-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Aug 2022 17:07:23 +0000 (10:07 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Aug 2022 17:07:23 +0000 (10:07 -0700)
Pull asm-generic updates from Arnd Bergmann:
 "There are three independent sets of changes:

   - Sai Prakash Ranjan adds tracing support to the asm-generic version
     of the MMIO accessors, which is intended to help understand
     problems with device drivers and has been part of Qualcomm's vendor
     kernels for many years

   - A patch from Sebastian Siewior to rework the handling of IRQ stacks
     in softirqs across architectures, which is needed for enabling
     PREEMPT_RT

   - The last patch to remove the CONFIG_VIRT_TO_BUS option and some of
     the code behind that, after the last users of this old interface
     made it in through the netdev, scsi, media and staging trees"

* tag 'asm-generic-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic:
  uapi: asm-generic: fcntl: Fix typo 'the the' in comment
  arch/*/: remove CONFIG_VIRT_TO_BUS
  soc: qcom: geni: Disable MMIO tracing for GENI SE
  serial: qcom_geni_serial: Disable MMIO tracing for geni serial
  asm-generic/io: Add logging support for MMIO accessors
  KVM: arm64: Add a flag to disable MMIO trace for nVHE KVM
  lib: Add register read/write tracing support
  drm/meson: Fix overflow implicit truncation warnings
  irqchip/tegra: Fix overflow implicit truncation warnings
  coresight: etm4x: Use asm-generic IO memory barriers
  arm64: io: Use asm-generic high level MMIO accessors
  arch/*: Disable softirq stacks on PREEMPT_RT.

20 files changed:
1  2 
Documentation/translations/zh_CN/core-api/index.rst
arch/Kconfig
arch/arm64/Kconfig
arch/arm64/include/asm/io.h
arch/arm64/kvm/hyp/nvhe/Makefile
arch/microblaze/Kconfig
arch/mips/Kconfig
arch/parisc/Kconfig
arch/parisc/kernel/irq.c
arch/powerpc/Kconfig
arch/sh/kernel/irq.c
arch/x86/Kconfig
arch/xtensa/Kconfig
drivers/hwtracing/coresight/coresight-etm4x-core.c
drivers/hwtracing/coresight/coresight-etm4x.h
drivers/tty/serial/qcom_geni_serial.c
include/asm-generic/io.h
lib/Kconfig
lib/Makefile
tools/include/uapi/asm-generic/fcntl.h

@@@ -28,7 -28,6 +28,7 @@@
     printk-basics
     printk-formats
     workqueue
 +   watch_queue
     symbol-namespaces
  
  数据结构和低级实用程序
@@@ -53,7 -52,6 +53,6 @@@ Todolist
     circular-buffers
     generic-radix-tree
     packing
-    bus-virt-phys-mapping
     this_cpu_ops
     timekeeping
     errseq
diff --combined arch/Kconfig
@@@ -223,9 -223,6 +223,9 @@@ config HAVE_FUNCTION_DESCRIPTOR
  config TRACE_IRQFLAGS_SUPPORT
        bool
  
 +config TRACE_IRQFLAGS_NMI_SUPPORT
 +      bool
 +
  #
  # An arch should select this if it provides all these things:
  #
@@@ -441,13 -438,6 +441,13 @@@ config MMU_GATHER_PAGE_SIZ
  
  config MMU_GATHER_NO_RANGE
        bool
 +      select MMU_GATHER_MERGE_VMAS
 +
 +config MMU_GATHER_NO_FLUSH_CACHE
 +      bool
 +
 +config MMU_GATHER_MERGE_VMAS
 +      bool
  
  config MMU_GATHER_NO_GATHER
        bool
@@@ -784,7 -774,7 +784,7 @@@ config HAVE_ARCH_WITHIN_STACK_FRAME
          and similar) by implementing an inline arch_within_stack_frames(),
          which is used by CONFIG_HARDENED_USERCOPY.
  
 -config HAVE_CONTEXT_TRACKING
 +config HAVE_CONTEXT_TRACKING_USER
        bool
        help
          Provide kernel/user boundaries probes necessary for subsystems
          Syscalls need to be wrapped inside user_exit()-user_enter(), either
          optimized behind static key or through the slow path using TIF_NOHZ
          flag. Exceptions handlers must be wrapped as well. Irqs are already
 -        protected inside rcu_irq_enter/rcu_irq_exit() but preemption or signal
 +        protected inside ct_irq_enter/ct_irq_exit() but preemption or signal
          handling on irq exit still need to be protected.
  
 -config HAVE_CONTEXT_TRACKING_OFFSTACK
 +config HAVE_CONTEXT_TRACKING_USER_OFFSTACK
        bool
        help
          Architecture neither relies on exception_enter()/exception_exit()
  
          - Critical entry code isn't preemptible (or better yet:
            not interruptible).
 -        - No use of RCU read side critical sections, unless rcu_nmi_enter()
 +        - No use of RCU read side critical sections, unless ct_nmi_enter()
            got called.
          - No use of instrumentation, unless instrumentation_begin() got
            called.
@@@ -1406,6 -1396,9 +1406,9 @@@ config ARCH_HAS_ELFCORE_COMPA
  config ARCH_HAS_PARANOID_L1D_FLUSH
        bool
  
+ config ARCH_HAVE_TRACE_MMIO_ACCESS
+       bool
  config DYNAMIC_SIGFRAME
        bool
  
diff --combined arch/arm64/Kconfig
@@@ -49,6 -49,7 +49,7 @@@ config ARM6
        select ARCH_HAS_ZONE_DMA_SET if EXPERT
        select ARCH_HAVE_ELF_PROT
        select ARCH_HAVE_NMI_SAFE_CMPXCHG
+       select ARCH_HAVE_TRACE_MMIO_ACCESS
        select ARCH_INLINE_READ_LOCK if !PREEMPTION
        select ARCH_INLINE_READ_LOCK_BH if !PREEMPTION
        select ARCH_INLINE_READ_LOCK_IRQ if !PREEMPTION
        select ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP
        select ARCH_WANT_LD_ORPHAN_WARN
        select ARCH_WANTS_NO_INSTR
 +      select ARCH_WANTS_THP_SWAP if ARM64_4K_PAGES
        select ARCH_HAS_UBSAN_SANITIZE_ALL
        select ARM_AMBA
        select ARM_ARCH_TIMER
        select GENERIC_CPU_VULNERABILITIES
        select GENERIC_EARLY_IOREMAP
        select GENERIC_IDLE_POLL_SETUP
 +      select GENERIC_IOREMAP
        select GENERIC_IRQ_IPI
        select GENERIC_IRQ_PROBE
        select GENERIC_IRQ_SHOW
        select HAVE_C_RECORDMCOUNT
        select HAVE_CMPXCHG_DOUBLE
        select HAVE_CMPXCHG_LOCAL
 -      select HAVE_CONTEXT_TRACKING
 +      select HAVE_CONTEXT_TRACKING_USER
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_DMA_CONTIGUOUS
        select HAVE_DYNAMIC_FTRACE
        select HAVE_FUNCTION_GRAPH_TRACER
        select HAVE_GCC_PLUGINS
        select HAVE_HW_BREAKPOINT if PERF_EVENTS
 +      select HAVE_IOREMAP_PROT
        select HAVE_IRQ_TIME_ACCOUNTING
        select HAVE_KVM
        select HAVE_NMI
        select THREAD_INFO_IN_TASK
        select HAVE_ARCH_USERFAULTFD_MINOR if USERFAULTFD
        select TRACE_IRQFLAGS_SUPPORT
 +      select TRACE_IRQFLAGS_NMI_SUPPORT
        help
          ARM 64-bit (AArch64) Linux support.
  
@@@ -507,22 -504,6 +508,22 @@@ config ARM64_ERRATUM_83422
  
          If unsure, say Y.
  
 +config ARM64_ERRATUM_1742098
 +      bool "Cortex-A57/A72: 1742098: ELR recorded incorrectly on interrupt taken between cryptographic instructions in a sequence"
 +      depends on COMPAT
 +      default y
 +      help
 +        This option removes the AES hwcap for aarch32 user-space to
 +        workaround erratum 1742098 on Cortex-A57 and Cortex-A72.
 +
 +        Affected parts may corrupt the AES state if an interrupt is
 +        taken between a pair of AES instructions. These instructions
 +        are only present if the cryptography extensions are present.
 +        All software should have a fallback implementation for CPUs
 +        that don't implement the cryptography extensions.
 +
 +        If unsure, say Y.
 +
  config ARM64_ERRATUM_845719
        bool "Cortex-A53: 845719: a load might read incorrect data"
        depends on COMPAT
@@@ -841,23 -822,6 +842,23 @@@ config ARM64_ERRATUM_222448
  
          If unsure, say Y.
  
 +config ARM64_ERRATUM_2441009
 +      bool "Cortex-A510: Completion of affected memory accesses might not be guaranteed by completion of a TLBI"
 +      default y
 +      select ARM64_WORKAROUND_REPEAT_TLBI
 +      help
 +        This option adds a workaround for ARM Cortex-A510 erratum #2441009.
 +
 +        Under very rare circumstances, affected Cortex-A510 CPUs
 +        may not handle a race between a break-before-make sequence on one
 +        CPU, and another CPU accessing the same page. This could allow a
 +        store to a page that has been unmapped.
 +
 +        Work around this by adding the affected CPUs to the list that needs
 +        TLB sequences to be done twice.
 +
 +        If unsure, say Y.
 +
  config ARM64_ERRATUM_2064142
        bool "Cortex-A510: 2064142: workaround TRBE register writes while disabled"
        depends on CORESIGHT_TRBE
@@@ -1895,6 -1859,14 +1896,6 @@@ config ARM64_E0P
  
          This option enables E0PD for TTBR1 where available.
  
 -config ARCH_RANDOM
 -      bool "Enable support for random number generation"
 -      default y
 -      help
 -        Random number generation (part of the ARMv8.5 Extensions)
 -        provides a high bandwidth, cryptographically secure
 -        hardware random number generator.
 -
  config ARM64_AS_HAS_MTE
        # Initial support for MTE went in binutils 2.32.0, checked with
        # ".arch armv8.5-a+memtag" below. However, this was incomplete
@@@ -91,7 -91,7 +91,7 @@@ static inline u64 __raw_readq(const vol
  }
  
  /* IO barriers */
- #define __iormb(v)                                                    \
+ #define __io_ar(v)                                                    \
  ({                                                                    \
        unsigned long tmp;                                              \
                                                                        \
                     : "memory");                                       \
  })
  
- #define __io_par(v)           __iormb(v)
- #define __iowmb()             dma_wmb()
- #define __iomb()              dma_mb()
- /*
-  * Relaxed I/O memory access primitives. These follow the Device memory
-  * ordering rules but do not guarantee any ordering relative to Normal memory
-  * accesses.
-  */
- #define readb_relaxed(c)      ({ u8  __r = __raw_readb(c); __r; })
- #define readw_relaxed(c)      ({ u16 __r = le16_to_cpu((__force __le16)__raw_readw(c)); __r; })
- #define readl_relaxed(c)      ({ u32 __r = le32_to_cpu((__force __le32)__raw_readl(c)); __r; })
- #define readq_relaxed(c)      ({ u64 __r = le64_to_cpu((__force __le64)__raw_readq(c)); __r; })
+ #define __io_bw()             dma_wmb()
+ #define __io_br(v)
+ #define __io_aw(v)
  
- #define writeb_relaxed(v,c)   ((void)__raw_writeb((v),(c)))
- #define writew_relaxed(v,c)   ((void)__raw_writew((__force u16)cpu_to_le16(v),(c)))
- #define writel_relaxed(v,c)   ((void)__raw_writel((__force u32)cpu_to_le32(v),(c)))
- #define writeq_relaxed(v,c)   ((void)__raw_writeq((__force u64)cpu_to_le64(v),(c)))
- /*
-  * I/O memory access primitives. Reads are ordered relative to any
-  * following Normal memory access. Writes are ordered relative to any prior
-  * Normal memory access.
-  */
- #define readb(c)              ({ u8  __v = readb_relaxed(c); __iormb(__v); __v; })
- #define readw(c)              ({ u16 __v = readw_relaxed(c); __iormb(__v); __v; })
- #define readl(c)              ({ u32 __v = readl_relaxed(c); __iormb(__v); __v; })
- #define readq(c)              ({ u64 __v = readq_relaxed(c); __iormb(__v); __v; })
- #define writeb(v,c)           ({ __iowmb(); writeb_relaxed((v),(c)); })
- #define writew(v,c)           ({ __iowmb(); writew_relaxed((v),(c)); })
- #define writel(v,c)           ({ __iowmb(); writel_relaxed((v),(c)); })
- #define writeq(v,c)           ({ __iowmb(); writeq_relaxed((v),(c)); })
+ /* arm64-specific, don't use in portable drivers */
+ #define __iormb(v)            __io_ar(v)
+ #define __iowmb()             __io_bw()
+ #define __iomb()              dma_mb()
  
  /*
   *  I/O port access primitives.
@@@ -163,16 -138,13 +138,16 @@@ extern void __memset_io(volatile void _
  /*
   * I/O memory mapping functions.
   */
 -extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot);
 -extern void iounmap(volatile void __iomem *addr);
 -extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size);
  
 -#define ioremap(addr, size)           __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
 -#define ioremap_wc(addr, size)                __ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))
 -#define ioremap_np(addr, size)                __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRnE))
 +bool ioremap_allowed(phys_addr_t phys_addr, size_t size, unsigned long prot);
 +#define ioremap_allowed ioremap_allowed
 +
 +#define _PAGE_IOREMAP PROT_DEVICE_nGnRE
 +
 +#define ioremap_wc(addr, size)        \
 +      ioremap_prot((addr), (size), PROT_NORMAL_NC)
 +#define ioremap_np(addr, size)        \
 +      ioremap_prot((addr), (size), PROT_DEVICE_nGnRnE)
  
  /*
   * io{read,write}{16,32,64}be() macros
  
  #include <asm-generic/io.h>
  
 +#define ioremap_cache ioremap_cache
 +static inline void __iomem *ioremap_cache(phys_addr_t addr, size_t size)
 +{
 +      if (pfn_is_map_memory(__phys_to_pfn(addr)))
 +              return (void __iomem *)__phys_to_virt(addr);
 +
 +      return ioremap_prot(addr, size, PROT_NORMAL);
 +}
 +
  /*
   * More restrictive address range checking than the default implementation
   * (PHYS_OFFSET and PHYS_MASK taken into account).
@@@ -4,7 -4,12 +4,12 @@@
  #
  
  asflags-y := -D__KVM_NVHE_HYPERVISOR__ -D__DISABLE_EXPORTS
- ccflags-y := -D__KVM_NVHE_HYPERVISOR__ -D__DISABLE_EXPORTS
+ # Tracepoint and MMIO logging symbols should not be visible at nVHE KVM as
+ # there is no way to execute them and any such MMIO access from nVHE KVM
+ # will explode instantly (Words of Marc Zyngier). So introduce a generic flag
+ # __DISABLE_TRACE_MMIO__ to disable MMIO tracing for nVHE KVM.
+ ccflags-y := -D__KVM_NVHE_HYPERVISOR__ -D__DISABLE_EXPORTS -D__DISABLE_TRACE_MMIO__
  
  hostprogs := gen-hyprel
  HOST_EXTRACFLAGS += -I$(objtree)/include
  lib-objs := clear_page.o copy_page.o memcpy.o memset.o
  lib-objs := $(addprefix ../../../lib/, $(lib-objs))
  
 -obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o \
 +hyp-obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o \
         hyp-main.o hyp-smp.o psci-relay.o early_alloc.o page_alloc.o \
 -       cache.o setup.o mm.o mem_protect.o sys_regs.o pkvm.o
 -obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o \
 +       cache.o setup.o mm.o mem_protect.o sys_regs.o pkvm.o stacktrace.o
 +hyp-obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o \
         ../fpsimd.o ../hyp-entry.o ../exception.o ../pgtable.o
 -obj-$(CONFIG_DEBUG_LIST) += list_debug.o
 -obj-y += $(lib-objs)
 +hyp-obj-$(CONFIG_DEBUG_LIST) += list_debug.o
 +hyp-obj-y += $(lib-objs)
  
  ##
  ## Build rules for compiling nVHE hyp code
@@@ -26,9 -31,9 +31,9 @@@
  ## file containing all nVHE hyp code and data.
  ##
  
 -hyp-obj := $(patsubst %.o,%.nvhe.o,$(obj-y))
 +hyp-obj := $(patsubst %.o,%.nvhe.o,$(hyp-obj-y))
  obj-y := kvm_nvhe.o
 -extra-y := $(hyp-obj) kvm_nvhe.tmp.o kvm_nvhe.rel.o hyp.lds hyp-reloc.S hyp-reloc.o
 +targets += $(hyp-obj) kvm_nvhe.tmp.o kvm_nvhe.rel.o hyp.lds hyp-reloc.S hyp-reloc.o
  
  # 1) Compile all source files to `.nvhe.o` object files. The file extension
  #    avoids file name clashes for files shared with VHE.
diff --combined arch/microblaze/Kconfig
@@@ -38,13 -38,13 +38,12 @@@ config MICROBLAZ
        select OF_EARLY_FLATTREE
        select PCI_DOMAINS_GENERIC if PCI
        select PCI_SYSCALL if PCI
-       select VIRT_TO_BUS
        select CPU_NO_EFFICIENT_FFS
        select MMU_GATHER_NO_RANGE
        select SPARSE_IRQ
        select ZONE_DMA
        select TRACE_IRQFLAGS_SUPPORT
        select GENERIC_IRQ_MULTI_HANDLER
 -      select HANDLE_DOMAIN_IRQ
  
  # Endianness selection
  choice
diff --combined arch/mips/Kconfig
@@@ -56,7 -56,7 +56,7 @@@ config MIP
        select HAVE_ARCH_TRACEHOOK
        select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES
        select HAVE_ASM_MODVERSIONS
 -      select HAVE_CONTEXT_TRACKING
 +      select HAVE_CONTEXT_TRACKING_USER
        select HAVE_TIF_NOHZ
        select HAVE_C_RECORDMCOUNT
        select HAVE_DEBUG_KMEMLEAK
        select RTC_LIB
        select SYSCTL_EXCEPTION_TRACE
        select TRACE_IRQFLAGS_SUPPORT
-       select VIRT_TO_BUS
        select ARCH_HAS_ELFCORE_COMPAT
        select HAVE_ARCH_KCSAN if 64BIT
  
diff --combined arch/parisc/Kconfig
@@@ -10,7 -10,6 +10,7 @@@ config PARIS
        select ARCH_WANT_FRAME_POINTERS
        select ARCH_HAS_ELF_RANDOMIZE
        select ARCH_HAS_STRICT_KERNEL_RWX
 +      select ARCH_HAS_STRICT_MODULE_RWX
        select ARCH_HAS_UBSAN_SANITIZE_ALL
        select ARCH_HAS_PTE_SPECIAL
        select ARCH_NO_SG_CHAIN
@@@ -44,7 -43,6 +44,6 @@@
        select SYSCTL_ARCH_UNALIGN_ALLOW
        select SYSCTL_EXCEPTION_TRACE
        select HAVE_MOD_ARCH_SPECIFIC
-       select VIRT_TO_BUS
        select MODULES_USE_ELF_RELA
        select CLONE_BACKWARDS
        select TTY # Needed for pdc_cons.c
diff --combined arch/parisc/kernel/irq.c
@@@ -315,7 -315,7 +315,7 @@@ unsigned long txn_affinity_addr(unsigne
  {
  #ifdef CONFIG_SMP
        struct irq_data *d = irq_get_irq_data(irq);
 -      cpumask_copy(irq_data_get_affinity_mask(d), cpumask_of(cpu));
 +      irq_data_update_affinity(d, cpumask_of(cpu));
  #endif
  
        return per_cpu(cpu_data, cpu).txn_addr;
@@@ -480,10 -480,12 +480,12 @@@ static void execute_on_irq_stack(void *
        *irq_stack_in_use = 1;
  }
  
+ #ifndef CONFIG_PREEMPT_RT
  void do_softirq_own_stack(void)
  {
        execute_on_irq_stack(__do_softirq, 0);
  }
+ #endif
  #endif /* CONFIG_IRQSTACKS */
  
  /* ONLY called from entry.S:intr_extint() */
diff --combined arch/powerpc/Kconfig
@@@ -202,7 -202,7 +202,7 @@@ config PP
        select HAVE_ARCH_SECCOMP_FILTER
        select HAVE_ARCH_TRACEHOOK
        select HAVE_ASM_MODVERSIONS
 -      select HAVE_CONTEXT_TRACKING            if PPC64
 +      select HAVE_CONTEXT_TRACKING_USER               if PPC64
        select HAVE_C_RECORDMCOUNT
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_DEBUG_STACKOVERFLOW
        select IRQ_FORCED_THREADING
        select MMU_GATHER_PAGE_SIZE
        select MMU_GATHER_RCU_TABLE_FREE
 +      select MMU_GATHER_MERGE_VMAS
        select MODULES_USE_ELF_RELA
        select NEED_DMA_MAP_STATE               if PPC64 || NOT_COHERENT_CACHE
        select NEED_PER_CPU_EMBED_FIRST_CHUNK   if PPC64
        select SYSCTL_EXCEPTION_TRACE
        select THREAD_INFO_IN_TASK
        select TRACE_IRQFLAGS_SUPPORT
-       select VIRT_TO_BUS                      if !PPC64
        #
        # Please keep this list sorted alphabetically.
        #
  
 +config PPC_LONG_DOUBLE_128
 +      depends on PPC64
 +      def_bool $(success,test "$(shell,echo __LONG_DOUBLE_128__ | $(CC) -E -P -)" = 1)
 +
  config PPC_BARRIER_NOSPEC
        bool
        default y
@@@ -363,10 -357,6 +362,10 @@@ config ARCH_SUSPEND_NONZERO_CP
        def_bool y
        depends on PPC_POWERNV || PPC_PSERIES
  
 +config ARCH_HAS_ADD_PAGES
 +      def_bool y
 +      depends on ARCH_ENABLE_MEMORY_HOTPLUG
 +
  config PPC_DCR_NATIVE
        bool
  
@@@ -1257,6 -1247,9 +1256,6 @@@ config PHYSICAL_STAR
        default "0x00000000"
  endif
  
 -config        ARCH_RANDOM
 -      def_bool n
 -
  config PPC_LIB_RHEAP
        bool
  
diff --combined arch/sh/kernel/irq.c
@@@ -149,6 -149,7 +149,7 @@@ void irq_ctx_exit(int cpu
        hardirq_ctx[cpu] = NULL;
  }
  
+ #ifndef CONFIG_PREEMPT_RT
  void do_softirq_own_stack(void)
  {
        struct thread_info *curctx;
                  "r5", "r6", "r7", "r8", "r9", "r15", "t", "pr"
        );
  }
+ #endif
  #else
  static inline void handle_one_irq(unsigned int irq)
  {
@@@ -230,17 -232,16 +232,17 @@@ void migrate_irqs(void
                struct irq_data *data = irq_get_irq_data(irq);
  
                if (irq_data_get_node(data) == cpu) {
 -                      struct cpumask *mask = irq_data_get_affinity_mask(data);
 +                      const struct cpumask *mask = irq_data_get_affinity_mask(data);
                        unsigned int newcpu = cpumask_any_and(mask,
                                                              cpu_online_mask);
                        if (newcpu >= nr_cpu_ids) {
                                pr_info_ratelimited("IRQ%u no longer affine to CPU%u\n",
                                                    irq, cpu);
  
 -                              cpumask_setall(mask);
 +                              irq_set_affinity(irq, cpu_all_mask);
 +                      } else {
 +                              irq_set_affinity(irq, mask);
                        }
 -                      irq_set_affinity(irq, mask);
                }
        }
  }
diff --combined arch/x86/Kconfig
@@@ -186,8 -186,8 +186,8 @@@ config X8
        select HAVE_ASM_MODVERSIONS
        select HAVE_CMPXCHG_DOUBLE
        select HAVE_CMPXCHG_LOCAL
 -      select HAVE_CONTEXT_TRACKING            if X86_64
 -      select HAVE_CONTEXT_TRACKING_OFFSTACK   if HAVE_CONTEXT_TRACKING
 +      select HAVE_CONTEXT_TRACKING_USER               if X86_64
 +      select HAVE_CONTEXT_TRACKING_USER_OFFSTACK      if HAVE_CONTEXT_TRACKING_USER
        select HAVE_C_RECORDMCOUNT
        select HAVE_OBJTOOL_MCOUNT              if HAVE_OBJTOOL
        select HAVE_BUILDTIME_MCOUNT_SORT
        select HAVE_PERF_REGS
        select HAVE_PERF_USER_STACK_DUMP
        select MMU_GATHER_RCU_TABLE_FREE        if PARAVIRT
 +      select MMU_GATHER_MERGE_VMAS
        select HAVE_POSIX_CPU_TIMERS_TASK_WORK
        select HAVE_REGS_AND_STACK_ACCESS_API
        select HAVE_RELIABLE_STACKTRACE         if UNWINDER_ORC || STACK_VALIDATION
        select SYSCTL_EXCEPTION_TRACE
        select THREAD_INFO_IN_TASK
        select TRACE_IRQFLAGS_SUPPORT
 +      select TRACE_IRQFLAGS_NMI_SUPPORT
        select USER_STACKTRACE_SUPPORT
-       select VIRT_TO_BUS
        select HAVE_ARCH_KCSAN                  if X86_64
        select X86_FEATURE_NAMES                if PROC_FS
        select PROC_PID_ARCH_STATUS             if PROC_FS
@@@ -393,8 -390,8 +392,8 @@@ config PGTABLE_LEVEL
  
  config CC_HAS_SANE_STACKPROTECTOR
        bool
 -      default $(success,$(srctree)/scripts/gcc-x86_64-has-stack-protector.sh $(CC)) if 64BIT
 -      default $(success,$(srctree)/scripts/gcc-x86_32-has-stack-protector.sh $(CC))
 +      default $(success,$(srctree)/scripts/gcc-x86_64-has-stack-protector.sh $(CC) $(CLANG_FLAGS)) if 64BIT
 +      default $(success,$(srctree)/scripts/gcc-x86_32-has-stack-protector.sh $(CC) $(CLANG_FLAGS))
        help
          We have to make sure stack protector is unconditionally disabled if
          the compiler produces broken code or if it does not let us control
@@@ -464,6 -461,29 +463,6 @@@ config GOLDFIS
        def_bool y
        depends on X86_GOLDFISH
  
 -config RETPOLINE
 -      bool "Avoid speculative indirect branches in kernel"
 -      select OBJTOOL if HAVE_OBJTOOL
 -      default y
 -      help
 -        Compile kernel with the retpoline compiler options to guard against
 -        kernel-to-user data leaks by avoiding speculative indirect
 -        branches. Requires a compiler with -mindirect-branch=thunk-extern
 -        support for full protection. The kernel may run slower.
 -
 -config CC_HAS_SLS
 -      def_bool $(cc-option,-mharden-sls=all)
 -
 -config SLS
 -      bool "Mitigate Straight-Line-Speculation"
 -      depends on CC_HAS_SLS && X86_64
 -      select OBJTOOL if HAVE_OBJTOOL
 -      default n
 -      help
 -        Compile the kernel with straight-line-speculation options to guard
 -        against straight line speculation. The kernel image might be slightly
 -        larger.
 -
  config X86_CPU_RESCTRL
        bool "x86 CPU resource control support"
        depends on X86 && (CPU_SUP_INTEL || CPU_SUP_AMD)
@@@ -1812,6 -1832,15 +1811,6 @@@ config ARCH_USES_PG_UNCACHE
        def_bool y
        depends on X86_PAT
  
 -config ARCH_RANDOM
 -      def_bool y
 -      prompt "x86 architectural random number generator" if EXPERT
 -      help
 -        Enable the x86 architectural RDRAND instruction
 -        (Intel Bull Mountain technology) to generate random numbers.
 -        If supported, this is a high bandwidth, cryptographically
 -        secure hardware random number generator.
 -
  config X86_UMIP
        def_bool y
        prompt "User Mode Instruction Prevention" if EXPERT
@@@ -2002,7 -2031,7 +2001,7 @@@ config KEXE
  config KEXEC_FILE
        bool "kexec file based system call"
        select KEXEC_CORE
 -      select BUILD_BIN2C
 +      select HAVE_IMA_KEXEC if IMA
        depends on X86_64
        depends on CRYPTO=y
        depends on CRYPTO_SHA256=y
@@@ -2423,91 -2452,6 +2422,91 @@@ source "kernel/livepatch/Kconfig
  
  endmenu
  
 +config CC_HAS_SLS
 +      def_bool $(cc-option,-mharden-sls=all)
 +
 +config CC_HAS_RETURN_THUNK
 +      def_bool $(cc-option,-mfunction-return=thunk-extern)
 +
 +menuconfig SPECULATION_MITIGATIONS
 +      bool "Mitigations for speculative execution vulnerabilities"
 +      default y
 +      help
 +        Say Y here to enable options which enable mitigations for
 +        speculative execution hardware vulnerabilities.
 +
 +        If you say N, all mitigations will be disabled. You really
 +        should know what you are doing to say so.
 +
 +if SPECULATION_MITIGATIONS
 +
 +config PAGE_TABLE_ISOLATION
 +      bool "Remove the kernel mapping in user mode"
 +      default y
 +      depends on (X86_64 || X86_PAE)
 +      help
 +        This feature reduces the number of hardware side channels by
 +        ensuring that the majority of kernel addresses are not mapped
 +        into userspace.
 +
 +        See Documentation/x86/pti.rst for more details.
 +
 +config RETPOLINE
 +      bool "Avoid speculative indirect branches in kernel"
 +      select OBJTOOL if HAVE_OBJTOOL
 +      default y
 +      help
 +        Compile kernel with the retpoline compiler options to guard against
 +        kernel-to-user data leaks by avoiding speculative indirect
 +        branches. Requires a compiler with -mindirect-branch=thunk-extern
 +        support for full protection. The kernel may run slower.
 +
 +config RETHUNK
 +      bool "Enable return-thunks"
 +      depends on RETPOLINE && CC_HAS_RETURN_THUNK
 +      select OBJTOOL if HAVE_OBJTOOL
 +      default y if X86_64
 +      help
 +        Compile the kernel with the return-thunks compiler option to guard
 +        against kernel-to-user data leaks by avoiding return speculation.
 +        Requires a compiler with -mfunction-return=thunk-extern
 +        support for full protection. The kernel may run slower.
 +
 +config CPU_UNRET_ENTRY
 +      bool "Enable UNRET on kernel entry"
 +      depends on CPU_SUP_AMD && RETHUNK && X86_64
 +      default y
 +      help
 +        Compile the kernel with support for the retbleed=unret mitigation.
 +
 +config CPU_IBPB_ENTRY
 +      bool "Enable IBPB on kernel entry"
 +      depends on CPU_SUP_AMD && X86_64
 +      default y
 +      help
 +        Compile the kernel with support for the retbleed=ibpb mitigation.
 +
 +config CPU_IBRS_ENTRY
 +      bool "Enable IBRS on kernel entry"
 +      depends on CPU_SUP_INTEL && X86_64
 +      default y
 +      help
 +        Compile the kernel with support for the spectre_v2=ibrs mitigation.
 +        This mitigates both spectre_v2 and retbleed at great cost to
 +        performance.
 +
 +config SLS
 +      bool "Mitigate Straight-Line-Speculation"
 +      depends on CC_HAS_SLS && X86_64
 +      select OBJTOOL if HAVE_OBJTOOL
 +      default n
 +      help
 +        Compile the kernel with straight-line-speculation options to guard
 +        against straight line speculation. The kernel image might be slightly
 +        larger.
 +
 +endif
 +
  config ARCH_HAS_ADD_PAGES
        def_bool y
        depends on ARCH_ENABLE_MEMORY_HOTPLUG
diff --combined arch/xtensa/Kconfig
@@@ -6,8 -6,6 +6,8 @@@ config XTENS
        select ARCH_HAS_CURRENT_STACK_POINTER
        select ARCH_HAS_DEBUG_VM_PGTABLE
        select ARCH_HAS_DMA_PREP_COHERENT if MMU
 +      select ARCH_HAS_GCOV_PROFILE_ALL
 +      select ARCH_HAS_KCOV
        select ARCH_HAS_SYNC_DMA_FOR_CPU if MMU
        select ARCH_HAS_SYNC_DMA_FOR_DEVICE if MMU
        select ARCH_HAS_DMA_SET_UNCACHED if MMU
@@@ -35,7 -33,7 +35,7 @@@
        select HAVE_ARCH_KCSAN
        select HAVE_ARCH_SECCOMP_FILTER
        select HAVE_ARCH_TRACEHOOK
 -      select HAVE_CONTEXT_TRACKING
 +      select HAVE_CONTEXT_TRACKING_USER
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_DMA_CONTIGUOUS
        select HAVE_EXIT_THREAD
@@@ -52,7 -50,6 +52,6 @@@
        select MODULES_USE_ELF_RELA
        select PERF_USE_VMALLOC
        select TRACE_IRQFLAGS_SUPPORT
-       select VIRT_TO_BUS
        help
          Xtensa processors are 32-bit RISC machines designed by Tensilica
          primarily for embedded systems.  These processors are both
@@@ -98,7 -98,7 +98,7 @@@ u64 etm4x_sysreg_read(u32 offset, bool 
        }
  
        if (!_relaxed)
-               __iormb(res);   /* Imitate the !relaxed I/O helpers */
+               __io_ar(res);   /* Imitate the !relaxed I/O helpers */
  
        return res;
  }
  void etm4x_sysreg_write(u64 val, u32 offset, bool _relaxed, bool _64bit)
  {
        if (!_relaxed)
-               __iowmb();      /* Imitate the !relaxed I/O helpers */
+               __io_bw();      /* Imitate the !relaxed I/O helpers */
        if (!_64bit)
                val &= GENMASK(31, 0);
  
@@@ -130,7 -130,7 +130,7 @@@ static u64 ete_sysreg_read(u32 offset, 
        }
  
        if (!_relaxed)
-               __iormb(res);   /* Imitate the !relaxed I/O helpers */
+               __io_ar(res);   /* Imitate the !relaxed I/O helpers */
  
        return res;
  }
  static void ete_sysreg_write(u64 val, u32 offset, bool _relaxed, bool _64bit)
  {
        if (!_relaxed)
-               __iowmb();      /* Imitate the !relaxed I/O helpers */
+               __io_bw();      /* Imitate the !relaxed I/O helpers */
        if (!_64bit)
                val &= GENMASK(31, 0);
  
@@@ -696,20 -696,6 +696,20 @@@ static int etm4_parse_event_config(stru
                ret = cscfg_csdev_enable_active_config(csdev, cfg_hash, preset);
        }
  
 +      /* branch broadcast - enable if selected and supported */
 +      if (attr->config & BIT(ETM_OPT_BRANCH_BROADCAST)) {
 +              if (!drvdata->trcbb) {
 +                      /*
 +                       * Missing BB support could cause silent decode errors
 +                       * so fail to open if it's not supported.
 +                       */
 +                      ret = -EINVAL;
 +                      goto out;
 +              } else {
 +                      config->cfg |= BIT(ETM4_CFG_BIT_BB);
 +              }
 +      }
 +
  out:
        return ret;
  }
@@@ -7,7 -7,6 +7,7 @@@
  #define _CORESIGHT_CORESIGHT_ETM_H
  
  #include <asm/local.h>
 +#include <linux/const.h>
  #include <linux/spinlock.h>
  #include <linux/types.h>
  #include "coresight-priv.h"
        ({                                                                      \
                u64 __val;                                                      \
                                                                                \
 -              if (__builtin_constant_p((offset)))                             \
 +              if (__is_constexpr((offset)))                                   \
                        __val = read_etm4x_sysreg_const_offset((offset));       \
                else                                                            \
                        __val = etm4x_sysreg_read((offset), true, (_64bit));    \
  #define etm4x_read32(csa, offset)                                     \
        ({                                                              \
                u32 __val = etm4x_relaxed_read32((csa), (offset));      \
-               __iormb(__val);                                         \
+               __io_ar(__val);                                         \
                __val;                                                  \
         })
  
  #define etm4x_read64(csa, offset)                                     \
        ({                                                              \
                u64 __val = etm4x_relaxed_read64((csa), (offset));      \
-               __iormb(__val);                                         \
+               __io_ar(__val);                                         \
                __val;                                                  \
         })
  
  
  #define etm4x_write32(csa, val, offset)                                       \
        do {                                                            \
-               __iowmb();                                              \
+               __io_bw();                                              \
                etm4x_relaxed_write32((csa), (val), (offset));          \
        } while (0)
  
  #define etm4x_write64(csa, val, offset)                                       \
        do {                                                            \
-               __iowmb();                                              \
+               __io_bw();                                              \
                etm4x_relaxed_write64((csa), (val), (offset));          \
        } while (0)
  
@@@ -1,5 -1,8 +1,8 @@@
  // SPDX-License-Identifier: GPL-2.0
  // Copyright (c) 2017-2018, The Linux foundation. All rights reserved.
+ /* Disable MMIO tracing to prevent excessive logging of unwanted MMIO traces */
+ #define __DISABLE_TRACE_MMIO__
  
  #include <linux/clk.h>
  #include <linux/console.h>
@@@ -1306,7 -1309,6 +1309,7 @@@ static const struct uart_ops qcom_geni_
        .stop_tx = qcom_geni_serial_stop_tx,
        .start_tx = qcom_geni_serial_start_tx,
        .stop_rx = qcom_geni_serial_stop_rx,
 +      .start_rx = qcom_geni_serial_start_rx,
        .set_termios = qcom_geni_serial_set_termios,
        .startup = qcom_geni_serial_startup,
        .request_port = qcom_geni_serial_request_port,
diff --combined include/asm-generic/io.h
@@@ -10,6 -10,7 +10,7 @@@
  #include <asm/page.h> /* I/O is all done through memory accesses */
  #include <linux/string.h> /* for memset() and memcpy() */
  #include <linux/types.h>
+ #include <linux/instruction_pointer.h>
  
  #ifdef CONFIG_GENERIC_IOMAP
  #include <asm-generic/iomap.h>
  #define __io_par(v)     __io_ar(v)
  #endif
  
+ /*
+  * "__DISABLE_TRACE_MMIO__" flag can be used to disable MMIO tracing for
+  * specific kernel drivers in case of excessive/unwanted logging.
+  *
+  * Usage: Add a #define flag at the beginning of the driver file.
+  * Ex: #define __DISABLE_TRACE_MMIO__
+  *     #include <...>
+  *     ...
+  */
+ #if IS_ENABLED(CONFIG_TRACE_MMIO_ACCESS) && !(defined(__DISABLE_TRACE_MMIO__))
+ #include <linux/tracepoint-defs.h>
+ DECLARE_TRACEPOINT(rwmmio_write);
+ DECLARE_TRACEPOINT(rwmmio_post_write);
+ DECLARE_TRACEPOINT(rwmmio_read);
+ DECLARE_TRACEPOINT(rwmmio_post_read);
+ void log_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
+                   unsigned long caller_addr);
+ void log_post_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
+                        unsigned long caller_addr);
+ void log_read_mmio(u8 width, const volatile void __iomem *addr,
+                  unsigned long caller_addr);
+ void log_post_read_mmio(u64 val, u8 width, const volatile void __iomem *addr,
+                       unsigned long caller_addr);
+ #else
+ static inline void log_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
+                                 unsigned long caller_addr) {}
+ static inline void log_post_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
+                                      unsigned long caller_addr) {}
+ static inline void log_read_mmio(u8 width, const volatile void __iomem *addr,
+                                unsigned long caller_addr) {}
+ static inline void log_post_read_mmio(u64 val, u8 width, const volatile void __iomem *addr,
+                                     unsigned long caller_addr) {}
+ #endif /* CONFIG_TRACE_MMIO_ACCESS */
  
  /*
   * __raw_{read,write}{b,w,l,q}() access memory in native endianness.
@@@ -149,9 -188,11 +188,11 @@@ static inline u8 readb(const volatile v
  {
        u8 val;
  
+       log_read_mmio(8, addr, _THIS_IP_);
        __io_br();
        val = __raw_readb(addr);
        __io_ar(val);
+       log_post_read_mmio(val, 8, addr, _THIS_IP_);
        return val;
  }
  #endif
@@@ -162,9 -203,11 +203,11 @@@ static inline u16 readw(const volatile 
  {
        u16 val;
  
+       log_read_mmio(16, addr, _THIS_IP_);
        __io_br();
        val = __le16_to_cpu((__le16 __force)__raw_readw(addr));
        __io_ar(val);
+       log_post_read_mmio(val, 16, addr, _THIS_IP_);
        return val;
  }
  #endif
@@@ -175,9 -218,11 +218,11 @@@ static inline u32 readl(const volatile 
  {
        u32 val;
  
+       log_read_mmio(32, addr, _THIS_IP_);
        __io_br();
        val = __le32_to_cpu((__le32 __force)__raw_readl(addr));
        __io_ar(val);
+       log_post_read_mmio(val, 32, addr, _THIS_IP_);
        return val;
  }
  #endif
@@@ -189,9 -234,11 +234,11 @@@ static inline u64 readq(const volatile 
  {
        u64 val;
  
+       log_read_mmio(64, addr, _THIS_IP_);
        __io_br();
        val = __le64_to_cpu(__raw_readq(addr));
        __io_ar(val);
+       log_post_read_mmio(val, 64, addr, _THIS_IP_);
        return val;
  }
  #endif
  #define writeb writeb
  static inline void writeb(u8 value, volatile void __iomem *addr)
  {
+       log_write_mmio(value, 8, addr, _THIS_IP_);
        __io_bw();
        __raw_writeb(value, addr);
        __io_aw();
+       log_post_write_mmio(value, 8, addr, _THIS_IP_);
  }
  #endif
  
  #define writew writew
  static inline void writew(u16 value, volatile void __iomem *addr)
  {
+       log_write_mmio(value, 16, addr, _THIS_IP_);
        __io_bw();
        __raw_writew((u16 __force)cpu_to_le16(value), addr);
        __io_aw();
+       log_post_write_mmio(value, 16, addr, _THIS_IP_);
  }
  #endif
  
  #define writel writel
  static inline void writel(u32 value, volatile void __iomem *addr)
  {
+       log_write_mmio(value, 32, addr, _THIS_IP_);
        __io_bw();
        __raw_writel((u32 __force)__cpu_to_le32(value), addr);
        __io_aw();
+       log_post_write_mmio(value, 32, addr, _THIS_IP_);
  }
  #endif
  
  #define writeq writeq
  static inline void writeq(u64 value, volatile void __iomem *addr)
  {
+       log_write_mmio(value, 64, addr, _THIS_IP_);
        __io_bw();
        __raw_writeq(__cpu_to_le64(value), addr);
        __io_aw();
+       log_post_write_mmio(value, 64, addr, _THIS_IP_);
  }
  #endif
  #endif /* CONFIG_64BIT */
  #define readb_relaxed readb_relaxed
  static inline u8 readb_relaxed(const volatile void __iomem *addr)
  {
-       return __raw_readb(addr);
+       u8 val;
+       log_read_mmio(8, addr, _THIS_IP_);
+       val = __raw_readb(addr);
+       log_post_read_mmio(val, 8, addr, _THIS_IP_);
+       return val;
  }
  #endif
  
  #define readw_relaxed readw_relaxed
  static inline u16 readw_relaxed(const volatile void __iomem *addr)
  {
-       return __le16_to_cpu(__raw_readw(addr));
+       u16 val;
+       log_read_mmio(16, addr, _THIS_IP_);
+       val = __le16_to_cpu(__raw_readw(addr));
+       log_post_read_mmio(val, 16, addr, _THIS_IP_);
+       return val;
  }
  #endif
  
  #define readl_relaxed readl_relaxed
  static inline u32 readl_relaxed(const volatile void __iomem *addr)
  {
-       return __le32_to_cpu(__raw_readl(addr));
+       u32 val;
+       log_read_mmio(32, addr, _THIS_IP_);
+       val = __le32_to_cpu(__raw_readl(addr));
+       log_post_read_mmio(val, 32, addr, _THIS_IP_);
+       return val;
  }
  #endif
  
  #define readq_relaxed readq_relaxed
  static inline u64 readq_relaxed(const volatile void __iomem *addr)
  {
-       return __le64_to_cpu(__raw_readq(addr));
+       u64 val;
+       log_read_mmio(64, addr, _THIS_IP_);
+       val = __le64_to_cpu(__raw_readq(addr));
+       log_post_read_mmio(val, 64, addr, _THIS_IP_);
+       return val;
  }
  #endif
  
  #define writeb_relaxed writeb_relaxed
  static inline void writeb_relaxed(u8 value, volatile void __iomem *addr)
  {
+       log_write_mmio(value, 8, addr, _THIS_IP_);
        __raw_writeb(value, addr);
+       log_post_write_mmio(value, 8, addr, _THIS_IP_);
  }
  #endif
  
  #define writew_relaxed writew_relaxed
  static inline void writew_relaxed(u16 value, volatile void __iomem *addr)
  {
+       log_write_mmio(value, 16, addr, _THIS_IP_);
        __raw_writew(cpu_to_le16(value), addr);
+       log_post_write_mmio(value, 16, addr, _THIS_IP_);
  }
  #endif
  
  #define writel_relaxed writel_relaxed
  static inline void writel_relaxed(u32 value, volatile void __iomem *addr)
  {
+       log_write_mmio(value, 32, addr, _THIS_IP_);
        __raw_writel(__cpu_to_le32(value), addr);
+       log_post_write_mmio(value, 32, addr, _THIS_IP_);
  }
  #endif
  
  #define writeq_relaxed writeq_relaxed
  static inline void writeq_relaxed(u64 value, volatile void __iomem *addr)
  {
+       log_write_mmio(value, 64, addr, _THIS_IP_);
        __raw_writeq(__cpu_to_le64(value), addr);
+       log_post_write_mmio(value, 64, addr, _THIS_IP_);
  }
  #endif
  
@@@ -964,34 -1047,7 +1047,34 @@@ static inline void iounmap(volatile voi
  #elif defined(CONFIG_GENERIC_IOREMAP)
  #include <linux/pgtable.h>
  
 -void __iomem *ioremap_prot(phys_addr_t addr, size_t size, unsigned long prot);
 +/*
 + * Arch code can implement the following two hooks when using GENERIC_IOREMAP
 + * ioremap_allowed() return a bool,
 + *   - true means continue to remap
 + *   - false means skip remap and return directly
 + * iounmap_allowed() return a bool,
 + *   - true means continue to vunmap
 + *   - false means skip vunmap and return directly
 + */
 +#ifndef ioremap_allowed
 +#define ioremap_allowed ioremap_allowed
 +static inline bool ioremap_allowed(phys_addr_t phys_addr, size_t size,
 +                                 unsigned long prot)
 +{
 +      return true;
 +}
 +#endif
 +
 +#ifndef iounmap_allowed
 +#define iounmap_allowed iounmap_allowed
 +static inline bool iounmap_allowed(void *addr)
 +{
 +      return true;
 +}
 +#endif
 +
 +void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
 +                         unsigned long prot);
  void iounmap(volatile void __iomem *addr);
  
  static inline void __iomem *ioremap(phys_addr_t addr, size_t size)
@@@ -1086,20 -1142,6 +1169,6 @@@ static inline void unxlate_dev_mem_ptr(
  }
  #endif
  
- #ifdef CONFIG_VIRT_TO_BUS
- #ifndef virt_to_bus
- static inline unsigned long virt_to_bus(void *address)
- {
-       return (unsigned long)address;
- }
- static inline void *bus_to_virt(unsigned long address)
- {
-       return (void *)address;
- }
- #endif
- #endif
  #ifndef memset_io
  #define memset_io memset_io
  /**
@@@ -1152,7 -1194,9 +1221,7 @@@ static inline void memcpy_toio(volatil
  }
  #endif
  
 -#ifndef CONFIG_GENERIC_DEVMEM_IS_ALLOWED
  extern int devmem_is_allowed(unsigned long pfn);
 -#endif
  
  #endif /* __KERNEL__ */
  
diff --combined lib/Kconfig
@@@ -118,11 -118,15 +118,18 @@@ config INDIRECT_IOMEM_FALLBAC
          mmio accesses when the IO memory address is not a registered
          emulated region.
  
+ config TRACE_MMIO_ACCESS
+       bool "Register read/write tracing"
+       depends on TRACING && ARCH_HAVE_TRACE_MMIO_ACCESS
+       help
+         Create tracepoints for MMIO read/write operations. These trace events
+         can be used for logging all MMIO read/write operations.
  source "lib/crypto/Kconfig"
  
 +config LIB_MEMNEQ
 +      bool
 +
  config CRC_CCITT
        tristate "CRC-CCITT functions"
        help
diff --combined lib/Makefile
@@@ -29,7 -29,7 +29,7 @@@ endi
  
  lib-y := ctype.o string.o vsprintf.o cmdline.o \
         rbtree.o radix-tree.o timerqueue.o xarray.o \
 -       idr.o extable.o sha1.o irq_regs.o argv_split.o \
 +       idr.o extable.o irq_regs.o argv_split.o \
         flex_proportions.o ratelimit.o show_mem.o \
         is_single_threaded.o plist.o decompress.o kobject_uevent.o \
         earlycpio.o seq_buf.o siphash.o dec_and_lock.o \
@@@ -46,7 -46,7 +46,7 @@@ obj-y += bcd.o sort.o parser.o debug_lo
         bust_spinlocks.o kasprintf.o bitmap.o scatterlist.o \
         list_sort.o uuid.o iov_iter.o clz_ctz.o \
         bsearch.o find_bit.o llist.o memweight.o kfifo.o \
 -       percpu-refcount.o rhashtable.o \
 +       percpu-refcount.o rhashtable.o base64.o \
         once.o refcount.o usercopy.o errseq.o bucket_locks.o \
         generic-radix-tree.o
  obj-$(CONFIG_STRING_SELFTEST) += test_string.o
@@@ -151,6 -151,8 +151,8 @@@ lib-y += logic_pio.
  
  lib-$(CONFIG_INDIRECT_IOMEM) += logic_iomem.o
  
+ obj-$(CONFIG_TRACE_MMIO_ACCESS) += trace_readwrite.o
  obj-$(CONFIG_GENERIC_HWEIGHT) += hweight.o
  
  obj-$(CONFIG_BTREE) += btree.o
@@@ -251,7 -253,6 +253,7 @@@ obj-$(CONFIG_DIMLIB) += dim
  obj-$(CONFIG_SIGNATURE) += digsig.o
  
  lib-$(CONFIG_CLZ_TAB) += clz_tab.o
 +lib-$(CONFIG_LIB_MEMNEQ) += memneq.o
  
  obj-$(CONFIG_GENERIC_STRNCPY_FROM_USER) += strncpy_from_user.o
  obj-$(CONFIG_GENERIC_STRNLEN_USER) += strnlen_user.o
@@@ -1,4 -1,3 +1,4 @@@
 +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
  #ifndef _ASM_GENERIC_FCNTL_H
  #define _ASM_GENERIC_FCNTL_H
  
@@@ -91,7 -90,7 +91,7 @@@
  
  /* a horrid kludge trying to make sure that this will fail on old kernels */
  #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
 -#define O_TMPFILE_MASK (__O_TMPFILE | O_DIRECTORY | O_CREAT)
 +#define O_TMPFILE_MASK (__O_TMPFILE | O_DIRECTORY | O_CREAT)      
  
  #ifndef O_NDELAY
  #define O_NDELAY      O_NONBLOCK
  #define F_GETSIG      11      /* for sockets. */
  #endif
  
 +#if __BITS_PER_LONG == 32 || defined(__KERNEL__)
  #ifndef F_GETLK64
  #define F_GETLK64     12      /*  using 'struct flock64' */
  #define F_SETLK64     13
  #define F_SETLKW64    14
  #endif
 +#endif /* __BITS_PER_LONG == 32 || defined(__KERNEL__) */
  
  #ifndef F_SETOWN_EX
  #define F_SETOWN_EX   15
   * record  locks, but are "owned" by the open file description, not the
   * process. This means that they are inherited across fork() like BSD (flock)
   * locks, and they are only released automatically when the last reference to
-  * the the open file against which they were acquired is put.
+  * the open file against which they were acquired is put.
   */
  #define F_OFD_GETLK   36
  #define F_OFD_SETLK   37
@@@ -181,10 -178,6 +181,10 @@@ struct f_owner_ex 
                                   blocking */
  #define LOCK_UN               8       /* remove lock */
  
 +/*
 + * LOCK_MAND support has been removed from the kernel. We leave the symbols
 + * here to not break legacy builds, but these should not be used in new code.
 + */
  #define LOCK_MAND     32      /* This is a mandatory flock ... */
  #define LOCK_READ     64      /* which allows concurrent read operations */
  #define LOCK_WRITE    128     /* which allows concurrent write operations */
  
  #define F_LINUX_SPECIFIC_BASE 1024
  
 +#ifndef HAVE_ARCH_STRUCT_FLOCK
  struct flock {
        short   l_type;
        short   l_whence;
@@@ -217,6 -209,5 +217,6 @@@ struct flock64 
        __ARCH_FLOCK64_PAD
  #endif
  };
 +#endif /* HAVE_ARCH_STRUCT_FLOCK */
  
  #endif /* _ASM_GENERIC_FCNTL_H */