[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |