Provide a -A flag to select ARM instead of x86. For now, only the app
is supported and only for 64-bit ARM.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 scripts/build-efi.py | 49 +++++++++++++++++++++++++++++++-------------
 1 file changed, 35 insertions(+), 14 deletions(-)

diff --git a/scripts/build-efi.py b/scripts/build-efi.py
index 3a1bf180ade..1ba37e86e88 100755
--- a/scripts/build-efi.py
+++ b/scripts/build-efi.py
@@ -48,6 +48,8 @@ def parse_args():
         epilog='Script for running U-Boot as an EFI app/payload')
     parser.add_argument('-a', '--app', action='store_true',
                         help='Package up the app')
+    parser.add_argument('-A', '--arm', action='store_true',
+                        help='Run on ARM architecture')
     parser.add_argument('-B', '--no-build', action='store_true',
                         help="Don't build (an existing build must be present")
     parser.add_argument('-k', '--kernel', action='store_true',
@@ -131,26 +133,43 @@ class BuildEfi:
         """
         extra = []
         efi_dir = self.get_setting("efi_dir")
-        if bitness == 64:
-            qemu = 'qemu-system-x86_64'
-            bios = 'OVMF-pure-efi.x64.fd'
-        else:
-            qemu = 'qemu-system-i386'
-            bios = 'OVMF-pure-efi.i386.fd'
+        if self.args.arm:
+            qemu_arch = 'aarch64'
+            extra += ['--machine', 'virt', '-cpu', 'max']
+            bios = os.path.join(efi_dir, 'OVMF-pure-efi.aarch64.fd.64m')
+            var_store = os.path.join(efi_dir, 'varstore.img')
+            extra += [
+                '-drive', f'if=pflash,format=raw,file={bios},readonly=on',
+                '-drive', f'if=pflash,format=raw,file={var_store}'
+                ]
+            extra += ['-drive',
+                      f'id=hd0,file={self.img},if=none,format=raw',
+                      '-device', 'virtio-blk-device,drive=hd0']
+        else:  # x86
+            if bitness == 64:
+                qemu_arch = 'x86_64'
+                bios = 'OVMF-pure-efi.x64.fd'
+            else:
+                qemu_arch = 'i386'
+                bios = 'OVMF-pure-efi.i386.fd'
+            extra += ['-bios', os.path.join(efi_dir, bios)]
+            extra += ['-drive', f'id=disk,file={self.img},if=none,format=raw']
+            extra += ['-device', 'ahci,id=ahci']
+            extra += ['-device', 'ide-hd,drive=disk,bus=ahci.0']
+        qemu = f'qemu-system-{qemu_arch}'
         if serial_only:
-            extra = ['-display', 'none', '-serial', 'mon:stdio']
+            extra += ['-display', 'none', '-serial', 'mon:stdio']
             serial_msg = ' (Ctrl-a x to quit)'
         else:
-            extra = ['-serial', 'mon:stdio']
+            if self.args.arm:
+                extra += ['-device', 'virtio-gpu-pci']
+            extra += ['-serial', 'mon:stdio']
             serial_msg = ''
         print(f'Running {qemu}{serial_msg}')
 
         # Use 512MB since U-Boot EFI likes to have 256MB to play with
-        cmd = [qemu, '-bios', os.path.join(efi_dir), bios)]
+        cmd = [qemu]
         cmd += '-m', '512'
-        cmd += '-drive', f'id=disk,file={self.img},if=none,format=raw'
-        cmd += '-device', 'ahci,id=ahci'
-        cmd += '-device', 'ide-hd,drive=disk,bus=ahci.0'
         cmd += '-nic', 'none'
         cmd += extra
         command.run(*cmd)
@@ -229,6 +248,7 @@ class BuildEfi:
                 command.output(*cmd)
             except command.CommandExc:
                 time.sleep(0.5)
+                cmd = 'sudo', 'kpartx', '-d', self.img
                 command.output(*cmd)
 
     def do_build(self, build):
@@ -244,15 +264,16 @@ class BuildEfi:
         """This does all the work"""
         args = self.args
         bitness = 32 if args.word else 64
+        arch = 'arm' if args.arm else 'x86'
         build_type = 'payload' if args.payload else 'app'
         self.tmp = f'{self.build_dir}/efi{bitness}{build_type}'
-        build = f'efi-x86_{build_type}{bitness}'
+        build = f'efi-{arch}_{build_type}{bitness}'
 
         if not args.no_build:
             self.do_build(build)
 
         if args.old and bitness == 32:
-            build = f'efi-x86_{build_type}'
+            build = f'efi-{arch}_{build_type}'
 
         self.setup_files(build, build_type)
 
-- 
2.43.0

Reply via email to