From 2e9ed4ba01a81e028f0317ff3ee4886719fdaf5e Mon Sep 17 00:00:00 2001 From: Kei Kamikawa Date: Wed, 28 Oct 2026 00:04:52 +0900 Subject: [PATCH 1/2] test(vz): cover CPU counts above 32 bits --- configuration_cpu_test.go | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 configuration_cpu_test.go diff --git a/configuration_cpu_test.go b/configuration_cpu_test.go new file mode 100644 index 00000000..85a32bc5 --- /dev/null +++ b/configuration_cpu_test.go @@ -0,0 +1,42 @@ +package vz_test + +import ( + "path/filepath" + "testing" + + "github.com/Code-Hex/vz/v4" +) + +func TestVirtualMachineConfigurationCPUCount(t *testing.T) { + if vz.Available(12) { + t.Skip("requires macOS 12") + } + store, err := vz.NewEFIVariableStore(filepath.Join(t.TempDir(), "efi"), vz.WithCreatingEFIVariableStore()) + if err != nil { + t.Fatal(err) + } + boot, err := vz.NewEFIBootLoader(vz.WithEFIVariableStore(store)) + if err != nil { + t.Fatal(err) + } + minimumCPUCount := vz.VirtualMachineConfigurationMinimumAllowedCPUCount() + for _, tc := range []struct { + name string + cpu uint + valid bool + }{ + {name: "minimum", cpu: minimumCPUCount, valid: true}, + {name: "exceeds 32 bits", cpu: 1<<32 + minimumCPUCount, valid: false}, + } { + t.Run(tc.name, func(t *testing.T) { + config, err := vz.NewVirtualMachineConfiguration(boot, tc.cpu, vz.VirtualMachineConfigurationMinimumAllowedMemorySize()) + if err != nil { + t.Fatal(err) + } + valid, err := config.Validate() + if valid != tc.valid || (err == nil) != tc.valid { + t.Fatalf("CPU count %d: Validate() = %t, %v; want valid = %t", tc.cpu, valid, err, tc.valid) + } + }) + } +} From 5f4c53030704c900b4ede213f75f45b23b4a0173 Mon Sep 17 00:00:00 2001 From: Kei Kamikawa Date: Wed, 28 Oct 2026 00:04:52 +0900 Subject: [PATCH 2/2] fix(vz): preserve the full CPU count in VM configurations --- configuration.go | 2 +- internal/vzbridge/direct_adapters.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configuration.go b/configuration.go index 6e747158..cfb3ac4c 100644 --- a/configuration.go +++ b/configuration.go @@ -55,7 +55,7 @@ func NewVirtualMachineConfiguration(bootLoader BootLoader, cpu uint, memorySize config := &VirtualMachineConfiguration{ pointer: vzbridge.NewVZVirtualMachineConfiguration( bootLoader, - uint32(cpu), + uint64(cpu), uint64(memorySize), ), } diff --git a/internal/vzbridge/direct_adapters.go b/internal/vzbridge/direct_adapters.go index 5bdf6a8b..201db84b 100644 --- a/internal/vzbridge/direct_adapters.go +++ b/internal/vzbridge/direct_adapters.go @@ -17,10 +17,10 @@ func NewVZGenericMachineIdentifierWithBytes(bytes unsafe.Pointer, length int32) return VZGenericMachineIdentifier_InitWithDataRepresentation(data) } -func NewVZVirtualMachineConfiguration(bootLoader objc.NSObject, cpuCount uint32, memorySize uint64) *objc.Pointer { +func NewVZVirtualMachineConfiguration(bootLoader objc.NSObject, cpuCount uint64, memorySize uint64) *objc.Pointer { config := VZVirtualMachineConfiguration_New() VZVirtualMachineConfiguration_SetBootLoader(config, bootLoader) - VZVirtualMachineConfiguration_SetCPUCount(config, uint64(cpuCount)) + VZVirtualMachineConfiguration_SetCPUCount(config, cpuCount) VZVirtualMachineConfiguration_SetMemorySize(config, memorySize) return config }