@@ -55,6 +55,20 @@ now = datetime.now()
5555tpm_folder = '/tmp/vyos_tpm_test'
5656qemu_name = 'VyOS-QEMU'
5757
58+ # Map QEMU arch
59+ QEMU_CONFIG = {
60+ "amd64" : {
61+ "bin" : "qemu-system-x86_64" ,
62+ "machine" : "pc" ,
63+ "bios" : "/usr/share/OVMF/OVMF_CODE.fd" ,
64+ },
65+ "arm64" : {
66+ "bin" : "qemu-system-aarch64" ,
67+ "machine" : "virt" ,
68+ "bios" : "/usr/share/qemu-efi-aarch64/QEMU_EFI.fd" ,
69+ },
70+ }
71+
5872# getch.py
5973KEY_F2 = chr (27 ) + chr (91 ) + chr (49 ) + chr (50 ) + chr (126 )
6074KEY_F10 = chr (27 ) + chr (91 ) + chr (50 ) + chr (49 ) + chr (126 )
@@ -97,13 +111,15 @@ parser.add_argument('--sbtest', help='Execute Secure Boot tests',
97111parser .add_argument ('--qemu-cmd' , help = 'Only generate QEMU launch command' ,
98112 action = 'store_true' , default = False )
99113parser .add_argument ('--cpu' , help = 'Set QEMU CPU' , type = int , default = 2 )
114+ parser .add_argument ('--cpu-type' , help = 'Set QEMU CPU type' , type = str , default = 'host' )
100115parser .add_argument ('--memory' , help = 'Set QEMU memory' , type = int , default = 4 )
101116parser .add_argument ('--vyconf' , help = 'Execute testsuite with vyconfd' , action = 'store_true' ,
102117 default = False )
103118parser .add_argument ('--no-vpp' , help = 'Execute testsuite without VPP tests' ,
104119 action = 'store_true' , default = False )
105120parser .add_argument ('--huge-page-size' , help = 'Huge page size (e.g., 2M, 1G)' , type = str )
106121parser .add_argument ('--huge-page-count' , help = 'Number of huge pages to allocate' , type = int )
122+ parser .add_argument ('--arch' , help = 'Architecture' )
107123
108124args = parser .parse_args ()
109125
@@ -146,18 +162,31 @@ OVMF_VARS_TMP = args.disk.replace('.img', '.efivars')
146162if args .sbtest :
147163 shutil .copy ('/usr/share/OVMF/OVMF_VARS_4M.ms.fd' , OVMF_VARS_TMP )
148164
165+
166+ def _kvm_exists ():
167+ return os .path .exists ("/dev/kvm" )
168+
169+
149170def get_qemu_cmd (name , enable_uefi , disk_img , raid = None , iso_img = None , tpm = False , vnc_enabled = False , secure_boot = False ):
150171 uefi = ""
151172 uuid = "f48b60b2-e6ad-49ef-9d09-4245d0585e52"
152- machine = 'pc'
173+ arch = getattr (args , 'arch' , 'amd64' )
174+ qemu_arch_config = QEMU_CONFIG .get (arch , QEMU_CONFIG ["amd64" ])
175+ qemu_bin = qemu_arch_config ['bin' ]
176+ bios = qemu_arch_config ['bios' ]
177+ cpu_type = args .cpu_type
178+ machine = qemu_arch_config ['machine' ]
179+ accel = ',accel=kvm' if _kvm_exists () else ''
180+ enable_kvm = '-enable-kvm' if _kvm_exists () else ''
153181 vga = '-vga none'
154182 vnc = ''
183+
155184 if vnc_enabled :
156185 vga = '-vga virtio'
157186 vnc = '-vnc :0'
158187
159188 if enable_uefi :
160- uefi = '-bios /usr/share/OVMF/OVMF_CODE.fd '
189+ uefi = f '-bios { bios } '
161190 name = f'{ name } -UEFI'
162191
163192 if secure_boot :
@@ -171,26 +200,25 @@ def get_qemu_cmd(name, enable_uefi, disk_img, raid=None, iso_img=None, tpm=False
171200
172201 cdrom = ""
173202 if iso_img :
174- cdrom = f' -drive file={ iso_img } ,format=raw,if=none,media=cdrom,id=drive-cd1,readonly=on' \
175- f' -device ahci,id=achi0' \
176- f' -device ide-cd,bus=achi0.0,drive=drive-cd1,id=cd1,bootindex=10'
203+ cdrom = (
204+ f' -drive file={ iso_img } ,format=raw,if=none,media=cdrom,id=drive-cd1,readonly=on'
205+ f' -device scsi-cd,bus=scsi0.0,drive=drive-cd1,id=cd1,bootindex=10'
206+ )
177207
178208 # RFC7042 section 2.1.2 MAC addresses used for documentation
179209 macbase = '00:00:5E:00:53'
180- cmd = f'qemu-system-x86_64 \
210+ cmd = f'{ qemu_bin } \
181211 -name "{ name } " \
182212 -smp { args .cpu } ,sockets=1,cores={ args .cpu } ,threads=1 \
183- -cpu host \
184- -machine { machine } , accel=kvm \
213+ -cpu { cpu_type } \
214+ -machine { machine } { accel } \
185215 { uefi } \
186216 -m { args .memory } G \
187217 -vga none \
188218 -nographic \
189219 { vga } { vnc } \
190220 -uuid { uuid } \
191- -cpu host \
192- { cdrom } \
193- -enable-kvm \
221+ { enable_kvm } \
194222 -monitor unix:/tmp/qemu-monitor-socket-{ disk_img } ,server,nowait \
195223 -netdev user,id=n0,net=192.0.2.0/24,dhcpstart=192.0.2.101,dns=192.0.2.10 -device virtio-net-pci,netdev=n0,mac={ macbase } :00,romfile="",host_mtu=1500 \
196224 -netdev user,id=n1 -device virtio-net-pci,netdev=n1,mac={ macbase } :01,romfile="",host_mtu=1500 \
@@ -201,6 +229,7 @@ def get_qemu_cmd(name, enable_uefi, disk_img, raid=None, iso_img=None, tpm=False
201229 -netdev user,id=n6 -device virtio-net-pci,netdev=n6,mac={ macbase } :06,romfile="" \
202230 -netdev user,id=n7 -device virtio-net-pci,netdev=n7,mac={ macbase } :07,romfile="" \
203231 -device virtio-scsi-pci,id=scsi0 \
232+ { cdrom } \
204233 -drive format=raw,file={ disk_img } ,if=none,media=disk,id=drive-hd1,readonly=off \
205234 -device scsi-hd,bus=scsi0.0,drive=drive-hd1,id=hd1,bootindex=1'
206235
@@ -283,7 +312,8 @@ if not os.path.isfile(args.iso):
283312
284313if not os .path .exists ('/dev/kvm' ):
285314 log .error ('KVM not enabled on host, proceeding with software emulation' )
286- sys .exit (1 )
315+ # Some arm platforms do not have kvm, for example Mac arm devices
316+ # sys.exit(1)
287317
288318# Creating diskimage!!
289319diskname_raid = None
0 commit comments