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

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


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Oleksandr Tyshchenko <Oleksandr_Tyshchenko@xxxxxxxx>
  • Date: Mon, 29 Sep 2025 18:07:47 +0000
  • Accept-language: en-US, ru-RU
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=lmz8ihFsTa28eFIIcZV7gRXPLn+VRuXAh5/gDPWy9GU=; b=Cev/IWnJtT719yQHI9XIhXEzrTR5UyfXELP/dXddmCXMmD8otyk4wa2I3WzOdmR4oPKSEvSH14O1g5CxvsJpNCzWnYHxwcSoxm8ng49zSG2hmB4ACjjgKubgThzke3W4Ty+J9A8cXknLOC5y6QvAWuMTxXTeSYkMlHE/u9BLcG1sD4CyfQj7FK2xk7DV5Rk2eKRpNg6KRLDcrf4TM2JrRMmK471lf+EzNtscGbhScV/CuZyQ/Vy4l6R8LyZXO3bTBrOX2nT1YfLC3jkD7v5hxpmXMhBE/Y3+aywbTDnC5yDRN9TqHOKXGNXRcvtmVIUi3gWY8+jJ1AWOXeT/s2F05A==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=qdQdBKITWl2CIakQ7427m3dDltjk4Hi0flKXkpc1ZdVHn75ugaamKblB3aa1hlbJePP+a9nICgVAEyBQynBbKb/NTlhI4cEP29F7gzwzmhbdKSQk2PQJeRGrtIKPRL5rbC0gwy9AV4k8Jh20R4YtU9DkYH8b+90HK0BuO3ZCkYgrJZcSjyPXUk5K+NypHRwdC/bacmnaLJUxtkM4m7ZmQiRUz/2BHn0B8Ak5HaqjzEI/eOUqDrbGwuuBZkOY+/XpL6OsyzMRzmvkPXytVkKWUfBxmRAUe8VlS1obf/z0tUul7+MTYHUwkrQZTzgm9Yi0TzxMZDESC2JSzW9xfVsXhA==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: Michal Orzel <michal.orzel@xxxxxxx>, Ayan Kumar Halder <ayankuma@xxxxxxx>, Stefano Stabellini <stefano.stabellini@xxxxxxx>
  • Delivery-date: Mon, 29 Sep 2025 18:08:01 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHcMWv1PEvr31auREGXSWhX8dEo6w==
  • Thread-topic: [ImageBuilder] uboot-script-gen: Add ability to configure static event channels

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>

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®.