diff mbox series

[ImageBuilder] uboot-script-gen: use size from arm32 zImage header

Message ID 20231120151315.92119-1-michal.orzel@amd.com (mailing list archive)
State New, archived
Headers show
Series [ImageBuilder] uboot-script-gen: use size from arm32 zImage header | expand

Commit Message

Michal Orzel Nov. 20, 2023, 3:13 p.m. UTC
Take an example from commit 8bf401c99035 ("uboot-script-gen: use size from
arm64 Image header") and add support for calculating the effective image
size from arm32 zImage header.

Introduce get_image_size() function and use it to to probe the supported
header magic values and to retrieve the effective image size. Use this
value in add_size(), whenever it's bigger than the one obtained using
'stat -L'.

Signed-off-by: Michal Orzel <michal.orzel@amd.com>
---
This patch together with 'bootz' support will allow us to enable testing Xen
on arm{32,64} in gitlab CI with UBSAN enabled.
---
 scripts/uboot-script-gen | 38 ++++++++++++++++++++++++++++----------
 1 file changed, 28 insertions(+), 10 deletions(-)

Comments

Stefano Stabellini Nov. 21, 2023, 12:26 a.m. UTC | #1
On Mon, 20 Nov 2023, Michal Orzel wrote:
> Take an example from commit 8bf401c99035 ("uboot-script-gen: use size from
> arm64 Image header") and add support for calculating the effective image
> size from arm32 zImage header.
> 
> Introduce get_image_size() function and use it to to probe the supported
> header magic values and to retrieve the effective image size. Use this
> value in add_size(), whenever it's bigger than the one obtained using
> 'stat -L'.
> 
> Signed-off-by: Michal Orzel <michal.orzel@amd.com>

Acked-by: Stefano Stabellini <sstabellini@kernel.org>


> ---
> This patch together with 'bootz' support will allow us to enable testing Xen
> on arm{32,64} in gitlab CI with UBSAN enabled.
> ---
>  scripts/uboot-script-gen | 38 ++++++++++++++++++++++++++++----------
>  1 file changed, 28 insertions(+), 10 deletions(-)
> 
> diff --git a/scripts/uboot-script-gen b/scripts/uboot-script-gen
> index 9e3d86e4743a..078a667c61ab 100755
> --- a/scripts/uboot-script-gen
> +++ b/scripts/uboot-script-gen
> @@ -431,23 +431,41 @@ function device_tree_editing()
>      fi
>  }
>  
> -function add_size()
> +# Read effective image size from a header, which may be larger than the filesize
> +# due to noload sections, e.g. bss.
> +function get_image_size()
>  {
> -    local filename=$1
> -    local size=`stat -L --printf="%s" $filename`
> +    local image=$1
> +    local effective_size=0
>      # Read arm64 header magic (https://www.kernel.org/doc/Documentation/arm64/booting.txt)
> -    local arm64_header_magic=$(od -j 56 -N 4 -t x4 ${filename} | awk 'NR==1 {print $2}')
> +    local arm64_header_magic=$(od -j 56 -N 4 -t x4 ${image} | awk 'NR==1 {print $2}')
> +    # Read arm32 header magic (http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html)
> +    local arm32_header_magic=$(od -j 36 -N 4 -t x4 ${image} | awk 'NR==1 {print $2}')
>  
>      # Check for valid arm64 header magic value 0x644d5241
>      if [ "${arm64_header_magic}" = "644d5241" ]
>      then
> -        # Read effective size, which may be larger than the filesize due to noload sections, e.g. bss
> -        local arm64_header_size=$(od -j 16 -N 8 -t u8 ${filename} | awk 'NR==1 {print $2}')
> +        effective_size=$(od -j 16 -N 8 -t u8 ${image} | awk 'NR==1 {print $2}')
> +    # Check for valid arm32 header magic value 0x016f2818
> +    elif [ "${arm32_header_magic}" = "016f2818" ]
> +    then
> +        local start=$(od -j 40 -N 4 -t u4 ${image} | awk 'NR==1 {print $2}')
> +        local end=$(od -j 44 -N 4 -t u4 ${image} | awk 'NR==1 {print $2}')
> +        effective_size=$(( end - start ))
> +    fi
>  
> -        if [ "${arm64_header_size}" -gt "${size}" ]
> -        then
> -            size=${arm64_header_size}
> -        fi
> +    printf "%u" $effective_size
> +}
> +
> +function add_size()
> +{
> +    local filename=$1
> +    local size=`stat -L --printf="%s" $filename`
> +    local image_size=`get_image_size $filename`
> +
> +    if [ "${image_size}" -gt "${size}" ]
> +    then
> +        size=${image_size}
>      fi
>  
>      memaddr=$(( $memaddr + $size + $offset - 1))
> -- 
> 2.25.1
>
diff mbox series

Patch

diff --git a/scripts/uboot-script-gen b/scripts/uboot-script-gen
index 9e3d86e4743a..078a667c61ab 100755
--- a/scripts/uboot-script-gen
+++ b/scripts/uboot-script-gen
@@ -431,23 +431,41 @@  function device_tree_editing()
     fi
 }
 
-function add_size()
+# Read effective image size from a header, which may be larger than the filesize
+# due to noload sections, e.g. bss.
+function get_image_size()
 {
-    local filename=$1
-    local size=`stat -L --printf="%s" $filename`
+    local image=$1
+    local effective_size=0
     # Read arm64 header magic (https://www.kernel.org/doc/Documentation/arm64/booting.txt)
-    local arm64_header_magic=$(od -j 56 -N 4 -t x4 ${filename} | awk 'NR==1 {print $2}')
+    local arm64_header_magic=$(od -j 56 -N 4 -t x4 ${image} | awk 'NR==1 {print $2}')
+    # Read arm32 header magic (http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html)
+    local arm32_header_magic=$(od -j 36 -N 4 -t x4 ${image} | awk 'NR==1 {print $2}')
 
     # Check for valid arm64 header magic value 0x644d5241
     if [ "${arm64_header_magic}" = "644d5241" ]
     then
-        # Read effective size, which may be larger than the filesize due to noload sections, e.g. bss
-        local arm64_header_size=$(od -j 16 -N 8 -t u8 ${filename} | awk 'NR==1 {print $2}')
+        effective_size=$(od -j 16 -N 8 -t u8 ${image} | awk 'NR==1 {print $2}')
+    # Check for valid arm32 header magic value 0x016f2818
+    elif [ "${arm32_header_magic}" = "016f2818" ]
+    then
+        local start=$(od -j 40 -N 4 -t u4 ${image} | awk 'NR==1 {print $2}')
+        local end=$(od -j 44 -N 4 -t u4 ${image} | awk 'NR==1 {print $2}')
+        effective_size=$(( end - start ))
+    fi
 
-        if [ "${arm64_header_size}" -gt "${size}" ]
-        then
-            size=${arm64_header_size}
-        fi
+    printf "%u" $effective_size
+}
+
+function add_size()
+{
+    local filename=$1
+    local size=`stat -L --printf="%s" $filename`
+    local image_size=`get_image_size $filename`
+
+    if [ "${image_size}" -gt "${size}" ]
+    then
+        size=${image_size}
     fi
 
     memaddr=$(( $memaddr + $size + $offset - 1))