检测 ARM 指令集版本?

Detect ARM instruction-set version?

我正在编写一段代码,根据不同供应商实现的不同版本的指令集,它的行为可能会有所不同。 这些是ARMv8指令集的不同版本,如ARM v8.1、v8.2、v8.6。

是否有任何寄存器可以在运行时告知在 ARM cpu 上实现的 ARM 指令集 (ARMv8) 的版本?

首先,没有直接提供实现的Arm指令集版本的寄存器。其次,可以查询使用ID_*开头的寄存器实现的特性。 例如,ID_AA64ISAR0_EL1 有 AES 字段,它告诉 AES=1/2 那么 AES 指令被实现,ID_AA64PFR0_EL1.FP 告诉浮点运算是否被实现。

如果实现符合或实现 Arm V8.2,则需要实现一组强制性功能。这在 Arm 参考手册的 A2 章中有描述。例如,如果您想知道是否存在 V8.6,那么 Fine Grain Trap 和 Enhanced Counter Virtualization 是必须实施的功能。 ID_AA64MMFR0_EL1.{FGT, ECV } 字段会告诉您这些功能的存在,如果存在,那么您可以说 Arm V8.6 指令集已实现

MIDR_EL1 寄存器有字段“Architecture”,它可能被设置为 0x1111,表示可以使用 ID_* 寄存器了解实现的功能。该寄存器中的其他字段是 IMPLEMENTATION_DEFINED 值,可以设置为零。 Apple 可能选择将“Architecuture”字段设置为零,因此您看到 MIDR_EL1 的值为零。