[PATCH] arm64: mm: Make randomization works again in some case
Kefeng Wang
wangkefeng.wang at huawei.com
Wed Dec 15 01:12:37 PST 2021
On 2021/12/10 19:56, Catalin Marinas wrote:
> On Thu, Nov 04, 2021 at 02:27:47PM +0800, Kefeng Wang wrote:
>> After commit 97d6786e0669 ("arm64: mm: account for hotplug memory when
>> randomizing the linear region"), the KASLR could not work well in some
>> case, eg, without memory hotplug and with va=39/pa=44, that is, linear
>> region size < CPU's addressable PA range, the KASLR fails now but could
>> work before this commit. Let's calculate pa range by memblock end/start
>> without CONFIG_RANDOMIZE_BASE.
>>
>> Meanwhile, let's add a warning message if linear region size is too small
>> for randomization.
>>
>> Signed-off-by: Kefeng Wang <wangkefeng.wang at huawei.com>
>> ---
>> Hi Ard, one more question, the parange from mmfr0 register may also too large,
>> then even with this patch, the randomization still could not work.
>>
>> If we know the max physical memory range(including hotplug memory), could we
>> add a way(maybe cmdline) to set max parange, then we could make randomization
>> works in more cases, any thought?
>>
>> arch/arm64/mm/init.c | 30 +++++++++++++++++++++---------
>> 1 file changed, 21 insertions(+), 9 deletions(-)
>>
>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>> index a8834434af99..27ec7f2c6fdb 100644
>> --- a/arch/arm64/mm/init.c
>> +++ b/arch/arm64/mm/init.c
>> @@ -284,21 +284,33 @@ void __init arm64_memblock_init(void)
>>
>> if (IS_ENABLED(CONFIG_RANDOMIZE_BASE)) {
>> extern u16 memstart_offset_seed;
>> - u64 mmfr0 = read_cpuid(ID_AA64MMFR0_EL1);
>> - int parange = cpuid_feature_extract_unsigned_field(
>> - mmfr0, ID_AA64MMFR0_PARANGE_SHIFT);
>> - s64 range = linear_region_size -
>> - BIT(id_aa64mmfr0_parange_to_phys_shift(parange));
>> + s64 range;
>> +
>> + if (IS_ENABLED(CONFIG_MEMORY_HOTPLUG)) {
>> + u64 mmfr0 = read_cpuid(ID_AA64MMFR0_EL1);
>> + int parange = cpuid_feature_extract_unsigned_field(
>> + mmfr0, ID_AA64MMFR0_PARANGE_SHIFT);
>> + range = linear_region_size -
>> + BIT(id_aa64mmfr0_parange_to_phys_shift(parange));
>> +
>> + } else {
>> + range = linear_region_size -
>> + (memblock_end_of_DRAM() - memblock_start_of_DRAM());
>> + }
> I'm not a big fan of making this choice depend on memory hotplug. Could
> we instead just limit the randomisation to the minimum of va bits and pa
> bits? We can keep the warning.
OK, will update, thanks.
>
More information about the linux-arm-kernel
mailing list