]> Git Repo - linux.git/commitdiff
Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
authorLinus Torvalds <[email protected]>
Tue, 27 Jun 2023 00:11:53 +0000 (17:11 -0700)
committerLinus Torvalds <[email protected]>
Tue, 27 Jun 2023 00:11:53 +0000 (17:11 -0700)
Pull arm64 updates from Catalin Marinas:
 "Notable features are user-space support for the memcpy/memset
  instructions and the permission indirection extension.

   - Support for the Armv8.9 Permission Indirection Extensions. While
     this feature doesn't add new functionality, it enables future
     support for Guarded Control Stacks (GCS) and Permission Overlays

   - User-space support for the Armv8.8 memcpy/memset instructions

   - arm64 perf: support the HiSilicon SoC uncore PMU, Arm CMN sysfs
     identifier, support for the NXP i.MX9 SoC DDRC PMU, fixes and
     cleanups

   - Removal of superfluous ISBs on context switch (following
     retrospective architecture tightening)

   - Decode the ISS2 register during faults for additional information
     to help with debugging

   - KPTI clean-up/simplification of the trampoline exit code

   - Addressing several -Wmissing-prototype warnings

   - Kselftest improvements for signal handling and ptrace

   - Fix TPIDR2_EL0 restoring on sigreturn

   - Clean-up, robustness improvements of the module allocation code

   - More sysreg conversions to the automatic register/bitfields
     generation

   - CPU capabilities handling cleanup

   - Arm documentation updates: ACPI, ptdump"

* tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (124 commits)
  kselftest/arm64: Add a test case for TPIDR2 restore
  arm64/signal: Restore TPIDR2 register rather than memory state
  arm64: alternatives: make clean_dcache_range_nopatch() noinstr-safe
  Documentation/arm64: Add ptdump documentation
  arm64: hibernate: remove WARN_ON in save_processor_state
  kselftest/arm64: Log signal code and address for unexpected signals
  docs: perf: Fix warning from 'make htmldocs' in hisi-pmu.rst
  arm64/fpsimd: Exit streaming mode when flushing tasks
  docs: perf: Add new description for HiSilicon UC PMU
  drivers/perf: hisi: Add support for HiSilicon UC PMU driver
  drivers/perf: hisi: Add support for HiSilicon H60PA and PAv3 PMU driver
  perf: arm_cspmu: Add missing MODULE_DEVICE_TABLE
  perf/arm-cmn: Add sysfs identifier
  perf/arm-cmn: Revamp model detection
  perf/arm_dmc620: Add cpumask
  arm64: mm: fix VA-range sanity check
  arm64/mm: remove now-superfluous ISBs from TTBR writes
  Documentation/arm64: Update ACPI tables from BBR
  Documentation/arm64: Update references in arm-acpi
  Documentation/arm64: Update ARM and arch reference
  ...

1  2 
Documentation/admin-guide/kernel-parameters.txt
arch/arm64/Kconfig
arch/arm64/include/asm/kvm_host.h
arch/arm64/include/asm/sysreg.h
arch/arm64/kvm/hyp/include/hyp/switch.h
arch/arm64/kvm/sys_regs.c
arch/arm64/mm/fault.c
include/linux/acpi_iort.h

index d8fabfe37d5e4373595d169399d221d3d5000a35,e01fbfd78ae95e0771ba8a769eff22b338c76a95..c5e7bb4babf0f3542d8e437ba3b14148efc45f28
        arm64.nosme     [ARM64] Unconditionally disable Scalable Matrix
                        Extension support
  
+       arm64.nomops    [ARM64] Unconditionally disable Memory Copy and Memory
+                       Set instructions support
        ataflop=        [HW,M68k]
  
        atarimouse=     [HW,MOUSE] Atari Mouse
                        Format:
                        <first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
  
 -      cpu0_hotplug    [X86] Turn on CPU0 hotplug feature when
 -                      CONFIG_BOOTPARAM_HOTPLUG_CPU0 is off.
 -                      Some features depend on CPU0. Known dependencies are:
 -                      1. Resume from suspend/hibernate depends on CPU0.
 -                      Suspend/hibernate will fail if CPU0 is offline and you
 -                      need to online CPU0 before suspend/hibernate.
 -                      2. PIC interrupts also depend on CPU0. CPU0 can't be
 -                      removed if a PIC interrupt is detected.
 -                      It's said poweroff/reboot may depend on CPU0 on some
 -                      machines although I haven't seen such issues so far
 -                      after CPU0 is offline on a few tested machines.
 -                      If the dependencies are under your control, you can
 -                      turn on cpu0_hotplug.
 -
        cpuidle.off=1   [CPU_IDLE]
                        disable the cpuidle sub-system
  
                        on every CPU online, such as boot, and resume from suspend.
                        Default: 10000
  
 +      cpuhp.parallel=
 +                      [SMP] Enable/disable parallel bringup of secondary CPUs
 +                      Format: <bool>
 +                      Default is enabled if CONFIG_HOTPLUG_PARALLEL=y. Otherwise
 +                      the parameter has no effect.
 +
        crash_kexec_post_notifiers
                        Run kdump after running panic-notifiers and dumping
                        kmsg. This only for the users who doubt kdump always
                        port and the regular usb controller gets disabled.
  
        root=           [KNL] Root filesystem
 -                      See name_to_dev_t comment in init/do_mounts.c.
 +                      Usually this a a block device specifier of some kind,
 +                      see the early_lookup_bdev comment in
 +                      block/early-lookup.c for details.
 +                      Alternatively this can be "ram" for the legacy initial
 +                      ramdisk, "nfs" and "cifs" for root on a network file
 +                      system, or "mtd" and "ubi" for mounting from raw flash.
  
        rootdelay=      [KNL] Delay (in seconds) to pause before attempting to
                        mount the root filesystem
diff --combined arch/arm64/Kconfig
index 44911bce53897a1d09b8e9525981f3d80cb3a45f,a6002084f09c9aa8aea9418c81a9fade6652ce03..d260ca10e8c1a0ba2310f5e4e49f7e93b3e3a9a9
@@@ -207,6 -207,7 +207,7 @@@ config ARM6
        select HAVE_IOREMAP_PROT
        select HAVE_IRQ_TIME_ACCOUNTING
        select HAVE_KVM
+       select HAVE_MOD_ARCH_SPECIFIC
        select HAVE_NMI
        select HAVE_PERF_EVENTS
        select HAVE_PERF_REGS
        select HAVE_KPROBES
        select HAVE_KRETPROBES
        select HAVE_GENERIC_VDSO
 +      select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
        select IRQ_DOMAIN
        select IRQ_FORCED_THREADING
        select KASAN_VMALLOC if KASAN
@@@ -578,7 -578,6 +579,6 @@@ config ARM64_ERRATUM_84571
  config ARM64_ERRATUM_843419
        bool "Cortex-A53: 843419: A load or store might access an incorrect address"
        default y
-       select ARM64_MODULE_PLTS if MODULES
        help
          This option links the kernel with '--fix-cortex-a53-843419' and
          enables PLT support to replace certain ADRP instructions, which can
@@@ -1517,7 -1516,7 +1517,7 @@@ config XE
  # 16K |       27          |      14      |       13        |         11         |
  # 64K |       29          |      16      |       13        |         13         |
  config ARCH_FORCE_MAX_ORDER
 -      int "Order of maximal physically contiguous allocations" if EXPERT && (ARM64_4K_PAGES || ARM64_16K_PAGES)
 +      int
        default "13" if ARM64_64K_PAGES
        default "11" if ARM64_16K_PAGES
        default "10"
@@@ -2108,26 -2107,6 +2108,6 @@@ config ARM64_SM
          register state capable of holding two dimensional matrix tiles to
          enable various matrix operations.
  
- config ARM64_MODULE_PLTS
-       bool "Use PLTs to allow module memory to spill over into vmalloc area"
-       depends on MODULES
-       select HAVE_MOD_ARCH_SPECIFIC
-       help
-         Allocate PLTs when loading modules so that jumps and calls whose
-         targets are too far away for their relative offsets to be encoded
-         in the instructions themselves can be bounced via veneers in the
-         module's PLT. This allows modules to be allocated in the generic
-         vmalloc area after the dedicated module memory area has been
-         exhausted.
-         When running with address space randomization (KASLR), the module
-         region itself may be too far away for ordinary relative jumps and
-         calls, and so in that case, module PLTs are required and cannot be
-         disabled.
-         Specific errata workaround(s) might also force module PLTs to be
-         enabled (ARM64_ERRATUM_843419).
  config ARM64_PSEUDO_NMI
        bool "Support for NMI-like interrupts"
        select ARM_GIC_V3
@@@ -2168,7 -2147,6 +2148,6 @@@ config RELOCATABL
  
  config RANDOMIZE_BASE
        bool "Randomize the address of the kernel image"
-       select ARM64_MODULE_PLTS if MODULES
        select RELOCATABLE
        help
          Randomizes the virtual address at which the kernel image is
@@@ -2199,9 -2177,8 +2178,8 @@@ config RANDOMIZE_MODULE_REGION_FUL
          When this option is not set, the module region will be randomized over
          a limited range that contains the [_stext, _etext] interval of the
          core kernel, so branch relocations are almost always in range unless
-         ARM64_MODULE_PLTS is enabled and the region is exhausted. In this
-         particular case of region exhaustion, modules might be able to fall
-         back to a larger 2GB area.
+         the region is exhausted. In this particular case of region
+         exhaustion, modules might be able to fall back to a larger 2GB area.
  
  config CC_HAVE_STACKPROTECTOR_SYSREG
        def_bool $(cc-option,-mstack-protector-guard=sysreg -mstack-protector-guard-reg=sp_el0 -mstack-protector-guard-offset=0)
index 9787503ff43fdfb01703302f7c0e63cb02db901d,8dbe8d8f7d7a1a3170958469554308427a2da8c4..d48609d9542310722b34c40b368e89c167cdc0a2
@@@ -279,6 -279,7 +279,7 @@@ enum vcpu_sysreg 
        TTBR0_EL1,      /* Translation Table Base Register 0 */
        TTBR1_EL1,      /* Translation Table Base Register 1 */
        TCR_EL1,        /* Translation Control Register */
+       TCR2_EL1,       /* Extended Translation Control Register */
        ESR_EL1,        /* Exception Syndrome Register */
        AFSR0_EL1,      /* Auxiliary Fault Status Register 0 */
        AFSR1_EL1,      /* Auxiliary Fault Status Register 1 */
        TFSR_EL1,       /* Tag Fault Status Register (EL1) */
        TFSRE0_EL1,     /* Tag Fault Status Register (EL0) */
  
+       /* Permission Indirection Extension registers */
+       PIR_EL1,       /* Permission Indirection Register 1 (EL1) */
+       PIRE0_EL1,     /*  Permission Indirection Register 0 (EL1) */
        /* 32bit specific registers. */
        DACR32_EL2,     /* Domain Access Control Register */
        IFSR32_EL2,     /* Instruction Fault Status Register */
@@@ -699,8 -704,6 +704,8 @@@ struct kvm_vcpu_arch 
  #define SYSREGS_ON_CPU                __vcpu_single_flag(sflags, BIT(4))
  /* Software step state is Active-pending */
  #define DBG_SS_ACTIVE_PENDING __vcpu_single_flag(sflags, BIT(5))
 +/* PMUSERENR for the guest EL0 is on physical CPU */
 +#define PMUSERENR_ON_CPU      __vcpu_single_flag(sflags, BIT(6))
  
  
  /* Pointer to the vcpu's SVE FFR for sve_{save,load}_state() */
@@@ -1033,7 -1036,7 +1038,7 @@@ void kvm_arm_clear_debug(struct kvm_vcp
  void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu);
  
  #define kvm_vcpu_os_lock_enabled(vcpu)                \
-       (!!(__vcpu_sys_reg(vcpu, OSLSR_EL1) & SYS_OSLSR_OSLK))
+       (!!(__vcpu_sys_reg(vcpu, OSLSR_EL1) & OSLSR_EL1_OSLK))
  
  int kvm_arm_vcpu_arch_set_attr(struct kvm_vcpu *vcpu,
                               struct kvm_device_attr *attr);
@@@ -1067,14 -1070,9 +1072,14 @@@ void kvm_arch_vcpu_put_debug_state_flag
  #ifdef CONFIG_KVM
  void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr);
  void kvm_clr_pmu_events(u32 clr);
 +bool kvm_set_pmuserenr(u64 val);
  #else
  static inline void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr) {}
  static inline void kvm_clr_pmu_events(u32 clr) {}
 +static inline bool kvm_set_pmuserenr(u64 val)
 +{
 +      return false;
 +}
  #endif
  
  void kvm_vcpu_load_sysregs_vhe(struct kvm_vcpu *vcpu);
index eefd712f2430353f5800df0b06333dd0460f22c0,b5943f113af19a16e9558e5ba4cade1d15ac9919..7a1e626318145f31c0e55afa83f7298a67d84a2f
  #define SB_BARRIER_INSN                       __SYS_BARRIER_INSN(0, 7, 31)
  
  #define SYS_DC_ISW                    sys_insn(1, 0, 7, 6, 2)
 +#define SYS_DC_IGSW                   sys_insn(1, 0, 7, 6, 4)
 +#define SYS_DC_IGDSW                  sys_insn(1, 0, 7, 6, 6)
  #define SYS_DC_CSW                    sys_insn(1, 0, 7, 10, 2)
 +#define SYS_DC_CGSW                   sys_insn(1, 0, 7, 10, 4)
 +#define SYS_DC_CGDSW                  sys_insn(1, 0, 7, 10, 6)
  #define SYS_DC_CISW                   sys_insn(1, 0, 7, 14, 2)
 +#define SYS_DC_CIGSW                  sys_insn(1, 0, 7, 14, 4)
 +#define SYS_DC_CIGDSW                 sys_insn(1, 0, 7, 14, 6)
  
  /*
   * Automatically generated definitions for system registers, the
  #define SYS_SVCR_SMSTART_SM_EL0               sys_reg(0, 3, 4, 3, 3)
  #define SYS_SVCR_SMSTOP_SMZA_EL0      sys_reg(0, 3, 4, 6, 3)
  
- #define SYS_OSDTRRX_EL1                       sys_reg(2, 0, 0, 0, 2)
- #define SYS_MDCCINT_EL1                       sys_reg(2, 0, 0, 2, 0)
- #define SYS_MDSCR_EL1                 sys_reg(2, 0, 0, 2, 2)
- #define SYS_OSDTRTX_EL1                       sys_reg(2, 0, 0, 3, 2)
- #define SYS_OSECCR_EL1                        sys_reg(2, 0, 0, 6, 2)
  #define SYS_DBGBVRn_EL1(n)            sys_reg(2, 0, 0, n, 4)
  #define SYS_DBGBCRn_EL1(n)            sys_reg(2, 0, 0, n, 5)
  #define SYS_DBGWVRn_EL1(n)            sys_reg(2, 0, 0, n, 6)
  #define SYS_DBGWCRn_EL1(n)            sys_reg(2, 0, 0, n, 7)
  #define SYS_MDRAR_EL1                 sys_reg(2, 0, 1, 0, 0)
  
- #define SYS_OSLAR_EL1                 sys_reg(2, 0, 1, 0, 4)
- #define SYS_OSLAR_OSLK                        BIT(0)
  #define SYS_OSLSR_EL1                 sys_reg(2, 0, 1, 1, 4)
- #define SYS_OSLSR_OSLM_MASK           (BIT(3) | BIT(0))
- #define SYS_OSLSR_OSLM_NI             0
- #define SYS_OSLSR_OSLM_IMPLEMENTED    BIT(3)
- #define SYS_OSLSR_OSLK                        BIT(1)
+ #define OSLSR_EL1_OSLM_MASK           (BIT(3) | BIT(0))
+ #define OSLSR_EL1_OSLM_NI             0
+ #define OSLSR_EL1_OSLM_IMPLEMENTED    BIT(3)
+ #define OSLSR_EL1_OSLK                        BIT(1)
  
  #define SYS_OSDLR_EL1                 sys_reg(2, 0, 1, 3, 4)
  #define SYS_DBGPRCR_EL1                       sys_reg(2, 0, 1, 4, 4)
  
  /*** End of Statistical Profiling Extension ***/
  
- /*
-  * TRBE Registers
-  */
- #define SYS_TRBLIMITR_EL1             sys_reg(3, 0, 9, 11, 0)
- #define SYS_TRBPTR_EL1                        sys_reg(3, 0, 9, 11, 1)
- #define SYS_TRBBASER_EL1              sys_reg(3, 0, 9, 11, 2)
- #define SYS_TRBSR_EL1                 sys_reg(3, 0, 9, 11, 3)
- #define SYS_TRBMAR_EL1                        sys_reg(3, 0, 9, 11, 4)
- #define SYS_TRBTRG_EL1                        sys_reg(3, 0, 9, 11, 6)
- #define SYS_TRBIDR_EL1                        sys_reg(3, 0, 9, 11, 7)
- #define TRBLIMITR_LIMIT_MASK          GENMASK_ULL(51, 0)
- #define TRBLIMITR_LIMIT_SHIFT         12
- #define TRBLIMITR_NVM                 BIT(5)
- #define TRBLIMITR_TRIG_MODE_MASK      GENMASK(1, 0)
- #define TRBLIMITR_TRIG_MODE_SHIFT     3
- #define TRBLIMITR_FILL_MODE_MASK      GENMASK(1, 0)
- #define TRBLIMITR_FILL_MODE_SHIFT     1
- #define TRBLIMITR_ENABLE              BIT(0)
- #define TRBPTR_PTR_MASK                       GENMASK_ULL(63, 0)
- #define TRBPTR_PTR_SHIFT              0
- #define TRBBASER_BASE_MASK            GENMASK_ULL(51, 0)
- #define TRBBASER_BASE_SHIFT           12
- #define TRBSR_EC_MASK                 GENMASK(5, 0)
- #define TRBSR_EC_SHIFT                        26
- #define TRBSR_IRQ                     BIT(22)
- #define TRBSR_TRG                     BIT(21)
- #define TRBSR_WRAP                    BIT(20)
- #define TRBSR_ABORT                   BIT(18)
- #define TRBSR_STOP                    BIT(17)
- #define TRBSR_MSS_MASK                        GENMASK(15, 0)
- #define TRBSR_MSS_SHIFT                       0
- #define TRBSR_BSC_MASK                        GENMASK(5, 0)
- #define TRBSR_BSC_SHIFT                       0
- #define TRBSR_FSC_MASK                        GENMASK(5, 0)
- #define TRBSR_FSC_SHIFT                       0
- #define TRBMAR_SHARE_MASK             GENMASK(1, 0)
- #define TRBMAR_SHARE_SHIFT            8
- #define TRBMAR_OUTER_MASK             GENMASK(3, 0)
- #define TRBMAR_OUTER_SHIFT            4
- #define TRBMAR_INNER_MASK             GENMASK(3, 0)
- #define TRBMAR_INNER_SHIFT            0
- #define TRBTRG_TRG_MASK                       GENMASK(31, 0)
- #define TRBTRG_TRG_SHIFT              0
- #define TRBIDR_FLAG                   BIT(5)
- #define TRBIDR_PROG                   BIT(4)
- #define TRBIDR_ALIGN_MASK             GENMASK(3, 0)
- #define TRBIDR_ALIGN_SHIFT            0
+ #define TRBSR_EL1_BSC_MASK            GENMASK(5, 0)
+ #define TRBSR_EL1_BSC_SHIFT           0
  
  #define SYS_PMINTENSET_EL1            sys_reg(3, 0, 9, 14, 1)
  #define SYS_PMINTENCLR_EL1            sys_reg(3, 0, 9, 14, 2)
  #define ICH_VTR_TDS_SHIFT     19
  #define ICH_VTR_TDS_MASK      (1 << ICH_VTR_TDS_SHIFT)
  
+ /*
+  * Permission Indirection Extension (PIE) permission encodings.
+  * Encodings with the _O suffix, have overlays applied (Permission Overlay Extension).
+  */
+ #define PIE_NONE_O    0x0
+ #define PIE_R_O               0x1
+ #define PIE_X_O               0x2
+ #define PIE_RX_O      0x3
+ #define PIE_RW_O      0x5
+ #define PIE_RWnX_O    0x6
+ #define PIE_RWX_O     0x7
+ #define PIE_R         0x8
+ #define PIE_GCS               0x9
+ #define PIE_RX                0xa
+ #define PIE_RW                0xc
+ #define PIE_RWX               0xe
+ #define PIRx_ELx_PERM(idx, perm)      ((perm) << ((idx) * 4))
  #define ARM64_FEATURE_FIELD_BITS      4
  
  /* Defined for compatibility only, do not add new users. */
index 4fe217efa2185a73bea804b1842deff3684918a7,eb123aa7479d6832ac348f3bb868ae9aa013003d..2f6e0b3e4a7518b31a54f96cca4acd9e87906c5d
@@@ -82,14 -82,8 +82,14 @@@ static inline void __activate_traps_com
         * EL1 instead of being trapped to EL2.
         */
        if (kvm_arm_support_pmu_v3()) {
 +              struct kvm_cpu_context *hctxt;
 +
                write_sysreg(0, pmselr_el0);
 +
 +              hctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
 +              ctxt_sys_reg(hctxt, PMUSERENR_EL0) = read_sysreg(pmuserenr_el0);
                write_sysreg(ARMV8_PMU_USERENR_MASK, pmuserenr_el0);
 +              vcpu_set_flag(vcpu, PMUSERENR_ON_CPU);
        }
  
        vcpu->arch.mdcr_el2_host = read_sysreg(mdcr_el2);
@@@ -112,13 -106,8 +112,13 @@@ static inline void __deactivate_traps_c
        write_sysreg(vcpu->arch.mdcr_el2_host, mdcr_el2);
  
        write_sysreg(0, hstr_el2);
 -      if (kvm_arm_support_pmu_v3())
 -              write_sysreg(0, pmuserenr_el0);
 +      if (kvm_arm_support_pmu_v3()) {
 +              struct kvm_cpu_context *hctxt;
 +
 +              hctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
 +              write_sysreg(ctxt_sys_reg(hctxt, PMUSERENR_EL0), pmuserenr_el0);
 +              vcpu_clear_flag(vcpu, PMUSERENR_ON_CPU);
 +      }
  
        if (cpus_have_final_cap(ARM64_SME)) {
                sysreg_clear_set_s(SYS_HFGRTR_EL2, 0,
@@@ -141,6 -130,9 +141,9 @@@ static inline void ___activate_traps(st
  
        if (cpus_have_final_cap(ARM64_HAS_RAS_EXTN) && (hcr & HCR_VSE))
                write_sysreg_s(vcpu->arch.vsesr_el2, SYS_VSESR_EL2);
+       if (cpus_have_final_cap(ARM64_HAS_HCX))
+               write_sysreg_s(HCRX_GUEST_FLAGS, SYS_HCRX_EL2);
  }
  
  static inline void ___deactivate_traps(struct kvm_vcpu *vcpu)
                vcpu->arch.hcr_el2 &= ~HCR_VSE;
                vcpu->arch.hcr_el2 |= read_sysreg(hcr_el2) & HCR_VSE;
        }
+       if (cpus_have_final_cap(ARM64_HAS_HCX))
+               write_sysreg_s(HCRX_HOST_FLAGS, SYS_HCRX_EL2);
  }
  
  static inline bool __populate_fault_info(struct kvm_vcpu *vcpu)
@@@ -423,21 -418,17 +429,21 @@@ static bool kvm_hyp_handle_cp15_32(stru
        return false;
  }
  
 -static bool kvm_hyp_handle_iabt_low(struct kvm_vcpu *vcpu, u64 *exit_code)
 +static bool kvm_hyp_handle_memory_fault(struct kvm_vcpu *vcpu, u64 *exit_code)
  {
        if (!__populate_fault_info(vcpu))
                return true;
  
        return false;
  }
 +static bool kvm_hyp_handle_iabt_low(struct kvm_vcpu *vcpu, u64 *exit_code)
 +      __alias(kvm_hyp_handle_memory_fault);
 +static bool kvm_hyp_handle_watchpt_low(struct kvm_vcpu *vcpu, u64 *exit_code)
 +      __alias(kvm_hyp_handle_memory_fault);
  
  static bool kvm_hyp_handle_dabt_low(struct kvm_vcpu *vcpu, u64 *exit_code)
  {
 -      if (!__populate_fault_info(vcpu))
 +      if (kvm_hyp_handle_memory_fault(vcpu, exit_code))
                return true;
  
        if (static_branch_unlikely(&vgic_v2_cpuif_trap)) {
index 753aa741814977728778648fc7e3c7e05644ab51,c48914f4626339d513cd2985a2fdbcd542095d23..5b5d5e5449dc1357e14a74f09d824e643b6911b1
@@@ -211,19 -211,6 +211,19 @@@ static bool access_dcsw(struct kvm_vcp
        return true;
  }
  
 +static bool access_dcgsw(struct kvm_vcpu *vcpu,
 +                       struct sys_reg_params *p,
 +                       const struct sys_reg_desc *r)
 +{
 +      if (!kvm_has_mte(vcpu->kvm)) {
 +              kvm_inject_undefined(vcpu);
 +              return false;
 +      }
 +
 +      /* Treat MTE S/W ops as we treat the classic ones: with contempt */
 +      return access_dcsw(vcpu, p, r);
 +}
 +
  static void get_access_mask(const struct sys_reg_desc *r, u64 *mask, u64 *shift)
  {
        switch (r->aarch32_map) {
@@@ -401,9 -388,9 +401,9 @@@ static bool trap_oslar_el1(struct kvm_v
                return read_from_write_only(vcpu, p, r);
  
        /* Forward the OSLK bit to OSLSR */
-       oslsr = __vcpu_sys_reg(vcpu, OSLSR_EL1) & ~SYS_OSLSR_OSLK;
-       if (p->regval & SYS_OSLAR_OSLK)
-               oslsr |= SYS_OSLSR_OSLK;
+       oslsr = __vcpu_sys_reg(vcpu, OSLSR_EL1) & ~OSLSR_EL1_OSLK;
+       if (p->regval & OSLAR_EL1_OSLK)
+               oslsr |= OSLSR_EL1_OSLK;
  
        __vcpu_sys_reg(vcpu, OSLSR_EL1) = oslsr;
        return true;
@@@ -427,7 -414,7 +427,7 @@@ static int set_oslsr_el1(struct kvm_vcp
         * The only modifiable bit is the OSLK bit. Refuse the write if
         * userspace attempts to change any other bit in the register.
         */
-       if ((val ^ rd->val) & ~SYS_OSLSR_OSLK)
+       if ((val ^ rd->val) & ~OSLSR_EL1_OSLK)
                return -EINVAL;
  
        __vcpu_sys_reg(vcpu, rd->reg) = val;
@@@ -1265,6 -1252,7 +1265,7 @@@ static u64 read_id_reg(const struct kvm
                                 ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_GPA3));
                if (!cpus_have_final_cap(ARM64_HAS_WFXT))
                        val &= ~ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_WFxT);
+               val &= ~ARM64_FEATURE_MASK(ID_AA64ISAR2_EL1_MOPS);
                break;
        case SYS_ID_AA64DFR0_EL1:
                /* Limit debug to ARMv8.0 */
@@@ -1769,14 -1757,8 +1770,14 @@@ static bool access_spsr(struct kvm_vcp
   */
  static const struct sys_reg_desc sys_reg_descs[] = {
        { SYS_DESC(SYS_DC_ISW), access_dcsw },
 +      { SYS_DESC(SYS_DC_IGSW), access_dcgsw },
 +      { SYS_DESC(SYS_DC_IGDSW), access_dcgsw },
        { SYS_DESC(SYS_DC_CSW), access_dcsw },
 +      { SYS_DESC(SYS_DC_CGSW), access_dcgsw },
 +      { SYS_DESC(SYS_DC_CGDSW), access_dcgsw },
        { SYS_DESC(SYS_DC_CISW), access_dcsw },
 +      { SYS_DESC(SYS_DC_CIGSW), access_dcgsw },
 +      { SYS_DESC(SYS_DC_CIGDSW), access_dcgsw },
  
        DBG_BCR_BVR_WCR_WVR_EL1(0),
        DBG_BCR_BVR_WCR_WVR_EL1(1),
        { SYS_DESC(SYS_MDRAR_EL1), trap_raz_wi },
        { SYS_DESC(SYS_OSLAR_EL1), trap_oslar_el1 },
        { SYS_DESC(SYS_OSLSR_EL1), trap_oslsr_el1, reset_val, OSLSR_EL1,
-               SYS_OSLSR_OSLM_IMPLEMENTED, .set_user = set_oslsr_el1, },
+               OSLSR_EL1_OSLM_IMPLEMENTED, .set_user = set_oslsr_el1, },
        { SYS_DESC(SYS_OSDLR_EL1), trap_raz_wi },
        { SYS_DESC(SYS_DBGPRCR_EL1), trap_raz_wi },
        { SYS_DESC(SYS_DBGCLAIMSET_EL1), trap_raz_wi },
        ID_SANITISED(ID_AA64MMFR0_EL1),
        ID_SANITISED(ID_AA64MMFR1_EL1),
        ID_SANITISED(ID_AA64MMFR2_EL1),
-       ID_UNALLOCATED(7,3),
+       ID_SANITISED(ID_AA64MMFR3_EL1),
        ID_UNALLOCATED(7,4),
        ID_UNALLOCATED(7,5),
        ID_UNALLOCATED(7,6),
        { SYS_DESC(SYS_TTBR0_EL1), access_vm_reg, reset_unknown, TTBR0_EL1 },
        { SYS_DESC(SYS_TTBR1_EL1), access_vm_reg, reset_unknown, TTBR1_EL1 },
        { SYS_DESC(SYS_TCR_EL1), access_vm_reg, reset_val, TCR_EL1, 0 },
+       { SYS_DESC(SYS_TCR2_EL1), access_vm_reg, reset_val, TCR2_EL1, 0 },
  
        PTRAUTH_KEY(APIA),
        PTRAUTH_KEY(APIB),
        { SYS_DESC(SYS_PMMIR_EL1), trap_raz_wi },
  
        { SYS_DESC(SYS_MAIR_EL1), access_vm_reg, reset_unknown, MAIR_EL1 },
+       { SYS_DESC(SYS_PIRE0_EL1), access_vm_reg, reset_unknown, PIRE0_EL1 },
+       { SYS_DESC(SYS_PIR_EL1), access_vm_reg, reset_unknown, PIR_EL1 },
        { SYS_DESC(SYS_AMAIR_EL1), access_vm_reg, reset_amair_el1, AMAIR_EL1 },
  
        { SYS_DESC(SYS_LORSA_EL1), trap_loregion },
diff --combined arch/arm64/mm/fault.c
index 6045a5117ac15bca1fe0cceba12509e13003df87,7b2537c0bfbc59b6bdeb7055d393c958f3a18504..c85b6d70b2223e99a05dc7e4721d7702e19da28e
@@@ -66,6 -66,8 +66,8 @@@ static inline const struct fault_info *
  
  static void data_abort_decode(unsigned long esr)
  {
+       unsigned long iss2 = ESR_ELx_ISS2(esr);
        pr_alert("Data abort info:\n");
  
        if (esr & ESR_ELx_ISV) {
                         (esr & ESR_ELx_SF) >> ESR_ELx_SF_SHIFT,
                         (esr & ESR_ELx_AR) >> ESR_ELx_AR_SHIFT);
        } else {
-               pr_alert("  ISV = 0, ISS = 0x%08lx\n", esr & ESR_ELx_ISS_MASK);
+               pr_alert("  ISV = 0, ISS = 0x%08lx, ISS2 = 0x%08lx\n",
+                        esr & ESR_ELx_ISS_MASK, iss2);
        }
  
-       pr_alert("  CM = %lu, WnR = %lu\n",
+       pr_alert("  CM = %lu, WnR = %lu, TnD = %lu, TagAccess = %lu\n",
                 (esr & ESR_ELx_CM) >> ESR_ELx_CM_SHIFT,
-                (esr & ESR_ELx_WNR) >> ESR_ELx_WNR_SHIFT);
+                (esr & ESR_ELx_WNR) >> ESR_ELx_WNR_SHIFT,
+                (iss2 & ESR_ELx_TnD) >> ESR_ELx_TnD_SHIFT,
+                (iss2 & ESR_ELx_TagAccess) >> ESR_ELx_TagAccess_SHIFT);
+       pr_alert("  GCS = %ld, Overlay = %lu, DirtyBit = %lu, Xs = %llu\n",
+                (iss2 & ESR_ELx_GCS) >> ESR_ELx_GCS_SHIFT,
+                (iss2 & ESR_ELx_Overlay) >> ESR_ELx_Overlay_SHIFT,
+                (iss2 & ESR_ELx_DirtyBit) >> ESR_ELx_DirtyBit_SHIFT,
+                (iss2 & ESR_ELx_Xs_MASK) >> ESR_ELx_Xs_SHIFT);
  }
  
  static void mem_abort_decode(unsigned long esr)
@@@ -600,7 -611,8 +611,7 @@@ static int __kprobes do_page_fault(unsi
                vma_end_read(vma);
                goto lock_mmap;
        }
 -      fault = handle_mm_fault(vma, addr & PAGE_MASK,
 -                              mm_flags | FAULT_FLAG_VMA_LOCK, regs);
 +      fault = handle_mm_fault(vma, addr, mm_flags | FAULT_FLAG_VMA_LOCK, regs);
        vma_end_read(vma);
  
        if (!(fault & VM_FAULT_RETRY)) {
@@@ -885,9 -897,6 +896,6 @@@ void do_sp_pc_abort(unsigned long addr
  }
  NOKPROBE_SYMBOL(do_sp_pc_abort);
  
- int __init early_brk64(unsigned long addr, unsigned long esr,
-                      struct pt_regs *regs);
  /*
   * __refdata because early_brk64 is __init, but the reference to it is
   * clobbered at arch_initcall time.
index 6b70d02bc5f9aa8d4b951cd1b916f1677e337e0d,e4e7bb6fa7202627601f2684bfe98e45e393747d..ee7cb6aaff718114c905e02e26f6c4c3dca0a869
@@@ -26,14 -26,12 +26,13 @@@ int iort_register_domain_token(int tran
                               struct fwnode_handle *fw_node);
  void iort_deregister_domain_token(int trans_id);
  struct fwnode_handle *iort_find_domain_token(int trans_id);
 +int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id);
 +
  #ifdef CONFIG_ACPI_IORT
- void acpi_iort_init(void);
  u32 iort_msi_map_id(struct device *dev, u32 id);
  struct irq_domain *iort_get_device_domain(struct device *dev, u32 id,
                                          enum irq_domain_bus_token bus_token);
  void acpi_configure_pmsi_domain(struct device *dev);
 -int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id);
  void iort_get_rmr_sids(struct fwnode_handle *iommu_fwnode,
                       struct list_head *head);
  void iort_put_rmr_sids(struct fwnode_handle *iommu_fwnode,
@@@ -44,7 -42,6 +43,6 @@@ int iort_iommu_configure_id(struct devi
  void iort_iommu_get_resv_regions(struct device *dev, struct list_head *head);
  phys_addr_t acpi_iort_dma_get_max_cpu_address(void);
  #else
- static inline void acpi_iort_init(void) { }
  static inline u32 iort_msi_map_id(struct device *dev, u32 id)
  { return id; }
  static inline struct irq_domain *iort_get_device_domain(
This page took 0.143775 seconds and 4 git commands to generate.