mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge branches 'for-next/kpti', 'for-next/missing-proto-warn', 'for-next/iss2-decode', 'for-next/kselftest', 'for-next/misc', 'for-next/feat_mops', 'for-next/module-alloc', 'for-next/sysreg', 'for-next/cpucap', 'for-next/acpi', 'for-next/kdump', 'for-next/acpi-doc', 'for-next/doc' and 'for-next/tpidr2-fix', remote-tracking branch 'arm64/for-next/perf' into for-next/core
* arm64/for-next/perf: docs: perf: Fix warning from 'make htmldocs' in hisi-pmu.rst 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 dt-bindings: perf: fsl-imx-ddr: Add i.MX93 compatible drivers/perf: imx_ddr: Add support for NXP i.MX9 SoC DDRC PMU driver perf/arm_cspmu: Decouple APMT dependency perf/arm_cspmu: Clean up ACPI dependency ACPI/APMT: Don't register invalid resource perf/arm_cspmu: Fix event attribute type perf: arm_cspmu: Set irq affinitiy only if overflow interrupt is used drivers/perf: hisi: Don't migrate perf to the CPU going to teardown drivers/perf: apple_m1: Force 63bit counters for M2 CPUs perf/arm-cmn: Fix DTC reset perf: qcom_l2_pmu: Make l2_cache_pmu_probe_cluster() more robust perf/arm-cci: Slightly optimize cci_pmu_sync_counters() * for-next/kpti: : Simplify KPTI trampoline exit code arm64: entry: Simplify tramp_alias macro and tramp_exit routine arm64: entry: Preserve/restore X29 even for compat tasks * for-next/missing-proto-warn: : Address -Wmissing-prototype warnings arm64: add alt_cb_patch_nops prototype arm64: move early_brk64 prototype to header arm64: signal: include asm/exception.h arm64: kaslr: add kaslr_early_init() declaration arm64: flush: include linux/libnvdimm.h arm64: module-plts: inline linux/moduleloader.h arm64: hide unused is_valid_bugaddr() arm64: efi: add efi_handle_corrupted_x18 prototype arm64: cpuidle: fix #ifdef for acpi functions arm64: kvm: add prototypes for functions called in asm arm64: spectre: provide prototypes for internal functions arm64: move cpu_suspend_set_dbg_restorer() prototype to header arm64: avoid prototype warnings for syscalls arm64: add scs_patch_vmlinux prototype arm64: xor-neon: mark xor_arm64_neon_*() static * for-next/iss2-decode: : Add decode of ISS2 to data abort reports arm64/esr: Add decode of ISS2 to data abort reporting arm64/esr: Use GENMASK() for the ISS mask * for-next/kselftest: : Various arm64 kselftest improvements kselftest/arm64: Log signal code and address for unexpected signals kselftest/arm64: Add a smoke test for ptracing hardware break/watch points * for-next/misc: : Miscellaneous patches arm64: alternatives: make clean_dcache_range_nopatch() noinstr-safe arm64: hibernate: remove WARN_ON in save_processor_state arm64/fpsimd: Exit streaming mode when flushing tasks arm64: mm: fix VA-range sanity check arm64/mm: remove now-superfluous ISBs from TTBR writes arm64: consolidate rox page protection logic arm64: set __exception_irq_entry with __irq_entry as a default arm64: syscall: unmask DAIF for tracing status arm64: lockdep: enable checks for held locks when returning to userspace arm64/cpucaps: increase string width to properly format cpucaps.h arm64/cpufeature: Use helper for ECV CNTPOFF cpufeature * for-next/feat_mops: : Support for ARMv8.8 memcpy instructions in userspace kselftest/arm64: add MOPS to hwcap test arm64: mops: allow disabling MOPS from the kernel command line arm64: mops: detect and enable FEAT_MOPS arm64: mops: handle single stepping after MOPS exception arm64: mops: handle MOPS exceptions KVM: arm64: hide MOPS from guests arm64: mops: don't disable host MOPS instructions from EL2 arm64: mops: document boot requirements for MOPS KVM: arm64: switch HCRX_EL2 between host and guest arm64: cpufeature: detect FEAT_HCX KVM: arm64: initialize HCRX_EL2 * for-next/module-alloc: : Make the arm64 module allocation code more robust (clean-up, VA range expansion) arm64: module: rework module VA range selection arm64: module: mandate MODULE_PLTS arm64: module: move module randomization to module.c arm64: kaslr: split kaslr/module initialization arm64: kasan: remove !KASAN_VMALLOC remnants arm64: module: remove old !KASAN_VMALLOC logic * for-next/sysreg: (21 commits) : More sysreg conversions to automatic generation arm64/sysreg: Convert TRBIDR_EL1 register to automatic generation arm64/sysreg: Convert TRBTRG_EL1 register to automatic generation arm64/sysreg: Convert TRBMAR_EL1 register to automatic generation arm64/sysreg: Convert TRBSR_EL1 register to automatic generation arm64/sysreg: Convert TRBBASER_EL1 register to automatic generation arm64/sysreg: Convert TRBPTR_EL1 register to automatic generation arm64/sysreg: Convert TRBLIMITR_EL1 register to automatic generation arm64/sysreg: Rename TRBIDR_EL1 fields per auto-gen tools format arm64/sysreg: Rename TRBTRG_EL1 fields per auto-gen tools format arm64/sysreg: Rename TRBMAR_EL1 fields per auto-gen tools format arm64/sysreg: Rename TRBSR_EL1 fields per auto-gen tools format arm64/sysreg: Rename TRBBASER_EL1 fields per auto-gen tools format arm64/sysreg: Rename TRBPTR_EL1 fields per auto-gen tools format arm64/sysreg: Rename TRBLIMITR_EL1 fields per auto-gen tools format arm64/sysreg: Convert OSECCR_EL1 to automatic generation arm64/sysreg: Convert OSDTRTX_EL1 to automatic generation arm64/sysreg: Convert OSDTRRX_EL1 to automatic generation arm64/sysreg: Convert OSLAR_EL1 to automatic generation arm64/sysreg: Standardise naming of bitfield constants in OSL[AS]R_EL1 arm64/sysreg: Convert MDSCR_EL1 to automatic register generation ... * for-next/cpucap: : arm64 cpucap clean-up arm64: cpufeature: fold cpus_set_cap() into update_cpu_capabilities() arm64: cpufeature: use cpucap naming arm64: alternatives: use cpucap naming arm64: standardise cpucap bitmap names * for-next/acpi: : Various arm64-related ACPI patches ACPI: bus: Consolidate all arm specific initialisation into acpi_arm_init() * for-next/kdump: : Simplify the crashkernel reservation behaviour of crashkernel=X,high on arm64 arm64: add kdump.rst into index.rst Documentation: add kdump.rst to present crashkernel reservation on arm64 arm64: kdump: simplify the reservation behaviour of crashkernel=,high * for-next/acpi-doc: : Update ACPI documentation for Arm systems Documentation/arm64: Update ACPI tables from BBR Documentation/arm64: Update references in arm-acpi Documentation/arm64: Update ARM and arch reference * for-next/doc: : arm64 documentation updates Documentation/arm64: Add ptdump documentation * for-next/tpidr2-fix: : Fix the TPIDR2_EL0 register restoring on sigreturn kselftest/arm64: Add a test case for TPIDR2 restore arm64/signal: Restore TPIDR2 register rather than memory state
This commit is contained in:
@@ -429,6 +429,9 @@
|
||||
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
|
||||
|
||||
@@ -17,16 +17,37 @@ For ACPI on arm64, tables also fall into the following categories:
|
||||
|
||||
- Recommended: BERT, EINJ, ERST, HEST, PCCT, SSDT
|
||||
|
||||
- Optional: BGRT, CPEP, CSRT, DBG2, DRTM, ECDT, FACS, FPDT, IBFT,
|
||||
IORT, MCHI, MPST, MSCT, NFIT, PMTT, RASF, SBST, SLIT, SPMI, SRAT,
|
||||
STAO, TCPA, TPM2, UEFI, XENV
|
||||
- Optional: AGDI, BGRT, CEDT, CPEP, CSRT, DBG2, DRTM, ECDT, FACS, FPDT,
|
||||
HMAT, IBFT, IORT, MCHI, MPAM, MPST, MSCT, NFIT, PMTT, PPTT, RASF, SBST,
|
||||
SDEI, SLIT, SPMI, SRAT, STAO, TCPA, TPM2, UEFI, XENV
|
||||
|
||||
- Not supported: BOOT, DBGP, DMAR, ETDT, HPET, IVRS, LPIT, MSDM, OEMx,
|
||||
PSDT, RSDT, SLIC, WAET, WDAT, WDRT, WPBT
|
||||
- Not supported: AEST, APMT, BOOT, DBGP, DMAR, ETDT, HPET, IVRS, LPIT,
|
||||
MSDM, OEMx, PDTT, PSDT, RAS2, RSDT, SLIC, WAET, WDAT, WDRT, WPBT
|
||||
|
||||
====== ========================================================================
|
||||
Table Usage for ARMv8 Linux
|
||||
====== ========================================================================
|
||||
AEST Signature Reserved (signature == "AEST")
|
||||
|
||||
**Arm Error Source Table**
|
||||
|
||||
This table informs the OS of any error nodes in the system that are
|
||||
compliant with the Arm RAS architecture.
|
||||
|
||||
AGDI Signature Reserved (signature == "AGDI")
|
||||
|
||||
**Arm Generic diagnostic Dump and Reset Device Interface Table**
|
||||
|
||||
This table describes a non-maskable event, that is used by the platform
|
||||
firmware, to request the OS to generate a diagnostic dump and reset the device.
|
||||
|
||||
APMT Signature Reserved (signature == "APMT")
|
||||
|
||||
**Arm Performance Monitoring Table**
|
||||
|
||||
This table describes the properties of PMU support implmented by
|
||||
components in the system.
|
||||
|
||||
BERT Section 18.3 (signature == "BERT")
|
||||
|
||||
**Boot Error Record Table**
|
||||
@@ -47,6 +68,13 @@ BGRT Section 5.2.22 (signature == "BGRT")
|
||||
Optional, not currently supported, with no real use-case for an
|
||||
ARM server.
|
||||
|
||||
CEDT Signature Reserved (signature == "CEDT")
|
||||
|
||||
**CXL Early Discovery Table**
|
||||
|
||||
This table allows the OS to discover any CXL Host Bridges and the Host
|
||||
Bridge registers.
|
||||
|
||||
CPEP Section 5.2.18 (signature == "CPEP")
|
||||
|
||||
**Corrected Platform Error Polling table**
|
||||
@@ -184,6 +212,15 @@ HEST Section 18.3.2 (signature == "HEST")
|
||||
Must be supplied if RAS support is provided by the platform. It
|
||||
is recommended this table be supplied.
|
||||
|
||||
HMAT Section 5.2.28 (signature == "HMAT")
|
||||
|
||||
**Heterogeneous Memory Attribute Table**
|
||||
|
||||
This table describes the memory attributes, such as memory side cache
|
||||
attributes and bandwidth and latency details, related to Memory Proximity
|
||||
Domains. The OS uses this information to optimize the system memory
|
||||
configuration.
|
||||
|
||||
HPET Signature Reserved (signature == "HPET")
|
||||
|
||||
**High Precision Event timer Table**
|
||||
@@ -241,6 +278,13 @@ MCHI Signature Reserved (signature == "MCHI")
|
||||
|
||||
Optional, not currently supported.
|
||||
|
||||
MPAM Signature Reserved (signature == "MPAM")
|
||||
|
||||
**Memory Partitioning And Monitoring table**
|
||||
|
||||
This table allows the OS to discover the MPAM controls implemented by
|
||||
the subsystems.
|
||||
|
||||
MPST Section 5.2.21 (signature == "MPST")
|
||||
|
||||
**Memory Power State Table**
|
||||
@@ -281,18 +325,39 @@ PCCT Section 14.1 (signature == "PCCT)
|
||||
Recommend for use on arm64; use of PCC is recommended when using CPPC
|
||||
to control performance and power for platform processors.
|
||||
|
||||
PDTT Section 5.2.29 (signature == "PDTT")
|
||||
|
||||
**Platform Debug Trigger Table**
|
||||
|
||||
This table describes PCC channels used to gather debug logs of
|
||||
non-architectural features.
|
||||
|
||||
|
||||
PMTT Section 5.2.21.12 (signature == "PMTT")
|
||||
|
||||
**Platform Memory Topology Table**
|
||||
|
||||
Optional, not currently supported.
|
||||
|
||||
PPTT Section 5.2.30 (signature == "PPTT")
|
||||
|
||||
**Processor Properties Topology Table**
|
||||
|
||||
This table provides the processor and cache topology.
|
||||
|
||||
PSDT Section 5.2.11.3 (signature == "PSDT")
|
||||
|
||||
**Persistent System Description Table**
|
||||
|
||||
Obsolete table, will not be supported.
|
||||
|
||||
RAS2 Section 5.2.21 (signature == "RAS2")
|
||||
|
||||
**RAS Features 2 table**
|
||||
|
||||
This table provides interfaces for the RAS capabilities implemented in
|
||||
the platform.
|
||||
|
||||
RASF Section 5.2.20 (signature == "RASF")
|
||||
|
||||
**RAS Feature table**
|
||||
@@ -318,6 +383,12 @@ SBST Section 5.2.14 (signature == "SBST")
|
||||
|
||||
Optional, not currently supported.
|
||||
|
||||
SDEI Signature Reserved (signature == "SDEI")
|
||||
|
||||
**Software Delegated Exception Interface table**
|
||||
|
||||
This table advertises the presence of the SDEI interface.
|
||||
|
||||
SLIC Signature Reserved (signature == "SLIC")
|
||||
|
||||
**Software LIcensing table**
|
||||
|
||||
@@ -1,40 +1,41 @@
|
||||
=====================
|
||||
ACPI on ARMv8 Servers
|
||||
=====================
|
||||
===================
|
||||
ACPI on Arm systems
|
||||
===================
|
||||
|
||||
ACPI can be used for ARMv8 general purpose servers designed to follow
|
||||
the ARM SBSA (Server Base System Architecture) [0] and SBBR (Server
|
||||
Base Boot Requirements) [1] specifications. Please note that the SBBR
|
||||
can be retrieved simply by visiting [1], but the SBSA is currently only
|
||||
available to those with an ARM login due to ARM IP licensing concerns.
|
||||
ACPI can be used for Armv8 and Armv9 systems designed to follow
|
||||
the BSA (Arm Base System Architecture) [0] and BBR (Arm
|
||||
Base Boot Requirements) [1] specifications. Both BSA and BBR are publicly
|
||||
accessible documents.
|
||||
Arm Servers, in addition to being BSA compliant, comply with a set
|
||||
of rules defined in SBSA (Server Base System Architecture) [2].
|
||||
|
||||
The ARMv8 kernel implements the reduced hardware model of ACPI version
|
||||
The Arm kernel implements the reduced hardware model of ACPI version
|
||||
5.1 or later. Links to the specification and all external documents
|
||||
it refers to are managed by the UEFI Forum. The specification is
|
||||
available at http://www.uefi.org/specifications and documents referenced
|
||||
by the specification can be found via http://www.uefi.org/acpi.
|
||||
|
||||
If an ARMv8 system does not meet the requirements of the SBSA and SBBR,
|
||||
If an Arm system does not meet the requirements of the BSA and BBR,
|
||||
or cannot be described using the mechanisms defined in the required ACPI
|
||||
specifications, then ACPI may not be a good fit for the hardware.
|
||||
|
||||
While the documents mentioned above set out the requirements for building
|
||||
industry-standard ARMv8 servers, they also apply to more than one operating
|
||||
industry-standard Arm systems, they also apply to more than one operating
|
||||
system. The purpose of this document is to describe the interaction between
|
||||
ACPI and Linux only, on an ARMv8 system -- that is, what Linux expects of
|
||||
ACPI and Linux only, on an Arm system -- that is, what Linux expects of
|
||||
ACPI and what ACPI can expect of Linux.
|
||||
|
||||
|
||||
Why ACPI on ARM?
|
||||
Why ACPI on Arm?
|
||||
----------------
|
||||
Before examining the details of the interface between ACPI and Linux, it is
|
||||
useful to understand why ACPI is being used. Several technologies already
|
||||
exist in Linux for describing non-enumerable hardware, after all. In this
|
||||
section we summarize a blog post [2] from Grant Likely that outlines the
|
||||
reasoning behind ACPI on ARMv8 servers. Actually, we snitch a good portion
|
||||
section we summarize a blog post [3] from Grant Likely that outlines the
|
||||
reasoning behind ACPI on Arm systems. Actually, we snitch a good portion
|
||||
of the summary text almost directly, to be honest.
|
||||
|
||||
The short form of the rationale for ACPI on ARM is:
|
||||
The short form of the rationale for ACPI on Arm is:
|
||||
|
||||
- ACPI’s byte code (AML) allows the platform to encode hardware behavior,
|
||||
while DT explicitly does not support this. For hardware vendors, being
|
||||
@@ -47,7 +48,7 @@ The short form of the rationale for ACPI on ARM is:
|
||||
|
||||
- In the enterprise server environment, ACPI has established bindings (such
|
||||
as for RAS) which are currently used in production systems. DT does not.
|
||||
Such bindings could be defined in DT at some point, but doing so means ARM
|
||||
Such bindings could be defined in DT at some point, but doing so means Arm
|
||||
and x86 would end up using completely different code paths in both firmware
|
||||
and the kernel.
|
||||
|
||||
@@ -108,7 +109,7 @@ recent version of the kernel.
|
||||
|
||||
Relationship with Device Tree
|
||||
-----------------------------
|
||||
ACPI support in drivers and subsystems for ARMv8 should never be mutually
|
||||
ACPI support in drivers and subsystems for Arm should never be mutually
|
||||
exclusive with DT support at compile time.
|
||||
|
||||
At boot time the kernel will only use one description method depending on
|
||||
@@ -121,11 +122,11 @@ time).
|
||||
|
||||
Booting using ACPI tables
|
||||
-------------------------
|
||||
The only defined method for passing ACPI tables to the kernel on ARMv8
|
||||
The only defined method for passing ACPI tables to the kernel on Arm
|
||||
is via the UEFI system configuration table. Just so it is explicit, this
|
||||
means that ACPI is only supported on platforms that boot via UEFI.
|
||||
|
||||
When an ARMv8 system boots, it can either have DT information, ACPI tables,
|
||||
When an Arm system boots, it can either have DT information, ACPI tables,
|
||||
or in some very unusual cases, both. If no command line parameters are used,
|
||||
the kernel will try to use DT for device enumeration; if there is no DT
|
||||
present, the kernel will try to use ACPI tables, but only if they are present.
|
||||
@@ -169,7 +170,7 @@ hardware reduced mode must be set to zero.
|
||||
|
||||
For the ACPI core to operate properly, and in turn provide the information
|
||||
the kernel needs to configure devices, it expects to find the following
|
||||
tables (all section numbers refer to the ACPI 6.1 specification):
|
||||
tables (all section numbers refer to the ACPI 6.5 specification):
|
||||
|
||||
- RSDP (Root System Description Pointer), section 5.2.5
|
||||
|
||||
@@ -184,20 +185,76 @@ tables (all section numbers refer to the ACPI 6.1 specification):
|
||||
|
||||
- GTDT (Generic Timer Description Table), section 5.2.24
|
||||
|
||||
- PPTT (Processor Properties Topology Table), section 5.2.30
|
||||
|
||||
- DBG2 (DeBuG port table 2), section 5.2.6, specifically Table 5-6.
|
||||
|
||||
- APMT (Arm Performance Monitoring unit Table), section 5.2.6, specifically Table 5-6.
|
||||
|
||||
- AGDI (Arm Generic diagnostic Dump and Reset Device Interface Table), section 5.2.6, specifically Table 5-6.
|
||||
|
||||
- If PCI is supported, the MCFG (Memory mapped ConFiGuration
|
||||
Table), section 5.2.6, specifically Table 5-31.
|
||||
Table), section 5.2.6, specifically Table 5-6.
|
||||
|
||||
- If booting without a console=<device> kernel parameter is
|
||||
supported, the SPCR (Serial Port Console Redirection table),
|
||||
section 5.2.6, specifically Table 5-31.
|
||||
section 5.2.6, specifically Table 5-6.
|
||||
|
||||
- If necessary to describe the I/O topology, SMMUs and GIC ITSs,
|
||||
the IORT (Input Output Remapping Table, section 5.2.6, specifically
|
||||
Table 5-31).
|
||||
Table 5-6).
|
||||
|
||||
- If NUMA is supported, the following tables are required:
|
||||
|
||||
- SRAT (System Resource Affinity Table), section 5.2.16
|
||||
|
||||
- SLIT (System Locality distance Information Table), section 5.2.17
|
||||
|
||||
- If NUMA is supported, and the system contains heterogeneous memory,
|
||||
the HMAT (Heterogeneous Memory Attribute Table), section 5.2.28.
|
||||
|
||||
- If the ACPI Platform Error Interfaces are required, the following
|
||||
tables are conditionally required:
|
||||
|
||||
- BERT (Boot Error Record Table, section 18.3.1)
|
||||
|
||||
- EINJ (Error INJection table, section 18.6.1)
|
||||
|
||||
- ERST (Error Record Serialization Table, section 18.5)
|
||||
|
||||
- HEST (Hardware Error Source Table, section 18.3.2)
|
||||
|
||||
- SDEI (Software Delegated Exception Interface table, section 5.2.6,
|
||||
specifically Table 5-6)
|
||||
|
||||
- AEST (Arm Error Source Table, section 5.2.6,
|
||||
specifically Table 5-6)
|
||||
|
||||
- RAS2 (ACPI RAS2 feature table, section 5.2.21)
|
||||
|
||||
- If the system contains controllers using PCC channel, the
|
||||
PCCT (Platform Communications Channel Table), section 14.1
|
||||
|
||||
- If the system contains a controller to capture board-level system state,
|
||||
and communicates with the host via PCC, the PDTT (Platform Debug Trigger
|
||||
Table), section 5.2.29.
|
||||
|
||||
- If NVDIMM is supported, the NFIT (NVDIMM Firmware Interface Table), section 5.2.26
|
||||
|
||||
- If video framebuffer is present, the BGRT (Boot Graphics Resource Table), section 5.2.23
|
||||
|
||||
- If IPMI is implemented, the SPMI (Server Platform Management Interface),
|
||||
section 5.2.6, specifically Table 5-6.
|
||||
|
||||
- If the system contains a CXL Host Bridge, the CEDT (CXL Early Discovery
|
||||
Table), section 5.2.6, specifically Table 5-6.
|
||||
|
||||
- If the system supports MPAM, the MPAM (Memory Partitioning And Monitoring table), section 5.2.6,
|
||||
specifically Table 5-6.
|
||||
|
||||
- If the system lacks persistent storage, the IBFT (ISCSI Boot Firmware
|
||||
Table), section 5.2.6, specifically Table 5-6.
|
||||
|
||||
- If NUMA is supported, the SRAT (System Resource Affinity Table)
|
||||
and SLIT (System Locality distance Information Table), sections
|
||||
5.2.16 and 5.2.17, respectively.
|
||||
|
||||
If the above tables are not all present, the kernel may or may not be
|
||||
able to boot properly since it may not be able to configure all of the
|
||||
@@ -269,16 +326,14 @@ Drivers should look for device properties in the _DSD object ONLY; the _DSD
|
||||
object is described in the ACPI specification section 6.2.5, but this only
|
||||
describes how to define the structure of an object returned via _DSD, and
|
||||
how specific data structures are defined by specific UUIDs. Linux should
|
||||
only use the _DSD Device Properties UUID [5]:
|
||||
only use the _DSD Device Properties UUID [4]:
|
||||
|
||||
- UUID: daffd814-6eba-4d8c-8a91-bc9bbf4aa301
|
||||
|
||||
- https://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf
|
||||
|
||||
The UEFI Forum provides a mechanism for registering device properties [4]
|
||||
so that they may be used across all operating systems supporting ACPI.
|
||||
Device properties that have not been registered with the UEFI Forum should
|
||||
not be used.
|
||||
Common device properties can be registered by creating a pull request to [4] so
|
||||
that they may be used across all operating systems supporting ACPI.
|
||||
Device properties that have not been registered with the UEFI Forum can be used
|
||||
but not as "uefi-" common properties.
|
||||
|
||||
Before creating new device properties, check to be sure that they have not
|
||||
been defined before and either registered in the Linux kernel documentation
|
||||
@@ -306,7 +361,7 @@ process.
|
||||
|
||||
Once registration and review have been completed, the kernel provides an
|
||||
interface for looking up device properties in a manner independent of
|
||||
whether DT or ACPI is being used. This API should be used [6]; it can
|
||||
whether DT or ACPI is being used. This API should be used [5]; it can
|
||||
eliminate some duplication of code paths in driver probing functions and
|
||||
discourage divergence between DT bindings and ACPI device properties.
|
||||
|
||||
@@ -448,15 +503,15 @@ ASWG
|
||||
----
|
||||
The ACPI specification changes regularly. During the year 2014, for instance,
|
||||
version 5.1 was released and version 6.0 substantially completed, with most of
|
||||
the changes being driven by ARM-specific requirements. Proposed changes are
|
||||
the changes being driven by Arm-specific requirements. Proposed changes are
|
||||
presented and discussed in the ASWG (ACPI Specification Working Group) which
|
||||
is a part of the UEFI Forum. The current version of the ACPI specification
|
||||
is 6.1 release in January 2016.
|
||||
is 6.5 release in August 2022.
|
||||
|
||||
Participation in this group is open to all UEFI members. Please see
|
||||
http://www.uefi.org/workinggroup for details on group membership.
|
||||
|
||||
It is the intent of the ARMv8 ACPI kernel code to follow the ACPI specification
|
||||
It is the intent of the Arm ACPI kernel code to follow the ACPI specification
|
||||
as closely as possible, and to only implement functionality that complies with
|
||||
the released standards from UEFI ASWG. As a practical matter, there will be
|
||||
vendors that provide bad ACPI tables or violate the standards in some way.
|
||||
@@ -470,12 +525,12 @@ likely be willing to assist in submitting ECRs.
|
||||
|
||||
Linux Code
|
||||
----------
|
||||
Individual items specific to Linux on ARM, contained in the Linux
|
||||
Individual items specific to Linux on Arm, contained in the Linux
|
||||
source code, are in the list that follows:
|
||||
|
||||
ACPI_OS_NAME
|
||||
This macro defines the string to be returned when
|
||||
an ACPI method invokes the _OS method. On ARM64
|
||||
an ACPI method invokes the _OS method. On Arm
|
||||
systems, this macro will be "Linux" by default.
|
||||
The command line parameter acpi_os=<string>
|
||||
can be used to set it to some other value. The
|
||||
@@ -490,31 +545,23 @@ Documentation/arm64/acpi_object_usage.rst.
|
||||
|
||||
References
|
||||
----------
|
||||
[0] http://silver.arm.com
|
||||
document ARM-DEN-0029, or newer:
|
||||
"Server Base System Architecture", version 2.3, dated 27 Mar 2014
|
||||
[0] https://developer.arm.com/documentation/den0094/latest
|
||||
document Arm-DEN-0094: "Arm Base System Architecture", version 1.0C, dated 6 Oct 2022
|
||||
|
||||
[1] http://infocenter.arm.com/help/topic/com.arm.doc.den0044a/Server_Base_Boot_Requirements.pdf
|
||||
Document ARM-DEN-0044A, or newer: "Server Base Boot Requirements, System
|
||||
Software on ARM Platforms", dated 16 Aug 2014
|
||||
[1] https://developer.arm.com/documentation/den0044/latest
|
||||
Document Arm-DEN-0044: "Arm Base Boot Requirements", version 2.0G, dated 15 Apr 2022
|
||||
|
||||
[2] http://www.secretlab.ca/archives/151,
|
||||
[2] https://developer.arm.com/documentation/den0029/latest
|
||||
Document Arm-DEN-0029: "Arm Server Base System Architecture", version 7.1, dated 06 Oct 2022
|
||||
|
||||
[3] http://www.secretlab.ca/archives/151,
|
||||
10 Jan 2015, Copyright (c) 2015,
|
||||
Linaro Ltd., written by Grant Likely.
|
||||
|
||||
[3] AMD ACPI for Seattle platform documentation
|
||||
http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/Seattle_ACPI_Guide.pdf
|
||||
[4] _DSD (Device Specific Data) Implementation Guide
|
||||
https://github.com/UEFI/DSD-Guide/blob/main/dsd-guide.pdf
|
||||
|
||||
|
||||
[4] http://www.uefi.org/acpi
|
||||
please see the link for the "ACPI _DSD Device
|
||||
Property Registry Instructions"
|
||||
|
||||
[5] http://www.uefi.org/acpi
|
||||
please see the link for the "_DSD (Device
|
||||
Specific Data) Implementation Guide"
|
||||
|
||||
[6] Kernel code for the unified device
|
||||
[5] Kernel code for the unified device
|
||||
property interface can be found in
|
||||
include/linux/property.h and drivers/base/property.c.
|
||||
|
||||
|
||||
@@ -379,6 +379,12 @@ Before jumping into the kernel, the following conditions must be met:
|
||||
|
||||
- SMCR_EL2.EZT0 (bit 30) must be initialised to 0b1.
|
||||
|
||||
For CPUs with Memory Copy and Memory Set instructions (FEAT_MOPS):
|
||||
|
||||
- If the kernel is entered at EL1 and EL2 is present:
|
||||
|
||||
- HCRX_EL2.MSCEn (bit 11) must be initialised to 0b1.
|
||||
|
||||
The requirements described above for CPU mode, caches, MMUs, architected
|
||||
timers, coherency and system registers apply to all CPUs. All CPUs must
|
||||
enter the kernel in the same exception level. Where the values documented
|
||||
|
||||
@@ -288,6 +288,8 @@ infrastructure:
|
||||
+------------------------------+---------+---------+
|
||||
| Name | bits | visible |
|
||||
+------------------------------+---------+---------+
|
||||
| MOPS | [19-16] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| RPRES | [7-4] | y |
|
||||
+------------------------------+---------+---------+
|
||||
| WFXT | [3-0] | y |
|
||||
|
||||
@@ -302,6 +302,9 @@ HWCAP2_SMEB16B16
|
||||
HWCAP2_SMEF16F16
|
||||
Functionality implied by ID_AA64SMFR0_EL1.F16F16 == 0b1
|
||||
|
||||
HWCAP2_MOPS
|
||||
Functionality implied by ID_AA64ISAR2_EL1.MOPS == 0b0001.
|
||||
|
||||
4. Unused AT_HWCAP bits
|
||||
-----------------------
|
||||
|
||||
|
||||
@@ -15,11 +15,13 @@ ARM64 Architecture
|
||||
cpu-feature-registers
|
||||
elf_hwcaps
|
||||
hugetlbpage
|
||||
kdump
|
||||
legacy_instructions
|
||||
memory
|
||||
memory-tagging-extension
|
||||
perf
|
||||
pointer-authentication
|
||||
ptdump
|
||||
silicon-errata
|
||||
sme
|
||||
sve
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
=======================================
|
||||
crashkernel memory reservation on arm64
|
||||
=======================================
|
||||
|
||||
Author: Baoquan He <bhe@redhat.com>
|
||||
|
||||
Kdump mechanism is used to capture a corrupted kernel vmcore so that
|
||||
it can be subsequently analyzed. In order to do this, a preliminarily
|
||||
reserved memory is needed to pre-load the kdump kernel and boot such
|
||||
kernel if corruption happens.
|
||||
|
||||
That reserved memory for kdump is adapted to be able to minimally
|
||||
accommodate the kdump kernel and the user space programs needed for the
|
||||
vmcore collection.
|
||||
|
||||
Kernel parameter
|
||||
================
|
||||
|
||||
Through the kernel parameters below, memory can be reserved accordingly
|
||||
during the early stage of the first kernel booting so that a continuous
|
||||
large chunk of memomy can be found. The low memory reservation needs to
|
||||
be considered if the crashkernel is reserved from the high memory area.
|
||||
|
||||
- crashkernel=size@offset
|
||||
- crashkernel=size
|
||||
- crashkernel=size,high crashkernel=size,low
|
||||
|
||||
Low memory and high memory
|
||||
==========================
|
||||
|
||||
For kdump reservations, low memory is the memory area under a specific
|
||||
limit, usually decided by the accessible address bits of the DMA-capable
|
||||
devices needed by the kdump kernel to run. Those devices not related to
|
||||
vmcore dumping can be ignored. On arm64, the low memory upper bound is
|
||||
not fixed: it is 1G on the RPi4 platform but 4G on most other systems.
|
||||
On special kernels built with CONFIG_ZONE_(DMA|DMA32) disabled, the
|
||||
whole system RAM is low memory. Outside of the low memory described
|
||||
above, the rest of system RAM is considered high memory.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
1) crashkernel=size@offset
|
||||
--------------------------
|
||||
|
||||
The crashkernel memory must be reserved at the user-specified region or
|
||||
fail if already occupied.
|
||||
|
||||
|
||||
2) crashkernel=size
|
||||
-------------------
|
||||
|
||||
The crashkernel memory region will be reserved in any available position
|
||||
according to the search order:
|
||||
|
||||
Firstly, the kernel searches the low memory area for an available region
|
||||
with the specified size.
|
||||
|
||||
If searching for low memory fails, the kernel falls back to searching
|
||||
the high memory area for an available region of the specified size. If
|
||||
the reservation in high memory succeeds, a default size reservation in
|
||||
the low memory will be done. Currently the default size is 128M,
|
||||
sufficient for the low memory needs of the kdump kernel.
|
||||
|
||||
Note: crashkernel=size is the recommended option for crashkernel kernel
|
||||
reservations. The user would not need to know the system memory layout
|
||||
for a specific platform.
|
||||
|
||||
3) crashkernel=size,high crashkernel=size,low
|
||||
---------------------------------------------
|
||||
|
||||
crashkernel=size,(high|low) are an important supplement to
|
||||
crashkernel=size. They allows the user to specify how much memory needs
|
||||
to be allocated from the high memory and low memory respectively. On
|
||||
many systems the low memory is precious and crashkernel reservations
|
||||
from this area should be kept to a minimum.
|
||||
|
||||
To reserve memory for crashkernel=size,high, searching is first
|
||||
attempted from the high memory region. If the reservation succeeds, the
|
||||
low memory reservation will be done subsequently.
|
||||
|
||||
If reservation from the high memory failed, the kernel falls back to
|
||||
searching the low memory with the specified size in crashkernel=,high.
|
||||
If it succeeds, no further reservation for low memory is needed.
|
||||
|
||||
Notes:
|
||||
|
||||
- If crashkernel=,low is not specified, the default low memory
|
||||
reservation will be done automatically.
|
||||
|
||||
- if crashkernel=0,low is specified, it means that the low memory
|
||||
reservation is omitted intentionally.
|
||||
@@ -33,8 +33,8 @@ AArch64 Linux memory layout with 4KB pages + 4 levels (48-bit)::
|
||||
0000000000000000 0000ffffffffffff 256TB user
|
||||
ffff000000000000 ffff7fffffffffff 128TB kernel logical memory map
|
||||
[ffff600000000000 ffff7fffffffffff] 32TB [kasan shadow region]
|
||||
ffff800000000000 ffff800007ffffff 128MB modules
|
||||
ffff800008000000 fffffbffefffffff 124TB vmalloc
|
||||
ffff800000000000 ffff80007fffffff 2GB modules
|
||||
ffff800080000000 fffffbffefffffff 124TB vmalloc
|
||||
fffffbfff0000000 fffffbfffdffffff 224MB fixed mappings (top down)
|
||||
fffffbfffe000000 fffffbfffe7fffff 8MB [guard region]
|
||||
fffffbfffe800000 fffffbffff7fffff 16MB PCI I/O space
|
||||
@@ -50,8 +50,8 @@ AArch64 Linux memory layout with 64KB pages + 3 levels (52-bit with HW support):
|
||||
0000000000000000 000fffffffffffff 4PB user
|
||||
fff0000000000000 ffff7fffffffffff ~4PB kernel logical memory map
|
||||
[fffd800000000000 ffff7fffffffffff] 512TB [kasan shadow region]
|
||||
ffff800000000000 ffff800007ffffff 128MB modules
|
||||
ffff800008000000 fffffbffefffffff 124TB vmalloc
|
||||
ffff800000000000 ffff80007fffffff 2GB modules
|
||||
ffff800080000000 fffffbffefffffff 124TB vmalloc
|
||||
fffffbfff0000000 fffffbfffdffffff 224MB fixed mappings (top down)
|
||||
fffffbfffe000000 fffffbfffe7fffff 8MB [guard region]
|
||||
fffffbfffe800000 fffffbffff7fffff 16MB PCI I/O space
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
======================
|
||||
Kernel page table dump
|
||||
======================
|
||||
|
||||
ptdump is a debugfs interface that provides a detailed dump of the
|
||||
kernel page tables. It offers a comprehensive overview of the kernel
|
||||
virtual memory layout as well as the attributes associated with the
|
||||
various regions in a human-readable format. It is useful to dump the
|
||||
kernel page tables to verify permissions and memory types. Examining the
|
||||
page table entries and permissions helps identify potential security
|
||||
vulnerabilities such as mappings with overly permissive access rights or
|
||||
improper memory protections.
|
||||
|
||||
Memory hotplug allows dynamic expansion or contraction of available
|
||||
memory without requiring a system reboot. To maintain the consistency
|
||||
and integrity of the memory management data structures, arm64 makes use
|
||||
of the ``mem_hotplug_lock`` semaphore in write mode. Additionally, in
|
||||
read mode, ``mem_hotplug_lock`` supports an efficient implementation of
|
||||
``get_online_mems()`` and ``put_online_mems()``. These protect the
|
||||
offlining of memory being accessed by the ptdump code.
|
||||
|
||||
In order to dump the kernel page tables, enable the following
|
||||
configurations and mount debugfs::
|
||||
|
||||
CONFIG_GENERIC_PTDUMP=y
|
||||
CONFIG_PTDUMP_CORE=y
|
||||
CONFIG_PTDUMP_DEBUGFS=y
|
||||
|
||||
mount -t debugfs nodev /sys/kernel/debug
|
||||
cat /sys/kernel/debug/kernel_page_tables
|
||||
|
||||
On analysing the output of ``cat /sys/kernel/debug/kernel_page_tables``
|
||||
one can derive information about the virtual address range of the entry,
|
||||
followed by size of the memory region covered by this entry, the
|
||||
hierarchical structure of the page tables and finally the attributes
|
||||
associated with each page. The page attributes provide information about
|
||||
access permissions, execution capability, type of mapping such as leaf
|
||||
level PTE or block level PGD, PMD and PUD, and access status of a page
|
||||
within the kernel memory. Assessing these attributes can assist in
|
||||
understanding the memory layout, access patterns and security
|
||||
characteristics of the kernel pages.
|
||||
|
||||
Kernel virtual memory layout example::
|
||||
|
||||
start address end address size attributes
|
||||
+---------------------------------------------------------------------------------------+
|
||||
| ---[ Linear Mapping start ]---------------------------------------------------------- |
|
||||
| .................. |
|
||||
| 0xfff0000000000000-0xfff0000000210000 2112K PTE RW NX SHD AF UXN MEM/NORMAL-TAGGED |
|
||||
| 0xfff0000000210000-0xfff0000001c00000 26560K PTE ro NX SHD AF UXN MEM/NORMAL |
|
||||
| .................. |
|
||||
| ---[ Linear Mapping end ]------------------------------------------------------------ |
|
||||
+---------------------------------------------------------------------------------------+
|
||||
| ---[ Modules start ]----------------------------------------------------------------- |
|
||||
| .................. |
|
||||
| 0xffff800000000000-0xffff800008000000 128M PTE |
|
||||
| .................. |
|
||||
| ---[ Modules end ]------------------------------------------------------------------- |
|
||||
+---------------------------------------------------------------------------------------+
|
||||
| ---[ vmalloc() area ]---------------------------------------------------------------- |
|
||||
| .................. |
|
||||
| 0xffff800008010000-0xffff800008200000 1984K PTE ro x SHD AF UXN MEM/NORMAL |
|
||||
| 0xffff800008200000-0xffff800008e00000 12M PTE ro x SHD AF CON UXN MEM/NORMAL |
|
||||
| .................. |
|
||||
| ---[ vmalloc() end ]----------------------------------------------------------------- |
|
||||
+---------------------------------------------------------------------------------------+
|
||||
| ---[ Fixmap start ]------------------------------------------------------------------ |
|
||||
| .................. |
|
||||
| 0xfffffbfffdb80000-0xfffffbfffdb90000 64K PTE ro x SHD AF UXN MEM/NORMAL |
|
||||
| 0xfffffbfffdb90000-0xfffffbfffdba0000 64K PTE ro NX SHD AF UXN MEM/NORMAL |
|
||||
| .................. |
|
||||
| ---[ Fixmap end ]-------------------------------------------------------------------- |
|
||||
+---------------------------------------------------------------------------------------+
|
||||
| ---[ PCI I/O start ]----------------------------------------------------------------- |
|
||||
| .................. |
|
||||
| 0xfffffbfffe800000-0xfffffbffff800000 16M PTE |
|
||||
| .................. |
|
||||
| ---[ PCI I/O end ]------------------------------------------------------------------- |
|
||||
+---------------------------------------------------------------------------------------+
|
||||
| ---[ vmemmap start ]----------------------------------------------------------------- |
|
||||
| .................. |
|
||||
| 0xfffffc0002000000-0xfffffc0002200000 2M PTE RW NX SHD AF UXN MEM/NORMAL |
|
||||
| 0xfffffc0002200000-0xfffffc0020000000 478M PTE |
|
||||
| .................. |
|
||||
| ---[ vmemmap end ]------------------------------------------------------------------- |
|
||||
+---------------------------------------------------------------------------------------+
|
||||
|
||||
``cat /sys/kernel/debug/kernel_page_tables`` output::
|
||||
|
||||
0xfff0000001c00000-0xfff0000080000000 2020M PTE RW NX SHD AF UXN MEM/NORMAL-TAGGED
|
||||
0xfff0000080000000-0xfff0000800000000 30G PMD
|
||||
0xfff0000800000000-0xfff0000800700000 7M PTE RW NX SHD AF UXN MEM/NORMAL-TAGGED
|
||||
0xfff0000800700000-0xfff0000800710000 64K PTE ro NX SHD AF UXN MEM/NORMAL-TAGGED
|
||||
0xfff0000800710000-0xfff0000880000000 2089920K PTE RW NX SHD AF UXN MEM/NORMAL-TAGGED
|
||||
0xfff0000880000000-0xfff0040000000000 4062G PMD
|
||||
0xfff0040000000000-0xffff800000000000 3964T PGD
|
||||
+3
-25
@@ -207,6 +207,7 @@ config ARM64
|
||||
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
|
||||
@@ -577,7 +578,6 @@ config ARM64_ERRATUM_845719
|
||||
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
|
||||
@@ -2107,26 +2107,6 @@ config ARM64_SME
|
||||
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
|
||||
@@ -2167,7 +2147,6 @@ config RELOCATABLE
|
||||
|
||||
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
|
||||
@@ -2198,9 +2177,8 @@ config RANDOMIZE_MODULE_REGION_FULL
|
||||
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)
|
||||
|
||||
@@ -23,17 +23,17 @@
|
||||
|
||||
#include <linux/stringify.h>
|
||||
|
||||
#define ALTINSTR_ENTRY(feature) \
|
||||
#define ALTINSTR_ENTRY(cpucap) \
|
||||
" .word 661b - .\n" /* label */ \
|
||||
" .word 663f - .\n" /* new instruction */ \
|
||||
" .hword " __stringify(feature) "\n" /* feature bit */ \
|
||||
" .hword " __stringify(cpucap) "\n" /* cpucap */ \
|
||||
" .byte 662b-661b\n" /* source len */ \
|
||||
" .byte 664f-663f\n" /* replacement len */
|
||||
|
||||
#define ALTINSTR_ENTRY_CB(feature, cb) \
|
||||
#define ALTINSTR_ENTRY_CB(cpucap, cb) \
|
||||
" .word 661b - .\n" /* label */ \
|
||||
" .word " __stringify(cb) "- .\n" /* callback */ \
|
||||
" .hword " __stringify(feature) "\n" /* feature bit */ \
|
||||
" .word " __stringify(cb) "- .\n" /* callback */ \
|
||||
" .hword " __stringify(cpucap) "\n" /* cpucap */ \
|
||||
" .byte 662b-661b\n" /* source len */ \
|
||||
" .byte 664f-663f\n" /* replacement len */
|
||||
|
||||
@@ -53,13 +53,13 @@
|
||||
*
|
||||
* Alternatives with callbacks do not generate replacement instructions.
|
||||
*/
|
||||
#define __ALTERNATIVE_CFG(oldinstr, newinstr, feature, cfg_enabled) \
|
||||
#define __ALTERNATIVE_CFG(oldinstr, newinstr, cpucap, cfg_enabled) \
|
||||
".if "__stringify(cfg_enabled)" == 1\n" \
|
||||
"661:\n\t" \
|
||||
oldinstr "\n" \
|
||||
"662:\n" \
|
||||
".pushsection .altinstructions,\"a\"\n" \
|
||||
ALTINSTR_ENTRY(feature) \
|
||||
ALTINSTR_ENTRY(cpucap) \
|
||||
".popsection\n" \
|
||||
".subsection 1\n" \
|
||||
"663:\n\t" \
|
||||
@@ -70,31 +70,31 @@
|
||||
".previous\n" \
|
||||
".endif\n"
|
||||
|
||||
#define __ALTERNATIVE_CFG_CB(oldinstr, feature, cfg_enabled, cb) \
|
||||
#define __ALTERNATIVE_CFG_CB(oldinstr, cpucap, cfg_enabled, cb) \
|
||||
".if "__stringify(cfg_enabled)" == 1\n" \
|
||||
"661:\n\t" \
|
||||
oldinstr "\n" \
|
||||
"662:\n" \
|
||||
".pushsection .altinstructions,\"a\"\n" \
|
||||
ALTINSTR_ENTRY_CB(feature, cb) \
|
||||
ALTINSTR_ENTRY_CB(cpucap, cb) \
|
||||
".popsection\n" \
|
||||
"663:\n\t" \
|
||||
"664:\n\t" \
|
||||
".endif\n"
|
||||
|
||||
#define _ALTERNATIVE_CFG(oldinstr, newinstr, feature, cfg, ...) \
|
||||
__ALTERNATIVE_CFG(oldinstr, newinstr, feature, IS_ENABLED(cfg))
|
||||
#define _ALTERNATIVE_CFG(oldinstr, newinstr, cpucap, cfg, ...) \
|
||||
__ALTERNATIVE_CFG(oldinstr, newinstr, cpucap, IS_ENABLED(cfg))
|
||||
|
||||
#define ALTERNATIVE_CB(oldinstr, feature, cb) \
|
||||
__ALTERNATIVE_CFG_CB(oldinstr, (1 << ARM64_CB_SHIFT) | (feature), 1, cb)
|
||||
#define ALTERNATIVE_CB(oldinstr, cpucap, cb) \
|
||||
__ALTERNATIVE_CFG_CB(oldinstr, (1 << ARM64_CB_SHIFT) | (cpucap), 1, cb)
|
||||
#else
|
||||
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.macro altinstruction_entry orig_offset alt_offset feature orig_len alt_len
|
||||
.macro altinstruction_entry orig_offset alt_offset cpucap orig_len alt_len
|
||||
.word \orig_offset - .
|
||||
.word \alt_offset - .
|
||||
.hword (\feature)
|
||||
.hword (\cpucap)
|
||||
.byte \orig_len
|
||||
.byte \alt_len
|
||||
.endm
|
||||
@@ -210,9 +210,9 @@ alternative_endif
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
* Usage: asm(ALTERNATIVE(oldinstr, newinstr, feature));
|
||||
* Usage: asm(ALTERNATIVE(oldinstr, newinstr, cpucap));
|
||||
*
|
||||
* Usage: asm(ALTERNATIVE(oldinstr, newinstr, feature, CONFIG_FOO));
|
||||
* Usage: asm(ALTERNATIVE(oldinstr, newinstr, cpucap, CONFIG_FOO));
|
||||
* N.B. If CONFIG_FOO is specified, but not selected, the whole block
|
||||
* will be omitted, including oldinstr.
|
||||
*/
|
||||
@@ -224,15 +224,15 @@ alternative_endif
|
||||
#include <linux/types.h>
|
||||
|
||||
static __always_inline bool
|
||||
alternative_has_feature_likely(const unsigned long feature)
|
||||
alternative_has_cap_likely(const unsigned long cpucap)
|
||||
{
|
||||
compiletime_assert(feature < ARM64_NCAPS,
|
||||
"feature must be < ARM64_NCAPS");
|
||||
compiletime_assert(cpucap < ARM64_NCAPS,
|
||||
"cpucap must be < ARM64_NCAPS");
|
||||
|
||||
asm_volatile_goto(
|
||||
ALTERNATIVE_CB("b %l[l_no]", %[feature], alt_cb_patch_nops)
|
||||
ALTERNATIVE_CB("b %l[l_no]", %[cpucap], alt_cb_patch_nops)
|
||||
:
|
||||
: [feature] "i" (feature)
|
||||
: [cpucap] "i" (cpucap)
|
||||
:
|
||||
: l_no);
|
||||
|
||||
@@ -242,15 +242,15 @@ l_no:
|
||||
}
|
||||
|
||||
static __always_inline bool
|
||||
alternative_has_feature_unlikely(const unsigned long feature)
|
||||
alternative_has_cap_unlikely(const unsigned long cpucap)
|
||||
{
|
||||
compiletime_assert(feature < ARM64_NCAPS,
|
||||
"feature must be < ARM64_NCAPS");
|
||||
compiletime_assert(cpucap < ARM64_NCAPS,
|
||||
"cpucap must be < ARM64_NCAPS");
|
||||
|
||||
asm_volatile_goto(
|
||||
ALTERNATIVE("nop", "b %l[l_yes]", %[feature])
|
||||
ALTERNATIVE("nop", "b %l[l_yes]", %[cpucap])
|
||||
:
|
||||
: [feature] "i" (feature)
|
||||
: [cpucap] "i" (cpucap)
|
||||
:
|
||||
: l_yes);
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
struct alt_instr {
|
||||
s32 orig_offset; /* offset to original instruction */
|
||||
s32 alt_offset; /* offset to replacement instruction */
|
||||
u16 cpufeature; /* cpufeature bit set for replacement */
|
||||
u16 cpucap; /* cpucap bit set for replacement */
|
||||
u8 orig_len; /* size of original instruction(s) */
|
||||
u8 alt_len; /* size of new instruction(s), <= orig_len */
|
||||
};
|
||||
@@ -23,7 +23,7 @@ typedef void (*alternative_cb_t)(struct alt_instr *alt,
|
||||
|
||||
void __init apply_boot_alternatives(void);
|
||||
void __init apply_alternatives_all(void);
|
||||
bool alternative_is_applied(u16 cpufeature);
|
||||
bool alternative_is_applied(u16 cpucap);
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
void apply_alternatives_module(void *start, size_t length);
|
||||
@@ -31,5 +31,8 @@ void apply_alternatives_module(void *start, size_t length);
|
||||
static inline void apply_alternatives_module(void *start, size_t length) { }
|
||||
#endif
|
||||
|
||||
void alt_cb_patch_nops(struct alt_instr *alt, __le32 *origptr,
|
||||
__le32 *updptr, int nr_inst);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASM_ALTERNATIVE_H */
|
||||
|
||||
@@ -129,4 +129,6 @@ 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 */
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
bic \tmp1, \tmp1, #TTBR_ASID_MASK
|
||||
sub \tmp1, \tmp1, #RESERVED_SWAPPER_OFFSET // reserved_pg_dir
|
||||
msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1
|
||||
isb
|
||||
add \tmp1, \tmp1, #RESERVED_SWAPPER_OFFSET
|
||||
msr ttbr1_el1, \tmp1 // set reserved ASID
|
||||
isb
|
||||
@@ -31,7 +30,6 @@
|
||||
extr \tmp2, \tmp2, \tmp1, #48
|
||||
ror \tmp2, \tmp2, #16
|
||||
msr ttbr1_el1, \tmp2 // set the active ASID
|
||||
isb
|
||||
msr ttbr0_el1, \tmp1 // set the non-PAN TTBR0_EL1
|
||||
isb
|
||||
.endm
|
||||
|
||||
@@ -96,6 +96,8 @@ static inline int is_compat_thread(struct thread_info *thread)
|
||||
return test_ti_thread_flag(thread, TIF_32BIT);
|
||||
}
|
||||
|
||||
long compat_arm_syscall(struct pt_regs *regs, int scno);
|
||||
|
||||
#else /* !CONFIG_COMPAT */
|
||||
|
||||
static inline int is_compat_thread(struct thread_info *thread)
|
||||
|
||||
@@ -107,7 +107,7 @@ extern struct arm64_ftr_reg arm64_ftr_reg_ctrel0;
|
||||
* CPU capabilities:
|
||||
*
|
||||
* We use arm64_cpu_capabilities to represent system features, errata work
|
||||
* arounds (both used internally by kernel and tracked in cpu_hwcaps) and
|
||||
* arounds (both used internally by kernel and tracked in system_cpucaps) and
|
||||
* ELF HWCAPs (which are exposed to user).
|
||||
*
|
||||
* To support systems with heterogeneous CPUs, we need to make sure that we
|
||||
@@ -419,12 +419,12 @@ static __always_inline bool is_hyp_code(void)
|
||||
return is_vhe_hyp_code() || is_nvhe_hyp_code();
|
||||
}
|
||||
|
||||
extern DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS);
|
||||
extern DECLARE_BITMAP(system_cpucaps, ARM64_NCAPS);
|
||||
|
||||
extern DECLARE_BITMAP(boot_capabilities, ARM64_NCAPS);
|
||||
extern DECLARE_BITMAP(boot_cpucaps, ARM64_NCAPS);
|
||||
|
||||
#define for_each_available_cap(cap) \
|
||||
for_each_set_bit(cap, cpu_hwcaps, ARM64_NCAPS)
|
||||
for_each_set_bit(cap, system_cpucaps, ARM64_NCAPS)
|
||||
|
||||
bool this_cpu_has_cap(unsigned int cap);
|
||||
void cpu_set_feature(unsigned int num);
|
||||
@@ -437,7 +437,7 @@ unsigned long cpu_get_elf_hwcap2(void);
|
||||
|
||||
static __always_inline bool system_capabilities_finalized(void)
|
||||
{
|
||||
return alternative_has_feature_likely(ARM64_ALWAYS_SYSTEM);
|
||||
return alternative_has_cap_likely(ARM64_ALWAYS_SYSTEM);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -449,7 +449,7 @@ static __always_inline bool cpus_have_cap(unsigned int num)
|
||||
{
|
||||
if (num >= ARM64_NCAPS)
|
||||
return false;
|
||||
return arch_test_bit(num, cpu_hwcaps);
|
||||
return arch_test_bit(num, system_cpucaps);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -464,7 +464,7 @@ static __always_inline bool __cpus_have_const_cap(int num)
|
||||
{
|
||||
if (num >= ARM64_NCAPS)
|
||||
return false;
|
||||
return alternative_has_feature_unlikely(num);
|
||||
return alternative_has_cap_unlikely(num);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -504,16 +504,6 @@ static __always_inline bool cpus_have_const_cap(int num)
|
||||
return cpus_have_cap(num);
|
||||
}
|
||||
|
||||
static inline void cpus_set_cap(unsigned int num)
|
||||
{
|
||||
if (num >= ARM64_NCAPS) {
|
||||
pr_warn("Attempt to set an illegal CPU capability (%d >= %d)\n",
|
||||
num, ARM64_NCAPS);
|
||||
} else {
|
||||
__set_bit(num, cpu_hwcaps);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int __attribute_const__
|
||||
cpuid_feature_extract_signed_field_width(u64 features, int field, int width)
|
||||
{
|
||||
|
||||
@@ -166,4 +166,6 @@ static inline void efi_capsule_flush_cache_range(void *addr, int size)
|
||||
dcache_clean_inval_poc((unsigned long)addr, (unsigned long)addr + size);
|
||||
}
|
||||
|
||||
efi_status_t efi_handle_corrupted_x18(efi_status_t s, const char *f);
|
||||
|
||||
#endif /* _ASM_EFI_H */
|
||||
|
||||
@@ -22,6 +22,15 @@
|
||||
isb
|
||||
.endm
|
||||
|
||||
.macro __init_el2_hcrx
|
||||
mrs x0, id_aa64mmfr1_el1
|
||||
ubfx x0, x0, #ID_AA64MMFR1_EL1_HCX_SHIFT, #4
|
||||
cbz x0, .Lskip_hcrx_\@
|
||||
mov_q x0, HCRX_HOST_FLAGS
|
||||
msr_s SYS_HCRX_EL2, x0
|
||||
.Lskip_hcrx_\@:
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Allow Non-secure EL1 and EL0 to access physical timer and counter.
|
||||
* This is not necessary for VHE, since the host kernel runs in EL2,
|
||||
@@ -69,7 +78,7 @@
|
||||
cbz x0, .Lskip_trace_\@ // Skip if TraceBuffer is not present
|
||||
|
||||
mrs_s x0, SYS_TRBIDR_EL1
|
||||
and x0, x0, TRBIDR_PROG
|
||||
and x0, x0, TRBIDR_EL1_P
|
||||
cbnz x0, .Lskip_trace_\@ // If TRBE is available at EL2
|
||||
|
||||
mov x0, #(MDCR_EL2_E2TB_MASK << MDCR_EL2_E2TB_SHIFT)
|
||||
@@ -184,6 +193,7 @@
|
||||
*/
|
||||
.macro init_el2_state
|
||||
__init_el2_sctlr
|
||||
__init_el2_hcrx
|
||||
__init_el2_timers
|
||||
__init_el2_debug
|
||||
__init_el2_lor
|
||||
@@ -284,14 +294,6 @@
|
||||
cbz x1, .Lskip_sme_\@
|
||||
|
||||
msr_s SYS_SMPRIMAP_EL2, xzr // Make all priorities equal
|
||||
|
||||
mrs x1, id_aa64mmfr1_el1 // HCRX_EL2 present?
|
||||
ubfx x1, x1, #ID_AA64MMFR1_EL1_HCX_SHIFT, #4
|
||||
cbz x1, .Lskip_sme_\@
|
||||
|
||||
mrs_s x1, SYS_HCRX_EL2
|
||||
orr x1, x1, #HCRX_EL2_SMPME_MASK // Enable priority mapping
|
||||
msr_s SYS_HCRX_EL2, x1
|
||||
.Lskip_sme_\@:
|
||||
.endm
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
#define ESR_ELx_EC_DABT_LOW (0x24)
|
||||
#define ESR_ELx_EC_DABT_CUR (0x25)
|
||||
#define ESR_ELx_EC_SP_ALIGN (0x26)
|
||||
/* Unallocated EC: 0x27 */
|
||||
#define ESR_ELx_EC_MOPS (0x27)
|
||||
#define ESR_ELx_EC_FP_EXC32 (0x28)
|
||||
/* Unallocated EC: 0x29 - 0x2B */
|
||||
#define ESR_ELx_EC_FP_EXC64 (0x2C)
|
||||
@@ -75,8 +75,11 @@
|
||||
|
||||
#define ESR_ELx_IL_SHIFT (25)
|
||||
#define ESR_ELx_IL (UL(1) << ESR_ELx_IL_SHIFT)
|
||||
#define ESR_ELx_ISS_MASK (ESR_ELx_IL - 1)
|
||||
#define ESR_ELx_ISS_MASK (GENMASK(24, 0))
|
||||
#define ESR_ELx_ISS(esr) ((esr) & ESR_ELx_ISS_MASK)
|
||||
#define ESR_ELx_ISS2_SHIFT (32)
|
||||
#define ESR_ELx_ISS2_MASK (GENMASK_ULL(55, 32))
|
||||
#define ESR_ELx_ISS2(esr) (((esr) & ESR_ELx_ISS2_MASK) >> ESR_ELx_ISS2_SHIFT)
|
||||
|
||||
/* ISS field definitions shared by different classes */
|
||||
#define ESR_ELx_WNR_SHIFT (6)
|
||||
@@ -140,6 +143,20 @@
|
||||
#define ESR_ELx_CM_SHIFT (8)
|
||||
#define ESR_ELx_CM (UL(1) << ESR_ELx_CM_SHIFT)
|
||||
|
||||
/* ISS2 field definitions for Data Aborts */
|
||||
#define ESR_ELx_TnD_SHIFT (10)
|
||||
#define ESR_ELx_TnD (UL(1) << ESR_ELx_TnD_SHIFT)
|
||||
#define ESR_ELx_TagAccess_SHIFT (9)
|
||||
#define ESR_ELx_TagAccess (UL(1) << ESR_ELx_TagAccess_SHIFT)
|
||||
#define ESR_ELx_GCS_SHIFT (8)
|
||||
#define ESR_ELx_GCS (UL(1) << ESR_ELx_GCS_SHIFT)
|
||||
#define ESR_ELx_Overlay_SHIFT (6)
|
||||
#define ESR_ELx_Overlay (UL(1) << ESR_ELx_Overlay_SHIFT)
|
||||
#define ESR_ELx_DirtyBit_SHIFT (5)
|
||||
#define ESR_ELx_DirtyBit (UL(1) << ESR_ELx_DirtyBit_SHIFT)
|
||||
#define ESR_ELx_Xs_SHIFT (0)
|
||||
#define ESR_ELx_Xs_MASK (GENMASK_ULL(4, 0))
|
||||
|
||||
/* ISS field definitions for exceptions taken in to Hyp */
|
||||
#define ESR_ELx_CV (UL(1) << 24)
|
||||
#define ESR_ELx_COND_SHIFT (20)
|
||||
@@ -356,6 +373,15 @@
|
||||
#define ESR_ELx_SME_ISS_ZA_DISABLED 3
|
||||
#define ESR_ELx_SME_ISS_ZT_DISABLED 4
|
||||
|
||||
/* ISS field definitions for MOPS exceptions */
|
||||
#define ESR_ELx_MOPS_ISS_MEM_INST (UL(1) << 24)
|
||||
#define ESR_ELx_MOPS_ISS_FROM_EPILOGUE (UL(1) << 18)
|
||||
#define ESR_ELx_MOPS_ISS_WRONG_OPTION (UL(1) << 17)
|
||||
#define ESR_ELx_MOPS_ISS_OPTION_A (UL(1) << 16)
|
||||
#define ESR_ELx_MOPS_ISS_DESTREG(esr) (((esr) & (UL(0x1f) << 10)) >> 10)
|
||||
#define ESR_ELx_MOPS_ISS_SRCREG(esr) (((esr) & (UL(0x1f) << 5)) >> 5)
|
||||
#define ESR_ELx_MOPS_ISS_SIZEREG(esr) (((esr) & (UL(0x1f) << 0)) >> 0)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/types.h>
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user