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

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



On Tue, 30 Sep 2025, Oleksandr Tyshchenko wrote:
> Add DOMU_STATIC_EVTCHNS[number]="local_port remote_dom_idx remote_port; ..."
> configuration file string option specifying the static event channel
> definitions for domain.
> 
> For the following example:
> DOMU_STATIC_EVTCHNS[0]="10 1 11; 12 1 13"
> DOMU_STATIC_EVTCHNS[1]="11 0 10; 13 0 12"
> 
> it generates:
> fdt mknod /chosen/domU0 evtchn@10
> fdt set /chosen/domU0/evtchn@10 phandle <0xfffffffe>
> fdt set /chosen/domU0/evtchn@10 compatible "xen,evtchn-v1"
> fdt set /chosen/domU0/evtchn@10 xen,evtchn <10 0xfffffffd>
> fdt mknod /chosen/domU0 evtchn@12
> fdt set /chosen/domU0/evtchn@12 phandle <0xfffffffc>
> fdt set /chosen/domU0/evtchn@12 compatible "xen,evtchn-v1"
> fdt set /chosen/domU0/evtchn@12 xen,evtchn <12 0xfffffffb>
> ...
> fdt mknod /chosen/domU1 evtchn@11
> fdt set /chosen/domU1/evtchn@11 phandle <0xfffffffd>
> fdt set /chosen/domU1/evtchn@11 compatible "xen,evtchn-v1"
> fdt set /chosen/domU1/evtchn@11 xen,evtchn <11 0xfffffffe>
> fdt mknod /chosen/domU1 evtchn@13
> fdt set /chosen/domU1/evtchn@13 phandle <0xfffffffb>
> fdt set /chosen/domU1/evtchn@13 compatible "xen,evtchn-v1"
> fdt set /chosen/domU1/evtchn@13 xen,evtchn <13 0xfffffffc>
> 
> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>

Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>


> ---
>   V2:
>    - completely rework based on Stefano-s suggestion at:
>      
> https://patchew.org/Xen/20250929180746.1881872-1-oleksandr._5Ftyshchenko@xxxxxxxx/
> ---
> ---
>  README.md                |  21 ++++++++
>  scripts/uboot-script-gen |   7 +++
>  scripts/xen_dt_domu      | 103 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 131 insertions(+)
> 
> diff --git a/README.md b/README.md
> index 7b68cf5..2efac97 100644
> --- a/README.md
> +++ b/README.md
> @@ -218,6 +218,27 @@ Where:
>        DOMU_VCPU_HARD_AFFINITY[number,1]="3"
>  ```
>  
> +- DOMU_STATIC_EVTCHNS[number]="local_port remote_dom_idx remote_port; ..."
> +  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_port: The numeric port number for the local domain's endpoint.
> +      This value must be unique within current domain.
> +    - remote_dom_idx: The array index of the remote domain (e.g., if
> +      connecting to DomU1, this would be `1`).
> +    - remote_port: The numeric port number for the remote domain's endpoint.
> +
> +  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]="10 1 11; 12 1 13"
> +  DOMU_STATIC_EVTCHNS[1]="11 0 10; 13 0 12"
> +
>  - 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..e319de8 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" "$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..45891b3 100644
> --- a/scripts/xen_dt_domu
> +++ b/scripts/xen_dt_domu
> @@ -37,3 +37,106 @@ function xen_dt_domu_add_vcpu_nodes()
>          fi
>      done
>  }
> +
> +declare -A EVTCHN_ENDPOINT_TO_PHANDLE_MAP
> +
> +function xen_dt_build_evtchns_map()
> +{
> +    local def
> +    local local_dom_idx
> +    local local_port remote_dom_idx remote_port
> +    local new_phandle
> +    local local_key remote_key
> +
> +    for (( local_dom_idx=0; local_dom_idx<$NUM_DOMUS; local_dom_idx++ ))
> +    do
> +        local evtchn_str=${DOMU_STATIC_EVTCHNS[$local_dom_idx]}
> +        if test -z "$evtchn_str"
> +        then
> +            continue
> +        fi
> +
> +        IFS=';' read -ra evtchn_defs <<< "$evtchn_str"
> +
> +        # Loop over each definition and process both endpoints of the 
> connection
> +        for def in "${evtchn_defs[@]}"
> +        do
> +            read -r local_port remote_dom_idx remote_port <<< "$def"
> +            if test -z "$local_port" || test -z "$remote_dom_idx" || test -z 
> "$remote_port"
> +            then
> +                echo "Malformed evtchn definition: '$def' in 
> DOMU_STATIC_EVTCHNS[$local_dom_idx]"
> +                cleanup_and_return_err
> +            fi
> +
> +            # Define keys for both endpoints of the connection
> +            local_key="$local_dom_idx,$local_port"
> +            remote_key="$remote_dom_idx,$remote_port"
> +
> +            if [[ "$local_key" == "$remote_key" ]]; then
> +                echo "Invalid evtchn definition: '$def' in 
> DOMU_STATIC_EVTCHNS[$local_dom_idx]"
> +                cleanup_and_return_err
> +            fi
> +
> +            # For each key, if it is not already in our map, assign it a new 
> phandle
> +            if [[ ! -v EVTCHN_ENDPOINT_TO_PHANDLE_MAP[$local_key] ]]
> +            then
> +                get_next_phandle new_phandle
> +                EVTCHN_ENDPOINT_TO_PHANDLE_MAP[$local_key]=$new_phandle
> +                echo "Local endpoint '$local_key' is assigned phandle 
> '$new_phandle'"
> +            fi
> +
> +            if [[ ! -v EVTCHN_ENDPOINT_TO_PHANDLE_MAP[$remote_key] ]]
> +            then
> +                get_next_phandle new_phandle
> +                EVTCHN_ENDPOINT_TO_PHANDLE_MAP[$remote_key]=$new_phandle
> +                echo "Remote endpoint '$remote_key' is assigned phandle 
> '$new_phandle'"
> +            fi
> +        done
> +    done
> +}
> +
> +function xen_dt_domu_add_evtchns()
> +{
> +    # $1 - dt path
> +    local path=$1
> +    # $2 - index of the current domain
> +    local local_dom_idx=$2
> +    # $3 - full event channel definition string
> +    local evtchn_str=$3
> +
> +    local def
> +    local local_port remote_dom_idx remote_port
> +    local local_phandle remote_phandle
> +    local local_key remote_key
> +
> +    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_port remote_dom_idx remote_port <<< "$def"
> +        if test -z "$local_port" || test -z "$remote_dom_idx" || test -z 
> "$remote_port"
> +        then
> +            echo "Malformed evtchn definition: '$def' in 
> DOMU_STATIC_EVTCHNS[$local_dom_idx]"
> +            cleanup_and_return_err
> +        fi
> +
> +        # Re-create the keys for both endpoints of the connection to look up 
> the phandles
> +        local_key="$local_dom_idx,$local_port"
> +        remote_key="$remote_dom_idx,$remote_port"
> +
> +        local_phandle=${EVTCHN_ENDPOINT_TO_PHANDLE_MAP[$local_key]}
> +        remote_phandle=${EVTCHN_ENDPOINT_TO_PHANDLE_MAP[$remote_key]}
> +
> +        if test -z "$local_phandle" || test -z "$remote_phandle"
> +        then
> +            echo "Could not find phandle for endpoint '$local_key' or 
> '$remote_key'"
> +            cleanup_and_return_err
> +        fi
> +
> +        dt_mknode "${path}" "evtchn@$local_port"
> +        dt_set "${path}/evtchn@$local_port" "phandle" "hex" "$local_phandle"
> +        dt_set "${path}/evtchn@$local_port" "compatible" "str" 
> "xen,evtchn-v1"
> +        dt_set "${path}/evtchn@$local_port" "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®.