forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kern…
…el/git/arm64/linux Pull arm64 updates from Catalin Marinas: "The bulk is in-kernel pointer authentication, activity monitors and lots of asm symbol annotations. I also queued the sys_mremap() patch commenting the asymmetry in the address untagging. Summary: - In-kernel Pointer Authentication support (previously only offered to user space). - ARM Activity Monitors (AMU) extension support allowing better CPU utilisation numbers for the scheduler (frequency invariance). - Memory hot-remove support for arm64. - Lots of asm annotations (SYM_*) in preparation for the in-kernel Branch Target Identification (BTI) support. - arm64 perf updates: ARMv8.5-PMU 64-bit counters, refactoring the PMU init callbacks, support for new DT compatibles. - IPv6 header checksum optimisation. - Fixes: SDEI (software delegated exception interface) double-lock on hibernate with shared events. - Minor clean-ups and refactoring: cpu_ops accessor, cpu_do_switch_mm() converted to C, cpufeature finalisation helper. - sys_mremap() comment explaining the asymmetric address untagging behaviour" * tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (81 commits) mm/mremap: Add comment explaining the untagging behaviour of mremap() arm64: head: Convert install_el2_stub to SYM_INNER_LABEL arm64: Introduce get_cpu_ops() helper function arm64: Rename cpu_read_ops() to init_cpu_ops() arm64: Declare ACPI parking protocol CPU operation if needed arm64: move kimage_vaddr to .rodata arm64: use mov_q instead of literal ldr arm64: Kconfig: verify binutils support for ARM64_PTR_AUTH lkdtm: arm64: test kernel pointer authentication arm64: compile the kernel with ptrauth return address signing kconfig: Add support for 'as-option' arm64: suspend: restore the kernel ptrauth keys arm64: __show_regs: strip PAC from lr in printk arm64: unwind: strip PAC from kernel addresses arm64: mask PAC bits of __builtin_return_address arm64: initialize ptrauth keys for kernel booting task arm64: initialize and switch ptrauth kernel keys arm64: enable ptrauth earlier arm64: cpufeature: handle conflicts based on capability arm64: cpufeature: Move cpu capability helpers inside C file ...
- Loading branch information
Showing
88 changed files
with
2,192 additions
and
700 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
======================================================= | ||
Activity Monitors Unit (AMU) extension in AArch64 Linux | ||
======================================================= | ||
|
||
Author: Ionela Voinescu <[email protected]> | ||
|
||
Date: 2019-09-10 | ||
|
||
This document briefly describes the provision of Activity Monitors Unit | ||
support in AArch64 Linux. | ||
|
||
|
||
Architecture overview | ||
--------------------- | ||
|
||
The activity monitors extension is an optional extension introduced by the | ||
ARMv8.4 CPU architecture. | ||
|
||
The activity monitors unit, implemented in each CPU, provides performance | ||
counters intended for system management use. The AMU extension provides a | ||
system register interface to the counter registers and also supports an | ||
optional external memory-mapped interface. | ||
|
||
Version 1 of the Activity Monitors architecture implements a counter group | ||
of four fixed and architecturally defined 64-bit event counters. | ||
- CPU cycle counter: increments at the frequency of the CPU. | ||
- Constant counter: increments at the fixed frequency of the system | ||
clock. | ||
- Instructions retired: increments with every architecturally executed | ||
instruction. | ||
- Memory stall cycles: counts instruction dispatch stall cycles caused by | ||
misses in the last level cache within the clock domain. | ||
|
||
When in WFI or WFE these counters do not increment. | ||
|
||
The Activity Monitors architecture provides space for up to 16 architected | ||
event counters. Future versions of the architecture may use this space to | ||
implement additional architected event counters. | ||
|
||
Additionally, version 1 implements a counter group of up to 16 auxiliary | ||
64-bit event counters. | ||
|
||
On cold reset all counters reset to 0. | ||
|
||
|
||
Basic support | ||
------------- | ||
|
||
The kernel can safely run a mix of CPUs with and without support for the | ||
activity monitors extension. Therefore, when CONFIG_ARM64_AMU_EXTN is | ||
selected we unconditionally enable the capability to allow any late CPU | ||
(secondary or hotplugged) to detect and use the feature. | ||
|
||
When the feature is detected on a CPU, we flag the availability of the | ||
feature but this does not guarantee the correct functionality of the | ||
counters, only the presence of the extension. | ||
|
||
Firmware (code running at higher exception levels, e.g. arm-tf) support is | ||
needed to: | ||
- Enable access for lower exception levels (EL2 and EL1) to the AMU | ||
registers. | ||
- Enable the counters. If not enabled these will read as 0. | ||
- Save/restore the counters before/after the CPU is being put/brought up | ||
from the 'off' power state. | ||
|
||
When using kernels that have this feature enabled but boot with broken | ||
firmware the user may experience panics or lockups when accessing the | ||
counter registers. Even if these symptoms are not observed, the values | ||
returned by the register reads might not correctly reflect reality. Most | ||
commonly, the counters will read as 0, indicating that they are not | ||
enabled. | ||
|
||
If proper support is not provided in firmware it's best to disable | ||
CONFIG_ARM64_AMU_EXTN. To be noted that for security reasons, this does not | ||
bypass the setting of AMUSERENR_EL0 to trap accesses from EL0 (userspace) to | ||
EL1 (kernel). Therefore, firmware should still ensure accesses to AMU registers | ||
are not trapped in EL2/EL3. | ||
|
||
The fixed counters of AMUv1 are accessible though the following system | ||
register definitions: | ||
- SYS_AMEVCNTR0_CORE_EL0 | ||
- SYS_AMEVCNTR0_CONST_EL0 | ||
- SYS_AMEVCNTR0_INST_RET_EL0 | ||
- SYS_AMEVCNTR0_MEM_STALL_EL0 | ||
|
||
Auxiliary platform specific counters can be accessed using | ||
SYS_AMEVCNTR1_EL0(n), where n is a value between 0 and 15. | ||
|
||
Details can be found in: arch/arm64/include/asm/sysreg.h. | ||
|
||
|
||
Userspace access | ||
---------------- | ||
|
||
Currently, access from userspace to the AMU registers is disabled due to: | ||
- Security reasons: they might expose information about code executed in | ||
secure mode. | ||
- Purpose: AMU counters are intended for system management use. | ||
|
||
Also, the presence of the feature is not visible to userspace. | ||
|
||
|
||
Virtualization | ||
-------------- | ||
|
||
Currently, access from userspace (EL0) and kernelspace (EL1) on the KVM | ||
guest side is disabled due to: | ||
- Security reasons: they might expose information about code executed | ||
by other guests or the host. | ||
|
||
Any attempt to access the AMU registers will result in an UNDEFINED | ||
exception being injected into the guest. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,6 +6,7 @@ ARM64 Architecture | |
:maxdepth: 1 | ||
|
||
acpi_object_usage | ||
amu | ||
arm-acpi | ||
booting | ||
cpu-feature-registers | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.