[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] ImageBuilder: Add support for 64-bit addresses
+xen-devel On Thu, 6 Oct 2022, Michal Orzel wrote: > At the moment, ImageBuilder assumes that all addresses/sizes are > 32-bit max. It sets #{address,size}-cells to 0x2 and puts 0x0 as the > value for the first cell. Because of that, we cannot specify MEMORY_START > and MEMORY_END to be above 32-bits (e.g. to place the images in the > upper memory bank). > > Add support to properly handle 64-bit addresses: > - add function split_into_halves to split the value passed as a first > argument into upper and lower halves. These are then set as values for > variables passed respetively as the second and third argument, > - whenever there is a variable storing the full 64-bit number with > "addr" or "size" in name, introduce two additional variables with > "addr1,addr2"/"size1,size2" in name to store the halves. These are > then used to properly set cells. > > Signed-off-by: Michal Orzel <michal.orzel@xxxxxxx> > > --- > scripts/uboot-script-gen | 60 +++++++++++++++++++++++++++++++++++----- > 1 file changed, 53 insertions(+), 7 deletions(-) > > diff --git a/scripts/uboot-script-gen b/scripts/uboot-script-gen > index 16269f02f1e7..4c6525a910f3 100755 > --- a/scripts/uboot-script-gen > +++ b/scripts/uboot-script-gen > @@ -25,6 +25,14 @@ function dt_mknode() > fi > } > > +# Usage: > +# split_into_halves <value> <variable_to_store_upper> > <variable_to_store_lower> > +function split_into_halves() > +{ > + eval "$2=$(printf "0x%X\n" $(($1 >> 32)))" > + eval "$3=$(printf "0x%X\n" $(($1 & 0xFFFFFFFF)))" > +} I know it is the same thing, but I would prefer the following version because it makes it easier to read: # Usage: # split_into_halves <value> <variable_to_store_upper> <variable_to_store_lower> function split_into_halves() { local value=$1 local upper=$2 local lower=$3 eval "$upper=$(printf "0x%X\n" $(($value >> 32)))" eval "$lower=$(printf "0x%X\n" $(($value & 0xFFFFFFFF)))" } > + > # data_type is either > # int > # hex > @@ -41,10 +49,14 @@ function dt_set() > > if test $data_type = "var" > then > - eval data_addr_var="$data"_addr > - eval data_addr=\$"$data_addr_var" > - eval data_size_var="$data"_size > - eval data_size=\$"$data_size_var" > + eval data_addr1_var="$data"_addr1 > + eval data_addr2_var="$data"_addr2 > + eval data_addr1=\$"$data_addr1_var" > + eval data_addr2=\$"$data_addr2_var" > + eval data_size1_var="$data"_size1 > + eval data_size2_var="$data"_size2 > + eval data_size1=\$"$data_size1_var" > + eval data_size2=\$"$data_size2_var" To avoid making the code more complex, is it possible to stick with just a single data_addr variable in u-boot and calculate the upper and lower 32-bit using u-boot commands? That way, we can keep the current scheme of address and size variable storage, which I think is already complex enough, and just add the calculation when needed. So we could do for the dynamic case: setexpr data_addr1 \${"$data_addr_var"} / 0x100000000 setexpr data_addr2 \${"$data_addr_var"} \& 0xffffffff And it could be moved into split_into_halves, so that split_into_halves can be called for both the dynamic case and the non-dynamic case maybe. This should reduce the amount of changes significantly. > fi > > if test "$UBOOT_SOURCE" && test ! "$FIT" > @@ -54,9 +66,9 @@ function dt_set() > then > if test $dynamic_loading_opt > then > - echo "fdt set $path $var <0x0 0x\${"$data_addr_var"} 0x0 > 0x\${"$data_size_var"}>" >> $UBOOT_SOURCE > + echo "fdt set $path $var <0x\${"$data_addr1_var"} > 0x\${"$data_addr2_var"} 0x\${"$data_size1_var"} 0x\${"$data_size2_var"}>" >> > $UBOOT_SOURCE > else > - echo "fdt set $path $var <0x0 $data_addr 0x0 $data_size>" >> > $UBOOT_SOURCE > + echo "fdt set $path $var <$data_addr1 $data_addr2 > $data_size1 $data_size2>" >> $UBOOT_SOURCE > fi > elif test $data_type = "hex" || test $data_type = "int" > then > @@ -84,7 +96,7 @@ function dt_set() > then > if test $data_type = "var" > then > - fdtput $FDTEDIT -p -t x $path $var 0x0 "$data_addr" 0x0 > "$data_size" > + fdtput $FDTEDIT -p -t x $path $var "$data_addr1" "$data_addr2" > "$data_size1" "$data_size2" > elif test $data_type = "hex" > then > fdtput $FDTEDIT -p -t x $path $var $data > @@ -396,18 +408,38 @@ function add_size() > local filename=$1 > local fit_scr_name=$2 > local binary_name_addr="${fit_scr_name}_addr" > + local binary_name_addr1="${fit_scr_name}_addr1" > + local binary_name_addr2="${fit_scr_name}_addr2" > local binary_name_size="${fit_scr_name}_size" > + local binary_name_size1="${fit_scr_name}_size1" > + local binary_name_size2="${fit_scr_name}_size2" > + > + split_into_halves $memaddr memaddr1 memaddr2 > eval "$fit_scr_name"_addr=$memaddr > + eval "$fit_scr_name"_addr1=$memaddr1 > + eval "$fit_scr_name"_addr2=$memaddr2 > > local size=`stat -L --printf="%s" $filename` > filesize=$size > + split_into_halves $size size1 size2 > eval "$fit_scr_name"_size=`printf "0x%X\n" $size` > + eval "$fit_scr_name"_size1=$size1 > + eval "$fit_scr_name"_size2=$size2 > eval binary_name_size_value=\$"$binary_name_size" > + split_into_halves $binary_name_size_value binary_name_size_value1 > binary_name_size_value2 > > if test $dynamic_loading_opt > then > + echo "setexpr memaddr1 \${memaddr} \/ 0x100000000" >> $UBOOT_SOURCE > + echo "setexpr memaddr2 \${memaddr} \& 0xFFFFFFFF" >> $UBOOT_SOURCE > + echo "setexpr filesize1 \${filesize} \/ 0x100000000" >> $UBOOT_SOURCE > + echo "setexpr filesize2 \${filesize} \& 0xFFFFFFFF" >> $UBOOT_SOURCE > echo "setenv $binary_name_addr \${memaddr}" >> $UBOOT_SOURCE > + echo "setenv $binary_name_addr1 \${memaddr1}" >> $UBOOT_SOURCE > + echo "setenv $binary_name_addr2 \${memaddr2}" >> $UBOOT_SOURCE > echo "setenv $binary_name_size \${filesize}" >> $UBOOT_SOURCE > + echo "setenv $binary_name_size1 \${filesize1}" >> $UBOOT_SOURCE > + echo "setenv $binary_name_size2 \${filesize2}" >> $UBOOT_SOURCE > # Compute load addr for next binary dynamically > echo "setexpr memaddr \${memaddr} \+ \${filesize}" >> $UBOOT_SOURCE > echo "setexpr memaddr \${memaddr} \+ $padding_mask" >> $UBOOT_SOURCE > @@ -415,7 +447,11 @@ function add_size() > else > # Store load addr and size as literals > echo "setenv $binary_name_addr $memaddr" >> $UBOOT_SOURCE > + echo "setenv $binary_name_addr1 $memaddr1" >> $UBOOT_SOURCE > + echo "setenv $binary_name_addr2 $memaddr2" >> $UBOOT_SOURCE > echo "setenv $binary_name_size $binary_name_size_value" >> > $UBOOT_SOURCE > + echo "setenv $binary_name_size1 $binary_name_size_value1" >> > $UBOOT_SOURCE > + echo "setenv $binary_name_size2 $binary_name_size_value2" >> > $UBOOT_SOURCE > fi > > memaddr=$(( $memaddr + $size + $offset - 1)) > @@ -666,16 +702,20 @@ xen_file_loading() > then > check_compressed_file_type $DOM0_KERNEL "executable" > dom0_kernel_addr=$memaddr > + split_into_halves $dom0_kernel_addr dom0_kernel_addr1 > dom0_kernel_addr2 > load_file $DOM0_KERNEL "dom0_linux" > dom0_kernel_size=$filesize > + split_into_halves $dom0_kernel_size dom0_kernel_size1 > dom0_kernel_size2 > fi > if test "$DOM0_RAMDISK" > then > check_compressed_file_type $DOM0_RAMDISK "cpio archive" > ramdisk_addr=$memaddr > + split_into_halves $ramdisk_addr ramdisk_addr1 ramdisk_addr2 > ramdisk_path=$DOM0_RAMDISK > load_file "$DOM0_RAMDISK" "dom0_ramdisk" > ramdisk_size=$filesize > + split_into_halves $ramdisk_size ramdisk_size1 ramdisk_size2 > else > ramdisk_addr="-" > fi > @@ -701,21 +741,27 @@ xen_file_loading() > > check_compressed_file_type ${DOMU_KERNEL[$i]} "executable" > domU_kernel_addr[$i]=$memaddr > + split_into_halves ${domU_kernel_addr[$i]} domU_kernel_addr1[$i] > domU_kernel_addr2[$i] > load_file ${DOMU_KERNEL[$i]} "domU${i}_kernel" > domU_kernel_size[$i]=$filesize > + split_into_halves ${domU_kernel_size[$i]} domU_kernel_size1[$i] > domU_kernel_size2[$i] > if test "${DOMU_RAMDISK[$i]}" > then > check_compressed_file_type ${DOMU_RAMDISK[$i]} "cpio archive" > domU_ramdisk_addr[$i]=$memaddr > + split_into_halves ${domU_ramdisk_addr[$i]} > domU_ramdisk_addr1[$i] domU_ramdisk_addr2[$i] > load_file ${DOMU_RAMDISK[$i]} "domU${i}_ramdisk" > domU_ramdisk_size[$i]=$filesize > + split_into_halves ${domU_ramdisk_size[$i]} > domU_ramdisk_size1[$i] domU_ramdisk_size2[$i] > fi > if test "${DOMU_PASSTHROUGH_DTB[$i]}" > then > check_compressed_file_type ${DOMU_PASSTHROUGH_DTB[$i]} "Device > Tree Blob" > domU_passthrough_dtb_addr[$i]=$memaddr > + split_into_halves ${domU_passthrough_dtb_addr[$i]} > domU_passthrough_dtb_addr1[$i] domU_passthrough_dtb_addr2[$i] > load_file ${DOMU_PASSTHROUGH_DTB[$i]} "domU${i}_fdt" > domU_passthrough_dtb_size[$i]=$filesize > + split_into_halves ${domU_passthrough_dtb_size[$i]} > domU_passthrough_dtb_size1[$i] domU_passthrough_dtb_size2[$i] > fi > i=$(( $i + 1 )) > done > -- > 2.25.1 > >
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |