Message ID | 20230614224038.86148-1-graf@amazon.com (mailing list archive) |
---|---|
Headers | show |
Series | Introduce new vmapple machine type | expand |
> On 15 Jun 2023, at 00.40, Alexander Graf <graf@amazon.com> wrote: > > This patch set introduces a new ARM and HVF specific machine type > called "vmapple". It mimicks the device model that Apple's proprietary > Virtualization.Framework exposes, but implements it in QEMU. > > With this new machine type, you can run macOS guests on Apple Silicon > systems via HVF. To do so, you need to first install macOS using > Virtualization.Framework onto a virtual disk image using a tool like > macosvm (https://github.com/s-u/macosvm) > > $ macosvm --disk disk.img,size=32g --aux aux.img \ > --restore UniversalMac_12.0.1_21A559_Restore.ipsw vm.json > > Then, extract the ECID from the installed VM: > > $ cat "$DIR/macosvm.json" | python3 -c \ > 'import json,sys;obj=json.load(sys.stdin);print(obj["machineId"]) | \ > base64 -d | plutil -extract ECID raw - Beware, that the file will be called 'vm.json' and DIR is undefined following the previous line. Also, it's missing a single-quote at the end of `["machineId"])`. > In addition, cut off the first 16kb of the aux.img: > > $ dd if=aux.img of=aux.img.trimmed bs=$(( 0x4000 )) skip=1 > > Now, you can just launch QEMU with the bits generated above: > > $ qemu-system-aarch64 -serial mon:stdio \ > -m 4G \ > -M vmapple,uuid=6240349656165161789 \ > -bios /Sys*/Lib*/Fra*/Virtualization.f*/R*/AVPBooter.vmapple2.bin \ > -pflash aux.img.trimmed \ > -pflash disk.img \ > -drive file=disk.img,if=none,id=root \ > -device virtio-blk-pci,drive=root,x-apple-type=1 \ > -drive file=aux.img.trimmed,if=none,id=aux \ > -device virtio-blk-pci,drive=aux,x-apple-type=2 \ > -accel hvf -no-reboot Just for clarity, I'd add that the 'vmapple,uuid=...' has to be set to the ECID the previous step. You haven't defined a display, but I'm not sure if that is on purpose to show a minimal setup. I had to add '-display sdl' for it to fully work. > There are a few limitations with this implementation: > > - Only runs on macOS because it relies on > ParavirtualizesGraphics.Framework > - Something is not fully correct on interrupt delivery or > similar - the keyboard does not work > - No Rosetta in the guest because we lack the private > entitlement to enable TSO Would it be possible to mitigate the keyboard issue using an emulated USB keyboard? I tried poking around with it, but with no success. > Over time, I hope that some of the limitations above could cease to exist. > This device model would enable very nice use cases with KVM on an Asahi > Linux device.
Hi Mads, On 20.06.23 13:17, Mads Ynddal wrote: > >> On 15 Jun 2023, at 00.40, Alexander Graf <graf@amazon.com> wrote: >> >> This patch set introduces a new ARM and HVF specific machine type >> called "vmapple". It mimicks the device model that Apple's proprietary >> Virtualization.Framework exposes, but implements it in QEMU. >> >> With this new machine type, you can run macOS guests on Apple Silicon >> systems via HVF. To do so, you need to first install macOS using >> Virtualization.Framework onto a virtual disk image using a tool like >> macosvm (https://github.com/s-u/macosvm) >> >> $ macosvm --disk disk.img,size=32g --aux aux.img \ >> --restore UniversalMac_12.0.1_21A559_Restore.ipsw vm.json >> >> Then, extract the ECID from the installed VM: >> >> $ cat "$DIR/macosvm.json" | python3 -c \ >> 'import json,sys;obj=json.load(sys.stdin);print(obj["machineId"]) | \ >> base64 -d | plutil -extract ECID raw - > Beware, that the file will be called 'vm.json' and DIR is undefined following > the previous line. Also, it's missing a single-quote at the end of > `["machineId"])`. Thanks :) > >> In addition, cut off the first 16kb of the aux.img: >> >> $ dd if=aux.img of=aux.img.trimmed bs=$(( 0x4000 )) skip=1 >> >> Now, you can just launch QEMU with the bits generated above: >> >> $ qemu-system-aarch64 -serial mon:stdio \ >> -m 4G \ >> -M vmapple,uuid=6240349656165161789 \ >> -bios /Sys*/Lib*/Fra*/Virtualization.f*/R*/AVPBooter.vmapple2.bin \ >> -pflash aux.img.trimmed \ >> -pflash disk.img \ >> -drive file=disk.img,if=none,id=root \ >> -device virtio-blk-pci,drive=root,x-apple-type=1 \ >> -drive file=aux.img.trimmed,if=none,id=aux \ >> -device virtio-blk-pci,drive=aux,x-apple-type=2 \ >> -accel hvf -no-reboot > Just for clarity, I'd add that the 'vmapple,uuid=...' has to be set to the > ECID the previous step. > > You haven't defined a display, but I'm not sure if that is on purpose to > show a minimal setup. I had to add '-display sdl' for it to fully work. Weird, I do get a normal cocoa output screen by default. > >> There are a few limitations with this implementation: >> >> - Only runs on macOS because it relies on >> ParavirtualizesGraphics.Framework >> - Something is not fully correct on interrupt delivery or >> similar - the keyboard does not work >> - No Rosetta in the guest because we lack the private >> entitlement to enable TSO > Would it be possible to mitigate the keyboard issue using an emulated USB > keyboard? I tried poking around with it, but with no success. Unfortunately I was not able to get USB stable inside the guest. This may be an issue with interrupt propagation: With usb-kbd I see macOS not pick up key up or down events in time. Alex Amazon Development Center Germany GmbH Krausenstr. 38 10117 Berlin Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B Sitz: Berlin Ust-ID: DE 289 237 879