Here is easy steps to try Windows 10 on ARM or Ubuntu for ARM64 on your Apple Silicon Mac. Enjoy!
NOTE: that this is current, 8/19/2021 state.
- 
Install Xcode from App Store or install Command Line Tools on your Mac running on Apple Silicon. xcode-select --install
- 
Install ARM64 Homebrew and QEMU dependencies. If you already installed x86_64 Homebrew in /usr/local, please uninstall it. It’s not possible to build QEMU with x86_64 Homebrew/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install ninja pkgconfig glib pixman
- 
Clone QEMU source code with Hypervisor.framework patches that @_AlexGraf made. git clone --depth 1 --branch implement_apple_silicon_support https://github.com/niw/qemuSee https://patchwork.kernel.org/project/qemu-devel/list/?series=485309&archive=both for details about the patch. 
- 
Build QEMU. In qemudirectory, run following commands.mkdir build cd build ../configure --target-list=aarch64-softmmu --enable-cocoa make -jIt creates qemu-img,qemu-system-aarch64etc, which we use later.
- 
Download pre-build EDK II OVMF EFI image for QEMU. This EFI image is built from stable202011tag with additional resolutions inQemuRamfb.c.To build it from the source code for adding more resolutions, see the following section. 
- 
Prepare pflash for non-volatile variable store, such as screen resolution. Create a working directory and run following command. tar xzvf QEMU_EFI-*.tar.gz dd if=/dev/zero of=pflash0.img bs=1m count=64 dd if=/dev/zero of=pflash1.img bs=1m count=64 dd if=QEMU_EFI.fd of=pflash0.img conv=notrunc dd if=QEMU_VARS.fd of=pflash1.img conv=notrunc- Please use each path to where you download it.
- This step is optional, you can use -bios QEMU_EFI.fdinstead of-drive ...if=pflashlines in the next step, but in that case, any changes in EFI will not be persistent.
 
- 
Download Windows 10 on ARM Insider Preview https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64 
- 
Convert VHDX downloaded Windows image to raw format It seems that VHDX often gets broken while it is being used, so probably it is better to convert it to raw format before using it. Using raw format makes the disk image file a sparse file on APFS disk. See "Compact raw disk image" section below for the details. qemu-img convert -p -O raw Windows10_InsiderPreview_Client_ARM64_en-us_21354.VHDX Windows10.raw- Please use each path to where you download it.
 
- 
Run Windows 10 qemu-system-aarch64 \ -monitor stdio \ -M virt,highmem=off \ -accel hvf \ -cpu cortex-a72 \ -smp 4 \ -m 4096 \ -drive file=pflash0.img,format=raw,if=pflash,readonly=on \ -drive file=pflash1.img,format=raw,if=pflash \ -device ramfb \ -device qemu-xhci \ -device usb-kbd \ -device usb-tablet \ -device intel-hda \ -device hda-duplex \ -nic user,model=virtio \ -drive file=Windows10.raw,format=raw,if=none,id=boot \ -device nvme,drive=boot,serial=boot- Please modify each path to the image depends on your environment.
- Hit ESCwhile you see TianoCore, thenDevice Manager,OVMF Platform Configuration,Change Preferred Resolution for Next Bootto change screen resolution.
- To add more resolutions, follow "Build EDK II OVMF EFI image from
the source code" below and modify OvmfPkg/QemuRamfbDxe/QemuRamfb.cthen build newQEMU_EFI.fd.
- Use -device usb-tabletinstead of-device usb-mouseallows transparently moving mouse cursor.
- -device intel-hda -device hda-duplexto enable audio.
- -nic user,model=virtiois the network interface. To enable it, see the following section.
 
VirtIO NIC is not enabled by default. To make it works, you need to install a device driver.
- 
Download VirtIO device drivers ISO from Fedora Project. 
- 
Mount device drivers ISO Add next options to qemu-system-aarch64.-drive file=virtio-win-0.1.190.iso,media=cdrom,if=none,id=drivers \ -device usb-storage,drive=driversPlease modify each path to the image depends on your environment. 
- 
Disable device driver signature enforcement Boot Windows, then right click Windows Start button, then select Command Prompt (Admin). Use bcdedit to enable test-signed device drivers. bcdedit.exe -set TESTSIGNING ONThen reboot Windows. See here for the details. 
- 
Install driver Once Windows booted again, then right click Windows Start button, then select Device Manager. In Device Manager, select View menu then Devices by Connection. Navigate in the device tree, select ACPU ARM64-based PC,Microsoft ACPI-Compliant System,PCI Express Root Complex, then you will see oneUnknown devicethere. (There are manyUnknown devicein tree but the one underPCI Express Root Complexis the VirtIO NIC.)Right click Unknown devicethen select Update Drivers, then Browse my computer for drivers, then selectD:\NetKVM\w10\ARM64.Click Next to install Red Hat VertIO Ethernet Adapter.
If you use ls or similar tool, you will notice that Windows10.raw is using
large like 64GB disk space, however, it is not actually using that space.
By using Finder, you will see in info panel of that file, that shows the actual disk usage is much lower than that, like 10GB. Or, you can see actual size on disk by using the following command.
$ du -h Windows10.raw
 10G	Windows10.raw
This is because APFS is using a sparse file format automatically and doesn’t actually allocate the space until it is used. However, even though, the actual size on disk can be getting bigger as using Windows, especially after Windows Update, even if you delete files.
If the disk image is too big, you may want to compact it to release free space
by using Defragment and Optimize Drives coming with Windows 10 and optimize C:
drive, then use my HolePunch tool
to reduce the actual disk usage.
$ git clone https://github.com/niw/HolePunch.git
$ ce HolePunch
$ swift build -c release
$ .build/release/holepunch --show-progress /path/to/Windows10.raw
Follow the same steps for Windows 10 to prepare QEMU, then download Ubuntu Server for ARM64 and install it.
- 
Follow previous steps from 1. to 7. to prepare QEMU. 
- 
Create an empty disk image. qemu-img create -f raw ubuntu.raw 40G
- 
Download Ubuntu Server for ARM64 
- 
Install Ubuntu Server for ARM qemu-system-aarch64 \ -monitor stdio \ -M virt,highmem=off \ -accel hvf \ -cpu cortex-a72 \ -smp 4 \ -m 4096 \ -drive file=pflash0.img,format=raw,if=pflash,readonly=on \ -drive file=pflash1.img,format=raw,if=pflash \ -device virtio-gpu-pci \ -display default,show-cursor=on \ -device qemu-xhci \ -device usb-kbd \ -device usb-tablet \ -device intel-hda \ -device hda-duplex \ -drive file=ubuntu.raw,format=raw,if=virtio,cache=writethrough \ -cdrom ubuntu-20.04.1-live-server-arm64.iso- Follow instruction to install Ubuntu Server. Once it’s installed, -cdromargument is not needed.
 
- Follow instruction to install Ubuntu Server. Once it’s installed, 
Follow the previous instructions to run Ubuntu Server for ARM64.
- 
Checkout EDK II source code. git clone --depth 1 --branch edk2-stable202011 https://github.com/tianocore/edk2.git cd edk2 git submodule update --init --recursiveYou may want to disable xHCI due to current Hypervisor.framework patch limitation. Comment out MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.infin/ArmVirtPkg/ArmVirtQemu.dscand/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc. Probably this is no longer needed.
- 
Build it. sudo apt install iasl python3 python3-distutils uuid-dev make g++ source edksetup.sh make -C BaseTools build -a AARCH64 -t GCC5 -p ArmVirtPkg/ArmVirtQemu.dscThen, you will get QEMU_EFI.fdandQEMU_VARS.fdinBuild/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV.- 
The easiest way to take these files to the host macOS, run Remote Login on macOS then scpthese to10.0.2.2.
- 
To build these on x86_64 environment, use following toolchain to cross compile. sudo apt install gcc-aarch64-linux-gnu env GCC5_AARCH64_PREFIX=aarch64-linux-gnu- build -a AARCH64 -t GCC5 -p ArmVirtPkg/ArmVirtQemu.dsc
 
-