[PATCH v2 09/17] xen/dom0less: store xenstore event channel in page

Jason Andryuk posted 17 patches 3 months, 2 weeks ago
[PATCH v2 09/17] xen/dom0less: store xenstore event channel in page
Posted by Jason Andryuk 3 months, 2 weeks ago
Write the associated event channel into the xenstore page so xenstored
can read it.  xenstored can map the grant by the reserved grant table
entry, and then read out the event channel and bind it.  This eliminates
the need for an additional mechanism to discover the event channel.

Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
---
 xen/common/device-tree/dom0less-build.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c
index a2789e3bdf..284139bf14 100644
--- a/xen/common/device-tree/dom0less-build.c
+++ b/xen/common/device-tree/dom0less-build.c
@@ -26,6 +26,7 @@
 #include <public/io/xs_wire.h>
 
 #include <asm/dom0less-build.h>
+#include <asm/guest_access.h>
 #include <asm/setup.h>
 
 #include <xen/static-memory.h>
@@ -126,8 +127,14 @@ static void __init initialize_domU_xenstore(void)
 
         if ( gfn != XENSTORE_PFN_LATE_ALLOC && IS_ENABLED(CONFIG_GRANT_TABLE) )
         {
+            evtchn_port_t port = d->arch.hvm.params[HVM_PARAM_STORE_EVTCHN];
+            paddr_t evtchn_gaddr = gfn_to_gaddr(_gfn(gfn)) +
+                offsetof(struct xenstore_domain_interface, evtchn_port);
+
             ASSERT(gfn < UINT32_MAX);
             gnttab_seed_entry(d, GNTTAB_RESERVED_XENSTORE, xs_domid, gfn);
+            access_guest_memory_by_gpa(d, evtchn_gaddr, &port, sizeof(port),
+                                       true /* is_write */);
         }
     }
 }
-- 
2.50.0
Re: [PATCH v2 09/17] xen/dom0less: store xenstore event channel in page
Posted by Juergen Gross 3 months, 2 weeks ago
On 16.07.25 23:14, Jason Andryuk wrote:
> Write the associated event channel into the xenstore page so xenstored
> can read it.  xenstored can map the grant by the reserved grant table
> entry, and then read out the event channel and bind it.  This eliminates
> the need for an additional mechanism to discover the event channel.
> 
> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
> ---
>   xen/common/device-tree/dom0less-build.c | 7 +++++++
>   1 file changed, 7 insertions(+)
> 
> diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c
> index a2789e3bdf..284139bf14 100644
> --- a/xen/common/device-tree/dom0less-build.c
> +++ b/xen/common/device-tree/dom0less-build.c
> @@ -26,6 +26,7 @@
>   #include <public/io/xs_wire.h>
>   
>   #include <asm/dom0less-build.h>
> +#include <asm/guest_access.h>
>   #include <asm/setup.h>
>   
>   #include <xen/static-memory.h>
> @@ -126,8 +127,14 @@ static void __init initialize_domU_xenstore(void)
>   
>           if ( gfn != XENSTORE_PFN_LATE_ALLOC && IS_ENABLED(CONFIG_GRANT_TABLE) )
>           {
> +            evtchn_port_t port = d->arch.hvm.params[HVM_PARAM_STORE_EVTCHN];
> +            paddr_t evtchn_gaddr = gfn_to_gaddr(_gfn(gfn)) +
> +                offsetof(struct xenstore_domain_interface, evtchn_port);
> +
>               ASSERT(gfn < UINT32_MAX);
>               gnttab_seed_entry(d, GNTTAB_RESERVED_XENSTORE, xs_domid, gfn);
> +            access_guest_memory_by_gpa(d, evtchn_gaddr, &port, sizeof(port),
> +                                       true /* is_write */);

I couldn't find access_guest_memory_by_gpa() for x86. I think you either need to
introduce it for all archs, or you need to handle this differently.


Juergen
Re: [PATCH v2 09/17] xen/dom0less: store xenstore event channel in page
Posted by Jan Beulich 3 months, 2 weeks ago
On 17.07.2025 08:19, Juergen Gross wrote:
> On 16.07.25 23:14, Jason Andryuk wrote:
>> Write the associated event channel into the xenstore page so xenstored
>> can read it.  xenstored can map the grant by the reserved grant table
>> entry, and then read out the event channel and bind it.  This eliminates
>> the need for an additional mechanism to discover the event channel.
>>
>> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
>> ---
>>   xen/common/device-tree/dom0less-build.c | 7 +++++++
>>   1 file changed, 7 insertions(+)
>>
>> diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c
>> index a2789e3bdf..284139bf14 100644
>> --- a/xen/common/device-tree/dom0less-build.c
>> +++ b/xen/common/device-tree/dom0less-build.c
>> @@ -26,6 +26,7 @@
>>   #include <public/io/xs_wire.h>
>>   
>>   #include <asm/dom0less-build.h>
>> +#include <asm/guest_access.h>
>>   #include <asm/setup.h>
>>   
>>   #include <xen/static-memory.h>
>> @@ -126,8 +127,14 @@ static void __init initialize_domU_xenstore(void)
>>   
>>           if ( gfn != XENSTORE_PFN_LATE_ALLOC && IS_ENABLED(CONFIG_GRANT_TABLE) )
>>           {
>> +            evtchn_port_t port = d->arch.hvm.params[HVM_PARAM_STORE_EVTCHN];
>> +            paddr_t evtchn_gaddr = gfn_to_gaddr(_gfn(gfn)) +
>> +                offsetof(struct xenstore_domain_interface, evtchn_port);
>> +
>>               ASSERT(gfn < UINT32_MAX);
>>               gnttab_seed_entry(d, GNTTAB_RESERVED_XENSTORE, xs_domid, gfn);
>> +            access_guest_memory_by_gpa(d, evtchn_gaddr, &port, sizeof(port),
>> +                                       true /* is_write */);
> 
> I couldn't find access_guest_memory_by_gpa() for x86. I think you either need to
> introduce it for all archs, or you need to handle this differently.

This code isn't buildable (yet) for x86, is it? There's a series of Alejandro's
moving in that direction, but that didn't go in yet. And even then aiui this
file would still be excluded.

Jan
Re: [PATCH v2 09/17] xen/dom0less: store xenstore event channel in page
Posted by Jürgen Groß 3 months, 2 weeks ago
On 17.07.25 08:25, Jan Beulich wrote:
> On 17.07.2025 08:19, Juergen Gross wrote:
>> On 16.07.25 23:14, Jason Andryuk wrote:
>>> Write the associated event channel into the xenstore page so xenstored
>>> can read it.  xenstored can map the grant by the reserved grant table
>>> entry, and then read out the event channel and bind it.  This eliminates
>>> the need for an additional mechanism to discover the event channel.
>>>
>>> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
>>> ---
>>>    xen/common/device-tree/dom0less-build.c | 7 +++++++
>>>    1 file changed, 7 insertions(+)
>>>
>>> diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c
>>> index a2789e3bdf..284139bf14 100644
>>> --- a/xen/common/device-tree/dom0less-build.c
>>> +++ b/xen/common/device-tree/dom0less-build.c
>>> @@ -26,6 +26,7 @@
>>>    #include <public/io/xs_wire.h>
>>>    
>>>    #include <asm/dom0less-build.h>
>>> +#include <asm/guest_access.h>
>>>    #include <asm/setup.h>
>>>    
>>>    #include <xen/static-memory.h>
>>> @@ -126,8 +127,14 @@ static void __init initialize_domU_xenstore(void)
>>>    
>>>            if ( gfn != XENSTORE_PFN_LATE_ALLOC && IS_ENABLED(CONFIG_GRANT_TABLE) )
>>>            {
>>> +            evtchn_port_t port = d->arch.hvm.params[HVM_PARAM_STORE_EVTCHN];
>>> +            paddr_t evtchn_gaddr = gfn_to_gaddr(_gfn(gfn)) +
>>> +                offsetof(struct xenstore_domain_interface, evtchn_port);
>>> +
>>>                ASSERT(gfn < UINT32_MAX);
>>>                gnttab_seed_entry(d, GNTTAB_RESERVED_XENSTORE, xs_domid, gfn);
>>> +            access_guest_memory_by_gpa(d, evtchn_gaddr, &port, sizeof(port),
>>> +                                       true /* is_write */);
>>
>> I couldn't find access_guest_memory_by_gpa() for x86. I think you either need to
>> introduce it for all archs, or you need to handle this differently.
> 
> This code isn't buildable (yet) for x86, is it? There's a series of Alejandro's
> moving in that direction, but that didn't go in yet. And even then aiui this
> file would still be excluded.

I think this would need to be explicitly mentioned in the commit message
then. I thought this whole work would be targeting x86 as well, but I
might be wrong, of course.


Juergen
Re: [PATCH v2 09/17] xen/dom0less: store xenstore event channel in page
Posted by Jason Andryuk 3 months, 2 weeks ago

On 2025-07-17 02:43, Jürgen Groß wrote:
> On 17.07.25 08:25, Jan Beulich wrote:
>> On 17.07.2025 08:19, Juergen Gross wrote:
>>> On 16.07.25 23:14, Jason Andryuk wrote:
>>>> Write the associated event channel into the xenstore page so xenstored
>>>> can read it.  xenstored can map the grant by the reserved grant table
>>>> entry, and then read out the event channel and bind it.  This 
>>>> eliminates
>>>> the need for an additional mechanism to discover the event channel.
>>>>
>>>> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
>>>> ---
>>>>    xen/common/device-tree/dom0less-build.c | 7 +++++++
>>>>    1 file changed, 7 insertions(+)
>>>>
>>>> diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/ 
>>>> device-tree/dom0less-build.c
>>>> index a2789e3bdf..284139bf14 100644
>>>> --- a/xen/common/device-tree/dom0less-build.c
>>>> +++ b/xen/common/device-tree/dom0less-build.c
>>>> @@ -26,6 +26,7 @@
>>>>    #include <public/io/xs_wire.h>
>>>>    #include <asm/dom0less-build.h>
>>>> +#include <asm/guest_access.h>
>>>>    #include <asm/setup.h>
>>>>    #include <xen/static-memory.h>
>>>> @@ -126,8 +127,14 @@ static void __init initialize_domU_xenstore(void)
>>>>            if ( gfn != XENSTORE_PFN_LATE_ALLOC && 
>>>> IS_ENABLED(CONFIG_GRANT_TABLE) )
>>>>            {
>>>> +            evtchn_port_t port = d- 
>>>> >arch.hvm.params[HVM_PARAM_STORE_EVTCHN];
>>>> +            paddr_t evtchn_gaddr = gfn_to_gaddr(_gfn(gfn)) +
>>>> +                offsetof(struct xenstore_domain_interface, 
>>>> evtchn_port);
>>>> +
>>>>                ASSERT(gfn < UINT32_MAX);
>>>>                gnttab_seed_entry(d, GNTTAB_RESERVED_XENSTORE, 
>>>> xs_domid, gfn);
>>>> +            access_guest_memory_by_gpa(d, evtchn_gaddr, &port, 
>>>> sizeof(port),
>>>> +                                       true /* is_write */);
>>>
>>> I couldn't find access_guest_memory_by_gpa() for x86. I think you 
>>> either need to
>>> introduce it for all archs, or you need to handle this differently.
>>
>> This code isn't buildable (yet) for x86, is it? There's a series of 
>> Alejandro's
>> moving in that direction, but that didn't go in yet. And even then 
>> aiui this
>> file would still be excluded.
> 
> I think this would need to be explicitly mentioned in the commit message
> then. I thought this whole work would be targeting x86 as well, but I
> might be wrong, of course.

Truth be told, I wrote this when dom0less was still in arch/arm.  For 
x86, I modified the hyperlaunch code to use hvm_copy_to_guest_phys(). 
Looks like Xen needs some unified accessors.

Thanks,
Jason