|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH early-RFC 3/5] xen/arm: mm: Introduce helpers to prepare/enable/disable the identity mapping
Hi Julien
> On 25 Mar 2022, at 14:48, Julien Grall <julien@xxxxxxx> wrote:
>
>
>
> On 25/03/2022 13:32, Bertrand Marquis wrote:
>> Hi Julien,
>
> Hi,
>
>>> On 9 Mar 2022, at 12:20, Julien Grall <julien@xxxxxxx> wrote:
>>>
>>> From: Julien GralL <jgrall@xxxxxxxxxx>
>>>
>>> In follow-up patches we will need to have part of Xen identity mapped in
>>> order to safely switch the TTBR.
>>>
>>> On some platform, the identity mapping may have to start at 0. If we always
>>> keep the identity region mapped, NULL pointer ference would lead to access
>>> to valid mapping.
>>>
>>> It would be possible to relocate Xen to avoid clashing with address 0.
>>> However the identity mapping is only meant to be used in very limited
>>> places. Therefore it would be better to keep the identity region invalid
>>> for most of the time.
>>>
>>> Two new helpers are introduced:
>>> - prepare_identity_mapping() will setup the page-tables so it is
>>> easy to create the mapping afterwards.
>>> - update_identity_mapping() will create/remove the identity mapping
>> Nit: Would be better to first say what the patch is doing and then explaining
>> the NULL pointer possible issue.
> The NULL pointer is part of the problem statement. IOW, I would not have
> introduced update_identity_mapping() if we were not concerned that the
> mapping start 0.
>
> So I don't think the commit message would read the same.
Somehow reading your commit message, the link between the first 2 paragraph and
the helpers introduced is not quite clear.
The NULL pointer problem is a consequence of the usage of an identity mapping
and maybe this explanation should be more in documentation or in a code comment
around this functionality.
>
>>> +/*
>>> + * The identity mapping may start at physical address 0. So don't want
>>> + * to keep it mapped longer than necessary.
>>> + *
>>> + * When this is called, we are still using the boot_pgtable.
>>> + *
>>> + * XXX: Handle Arm32 properly.
>>> + */
>>> +static void prepare_identity_mapping(void)
>>> +{
>>> + paddr_t id_addr = virt_to_maddr(_start);
>>> + lpae_t pte;
>>> + DECLARE_OFFSETS(id_offsets, id_addr);
>>> +
>>> + printk("id_addr 0x%lx\n", id_addr);
>> Debug print that should be removed.
>
> Will do. Note the "early-RFC" in the comment. I am not looking for a detailed
> review (I didn't spend too much time cleaning up) but a feedback on the
> approach.
I did read the code and it is easy to forget to remove those, so I just pointed
it :-)
>
>>> +#ifdef CONFIG_ARM_64
>>> + if ( id_offsets[0] != 0 )
>>> + panic("Cannot handled ID mapping above 512GB\n");
>> The error message here might not be really helpful for the user.
>> How about saying that Xen cannot be loaded in memory with
>> a physical address above 512GB ?
>
> Sure.
>
>>> +#endif
>>> +
>>> + /* Link first ID table */
>>> + pte = pte_of_xenaddr((vaddr_t)xen_first_id);
>>> + pte.pt.table = 1;
>>> + pte.pt.xn = 0;
>>> +
>>> + write_pte(&boot_pgtable[id_offsets[0]], pte);
>>> +
>>> + /* Link second ID table */
>>> + pte = pte_of_xenaddr((vaddr_t)xen_second_id);
>>> + pte.pt.table = 1;
>>> + pte.pt.xn = 0;
>>> +
>>> + write_pte(&xen_first_id[id_offsets[1]], pte);
>>> +
>>> + /* Link third ID table */
>>> + pte = pte_of_xenaddr((vaddr_t)xen_third_id);
>>> + pte.pt.table = 1;
>>> + pte.pt.xn = 0;
>>> +
>>> + write_pte(&xen_second_id[id_offsets[2]], pte);
>>> +
>>> + /* The mapping in the third table will be created at a later stage */
>>> +
>>> + /*
>>> + * Link the identity mapping in the runtime Xen page tables. No need to
>>> + * use write_pte here as they are not live yet.
>>> + */
>>> + xen_pgtable[id_offsets[0]] = boot_pgtable[id_offsets[0]];
>>> +}
>>> +
>>> +void update_identity_mapping(bool enable)
>> You probably want an __init attribute here.
> I expect this helper to be necessary after boot (e.g. CPU bring-up,
> suspend/resume). So I decided to keep it without _init.
Ok
>
>>> +{
>>> + paddr_t id_addr = virt_to_maddr(_start);
>>> + int rc;
>>> +
>>> + if ( enable )
>>> + rc = map_pages_to_xen(id_addr, maddr_to_mfn(id_addr), 1,
>>> + PAGE_HYPERVISOR_RX);
>>> + else
>>> + rc = destroy_xen_mappings(id_addr, id_addr + PAGE_SIZE);
>>> +
>>> + BUG_ON(rc);
>>> +}
>>> +
>>> /*
>>> * After boot, Xen page-tables should not contain mapping that are both
>>> * Writable and eXecutables.
>>> @@ -609,6 +679,9 @@ void __init setup_pagetables(unsigned long
>>> boot_phys_offset)
>>>
>>> phys_offset = boot_phys_offset;
>>>
>>> + /* XXX: Find a better place to call it */
>> Why do you think this place is not right ?
> Because the use in setup_pagetables() will soon disappear (my plan it to
> completely remove setup_pagetables) and this will used in other subsystem
> (CPU bring-up, suspend/resume).
Ok
Cheers
Bertrand
>
> Cheers,
>
> --
> Julien Grall
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |