diff mbox series

[v3,18/19] test/py: android: extend abootimg test

Message ID 20230205235021.355410-19-souajih@baylibre.com
State Accepted
Commit 83d48a3c8bfbbbc2a8ad951b211081f72fc268b6
Delegated to: Tom Rini
Headers show
Series Support android boot image v3/v4 | expand

Commit Message

Safae Ouajih Feb. 5, 2023, 11:50 p.m. UTC
test_abootimg is extended to include the testing of boot images
version 4. For this, boot.img and vendor_boot.img have been
generated using mkbootimg tool with setting the header
version to 4.

This tests:
- Getting the header version using abootimg
- Extracting the load address of the dtb
- Extracting the dtb start address in RAM

Running test:
$ ./test/py/test.py --bd sandbox --build -k test_abootimg

Signed-off-by: Safae Ouajih <souajih@baylibre.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
 test/py/tests/test_android/test_abootimg.py | 136 ++++++++++++++++++--
 1 file changed, 123 insertions(+), 13 deletions(-)

Comments

Tom Rini Feb. 7, 2023, 7:02 p.m. UTC | #1
On Mon, Feb 06, 2023 at 12:50:20AM +0100, Safae Ouajih wrote:

> test_abootimg is extended to include the testing of boot images
> version 4. For this, boot.img and vendor_boot.img have been
> generated using mkbootimg tool with setting the header
> version to 4.
> 
> This tests:
> - Getting the header version using abootimg
> - Extracting the load address of the dtb
> - Extracting the dtb start address in RAM
> 
> Running test:
> $ ./test/py/test.py --bd sandbox --build -k test_abootimg
> 
> Signed-off-by: Safae Ouajih <souajih@baylibre.com>
> Reviewed-by: Simon Glass <sjg@chromium.org>
> ---
>  test/py/tests/test_android/test_abootimg.py | 136 ++++++++++++++++++--
>  1 file changed, 123 insertions(+), 13 deletions(-)

Alright, so I don't know where the failure starts, exactly. And to make
testing this easier, there's currently the
trini/u-boot-gitlab-ci-runner:jammy-20230126-07Feb2023 container you can
use to replicate my problem. The problem is that while this test passes
in CI, with GCC, with Clang it fails, consistently:
https://source.denx.de/u-boot/u-boot/-/jobs/572239#L284
and I'm not quite sure why. I hope that building sandbox with clang and
also just trying these features out interactively will fail too, and so
debugging this will be less of a problem.
Safae Ouajih Feb. 9, 2023, 4:52 p.m. UTC | #2
On 07/02/2023 20:02, Tom Rini wrote:
> On Mon, Feb 06, 2023 at 12:50:20AM +0100, Safae Ouajih wrote:
>
>> test_abootimg is extended to include the testing of boot images
>> version 4. For this, boot.img and vendor_boot.img have been
>> generated using mkbootimg tool with setting the header
>> version to 4.
>>
>> This tests:
>> - Getting the header version using abootimg
>> - Extracting the load address of the dtb
>> - Extracting the dtb start address in RAM
>>
>> Running test:
>> $ ./test/py/test.py --bd sandbox --build -k test_abootimg
>>
>> Signed-off-by: Safae Ouajih <souajih@baylibre.com>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>> ---
>>   test/py/tests/test_android/test_abootimg.py | 136 ++++++++++++++++++--
>>   1 file changed, 123 insertions(+), 13 deletions(-)
> Alright, so I don't know where the failure starts, exactly. And to make
> testing this easier, there's currently the
> trini/u-boot-gitlab-ci-runner:jammy-20230126-07Feb2023 container you can
> use to replicate my problem. The problem is that while this test passes
> in CI, with GCC, with Clang it fails, consistently:
> https://source.denx.de/u-boot/u-boot/-/jobs/572239#L284
> and I'm not quite sure why. I hope that building sandbox with clang and
> also just trying these features out interactively will fail too, and so
> debugging this will be less of a problem.
>
Hi Tom,

I will try to reproduce this fail and fix it on a v4.

Thank you for reporting,

BRs,

Safae
Safae Ouajih Feb. 27, 2023, 2:15 p.m. UTC | #3
On 07/02/2023 20:02, Tom Rini wrote:
> On Mon, Feb 06, 2023 at 12:50:20AM +0100, Safae Ouajih wrote:
>
>> test_abootimg is extended to include the testing of boot images
>> version 4. For this, boot.img and vendor_boot.img have been
>> generated using mkbootimg tool with setting the header
>> version to 4.
>>
>> This tests:
>> - Getting the header version using abootimg
>> - Extracting the load address of the dtb
>> - Extracting the dtb start address in RAM
>>
>> Running test:
>> $ ./test/py/test.py --bd sandbox --build -k test_abootimg
>>
>> Signed-off-by: Safae Ouajih <souajih@baylibre.com>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>> ---
>>   test/py/tests/test_android/test_abootimg.py | 136 ++++++++++++++++++--
>>   1 file changed, 123 insertions(+), 13 deletions(-)
> Alright, so I don't know where the failure starts, exactly. And to make
> testing this easier, there's currently the
> trini/u-boot-gitlab-ci-runner:jammy-20230126-07Feb2023 container you can
> use to replicate my problem. The problem is that while this test passes
> in CI, with GCC, with Clang it fails, consistently:
> https://source.denx.de/u-boot/u-boot/-/jobs/572239#L284
> and I'm not quite sure why. I hope that building sandbox with clang and
> also just trying these features out interactively will fail too, and so
> debugging this will be less of a problem.
>
Hello Tom,

I have investigated this issue, clang has a strange behavior in:

* abootimg_get_dtb_load_addr() : cmd/abootimg.c
* android_image_get_dtb_by_index() : boot/image-android.c

That is probably linked to some sort of optimization clang does.

However, The fail is not reproducible using clang-15 and clang-16 and also
not reproducible when turning off clang optimizations.

I suggest using clang-15 to run the test or I can remove all optimizations

on the related functions if clang-14 is used.

Best regards,

Safae
Tom Rini Feb. 27, 2023, 2:18 p.m. UTC | #4
On Mon, Feb 27, 2023 at 03:15:31PM +0100, Safae Ouajih wrote:
> 
> On 07/02/2023 20:02, Tom Rini wrote:
> > On Mon, Feb 06, 2023 at 12:50:20AM +0100, Safae Ouajih wrote:
> > 
> > > test_abootimg is extended to include the testing of boot images
> > > version 4. For this, boot.img and vendor_boot.img have been
> > > generated using mkbootimg tool with setting the header
> > > version to 4.
> > > 
> > > This tests:
> > > - Getting the header version using abootimg
> > > - Extracting the load address of the dtb
> > > - Extracting the dtb start address in RAM
> > > 
> > > Running test:
> > > $ ./test/py/test.py --bd sandbox --build -k test_abootimg
> > > 
> > > Signed-off-by: Safae Ouajih <souajih@baylibre.com>
> > > Reviewed-by: Simon Glass <sjg@chromium.org>
> > > ---
> > >   test/py/tests/test_android/test_abootimg.py | 136 ++++++++++++++++++--
> > >   1 file changed, 123 insertions(+), 13 deletions(-)
> > Alright, so I don't know where the failure starts, exactly. And to make
> > testing this easier, there's currently the
> > trini/u-boot-gitlab-ci-runner:jammy-20230126-07Feb2023 container you can
> > use to replicate my problem. The problem is that while this test passes
> > in CI, with GCC, with Clang it fails, consistently:
> > https://source.denx.de/u-boot/u-boot/-/jobs/572239#L284
> > and I'm not quite sure why. I hope that building sandbox with clang and
> > also just trying these features out interactively will fail too, and so
> > debugging this will be less of a problem.
> > 
> Hello Tom,
> 
> I have investigated this issue, clang has a strange behavior in:
> 
> * abootimg_get_dtb_load_addr() : cmd/abootimg.c
> * android_image_get_dtb_by_index() : boot/image-android.c
> 
> That is probably linked to some sort of optimization clang does.
> 
> However, The fail is not reproducible using clang-15 and clang-16 and also
> not reproducible when turning off clang optimizations.
> 
> I suggest using clang-15 to run the test or I can remove all optimizations
> 
> on the related functions if clang-14 is used.

Thanks for investigating.  I see that 15 is now considered stable, so
I'll update the next branch for that, then re-take this series.
Safae Ouajih March 6, 2023, 7:49 p.m. UTC | #5
On 27/02/2023 15:18, Tom Rini wrote:
> On Mon, Feb 27, 2023 at 03:15:31PM +0100, Safae Ouajih wrote:
>> On 07/02/2023 20:02, Tom Rini wrote:
>>> On Mon, Feb 06, 2023 at 12:50:20AM +0100, Safae Ouajih wrote:
>>>
>>>> test_abootimg is extended to include the testing of boot images
>>>> version 4. For this, boot.img and vendor_boot.img have been
>>>> generated using mkbootimg tool with setting the header
>>>> version to 4.
>>>>
>>>> This tests:
>>>> - Getting the header version using abootimg
>>>> - Extracting the load address of the dtb
>>>> - Extracting the dtb start address in RAM
>>>>
>>>> Running test:
>>>> $ ./test/py/test.py --bd sandbox --build -k test_abootimg
>>>>
>>>> Signed-off-by: Safae Ouajih <souajih@baylibre.com>
>>>> Reviewed-by: Simon Glass <sjg@chromium.org>
>>>> ---
>>>>    test/py/tests/test_android/test_abootimg.py | 136 ++++++++++++++++++--
>>>>    1 file changed, 123 insertions(+), 13 deletions(-)
>>> Alright, so I don't know where the failure starts, exactly. And to make
>>> testing this easier, there's currently the
>>> trini/u-boot-gitlab-ci-runner:jammy-20230126-07Feb2023 container you can
>>> use to replicate my problem. The problem is that while this test passes
>>> in CI, with GCC, with Clang it fails, consistently:
>>> https://source.denx.de/u-boot/u-boot/-/jobs/572239#L284
>>> and I'm not quite sure why. I hope that building sandbox with clang and
>>> also just trying these features out interactively will fail too, and so
>>> debugging this will be less of a problem.
>>>
>> Hello Tom,
>>
>> I have investigated this issue, clang has a strange behavior in:
>>
>> * abootimg_get_dtb_load_addr() : cmd/abootimg.c
>> * android_image_get_dtb_by_index() : boot/image-android.c
>>
>> That is probably linked to some sort of optimization clang does.
>>
>> However, The fail is not reproducible using clang-15 and clang-16 and also
>> not reproducible when turning off clang optimizations.
>>
>> I suggest using clang-15 to run the test or I can remove all optimizations
>>
>> on the related functions if clang-14 is used.
> Thanks for investigating.  I see that 15 is now considered stable, so
> I'll update the next branch for that, then re-take this series.
>

Hello Tom,

Thank you.

I am a bit confused, do you mean that you will apply this series after 
clang-15 update?

Best regards,

Safae
Tom Rini March 6, 2023, 8:07 p.m. UTC | #6
On Mon, Mar 06, 2023 at 08:49:02PM +0100, Safae Ouajih wrote:
> 
> On 27/02/2023 15:18, Tom Rini wrote:
> > On Mon, Feb 27, 2023 at 03:15:31PM +0100, Safae Ouajih wrote:
> > > On 07/02/2023 20:02, Tom Rini wrote:
> > > > On Mon, Feb 06, 2023 at 12:50:20AM +0100, Safae Ouajih wrote:
> > > > 
> > > > > test_abootimg is extended to include the testing of boot images
> > > > > version 4. For this, boot.img and vendor_boot.img have been
> > > > > generated using mkbootimg tool with setting the header
> > > > > version to 4.
> > > > > 
> > > > > This tests:
> > > > > - Getting the header version using abootimg
> > > > > - Extracting the load address of the dtb
> > > > > - Extracting the dtb start address in RAM
> > > > > 
> > > > > Running test:
> > > > > $ ./test/py/test.py --bd sandbox --build -k test_abootimg
> > > > > 
> > > > > Signed-off-by: Safae Ouajih <souajih@baylibre.com>
> > > > > Reviewed-by: Simon Glass <sjg@chromium.org>
> > > > > ---
> > > > >    test/py/tests/test_android/test_abootimg.py | 136 ++++++++++++++++++--
> > > > >    1 file changed, 123 insertions(+), 13 deletions(-)
> > > > Alright, so I don't know where the failure starts, exactly. And to make
> > > > testing this easier, there's currently the
> > > > trini/u-boot-gitlab-ci-runner:jammy-20230126-07Feb2023 container you can
> > > > use to replicate my problem. The problem is that while this test passes
> > > > in CI, with GCC, with Clang it fails, consistently:
> > > > https://source.denx.de/u-boot/u-boot/-/jobs/572239#L284
> > > > and I'm not quite sure why. I hope that building sandbox with clang and
> > > > also just trying these features out interactively will fail too, and so
> > > > debugging this will be less of a problem.
> > > > 
> > > Hello Tom,
> > > 
> > > I have investigated this issue, clang has a strange behavior in:
> > > 
> > > * abootimg_get_dtb_load_addr() : cmd/abootimg.c
> > > * android_image_get_dtb_by_index() : boot/image-android.c
> > > 
> > > That is probably linked to some sort of optimization clang does.
> > > 
> > > However, The fail is not reproducible using clang-15 and clang-16 and also
> > > not reproducible when turning off clang optimizations.
> > > 
> > > I suggest using clang-15 to run the test or I can remove all optimizations
> > > 
> > > on the related functions if clang-14 is used.
> > Thanks for investigating.  I see that 15 is now considered stable, so
> > I'll update the next branch for that, then re-take this series.
> > 
> 
> Hello Tom,
> 
> Thank you.
> 
> I am a bit confused, do you mean that you will apply this series after
> clang-15 update?

Yes, and the series to move CI to clang-15 is currently stuck on some
pytest (real) failures that need to be resolved. But I would expect this
to all be resolved in time for this series here to be included in
v2023.07.
diff mbox series

Patch

diff --git a/test/py/tests/test_android/test_abootimg.py b/test/py/tests/test_android/test_abootimg.py
index 43a7099c46..6a8ff34538 100644
--- a/test/py/tests/test_android/test_abootimg.py
+++ b/test/py/tests/test_android/test_abootimg.py
@@ -32,6 +32,23 @@  Now one can obtain original boot.img from this hex dump like this:
 
     $ xxd -r -p boot.img.gz.hex boot.img.gz
     $ gunzip -9 boot.img.gz
+
+For boot image header version 4, these tests rely on two images that are generated
+using the same steps above :
+
+1- boot.img :
+    $ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+                --cmdline "cmdline test" --dtb ./dtb.img   \
+                --os_version R --os_patch_level 2019-06-05 \
+                --header_version 4 --output ./boot.img
+
+2- vendor_boot.img
+    $ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+                --cmdline "cmdline test" --dtb ./dtb.img   \
+                --os_version R --os_patch_level 2019-06-05 \
+                --pagesize 4096  --vendor_ramdisk ./ramdisk.img \
+                --header_version 4 --vendor_boot ./vboot.img \
+
 """
 
 # boot.img.gz hex dump
@@ -44,6 +61,24 @@  b7762ffff07d345446c1281805e8a0868d81e117a45e111c0d8dc101b253
 9c03c41a0c90f17fe85400986d82452b6c3680198a192a0ce17c3610ae34
 d4a9820881a70f3873f35352731892f3730b124b32937252a96bb9119ae5
 463a5546f82c1f05a360148c8251300a462e000085bf67f200200000"""
+
+# boot img v4 hex dump
+boot_img_hex = """1f8b080827b0cd630203626f6f742e696d6700edd8bd0d82601885d1d7c4
+58d8c808b88195bd098d8d246e40e42b083f1aa0717be99d003d277916b8
+e5bddc8a7b792d8e8788c896ce9b88d32ebe6c971e7ddd3543cae734cd01
+c0ffc84c0000b0766d1a87d4e5afeadd3dab7a6f10000000f84163d5d7cd
+d43a000000000000000060c53e7544995700400000"""
+
+# vendor boot image v4 hex dump
+vboot_img_hex = """1f8b0808baaecd63020376626f6f742e696d6700edd8310b824018c6f1b3
+222a08f41b3436b4280dcdd19c11d16ee9109d18d59042d047ec8b04cd0d
+d19d5a4345534bf6ffc173ef29272f38e93b1d0ec67dd79d548462aa1cd2
+d5d20b0000f8438678f90c18d584b8a4bbb3a557991ecb2a0000f80d6b2f
+f4179b656be5c532f2fc066f040000000080e23936af2755f62a3d918df1
+db2a7ab67f9ffdeb7df7cda3465ecb79c4ce7e5c577562bb9364b74449a5
+1e467e20c53c0a57de763193c1779b3b4fcd9d4ee27c6a0e00000000c0ff
+309ffea7010000000040f1dc004129855400400000"""
+
 # Expected response for "abootimg dtb_dump" command
 dtb_dump_resp="""## DTB area contents (concat format):
  - DTB #0:
@@ -56,15 +91,21 @@  dtb_dump_resp="""## DTB area contents (concat format):
      (DTB)compatible = y2,z2"""
 # Address in RAM where to load the boot image ('abootimg' looks in $loadaddr)
 loadaddr = 0x1000
+# Address in RAM where to load the vendor boot image ('abootimg' looks in $vloadaddr)
+vloadaddr= 0x10000
 # Expected DTB #1 offset from the boot image start address
 dtb1_offset = 0x187d
+# Expected DTB offset from the vendor boot image start address
+dtb2_offset = 0x207d
 # DTB #1 start address in RAM
 dtb1_addr = loadaddr + dtb1_offset
+# DTB #2 start address in RAM
+dtb2_addr = vloadaddr + dtb2_offset
 
 class AbootimgTestDiskImage(object):
     """Disk image used by abootimg tests."""
 
-    def __init__(self, u_boot_console):
+    def __init__(self, u_boot_console, image_name, hex_img):
         """Initialize a new AbootimgDiskImage object.
 
         Args:
@@ -74,13 +115,13 @@  class AbootimgTestDiskImage(object):
             Nothing.
         """
 
-        gz_hex = u_boot_console.config.persistent_data_dir + '/boot.img.gz.hex'
-        gz = u_boot_console.config.persistent_data_dir + '/boot.img.gz'
+        gz_hex = u_boot_console.config.persistent_data_dir + '/' + image_name  + '.gz.hex'
+        gz = u_boot_console.config.persistent_data_dir + '/' + image_name + '.gz'
 
-        filename = 'boot.img'
+        filename = image_name
         persistent = u_boot_console.config.persistent_data_dir + '/' + filename
         self.path = u_boot_console.config.result_dir  + '/' + filename
-
+        u_boot_console.log.action('persistent is ' + persistent)
         with u_boot_utils.persistent_file_helper(u_boot_console.log, persistent):
             if os.path.exists(persistent):
                 u_boot_console.log.action('Disk image file ' + persistent +
@@ -89,19 +130,17 @@  class AbootimgTestDiskImage(object):
                 u_boot_console.log.action('Generating ' + persistent)
 
                 f = open(gz_hex, "w")
-                f.write(img_hex)
+                f.write(hex_img)
                 f.close()
-
                 cmd = ('xxd', '-r', '-p', gz_hex, gz)
                 u_boot_utils.run_and_log(u_boot_console, cmd)
-
                 cmd = ('gunzip', '-9', gz)
                 u_boot_utils.run_and_log(u_boot_console, cmd)
 
         cmd = ('cp', persistent, self.path)
         u_boot_utils.run_and_log(u_boot_console, cmd)
 
-gtdi = None
+gtdi1 = None
 @pytest.fixture(scope='function')
 def abootimg_disk_image(u_boot_console):
     """pytest fixture to provide a AbootimgTestDiskImage object to tests.
@@ -109,10 +148,36 @@  def abootimg_disk_image(u_boot_console):
     function-scoped. However, we don't need to actually do any function-scope
     work, so this simply returns the same object over and over each time."""
 
-    global gtdi
-    if not gtdi:
-        gtdi = AbootimgTestDiskImage(u_boot_console)
-    return gtdi
+    global gtdi1
+    if not gtdi1:
+        gtdi1 = AbootimgTestDiskImage(u_boot_console, 'boot.img', img_hex)
+    return gtdi1
+
+gtdi2 = None
+@pytest.fixture(scope='function')
+def abootimgv4_disk_image_vboot(u_boot_console):
+    """pytest fixture to provide a AbootimgTestDiskImage object to tests.
+    This is function-scoped because it uses u_boot_console, which is also
+    function-scoped. However, we don't need to actually do any function-scope
+    work, so this simply returns the same object over and over each time."""
+
+    global gtdi2
+    if not gtdi2:
+        gtdi2 = AbootimgTestDiskImage(u_boot_console, 'vendor_boot.img', vboot_img_hex)
+    return gtdi2
+
+gtdi3 = None
+@pytest.fixture(scope='function')
+def abootimgv4_disk_image_boot(u_boot_console):
+    """pytest fixture to provide a AbootimgTestDiskImage object to tests.
+    This is function-scoped because it uses u_boot_console, which is also
+    function-scoped. However, we don't need to actually do any function-scope
+    work, so this simply returns the same object over and over each time."""
+
+    global gtdi3
+    if not gtdi3:
+        gtdi3 = AbootimgTestDiskImage(u_boot_console, 'bootv4.img', boot_img_hex)
+    return gtdi3
 
 @pytest.mark.boardspec('sandbox')
 @pytest.mark.buildconfigspec('android_boot_image')
@@ -157,3 +222,48 @@  def test_abootimg(abootimg_disk_image, u_boot_console):
     u_boot_console.run_command('fdt get value v / model')
     response = u_boot_console.run_command('env print v')
     assert response == 'v=x2'
+
+@pytest.mark.boardspec('sandbox')
+@pytest.mark.buildconfigspec('android_boot_image')
+@pytest.mark.buildconfigspec('cmd_abootimg')
+@pytest.mark.buildconfigspec('cmd_fdt')
+@pytest.mark.requiredtool('xxd')
+@pytest.mark.requiredtool('gunzip')
+def test_abootimgv4(abootimgv4_disk_image_vboot, abootimgv4_disk_image_boot, u_boot_console):
+    """Test the 'abootimg' command with boot image header v4."""
+
+    cons = u_boot_console
+    cons.log.action('Loading disk image to RAM...')
+    cons.run_command('setenv loadaddr 0x%x' % (loadaddr))
+    cons.run_command('setenv vloadaddr 0x%x' % (vloadaddr))
+    cons.run_command('host load hostfs - 0x%x %s' % (vloadaddr,
+	abootimgv4_disk_image_vboot.path))
+    cons.run_command('host load hostfs - 0x%x %s' % (loadaddr,
+        abootimgv4_disk_image_boot.path))
+    cons.run_command('abootimg addr 0x%x 0x%x' % (loadaddr, vloadaddr))
+    cons.log.action('Testing \'abootimg get ver\'...')
+    response = cons.run_command('abootimg get ver')
+    assert response == "4"
+    cons.run_command('abootimg get ver v')
+    response = cons.run_command('env print v')
+    assert response == 'v=4'
+
+    cons.log.action('Testing \'abootimg get recovery_dtbo\'...')
+    response = cons.run_command('abootimg get recovery_dtbo a')
+    assert response == 'Error: header version must be >= 1 and <= 2 to get dtbo'
+
+    cons.log.action('Testing \'abootimg get dtb_load_addr\'...')
+    cons.run_command('abootimg get dtb_load_addr a')
+    response = cons.run_command('env print a')
+    assert response == 'a=11f00000'
+
+    cons.log.action('Testing \'abootimg get dtb --index\'...')
+    cons.run_command('abootimg get dtb --index=1 dtb2_start')
+    response = cons.run_command('env print dtb2_start')
+    correct_str = "dtb2_start=%x" % (dtb2_addr)
+    assert response == correct_str
+
+    cons.run_command('fdt addr $dtb2_start')
+    cons.run_command('fdt get value v / model')
+    response = cons.run_command('env print v')
+    assert response == 'v=x2'