On 17.02.2026 10:58, Oleksii Kurochko wrote:
> 
> On 2/17/26 10:10 AM, Jan Beulich wrote:
>> On 17.02.2026 10:01, Oleksii Kurochko wrote:
>>> On 2/16/26 1:38 PM, Jan Beulich wrote:
>>>> On 12.02.2026 17:21, Oleksii Kurochko wrote:
>>>>> --- a/xen/arch/riscv/p2m.c
>>>>> +++ b/xen/arch/riscv/p2m.c
>>>>> @@ -1557,3 +1557,31 @@ void p2m_handle_vmenter(void)
>>>>>            flush_tlb_guest_local();
>>>>>        }
>>>>>    }
>>>>> +
>>>>> +struct page_info *get_page_from_gfn(struct domain *d, unsigned long gfn,
>>>>> +                                    p2m_type_t *t, p2m_query_t q)
>>>>> +{
>>>>> +    struct page_info *page;
>>>>> +
>>>>> +    /*
>>>>> +     * Special case for DOMID_XEN as it is the only domain so far that is
>>>>> +     * not auto-translated.
>>>>> +     */
>>>> Once again something taken verbatim from Arm. Yes, dom_xen can in fact 
>>>> appear
>>>> here, but it's not a real domain, has no memory truly assigned to it, has 
>>>> no
>>>> GFN space, and hence calling it translated (or not) is simply wrong (at 
>>>> best:
>>>> misleading). IOW ...
>>>>
>>>>> +    if ( likely(d != dom_xen) )
>>>>> +        return p2m_get_page_from_gfn(p2m_get_hostp2m(d), _gfn(gfn), t);
>>>>> +
>>>>> +    /* Non-translated guests see 1-1 RAM / MMIO mappings everywhere */
>>>> ... this comment would also want re-wording.
>>> As you mentioned in the another reply to this patch, I messed up x86 and Arm
>>> implementation in a bad way, so here should be DOMID_XEN used instead of
>>> "Non-translated".
>>>
>>> Based on your reply it seems like the first comment should be also rephrased
>>> as you mentioned that DOMID_XEN can't be called also "not auto-translated".
>>> I think it would be better to write the following:
>>>    /*
>>>     * Special case for DOMID_XEN as it is the only domain so far that has
>>>     * no GFN space.
>>>     */
>> Simply say that dom_xen isn't a "normal" domain?
>>
>>>>> +    if ( t )
>>>>> +        *t = p2m_invalid;
>>>>> +
>>>>> +    page = mfn_to_page(_mfn(gfn));
>>>>> +
>>>>> +    if ( !mfn_valid(_mfn(gfn)) || !get_page(page, d) )
>>>>> +        return NULL;
>>>>> +
>>>>> +    if ( t )
>>>>> +        *t = likely(d != dom_io) ? p2m_ram_rw : p2m_mmio_direct_io;
>>>> If only dom_xen can make it here, why the check for dom_io?
>>> Incorrectly copied from x86. It should be just:
>>>    *t = p2m_ram_rw
>>> here as in RISC-V for MMIO pages owner isn't set to dom_io (and the same is
>>> true for Arm I think).
>> May I suggest that right away you use the construct that I suggested Arm to
>> switch to (you were Cc-ed on that patch, I think)? Despite the absence of
>> p2m_ram_ro on RISC-V, that'll be usable, and it will allow keeping the code
>> untouched when p2m_ram_ro is introduced (sooner or later you will need it,
>> I expect).
> 
> Sure, but doesn't that patch is connected to another function 
> (translate_get_page())
> and just fixing the handling of what get_page_from_gfn() in *t?

Oh, sorry, I should have made explicit that the request was for patch 2.
Here indeed ...

> For get_page_from_gfn() to not miss the case when new type is introduced it 
> make
> sense to do the following:
>      if ( page->u.inuse.type_info & PGT_writable_page )
>          *t = p2m_ram_rw;
>      else
>       BUG_ON("unimplemented");

... this may be the best you can do right now (unless you want to introduce
p2m_ram_ro).

Jan

Reply via email to