Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support USB Controllers #178

Merged
merged 2 commits into from
Jan 6, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package vz
# include "virtualization_11.h"
# include "virtualization_12.h"
# include "virtualization_13.h"
# include "virtualization_15.h"
*/
import "C"
import (
Expand Down Expand Up @@ -40,6 +41,7 @@ type VirtualMachineConfiguration struct {

networkDeviceConfiguration []*VirtioNetworkDeviceConfiguration
storageDeviceConfiguration []StorageDeviceConfiguration
usbControllerConfiguration []USBControllerConfiguration
}

// NewVirtualMachineConfiguration creates a new configuration.
Expand Down Expand Up @@ -277,6 +279,28 @@ func (v *VirtualMachineConfiguration) SetConsoleDevicesVirtualMachineConfigurati
C.setConsoleDevicesVZVirtualMachineConfiguration(objc.Ptr(v), objc.Ptr(array))
}

// SetUSBControllerConfiguration sets list of network adapters. Empty by default.
//
// This is only supported on macOS 15 and newer. Older versions do nothing.
func (v *VirtualMachineConfiguration) SetUSBControllersVirtualMachineConfiguration(us []USBControllerConfiguration) {
if err := macOSAvailable(15); err != nil {
return
}
ptrs := make([]objc.NSObject, len(us))
for i, val := range us {
ptrs[i] = val
}
array := objc.ConvertToNSMutableArray(ptrs)
C.setUSBControllersVZVirtualMachineConfiguration(objc.Ptr(v), objc.Ptr(array))
v.usbControllerConfiguration = us
}

// USBControllers return the list of usb controller configuration configured in this virtual machine configuration.
// Return an empty array if no usb controller configuration is set.
func (v *VirtualMachineConfiguration) USBControllers() []USBControllerConfiguration {
return v.usbControllerConfiguration
}

// VirtualMachineConfigurationMinimumAllowedMemorySize returns minimum
// amount of memory required by virtual machines.
func VirtualMachineConfigurationMinimumAllowedMemorySize() uint64 {
Expand Down
53 changes: 53 additions & 0 deletions usb.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package vz

/*
#cgo darwin CFLAGS: -mmacosx-version-min=11 -x objective-c -fno-objc-arc
#cgo darwin LDFLAGS: -lobjc -framework Foundation -framework Virtualization
# include "virtualization_15.h"
*/
import "C"
import (
"github.com/Code-Hex/vz/v3/internal/objc"
)

// USBControllerConfiguration for a usb controller configuration.
type USBControllerConfiguration interface {
objc.NSObject

usbControllerConfiguration()
}

type baseUSBControllerConfiguration struct{}

func (*baseUSBControllerConfiguration) usbControllerConfiguration() {}

// XHCIControllerConfiguration is a configuration of the USB XHCI controller.
//
// This configuration creates a This configuration creates a USB XHCI controller device for the guest.
Code-Hex marked this conversation as resolved.
Show resolved Hide resolved
// see: https://developer.apple.com/documentation/virtualization/vzxhcicontrollerconfiguration?language=objc
type XHCIControllerConfiguration struct {
*pointer

*baseUSBControllerConfiguration
}

var _ USBControllerConfiguration = (*XHCIControllerConfiguration)(nil)

// NewXHCIControllerConfiguration creates a new XHCIControllerConfiguration.
//
// This is only supported on macOS 15 and newer, error will
// be returned on older versions.
func NewXHCIControllerConfiguration() (*XHCIControllerConfiguration, error) {
if err := macOSAvailable(15); err != nil {
return nil, err
}

config := &XHCIControllerConfiguration{
pointer: objc.NewPointer(C.newVZXHCIControllerConfiguration()),
}

objc.SetFinalizer(config, func(self *XHCIControllerConfiguration) {
objc.Release(self)
})
return config, nil
}
2 changes: 2 additions & 0 deletions virtualization_15.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@
/* macOS 15 API */
bool isNestedVirtualizationSupported();
void setNestedVirtualizationEnabled(void *config, bool nestedVirtualizationEnabled);
void *newVZXHCIControllerConfiguration();
void setUSBControllersVZVirtualMachineConfiguration(void *config, void *usbControllers);
26 changes: 26 additions & 0 deletions virtualization_15.m
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,29 @@ void setNestedVirtualizationEnabled(void *config, bool nestedVirtualizationEnabl
#endif
RAISE_UNSUPPORTED_MACOS_EXCEPTION();
}

/*!
@abstract Configuration for the USB XHCI controller.
@discussion This configuration creates a USB XHCI controller device for the guest.
*/
void *newVZXHCIControllerConfiguration()
{
#ifdef INCLUDE_TARGET_OSX_15
if (@available(macOS 15, *)) {
return [[VZXHCIControllerConfiguration alloc] init];
}
#endif
RAISE_UNSUPPORTED_MACOS_EXCEPTION();
}

void setUSBControllersVZVirtualMachineConfiguration(void *config, void *usbControllers)
{
#ifdef INCLUDE_TARGET_OSX_15
if (@available(macOS 15, *)) {
[(VZVirtualMachineConfiguration *)config
setUsbControllers:[(NSMutableArray *)usbControllers copy]];
return;
}
#endif
RAISE_UNSUPPORTED_MACOS_EXCEPTION();
}
Loading