mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 updates from Catalin Marinas:
"The major features are support for LPA2 (52-bit VA/PA with 4K and 16K
pages), the dpISA extension and Rust enabled on arm64. The changes are
mostly contained within the usual arch/arm64/, drivers/perf, the arm64
Documentation and kselftests. The exception is the Rust support which
touches some generic build files.
Summary:
- Reorganise the arm64 kernel VA space and add support for LPA2 (at
stage 1, KVM stage 2 was merged earlier) - 52-bit VA/PA address
range with 4KB and 16KB pages
- Enable Rust on arm64
- Support for the 2023 dpISA extensions (data processing ISA), host
only
- arm64 perf updates:
- StarFive's StarLink (integrates one or more CPU cores with a
shared L3 memory system) PMU support
- Enable HiSilicon Erratum 162700402 quirk for HIP09
- Several updates for the HiSilicon PCIe PMU driver
- Arm CoreSight PMU support
- Convert all drivers under drivers/perf/ to use .remove_new()
- Miscellaneous:
- Don't enable workarounds for "rare" errata by default
- Clean up the DAIF flags handling for EL0 returns (in preparation
for NMI support)
- Kselftest update for ptrace()
- Update some of the sysreg field definitions
- Slight improvement in the code generation for inline asm I/O
accessors to permit offset addressing
- kretprobes: acquire regs via a BRK exception (previously done
via a trampoline handler)
- SVE/SME cleanups, comment updates
- Allow CALL_OPS+CC_OPTIMIZE_FOR_SIZE with clang (previously
disabled due to gcc silently ignoring -falign-functions=N)"
* tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (134 commits)
Revert "mm: add arch hook to validate mmap() prot flags"
Revert "arm64: mm: add support for WXN memory translation attribute"
Revert "ARM64: Dynamically allocate cpumasks and increase supported CPUs to 512"
ARM64: Dynamically allocate cpumasks and increase supported CPUs to 512
kselftest/arm64: Add 2023 DPISA hwcap test coverage
kselftest/arm64: Add basic FPMR test
kselftest/arm64: Handle FPMR context in generic signal frame parser
arm64/hwcap: Define hwcaps for 2023 DPISA features
arm64/ptrace: Expose FPMR via ptrace
arm64/signal: Add FPMR signal handling
arm64/fpsimd: Support FEAT_FPMR
arm64/fpsimd: Enable host kernel access to FPMR
arm64/cpufeature: Hook new identification registers up to cpufeature
docs: perf: Fix build warning of hisi-pcie-pmu.rst
perf: starfive: Only allow COMPILE_TEST for 64-bit architectures
MAINTAINERS: Add entry for StarFive StarLink PMU
docs: perf: Add description for StarFive's StarLink PMU
dt-bindings: perf: starfive: Add JH8100 StarLink PMU
perf: starfive: Add StarLink PMU support
docs: perf: Update usage for target filter of hisi-pcie-pmu
...
This commit is contained in:
@@ -37,9 +37,21 @@ Example usage of perf::
|
||||
hisi_pcie0_core0/rx_mwr_cnt/ [kernel PMU event]
|
||||
------------------------------------------
|
||||
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mwr_latency/
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mwr_cnt/
|
||||
$# perf stat -g -e hisi_pcie0_core0/rx_mwr_latency/ -e hisi_pcie0_core0/rx_mwr_cnt/
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mwr_latency,port=0xffff/
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/
|
||||
|
||||
The related events usually used to calculate the bandwidth, latency or others.
|
||||
They need to start and end counting at the same time, therefore related events
|
||||
are best used in the same event group to get the expected value. There are two
|
||||
ways to know if they are related events:
|
||||
|
||||
a) By event name, such as the latency events "xxx_latency, xxx_cnt" or
|
||||
bandwidth events "xxx_flux, xxx_time".
|
||||
b) By event type, such as "event=0xXXXX, event=0x1XXXX".
|
||||
|
||||
Example usage of perf group::
|
||||
|
||||
$# perf stat -e "{hisi_pcie0_core0/rx_mwr_latency,port=0xffff/,hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/}"
|
||||
|
||||
The current driver does not support sampling. So "perf record" is unsupported.
|
||||
Also attach to a task is unsupported for PCIe PMU.
|
||||
@@ -51,8 +63,12 @@ Filter options
|
||||
|
||||
PMU could only monitor the performance of traffic downstream target Root
|
||||
Ports or downstream target Endpoint. PCIe PMU driver support "port" and
|
||||
"bdf" interfaces for users, and these two interfaces aren't supported at the
|
||||
same time.
|
||||
"bdf" interfaces for users.
|
||||
Please notice that, one of these two interfaces must be set, and these two
|
||||
interfaces aren't supported at the same time. If they are both set, only
|
||||
"port" filter is valid.
|
||||
If "port" filter not being set or is set explicitly to zero (default), the
|
||||
"bdf" filter will be in effect, because "bdf=0" meaning 0000:000:00.0.
|
||||
|
||||
- port
|
||||
|
||||
@@ -95,7 +111,7 @@ Filter options
|
||||
|
||||
Example usage of perf::
|
||||
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,trig_len=0x4,trig_mode=1/ sleep 5
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,trig_len=0x4,trig_mode=1/ sleep 5
|
||||
|
||||
3. Threshold filter
|
||||
|
||||
@@ -109,7 +125,7 @@ Filter options
|
||||
|
||||
Example usage of perf::
|
||||
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,thr_len=0x4,thr_mode=1/ sleep 5
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,thr_len=0x4,thr_mode=1/ sleep 5
|
||||
|
||||
4. TLP Length filter
|
||||
|
||||
@@ -127,4 +143,4 @@ Filter options
|
||||
|
||||
Example usage of perf::
|
||||
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,len_mode=0x1/ sleep 5
|
||||
$# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,len_mode=0x1/ sleep 5
|
||||
|
||||
@@ -13,6 +13,7 @@ Performance monitor support
|
||||
imx-ddr
|
||||
qcom_l2_pmu
|
||||
qcom_l3_pmu
|
||||
starfive_starlink_pmu
|
||||
arm-ccn
|
||||
arm-cmn
|
||||
xgene-pmu
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
================================================
|
||||
StarFive StarLink Performance Monitor Unit (PMU)
|
||||
================================================
|
||||
|
||||
StarFive StarLink Performance Monitor Unit (PMU) exists within the
|
||||
StarLink Coherent Network on Chip (CNoC) that connects multiple CPU
|
||||
clusters with an L3 memory system.
|
||||
|
||||
The uncore PMU supports overflow interrupt, up to 16 programmable 64bit
|
||||
event counters, and an independent 64bit cycle counter.
|
||||
The PMU can only be accessed via Memory Mapped I/O and are common to the
|
||||
cores connected to the same PMU.
|
||||
|
||||
Driver exposes supported PMU events in sysfs "events" directory under::
|
||||
|
||||
/sys/bus/event_source/devices/starfive_starlink_pmu/events/
|
||||
|
||||
Driver exposes cpu used to handle PMU events in sysfs "cpumask" directory
|
||||
under::
|
||||
|
||||
/sys/bus/event_source/devices/starfive_starlink_pmu/cpumask/
|
||||
|
||||
Driver describes the format of config (event ID) in sysfs "format" directory
|
||||
under::
|
||||
|
||||
/sys/bus/event_source/devices/starfive_starlink_pmu/format/
|
||||
|
||||
Example of perf usage::
|
||||
|
||||
$ perf list
|
||||
|
||||
starfive_starlink_pmu/cycles/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/read_hit/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/read_miss/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/read_request/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/release_request/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/write_hit/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/write_miss/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/write_request/ [Kernel PMU event]
|
||||
starfive_starlink_pmu/writeback/ [Kernel PMU event]
|
||||
|
||||
|
||||
$ perf stat -a -e /starfive_starlink_pmu/cycles/ sleep 1
|
||||
|
||||
Sampling is not supported. As a result, "perf record" is not supported.
|
||||
Attaching to a task is not supported, only system-wide counting is supported.
|
||||
@@ -317,6 +317,55 @@ HWCAP2_LRCPC3
|
||||
HWCAP2_LSE128
|
||||
Functionality implied by ID_AA64ISAR0_EL1.Atomic == 0b0011.
|
||||
|
||||
HWCAP2_FPMR
|
||||
Functionality implied by ID_AA64PFR2_EL1.FMR == 0b0001.
|
||||
|
||||
HWCAP2_LUT
|
||||
Functionality implied by ID_AA64ISAR2_EL1.LUT == 0b0001.
|
||||
|
||||
HWCAP2_FAMINMAX
|
||||
Functionality implied by ID_AA64ISAR3_EL1.FAMINMAX == 0b0001.
|
||||
|
||||
HWCAP2_F8CVT
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8CVT == 0b1.
|
||||
|
||||
HWCAP2_F8FMA
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8FMA == 0b1.
|
||||
|
||||
HWCAP2_F8DP4
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8DP4 == 0b1.
|
||||
|
||||
HWCAP2_F8DP2
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8DP2 == 0b1.
|
||||
|
||||
HWCAP2_F8E4M3
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8E4M3 == 0b1.
|
||||
|
||||
HWCAP2_F8E5M2
|
||||
Functionality implied by ID_AA64FPFR0_EL1.F8E5M2 == 0b1.
|
||||
|
||||
HWCAP2_SME_LUTV2
|
||||
Functionality implied by ID_AA64SMFR0_EL1.LUTv2 == 0b1.
|
||||
|
||||
HWCAP2_SME_F8F16
|
||||
Functionality implied by ID_AA64SMFR0_EL1.F8F16 == 0b1.
|
||||
|
||||
HWCAP2_SME_F8F32
|
||||
Functionality implied by ID_AA64SMFR0_EL1.F8F32 == 0b1.
|
||||
|
||||
HWCAP2_SME_SF8FMA
|
||||
Functionality implied by ID_AA64SMFR0_EL1.SF8FMA == 0b1.
|
||||
|
||||
HWCAP2_SME_SF8DP4
|
||||
Functionality implied by ID_AA64SMFR0_EL1.SF8DP4 == 0b1.
|
||||
|
||||
HWCAP2_SME_SF8DP2
|
||||
Functionality implied by ID_AA64SMFR0_EL1.SF8DP2 == 0b1.
|
||||
|
||||
HWCAP2_SME_SF8DP4
|
||||
Functionality implied by ID_AA64SMFR0_EL1.SF8DP4 == 0b1.
|
||||
|
||||
|
||||
4. Unused AT_HWCAP bits
|
||||
-----------------------
|
||||
|
||||
|
||||
@@ -35,8 +35,9 @@ can be triggered by Linux).
|
||||
For software workarounds that may adversely impact systems unaffected by
|
||||
the erratum in question, a Kconfig entry is added under "Kernel
|
||||
Features" -> "ARM errata workarounds via the alternatives framework".
|
||||
These are enabled by default and patched in at runtime when an affected
|
||||
CPU is detected. For less-intrusive workarounds, a Kconfig option is not
|
||||
With the exception of workarounds for errata deemed "rare" by Arm, these
|
||||
are enabled by default and patched in at runtime when an affected CPU is
|
||||
detected. For less-intrusive workarounds, a Kconfig option is not
|
||||
available and the code is structured (preferably with a comment) in such
|
||||
a way that the erratum will not be hit.
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ model features for SME is included in Appendix A.
|
||||
2. Vector lengths
|
||||
------------------
|
||||
|
||||
SME defines a second vector length similar to the SVE vector length which is
|
||||
SME defines a second vector length similar to the SVE vector length which
|
||||
controls the size of the streaming mode SVE vectors and the ZA matrix array.
|
||||
The ZA matrix is square with each side having as many bytes as a streaming
|
||||
mode SVE vector.
|
||||
@@ -238,12 +238,12 @@ prctl(PR_SME_SET_VL, unsigned long arg)
|
||||
bits of Z0..Z31 except for Z0 bits [127:0] .. Z31 bits [127:0] to become
|
||||
unspecified, including both streaming and non-streaming SVE state.
|
||||
Calling PR_SME_SET_VL with vl equal to the thread's current vector
|
||||
length, or calling PR_SME_SET_VL with the PR_SVE_SET_VL_ONEXEC flag,
|
||||
length, or calling PR_SME_SET_VL with the PR_SME_SET_VL_ONEXEC flag,
|
||||
does not constitute a change to the vector length for this purpose.
|
||||
|
||||
* Changing the vector length causes PSTATE.ZA and PSTATE.SM to be cleared.
|
||||
Calling PR_SME_SET_VL with vl equal to the thread's current vector
|
||||
length, or calling PR_SME_SET_VL with the PR_SVE_SET_VL_ONEXEC flag,
|
||||
length, or calling PR_SME_SET_VL with the PR_SME_SET_VL_ONEXEC flag,
|
||||
does not constitute a change to the vector length for this purpose.
|
||||
|
||||
|
||||
@@ -379,9 +379,8 @@ The regset data starts with struct user_za_header, containing:
|
||||
/proc/sys/abi/sme_default_vector_length
|
||||
|
||||
Writing the text representation of an integer to this file sets the system
|
||||
default vector length to the specified value, unless the value is greater
|
||||
than the maximum vector length supported by the system in which case the
|
||||
default vector length is set to that maximum.
|
||||
default vector length to the specified value rounded to a supported value
|
||||
using the same rules as for setting vector length via PR_SME_SET_VL.
|
||||
|
||||
The result can be determined by reopening the file and reading its
|
||||
contents.
|
||||
|
||||
@@ -117,11 +117,6 @@ the SVE instruction set architecture.
|
||||
* The SVE registers are not used to pass arguments to or receive results from
|
||||
any syscall.
|
||||
|
||||
* In practice the affected registers/bits will be preserved or will be replaced
|
||||
with zeros on return from a syscall, but userspace should not make
|
||||
assumptions about this. The kernel behaviour may vary on a case-by-case
|
||||
basis.
|
||||
|
||||
* All other SVE state of a thread, including the currently configured vector
|
||||
length, the state of the PR_SVE_VL_INHERIT flag, and the deferred vector
|
||||
length (if any), is preserved across all syscalls, subject to the specific
|
||||
@@ -428,9 +423,8 @@ The regset data starts with struct user_sve_header, containing:
|
||||
/proc/sys/abi/sve_default_vector_length
|
||||
|
||||
Writing the text representation of an integer to this file sets the system
|
||||
default vector length to the specified value, unless the value is greater
|
||||
than the maximum vector length supported by the system in which case the
|
||||
default vector length is set to that maximum.
|
||||
default vector length to the specified value rounded to a supported value
|
||||
using the same rules as for setting vector length via PR_SVE_SET_VL.
|
||||
|
||||
The result can be determined by reopening the file and reading its
|
||||
contents.
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/perf/arm,coresight-pmu.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Arm Coresight Performance Monitoring Unit Architecture
|
||||
|
||||
maintainers:
|
||||
- Robin Murphy <robin.murphy@arm.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: arm,coresight-pmu
|
||||
|
||||
reg:
|
||||
items:
|
||||
- description: Register page 0
|
||||
- description: Register page 1, if the PMU implements the dual-page extension
|
||||
minItems: 1
|
||||
|
||||
interrupts:
|
||||
items:
|
||||
- description: Overflow interrupt
|
||||
|
||||
cpus:
|
||||
description: If the PMU is associated with a particular CPU or subset of CPUs,
|
||||
array of phandles to the appropriate CPU node(s)
|
||||
|
||||
reg-io-width:
|
||||
description: Granularity at which PMU register accesses are single-copy atomic
|
||||
default: 4
|
||||
enum: [4, 8]
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
@@ -0,0 +1,46 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/perf/starfive,jh8100-starlink-pmu.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: StarFive JH8100 StarLink PMU
|
||||
|
||||
maintainers:
|
||||
- Ji Sheng Teoh <jisheng.teoh@starfivetech.com>
|
||||
|
||||
description:
|
||||
StarFive's JH8100 StarLink PMU integrates one or more CPU cores with a
|
||||
shared L3 memory system. The PMU support overflow interrupt, up to
|
||||
16 programmable 64bit event counters, and an independent 64bit cycle
|
||||
counter. StarFive's JH8100 StarLink PMU is accessed via MMIO.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: starfive,jh8100-starlink-pmu
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
pmu@12900000 {
|
||||
compatible = "starfive,jh8100-starlink-pmu";
|
||||
reg = <0x0 0x12900000 0x0 0x10000>;
|
||||
interrupts = <34>;
|
||||
};
|
||||
};
|
||||
@@ -15,6 +15,7 @@ support corresponds to ``S`` values in the ``MAINTAINERS`` file.
|
||||
============= ================ ==============================================
|
||||
Architecture Level of support Constraints
|
||||
============= ================ ==============================================
|
||||
``arm64`` Maintained Little Endian only.
|
||||
``loongarch`` Maintained -
|
||||
``um`` Maintained ``x86_64`` only.
|
||||
``x86`` Maintained ``x86_64`` only.
|
||||
|
||||
@@ -20974,6 +20974,13 @@ S: Maintained
|
||||
T: git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
|
||||
F: Documentation/devicetree/bindings/soc/starfive/
|
||||
|
||||
STARFIVE STARLINK PMU DRIVER
|
||||
M: Ji Sheng Teoh <jisheng.teoh@starfivetech.com>
|
||||
S: Maintained
|
||||
F: Documentation/admin-guide/perf/starfive_starlink_pmu.rst
|
||||
F: Documentation/devicetree/bindings/perf/starfive,jh8100-starlink-pmu.yaml
|
||||
F: drivers/perf/starfive_starlink_pmu.c
|
||||
|
||||
STARFIVE TRNG DRIVER
|
||||
M: Jia Jie Ho <jiajie.ho@starfivetech.com>
|
||||
S: Supported
|
||||
|
||||
@@ -561,7 +561,6 @@ KBUILD_CFLAGS += -fno-strict-aliasing
|
||||
|
||||
KBUILD_CPPFLAGS := -D__KERNEL__
|
||||
KBUILD_RUSTFLAGS := $(rust_common_flags) \
|
||||
--target=$(objtree)/scripts/target.json \
|
||||
-Cpanic=abort -Cembed-bitcode=n -Clto=n \
|
||||
-Cforce-unwind-tables=n -Ccodegen-units=1 \
|
||||
-Csymbol-mangling-version=v0 \
|
||||
|
||||
+29
-26
@@ -164,7 +164,7 @@ config ARM64
|
||||
select HAVE_ARCH_HUGE_VMAP
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
||||
select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48)
|
||||
select HAVE_ARCH_KASAN
|
||||
select HAVE_ARCH_KASAN_VMALLOC if HAVE_ARCH_KASAN
|
||||
select HAVE_ARCH_KASAN_SW_TAGS if HAVE_ARCH_KASAN
|
||||
select HAVE_ARCH_KASAN_HW_TAGS if (HAVE_ARCH_KASAN && ARM64_MTE)
|
||||
@@ -198,7 +198,7 @@ config ARM64
|
||||
if DYNAMIC_FTRACE_WITH_ARGS && DYNAMIC_FTRACE_WITH_CALL_OPS
|
||||
select HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS \
|
||||
if (DYNAMIC_FTRACE_WITH_ARGS && !CFI_CLANG && \
|
||||
!CC_OPTIMIZE_FOR_SIZE)
|
||||
(CC_IS_CLANG || !CC_OPTIMIZE_FOR_SIZE))
|
||||
select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY \
|
||||
if DYNAMIC_FTRACE_WITH_ARGS
|
||||
select HAVE_SAMPLE_FTRACE_DIRECT
|
||||
@@ -229,6 +229,7 @@ config ARM64
|
||||
select HAVE_FUNCTION_ARG_ACCESS_API
|
||||
select MMU_GATHER_RCU_TABLE_FREE
|
||||
select HAVE_RSEQ
|
||||
select HAVE_RUST if CPU_LITTLE_ENDIAN
|
||||
select HAVE_STACKPROTECTOR
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_KPROBES
|
||||
@@ -362,7 +363,9 @@ config PGTABLE_LEVELS
|
||||
default 3 if ARM64_64K_PAGES && (ARM64_VA_BITS_48 || ARM64_VA_BITS_52)
|
||||
default 3 if ARM64_4K_PAGES && ARM64_VA_BITS_39
|
||||
default 3 if ARM64_16K_PAGES && ARM64_VA_BITS_47
|
||||
default 4 if ARM64_16K_PAGES && (ARM64_VA_BITS_48 || ARM64_VA_BITS_52)
|
||||
default 4 if !ARM64_64K_PAGES && ARM64_VA_BITS_48
|
||||
default 5 if ARM64_4K_PAGES && ARM64_VA_BITS_52
|
||||
|
||||
config ARCH_SUPPORTS_UPROBES
|
||||
def_bool y
|
||||
@@ -390,13 +393,13 @@ config BUILTIN_RETURN_ADDRESS_STRIPS_PAC
|
||||
config KASAN_SHADOW_OFFSET
|
||||
hex
|
||||
depends on KASAN_GENERIC || KASAN_SW_TAGS
|
||||
default 0xdfff800000000000 if (ARM64_VA_BITS_48 || ARM64_VA_BITS_52) && !KASAN_SW_TAGS
|
||||
default 0xdfffc00000000000 if ARM64_VA_BITS_47 && !KASAN_SW_TAGS
|
||||
default 0xdfff800000000000 if (ARM64_VA_BITS_48 || (ARM64_VA_BITS_52 && !ARM64_16K_PAGES)) && !KASAN_SW_TAGS
|
||||
default 0xdfffc00000000000 if (ARM64_VA_BITS_47 || ARM64_VA_BITS_52) && ARM64_16K_PAGES && !KASAN_SW_TAGS
|
||||
default 0xdffffe0000000000 if ARM64_VA_BITS_42 && !KASAN_SW_TAGS
|
||||
default 0xdfffffc000000000 if ARM64_VA_BITS_39 && !KASAN_SW_TAGS
|
||||
default 0xdffffff800000000 if ARM64_VA_BITS_36 && !KASAN_SW_TAGS
|
||||
default 0xefff800000000000 if (ARM64_VA_BITS_48 || ARM64_VA_BITS_52) && KASAN_SW_TAGS
|
||||
default 0xefffc00000000000 if ARM64_VA_BITS_47 && KASAN_SW_TAGS
|
||||
default 0xefff800000000000 if (ARM64_VA_BITS_48 || (ARM64_VA_BITS_52 && !ARM64_16K_PAGES)) && KASAN_SW_TAGS
|
||||
default 0xefffc00000000000 if (ARM64_VA_BITS_47 || ARM64_VA_BITS_52) && ARM64_16K_PAGES && KASAN_SW_TAGS
|
||||
default 0xeffffe0000000000 if ARM64_VA_BITS_42 && KASAN_SW_TAGS
|
||||
default 0xefffffc000000000 if ARM64_VA_BITS_39 && KASAN_SW_TAGS
|
||||
default 0xeffffff800000000 if ARM64_VA_BITS_36 && KASAN_SW_TAGS
|
||||
@@ -541,9 +544,8 @@ config ARM64_ERRATUM_832075
|
||||
If unsure, say Y.
|
||||
|
||||
config ARM64_ERRATUM_834220
|
||||
bool "Cortex-A57: 834220: Stage 2 translation fault might be incorrectly reported in presence of a Stage 1 fault"
|
||||
bool "Cortex-A57: 834220: Stage 2 translation fault might be incorrectly reported in presence of a Stage 1 fault (rare)"
|
||||
depends on KVM
|
||||
default y
|
||||
help
|
||||
This option adds an alternative code sequence to work around ARM
|
||||
erratum 834220 on Cortex-A57 parts up to r1p2.
|
||||
@@ -559,7 +561,7 @@ config ARM64_ERRATUM_834220
|
||||
as it depends on the alternative framework, which will only patch
|
||||
the kernel if an affected CPU is detected.
|
||||
|
||||
If unsure, say Y.
|
||||
If unsure, say N.
|
||||
|
||||
config ARM64_ERRATUM_1742098
|
||||
bool "Cortex-A57/A72: 1742098: ELR recorded incorrectly on interrupt taken between cryptographic instructions in a sequence"
|
||||
@@ -686,8 +688,7 @@ config ARM64_WORKAROUND_REPEAT_TLBI
|
||||
bool
|
||||
|
||||
config ARM64_ERRATUM_2441007
|
||||
bool "Cortex-A55: Completion of affected memory accesses might not be guaranteed by completion of a TLBI"
|
||||
default y
|
||||
bool "Cortex-A55: Completion of affected memory accesses might not be guaranteed by completion of a TLBI (rare)"
|
||||
select ARM64_WORKAROUND_REPEAT_TLBI
|
||||
help
|
||||
This option adds a workaround for ARM Cortex-A55 erratum #2441007.
|
||||
@@ -700,11 +701,10 @@ config ARM64_ERRATUM_2441007
|
||||
Work around this by adding the affected CPUs to the list that needs
|
||||
TLB sequences to be done twice.
|
||||
|
||||
If unsure, say Y.
|
||||
If unsure, say N.
|
||||
|
||||
config ARM64_ERRATUM_1286807
|
||||
bool "Cortex-A76: Modification of the translation table for a virtual address might lead to read-after-read ordering violation"
|
||||
default y
|
||||
bool "Cortex-A76: Modification of the translation table for a virtual address might lead to read-after-read ordering violation (rare)"
|
||||
select ARM64_WORKAROUND_REPEAT_TLBI
|
||||
help
|
||||
This option adds a workaround for ARM Cortex-A76 erratum 1286807.
|
||||
@@ -718,6 +718,8 @@ config ARM64_ERRATUM_1286807
|
||||
invalidated has been observed by other observers. The
|
||||
workaround repeats the TLBI+DSB operation.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config ARM64_ERRATUM_1463225
|
||||
bool "Cortex-A76: Software Step might prevent interrupt recognition"
|
||||
default y
|
||||
@@ -737,8 +739,7 @@ config ARM64_ERRATUM_1463225
|
||||
If unsure, say Y.
|
||||
|
||||
config ARM64_ERRATUM_1542419
|
||||
bool "Neoverse-N1: workaround mis-ordering of instruction fetches"
|
||||
default y
|
||||
bool "Neoverse-N1: workaround mis-ordering of instruction fetches (rare)"
|
||||
help
|
||||
This option adds a workaround for ARM Neoverse-N1 erratum
|
||||
1542419.
|
||||
@@ -750,7 +751,7 @@ config ARM64_ERRATUM_1542419
|
||||
Workaround the issue by hiding the DIC feature from EL0. This
|
||||
forces user-space to perform cache maintenance.
|
||||
|
||||
If unsure, say Y.
|
||||
If unsure, say N.
|
||||
|
||||
config ARM64_ERRATUM_1508412
|
||||
bool "Cortex-A77: 1508412: workaround deadlock on sequence of NC/Device load and store exclusive or PAR read"
|
||||
@@ -925,8 +926,7 @@ config ARM64_ERRATUM_2224489
|
||||
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
|
||||
bool "Cortex-A510: Completion of affected memory accesses might not be guaranteed by completion of a TLBI (rare)"
|
||||
select ARM64_WORKAROUND_REPEAT_TLBI
|
||||
help
|
||||
This option adds a workaround for ARM Cortex-A510 erratum #2441009.
|
||||
@@ -939,7 +939,7 @@ config ARM64_ERRATUM_2441009
|
||||
Work around this by adding the affected CPUs to the list that needs
|
||||
TLB sequences to be done twice.
|
||||
|
||||
If unsure, say Y.
|
||||
If unsure, say N.
|
||||
|
||||
config ARM64_ERRATUM_2064142
|
||||
bool "Cortex-A510: 2064142: workaround TRBE register writes while disabled"
|
||||
@@ -1278,9 +1278,7 @@ endchoice
|
||||
|
||||
choice
|
||||
prompt "Virtual address space size"
|
||||
default ARM64_VA_BITS_39 if ARM64_4K_PAGES
|
||||
default ARM64_VA_BITS_47 if ARM64_16K_PAGES
|
||||
default ARM64_VA_BITS_42 if ARM64_64K_PAGES
|
||||
default ARM64_VA_BITS_52
|
||||
help
|
||||
Allows choosing one of multiple possible virtual address
|
||||
space sizes. The level of translation table is determined by
|
||||
@@ -1307,7 +1305,7 @@ config ARM64_VA_BITS_48
|
||||
|
||||
config ARM64_VA_BITS_52
|
||||
bool "52-bit"
|
||||
depends on ARM64_64K_PAGES && (ARM64_PAN || !ARM64_SW_TTBR0_PAN)
|
||||
depends on ARM64_PAN || !ARM64_SW_TTBR0_PAN
|
||||
help
|
||||
Enable 52-bit virtual addressing for userspace when explicitly
|
||||
requested via a hint to mmap(). The kernel will also use 52-bit
|
||||
@@ -1354,10 +1352,11 @@ choice
|
||||
|
||||
config ARM64_PA_BITS_48
|
||||
bool "48-bit"
|
||||
depends on ARM64_64K_PAGES || !ARM64_VA_BITS_52
|
||||
|
||||
config ARM64_PA_BITS_52
|
||||
bool "52-bit (ARMv8.2)"
|
||||
depends on ARM64_64K_PAGES
|
||||
bool "52-bit"
|
||||
depends on ARM64_64K_PAGES || ARM64_VA_BITS_52
|
||||
depends on ARM64_PAN || !ARM64_SW_TTBR0_PAN
|
||||
help
|
||||
Enable support for a 52-bit physical address space, introduced as
|
||||
@@ -1374,6 +1373,10 @@ config ARM64_PA_BITS
|
||||
default 48 if ARM64_PA_BITS_48
|
||||
default 52 if ARM64_PA_BITS_52
|
||||
|
||||
config ARM64_LPA2
|
||||
def_bool y
|
||||
depends on ARM64_PA_BITS_52 && !ARM64_64K_PAGES
|
||||
|
||||
choice
|
||||
prompt "Endianness"
|
||||
default CPU_LITTLE_ENDIAN
|
||||
|
||||
@@ -41,6 +41,8 @@ KBUILD_CFLAGS += -mgeneral-regs-only \
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, psabi)
|
||||
KBUILD_AFLAGS += $(compat_vdso)
|
||||
|
||||
KBUILD_RUSTFLAGS += --target=aarch64-unknown-none -Ctarget-feature="-neon"
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-option,-mabi=lp64)
|
||||
KBUILD_AFLAGS += $(call cc-option,-mabi=lp64)
|
||||
|
||||
@@ -65,7 +67,9 @@ endif
|
||||
|
||||
ifeq ($(CONFIG_ARM64_BTI_KERNEL),y)
|
||||
KBUILD_CFLAGS += -mbranch-protection=pac-ret+bti
|
||||
KBUILD_RUSTFLAGS += -Zbranch-protection=bti,pac-ret
|
||||
else ifeq ($(CONFIG_ARM64_PTR_AUTH_KERNEL),y)
|
||||
KBUILD_RUSTFLAGS += -Zbranch-protection=pac-ret
|
||||
ifeq ($(CONFIG_CC_HAS_BRANCH_PROT_PAC_RET),y)
|
||||
KBUILD_CFLAGS += -mbranch-protection=pac-ret
|
||||
else
|
||||
|
||||
@@ -76,7 +76,6 @@ CONFIG_ARCH_VEXPRESS=y
|
||||
CONFIG_ARCH_VISCONTI=y
|
||||
CONFIG_ARCH_XGENE=y
|
||||
CONFIG_ARCH_ZYNQMP=y
|
||||
CONFIG_ARM64_VA_BITS_48=y
|
||||
CONFIG_SCHED_MC=y
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_NUMA=y
|
||||
|
||||
@@ -129,6 +129,4 @@ static inline bool __init __early_cpu_has_rndr(void)
|
||||
return (ftr >> ID_AA64ISAR0_EL1_RNDR_SHIFT) & 0xf;
|
||||
}
|
||||
|
||||
u64 kaslr_early_init(void *fdt);
|
||||
|
||||
#endif /* _ASM_ARCHRANDOM_H */
|
||||
|
||||
@@ -38,10 +38,6 @@
|
||||
msr daifset, #0xf
|
||||
.endm
|
||||
|
||||
.macro enable_daif
|
||||
msr daifclr, #0xf
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Save/restore interrupts.
|
||||
*/
|
||||
@@ -345,20 +341,6 @@ alternative_cb_end
|
||||
bfi \valreg, \t1sz, #TCR_T1SZ_OFFSET, #TCR_TxSZ_WIDTH
|
||||
.endm
|
||||
|
||||
/*
|
||||
* idmap_get_t0sz - get the T0SZ value needed to cover the ID map
|
||||
*
|
||||
* Calculate the maximum allowed value for TCR_EL1.T0SZ so that the
|
||||
* entire ID map region can be mapped. As T0SZ == (64 - #bits used),
|
||||
* this number conveniently equals the number of leading zeroes in
|
||||
* the physical address of _end.
|
||||
*/
|
||||
.macro idmap_get_t0sz, reg
|
||||
adrp \reg, _end
|
||||
orr \reg, \reg, #(1 << VA_BITS_MIN) - 1
|
||||
clz \reg, \reg
|
||||
.endm
|
||||
|
||||
/*
|
||||
* tcr_compute_pa_size - set TCR.(I)PS to the highest supported
|
||||
* ID_AA64MMFR0_EL1.PARange value
|
||||
@@ -590,18 +572,27 @@ alternative_endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Offset ttbr1 to allow for 48-bit kernel VAs set with 52-bit PTRS_PER_PGD.
|
||||
* If the kernel is built for 52-bit virtual addressing but the hardware only
|
||||
* supports 48 bits, we cannot program the pgdir address into TTBR1 directly,
|
||||
* but we have to add an offset so that the TTBR1 address corresponds with the
|
||||
* pgdir entry that covers the lowest 48-bit addressable VA.
|
||||
*
|
||||
* Note that this trick is only used for LVA/64k pages - LPA2/4k pages uses an
|
||||
* additional paging level, and on LPA2/16k pages, we would end up with a root
|
||||
* level table with only 2 entries, which is suboptimal in terms of TLB
|
||||
* utilization, so there we fall back to 47 bits of translation if LPA2 is not
|
||||
* supported.
|
||||
*
|
||||
* orr is used as it can cover the immediate value (and is idempotent).
|
||||
* In future this may be nop'ed out when dealing with 52-bit kernel VAs.
|
||||
* ttbr: Value of ttbr to set, modified.
|
||||
*/
|
||||
.macro offset_ttbr1, ttbr, tmp
|
||||
#ifdef CONFIG_ARM64_VA_BITS_52
|
||||
mrs_s \tmp, SYS_ID_AA64MMFR2_EL1
|
||||
and \tmp, \tmp, #(0xf << ID_AA64MMFR2_EL1_VARange_SHIFT)
|
||||
cbnz \tmp, .Lskipoffs_\@
|
||||
orr \ttbr, \ttbr, #TTBR1_BADDR_4852_OFFSET
|
||||
.Lskipoffs_\@ :
|
||||
#if defined(CONFIG_ARM64_VA_BITS_52) && !defined(CONFIG_ARM64_LPA2)
|
||||
mrs \tmp, tcr_el1
|
||||
and \tmp, \tmp, #TCR_T1SZ_MASK
|
||||
cmp \tmp, #TCR_T1SZ(VA_BITS_MIN)
|
||||
orr \tmp, \ttbr, #TTBR1_BADDR_4852_OFFSET
|
||||
csel \ttbr, \tmp, \ttbr, eq
|
||||
#endif
|
||||
.endm
|
||||
|
||||
@@ -623,25 +614,13 @@ alternative_endif
|
||||
|
||||
.macro phys_to_pte, pte, phys
|
||||
#ifdef CONFIG_ARM64_PA_BITS_52
|
||||
/*
|
||||
* We assume \phys is 64K aligned and this is guaranteed by only
|
||||
* supporting this configuration with 64K pages.
|
||||
*/
|
||||
orr \pte, \phys, \phys, lsr #36
|
||||
and \pte, \pte, #PTE_ADDR_MASK
|
||||
orr \pte, \phys, \phys, lsr #PTE_ADDR_HIGH_SHIFT
|
||||
and \pte, \pte, #PHYS_TO_PTE_ADDR_MASK
|
||||
#else
|
||||
mov \pte, \phys
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.macro pte_to_phys, phys, pte
|
||||
and \phys, \pte, #PTE_ADDR_MASK
|
||||
#ifdef CONFIG_ARM64_PA_BITS_52
|
||||
orr \phys, \phys, \phys, lsl #PTE_ADDR_HIGH_SHIFT
|
||||
and \phys, \phys, GENMASK_ULL(PHYS_MASK_SHIFT - 1, PAGE_SHIFT)
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* tcr_clear_errata_bits - Clear TCR bits that trigger an errata on this CPU.
|
||||
*/
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
* 0x004: for installing kprobes
|
||||
* 0x005: for installing uprobes
|
||||
* 0x006: for kprobe software single-step
|
||||
* 0x007: for kretprobe return
|
||||
* Allowed values for kgdb are 0x400 - 0x7ff
|
||||
* 0x100: for triggering a fault on purpose (reserved)
|
||||
* 0x400: for dynamic BRK instruction
|
||||
@@ -23,6 +24,7 @@
|
||||
#define KPROBES_BRK_IMM 0x004
|
||||
#define UPROBES_BRK_IMM 0x005
|
||||
#define KPROBES_BRK_SS_IMM 0x006
|
||||
#define KRETPROBES_BRK_IMM 0x007
|
||||
#define FAULT_BRK_IMM 0x100
|
||||
#define KGDB_DYN_DBG_BRK_IMM 0x400
|
||||
#define KGDB_COMPILED_DBG_BRK_IMM 0x401
|
||||
|
||||
@@ -52,14 +52,17 @@ struct cpuinfo_arm64 {
|
||||
u64 reg_id_aa64isar0;
|
||||
u64 reg_id_aa64isar1;
|
||||
u64 reg_id_aa64isar2;
|
||||
u64 reg_id_aa64isar3;
|
||||
u64 reg_id_aa64mmfr0;
|
||||
u64 reg_id_aa64mmfr1;
|
||||
u64 reg_id_aa64mmfr2;
|
||||
u64 reg_id_aa64mmfr3;
|
||||
u64 reg_id_aa64pfr0;
|
||||
u64 reg_id_aa64pfr1;
|
||||
u64 reg_id_aa64pfr2;
|
||||
u64 reg_id_aa64zfr0;
|
||||
u64 reg_id_aa64smfr0;
|
||||
u64 reg_id_aa64fpfr0;
|
||||
|
||||
struct cpuinfo_32bit aarch32;
|
||||
};
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
#define ARM64_SW_FEATURE_OVERRIDE_NOKASLR 0
|
||||
#define ARM64_SW_FEATURE_OVERRIDE_HVHE 4
|
||||
#define ARM64_SW_FEATURE_OVERRIDE_RODATA_OFF 8
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
@@ -768,6 +769,11 @@ static __always_inline bool system_supports_tpidr2(void)
|
||||
return system_supports_sme();
|
||||
}
|
||||
|
||||
static __always_inline bool system_supports_fpmr(void)
|
||||
{
|
||||
return alternative_has_cap_unlikely(ARM64_HAS_FPMR);
|
||||
}
|
||||
|
||||
static __always_inline bool system_supports_cnp(void)
|
||||
{
|
||||
return alternative_has_cap_unlikely(ARM64_HAS_CNP);
|
||||
@@ -905,7 +911,9 @@ static inline unsigned int get_vmid_bits(u64 mmfr1)
|
||||
s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new, s64 cur);
|
||||
struct arm64_ftr_reg *get_arm64_ftr_reg(u32 sys_id);
|
||||
|
||||
extern struct arm64_ftr_override id_aa64mmfr0_override;
|
||||
extern struct arm64_ftr_override id_aa64mmfr1_override;
|
||||
extern struct arm64_ftr_override id_aa64mmfr2_override;
|
||||
extern struct arm64_ftr_override id_aa64pfr0_override;
|
||||
extern struct arm64_ftr_override id_aa64pfr1_override;
|
||||
extern struct arm64_ftr_override id_aa64zfr0_override;
|
||||
@@ -915,9 +923,114 @@ extern struct arm64_ftr_override id_aa64isar2_override;
|
||||
|
||||
extern struct arm64_ftr_override arm64_sw_feature_override;
|
||||
|
||||
static inline
|
||||
u64 arm64_apply_feature_override(u64 val, int feat, int width,
|
||||
const struct arm64_ftr_override *override)
|
||||
{
|
||||
u64 oval = override->val;
|
||||
|
||||
/*
|
||||
* When it encounters an invalid override (e.g., an override that
|
||||
* cannot be honoured due to a missing CPU feature), the early idreg
|
||||
* override code will set the mask to 0x0 and the value to non-zero for
|
||||
* the field in question. In order to determine whether the override is
|
||||
* valid or not for the field we are interested in, we first need to
|
||||
* disregard bits belonging to other fields.
|
||||
*/
|
||||
oval &= GENMASK_ULL(feat + width - 1, feat);
|
||||
|
||||
/*
|
||||
* The override is valid if all value bits are accounted for in the
|
||||
* mask. If so, replace the masked bits with the override value.
|
||||
*/
|
||||
if (oval == (oval & override->mask)) {
|
||||
val &= ~override->mask;
|
||||
val |= oval;
|
||||
}
|
||||
|
||||
/* Extract the field from the updated value */
|
||||
return cpuid_feature_extract_unsigned_field(val, feat);
|
||||
}
|
||||
|
||||
static inline bool arm64_test_sw_feature_override(int feat)
|
||||
{
|
||||
/*
|
||||
* Software features are pseudo CPU features that have no underlying
|
||||
* CPUID system register value to apply the override to.
|
||||
*/
|
||||
return arm64_apply_feature_override(0, feat, 4,
|
||||
&arm64_sw_feature_override);
|
||||
}
|
||||
|
||||
static inline bool kaslr_disabled_cmdline(void)
|
||||
{
|
||||
return arm64_test_sw_feature_override(ARM64_SW_FEATURE_OVERRIDE_NOKASLR);
|
||||
}
|
||||
|
||||
u32 get_kvm_ipa_limit(void);
|
||||
void dump_cpu_features(void);
|
||||
|
||||
static inline bool cpu_has_bti(void)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_ARM64_BTI))
|
||||
return false;
|
||||
|
||||
return arm64_apply_feature_override(read_cpuid(ID_AA64PFR1_EL1),
|
||||
ID_AA64PFR1_EL1_BT_SHIFT, 4,
|
||||
&id_aa64pfr1_override);
|
||||
}
|
||||
|
||||
static inline bool cpu_has_pac(void)
|
||||
{
|
||||
u64 isar1, isar2;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_ARM64_PTR_AUTH))
|
||||
return false;
|
||||
|
||||
isar1 = read_cpuid(ID_AA64ISAR1_EL1);
|
||||
isar2 = read_cpuid(ID_AA64ISAR2_EL1);
|
||||
|
||||
if (arm64_apply_feature_override(isar1, ID_AA64ISAR1_EL1_APA_SHIFT, 4,
|
||||
&id_aa64isar1_override))
|
||||
return true;
|
||||
|
||||
if (arm64_apply_feature_override(isar1, ID_AA64ISAR1_EL1_API_SHIFT, 4,
|
||||
&id_aa64isar1_override))
|
||||
return true;
|
||||
|
||||
return arm64_apply_feature_override(isar2, ID_AA64ISAR2_EL1_APA3_SHIFT, 4,
|
||||
&id_aa64isar2_override);
|
||||
}
|
||||
|
||||
static inline bool cpu_has_lva(void)
|
||||
{
|
||||
u64 mmfr2;
|
||||
|
||||
mmfr2 = read_sysreg_s(SYS_ID_AA64MMFR2_EL1);
|
||||
mmfr2 &= ~id_aa64mmfr2_override.mask;
|
||||
mmfr2 |= id_aa64mmfr2_override.val;
|
||||
return cpuid_feature_extract_unsigned_field(mmfr2,
|
||||
ID_AA64MMFR2_EL1_VARange_SHIFT);
|
||||
}
|
||||
|
||||
static inline bool cpu_has_lpa2(void)
|
||||
{
|
||||
#ifdef CONFIG_ARM64_LPA2
|
||||
u64 mmfr0;
|
||||
int feat;
|
||||
|
||||
mmfr0 = read_sysreg(id_aa64mmfr0_el1);
|
||||
mmfr0 &= ~id_aa64mmfr0_override.mask;
|
||||
mmfr0 |= id_aa64mmfr0_override.val;
|
||||
feat = cpuid_feature_extract_signed_field(mmfr0,
|
||||
ID_AA64MMFR0_EL1_TGRAN_SHIFT);
|
||||
|
||||
return feat >= ID_AA64MMFR0_EL1_TGRAN_LPA2;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user