]> Git Repo - linux.git/commitdiff
Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
authorLinus Torvalds <[email protected]>
Fri, 4 Sep 2015 14:18:09 +0000 (07:18 -0700)
committerLinus Torvalds <[email protected]>
Fri, 4 Sep 2015 14:18:09 +0000 (07:18 -0700)
Pull arm64 updates from Will Deacon:

 - Support for new architectural features introduced in ARMv8.1:
   * Privileged Access Never (PAN) to catch user pointer dereferences in
     the kernel
   * Large System Extension (LSE) for building scalable atomics and locks
     (depends on locking/arch-atomic from tip, which is included here)
   * Hardware Dirty Bit Management (DBM) for updating clean PTEs
     automatically

 - Move our PSCI implementation out into drivers/firmware/, where it can
   be shared with arch/arm/. RMK has also pulled this component branch
   and has additional patches moving arch/arm/ over. MAINTAINERS is
   updated accordingly.

 - Better BUG implementation based on the BRK instruction for trapping

 - Leaf TLB invalidation for unmapping user pages

 - Support for PROBE_ONLY PCI configurations

 - Various cleanups and non-critical fixes, including:
   * Always flush FP/SIMD state over exec()
   * Restrict memblock additions based on range of linear mapping
   * Ensure *(LIST_POISON) generates a fatal fault
   * Context-tracking syscall return no longer corrupts return value when
     not forced on.
   * Alternatives patching synchronisation/stability improvements
   * Signed sub-word cmpxchg compare fix (tickled by HAVE_CMPXCHG_LOCAL)
   * Force SMP=y
   * Hide direct DCC access from userspace
   * Fix EFI stub memory allocation when DRAM starts at 0x0

* tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (92 commits)
  arm64: flush FP/SIMD state correctly after execve()
  arm64: makefile: fix perf_callchain.o kconfig dependency
  arm64: set MAX_MEMBLOCK_ADDR according to linear region size
  of/fdt: make memblock maximum physical address arch configurable
  arm64: Fix source code file path in comments
  arm64: entry: always restore x0 from the stack on syscall return
  arm64: mdscr_el1: avoid exposing DCC to userspace
  arm64: kconfig: Move LIST_POISON to a safe value
  arm64: Add __exception_irq_entry definition for function graph
  arm64: mm: ensure patched kernel text is fetched from PoU
  arm64: alternatives: ensure secondary CPUs execute ISB after patching
  arm64: make ll/sc __cmpxchg_case_##name asm consistent
  arm64: dma-mapping: Simplify pgprot handling
  arm64: restore cpu suspend/resume functionality
  ARM64: PCI: do not enable resources on PROBE_ONLY systems
  arm64: cmpxchg: truncate sub-word signed types before comparison
  arm64: alternative: put secondary CPUs into polling loop during patch
  arm64/Documentation: clarify wording regarding memory below the Image
  arm64: lse: fix lse cmpxchg code indentation
  arm64: remove redundant object file list
  ...

1  2 
arch/arm64/Kconfig
arch/arm64/kernel/setup.c

diff --combined arch/arm64/Kconfig
index 51832ad33fa9f1352443ac98a9f0c298283787be,f3d751a342f00266f2604c0b4367abb9e8fa4958..7d95663c0160bd2575199e3836570e46fb4a158d
@@@ -29,7 -29,7 +29,7 @@@ config ARM6
        select EDAC_SUPPORT
        select GENERIC_ALLOCATOR
        select GENERIC_CLOCKEVENTS
-       select GENERIC_CLOCKEVENTS_BROADCAST if SMP
+       select GENERIC_CLOCKEVENTS_BROADCAST
        select GENERIC_CPU_AUTOPROBE
        select GENERIC_EARLY_IOREMAP
        select GENERIC_IRQ_PROBE
@@@ -54,6 -54,7 +54,7 @@@
        select HAVE_C_RECORDMCOUNT
        select HAVE_CC_STACKPROTECTOR
        select HAVE_CMPXCHG_DOUBLE
+       select HAVE_CMPXCHG_LOCAL
        select HAVE_DEBUG_BUGVERBOSE
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_DMA_API_DEBUG
@@@ -105,6 -106,10 +106,10 @@@ config NO_IOPORT_MA
  config STACKTRACE_SUPPORT
        def_bool y
  
+ config ILLEGAL_POINTER_VALUE
+       hex
+       default 0xdead000000000000
  config LOCKDEP_SUPPORT
        def_bool y
  
@@@ -114,6 -119,14 +119,14 @@@ config TRACE_IRQFLAGS_SUPPOR
  config RWSEM_XCHGADD_ALGORITHM
        def_bool y
  
+ config GENERIC_BUG
+       def_bool y
+       depends on BUG
+ config GENERIC_BUG_RELATIVE_POINTERS
+       def_bool y
+       depends on GENERIC_BUG
  config GENERIC_HWEIGHT
        def_bool y
  
@@@ -138,6 -151,9 +151,9 @@@ config NEED_DMA_MAP_STAT
  config NEED_SG_DMA_LENGTH
        def_bool y
  
+ config SMP
+       def_bool y
  config SWIOTLB
        def_bool y
  
@@@ -161,7 -177,110 +177,7 @@@ source "init/Kconfig
  
  source "kernel/Kconfig.freezer"
  
 -menu "Platform selection"
 -
 -config ARCH_EXYNOS
 -      bool
 -      help
 -        This enables support for Samsung Exynos SoC family
 -
 -config ARCH_EXYNOS7
 -      bool "ARMv8 based Samsung Exynos7"
 -      select ARCH_EXYNOS
 -      select COMMON_CLK_SAMSUNG
 -      select HAVE_S3C2410_WATCHDOG if WATCHDOG
 -      select HAVE_S3C_RTC if RTC_CLASS
 -      select PINCTRL
 -      select PINCTRL_EXYNOS
 -
 -      help
 -        This enables support for Samsung Exynos7 SoC family
 -
 -config ARCH_FSL_LS2085A
 -      bool "Freescale LS2085A SOC"
 -      help
 -        This enables support for Freescale LS2085A SOC.
 -
 -config ARCH_HISI
 -      bool "Hisilicon SoC Family"
 -      help
 -        This enables support for Hisilicon ARMv8 SoC family
 -
 -config ARCH_MEDIATEK
 -      bool "Mediatek MT65xx & MT81xx ARMv8 SoC"
 -      select ARM_GIC
 -      select PINCTRL
 -      help
 -        Support for Mediatek MT65xx & MT81xx ARMv8 SoCs
 -
 -config ARCH_QCOM
 -      bool "Qualcomm Platforms"
 -      select PINCTRL
 -      help
 -        This enables support for the ARMv8 based Qualcomm chipsets.
 -
 -config ARCH_SEATTLE
 -      bool "AMD Seattle SoC Family"
 -      help
 -        This enables support for AMD Seattle SOC Family
 -
 -config ARCH_TEGRA
 -      bool "NVIDIA Tegra SoC Family"
 -      select ARCH_HAS_RESET_CONTROLLER
 -      select ARCH_REQUIRE_GPIOLIB
 -      select CLKDEV_LOOKUP
 -      select CLKSRC_MMIO
 -      select CLKSRC_OF
 -      select GENERIC_CLOCKEVENTS
 -      select HAVE_CLK
 -      select PINCTRL
 -      select RESET_CONTROLLER
 -      help
 -        This enables support for the NVIDIA Tegra SoC family.
 -
 -config ARCH_TEGRA_132_SOC
 -      bool "NVIDIA Tegra132 SoC"
 -      depends on ARCH_TEGRA
 -      select PINCTRL_TEGRA124
 -      select USB_ULPI if USB_PHY
 -      select USB_ULPI_VIEWPORT if USB_PHY
 -      help
 -        Enable support for NVIDIA Tegra132 SoC, based on the Denver
 -        ARMv8 CPU.  The Tegra132 SoC is similar to the Tegra124 SoC,
 -        but contains an NVIDIA Denver CPU complex in place of
 -        Tegra124's "4+1" Cortex-A15 CPU complex.
 -
 -config ARCH_SPRD
 -      bool "Spreadtrum SoC platform"
 -      help
 -        Support for Spreadtrum ARM based SoCs
 -
 -config ARCH_THUNDER
 -      bool "Cavium Inc. Thunder SoC Family"
 -      help
 -        This enables support for Cavium's Thunder Family of SoCs.
 -
 -config ARCH_VEXPRESS
 -      bool "ARMv8 software model (Versatile Express)"
 -      select ARCH_REQUIRE_GPIOLIB
 -      select COMMON_CLK_VERSATILE
 -      select POWER_RESET_VEXPRESS
 -      select VEXPRESS_CONFIG
 -      help
 -        This enables support for the ARMv8 software model (Versatile
 -        Express).
 -
 -config ARCH_XGENE
 -      bool "AppliedMicro X-Gene SOC Family"
 -      help
 -        This enables support for AppliedMicro X-Gene SOC Family
 -
 -config ARCH_ZYNQMP
 -      bool "Xilinx ZynqMP Family"
 -      help
 -        This enables support for Xilinx ZynqMP Family
 -
 -endmenu
 +source "arch/arm64/Kconfig.platforms"
  
  menu "Bus support"
  
@@@ -372,22 -491,8 +388,8 @@@ config CPU_BIG_ENDIA
         help
           Say Y if you plan on running a kernel in big-endian mode.
  
- config SMP
-       bool "Symmetric Multi-Processing"
-       help
-         This enables support for systems with more than one CPU.  If
-         you say N here, the kernel will run on single and
-         multiprocessor machines, but will use only one CPU of a
-         multiprocessor machine. If you say Y here, the kernel will run
-         on many, but not all, single processor machines. On a single
-         processor machine, the kernel will run faster if you say N
-         here.
-         If you don't know what to do here, say N.
  config SCHED_MC
        bool "Multi-core scheduler support"
-       depends on SMP
        help
          Multi-core scheduler support improves the CPU scheduler's decision
          making when dealing with multi-core CPU chips at a cost of slightly
  
  config SCHED_SMT
        bool "SMT scheduler support"
-       depends on SMP
        help
          Improves the CPU scheduler's decision making when dealing with
          MultiThreading at a cost of slightly increased overhead in some
  config NR_CPUS
        int "Maximum number of CPUs (2-4096)"
        range 2 4096
-       depends on SMP
        # These have to remain sorted largest to smallest
        default "64"
  
  config HOTPLUG_CPU
        bool "Support for hot-pluggable CPUs"
-       depends on SMP
        help
          Say Y here to experiment with turning CPUs off and on.  CPUs
          can be controlled through /sys/devices/system/cpu.
  
  source kernel/Kconfig.preempt
  
- config UP_LATE_INIT
-        def_bool y
-        depends on !SMP
  config HZ
        int
        default 100
@@@ -562,6 -660,53 +557,53 @@@ config SETEND_EMULATIO
          If unsure, say Y
  endif
  
+ menu "ARMv8.1 architectural features"
+ config ARM64_HW_AFDBM
+       bool "Support for hardware updates of the Access and Dirty page flags"
+       default y
+       help
+         The ARMv8.1 architecture extensions introduce support for
+         hardware updates of the access and dirty information in page
+         table entries. When enabled in TCR_EL1 (HA and HD bits) on
+         capable processors, accesses to pages with PTE_AF cleared will
+         set this bit instead of raising an access flag fault.
+         Similarly, writes to read-only pages with the DBM bit set will
+         clear the read-only bit (AP[2]) instead of raising a
+         permission fault.
+         Kernels built with this configuration option enabled continue
+         to work on pre-ARMv8.1 hardware and the performance impact is
+         minimal. If unsure, say Y.
+ config ARM64_PAN
+       bool "Enable support for Privileged Access Never (PAN)"
+       default y
+       help
+        Privileged Access Never (PAN; part of the ARMv8.1 Extensions)
+        prevents the kernel or hypervisor from accessing user-space (EL0)
+        memory directly.
+        Choosing this option will cause any unprotected (not using
+        copy_to_user et al) memory access to fail with a permission fault.
+        The feature is detected at runtime, and will remain as a 'nop'
+        instruction if the cpu does not implement the feature.
+ config ARM64_LSE_ATOMICS
+       bool "Atomic instructions"
+       help
+         As part of the Large System Extensions, ARMv8.1 introduces new
+         atomic instructions that are designed specifically to scale in
+         very large systems.
+         Say Y here to make use of these instructions for the in-kernel
+         atomic routines. This incurs a small overhead on CPUs that do
+         not support these instructions and requires the kernel to be
+         built with binutils >= 2.25.
+ endmenu
  endmenu
  
  menu "Boot options"
index fdc11f05ac36598681f9b2cc26754f5e391c9db0,fddae2c15ad2a8a8c778f0a229cb58ea40609321..8884788812433b26aa734980538dea3cbea6405f
@@@ -34,6 -34,7 +34,6 @@@
  #include <linux/kexec.h>
  #include <linux/crash_dump.h>
  #include <linux/root_dev.h>
 -#include <linux/clk-provider.h>
  #include <linux/cpu.h>
  #include <linux/interrupt.h>
  #include <linux/smp.h>
@@@ -62,7 -63,6 +62,6 @@@
  #include <asm/traps.h>
  #include <asm/memblock.h>
  #include <asm/efi.h>
- #include <asm/virt.h>
  #include <asm/xen/hypervisor.h>
  
  unsigned long elf_hwcap __read_mostly;
@@@ -130,7 -130,6 +129,6 @@@ bool arch_match_cpu_phys_id(int cpu, u6
  }
  
  struct mpidr_hash mpidr_hash;
- #ifdef CONFIG_SMP
  /**
   * smp_build_mpidr_hash - Pre-compute shifts required at each affinity
   *                      level in order to build a linear index from an
@@@ -196,35 -195,11 +194,11 @@@ static void __init smp_build_mpidr_hash
                pr_warn("Large number of MPIDR hash buckets detected\n");
        __flush_dcache_area(&mpidr_hash, sizeof(struct mpidr_hash));
  }
- #endif
- static void __init hyp_mode_check(void)
- {
-       if (is_hyp_mode_available())
-               pr_info("CPU: All CPU(s) started at EL2\n");
-       else if (is_hyp_mode_mismatched())
-               WARN_TAINT(1, TAINT_CPU_OUT_OF_SPEC,
-                          "CPU: CPUs started in inconsistent modes");
-       else
-               pr_info("CPU: All CPU(s) started at EL1\n");
- }
- void __init do_post_cpus_up_work(void)
- {
-       hyp_mode_check();
-       apply_alternatives_all();
- }
- #ifdef CONFIG_UP_LATE_INIT
- void __init up_late_init(void)
- {
-       do_post_cpus_up_work();
- }
- #endif /* CONFIG_UP_LATE_INIT */
  
  static void __init setup_processor(void)
  {
-       u64 features, block;
+       u64 features;
+       s64 block;
        u32 cwg;
        int cls;
  
         * for non-negative values. Negative values are reserved.
         */
        features = read_cpuid(ID_AA64ISAR0_EL1);
-       block = (features >> 4) & 0xf;
-       if (!(block & 0x8)) {
+       block = cpuid_feature_extract_field(features, 4);
+       if (block > 0) {
                switch (block) {
                default:
                case 2:
                }
        }
  
-       block = (features >> 8) & 0xf;
-       if (block && !(block & 0x8))
+       if (cpuid_feature_extract_field(features, 8) > 0)
                elf_hwcap |= HWCAP_SHA1;
  
-       block = (features >> 12) & 0xf;
-       if (block && !(block & 0x8))
+       if (cpuid_feature_extract_field(features, 12) > 0)
                elf_hwcap |= HWCAP_SHA2;
  
-       block = (features >> 16) & 0xf;
-       if (block && !(block & 0x8))
+       if (cpuid_feature_extract_field(features, 16) > 0)
                elf_hwcap |= HWCAP_CRC32;
  
+       block = cpuid_feature_extract_field(features, 20);
+       if (block > 0) {
+               switch (block) {
+               default:
+               case 2:
+                       elf_hwcap |= HWCAP_ATOMICS;
+               case 1:
+                       /* RESERVED */
+               case 0:
+                       break;
+               }
+       }
  #ifdef CONFIG_COMPAT
        /*
         * ID_ISAR5_EL1 carries similar information as above, but pertaining to
-        * the Aarch32 32-bit execution state.
+        * the AArch32 32-bit execution state.
         */
        features = read_cpuid(ID_ISAR5_EL1);
-       block = (features >> 4) & 0xf;
-       if (!(block & 0x8)) {
+       block = cpuid_feature_extract_field(features, 4);
+       if (block > 0) {
                switch (block) {
                default:
                case 2:
                }
        }
  
-       block = (features >> 8) & 0xf;
-       if (block && !(block & 0x8))
+       if (cpuid_feature_extract_field(features, 8) > 0)
                compat_elf_hwcap2 |= COMPAT_HWCAP2_SHA1;
  
-       block = (features >> 12) & 0xf;
-       if (block && !(block & 0x8))
+       if (cpuid_feature_extract_field(features, 12) > 0)
                compat_elf_hwcap2 |= COMPAT_HWCAP2_SHA2;
  
-       block = (features >> 16) & 0xf;
-       if (block && !(block & 0x8))
+       if (cpuid_feature_extract_field(features, 16) > 0)
                compat_elf_hwcap2 |= COMPAT_HWCAP2_CRC32;
  #endif
  }
@@@ -404,10 -386,8 +385,8 @@@ void __init setup_arch(char **cmdline_p
        xen_early_init();
  
        cpu_read_bootcpu_ops();
- #ifdef CONFIG_SMP
        smp_init_cpus();
        smp_build_mpidr_hash();
- #endif
  
  #ifdef CONFIG_VT
  #if defined(CONFIG_VGA_CONSOLE)
  
  static int __init arm64_device_init(void)
  {
-       of_iommu_init();
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+       if (of_have_populated_dt()) {
+               of_iommu_init();
+               of_platform_populate(NULL, of_default_bus_match_table,
+                                    NULL, NULL);
+       } else if (acpi_disabled) {
+               pr_crit("Device tree not populated\n");
+       }
        return 0;
  }
  arch_initcall_sync(arm64_device_init);
@@@ -455,6 -440,7 +439,7 @@@ static const char *hwcap_str[] = 
        "sha1",
        "sha2",
        "crc32",
+       "atomics",
        NULL
  };
  
@@@ -507,9 -493,7 +492,7 @@@ static int c_show(struct seq_file *m, v
                 * online processors, looking for lines beginning with
                 * "processor".  Give glibc what it expects.
                 */
- #ifdef CONFIG_SMP
                seq_printf(m, "processor\t: %d\n", i);
- #endif
  
                /*
                 * Dump out the common processor features in a single line.
This page took 0.081587 seconds and 4 git commands to generate.