1. 12 1月, 2017 2 次提交
  2. 11 1月, 2017 5 次提交
  3. 10 1月, 2017 6 次提交
    • W
      arm64: cpufeature: Don't enforce system-wide SPE capability · f31deaad
      Will Deacon 提交于
      The statistical profiling extension (SPE) is an optional feature of
      ARMv8.1 and is unlikely to be supported by all of the CPUs in a
      heterogeneous system.
      
      This patch updates the cpufeature checks so that such systems are not
      tainted as unsupported.
      Acked-by: NMark Rutland <mark.rutland@arm.com>
      Reviewed-by: NSuzuki Poulose <suzuki.poulose@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      f31deaad
    • W
      arm64: cpufeature: allow for version discrepancy in PMU implementations · b20d1ba3
      Will Deacon 提交于
      Perf already supports multiple PMU instances for heterogeneous systems,
      so there's no need to be strict in the cpufeature checking, particularly
      as the PMU extension is optional in the architecture.
      Acked-by: NMark Rutland <mark.rutland@arm.com>
      Reviewed-by: NSuzuki K Poulose <suzuki.poulose@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      b20d1ba3
    • J
      arm64: Remove useless UAO IPI and describe how this gets enabled · c8b06e3f
      James Morse 提交于
      Since its introduction, the UAO enable call was broken, and useless.
      commit 2a6dcb2b ("arm64: cpufeature: Schedule enable() calls instead
      of calling them via IPI"), fixed the framework so that these calls
      are scheduled, so that they can modify PSTATE.
      
      Now it is just useless. Remove it. UAO is enabled by the code patching
      which causes get_user() and friends to use the 'ldtr' family of
      instructions. This relies on the PSTATE.UAO bit being set to match
      addr_limit, which we do in uao_thread_switch() called via __switch_to().
      
      All that is needed to enable UAO is patch the code, and call schedule().
      __apply_alternatives_multi_stop() calls stop_machine() when it modifies
      the kernel text to enable the alternatives, (including the UAO code in
      uao_thread_switch()). Once stop_machine() has finished __switch_to() is
      called to reschedule the original task, this causes PSTATE.UAO to be set
      appropriately. An explicit enable() call is not needed.
      Reported-by: NVladimir Murzin <vladimir.murzin@arm.com>
      Signed-off-by: NJames Morse <james.morse@arm.com>
      c8b06e3f
    • M
      arm64: head.S: fix up stale comments · 510224c2
      Mark Rutland 提交于
      In commit 23c8a500 ("arm64: kernel: use ordinary return/argument
      register for el2_setup()"), we stopped using w20 as a global stash of
      the boot mode flag, and instead pass this around in w0 as a function
      parameter.
      
      Unfortunately, we missed a couple of comments, which still refer to the
      old convention of using w20/x20.
      
      This patch fixes up the comments to describe the code as it currently
      works.
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Acked-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      510224c2
    • M
      arm64: add missing printk newlines · 117f5727
      Mark Rutland 提交于
      A few printk calls in arm64 omit a trailing newline, even though there
      is no subsequent KERN_CONT printk associated with them, and we actually
      want a newline.
      
      This can result in unrelated lines being appended, rather than appearing
      on a new line. Additionally, timestamp prefixes may appear in-line. This
      makes the logs harder to read than necessary.
      
      Avoid this by adding a trailing newline.
      
      These were found with a shortlist generated by:
      
      $ git grep 'pr\(intk\|_.*\)(.*)' -- arch/arm64 | grep -v pr_fmt | grep -v '\\n"'
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      CC: James Morse <james.morse@arm.com>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      117f5727
    • J
      arm64: Don't trace __switch_to if function graph tracer is enabled · 8f4b326d
      Joel Fernandes 提交于
      Function graph tracer shows negative time (wrap around) when tracing
      __switch_to if the nosleep-time trace option is enabled.
      
      Time compensation for nosleep-time is done by an ftrace probe on
      sched_switch. This doesn't work well for the following events (with
      letters representing timestamps):
      A - sched switch probe called for task T switch out
      B - __switch_to calltime is recorded
      C - sched_switch probe called for task T switch in
      D - __switch_to rettime is recorded
      
      If C - A > D - B, then we end up over compensating for the time spent in
      __switch_to giving rise to negative times in the trace output.
      
      On x86, __switch_to is not traced if function graph tracer is enabled.
      Do the same for arm64 as well.
      
      Cc: Todd Kjos <tkjos@google.com>
      Cc: Steven Rostedt <rostedt@goodmis.org>
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Signed-off-by: NJoel Fernandes <joelaf@google.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      8f4b326d
  4. 27 12月, 2016 1 次提交
  5. 25 12月, 2016 2 次提交
  6. 21 12月, 2016 2 次提交
    • L
      ACPI / osl: Remove acpi_get_table_with_size()/early_acpi_os_unmap_memory() users · 6b11d1d6
      Lv Zheng 提交于
      This patch removes the users of the deprectated APIs:
       acpi_get_table_with_size()
       early_acpi_os_unmap_memory()
      The following APIs should be used instead of:
       acpi_get_table()
       acpi_put_table()
      
      The deprecated APIs are invented to be a replacement of acpi_get_table()
      during the early stage so that the early mapped pointer will not be stored
      in ACPICA core and thus the late stage acpi_get_table() won't return a
      wrong pointer. The mapping size is returned just because it is required by
      early_acpi_os_unmap_memory() to unmap the pointer during early stage.
      
      But as the mapping size equals to the acpi_table_header.length
      (see acpi_tb_init_table_descriptor() and acpi_tb_validate_table()), when
      such a convenient result is returned, driver code will start to use it
      instead of accessing acpi_table_header to obtain the length.
      
      Thus this patch cleans up the drivers by replacing returned table size with
      acpi_table_header.length, and should be a no-op.
      Reported-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      6b11d1d6
    • A
      arm64: setup: introduce kaslr_offset() · 7ede8665
      Alexander Popov 提交于
      Introduce kaslr_offset() similar to x86_64 to fix kcov.
      
      [ Updated by Will Deacon ]
      
      Link: http://lkml.kernel.org/r/1481417456-28826-2-git-send-email-alex.popov@linux.comSigned-off-by: NAlexander Popov <alex.popov@linux.com>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Rob Herring <robh@kernel.org>
      Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
      Cc: AKASHI Takahiro <takahiro.akashi@linaro.org>
      Cc: Jon Masters <jcm@redhat.com>
      Cc: David Daney <david.daney@cavium.com>
      Cc: Ganapatrao Kulkarni <gkulkarni@caviumnetworks.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Nicolai Stange <nicstange@gmail.com>
      Cc: James Morse <james.morse@arm.com>
      Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
      Cc: Andrey Konovalov <andreyknvl@google.com>
      Cc: Alexander Popov <alex.popov@linux.com>
      Cc: syzkaller <syzkaller@googlegroups.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      7ede8665
  7. 14 12月, 2016 1 次提交
  8. 07 12月, 2016 5 次提交
    • T
      PCI/ACPI: Extend pci_mcfg_lookup() to return ECAM config accessors · 13983eb8
      Tomasz Nowicki 提交于
      pci_mcfg_lookup() is the external interface to the generic MCFG code.
      Previously it merely looked up the ECAM base address for a given domain and
      bus range.  We want a way to add MCFG quirks, some of which may require
      special config accessors and adjustments to the ECAM address range.
      
      Extend pci_mcfg_lookup() so it can return a pointer to a pci_ecam_ops
      structure and a struct resource for the ECAM address space.  For now, it
      always returns &pci_generic_ecam_ops (the standard accessor) and the
      resource described by the MCFG.
      
      No functional changes intended.
      
      [bhelgaas: changelog]
      Signed-off-by: NTomasz Nowicki <tn@semihalf.com>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      13983eb8
    • B
      arm64: PCI: Exclude ACPI "consumer" resources from host bridge windows · 8fd4391e
      Bjorn Helgaas 提交于
      On x86 and ia64, we have treated all ACPI _CRS resources of PNP0A03 host
      bridge devices as "producers", i.e., as host bridge windows.  That's partly
      because some x86 BIOSes improperly used "consumer" descriptors to describe
      windows and partly because Linux didn't have good support for handling
      consumer and producer descriptors differently.
      
      One result is that x86 BIOSes describe host bridge "consumer" resources in
      the _CRS of a PNP0C02 device, not the PNP0A03 device itself.  On arm64 we
      don't have a legacy of firmware that has this consumer/producer confusion,
      so we can handle PNP0A03 "consumer" descriptors as host bridge registers
      instead of windows.
      
      Exclude non-window ("consumer") resources from the list of host bridge
      windows.  This allows the use of "consumer" PNP0A03 descriptors for bridge
      register space.
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      8fd4391e
    • T
      arm64: PCI: Manage controller-specific data on per-controller basis · 093d24a2
      Tomasz Nowicki 提交于
      Currently we use one shared global acpi_pci_root_ops structure to keep
      controller-specific ops. We pass its pointer to acpi_pci_root_create() and
      associate it with a host bridge instance for good.  Such a design implies
      serious drawback. Any potential manipulation on the single system-wide
      acpi_pci_root_ops leads to kernel crash. The structure content is not
      really changing even across multiple host bridges creation; thus it was not
      an issue so far.
      
      In preparation for adding ECAM quirks mechanism (where controller-specific
      PCI ops may be different for each host bridge) allocate new
      acpi_pci_root_ops and fill in with data for each bridge. Now it is safe to
      have different controller-specific info. As a consequence free
      acpi_pci_root_ops when host bridge is released.
      
      No functional changes in this patch.
      Signed-off-by: NTomasz Nowicki <tn@semihalf.com>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      Acked-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      093d24a2
    • B
      arm64: PCI: Search ACPI namespace to ensure ECAM space is reserved · 08b1c196
      Bjorn Helgaas 提交于
      The static MCFG table tells us the base of ECAM space, but it does not
      reserve the space -- the reservation should be done via a device in the
      ACPI namespace whose _CRS includes the ECAM region.
      
      Use acpi_resource_consumer() to check whether the ECAM space is reserved by
      an ACPI namespace device.  If it is, emit a message showing which device
      reserves it.  If not, emit a "[Firmware Bug]" warning.
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      Acked-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      08b1c196
    • B
      arm64: PCI: Add local struct device pointers · dfd1972c
      Bjorn Helgaas 提交于
      Use a local "struct device *dev" for brevity.  No functional change
      intended.
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      Acked-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      dfd1972c
  9. 02 12月, 2016 3 次提交
  10. 29 11月, 2016 1 次提交
    • J
      arm64: head.S: Fix CNTHCTL_EL2 access on VHE system · 1650ac49
      Jintack 提交于
      Bit positions of CNTHCTL_EL2 are changing depending on HCR_EL2.E2H bit.
      EL1PCEN and EL1PCTEN are 1st and 0th bits when E2H is not set, but they
      are 11th and 10th bits respectively when E2H is set.  Current code is
      unintentionally setting wrong bits to CNTHCTL_EL2 with E2H set.
      
      In fact, we don't need to set those two bits, which allow EL1 and EL0 to
      access physical timer and counter respectively, if E2H and TGE are set
      for the host kernel. They will be configured later as necessary. First,
      we don't need to configure those bits for EL1, since the host kernel
      runs in EL2.  It is a hypervisor's responsibility to configure them
      before entering a VM, which runs in EL0 and EL1. Second, EL0 accesses
      are configured in the later stage of boot process.
      Signed-off-by: NJintack Lim <jintack@cs.columbia.edu>
      Acked-by: NMarc Zyngier <marc.zyngier@arm.com>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      1650ac49
  11. 22 11月, 2016 3 次提交
    • C
      arm64: Disable TTBR0_EL1 during normal kernel execution · 39bc88e5
      Catalin Marinas 提交于
      When the TTBR0 PAN feature is enabled, the kernel entry points need to
      disable access to TTBR0_EL1. The PAN status of the interrupted context
      is stored as part of the saved pstate, reusing the PSR_PAN_BIT (22).
      Restoring access to TTBR0_EL1 is done on exception return if returning
      to user or returning to a context where PAN was disabled.
      
      Context switching via switch_mm() must defer the update of TTBR0_EL1
      until a return to user or an explicit uaccess_enable() call.
      
      Special care needs to be taken for two cases where TTBR0_EL1 is set
      outside the normal kernel context switch operation: EFI run-time
      services (via efi_set_pgd) and CPU suspend (via cpu_(un)install_idmap).
      Code has been added to avoid deferred TTBR0_EL1 switching as in
      switch_mm() and restore the reserved TTBR0_EL1 when uninstalling the
      special TTBR0_EL1.
      
      User cache maintenance (user_cache_maint_handler and
      __flush_cache_user_range) needs the TTBR0_EL1 re-instated since the
      operations are performed by user virtual address.
      
      This patch also removes a stale comment on the switch_mm() function.
      
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: James Morse <james.morse@arm.com>
      Cc: Kees Cook <keescook@chromium.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      39bc88e5
    • C
      arm64: Introduce uaccess_{disable,enable} functionality based on TTBR0_EL1 · 4b65a5db
      Catalin Marinas 提交于
      This patch adds the uaccess macros/functions to disable access to user
      space by setting TTBR0_EL1 to a reserved zeroed page. Since the value
      written to TTBR0_EL1 must be a physical address, for simplicity this
      patch introduces a reserved_ttbr0 page at a constant offset from
      swapper_pg_dir. The uaccess_disable code uses the ttbr1_el1 value
      adjusted by the reserved_ttbr0 offset.
      
      Enabling access to user is done by restoring TTBR0_EL1 with the value
      from the struct thread_info ttbr0 variable. Interrupts must be disabled
      during the uaccess_ttbr0_enable code to ensure the atomicity of the
      thread_info.ttbr0 read and TTBR0_EL1 write. This patch also moves the
      get_thread_info asm macro from entry.S to assembler.h for reuse in the
      uaccess_ttbr0_* macros.
      
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: James Morse <james.morse@arm.com>
      Cc: Kees Cook <keescook@chromium.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      4b65a5db
    • C
      arm64: Factor out PAN enabling/disabling into separate uaccess_* macros · bd38967d
      Catalin Marinas 提交于
      This patch moves the directly coded alternatives for turning PAN on/off
      into separate uaccess_{enable,disable} macros or functions. The asm
      macros take a few arguments which will be used in subsequent patches.
      
      Note that any (unlikely) access that the compiler might generate between
      uaccess_enable() and uaccess_disable(), other than those explicitly
      specified by the user access code, will not be protected by PAN.
      
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: James Morse <james.morse@arm.com>
      Cc: Kees Cook <keescook@chromium.org>
      Reviewed-by: NMark Rutland <mark.rutland@arm.com>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      bd38967d
  12. 19 11月, 2016 3 次提交
    • P
      arm64: Allow hw watchpoint of length 3,5,6 and 7 · 0ddb8e0b
      Pratyush Anand 提交于
      Since, arm64 can support all offset within a double word limit. Therefore,
      now support other lengths within that range as well.
      Signed-off-by: NPratyush Anand <panand@redhat.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      0ddb8e0b
    • P
      arm64: hw_breakpoint: Handle inexact watchpoint addresses · fdfeff0f
      Pavel Labath 提交于
      Arm64 hardware does not always report a watchpoint hit address that
      matches one of the watchpoints set. It can also report an address
      "near" the watchpoint if a single instruction access both watched and
      unwatched addresses. There is no straight-forward way, short of
      disassembling the offending instruction, to map that address back to
      the watchpoint.
      
      Previously, when the hardware reported a watchpoint hit on an address
      that did not match our watchpoint (this happens in case of instructions
      which access large chunks of memory such as "stp") the process would
      enter a loop where we would be continually resuming it (because we did
      not recognise that watchpoint hit) and it would keep hitting the
      watchpoint again and again. The tracing process would never get
      notified of the watchpoint hit.
      
      This commit fixes the problem by looking at the watchpoints near the
      address reported by the hardware. If the address does not exactly match
      one of the watchpoints we have set, it attributes the hit to the
      nearest watchpoint we have.  This heuristic is a bit dodgy, but I don't
      think we can do much more, given the hardware limitations.
      Signed-off-by: NPavel Labath <labath@google.com>
      [panand: reworked to rebase on his patches]
      Signed-off-by: NPratyush Anand <panand@redhat.com>
      [will: use __ffs instead of ffs - 1]
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      fdfeff0f
    • P
      arm64: Allow hw watchpoint at varied offset from base address · b08fb180
      Pratyush Anand 提交于
      ARM64 hardware supports watchpoint at any double word aligned address.
      However, it can select any consecutive bytes from offset 0 to 7 from that
      base address. For example, if base address is programmed as 0x420030 and
      byte select is 0x1C, then access of 0x420032,0x420033 and 0x420034 will
      generate a watchpoint exception.
      
      Currently, we do not have such modularity. We can only program byte,
      halfword, word and double word access exception from any base address.
      
      This patch adds support to overcome above limitations.
      Signed-off-by: NPratyush Anand <panand@redhat.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      b08fb180
  13. 18 11月, 2016 1 次提交
    • W
      KVM: arm64: Fix the issues when guest PMCCFILTR is configured · b112c84a
      Wei Huang 提交于
      KVM calls kvm_pmu_set_counter_event_type() when PMCCFILTR is configured.
      But this function can't deals with PMCCFILTR correctly because the evtCount
      bits of PMCCFILTR, which is reserved 0, conflits with the SW_INCR event
      type of other PMXEVTYPER<n> registers. To fix it, when eventsel == 0, this
      function shouldn't return immediately; instead it needs to check further
      if select_idx is ARMV8_PMU_CYCLE_IDX.
      
      Another issue is that KVM shouldn't copy the eventsel bits of PMCCFILTER
      blindly to attr.config. Instead it ought to convert the request to the
      "cpu cycle" event type (i.e. 0x11).
      
      To support this patch and to prevent duplicated definitions, a limited
      set of ARMv8 perf event types were relocated from perf_event.c to
      asm/perf_event.h.
      
      Cc: stable@vger.kernel.org # 4.6+
      Acked-by: NWill Deacon <will.deacon@arm.com>
      Signed-off-by: NWei Huang <wei@redhat.com>
      Signed-off-by: NMarc Zyngier <marc.zyngier@arm.com>
      b112c84a
  14. 17 11月, 2016 2 次提交
  15. 12 11月, 2016 3 次提交
    • M
      arm64: split thread_info from task stack · c02433dd
      Mark Rutland 提交于
      This patch moves arm64's struct thread_info from the task stack into
      task_struct. This protects thread_info from corruption in the case of
      stack overflows, and makes its address harder to determine if stack
      addresses are leaked, making a number of attacks more difficult. Precise
      detection and handling of overflow is left for subsequent patches.
      
      Largely, this involves changing code to store the task_struct in sp_el0,
      and acquire the thread_info from the task struct. Core code now
      implements current_thread_info(), and as noted in <linux/sched.h> this
      relies on offsetof(task_struct, thread_info) == 0, enforced by core
      code.
      
      This change means that the 'tsk' register used in entry.S now points to
      a task_struct, rather than a thread_info as it used to. To make this
      clear, the TI_* field offsets are renamed to TSK_TI_*, with asm-offsets
      appropriately updated to account for the structural change.
      
      Userspace clobbers sp_el0, and we can no longer restore this from the
      stack. Instead, the current task is cached in a per-cpu variable that we
      can safely access from early assembly as interrupts are disabled (and we
      are thus not preemptible).
      
      Both secondary entry and idle are updated to stash the sp and task
      pointer separately.
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Tested-by: NLaura Abbott <labbott@redhat.com>
      Cc: AKASHI Takahiro <takahiro.akashi@linaro.org>
      Cc: Andy Lutomirski <luto@kernel.org>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: James Morse <james.morse@arm.com>
      Cc: Kees Cook <keescook@chromium.org>
      Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      c02433dd
    • M
      arm64: assembler: introduce ldr_this_cpu · 1b7e2296
      Mark Rutland 提交于
      Shortly we will want to load a percpu variable in the return from
      userspace path. We can save an instruction by folding the addition of
      the percpu offset into the load instruction, and this patch adds a new
      helper to do so.
      
      At the same time, we clean up this_cpu_ptr for consistency. As with
      {adr,ldr,str}_l, we change the template to take the destination register
      first, and name this dst. Secondly, we rename the macro to adr_this_cpu,
      following the scheme of adr_l, and matching the newly added
      ldr_this_cpu.
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Tested-by: NLaura Abbott <labbott@redhat.com>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: James Morse <james.morse@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      1b7e2296
    • M
      arm64: make cpu number a percpu variable · 57c82954
      Mark Rutland 提交于
      In the absence of CONFIG_THREAD_INFO_IN_TASK, core code maintains
      thread_info::cpu, and low-level architecture code can access this to
      build raw_smp_processor_id(). With CONFIG_THREAD_INFO_IN_TASK, core code
      maintains task_struct::cpu, which for reasons of hte header soup is not
      accessible to low-level arch code.
      
      Instead, we can maintain a percpu variable containing the cpu number.
      
      For both the old and new implementation of raw_smp_processor_id(), we
      read a syreg into a GPR, add an offset, and load the result. As the
      offset is now larger, it may not be folded into the load, but otherwise
      the assembly shouldn't change much.
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Tested-by: NLaura Abbott <labbott@redhat.com>
      Cc: James Morse <james.morse@arm.com>
      Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
      57c82954