[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [ImageBuilder] uboot-script-gen: Add ability to configure static event channels



On Mon, 29 Sep 2025, Oleksandr Tyshchenko wrote:
> Add DOMU_STATIC_EVTCHNS[number]="local_id local_port remote_id; ..."
> configuration file string option specifying the static event channel
> definitions for domain.
> 
> The build script uses simple IDs to automatically and safely
> generate the required unique phandle numbers for the device tree.
> The user only needs to define simple numeric IDs and does not need
> to manage complex phandle values.
> 
> For the following example:
> DOMU_STATIC_EVTCHNS[0]="1 10 2; 3 12 4"
> DOMU_STATIC_EVTCHNS[1]="2 11 1; 4 13 3"
> 
> it generates:
> fdt mknod /chosen/domU0 evtchn@1
> fdt set /chosen/domU0/evtchn@1 phandle <0xfffffffe>
> fdt set /chosen/domU0/evtchn@1 compatible "xen,evtchn-v1"
> fdt set /chosen/domU0/evtchn@1 xen,evtchn <10 0xfffffffd>
> fdt mknod /chosen/domU0 evtchn@3
> fdt set /chosen/domU0/evtchn@3 phandle <0xfffffffc>
> fdt set /chosen/domU0/evtchn@3 compatible "xen,evtchn-v1"
> fdt set /chosen/domU0/evtchn@3 xen,evtchn <12 0xfffffffb>
> ...
> fdt mknod /chosen/domU1 evtchn@2
> fdt set /chosen/domU1/evtchn@2 phandle <0xfffffffd>
> fdt set /chosen/domU1/evtchn@2 compatible "xen,evtchn-v1"
> fdt set /chosen/domU1/evtchn@2 xen,evtchn <11 0xfffffffe>
> fdt mknod /chosen/domU1 evtchn@4
> fdt set /chosen/domU1/evtchn@4 phandle <0xfffffffb>
> fdt set /chosen/domU1/evtchn@4 compatible "xen,evtchn-v1"
> fdt set /chosen/domU1/evtchn@4 xen,evtchn <13 0xfffffffc>

I'd like to make an alternative suggestion. The user specifies triplets:
DOMU_STATIC_EVTCHNS[0]="local-id remote-domid remote-id

To generate the example above:

DOMU_STATIC_EVTCHNS[0]="10 1 11; 12 1 13"
DOMU_STATIC_EVTCHNS[1]="11 0 10; 13 0 12"

I think this is better because it doesn't require to invent (useless)
unique numbers as references. Instead, it focuses on the data that
actually matters to the user: the event channel IDs at both ends and
the domains involved. These are things the user must know anyway.

The only catch with this suggesion is the definition of "remote-domid":
in reality the DOMU array index is not the domid in dom0less so we would
have to clarify. Maybe we could define it as remote-domain-index or
something like that.

What do you think?


In ImageBuilder so far we have not used separators like ';' here but I
think it does improve readability so I would keep it.


> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
> ---
>  README.md                | 21 ++++++++++
>  scripts/uboot-script-gen |  7 ++++
>  scripts/xen_dt_domu      | 89 ++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 117 insertions(+)
> 
> diff --git a/README.md b/README.md
> index 7b68cf5..52ed1f7 100644
> --- a/README.md
> +++ b/README.md
> @@ -218,6 +218,27 @@ Where:
>        DOMU_VCPU_HARD_AFFINITY[number,1]="3"
>  ```
>  
> +- DOMU_STATIC_EVTCHNS[number]="local_id local_port remote_id; ..."
> +  if specified, this parameter allows the configuration of static event 
> channels
> +  for inter-domain communication. Each entry in DOMU_STATIC_EVTCHNS[number]
> +  specifies one or more event channels for a particular domain.
> +  The configuration format for each event channel definition is a set of
> +  three values:
> +    - local_id: A simple, unique integer that identifies the local endpoint 
> of
> +      the event channel. This ID must be unique across all domains.
> +    - local_port: The numeric port number for the local endpoint.
> +    - remote_id: The ID of the corresponding remote endpoint to which this
> +      the local port connects.
> +
> +  Multiple event channel definitions for a single domain can be provided by
> +  separating them with a semicolon (;).
> +
> +  Below is an example that creates two pairs of bidirectional channels 
> between
> +  two domains:
> +  NUM_DOMUS=2
> +  DOMU_STATIC_EVTCHNS[0]="1 10 2; 3 12 4"
> +  DOMU_STATIC_EVTCHNS[1]="2 11 1; 4 13 3"
> +
>  - DOMU_COLORS[number] specifies the colors (cache coloring) to be used
>    for the domain and is in the format startcolor-endcolor
>  
> diff --git a/scripts/uboot-script-gen b/scripts/uboot-script-gen
> index 4f92610..003a622 100755
> --- a/scripts/uboot-script-gen
> +++ b/scripts/uboot-script-gen
> @@ -428,6 +428,8 @@ function xen_device_tree_editing()
>          fi
>      fi
>  
> +    xen_dt_build_evtchns_map
> +
>      i=0
>      while test $i -lt $NUM_DOMUS
>      do
> @@ -512,6 +514,11 @@ function xen_device_tree_editing()
>  
>          xen_dt_domu_add_vcpu_nodes "/chosen/domU$i" $i ${DOMU_VCPUS[$i]}
>  
> +        if test "${DOMU_STATIC_EVTCHNS[$i]}"
> +        then
> +            xen_dt_domu_add_evtchns "/chosen/domU$i" 
> "${DOMU_STATIC_EVTCHNS[$i]}"
> +        fi
> +
>          add_device_tree_kernel "/chosen/domU$i" "domU${i}_kernel" 
> ${domU_kernel_addr[$i]} ${domU_kernel_size[$i]} "${DOMU_CMD[$i]}"
>          if test "${domU_ramdisk_addr[$i]}"
>          then
> diff --git a/scripts/xen_dt_domu b/scripts/xen_dt_domu
> index 8134896..97c5325 100644
> --- a/scripts/xen_dt_domu
> +++ b/scripts/xen_dt_domu
> @@ -37,3 +37,92 @@ function xen_dt_domu_add_vcpu_nodes()
>          fi
>      done
>  }
> +
> +declare -A EVTCHN_ID_TO_PHANDLE_MAP
> +
> +function xen_dt_build_evtchns_map()
> +{
> +    local i
> +    local evtchn_str # The full event channel definition string
> +    local def
> +    local local_id remote_id id
> +    local new_phandle
> +
> +    for (( i=0; i<$NUM_DOMUS; i++ ))
> +    do
> +        evtchn_str=${DOMU_STATIC_EVTCHNS[$i]}
> +        if test -z "$evtchn_str"
> +        then
> +            continue
> +        fi
> +
> +        IFS=';' read -ra evtchn_defs <<< "$evtchn_str"
> +
> +        # Loop over each definition and process both local and remote IDs
> +        for def in "${evtchn_defs[@]}"
> +        do
> +            read -r local_id _ remote_id <<< "$def"
> +            if test -z "$local_id" || test -z "$remote_id"
> +            then
> +                echo "Malformed evtchn definition: '$def'"
> +                cleanup_and_return_err
> +            fi
> +
> +            if [[ "$local_id" == "$remote_id" ]]
> +            then
> +                echo "Invalid evtchn definition: '$def'"
> +                cleanup_and_return_err
> +            fi
> +
> +            for id in $local_id $remote_id
> +            do
> +                # If this ID is not already in our map, assign it a new 
> phandle
> +                if [[ ! -v EVTCHN_ID_TO_PHANDLE_MAP[$id] ]]
> +                then
> +                    get_next_phandle new_phandle
> +                    EVTCHN_ID_TO_PHANDLE_MAP[$id]=$new_phandle
> +                    echo "evtchn ID '$id' is assigned phandle '$new_phandle'"
> +                fi
> +            done
> +        done
> +    done
> +}
> +
> +function xen_dt_domu_add_evtchns()
> +{
> +    # $1 - dt path
> +    local path=$1
> +    # $2 - The full event channel definition string
> +    local evtchn_str=$2
> +
> +    local def
> +    local local_id local_port remote_id
> +    local local_phandle remote_phandle
> +
> +    IFS=';' read -ra evtchn_defs <<< "$evtchn_str"
> +
> +    # Loop over each definition and create a node for it
> +    for def in "${evtchn_defs[@]}"
> +    do
> +        read -r local_id local_port remote_id <<< "$def"
> +        if test -z "$local_id" || test -z "$local_port" || test -z 
> "$remote_id"
> +        then
> +            echo "Malformed evtchn definition: '$def'"
> +            cleanup_and_return_err
> +        fi
> +
> +        # Look up the phandles from our globally-populated map
> +        local_phandle=${EVTCHN_ID_TO_PHANDLE_MAP[$local_id]}
> +        remote_phandle=${EVTCHN_ID_TO_PHANDLE_MAP[$remote_id]}
> +        if test -z "$local_phandle" || test -z "$remote_phandle"
> +        then
> +            echo "Could not find phandle for evtchn ID '$local_id' or 
> '$remote_id'"
> +            cleanup_and_return_err
> +        fi
> +
> +        dt_mknode "${path}" "evtchn@$local_id"
> +        dt_set "${path}/evtchn@$local_id" "phandle" "hex" "$local_phandle"
> +        dt_set "${path}/evtchn@$local_id" "compatible" "str" "xen,evtchn-v1"
> +        dt_set "${path}/evtchn@$local_id" "xen,evtchn" "hex" "$local_port 
> $remote_phandle"
> +    done
> +}
> -- 
> 2.34.1
> 



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.