[PATCH 1/3] arm64: mm: Support Common Not Private translations

Vladimir Murzin vladimir.murzin at arm.com
Wed Oct 11 01:49:09 PDT 2017


On 10/10/17 16:19, James Morse wrote:
> Hi Vladimir,
> 
> On 09/10/17 13:55, Vladimir Murzin wrote:
>> Common Not Private (CNP) is a feature of ARMv8.2 extension which
>> allows translation table entries to be shared between different PEs in
>> the same inner shareable domain, so the hardware can use this fact to
>> optimise the caching of such entries in the TLB.
> 
>> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
>> index 21e2c95..8d098a1 100644
>> --- a/arch/arm64/kernel/cpufeature.c
>> +++ b/arch/arm64/kernel/cpufeature.c
>> @@ -1211,6 +1224,14 @@ cpufeature_pan_not_uao(const struct arm64_cpu_capabilities *entry, int __unused)
>>  	return (cpus_have_const_cap(ARM64_HAS_PAN) && !cpus_have_const_cap(ARM64_HAS_UAO));
>>  }
>>  
>> +#ifdef CONFIG_ARM64_CNP
>> +static int cpu_enable_cnp(void *__unused)
>> +{
>> +	cpu_replace_ttbr1(swapper_pg_dir);
> 
> All the other callers of cpu_replace_ttbr1() wrap swapper_pg_dir in lm_alias().
> I'm pretty sure this is so that virt_to_phys() works when swapper_pg_dir's
> address is in the vmalloc range.
> 
> CONFIG_DEBUG_VIRTUAL should catch problems like this.

Indeed it did!

> 
> 
> (Nit: you shouldn't need the #ifdeffery, the only caller of this function is in
> the same file, so the compiler should do the right thing)
> 

I'll look into it.

Thanks
Vladimir

> 
>> +	return 0;
>> +}
>> +#endif /* CONFIG_ARM64_CNP */
>> +
>>  /*
>>   * We emulate only the following system register space.
>>   * Op0 = 0x3, CRn = 0x0, Op1 = 0x0, CRm = [0, 4 - 7]
> 
> 
> 




More information about the linux-arm-kernel mailing list