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