在从arm64-stub.c 中会进行pagesize的check,从arm64 spec来看,arm64主要支持4k/16/64 这三种pagesize
efi_status_t check_platform_features(efi_system_table_t *sys_table_arg)
{
u64 tg;
/* UEFI mandates support for 4 KB granularity, no need to check */
if (IS_ENABLED(CONFIG_ARM64_4K_PAGES))
return EFI_SUCCESS;
tg = (read_cpuid(ID_AA64MMFR0_EL1) >> ID_AA64MMFR0_TGRAN_SHIFT) & 0xf;
if (tg != ID_AA64MMFR0_TGRAN_SUPPORTED) {
if (IS_ENABLED(CONFIG_ARM64_64K_PAGES))
pr_efi_err(sys_table_arg, "This 64 KB granular kernel is not supported by your CPU\n");
else
pr_efi_err(sys_table_arg, "This 16 KB granular kernel is not supported by your CPU\n");
return EFI_UNSUPPORTED;
}
return EFI_SUCCESS;
}
从check_platform_features 中可以看出如果是4k直接返回success,否则就要读取ID_AA64MMFR0_EL1,这个时候pagesize 就是根据ID_AA64MMFR0_EL1来决定是否是16/64k的,
可见[23:20] TGran16 表示16k
[27:24] TGran64 表示64k
[31:28] TGran4 表示4k
Table 4.56. ID_AA64MMFR0_EL1 bit assignments
Bits Name Function
[63:32] -
Reserved, res0.
[31:28] TGran4
Support for 4 KB memory translation granule size:
0x0
Indicates that the 4KB granule is supported.
[27:24] TGran64
Support for 64 KB memory translation granule size:
0x0
Indicates that the 64KB granule is supported.
[23:20] TGran16
Support for 16 KB memory translation granule size:
0x0
Indicates that the 16KB granule is not supported.
[19:16] BigEndEL0
Mixed-endian support only at EL0.
res0
[15:12] SNSMem
Secure versus Non-secure Memory distinction:
0b0001
Supports a distinction between Secure and Non-secure Memory.
[11:8] BigEnd
Mixed-endian configuration support:
0b0001
Mixed-endian support. The SCTLR_ELx.EE and SCTLR_EL1.E0E bits are RW.
[7:4] ASIDBits
Number of ASID bits:
0b0010
16 bits.
[3:0] PARange
Physical address range supported:
0b0010
40 bits, 1 TB.
#define ID_AA64MMFR0_TGRAN4_SHIFT 28
#define ID_AA64MMFR0_TGRAN64_SHIFT 24
#define ID_AA64MMFR0_TGRAN16_SHIFT 20
从kernel中的定义也可以看出
#if defined(CONFIG_ARM64_4K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN4_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN4_SUPPORTED
#elif defined(CONFIG_ARM64_16K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN16_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN16_SUPPORTED
#elif defined(CONFIG_ARM64_64K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN64_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN64_SUPPORTED
#endif
efi_status_t check_platform_features(efi_system_table_t *sys_table_arg)
{
u64 tg;
/* UEFI mandates support for 4 KB granularity, no need to check */
if (IS_ENABLED(CONFIG_ARM64_4K_PAGES))
return EFI_SUCCESS;
tg = (read_cpuid(ID_AA64MMFR0_EL1) >> ID_AA64MMFR0_TGRAN_SHIFT) & 0xf;
if (tg != ID_AA64MMFR0_TGRAN_SUPPORTED) {
if (IS_ENABLED(CONFIG_ARM64_64K_PAGES))
pr_efi_err(sys_table_arg, "This 64 KB granular kernel is not supported by your CPU\n");
else
pr_efi_err(sys_table_arg, "This 16 KB granular kernel is not supported by your CPU\n");
return EFI_UNSUPPORTED;
}
return EFI_SUCCESS;
}
从check_platform_features 中可以看出如果是4k直接返回success,否则就要读取ID_AA64MMFR0_EL1,这个时候pagesize 就是根据ID_AA64MMFR0_EL1来决定是否是16/64k的,
可见[23:20] TGran16 表示16k
[27:24] TGran64 表示64k
[31:28] TGran4 表示4k
Table 4.56. ID_AA64MMFR0_EL1 bit assignments
Bits Name Function
[63:32] -
Reserved, res0.
[31:28] TGran4
Support for 4 KB memory translation granule size:
0x0
Indicates that the 4KB granule is supported.
[27:24] TGran64
Support for 64 KB memory translation granule size:
0x0
Indicates that the 64KB granule is supported.
[23:20] TGran16
Support for 16 KB memory translation granule size:
0x0
Indicates that the 16KB granule is not supported.
[19:16] BigEndEL0
Mixed-endian support only at EL0.
res0
[15:12] SNSMem
Secure versus Non-secure Memory distinction:
0b0001
Supports a distinction between Secure and Non-secure Memory.
[11:8] BigEnd
Mixed-endian configuration support:
0b0001
Mixed-endian support. The SCTLR_ELx.EE and SCTLR_EL1.E0E bits are RW.
[7:4] ASIDBits
Number of ASID bits:
0b0010
16 bits.
[3:0] PARange
Physical address range supported:
0b0010
40 bits, 1 TB.
#define ID_AA64MMFR0_TGRAN4_SHIFT 28
#define ID_AA64MMFR0_TGRAN64_SHIFT 24
#define ID_AA64MMFR0_TGRAN16_SHIFT 20
从kernel中的定义也可以看出
#if defined(CONFIG_ARM64_4K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN4_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN4_SUPPORTED
#elif defined(CONFIG_ARM64_16K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN16_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN16_SUPPORTED
#elif defined(CONFIG_ARM64_64K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT ID_AA64MMFR0_TGRAN64_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED ID_AA64MMFR0_TGRAN64_SUPPORTED
#endif