Merge branch 'for-next/sysreg' into for-next/core
* for-next/sysreg: : arm64 sysreg updates/cleanups arm64/sysreg: Remove unused define ARM64_FEATURE_FIELD_BITS KVM: arm64: selftests: Consider all 7 possible levels of cache KVM: arm64: selftests: Remove ARM64_FEATURE_FIELD_BITS and its last user arm64/sysreg: Add ICH_VMCR_EL2 arm64/sysreg: Move generation of RES0/RES1/UNKN to function arm64/sysreg: Support feature-specific fields with 'Prefix' descriptor arm64/sysreg: Fix checks for incomplete sysreg definitions arm64/sysreg: Replace TCR_EL1 field macros
This commit is contained in:
commit
52c4d1d624
|
|
@ -325,14 +325,14 @@ alternative_cb_end
|
|||
* tcr_set_t0sz - update TCR.T0SZ so that we can load the ID map
|
||||
*/
|
||||
.macro tcr_set_t0sz, valreg, t0sz
|
||||
bfi \valreg, \t0sz, #TCR_T0SZ_OFFSET, #TCR_TxSZ_WIDTH
|
||||
bfi \valreg, \t0sz, #TCR_EL1_T0SZ_SHIFT, #TCR_EL1_T0SZ_WIDTH
|
||||
.endm
|
||||
|
||||
/*
|
||||
* tcr_set_t1sz - update TCR.T1SZ
|
||||
*/
|
||||
.macro tcr_set_t1sz, valreg, t1sz
|
||||
bfi \valreg, \t1sz, #TCR_T1SZ_OFFSET, #TCR_TxSZ_WIDTH
|
||||
bfi \valreg, \t1sz, #TCR_EL1_T1SZ_SHIFT, #TCR_EL1_T1SZ_WIDTH
|
||||
.endm
|
||||
|
||||
/*
|
||||
|
|
@ -589,7 +589,7 @@ alternative_endif
|
|||
.macro offset_ttbr1, ttbr, tmp
|
||||
#if defined(CONFIG_ARM64_VA_BITS_52) && !defined(CONFIG_ARM64_LPA2)
|
||||
mrs \tmp, tcr_el1
|
||||
and \tmp, \tmp, #TCR_T1SZ_MASK
|
||||
and \tmp, \tmp, #TCR_EL1_T1SZ_MASK
|
||||
cmp \tmp, #TCR_T1SZ(VA_BITS_MIN)
|
||||
orr \tmp, \ttbr, #TTBR1_BADDR_4852_OFFSET
|
||||
csel \ttbr, \tmp, \ttbr, eq
|
||||
|
|
|
|||
|
|
@ -247,7 +247,7 @@
|
|||
/* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */
|
||||
#define MIDR_FUJITSU_ERRATUM_010001 MIDR_FUJITSU_A64FX
|
||||
#define MIDR_FUJITSU_ERRATUM_010001_MASK (~MIDR_CPU_VAR_REV(1, 0))
|
||||
#define TCR_CLEAR_FUJITSU_ERRATUM_010001 (TCR_NFD1 | TCR_NFD0)
|
||||
#define TCR_CLEAR_FUJITSU_ERRATUM_010001 (TCR_EL1_NFD1 | TCR_EL1_NFD0)
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
|
|
|
|||
|
|
@ -68,10 +68,10 @@ static inline void __cpu_set_tcr_t0sz(unsigned long t0sz)
|
|||
{
|
||||
unsigned long tcr = read_sysreg(tcr_el1);
|
||||
|
||||
if ((tcr & TCR_T0SZ_MASK) == t0sz)
|
||||
if ((tcr & TCR_EL1_T0SZ_MASK) == t0sz)
|
||||
return;
|
||||
|
||||
tcr &= ~TCR_T0SZ_MASK;
|
||||
tcr &= ~TCR_EL1_T0SZ_MASK;
|
||||
tcr |= t0sz;
|
||||
write_sysreg(tcr, tcr_el1);
|
||||
isb();
|
||||
|
|
|
|||
|
|
@ -228,102 +228,53 @@
|
|||
/*
|
||||
* TCR flags.
|
||||
*/
|
||||
#define TCR_T0SZ_OFFSET 0
|
||||
#define TCR_T1SZ_OFFSET 16
|
||||
#define TCR_T0SZ(x) ((UL(64) - (x)) << TCR_T0SZ_OFFSET)
|
||||
#define TCR_T1SZ(x) ((UL(64) - (x)) << TCR_T1SZ_OFFSET)
|
||||
#define TCR_TxSZ(x) (TCR_T0SZ(x) | TCR_T1SZ(x))
|
||||
#define TCR_TxSZ_WIDTH 6
|
||||
#define TCR_T0SZ_MASK (((UL(1) << TCR_TxSZ_WIDTH) - 1) << TCR_T0SZ_OFFSET)
|
||||
#define TCR_T1SZ_MASK (((UL(1) << TCR_TxSZ_WIDTH) - 1) << TCR_T1SZ_OFFSET)
|
||||
#define TCR_T0SZ(x) ((UL(64) - (x)) << TCR_EL1_T0SZ_SHIFT)
|
||||
#define TCR_T1SZ(x) ((UL(64) - (x)) << TCR_EL1_T1SZ_SHIFT)
|
||||
|
||||
#define TCR_EPD0_SHIFT 7
|
||||
#define TCR_EPD0_MASK (UL(1) << TCR_EPD0_SHIFT)
|
||||
#define TCR_IRGN0_SHIFT 8
|
||||
#define TCR_IRGN0_MASK (UL(3) << TCR_IRGN0_SHIFT)
|
||||
#define TCR_IRGN0_NC (UL(0) << TCR_IRGN0_SHIFT)
|
||||
#define TCR_IRGN0_WBWA (UL(1) << TCR_IRGN0_SHIFT)
|
||||
#define TCR_IRGN0_WT (UL(2) << TCR_IRGN0_SHIFT)
|
||||
#define TCR_IRGN0_WBnWA (UL(3) << TCR_IRGN0_SHIFT)
|
||||
#define TCR_T0SZ_MASK TCR_EL1_T0SZ_MASK
|
||||
#define TCR_T1SZ_MASK TCR_EL1_T1SZ_MASK
|
||||
|
||||
#define TCR_EPD1_SHIFT 23
|
||||
#define TCR_EPD1_MASK (UL(1) << TCR_EPD1_SHIFT)
|
||||
#define TCR_IRGN1_SHIFT 24
|
||||
#define TCR_IRGN1_MASK (UL(3) << TCR_IRGN1_SHIFT)
|
||||
#define TCR_IRGN1_NC (UL(0) << TCR_IRGN1_SHIFT)
|
||||
#define TCR_IRGN1_WBWA (UL(1) << TCR_IRGN1_SHIFT)
|
||||
#define TCR_IRGN1_WT (UL(2) << TCR_IRGN1_SHIFT)
|
||||
#define TCR_IRGN1_WBnWA (UL(3) << TCR_IRGN1_SHIFT)
|
||||
#define TCR_EPD0_MASK TCR_EL1_EPD0_MASK
|
||||
#define TCR_EPD1_MASK TCR_EL1_EPD1_MASK
|
||||
|
||||
#define TCR_IRGN_NC (TCR_IRGN0_NC | TCR_IRGN1_NC)
|
||||
#define TCR_IRGN_WBWA (TCR_IRGN0_WBWA | TCR_IRGN1_WBWA)
|
||||
#define TCR_IRGN_WT (TCR_IRGN0_WT | TCR_IRGN1_WT)
|
||||
#define TCR_IRGN_WBnWA (TCR_IRGN0_WBnWA | TCR_IRGN1_WBnWA)
|
||||
#define TCR_IRGN_MASK (TCR_IRGN0_MASK | TCR_IRGN1_MASK)
|
||||
#define TCR_IRGN0_MASK TCR_EL1_IRGN0_MASK
|
||||
#define TCR_IRGN0_WBWA (TCR_EL1_IRGN0_WBWA << TCR_EL1_IRGN0_SHIFT)
|
||||
|
||||
#define TCR_ORGN0_MASK TCR_EL1_ORGN0_MASK
|
||||
#define TCR_ORGN0_WBWA (TCR_EL1_ORGN0_WBWA << TCR_EL1_ORGN0_SHIFT)
|
||||
|
||||
#define TCR_ORGN0_SHIFT 10
|
||||
#define TCR_ORGN0_MASK (UL(3) << TCR_ORGN0_SHIFT)
|
||||
#define TCR_ORGN0_NC (UL(0) << TCR_ORGN0_SHIFT)
|
||||
#define TCR_ORGN0_WBWA (UL(1) << TCR_ORGN0_SHIFT)
|
||||
#define TCR_ORGN0_WT (UL(2) << TCR_ORGN0_SHIFT)
|
||||
#define TCR_ORGN0_WBnWA (UL(3) << TCR_ORGN0_SHIFT)
|
||||
#define TCR_SH0_MASK TCR_EL1_SH0_MASK
|
||||
#define TCR_SH0_INNER (TCR_EL1_SH0_INNER << TCR_EL1_SH0_SHIFT)
|
||||
|
||||
#define TCR_ORGN1_SHIFT 26
|
||||
#define TCR_ORGN1_MASK (UL(3) << TCR_ORGN1_SHIFT)
|
||||
#define TCR_ORGN1_NC (UL(0) << TCR_ORGN1_SHIFT)
|
||||
#define TCR_ORGN1_WBWA (UL(1) << TCR_ORGN1_SHIFT)
|
||||
#define TCR_ORGN1_WT (UL(2) << TCR_ORGN1_SHIFT)
|
||||
#define TCR_ORGN1_WBnWA (UL(3) << TCR_ORGN1_SHIFT)
|
||||
#define TCR_SH1_MASK TCR_EL1_SH1_MASK
|
||||
|
||||
#define TCR_ORGN_NC (TCR_ORGN0_NC | TCR_ORGN1_NC)
|
||||
#define TCR_ORGN_WBWA (TCR_ORGN0_WBWA | TCR_ORGN1_WBWA)
|
||||
#define TCR_ORGN_WT (TCR_ORGN0_WT | TCR_ORGN1_WT)
|
||||
#define TCR_ORGN_WBnWA (TCR_ORGN0_WBnWA | TCR_ORGN1_WBnWA)
|
||||
#define TCR_ORGN_MASK (TCR_ORGN0_MASK | TCR_ORGN1_MASK)
|
||||
#define TCR_TG0_SHIFT TCR_EL1_TG0_SHIFT
|
||||
#define TCR_TG0_MASK TCR_EL1_TG0_MASK
|
||||
#define TCR_TG0_4K (TCR_EL1_TG0_4K << TCR_EL1_TG0_SHIFT)
|
||||
#define TCR_TG0_64K (TCR_EL1_TG0_64K << TCR_EL1_TG0_SHIFT)
|
||||
#define TCR_TG0_16K (TCR_EL1_TG0_16K << TCR_EL1_TG0_SHIFT)
|
||||
|
||||
#define TCR_SH0_SHIFT 12
|
||||
#define TCR_SH0_MASK (UL(3) << TCR_SH0_SHIFT)
|
||||
#define TCR_SH0_INNER (UL(3) << TCR_SH0_SHIFT)
|
||||
#define TCR_TG1_SHIFT TCR_EL1_TG1_SHIFT
|
||||
#define TCR_TG1_MASK TCR_EL1_TG1_MASK
|
||||
#define TCR_TG1_16K (TCR_EL1_TG1_16K << TCR_EL1_TG1_SHIFT)
|
||||
#define TCR_TG1_4K (TCR_EL1_TG1_4K << TCR_EL1_TG1_SHIFT)
|
||||
#define TCR_TG1_64K (TCR_EL1_TG1_64K << TCR_EL1_TG1_SHIFT)
|
||||
|
||||
#define TCR_SH1_SHIFT 28
|
||||
#define TCR_SH1_MASK (UL(3) << TCR_SH1_SHIFT)
|
||||
#define TCR_SH1_INNER (UL(3) << TCR_SH1_SHIFT)
|
||||
#define TCR_SHARED (TCR_SH0_INNER | TCR_SH1_INNER)
|
||||
|
||||
#define TCR_TG0_SHIFT 14
|
||||
#define TCR_TG0_MASK (UL(3) << TCR_TG0_SHIFT)
|
||||
#define TCR_TG0_4K (UL(0) << TCR_TG0_SHIFT)
|
||||
#define TCR_TG0_64K (UL(1) << TCR_TG0_SHIFT)
|
||||
#define TCR_TG0_16K (UL(2) << TCR_TG0_SHIFT)
|
||||
|
||||
#define TCR_TG1_SHIFT 30
|
||||
#define TCR_TG1_MASK (UL(3) << TCR_TG1_SHIFT)
|
||||
#define TCR_TG1_16K (UL(1) << TCR_TG1_SHIFT)
|
||||
#define TCR_TG1_4K (UL(2) << TCR_TG1_SHIFT)
|
||||
#define TCR_TG1_64K (UL(3) << TCR_TG1_SHIFT)
|
||||
|
||||
#define TCR_IPS_SHIFT 32
|
||||
#define TCR_IPS_MASK (UL(7) << TCR_IPS_SHIFT)
|
||||
#define TCR_A1 (UL(1) << 22)
|
||||
#define TCR_ASID16 (UL(1) << 36)
|
||||
#define TCR_TBI0 (UL(1) << 37)
|
||||
#define TCR_TBI1 (UL(1) << 38)
|
||||
#define TCR_HA (UL(1) << 39)
|
||||
#define TCR_HD (UL(1) << 40)
|
||||
#define TCR_HPD0_SHIFT 41
|
||||
#define TCR_HPD0 (UL(1) << TCR_HPD0_SHIFT)
|
||||
#define TCR_HPD1_SHIFT 42
|
||||
#define TCR_HPD1 (UL(1) << TCR_HPD1_SHIFT)
|
||||
#define TCR_TBID0 (UL(1) << 51)
|
||||
#define TCR_TBID1 (UL(1) << 52)
|
||||
#define TCR_NFD0 (UL(1) << 53)
|
||||
#define TCR_NFD1 (UL(1) << 54)
|
||||
#define TCR_E0PD0 (UL(1) << 55)
|
||||
#define TCR_E0PD1 (UL(1) << 56)
|
||||
#define TCR_TCMA0 (UL(1) << 57)
|
||||
#define TCR_TCMA1 (UL(1) << 58)
|
||||
#define TCR_DS (UL(1) << 59)
|
||||
#define TCR_IPS_SHIFT TCR_EL1_IPS_SHIFT
|
||||
#define TCR_IPS_MASK TCR_EL1_IPS_MASK
|
||||
#define TCR_A1 TCR_EL1_A1
|
||||
#define TCR_ASID16 TCR_EL1_AS
|
||||
#define TCR_TBI0 TCR_EL1_TBI0
|
||||
#define TCR_TBI1 TCR_EL1_TBI1
|
||||
#define TCR_HA TCR_EL1_HA
|
||||
#define TCR_HD TCR_EL1_HD
|
||||
#define TCR_HPD0 TCR_EL1_HPD0
|
||||
#define TCR_HPD1 TCR_EL1_HPD1
|
||||
#define TCR_TBID0 TCR_EL1_TBID0
|
||||
#define TCR_TBID1 TCR_EL1_TBID1
|
||||
#define TCR_E0PD0 TCR_EL1_E0PD0
|
||||
#define TCR_E0PD1 TCR_EL1_E0PD1
|
||||
#define TCR_DS TCR_EL1_DS
|
||||
|
||||
/*
|
||||
* TTBR.
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ extern unsigned long prot_ns_shared;
|
|||
#else
|
||||
static inline bool __pure lpa2_is_enabled(void)
|
||||
{
|
||||
return read_tcr() & TCR_DS;
|
||||
return read_tcr() & TCR_EL1_DS;
|
||||
}
|
||||
|
||||
#define PTE_MAYBE_SHARED (lpa2_is_enabled() ? 0 : PTE_SHARED)
|
||||
|
|
|
|||
|
|
@ -1129,8 +1129,6 @@
|
|||
#define gicr_insn(insn) read_sysreg_s(GICV5_OP_GICR_##insn)
|
||||
#define gic_insn(v, insn) write_sysreg_s(v, GICV5_OP_GIC_##insn)
|
||||
|
||||
#define ARM64_FEATURE_FIELD_BITS 4
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
.macro mrs_s, rt, sreg
|
||||
|
|
|
|||
|
|
@ -1969,7 +1969,7 @@ static struct cpumask dbm_cpus __read_mostly;
|
|||
|
||||
static inline void __cpu_enable_hw_dbm(void)
|
||||
{
|
||||
u64 tcr = read_sysreg(tcr_el1) | TCR_HD;
|
||||
u64 tcr = read_sysreg(tcr_el1) | TCR_EL1_HD;
|
||||
|
||||
write_sysreg(tcr, tcr_el1);
|
||||
isb();
|
||||
|
|
@ -2255,7 +2255,7 @@ static bool has_generic_auth(const struct arm64_cpu_capabilities *entry,
|
|||
static void cpu_enable_e0pd(struct arm64_cpu_capabilities const *cap)
|
||||
{
|
||||
if (this_cpu_has_cap(ARM64_HAS_E0PD))
|
||||
sysreg_clear_set(tcr_el1, 0, TCR_E0PD1);
|
||||
sysreg_clear_set(tcr_el1, 0, TCR_EL1_E0PD1);
|
||||
}
|
||||
#endif /* CONFIG_ARM64_E0PD */
|
||||
|
||||
|
|
|
|||
|
|
@ -141,13 +141,13 @@ static void __init map_kernel(u64 kaslr_offset, u64 va_offset, int root_level)
|
|||
static void noinline __section(".idmap.text") set_ttbr0_for_lpa2(phys_addr_t ttbr)
|
||||
{
|
||||
u64 sctlr = read_sysreg(sctlr_el1);
|
||||
u64 tcr = read_sysreg(tcr_el1) | TCR_DS;
|
||||
u64 tcr = read_sysreg(tcr_el1) | TCR_EL1_DS;
|
||||
u64 mmfr0 = read_sysreg(id_aa64mmfr0_el1);
|
||||
u64 parange = cpuid_feature_extract_unsigned_field(mmfr0,
|
||||
ID_AA64MMFR0_EL1_PARANGE_SHIFT);
|
||||
|
||||
tcr &= ~TCR_IPS_MASK;
|
||||
tcr |= parange << TCR_IPS_SHIFT;
|
||||
tcr &= ~TCR_EL1_IPS_MASK;
|
||||
tcr |= parange << TCR_EL1_IPS_SHIFT;
|
||||
|
||||
asm(" msr sctlr_el1, %0 ;"
|
||||
" isb ;"
|
||||
|
|
@ -263,7 +263,7 @@ asmlinkage void __init early_map_kernel(u64 boot_status, phys_addr_t fdt)
|
|||
}
|
||||
|
||||
if (va_bits > VA_BITS_MIN)
|
||||
sysreg_clear_set(tcr_el1, TCR_T1SZ_MASK, TCR_T1SZ(va_bits));
|
||||
sysreg_clear_set(tcr_el1, TCR_EL1_T1SZ_MASK, TCR_T1SZ(va_bits));
|
||||
|
||||
/*
|
||||
* The virtual KASLR displacement modulo 2MiB is decided by the
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ static inline u64 get_tcr_el1_t1sz(void);
|
|||
|
||||
static inline u64 get_tcr_el1_t1sz(void)
|
||||
{
|
||||
return (read_sysreg(tcr_el1) & TCR_T1SZ_MASK) >> TCR_T1SZ_OFFSET;
|
||||
return (read_sysreg(tcr_el1) & TCR_EL1_T1SZ_MASK) >> TCR_EL1_T1SZ_SHIFT;
|
||||
}
|
||||
|
||||
void arch_crash_save_vmcoreinfo(void)
|
||||
|
|
|
|||
|
|
@ -23,15 +23,18 @@
|
|||
#include <asm/sysreg.h>
|
||||
|
||||
#ifdef CONFIG_ARM64_64K_PAGES
|
||||
#define TCR_TG_FLAGS TCR_TG0_64K | TCR_TG1_64K
|
||||
#define TCR_TG_FLAGS ((TCR_EL1_TG0_64K << TCR_EL1_TG0_SHIFT) |\
|
||||
(TCR_EL1_TG1_64K << TCR_EL1_TG1_SHIFT))
|
||||
#elif defined(CONFIG_ARM64_16K_PAGES)
|
||||
#define TCR_TG_FLAGS TCR_TG0_16K | TCR_TG1_16K
|
||||
#define TCR_TG_FLAGS ((TCR_EL1_TG0_16K << TCR_EL1_TG0_SHIFT) |\
|
||||
(TCR_EL1_TG1_16K << TCR_EL1_TG1_SHIFT))
|
||||
#else /* CONFIG_ARM64_4K_PAGES */
|
||||
#define TCR_TG_FLAGS TCR_TG0_4K | TCR_TG1_4K
|
||||
#define TCR_TG_FLAGS ((TCR_EL1_TG0_4K << TCR_EL1_TG0_SHIFT) |\
|
||||
(TCR_EL1_TG1_4K << TCR_EL1_TG1_SHIFT))
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RANDOMIZE_BASE
|
||||
#define TCR_KASLR_FLAGS TCR_NFD1
|
||||
#define TCR_KASLR_FLAGS TCR_EL1_NFD1
|
||||
#else
|
||||
#define TCR_KASLR_FLAGS 0
|
||||
#endif
|
||||
|
|
@ -40,23 +43,30 @@
|
|||
#define TCR_CACHE_FLAGS TCR_IRGN_WBWA | TCR_ORGN_WBWA
|
||||
|
||||
#ifdef CONFIG_KASAN_SW_TAGS
|
||||
#define TCR_KASAN_SW_FLAGS TCR_TBI1 | TCR_TBID1
|
||||
#define TCR_KASAN_SW_FLAGS TCR_EL1_TBI1 | TCR_EL1_TBID1
|
||||
#else
|
||||
#define TCR_KASAN_SW_FLAGS 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KASAN_HW_TAGS
|
||||
#define TCR_MTE_FLAGS TCR_TCMA1 | TCR_TBI1 | TCR_TBID1
|
||||
#define TCR_MTE_FLAGS TCR_EL1_TCMA1 | TCR_EL1_TBI1 | TCR_EL1_TBID1
|
||||
#elif defined(CONFIG_ARM64_MTE)
|
||||
/*
|
||||
* The mte_zero_clear_page_tags() implementation uses DC GZVA, which relies on
|
||||
* TBI being enabled at EL1.
|
||||
*/
|
||||
#define TCR_MTE_FLAGS TCR_TBI1 | TCR_TBID1
|
||||
#define TCR_MTE_FLAGS TCR_EL1_TBI1 | TCR_EL1_TBID1
|
||||
#else
|
||||
#define TCR_MTE_FLAGS 0
|
||||
#endif
|
||||
|
||||
#define TCR_IRGN_WBWA ((TCR_EL1_IRGN0_WBWA << TCR_EL1_IRGN0_SHIFT) |\
|
||||
(TCR_EL1_IRGN1_WBWA << TCR_EL1_IRGN1_SHIFT))
|
||||
#define TCR_ORGN_WBWA ((TCR_EL1_ORGN0_WBWA << TCR_EL1_ORGN0_SHIFT) |\
|
||||
(TCR_EL1_ORGN1_WBWA << TCR_EL1_ORGN1_SHIFT))
|
||||
#define TCR_SHARED ((TCR_EL1_SH0_INNER << TCR_EL1_SH0_SHIFT) |\
|
||||
(TCR_EL1_SH1_INNER << TCR_EL1_SH1_SHIFT))
|
||||
|
||||
/*
|
||||
* Default MAIR_EL1. MT_NORMAL_TAGGED is initially mapped as Normal memory and
|
||||
* changed during mte_cpu_setup to Normal Tagged if the system supports MTE.
|
||||
|
|
@ -129,7 +139,7 @@ SYM_FUNC_START(cpu_do_resume)
|
|||
|
||||
/* Don't change t0sz here, mask those bits when restoring */
|
||||
mrs x7, tcr_el1
|
||||
bfi x8, x7, TCR_T0SZ_OFFSET, TCR_TxSZ_WIDTH
|
||||
bfi x8, x7, TCR_EL1_T0SZ_SHIFT, TCR_EL1_T0SZ_WIDTH
|
||||
|
||||
msr tcr_el1, x8
|
||||
msr vbar_el1, x9
|
||||
|
|
@ -481,8 +491,8 @@ SYM_FUNC_START(__cpu_setup)
|
|||
tcr2 .req x15
|
||||
mov_q mair, MAIR_EL1_SET
|
||||
mov_q tcr, TCR_T0SZ(IDMAP_VA_BITS) | TCR_T1SZ(VA_BITS_MIN) | TCR_CACHE_FLAGS | \
|
||||
TCR_SHARED | TCR_TG_FLAGS | TCR_KASLR_FLAGS | TCR_ASID16 | \
|
||||
TCR_TBI0 | TCR_A1 | TCR_KASAN_SW_FLAGS | TCR_MTE_FLAGS
|
||||
TCR_SHARED | TCR_TG_FLAGS | TCR_KASLR_FLAGS | TCR_EL1_AS | \
|
||||
TCR_EL1_TBI0 | TCR_EL1_A1 | TCR_KASAN_SW_FLAGS | TCR_MTE_FLAGS
|
||||
mov tcr2, xzr
|
||||
|
||||
tcr_clear_errata_bits tcr, x9, x5
|
||||
|
|
@ -492,7 +502,7 @@ SYM_FUNC_START(__cpu_setup)
|
|||
alternative_if ARM64_HAS_VA52
|
||||
tcr_set_t1sz tcr, x9
|
||||
#ifdef CONFIG_ARM64_LPA2
|
||||
orr tcr, tcr, #TCR_DS
|
||||
orr tcr, tcr, #TCR_EL1_DS
|
||||
#endif
|
||||
alternative_else_nop_endif
|
||||
#endif
|
||||
|
|
@ -500,7 +510,7 @@ alternative_else_nop_endif
|
|||
/*
|
||||
* Set the IPS bits in TCR_EL1.
|
||||
*/
|
||||
tcr_compute_pa_size tcr, #TCR_IPS_SHIFT, x5, x6
|
||||
tcr_compute_pa_size tcr, #TCR_EL1_IPS_SHIFT, x5, x6
|
||||
#ifdef CONFIG_ARM64_HW_AFDBM
|
||||
/*
|
||||
* Enable hardware update of the Access Flags bit.
|
||||
|
|
@ -510,7 +520,7 @@ alternative_else_nop_endif
|
|||
mrs x9, ID_AA64MMFR1_EL1
|
||||
ubfx x9, x9, ID_AA64MMFR1_EL1_HAFDBS_SHIFT, #4
|
||||
cbz x9, 1f
|
||||
orr tcr, tcr, #TCR_HA // hardware Access flag update
|
||||
orr tcr, tcr, #TCR_EL1_HA // hardware Access flag update
|
||||
#ifdef CONFIG_ARM64_HAFT
|
||||
cmp x9, ID_AA64MMFR1_EL1_HAFDBS_HAFT
|
||||
b.lt 1f
|
||||
|
|
|
|||
|
|
@ -44,21 +44,38 @@ function expect_fields(nf) {
|
|||
|
||||
# Print a CPP macro definition, padded with spaces so that the macro bodies
|
||||
# line up in a column
|
||||
function define(name, val) {
|
||||
printf "%-56s%s\n", "#define " name, val
|
||||
function define(prefix, name, val) {
|
||||
printf "%-56s%s\n", "#define " prefix name, val
|
||||
}
|
||||
|
||||
# Same as above, but without a prefix
|
||||
function define_reg(name, val) {
|
||||
define(null, name, val)
|
||||
}
|
||||
|
||||
# Print standard BITMASK/SHIFT/WIDTH CPP definitions for a field
|
||||
function define_field(reg, field, msb, lsb) {
|
||||
define(reg "_" field, "GENMASK(" msb ", " lsb ")")
|
||||
define(reg "_" field "_MASK", "GENMASK(" msb ", " lsb ")")
|
||||
define(reg "_" field "_SHIFT", lsb)
|
||||
define(reg "_" field "_WIDTH", msb - lsb + 1)
|
||||
function define_field(prefix, reg, field, msb, lsb) {
|
||||
define(prefix, reg "_" field, "GENMASK(" msb ", " lsb ")")
|
||||
define(prefix, reg "_" field "_MASK", "GENMASK(" msb ", " lsb ")")
|
||||
define(prefix, reg "_" field "_SHIFT", lsb)
|
||||
define(prefix, reg "_" field "_WIDTH", msb - lsb + 1)
|
||||
}
|
||||
|
||||
# Print a field _SIGNED definition for a field
|
||||
function define_field_sign(reg, field, sign) {
|
||||
define(reg "_" field "_SIGNED", sign)
|
||||
function define_field_sign(prefix, reg, field, sign) {
|
||||
define(prefix, reg "_" field "_SIGNED", sign)
|
||||
}
|
||||
|
||||
# Print the Res0, Res1, Unkn masks
|
||||
function define_resx_unkn(prefix, reg, res0, res1, unkn) {
|
||||
if (res0 != null)
|
||||
define(prefix, reg "_RES0", "(" res0 ")")
|
||||
if (res1 != null)
|
||||
define(prefix, reg "_RES1", "(" res1 ")")
|
||||
if (unkn != null)
|
||||
define(prefix, reg "_UNKN", "(" unkn ")")
|
||||
if (res0 != null || res1 != null || unkn != null)
|
||||
print ""
|
||||
}
|
||||
|
||||
# Parse a "<msb>[:<lsb>]" string into the global variables @msb and @lsb
|
||||
|
|
@ -128,18 +145,17 @@ $1 == "SysregFields" && block_current() == "Root" {
|
|||
|
||||
next_bit = 63
|
||||
|
||||
delete seen_prefixes
|
||||
|
||||
next
|
||||
}
|
||||
|
||||
$1 == "EndSysregFields" && block_current() == "SysregFields" {
|
||||
expect_fields(1)
|
||||
if (next_bit > 0)
|
||||
if (next_bit >= 0)
|
||||
fatal("Unspecified bits in " reg)
|
||||
|
||||
define(reg "_RES0", "(" res0 ")")
|
||||
define(reg "_RES1", "(" res1 ")")
|
||||
define(reg "_UNKN", "(" unkn ")")
|
||||
print ""
|
||||
define_resx_unkn(prefix, reg, res0, res1, unkn)
|
||||
|
||||
reg = null
|
||||
res0 = null
|
||||
|
|
@ -170,35 +186,31 @@ $1 == "Sysreg" && block_current() == "Root" {
|
|||
fatal("Duplicate Sysreg definition for " reg)
|
||||
defined_regs[reg] = 1
|
||||
|
||||
define("REG_" reg, "S" op0 "_" op1 "_C" crn "_C" crm "_" op2)
|
||||
define("SYS_" reg, "sys_reg(" op0 ", " op1 ", " crn ", " crm ", " op2 ")")
|
||||
define_reg("REG_" reg, "S" op0 "_" op1 "_C" crn "_C" crm "_" op2)
|
||||
define_reg("SYS_" reg, "sys_reg(" op0 ", " op1 ", " crn ", " crm ", " op2 ")")
|
||||
|
||||
define("SYS_" reg "_Op0", op0)
|
||||
define("SYS_" reg "_Op1", op1)
|
||||
define("SYS_" reg "_CRn", crn)
|
||||
define("SYS_" reg "_CRm", crm)
|
||||
define("SYS_" reg "_Op2", op2)
|
||||
define_reg("SYS_" reg "_Op0", op0)
|
||||
define_reg("SYS_" reg "_Op1", op1)
|
||||
define_reg("SYS_" reg "_CRn", crn)
|
||||
define_reg("SYS_" reg "_CRm", crm)
|
||||
define_reg("SYS_" reg "_Op2", op2)
|
||||
|
||||
print ""
|
||||
|
||||
prefix = null
|
||||
next_bit = 63
|
||||
|
||||
delete seen_prefixes
|
||||
|
||||
next
|
||||
}
|
||||
|
||||
$1 == "EndSysreg" && block_current() == "Sysreg" {
|
||||
expect_fields(1)
|
||||
if (next_bit > 0)
|
||||
if (next_bit >= 0)
|
||||
fatal("Unspecified bits in " reg)
|
||||
|
||||
if (res0 != null)
|
||||
define(reg "_RES0", "(" res0 ")")
|
||||
if (res1 != null)
|
||||
define(reg "_RES1", "(" res1 ")")
|
||||
if (unkn != null)
|
||||
define(reg "_UNKN", "(" unkn ")")
|
||||
if (res0 != null || res1 != null || unkn != null)
|
||||
print ""
|
||||
define_resx_unkn(prefix, reg, res0, res1, unkn)
|
||||
|
||||
reg = null
|
||||
op0 = null
|
||||
|
|
@ -209,6 +221,7 @@ $1 == "EndSysreg" && block_current() == "Sysreg" {
|
|||
res0 = null
|
||||
res1 = null
|
||||
unkn = null
|
||||
prefix = null
|
||||
|
||||
block_pop()
|
||||
next
|
||||
|
|
@ -225,7 +238,7 @@ $1 == "EndSysreg" && block_current() == "Sysreg" {
|
|||
print "/* For " reg " fields see " $2 " */"
|
||||
print ""
|
||||
|
||||
next_bit = 0
|
||||
next_bit = -1
|
||||
res0 = null
|
||||
res1 = null
|
||||
unkn = null
|
||||
|
|
@ -233,8 +246,7 @@ $1 == "EndSysreg" && block_current() == "Sysreg" {
|
|||
next
|
||||
}
|
||||
|
||||
|
||||
$1 == "Res0" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
|
||||
$1 == "Res0" && (block_current() == "Sysreg" || block_current() == "SysregFields" || block_current() == "Prefix") {
|
||||
expect_fields(2)
|
||||
parse_bitdef(reg, "RES0", $2)
|
||||
field = "RES0_" msb "_" lsb
|
||||
|
|
@ -244,7 +256,7 @@ $1 == "Res0" && (block_current() == "Sysreg" || block_current() == "SysregFields
|
|||
next
|
||||
}
|
||||
|
||||
$1 == "Res1" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
|
||||
$1 == "Res1" && (block_current() == "Sysreg" || block_current() == "SysregFields" || block_current() == "Prefix") {
|
||||
expect_fields(2)
|
||||
parse_bitdef(reg, "RES1", $2)
|
||||
field = "RES1_" msb "_" lsb
|
||||
|
|
@ -254,7 +266,7 @@ $1 == "Res1" && (block_current() == "Sysreg" || block_current() == "SysregFields
|
|||
next
|
||||
}
|
||||
|
||||
$1 == "Unkn" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
|
||||
$1 == "Unkn" && (block_current() == "Sysreg" || block_current() == "SysregFields" || block_current() == "Prefix") {
|
||||
expect_fields(2)
|
||||
parse_bitdef(reg, "UNKN", $2)
|
||||
field = "UNKN_" msb "_" lsb
|
||||
|
|
@ -264,62 +276,62 @@ $1 == "Unkn" && (block_current() == "Sysreg" || block_current() == "SysregFields
|
|||
next
|
||||
}
|
||||
|
||||
$1 == "Field" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
|
||||
$1 == "Field" && (block_current() == "Sysreg" || block_current() == "SysregFields" || block_current() == "Prefix") {
|
||||
expect_fields(3)
|
||||
field = $3
|
||||
parse_bitdef(reg, field, $2)
|
||||
|
||||
define_field(reg, field, msb, lsb)
|
||||
define_field(prefix, reg, field, msb, lsb)
|
||||
print ""
|
||||
|
||||
next
|
||||
}
|
||||
|
||||
$1 == "Raz" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
|
||||
$1 == "Raz" && (block_current() == "Sysreg" || block_current() == "SysregFields" || block_current() == "Prefix") {
|
||||
expect_fields(2)
|
||||
parse_bitdef(reg, field, $2)
|
||||
|
||||
next
|
||||
}
|
||||
|
||||
$1 == "SignedEnum" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
|
||||
$1 == "SignedEnum" && (block_current() == "Sysreg" || block_current() == "SysregFields" || block_current() == "Prefix") {
|
||||
block_push("Enum")
|
||||
|
||||
expect_fields(3)
|
||||
field = $3
|
||||
parse_bitdef(reg, field, $2)
|
||||
|
||||
define_field(reg, field, msb, lsb)
|
||||
define_field_sign(reg, field, "true")
|
||||
define_field(prefix, reg, field, msb, lsb)
|
||||
define_field_sign(prefix, reg, field, "true")
|
||||
|
||||
delete seen_enum_vals
|
||||
|
||||
next
|
||||
}
|
||||
|
||||
$1 == "UnsignedEnum" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
|
||||
$1 == "UnsignedEnum" && (block_current() == "Sysreg" || block_current() == "SysregFields" || block_current() == "Prefix") {
|
||||
block_push("Enum")
|
||||
|
||||
expect_fields(3)
|
||||
field = $3
|
||||
parse_bitdef(reg, field, $2)
|
||||
|
||||
define_field(reg, field, msb, lsb)
|
||||
define_field_sign(reg, field, "false")
|
||||
define_field(prefix, reg, field, msb, lsb)
|
||||
define_field_sign(prefix, reg, field, "false")
|
||||
|
||||
delete seen_enum_vals
|
||||
|
||||
next
|
||||
}
|
||||
|
||||
$1 == "Enum" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
|
||||
$1 == "Enum" && (block_current() == "Sysreg" || block_current() == "SysregFields" || block_current() == "Prefix") {
|
||||
block_push("Enum")
|
||||
|
||||
expect_fields(3)
|
||||
field = $3
|
||||
parse_bitdef(reg, field, $2)
|
||||
|
||||
define_field(reg, field, msb, lsb)
|
||||
define_field(prefix, reg, field, msb, lsb)
|
||||
|
||||
delete seen_enum_vals
|
||||
|
||||
|
|
@ -349,7 +361,47 @@ $1 == "EndEnum" && block_current() == "Enum" {
|
|||
fatal("Duplicate Enum value " val " for " name)
|
||||
seen_enum_vals[val] = 1
|
||||
|
||||
define(reg "_" field "_" name, "UL(" val ")")
|
||||
define(prefix, reg "_" field "_" name, "UL(" val ")")
|
||||
next
|
||||
}
|
||||
|
||||
$1 == "Prefix" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
|
||||
block_push("Prefix")
|
||||
|
||||
expect_fields(2)
|
||||
|
||||
if (next_bit < 63)
|
||||
fatal("Prefixed fields must precede non-prefixed fields (" reg ")")
|
||||
|
||||
prefix = $2 "_"
|
||||
|
||||
if (prefix in seen_prefixes)
|
||||
fatal("Duplicate prefix " prefix " for " reg)
|
||||
seen_prefixes[prefix] = 1
|
||||
|
||||
res0 = "UL(0)"
|
||||
res1 = "UL(0)"
|
||||
unkn = "UL(0)"
|
||||
next_bit = 63
|
||||
|
||||
next
|
||||
}
|
||||
|
||||
$1 == "EndPrefix" && block_current() == "Prefix" {
|
||||
expect_fields(1)
|
||||
if (next_bit >= 0)
|
||||
fatal("Unspecified bits in prefix " prefix " for " reg)
|
||||
|
||||
define_resx_unkn(prefix, reg, res0, res1, unkn)
|
||||
|
||||
prefix = null
|
||||
res0 = "UL(0)"
|
||||
res1 = "UL(0)"
|
||||
unkn = "UL(0)"
|
||||
next_bit = 63
|
||||
|
||||
block_pop()
|
||||
|
||||
next
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4669,6 +4669,27 @@ Field 1 V3
|
|||
Field 0 En
|
||||
EndSysreg
|
||||
|
||||
Sysreg ICH_VMCR_EL2 3 4 12 11 7
|
||||
Prefix FEAT_GCIE
|
||||
Res0 63:32
|
||||
Field 31:27 VPMR
|
||||
Res0 26:1
|
||||
Field 0 EN
|
||||
EndPrefix
|
||||
Res0 63:32
|
||||
Field 31:24 VPMR
|
||||
Field 23:21 VBPR0
|
||||
Field 20:18 VBPR1
|
||||
Res0 17:10
|
||||
Field 9 VEOIM
|
||||
Res0 8:5
|
||||
Field 4 VCBPR
|
||||
Field 3 VFIQEn
|
||||
Field 2 VAckCtl
|
||||
Field 1 VENG1
|
||||
Field 0 VENG0
|
||||
EndSysreg
|
||||
|
||||
Sysreg CONTEXTIDR_EL2 3 4 13 0 1
|
||||
Fields CONTEXTIDR_ELx
|
||||
EndSysreg
|
||||
|
|
|
|||
|
|
@ -1078,8 +1078,6 @@
|
|||
#define GCS_CAP(x) ((((unsigned long)x) & GCS_CAP_ADDR_MASK) | \
|
||||
GCS_CAP_VALID_TOKEN)
|
||||
|
||||
#define ARM64_FEATURE_FIELD_BITS 4
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
.macro mrs_s, rt, sreg
|
||||
|
|
|
|||
|
|
@ -265,7 +265,9 @@ static void guest_code(void)
|
|||
/* Return a safe value to a given ftr_bits an ftr value */
|
||||
uint64_t get_safe_value(const struct reg_ftr_bits *ftr_bits, uint64_t ftr)
|
||||
{
|
||||
uint64_t ftr_max = GENMASK_ULL(ARM64_FEATURE_FIELD_BITS - 1, 0);
|
||||
uint64_t ftr_max = ftr_bits->mask >> ftr_bits->shift;
|
||||
|
||||
TEST_ASSERT(ftr_max > 1, "This test doesn't support single bit features");
|
||||
|
||||
if (ftr_bits->sign == FTR_UNSIGNED) {
|
||||
switch (ftr_bits->type) {
|
||||
|
|
@ -317,7 +319,9 @@ uint64_t get_safe_value(const struct reg_ftr_bits *ftr_bits, uint64_t ftr)
|
|||
/* Return an invalid value to a given ftr_bits an ftr value */
|
||||
uint64_t get_invalid_value(const struct reg_ftr_bits *ftr_bits, uint64_t ftr)
|
||||
{
|
||||
uint64_t ftr_max = GENMASK_ULL(ARM64_FEATURE_FIELD_BITS - 1, 0);
|
||||
uint64_t ftr_max = ftr_bits->mask >> ftr_bits->shift;
|
||||
|
||||
TEST_ASSERT(ftr_max > 1, "This test doesn't support single bit features");
|
||||
|
||||
if (ftr_bits->sign == FTR_UNSIGNED) {
|
||||
switch (ftr_bits->type) {
|
||||
|
|
@ -669,7 +673,7 @@ static void test_clidr(struct kvm_vcpu *vcpu)
|
|||
clidr = vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(SYS_CLIDR_EL1));
|
||||
|
||||
/* find the first empty level in the cache hierarchy */
|
||||
for (level = 1; level < 7; level++) {
|
||||
for (level = 1; level <= 7; level++) {
|
||||
if (!CLIDR_CTYPE(clidr, level))
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue