blob: bf6aff4cd53072a94f0f5110a45d8078e67bd9e0 [file] [log] [blame]
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.16
package main
import (
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
)
// defaultDarwinDir returns a default path for a darwin VM.
//
// The directory should contain the darwin VM image, and QEMU
// (sysroot-macos-x86_64).
func defaultDarwinDir() string {
home, err := os.UserHomeDir()
if err != nil {
log.Printf("os.UserHomeDir() = %q, %v", home, err)
return ""
}
return home
}
// darwinCmd returns a qemu command for running a darwin VM, ready
// to be started.
func darwinCmd(base string) *exec.Cmd {
if *macosVersion == 0 {
log.Fatalf("-macos-version required")
}
if *osk == "" {
log.Fatalf("-osk required")
}
sysroot := filepath.Join(base, "sysroot-macos-x86_64")
ovmfCode := filepath.Join(sysroot, "share/qemu/edk2-x86_64-code.fd")
disk := filepath.Join(base, "macos.qcow2")
// Note that vmnet-shared requires that we run QEMU as root, so
// runqemubuildlet must run as root.
//
// These arguments should be kept in sync with env/darwin/aws/qemu.sh.
args := []string{
// Discard disk changes on exit.
"-snapshot",
"-m", "10240",
"-cpu", "host",
"-machine", "q35",
"-usb",
"-device", "usb-kbd",
"-device", "usb-tablet",
// macOS only likes a power-of-two number of cores, but odd socket count is
// fine.
"-smp", "cpus=6,sockets=3,cores=2,threads=1",
"-device", "usb-ehci,id=ehci",
"-device", "nec-usb-xhci,id=xhci",
"-global", "nec-usb-xhci.msi=off",
"-device", fmt.Sprintf("isa-applesmc,osk=%s", *osk),
"-drive", fmt.Sprintf("if=pflash,format=raw,readonly=on,file=%s", ovmfCode),
"-smbios", "type=2",
"-device", "ich9-intel-hda",
"-device", "hda-duplex",
"-device", "ich9-ahci,id=sata",
"-drive", fmt.Sprintf("id=MacHDD,if=none,format=qcow2,file=%s", disk),
"-device", "ide-hd,bus=sata.2,drive=MacHDD",
"-monitor", "stdio",
"-device", "VGA,vgamem_mb=128",
"-M", "accel=hvf",
"-display", fmt.Sprintf("vnc=127.0.0.1:%d", *guestIndex),
// DHCP range is a dummy range. The actual guest IP is assigned statically
// based on the MAC address matching an entry in /etc/bootptab.
"-netdev", "vmnet-shared,id=net0,start-address=192.168.64.1,end-address=192.168.64.100,subnet-mask=255.255.255.0",
}
if *macosVersion >= 11 {
args = append(args, "-device", fmt.Sprintf("virtio-net-pci,netdev=net0,id=net0,mac=52:54:00:c9:18:0%d", *guestIndex))
} else {
args = append(args, "-device", fmt.Sprintf("vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:0%d", *guestIndex))
}
cmd := exec.Command(filepath.Join(sysroot, "bin/qemu-system-x86_64"), args...)
cmd.Env = append(os.Environ(),
fmt.Sprintf("DYLD_LIBRARY_PATH=%s", filepath.Join(sysroot, "lib")),
)
return cmd
}